From 00436555cf3ba6992213aeb5c3393dd14e8e27d9 Mon Sep 17 00:00:00 2001 From: Tim Hutt Date: Mon, 22 Apr 2024 11:19:37 +0100 Subject: [PATCH 001/755] Fix opening links in the terminal with column numbers If you open a link from the terminal like `src/foo.ext:5.0-4` then the link passed to `TerminalSearchLinkOpener.open()` will be `src/foo.ext:5.0-4`. It will try to match it against detected links in the line, but it will fail because the detect link has text `src/foo.ext`. Then it will pass the full `src/foo.ext:5.0-4` to the quick picker which doesn't understand that format. This fixes the matching against detected links so it strips potential line/column numbers before matching against the detected links' texts. This only seems to be necessary when the link path doesn't exactly match a file (e.g. if that file is in a subdirectory). --- .../links/browser/terminalLinkOpeners.ts | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts index d4247bbd835f2..6ed6a59d409b0 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts @@ -104,13 +104,28 @@ export class TerminalSearchLinkOpener implements ITerminalLinkOpener { text = osPath.normalize(text).replace(/^(\.+[\\/])+/, ''); // Try extract any trailing line and column numbers by matching the text against parsed - // links. This will give a search link `foo` on a line like `"foo", line 10` to open the - // quick pick with `foo:10` as the contents. + // links. For example if there is a line containing `"foo", line 10` and the user + // clicks 'foo', then `link.text` will be "foo" and not have any line number. + // We can detect links in the line, which will give a `parsedLink` whose `path.text` + // is also "foo" but it will also include the line number. We can take + // that line number and send the link to quick pick with `foo:10` as the contents. if (link.contextLine) { const parsedLinks = detectLinks(link.contextLine, this._getOS()); - const matchingParsedLink = parsedLinks.find(parsedLink => parsedLink.suffix && link.text === parsedLink.path.text); + // At this point `link.text` may be something like `src/foo.ext:5.0-4`, whereas + // the `parsedLink.path.text` would be `src/foo.ext`. We need to strip the + // link/column numbers so that we can find the matching detected link in the line. + const linkTextWithoutLineNumbers = link.text.replace(/:[\d\.,-]*$/, ''); + const matchingParsedLink = parsedLinks.find(parsedLink => parsedLink.suffix && linkTextWithoutLineNumbers === parsedLink.path.text); if (matchingParsedLink) { if (matchingParsedLink.suffix?.row !== undefined) { + // The detected link has line & maybe column numbers extracted. Replace + // any that may have been present in `link` with the detected + // ones. So for example `src/foo.ext:5.0-4` would be stripped + // to `src/foo.ext` and then extended to `src/foo.ext:5:0` which + // the quick picker understands. + const numStrip = link.text.length - linkTextWithoutLineNumbers.length; + text = text.slice(0, text.length - numStrip); + text += `:${matchingParsedLink.suffix.row}`; if (matchingParsedLink.suffix?.col !== undefined) { text += `:${matchingParsedLink.suffix.col}`; From cdeeb50a386ae44745ea54f288abbe6d6459f1ce Mon Sep 17 00:00:00 2001 From: Rafael Sargento Date: Mon, 20 May 2024 14:49:01 +0100 Subject: [PATCH 002/755] Implement display variable type setting for vscode (#210258) Created two new settings to be added to .vscode/settings.json ('variableDisplayType.watchView' and 'variableDisplayType.variableView') when set to true it shows the variable type in the format var_name: type = value in the debug panel and variable panel respectively and the hover will now display var_name. When set to false uses the previous expected behaviour (var_name = value) and the hover will display the type. Co-authored-by: Diogo Pinto --- .../contrib/debug/browser/baseDebugView.ts | 11 +- .../contrib/debug/browser/debugHover.ts | 2 +- .../contrib/debug/browser/variablesView.ts | 6 +- .../debug/browser/watchExpressionsView.ts | 26 ++-- .../debug/test/browser/baseDebugView.test.ts | 118 ++++++++++++------ .../debug/test/browser/variablesView.test.ts | 100 +++++++++++++++ .../test/browser/watchExpressionView.test.ts | 97 ++++++++++++++ 7 files changed, 308 insertions(+), 52 deletions(-) create mode 100644 src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts create mode 100644 src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts diff --git a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts index 3546424023ce5..61ca0893995f6 100644 --- a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts +++ b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts @@ -130,13 +130,18 @@ export function renderExpressionValue(expressionOrValue: IExpressionValue | stri } } -export function renderVariable(store: DisposableStore, commandService: ICommandService, hoverService: IHoverService, variable: Variable, data: IVariableTemplateData, showChanged: boolean, highlights: IHighlight[], linkDetector?: LinkDetector): void { +export function renderVariable(store: DisposableStore, commandService: ICommandService, hoverService: IHoverService, variable: Variable, data: IVariableTemplateData, showChanged: boolean, highlights: IHighlight[], linkDetector?: LinkDetector, displayType?: boolean): void { if (variable.available) { let text = variable.name; if (variable.value && typeof variable.name === 'string') { - text += ':'; + if (variable.type && displayType) { + text += ': ' + variable.type + ' ='; + } else { + text += ' ='; + } } - data.label.set(text, highlights, variable.type ? variable.type : variable.name); + + data.label.set(text, highlights, variable.type && !displayType ? variable.type : variable.name); data.name.classList.toggle('virtual', variable.presentationHint?.kind === 'virtual'); data.name.classList.toggle('internal', variable.presentationHint?.visibility === 'internal'); } else if (variable.value && typeof variable.name === 'string' && variable.name) { diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index b534c3fba676a..9fcc7670ab872 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -132,7 +132,7 @@ export class DebugHoverWidget implements IContentWidget { const dataSource = this.instantiationService.createInstance(DebugHoverDataSource); const linkeDetector = this.instantiationService.createInstance(LinkDetector); this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'DebugHover', this.treeContainer, new DebugHoverDelegate(), [ - this.instantiationService.createInstance(VariablesRenderer, linkeDetector), + this.instantiationService.createInstance(VariablesRenderer, linkeDetector, false), this.instantiationService.createInstance(VisualizedVariableRenderer, linkeDetector), ], dataSource, { diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index 5dc2a66b07388..b728732f54984 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -123,9 +123,10 @@ export class VariablesView extends ViewPane { container.classList.add('debug-variables'); const treeContainer = renderViewTree(container); const linkDetector = this.instantiationService.createInstance(LinkDetector); + const displayType: boolean = this.configurationService.getValue('variableDisplayType.variableView'); this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(), [ - this.instantiationService.createInstance(VariablesRenderer, linkDetector), + this.instantiationService.createInstance(VariablesRenderer, linkDetector, displayType), this.instantiationService.createInstance(VisualizedVariableRenderer, linkDetector), new ScopesRenderer(), new ScopeErrorRenderer(), @@ -523,6 +524,7 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { constructor( private readonly linkDetector: LinkDetector, + private readonly displayType: boolean, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IDebugVisualizerService private readonly visualization: IDebugVisualizerService, @@ -540,7 +542,7 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { } protected renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void { - renderVariable(data.elementDisposable, this.commandService, this.hoverService, expression as Variable, data, true, highlights, this.linkDetector); + renderVariable(data.elementDisposable, this.commandService, this.hoverService, expression as Variable, data, true, highlights, this.linkDetector, this.displayType); } public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index 7369a36760712..6ebc6e5c10689 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -86,13 +86,14 @@ export class WatchExpressionsView extends ViewPane { this.element.classList.add('debug-pane'); container.classList.add('debug-watch'); const treeContainer = renderViewTree(container); + const watchDisplayType: boolean = this.configurationService.getValue('variableDisplayType.watchView'); - const expressionsRenderer = this.instantiationService.createInstance(WatchExpressionsRenderer); + const expressionsRenderer = this.instantiationService.createInstance(WatchExpressionsRenderer, watchDisplayType); const linkDetector = this.instantiationService.createInstance(LinkDetector); this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'WatchExpressions', treeContainer, new WatchExpressionsDelegate(), [ expressionsRenderer, - this.instantiationService.createInstance(VariablesRenderer, linkDetector), + this.instantiationService.createInstance(VariablesRenderer, linkDetector, watchDisplayType), this.instantiationService.createInstance(VisualizedVariableRenderer, linkDetector), ], this.instantiationService.createInstance(WatchExpressionsDataSource), { @@ -274,11 +275,12 @@ class WatchExpressionsDataSource extends AbstractExpressionDataSource, linkDetector: LinkDetector, displayType: boolean) { + let variable = new Variable(session, 1, scope, 2, 'foo', 'bar.foo', undefined, 0, 0, undefined, {}, 'string'); + let expression = $('.'); + let name = $('.'); + let value = $('.'); + const label = new HighlightedLabel(name); + const lazyButton = $('.'); + const store = disposables.add(new DisposableStore()); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], undefined, displayType); + + assert.strictEqual(label.element.textContent, 'foo'); + assert.strictEqual(value.textContent, ''); + + variable.value = 'hey'; + expression = $('.'); + name = $('.'); + value = $('.'); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector, displayType); + assert.strictEqual(value.textContent, 'hey'); + assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); + + variable.value = isWindows ? 'C:\\foo.js:5' : '/foo.js:5'; + expression = $('.'); + name = $('.'); + value = $('.'); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector, displayType); + assert.ok(value.querySelector('a')); + assert.strictEqual(value.querySelector('a')!.textContent, variable.value); + + variable = new Variable(session, 1, scope, 2, 'console', 'console', '5', 0, 0, undefined, { kind: 'virtual' }); + expression = $('.'); + name = $('.'); + value = $('.'); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector, displayType); + assert.strictEqual(name.className, 'virtual'); + assert.strictEqual(label.element.textContent, 'console ='); + assert.strictEqual(value.className, 'value number'); + + variable = new Variable(session, 1, scope, 2, 'xpto', 'xpto.xpto', undefined, 0, 0, undefined, {}, 'custom-type'); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector, displayType); + assert.strictEqual(label.element.textContent, 'xpto'); + assert.strictEqual(value.textContent, ''); + variable.value = '2'; + expression = $('.'); + name = $('.'); + value = $('.'); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector, displayType); + assert.strictEqual(value.textContent, '2'); + assert.strictEqual(label.element.textContent, displayType ? 'xpto: custom-type =' : 'xpto ='); + + label.dispose(); +} + suite('Debug - Base Debug View', () => { const disposables = ensureNoDisposablesAreLeakedInTestSuite(); let linkDetector: LinkDetector; @@ -33,6 +87,7 @@ suite('Debug - Base Debug View', () => { setup(() => { const instantiationService: TestInstantiationService = workbenchInstantiationService(undefined, disposables); linkDetector = instantiationService.createInstance(LinkDetector); + instantiationService.stub(IHoverService, NullHoverService); }); test('render view tree', () => { @@ -85,47 +140,32 @@ suite('Debug - Base Debug View', () => { test('render variable', () => { const session = new MockSession(); const thread = new Thread(session, 'mockthread', 1); - const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', { startLineNumber: 1, startColumn: 1, endLineNumber: undefined!, endColumn: undefined! }, 0, true); + const range = { + startLineNumber: 1, + startColumn: 1, + endLineNumber: undefined!, + endColumn: undefined! + }; + const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true); + const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10); + + assert_variable(session, scope, disposables, linkDetector, false); + + }); + + test('render variable with display type setting', () => { + const session = new MockSession(); + const thread = new Thread(session, 'mockthread', 1); + const range = { + startLineNumber: 1, + startColumn: 1, + endLineNumber: undefined!, + endColumn: undefined! + }; + const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true); const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10); - let variable = new Variable(session, 1, scope, 2, 'foo', 'bar.foo', undefined, 0, 0, undefined, {}, 'string'); - let expression = $('.'); - let name = $('.'); - let value = $('.'); - const label = new HighlightedLabel(name); - const lazyButton = $('.'); - const store = disposables.add(new DisposableStore()); - renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, []); - - assert.strictEqual(label.element.textContent, 'foo'); - assert.strictEqual(value.textContent, ''); - - variable.value = 'hey'; - expression = $('.'); - name = $('.'); - value = $('.'); - renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector); - assert.strictEqual(value.textContent, 'hey'); - assert.strictEqual(label.element.textContent, 'foo:'); - - variable.value = isWindows ? 'C:\\foo.js:5' : '/foo.js:5'; - expression = $('.'); - name = $('.'); - value = $('.'); - renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector); - assert.ok(value.querySelector('a')); - assert.strictEqual(value.querySelector('a')!.textContent, variable.value); - - variable = new Variable(session, 1, scope, 2, 'console', 'console', '5', 0, 0, undefined, { kind: 'virtual' }); - expression = $('.'); - name = $('.'); - value = $('.'); - renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], linkDetector); - assert.strictEqual(name.className, 'virtual'); - assert.strictEqual(label.element.textContent, 'console:'); - assert.strictEqual(value.className, 'value number'); - - label.dispose(); + assert_variable(session, scope, disposables, linkDetector, true); }); test('statusbar in debug mode', () => { diff --git a/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts b/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts new file mode 100644 index 0000000000000..48187635ef7bd --- /dev/null +++ b/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import * as dom from 'vs/base/browser/dom'; +import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { Scope, StackFrame, Thread, Variable } from 'vs/workbench/contrib/debug/common/debugModel'; +import { MockDebugService, MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { NullHoverService } from 'vs/platform/hover/test/browser/nullHoverService'; +import { IDebugService, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; +import { VariablesRenderer } from 'vs/workbench/contrib/debug/browser/variablesView'; +import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; + +const $ = dom.$; + +function assert_variable(disposables: Pick, variablesRenderer: VariablesRenderer, displayType: boolean) { + const session = new MockSession(); + const thread = new Thread(session, 'mockthread', 1); + const range = { + startLineNumber: 1, + startColumn: 1, + endLineNumber: undefined!, + endColumn: undefined! + }; + const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true); + const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10); + const node = { + element: new Variable(session, 1, scope, 2, 'foo', 'bar.foo', undefined, 0, 0, undefined, {}, 'string'), + depth: 0, + visibleChildrenCount: 1, + visibleChildIndex: -1, + collapsible: false, + collapsed: false, + visible: true, + filterData: undefined, + children: [] + }; + const expression = $('.'); + const name = $('.'); + const value = $('.'); + const label = disposables.add(new HighlightedLabel(name)); + const lazyButton = $('.'); + const inputBoxContainer = $('.'); + const elementDisposable = disposables.add(new DisposableStore()); + const templateDisposable = disposables.add(new DisposableStore()); + const currentElement = undefined; + const data = { + expression, + name, + value, + label, + lazyButton, + inputBoxContainer, + elementDisposable, + templateDisposable, + currentElement + }; + variablesRenderer.renderElement(node, 0, data); + assert.strictEqual(value.textContent, ''); + assert.strictEqual(label.element.textContent, 'foo'); + + node.element.value = 'xpto'; + variablesRenderer.renderElement(node, 0, data); + assert.strictEqual(value.textContent, 'xpto'); + assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); +} + +suite('Debug - Variable Debug View', () => { + const disposables = ensureNoDisposablesAreLeakedInTestSuite(); + let variablesRenderer: VariablesRenderer; + let instantiationService: TestInstantiationService; + let linkDetector: LinkDetector; + + setup(() => { + instantiationService = workbenchInstantiationService(undefined, disposables); + linkDetector = instantiationService.createInstance(LinkDetector); + const debugService = new MockDebugService(); + instantiationService.stub(IHoverService, NullHoverService); + debugService.getViewModel = () => { focusedStackFrame: undefined, getSelectedExpression: () => undefined }; + debugService.getViewModel().getSelectedExpression = () => undefined; + instantiationService.stub(IDebugService, debugService); + }); + + test('variable expressions with display type', () => { + variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector, true); + assert_variable(disposables, variablesRenderer, true); + }); + + test('variable expressions', () => { + variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector, false); + assert_variable(disposables, variablesRenderer, false); + }); +}); diff --git a/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts b/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts new file mode 100644 index 0000000000000..ffb3af896b6e5 --- /dev/null +++ b/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts @@ -0,0 +1,97 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import * as dom from 'vs/base/browser/dom'; +import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { WatchExpressionsRenderer } from 'vs/workbench/contrib/debug/browser/watchExpressionsView'; +import { Scope, StackFrame, Thread, Variable } from 'vs/workbench/contrib/debug/common/debugModel'; +import { MockDebugService, MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; +import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { NullHoverService } from 'vs/platform/hover/test/browser/nullHoverService'; +import { IDebugService, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; +const $ = dom.$; + +function assert_watch_variable(disposables: Pick, watchExpressionsRenderer: WatchExpressionsRenderer, displayType: boolean) { + const session = new MockSession(); + const thread = new Thread(session, 'mockthread', 1); + const range = { + startLineNumber: 1, + startColumn: 1, + endLineNumber: undefined!, + endColumn: undefined! + }; + const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true); + const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10); + const node = { + element: new Variable(session, 1, scope, 2, 'foo', 'bar.foo', undefined, 0, 0, undefined, {}, 'string'), + depth: 0, + visibleChildrenCount: 1, + visibleChildIndex: -1, + collapsible: false, + collapsed: false, + visible: true, + filterData: undefined, + children: [] + }; + const expression = $('.'); + const name = $('.'); + const value = $('.'); + const label = disposables.add(new HighlightedLabel(name)); + const lazyButton = $('.'); + const inputBoxContainer = $('.'); + const elementDisposable = disposables.add(new DisposableStore()); + const templateDisposable = disposables.add(new DisposableStore()); + const currentElement = undefined; + const data = { + expression, + name, + value, + label, + lazyButton, + inputBoxContainer, + elementDisposable, + templateDisposable, + currentElement + }; + watchExpressionsRenderer.renderElement(node, 0, data); + assert.strictEqual(value.textContent, ''); + assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); + + node.element.value = 'xpto'; + watchExpressionsRenderer.renderElement(node, 0, data); + assert.strictEqual(value.textContent, 'xpto'); + assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); +} + +suite('Debug - Watch Debug View', () => { + const disposables = ensureNoDisposablesAreLeakedInTestSuite(); + let watchExpressionsRenderer: WatchExpressionsRenderer; + let instantiationService: TestInstantiationService; + + setup(() => { + instantiationService = workbenchInstantiationService(undefined, disposables); + const debugService = new MockDebugService(); + instantiationService.stub(IHoverService, NullHoverService); + debugService.getViewModel = () => { focusedStackFrame: undefined, getSelectedExpression: () => undefined }; + debugService.getViewModel().getSelectedExpression = () => undefined; + instantiationService.stub(IDebugService, debugService); + + }); + + test('watch expressions with display type', () => { + watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer, true); + assert_watch_variable(disposables, watchExpressionsRenderer, true); + }); + + test('watch expressions', () => { + watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer, false); + assert_watch_variable(disposables, watchExpressionsRenderer, false); + }); +}); From c1735c9422bdc8f929ef60afc2b6bc7b53994034 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 31 May 2024 10:45:45 -0700 Subject: [PATCH 003/755] Disable initialHint after inline chat is triggered Fixes #213820 --- .../browser/terminal.initialHint.contribution.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index a8f77d089e075..56cf1b7b37ff1 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -29,9 +29,14 @@ import { TerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal import 'vs/css!./media/terminalInitialHint'; import { TerminalInitialHintSettingId } from 'vs/workbench/contrib/terminalContrib/chat/common/terminalInitialHintConfiguration'; import { ChatAgentLocation, IChatAgent, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; const $ = dom.$; +const enum Constants { + InitialHintHideStorageKey = 'terminal.initialHint.hide' +} + export class InitialHintAddon extends Disposable implements ITerminalAddon { private readonly _onDidRequestCreateHint = this._register(new Emitter()); get onDidRequestCreateHint(): Event { return this._onDidRequestCreateHint.event; } @@ -90,11 +95,15 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm @ITerminalGroupService private readonly _terminalGroupService: ITerminalGroupService, @ITerminalEditorService private readonly _terminalEditorService: ITerminalEditorService, @IChatAgentService private readonly _chatAgentService: IChatAgentService, + @IStorageService private readonly _storageService: IStorageService, ) { super(); } xtermOpen(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void { + if (this._storageService.getBoolean(Constants.InitialHintHideStorageKey, StorageScope.APPLICATION, false)) { + return; + } if (this._terminalGroupService.instances.length + this._terminalEditorService.instances.length !== 1) { // only show for the first terminal return; @@ -198,7 +207,8 @@ class TerminalInitialHintWidget extends Disposable { @IKeybindingService private readonly keybindingService: IKeybindingService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IProductService private readonly productService: IProductService, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly terminalService: ITerminalService, + @IStorageService private readonly _storageService: IStorageService ) { super(); this.toDispose.add(_instance.onDidFocus(() => { @@ -224,6 +234,7 @@ class TerminalInitialHintWidget extends Disposable { let ariaLabel = `Ask ${providerName} something or start typing to dismiss.`; const handleClick = () => { + this._storageService.store(Constants.InitialHintHideStorageKey, true, StorageScope.APPLICATION, StorageTarget.USER); this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'terminalInlineChat.hintAction', from: 'hint' From 400dc971b43b9f7c56f5dfb5a15ef2435bd15b7f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 31 May 2024 10:47:07 -0700 Subject: [PATCH 004/755] Reset initial hint state when config changes --- .../chat/browser/terminal.initialHint.contribution.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index 56cf1b7b37ff1..39991e46f266e 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -222,8 +222,12 @@ class TerminalInitialHintWidget extends Disposable { } })); this.toDispose.add(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(TerminalInitialHintSettingId.Enabled) && !this.configurationService.getValue(TerminalInitialHintSettingId.Enabled)) { - this.dispose(); + if (e.affectsConfiguration(TerminalInitialHintSettingId.Enabled)) { + // Reset hint state when config changes + this._storageService.remove(Constants.InitialHintHideStorageKey, StorageScope.APPLICATION); + if (!this.configurationService.getValue(TerminalInitialHintSettingId.Enabled)) { + this.dispose(); + } } })); } From 63c1b25d1fbd64d14294b8d457c3ab4e7771f33a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 31 May 2024 11:18:08 -0700 Subject: [PATCH 005/755] Reset state in right spot --- .../browser/terminal.initialHint.contribution.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index 39991e46f266e..dbe157b1d657f 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -98,6 +98,13 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm @IStorageService private readonly _storageService: IStorageService, ) { super(); + + // Reset hint state when config changes + this._register(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(TerminalInitialHintSettingId.Enabled)) { + this._storageService.remove(Constants.InitialHintHideStorageKey, StorageScope.APPLICATION); + } + })); } xtermOpen(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void { @@ -222,12 +229,8 @@ class TerminalInitialHintWidget extends Disposable { } })); this.toDispose.add(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(TerminalInitialHintSettingId.Enabled)) { - // Reset hint state when config changes - this._storageService.remove(Constants.InitialHintHideStorageKey, StorageScope.APPLICATION); - if (!this.configurationService.getValue(TerminalInitialHintSettingId.Enabled)) { - this.dispose(); - } + if (e.affectsConfiguration(TerminalInitialHintSettingId.Enabled) && !this.configurationService.getValue(TerminalInitialHintSettingId.Enabled)) { + this.dispose(); } })); } From 6908956c1588dec6ad24ea804f40835a4e46bc79 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Jun 2024 13:41:53 +0200 Subject: [PATCH 006/755] status bar - make `loading` the default (#214135) This is a more generic progress indicator than `syncing` and looks better. --- src/vs/platform/progress/common/progress.ts | 4 ++-- src/vs/workbench/browser/parts/statusbar/statusbarItem.ts | 6 +++--- src/vs/workbench/contrib/tasks/browser/task.contribution.ts | 2 +- .../developer/browser/terminal.developer.contribution.ts | 2 +- src/vs/workbench/services/statusbar/browser/statusbar.ts | 4 ++-- .../services/textfile/common/textFileEditorModel.ts | 3 +-- .../services/workingCopy/common/storedFileWorkingCopy.ts | 3 +-- 7 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index e1eb0a2f5f296..2a1c7349aaeb8 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -65,7 +65,7 @@ export interface IProgressNotificationOptions extends IProgressOptions { readonly secondaryActions?: readonly IAction[]; readonly delay?: number; readonly priority?: NotificationPriority; - readonly type?: 'syncing' | 'loading'; + readonly type?: 'loading' | 'syncing'; } export interface IProgressDialogOptions extends IProgressOptions { @@ -77,7 +77,7 @@ export interface IProgressDialogOptions extends IProgressOptions { export interface IProgressWindowOptions extends IProgressOptions { readonly location: ProgressLocation.Window; readonly command?: string; - readonly type?: 'syncing' | 'loading'; + readonly type?: 'loading' | 'syncing'; } export interface IProgressCompositeOptions extends IProgressOptions { diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts index 07dd5640c0c0a..dd412fa30f9ea 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts @@ -283,7 +283,7 @@ class StatusBarCodiconLabel extends SimpleIconLabel { private progressCodicon = renderIcon(syncing); private currentText = ''; - private currentShowProgress: boolean | 'syncing' | 'loading' = false; + private currentShowProgress: boolean | 'loading' | 'syncing' = false; constructor( private readonly container: HTMLElement @@ -291,10 +291,10 @@ class StatusBarCodiconLabel extends SimpleIconLabel { super(container); } - set showProgress(showProgress: boolean | 'syncing' | 'loading') { + set showProgress(showProgress: boolean | 'loading' | 'syncing') { if (this.currentShowProgress !== showProgress) { this.currentShowProgress = showProgress; - this.progressCodicon = renderIcon(showProgress === 'loading' ? spinningLoading : syncing); + this.progressCodicon = renderIcon(showProgress === 'syncing' ? syncing : spinningLoading); this.text = this.currentText; } } diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts index 08e8292b60c3b..6de31d4010c1f 100644 --- a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -109,7 +109,7 @@ export class TaskStatusBarContributions extends Disposable implements IWorkbench } if (promise && (event.kind === TaskEventKind.Active) && (this._activeTasksCount === 1)) { - this._progressService.withProgress({ location: ProgressLocation.Window, command: 'workbench.action.tasks.showTasks', type: 'loading' }, progress => { + this._progressService.withProgress({ location: ProgressLocation.Window, command: 'workbench.action.tasks.showTasks' }, progress => { progress.report({ message: nls.localize('building', 'Building...') }); return promise!; }).then(() => { diff --git a/src/vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution.ts b/src/vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution.ts index 83836adc556bb..2321f8edb9695 100644 --- a/src/vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution.ts @@ -114,7 +114,7 @@ registerTerminalAction({ text, name: text, ariaLabel: text, - showProgress: 'loading' + showProgress: true }; const statusbarHandle = statusbarService.addEntry(statusbarEntry, 'recordSession', StatusbarAlignment.LEFT); store.add(statusbarHandle); diff --git a/src/vs/workbench/services/statusbar/browser/statusbar.ts b/src/vs/workbench/services/statusbar/browser/statusbar.ts index 1d00e77bca787..73fac7bb9248c 100644 --- a/src/vs/workbench/services/statusbar/browser/statusbar.ts +++ b/src/vs/workbench/services/statusbar/browser/statusbar.ts @@ -174,9 +174,9 @@ export interface IStatusbarEntry { /** * Will enable a spinning icon in front of the text to indicate progress. When `true` is - * specified, `syncing` will be used. + * specified, `loading` will be used. */ - readonly showProgress?: boolean | 'syncing' | 'loading'; + readonly showProgress?: boolean | 'loading' | 'syncing'; /** * The kind of status bar entry. This applies different colors to the entry. diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 3eeac7d1ed5fa..3150fdd7b1d57 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -824,8 +824,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil title: localize('saveParticipants', "Saving '{0}'", this.name), location: ProgressLocation.Window, cancellable: true, - delay: this.isDirty() ? 3000 : 5000, - type: 'loading' + delay: this.isDirty() ? 3000 : 5000 }, progress => { return this.doSaveSequential(versionId, options, progress, saveCancellation); }, () => { diff --git a/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopy.ts b/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopy.ts index 7d23dd40fea56..0c3532605b9dd 100644 --- a/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopy.ts +++ b/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopy.ts @@ -935,8 +935,7 @@ export class StoredFileWorkingCopy extend title: localize('saveParticipants', "Saving '{0}'", this.name), location: ProgressLocation.Window, cancellable: true, - delay: this.isDirty() ? 3000 : 5000, - type: 'loading' + delay: this.isDirty() ? 3000 : 5000 }, progress => { return this.doSaveSequential(versionId, options, progress, saveCancellation); }, () => { From 8dd604a8d859c56e20b178e957ef91b3b0c235f4 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 3 Jun 2024 05:59:45 -0700 Subject: [PATCH 007/755] Fix a listener in tunnel service that's GC'ed without having been disposed (#214138) --- src/vs/platform/tunnel/common/tunnel.ts | 9 +++++---- .../services/tunnel/electron-sandbox/tunnelService.ts | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/tunnel/common/tunnel.ts b/src/vs/platform/tunnel/common/tunnel.ts index 86b4da4b409af..b1433f2e74588 100644 --- a/src/vs/platform/tunnel/common/tunnel.ts +++ b/src/vs/platform/tunnel/common/tunnel.ts @@ -5,7 +5,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { OperatingSystem } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -215,7 +215,7 @@ export class DisposableTunnel { } } -export abstract class AbstractTunnelService implements ITunnelService { +export abstract class AbstractTunnelService extends Disposable implements ITunnelService { declare readonly _serviceBrand: undefined; private _onTunnelOpened: Emitter = new Emitter(); @@ -234,7 +234,7 @@ export abstract class AbstractTunnelService implements ITunnelService { public constructor( @ILogService protected readonly logService: ILogService, @IConfigurationService protected readonly configurationService: IConfigurationService - ) { } + ) { super(); } get hasTunnelProvider(): boolean { return !!this._tunnelProvider; @@ -308,7 +308,8 @@ export abstract class AbstractTunnelService implements ITunnelService { return tunnels; } - async dispose(): Promise { + override async dispose(): Promise { + super.dispose(); for (const portMap of this._tunnels.values()) { for (const { value } of portMap.values()) { await value.then(tunnel => typeof tunnel !== 'string' ? tunnel?.dispose() : undefined); diff --git a/src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts b/src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts index 1794885179731..794fb8960ce82 100644 --- a/src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts +++ b/src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts @@ -68,11 +68,11 @@ export class TunnelService extends AbstractTunnelService { super(logService, configurationService); // Destroy any shared process tunnels that might still be active - lifecycleService.onDidShutdown(() => { + this._register(lifecycleService.onDidShutdown(() => { this._activeSharedProcessTunnels.forEach((id) => { this._sharedProcessTunnelService.destroyTunnel(id); }); - }); + })); } public isPortPrivileged(port: number): boolean { From cda51f7b7051326e44a4fb11eb92feb87edf8ba8 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Mon, 3 Jun 2024 15:00:45 +0200 Subject: [PATCH 008/755] Refactoring the stickyScrollController `setState` method (#213917) * adding changes * fixing compilation errors, using undefined as the fallback type not null --- .../browser/stickyScrollController.ts | 54 +++++++++++-------- .../browser/stickyScrollWidget.ts | 12 +++-- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts index bdc0542b18e54..6f5e09d5a483f 100644 --- a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts +++ b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts @@ -51,7 +51,7 @@ export class StickyScrollController extends Disposable implements IEditorContrib private readonly _sessionStore: DisposableStore = new DisposableStore(); private _widgetState: StickyScrollWidgetState; - private _foldingModel: FoldingModel | null = null; + private _foldingModel: FoldingModel | undefined; private _maxStickyLines: number = Number.MAX_SAFE_INTEGER; private _stickyRangeProjectedOnEditor: IRange | undefined; @@ -67,7 +67,7 @@ export class StickyScrollController extends Disposable implements IEditorContrib private _positionRevealed = false; private _onMouseDown = false; private _endLineNumbers: number[] = []; - private _showEndForLine: number | null = null; + private _showEndForLine: number | undefined; constructor( private readonly _editor: ICodeEditor, @@ -84,7 +84,7 @@ export class StickyScrollController extends Disposable implements IEditorContrib this._register(this._stickyScrollWidget); this._register(this._stickyLineCandidateProvider); - this._widgetState = new StickyScrollWidgetState([], [], 0); + this._widgetState = StickyScrollWidgetState.Empty; this._onDidResize(); this._readConfiguration(); const stickyScrollDomNode = this._stickyScrollWidget.getDomNode(); @@ -291,14 +291,14 @@ export class StickyScrollController extends Disposable implements IEditorContrib this._renderStickyScroll(); return; } - if (this._showEndForLine !== null) { - this._showEndForLine = null; + if (this._showEndForLine !== undefined) { + this._showEndForLine = undefined; this._renderStickyScroll(); } })); this._register(dom.addDisposableListener(stickyScrollWidgetDomNode, dom.EventType.MOUSE_LEAVE, (e) => { - if (this._showEndForLine !== null) { - this._showEndForLine = null; + if (this._showEndForLine !== undefined) { + this._showEndForLine = undefined; this._renderStickyScroll(); } })); @@ -415,14 +415,14 @@ export class StickyScrollController extends Disposable implements IEditorContrib this._editor.addOverlayWidget(this._stickyScrollWidget); this._sessionStore.add(this._editor.onDidScrollChange((e) => { if (e.scrollTopChanged) { - this._showEndForLine = null; + this._showEndForLine = undefined; this._renderStickyScroll(); } })); this._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize())); this._sessionStore.add(this._editor.onDidChangeModelTokens((e) => this._onTokensChange(e))); this._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(() => { - this._showEndForLine = null; + this._showEndForLine = undefined; this._renderStickyScroll(); })); this._enabled = true; @@ -431,7 +431,7 @@ export class StickyScrollController extends Disposable implements IEditorContrib const lineNumberOption = this._editor.getOption(EditorOption.lineNumbers); if (lineNumberOption.renderType === RenderLineNumbersType.Relative) { this._sessionStore.add(this._editor.onDidChangeCursorPosition(() => { - this._showEndForLine = null; + this._showEndForLine = undefined; this._renderStickyScroll(0); })); } @@ -479,32 +479,28 @@ export class StickyScrollController extends Disposable implements IEditorContrib this._maxStickyLines = Math.round(theoreticalLines * .25); } - private async _renderStickyScroll(rebuildFromLine?: number) { + private async _renderStickyScroll(rebuildFromLine?: number): Promise { const model = this._editor.getModel(); if (!model || model.isTooLargeForTokenization()) { - this._foldingModel = null; - this._stickyScrollWidget.setState(undefined, null); + this._resetState(); return; } - const stickyLineVersion = this._stickyLineCandidateProvider.getVersionId(); - if (stickyLineVersion === undefined || stickyLineVersion === model.getVersionId()) { - this._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? null; - this._widgetState = this.findScrollWidgetState(); - this._stickyScrollVisibleContextKey.set(!(this._widgetState.startLineNumbers.length === 0)); - + const stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId(); + const shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId(); + if (shouldUpdateState) { if (!this._focused) { - this._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine); + await this._updateState(rebuildFromLine); } else { // Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused if (this._focusedStickyElementIndex === -1) { - this._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine); + await this._updateState(rebuildFromLine); this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1; if (this._focusedStickyElementIndex !== -1) { this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex); } } else { const focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex]; - this._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine); + await this._updateState(rebuildFromLine); // Suppose that after setting the state, there are no sticky lines, set the focused index to -1 if (this._stickyScrollWidget.lineNumberCount === 0) { this._focusedStickyElementIndex = -1; @@ -522,6 +518,20 @@ export class StickyScrollController extends Disposable implements IEditorContrib } } } + private async _updateState(rebuildFromLine?: number): Promise { + this._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined; + this._widgetState = this.findScrollWidgetState(); + const stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0; + this._stickyScrollVisibleContextKey.set(stickyWidgetHasLines); + this._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine); + } + + private async _resetState(): Promise { + this._foldingModel = undefined; + this._widgetState = StickyScrollWidgetState.Empty; + this._stickyScrollVisibleContextKey.set(false); + this._stickyScrollWidget.setState(undefined, undefined); + } findScrollWidgetState(): StickyScrollWidgetState { const lineHeight: number = this._editor.getOption(EditorOption.lineHeight); diff --git a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts index d0e8da4b17a13..27d3d8e1a58e7 100644 --- a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts +++ b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts @@ -35,6 +35,10 @@ export class StickyScrollWidgetState { && equals(this.startLineNumbers, other.startLineNumbers) && equals(this.endLineNumbers, other.endLineNumbers); } + + static get Empty() { + return new StickyScrollWidgetState([], [], 0); + } } const _ttPolicy = createTrustedTypesPolicy('stickyScrollViewLayer', { createHTML: value => value }); @@ -126,7 +130,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget { return this._lineNumbers; } - setState(_state: StickyScrollWidgetState | undefined, foldingModel: FoldingModel | null, _rebuildFromLine?: number): void { + setState(_state: StickyScrollWidgetState | undefined, foldingModel: FoldingModel | undefined, _rebuildFromLine?: number): void { if (_rebuildFromLine === undefined && ((!this._previousState && !_state) || (this._previousState && this._previousState.equals(_state))) ) { @@ -205,7 +209,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget { } } - private async _renderRootNode(state: StickyScrollWidgetState | undefined, foldingModel: FoldingModel | null, rebuildFromLine: number): Promise { + private async _renderRootNode(state: StickyScrollWidgetState | undefined, foldingModel: FoldingModel | undefined, rebuildFromLine: number): Promise { this._clearStickyLinesFromLine(rebuildFromLine); if (!state) { return; @@ -258,7 +262,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget { })); } - private _renderChildNode(index: number, line: number, foldingModel: FoldingModel | null, layoutInfo: EditorLayoutInfo): RenderedStickyLine | undefined { + private _renderChildNode(index: number, line: number, foldingModel: FoldingModel | undefined, layoutInfo: EditorLayoutInfo): RenderedStickyLine | undefined { const viewModel = this._editor._getViewModel(); if (!viewModel) { return; @@ -358,7 +362,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget { return stickyLine; } - private _renderFoldingIconForLine(foldingModel: FoldingModel | null, line: number): StickyFoldingIcon | undefined { + private _renderFoldingIconForLine(foldingModel: FoldingModel | undefined, line: number): StickyFoldingIcon | undefined { const showFoldingControls: 'mouseover' | 'always' | 'never' = this._editor.getOption(EditorOption.showFoldingControls); if (!foldingModel || showFoldingControls === 'never') { return; From 9b17067697451a49df5ff358b3bd3fc00bf197db Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Jun 2024 15:22:13 +0200 Subject: [PATCH 009/755] debt - :up: `jschardet@3.1.2` (#214136) --- extensions/git/package.json | 2 +- extensions/git/yarn.lock | 8 ++++---- package.json | 2 +- remote/package.json | 2 +- remote/web/package.json | 2 +- remote/web/yarn.lock | 8 ++++---- remote/yarn.lock | 8 ++++---- yarn.lock | 8 ++++---- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index dfbb29289db50..23b3220a00cb3 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -3401,7 +3401,7 @@ "@vscode/iconv-lite-umd": "0.7.0", "byline": "^5.0.0", "file-type": "16.5.4", - "jschardet": "3.0.0", + "jschardet": "3.1.2", "picomatch": "2.3.1", "vscode-uri": "^2.0.0", "which": "4.0.0" diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index 266157e9e5c91..06023a6122708 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -182,10 +182,10 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -jschardet@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" - integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== +jschardet@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" + integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== peek-readable@^4.1.0: version "4.1.0" diff --git a/package.json b/package.json index 1965949114daf..f259cb2882382 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", - "jschardet": "3.0.0", + "jschardet": "3.1.2", "kerberos": "^2.0.1", "minimist": "^1.2.6", "native-is-elevated": "0.7.0", diff --git a/remote/package.json b/remote/package.json index b84f5136fb171..5733a75fe7393 100644 --- a/remote/package.json +++ b/remote/package.json @@ -25,7 +25,7 @@ "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", - "jschardet": "3.0.0", + "jschardet": "3.1.2", "kerberos": "^2.0.1", "minimist": "^1.2.6", "native-watchdog": "^1.4.1", diff --git a/remote/web/package.json b/remote/web/package.json index 76375094a7dae..598e1607beb25 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -13,7 +13,7 @@ "@xterm/addon-unicode11": "0.9.0-beta.17", "@xterm/addon-webgl": "0.19.0-beta.17", "@xterm/xterm": "5.6.0-beta.17", - "jschardet": "3.0.0", + "jschardet": "3.1.2", "tas-client-umd": "0.2.0", "vscode-oniguruma": "1.7.0", "vscode-textmate": "9.0.0" diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index 81215235ac655..b207dffd0e9bd 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -78,10 +78,10 @@ resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.17.tgz#67ce2e2ff45bd6cc9f26d455d5522c6c4a122ed9" integrity sha512-+wAv8PhaGQSN9yXWIa8EFtT33pbrA4lZakMB1P05fr+DQ7zoH66QOAUoDY95uOf/4+S6Ihz8wzP2+FH8zETQEA== -jschardet@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" - integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== +jschardet@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" + integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== tas-client-umd@0.2.0: version "0.2.0" diff --git a/remote/yarn.lock b/remote/yarn.lock index 4241bf03b14ac..41ffebe6c4a8b 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -347,10 +347,10 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -jschardet@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" - integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== +jschardet@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" + integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== jsonfile@^6.0.1: version "6.1.0" diff --git a/yarn.lock b/yarn.lock index f2613ceef5146..fc0d5f8bf8751 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6229,10 +6229,10 @@ js-yaml@^3.13.0: argparse "^1.0.7" esprima "^4.0.0" -jschardet@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" - integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== +jschardet@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" + integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" From f4e9ac0f35bd384dbdff16212f26f5a72fb1da38 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 3 Jun 2024 06:39:12 -0700 Subject: [PATCH 010/755] Handle when `item` is undefined (#214107) Fixes https://github.com/microsoft/vscode/issues/213363 --- .../contrib/terminal/browser/terminalRunRecentQuickPick.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick.ts b/src/vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick.ts index a17b660a13cbf..b795f91f201ff 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick.ts @@ -269,6 +269,9 @@ export async function showRunRecentQuickPick( return; } const [item] = quickPick.activeItems; + if (!item) { + return; + } if ('command' in item && item.command && item.command.marker) { if (!terminalScrollStateSaved) { xterm.markTracker.saveScrollState(); From addd445017c9c5531b89851dc8dc9bec4f1dd0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 3 Jun 2024 16:10:01 +0200 Subject: [PATCH 011/755] upload sourcemaps to CDN instead of ticino (#214141) --- build/azure-pipelines/product-compile.yml | 11 ++++++++++- build/azure-pipelines/web/product-build-web.yml | 11 ++++++++++- build/gulpfile.extensions.js | 2 +- build/gulpfile.reh.js | 2 +- build/gulpfile.vscode.js | 2 +- build/gulpfile.vscode.web.js | 2 +- build/lib/extensions.js | 2 +- build/lib/extensions.ts | 2 +- 8 files changed, 26 insertions(+), 8 deletions(-) diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index 41c33f3f26512..9a3748ed6fc19 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -135,13 +135,22 @@ steps: - script: | set -e - AZURE_STORAGE_ACCOUNT="ticino" \ + AZURE_STORAGE_ACCOUNT="vscodeweb" \ AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \ AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \ AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \ node build/azure-pipelines/upload-sourcemaps displayName: Upload sourcemaps to Azure + - script: | + set -e + AZURE_STORAGE_ACCOUNT="ticino" \ + AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \ + AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \ + AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \ + node build/azure-pipelines/upload-sourcemaps + displayName: Upload sourcemaps to Azure (Deprecated) + - script: ./build/azure-pipelines/common/extract-telemetry.sh displayName: Generate lists of telemetry events diff --git a/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml index bf43d9212cf3d..5e423d077c7e2 100644 --- a/build/azure-pipelines/web/product-build-web.yml +++ b/build/azure-pipelines/web/product-build-web.yml @@ -129,6 +129,15 @@ steps: node build/azure-pipelines/upload-cdn displayName: Upload to CDN + - script: | + set -e + AZURE_STORAGE_ACCOUNT="vscodeweb" \ + AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \ + AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \ + AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \ + node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.main.js.map + displayName: Upload sourcemaps (Web) + # upload only the workbench.web.main.js source maps because # we just compiled these bits in the previous step and the # general task to upload source maps has already been run @@ -139,7 +148,7 @@ steps: AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \ AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \ node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.main.js.map - displayName: Upload sourcemaps (Web) + displayName: Upload sourcemaps (Deprecated) - script: | set -e diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 559049597787e..b85425bccfc01 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -71,7 +71,7 @@ const compilations = [ '.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json', ]; -const getBaseUrl = out => `https://ticino.blob.core.windows.net/sourcemaps/${commit}/${out}`; +const getBaseUrl = out => `https://main.vscode-cdn.net/sourcemaps/${commit}/${out}`; const tasks = compilations.map(function (tsconfigFile) { const absolutePath = path.join(root, tsconfigFile); diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index c2b81d0cf7c7e..4ab7dcbc4b6d9 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -439,7 +439,7 @@ function tweakProductForServerWeb(product) { const minifyTask = task.define(`minify-vscode-${type}`, task.series( optimizeTask, util.rimraf(`out-vscode-${type}-min`), - optimize.minifyTask(`out-vscode-${type}`, `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`) + optimize.minifyTask(`out-vscode-${type}`, `https://main.vscode-cdn.net/sourcemaps/${commit}/core`) )); gulp.task(minifyTask); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 3b1aeafd080fb..c6202c7088305 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -133,7 +133,7 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( )); gulp.task(optimizeVSCodeTask); -const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; +const sourceMappingURLBase = `https://main.vscode-cdn.net/sourcemaps/${commit}`; const minifyVSCodeTask = task.define('minify-vscode', task.series( optimizeVSCodeTask, util.rimraf('out-vscode-min'), diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 85129a523da67..50c7e6fb6318f 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -175,7 +175,7 @@ const optimizeVSCodeWebTask = task.define('optimize-vscode-web', task.series( const minifyVSCodeWebTask = task.define('minify-vscode-web', task.series( optimizeVSCodeWebTask, util.rimraf('out-vscode-web-min'), - optimize.minifyTask('out-vscode-web', `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`) + optimize.minifyTask('out-vscode-web', `https://main.vscode-cdn.net/sourcemaps/${commit}/core`) )); gulp.task(minifyVSCodeWebTask); diff --git a/build/lib/extensions.js b/build/lib/extensions.js index 6a6c0a7b4cd87..58d4d3e9a7ff6 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -34,7 +34,7 @@ const getVersion_1 = require("./getVersion"); const fetch_1 = require("./fetch"); const root = path.dirname(path.dirname(__dirname)); const commit = (0, getVersion_1.getVersion)(root); -const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; +const sourceMappingURLBase = `https://main.vscode-cdn.net/sourcemaps/${commit}`; function minifyExtensionResources(input) { const jsonFilter = filter(['**/*.json', '**/*.code-snippets'], { restore: true }); return input diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 6edfdcb63fb12..0582e0cb11e22 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -28,7 +28,7 @@ import { fetchUrls, fetchGithub } from './fetch'; const root = path.dirname(path.dirname(__dirname)); const commit = getVersion(root); -const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; +const sourceMappingURLBase = `https://main.vscode-cdn.net/sourcemaps/${commit}`; function minifyExtensionResources(input: Stream): Stream { const jsonFilter = filter(['**/*.json', '**/*.code-snippets'], { restore: true }); From 09981a84af873438c891a85ef5398f392dc9c8f9 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 3 Jun 2024 16:50:28 +0200 Subject: [PATCH 012/755] configure `esModuleInterop: true`, change some star-imports --- build/lib/bundle.ts | 3 +++ src/tsconfig.json | 1 + src/vs/platform/environment/node/argv.ts | 2 +- src/vs/platform/environment/node/argvHelper.ts | 2 +- .../electron-main/nativeHostMainService.ts | 2 +- .../workbench/api/node/extensionHostProcess.ts | 2 +- src/vs/workbench/api/node/proxyResolver.ts | 17 +++++++++++++---- test/unit/electron/renderer.js | 4 +++- 8 files changed, 24 insertions(+), 9 deletions(-) diff --git a/build/lib/bundle.ts b/build/lib/bundle.ts index c5fdc2da18cf4..2efa081b47197 100644 --- a/build/lib/bundle.ts +++ b/build/lib/bundle.ts @@ -365,6 +365,9 @@ function removeDuplicateTSBoilerplate(destFiles: IConcatFile[]): IConcatFile[] { { start: /^var __param/, end: /^};$/ }, { start: /^var __awaiter/, end: /^};$/ }, { start: /^var __generator/, end: /^};$/ }, + { start: /^var __createBinding/, end: /^}\)\);$/ }, + { start: /^var __setModuleDefault/, end: /^}\);$/ }, + { start: /^var __importStar/, end: /^};$/ }, ]; destFiles.forEach((destFile) => { diff --git a/src/tsconfig.json b/src/tsconfig.json index 2ac819490e536..35421bb1aaafc 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { + "esModuleInterop": true, "removeComments": false, "preserveConstEnums": true, "sourceMap": false, diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 26b7d9c693745..16a942afe0596 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as minimist from 'minimist'; +import minimist from 'minimist'; import { isWindows } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; diff --git a/src/vs/platform/environment/node/argvHelper.ts b/src/vs/platform/environment/node/argvHelper.ts index d8cefb6df673d..a94fca911ea2b 100644 --- a/src/vs/platform/environment/node/argvHelper.ts +++ b/src/vs/platform/environment/node/argvHelper.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; diff --git a/src/vs/platform/native/electron-main/nativeHostMainService.ts b/src/vs/platform/native/electron-main/nativeHostMainService.ts index bb5d30f083bd7..c7c6cf552ae30 100644 --- a/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -500,7 +500,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain async isAdmin(): Promise { let isAdmin: boolean; if (isWindows) { - isAdmin = (await import('native-is-elevated'))(); + isAdmin = (await import('native-is-elevated')).default(); } else { isAdmin = process.getuid?.() === 0; } diff --git a/src/vs/workbench/api/node/extensionHostProcess.ts b/src/vs/workbench/api/node/extensionHostProcess.ts index 785db7edd432e..c98941f51816e 100644 --- a/src/vs/workbench/api/node/extensionHostProcess.ts +++ b/src/vs/workbench/api/node/extensionHostProcess.ts @@ -5,7 +5,7 @@ import * as nativeWatchdog from 'native-watchdog'; import * as net from 'net'; -import * as minimist from 'minimist'; +import minimist from 'minimist'; import * as performance from 'vs/base/common/performance'; import type { MessagePortMain } from 'vs/base/parts/sandbox/node/electronTypes'; import { isCancellationError, isSigPipeError, onUnexpectedError } from 'vs/base/common/errors'; diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index 519924eec138c..ddeddfe8945a1 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -77,11 +77,20 @@ export function connectProxyResolver( } function createPatchedModules(params: ProxyAgentParams, resolveProxy: ReturnType) { + + function proxyAssign(module: any, patch: any) { + return new Proxy(module, { + get(target, prop) { + return prop in patch ? patch[prop] : target[prop]; + } + }); + } + return { - http: Object.assign(http, createHttpPatch(params, http, resolveProxy)), - https: Object.assign(https, createHttpPatch(params, https, resolveProxy)), - net: Object.assign(net, createNetPatch(params, net)), - tls: Object.assign(tls, createTlsPatch(params, tls)) + http: proxyAssign(http, createHttpPatch(params, http, resolveProxy)), + https: proxyAssign(https, createHttpPatch(params, https, resolveProxy)), + net: proxyAssign(net, createNetPatch(params, net)), + tls: proxyAssign(tls, createTlsPatch(params, tls)) }; } diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index c9f4dfa1e6a27..8aa50a2b008d1 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -207,7 +207,9 @@ async function loadTests(opts) { for (const consoleFn of [console.log, console.error, console.info, console.warn, console.trace, console.debug]) { console[consoleFn.name] = function (msg) { - if (!_allowedTestOutput.some(a => a.test(msg)) && !_allowedTestsWithOutput.has(currentTest.title)) { + if (!currentTest) { + consoleFn.apply(console, arguments); + } else if (!_allowedTestOutput.some(a => a.test(msg)) && !_allowedTestsWithOutput.has(currentTest.title)) { _testsWithUnexpectedOutput = true; consoleFn.apply(console, arguments); } From 8bcf4abd9defd1f89204034b2e0934ef628ba16f Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Mon, 3 Jun 2024 07:50:36 -0700 Subject: [PATCH 013/755] remove important! on style (#214044) --- .../contrib/notebook/browser/view/renderers/backLayerWebView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 9cc82bc223a00..ee8efdec5a2f6 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -436,7 +436,7 @@ export class BackLayerWebView extends Themable { } table, thead, tr, th, td, tbody { - border: none !important; + border: none; border-color: transparent; border-spacing: 0; border-collapse: collapse; From 9cc71ffe83d175395b96e792bfd4915e7c7b5182 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 3 Jun 2024 16:50:42 +0200 Subject: [PATCH 014/755] change all assert-star-imports --- src/vs/base/parts/ipc/test/browser/ipc.mp.test.ts | 2 +- src/vs/base/parts/ipc/test/common/ipc.test.ts | 2 +- src/vs/base/parts/ipc/test/electron-sandbox/ipc.mp.test.ts | 2 +- src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts | 2 +- src/vs/base/parts/ipc/test/node/ipc.net.test.ts | 2 +- .../base/parts/sandbox/test/electron-sandbox/globals.test.ts | 2 +- src/vs/base/test/browser/actionbar.test.ts | 2 +- src/vs/base/test/browser/browser.test.ts | 2 +- src/vs/base/test/browser/comparers.test.ts | 2 +- src/vs/base/test/browser/dom.test.ts | 2 +- src/vs/base/test/browser/formattedTextRenderer.test.ts | 2 +- src/vs/base/test/browser/hash.test.ts | 2 +- src/vs/base/test/browser/highlightedLabel.test.ts | 2 +- src/vs/base/test/browser/iconLabels.test.ts | 2 +- src/vs/base/test/browser/indexedDB.test.ts | 2 +- src/vs/base/test/browser/markdownRenderer.test.ts | 2 +- src/vs/base/test/browser/progressBar.test.ts | 2 +- src/vs/base/test/browser/ui/contextview/contextview.test.ts | 2 +- src/vs/base/test/browser/ui/grid/grid.test.ts | 2 +- src/vs/base/test/browser/ui/grid/gridview.test.ts | 2 +- src/vs/base/test/browser/ui/grid/util.ts | 2 +- src/vs/base/test/browser/ui/list/listView.test.ts | 2 +- src/vs/base/test/browser/ui/list/listWidget.test.ts | 2 +- src/vs/base/test/browser/ui/list/rangeMap.test.ts | 2 +- src/vs/base/test/browser/ui/menu/menubar.test.ts | 2 +- .../base/test/browser/ui/scrollbar/scrollableElement.test.ts | 2 +- src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts | 2 +- src/vs/base/test/browser/ui/splitview/splitview.test.ts | 2 +- src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts | 2 +- .../test/browser/ui/tree/compressedObjectTreeModel.test.ts | 2 +- src/vs/base/test/browser/ui/tree/dataTree.test.ts | 2 +- src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts | 2 +- src/vs/base/test/browser/ui/tree/objectTree.test.ts | 2 +- src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts | 2 +- src/vs/base/test/common/arrays.test.ts | 2 +- src/vs/base/test/common/arraysFind.test.ts | 2 +- src/vs/base/test/common/assert.test.ts | 2 +- src/vs/base/test/common/async.test.ts | 2 +- src/vs/base/test/common/buffer.test.ts | 2 +- src/vs/base/test/common/cache.test.ts | 2 +- src/vs/base/test/common/cancellation.test.ts | 2 +- src/vs/base/test/common/charCode.test.ts | 2 +- src/vs/base/test/common/collections.test.ts | 2 +- src/vs/base/test/common/color.test.ts | 2 +- src/vs/base/test/common/console.test.ts | 2 +- src/vs/base/test/common/decorators.test.ts | 2 +- src/vs/base/test/common/diff/diff.test.ts | 2 +- src/vs/base/test/common/errors.test.ts | 2 +- src/vs/base/test/common/event.test.ts | 2 +- src/vs/base/test/common/extpath.test.ts | 2 +- src/vs/base/test/common/filters.test.ts | 2 +- src/vs/base/test/common/fuzzyScorer.test.ts | 2 +- src/vs/base/test/common/glob.test.ts | 2 +- src/vs/base/test/common/history.test.ts | 2 +- src/vs/base/test/common/iconLabels.test.ts | 2 +- src/vs/base/test/common/iterator.test.ts | 2 +- src/vs/base/test/common/json.test.ts | 2 +- src/vs/base/test/common/jsonEdit.test.ts | 2 +- src/vs/base/test/common/jsonFormatter.test.ts | 2 +- src/vs/base/test/common/keyCodes.test.ts | 2 +- src/vs/base/test/common/keybindings.test.ts | 2 +- src/vs/base/test/common/labels.test.ts | 2 +- src/vs/base/test/common/lazy.test.ts | 2 +- src/vs/base/test/common/lifecycle.test.ts | 2 +- src/vs/base/test/common/linkedList.test.ts | 2 +- src/vs/base/test/common/linkedText.test.ts | 2 +- src/vs/base/test/common/map.test.ts | 2 +- src/vs/base/test/common/markdownString.test.ts | 2 +- src/vs/base/test/common/marshalling.test.ts | 2 +- src/vs/base/test/common/mime.test.ts | 2 +- src/vs/base/test/common/network.test.ts | 2 +- src/vs/base/test/common/normalization.test.ts | 2 +- src/vs/base/test/common/objects.test.ts | 2 +- src/vs/base/test/common/observable.test.ts | 2 +- src/vs/base/test/common/paging.test.ts | 2 +- src/vs/base/test/common/path.test.ts | 2 +- src/vs/base/test/common/prefixTree.test.ts | 2 +- src/vs/base/test/common/processes.test.ts | 2 +- src/vs/base/test/common/resourceTree.test.ts | 2 +- src/vs/base/test/common/resources.test.ts | 2 +- src/vs/base/test/common/scrollable.test.ts | 2 +- src/vs/base/test/common/skipList.test.ts | 2 +- src/vs/base/test/common/stream.test.ts | 2 +- src/vs/base/test/common/strings.test.ts | 2 +- src/vs/base/test/common/stripComments.test.ts | 2 +- src/vs/base/test/common/ternarySearchtree.test.ts | 2 +- src/vs/base/test/common/tfIdf.test.ts | 2 +- src/vs/base/test/common/types.test.ts | 2 +- src/vs/base/test/common/uri.test.ts | 2 +- src/vs/base/test/common/uuid.test.ts | 2 +- src/vs/base/test/node/css.build.test.ts | 2 +- src/vs/base/test/node/extpath.test.ts | 2 +- src/vs/base/test/node/id.test.ts | 2 +- src/vs/base/test/node/nodeStreams.test.ts | 2 +- src/vs/base/test/node/pfs/pfs.test.ts | 2 +- src/vs/base/test/node/port.test.ts | 2 +- src/vs/base/test/node/powershell.test.ts | 2 +- src/vs/base/test/node/processes/processes.integrationTest.ts | 2 +- src/vs/base/test/node/uri.perf.test.ts | 2 +- src/vs/base/test/node/zip/zip.test.ts | 2 +- .../bracketMatching/test/browser/bracketMatching.test.ts | 2 +- .../editor/contrib/codeAction/test/browser/codeAction.test.ts | 2 +- .../test/browser/codeActionKeybindingResolver.test.ts | 3 +-- .../contrib/codeAction/test/browser/codeActionModel.test.ts | 2 +- .../contrib/comment/test/browser/lineCommentCommand.test.ts | 2 +- .../editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts | 2 +- .../contrib/documentSymbols/test/browser/outlineModel.test.ts | 2 +- .../contrib/dropOrPasteInto/test/browser/editSort.test.ts | 2 +- .../contrib/editorState/test/browser/editorState.test.ts | 2 +- src/vs/editor/contrib/find/test/browser/find.test.ts | 2 +- .../editor/contrib/find/test/browser/findController.test.ts | 2 +- src/vs/editor/contrib/find/test/browser/findModel.test.ts | 2 +- .../editor/contrib/find/test/browser/replacePattern.test.ts | 2 +- .../editor/contrib/folding/test/browser/foldingModel.test.ts | 2 +- .../editor/contrib/folding/test/browser/foldingRanges.test.ts | 2 +- .../contrib/folding/test/browser/hiddenRangeModel.test.ts | 2 +- src/vs/editor/contrib/folding/test/browser/indentFold.test.ts | 2 +- .../contrib/folding/test/browser/indentRangeProvider.test.ts | 2 +- src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts | 2 +- .../contrib/gotoSymbol/test/browser/referencesModel.test.ts | 2 +- src/vs/editor/contrib/hover/test/browser/contentHover.test.ts | 2 +- .../contrib/indentation/test/browser/indentation.test.ts | 3 +-- .../indentation/test/browser/indentationLineProcessor.test.ts | 2 +- .../test/browser/inlineCompletionsModel.test.ts | 2 +- .../test/browser/inlineCompletionsProvider.test.ts | 2 +- .../inlineCompletions/test/browser/suggestWidgetModel.test.ts | 2 +- .../contrib/lineSelection/test/browser/lineSelection.test.ts | 2 +- .../linesOperations/test/browser/copyLinesCommand.test.ts | 2 +- .../linesOperations/test/browser/linesOperations.test.ts | 2 +- .../contrib/linkedEditing/test/browser/linkedEditing.test.ts | 2 +- .../contrib/multicursor/test/browser/multicursor.test.ts | 2 +- .../parameterHints/test/browser/parameterHintsModel.test.ts | 2 +- .../test/browser/documentSemanticTokens.test.ts | 2 +- .../semanticTokens/test/browser/getSemanticTokens.test.ts | 2 +- .../contrib/smartSelect/test/browser/smartSelect.test.ts | 2 +- .../snippet/test/browser/snippetController2.old.test.ts | 2 +- .../contrib/snippet/test/browser/snippetController2.test.ts | 2 +- .../editor/contrib/snippet/test/browser/snippetParser.test.ts | 2 +- .../contrib/snippet/test/browser/snippetSession.test.ts | 2 +- .../contrib/snippet/test/browser/snippetVariables.test.ts | 2 +- .../contrib/stickyScroll/test/browser/stickyScroll.test.ts | 2 +- .../contrib/suggest/test/browser/completionModel.test.ts | 2 +- src/vs/editor/contrib/suggest/test/browser/suggest.test.ts | 2 +- .../contrib/suggest/test/browser/suggestController.test.ts | 2 +- .../suggest/test/browser/suggestInlineCompletions.test.ts | 2 +- .../editor/contrib/suggest/test/browser/suggestMemory.test.ts | 2 +- .../editor/contrib/suggest/test/browser/suggestModel.test.ts | 2 +- .../editor/contrib/suggest/test/browser/wordDistance.test.ts | 2 +- .../wordOperations/test/browser/wordOperations.test.ts | 2 +- .../test/browser/wordPartOperations.test.ts | 2 +- src/vs/editor/standalone/test/browser/monarch.test.ts | 2 +- .../standalone/test/browser/standaloneLanguages.test.ts | 2 +- .../editor/standalone/test/browser/standaloneServices.test.ts | 2 +- src/vs/editor/test/browser/commands/shiftCommand.test.ts | 2 +- src/vs/editor/test/browser/commands/sideEditing.test.ts | 2 +- .../browser/commands/trimTrailingWhitespaceCommand.test.ts | 2 +- src/vs/editor/test/browser/config/editorConfiguration.test.ts | 2 +- .../editor/test/browser/config/editorLayoutProvider.test.ts | 2 +- .../editor/test/browser/controller/cursor.integrationTest.ts | 2 +- src/vs/editor/test/browser/controller/cursor.test.ts | 2 +- .../editor/test/browser/controller/cursorMoveCommand.test.ts | 2 +- src/vs/editor/test/browser/controller/textAreaInput.test.ts | 2 +- src/vs/editor/test/browser/controller/textAreaState.test.ts | 2 +- .../test/browser/services/decorationRenderOptions.test.ts | 2 +- src/vs/editor/test/browser/services/openerService.test.ts | 2 +- src/vs/editor/test/browser/testCommand.ts | 2 +- src/vs/editor/test/browser/view/minimapCharRenderer.test.ts | 2 +- src/vs/editor/test/browser/view/viewLayer.test.ts | 2 +- .../editor/test/browser/viewModel/modelLineProjection.test.ts | 2 +- .../test/browser/viewModel/viewModelDecorations.test.ts | 2 +- src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts | 2 +- src/vs/editor/test/browser/widget/codeEditorWidget.test.ts | 2 +- src/vs/editor/test/browser/widget/diffEditorWidget.test.ts | 2 +- .../test/common/controller/cursorAtomicMoveOperations.test.ts | 2 +- src/vs/editor/test/common/controller/cursorMoveHelper.test.ts | 2 +- src/vs/editor/test/common/core/characterClassifier.test.ts | 2 +- src/vs/editor/test/common/core/lineRange.test.ts | 2 +- src/vs/editor/test/common/core/lineTokens.test.ts | 2 +- .../editor/test/common/core/positionOffsetTransformer.test.ts | 2 +- src/vs/editor/test/common/core/range.test.ts | 2 +- src/vs/editor/test/common/core/stringBuilder.test.ts | 2 +- src/vs/editor/test/common/core/textEdit.test.ts | 2 +- src/vs/editor/test/common/diff/diffComputer.test.ts | 2 +- .../bracketPairColorizer/beforeEditPositionMapper.test.ts | 2 +- .../test/common/model/bracketPairColorizer/brackets.test.ts | 2 +- .../model/bracketPairColorizer/combineTextEditInfos.test.ts | 2 +- .../common/model/bracketPairColorizer/concat23Trees.test.ts | 2 +- .../model/bracketPairColorizer/getBracketPairsInRange.test.ts | 2 +- .../test/common/model/bracketPairColorizer/length.test.ts | 2 +- .../model/bracketPairColorizer/smallImmutableSet.test.ts | 2 +- .../test/common/model/bracketPairColorizer/tokenizer.test.ts | 2 +- src/vs/editor/test/common/model/editStack.test.ts | 2 +- src/vs/editor/test/common/model/editableTextModel.test.ts | 2 +- src/vs/editor/test/common/model/editableTextModelTestUtils.ts | 2 +- src/vs/editor/test/common/model/intervalTree.test.ts | 3 +-- .../test/common/model/linesTextBuffer/linesTextBuffer.test.ts | 2 +- .../model/linesTextBuffer/linesTextBufferBuilder.test.ts | 2 +- src/vs/editor/test/common/model/model.line.test.ts | 2 +- src/vs/editor/test/common/model/model.modes.test.ts | 2 +- src/vs/editor/test/common/model/model.test.ts | 2 +- src/vs/editor/test/common/model/modelDecorations.test.ts | 2 +- src/vs/editor/test/common/model/modelEditOperation.test.ts | 2 +- src/vs/editor/test/common/model/modelInjectedText.test.ts | 2 +- .../model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts | 2 +- src/vs/editor/test/common/model/textChange.test.ts | 2 +- src/vs/editor/test/common/model/textModel.test.ts | 2 +- src/vs/editor/test/common/model/textModelSearch.test.ts | 2 +- src/vs/editor/test/common/model/textModelTokens.test.ts | 2 +- src/vs/editor/test/common/model/textModelWithTokens.test.ts | 2 +- src/vs/editor/test/common/model/tokensStore.test.ts | 2 +- src/vs/editor/test/common/modes/languageConfiguration.test.ts | 2 +- src/vs/editor/test/common/modes/languageSelector.test.ts | 2 +- src/vs/editor/test/common/modes/linkComputer.test.ts | 2 +- .../editor/test/common/modes/supports/characterPair.test.ts | 2 +- .../test/common/modes/supports/electricCharacter.test.ts | 2 +- src/vs/editor/test/common/modes/supports/onEnter.test.ts | 2 +- .../test/common/modes/supports/richEditBrackets.test.ts | 2 +- src/vs/editor/test/common/modes/supports/tokenization.test.ts | 2 +- src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts | 2 +- src/vs/editor/test/common/services/editorSimpleWorker.test.ts | 2 +- src/vs/editor/test/common/services/languageService.test.ts | 2 +- .../editor/test/common/services/languagesAssociations.test.ts | 2 +- src/vs/editor/test/common/services/languagesRegistry.test.ts | 2 +- src/vs/editor/test/common/services/modelService.test.ts | 2 +- src/vs/editor/test/common/services/semanticTokensDto.test.ts | 2 +- .../common/services/semanticTokensProviderStyling.test.ts | 2 +- .../common/services/textResourceConfigurationService.test.ts | 2 +- .../test/common/services/unicodeTextModelHighlighter.test.ts | 2 +- src/vs/editor/test/common/view/overviewZoneManager.test.ts | 2 +- src/vs/editor/test/common/viewLayout/lineDecorations.test.ts | 2 +- src/vs/editor/test/common/viewLayout/linesLayout.test.ts | 2 +- src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts | 2 +- src/vs/editor/test/common/viewModel/glyphLanesModel.test.ts | 2 +- src/vs/editor/test/common/viewModel/lineBreakData.test.ts | 2 +- .../test/common/viewModel/monospaceLineBreaksComputer.test.ts | 2 +- src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts | 2 +- src/vs/editor/test/node/classification/typescript.test.ts | 2 +- .../editor/test/node/diffing/defaultLinesDiffComputer.test.ts | 2 +- src/vs/editor/test/node/diffing/fixtures.test.ts | 2 +- src/vs/platform/actions/test/common/menuService.test.ts | 2 +- .../backup/test/electron-main/backupMainService.test.ts | 2 +- src/vs/platform/checksum/test/node/checksumService.test.ts | 2 +- src/vs/platform/commands/test/common/commands.test.ts | 2 +- .../platform/configuration/test/common/configuration.test.ts | 2 +- .../configuration/test/common/configurationModels.test.ts | 2 +- .../configuration/test/common/configurationRegistry.test.ts | 2 +- .../configuration/test/common/configurationService.test.ts | 2 +- .../platform/configuration/test/common/configurations.test.ts | 2 +- .../configuration/test/common/policyConfiguration.test.ts | 2 +- src/vs/platform/contextkey/test/browser/contextkey.test.ts | 2 +- src/vs/platform/contextkey/test/common/contextkey.test.ts | 2 +- src/vs/platform/contextkey/test/common/parser.test.ts | 2 +- src/vs/platform/contextkey/test/common/scanner.test.ts | 2 +- .../test/electron-main/environmentMainService.test.ts | 2 +- src/vs/platform/environment/test/node/argv.test.ts | 2 +- .../platform/environment/test/node/environmentService.test.ts | 2 +- .../environment/test/node/nativeModules.integrationTest.ts | 4 ++-- src/vs/platform/environment/test/node/userDataPath.test.ts | 2 +- .../extensionManagement/test/common/configRemotes.test.ts | 2 +- .../test/common/extensionGalleryService.test.ts | 2 +- .../test/common/extensionManagement.test.ts | 2 +- .../extensionManagement/test/common/extensionNls.test.ts | 2 +- .../test/common/extensionsProfileScannerService.test.ts | 2 +- .../extensionManagement/test/node/extensionDownloader.test.ts | 2 +- .../test/node/extensionsScannerService.test.ts | 2 +- .../extensions/test/common/extensionValidator.test.ts | 2 +- src/vs/platform/files/test/browser/fileService.test.ts | 2 +- .../test/browser/indexedDBFileService.integrationTest.ts | 2 +- src/vs/platform/files/test/common/files.test.ts | 2 +- src/vs/platform/files/test/common/watcher.test.ts | 2 +- .../files/test/node/diskFileService.integrationTest.ts | 2 +- .../platform/files/test/node/nodejsWatcher.integrationTest.ts | 2 +- .../platform/files/test/node/parcelWatcher.integrationTest.ts | 2 +- src/vs/platform/instantiation/test/common/graph.test.ts | 2 +- .../instantiation/test/common/instantiationService.test.ts | 2 +- .../keybinding/test/common/abstractKeybindingService.test.ts | 2 +- .../platform/keybinding/test/common/keybindingLabels.test.ts | 2 +- .../keybinding/test/common/keybindingResolver.test.ts | 2 +- src/vs/platform/markers/test/common/markerService.test.ts | 2 +- src/vs/platform/opener/test/common/opener.test.ts | 2 +- src/vs/platform/progress/test/common/progress.test.ts | 2 +- src/vs/platform/quickinput/test/browser/quickinput.test.ts | 2 +- src/vs/platform/registry/test/common/platform.test.ts | 2 +- src/vs/platform/remote/test/common/remoteHosts.test.ts | 2 +- .../electron-sandbox/remoteAuthorityResolverService.test.ts | 2 +- src/vs/platform/secrets/test/common/secrets.test.ts | 2 +- src/vs/platform/state/test/node/state.test.ts | 2 +- src/vs/platform/telemetry/test/browser/1dsAppender.test.ts | 2 +- .../platform/telemetry/test/browser/telemetryService.test.ts | 4 ++-- .../telemetry/test/common/telemetryLogAppender.test.ts | 2 +- src/vs/platform/terminal/test/common/terminalRecorder.test.ts | 2 +- src/vs/platform/tunnel/test/common/tunnel.test.ts | 2 +- src/vs/platform/undoRedo/test/common/undoRedoService.test.ts | 2 +- .../uriIdentity/test/common/uriIdentityService.test.ts | 2 +- .../userData/test/browser/fileUserDataProvider.test.ts | 2 +- .../test/common/userDataProfileService.test.ts | 2 +- .../test/common/userDataProfileStorageService.test.ts | 2 +- .../test/electron-main/userDataProfileMainService.test.ts | 2 +- .../platform/userDataSync/test/common/extensionsMerge.test.ts | 2 +- .../userDataSync/test/common/globalStateMerge.test.ts | 2 +- .../platform/userDataSync/test/common/globalStateSync.test.ts | 2 +- .../userDataSync/test/common/keybindingsMerge.test.ts | 2 +- .../platform/userDataSync/test/common/keybindingsSync.test.ts | 2 +- .../platform/userDataSync/test/common/settingsMerge.test.ts | 2 +- src/vs/platform/userDataSync/test/common/settingsSync.test.ts | 2 +- .../platform/userDataSync/test/common/snippetsMerge.test.ts | 2 +- src/vs/platform/userDataSync/test/common/snippetsSync.test.ts | 2 +- src/vs/platform/userDataSync/test/common/synchronizer.test.ts | 2 +- src/vs/platform/userDataSync/test/common/tasksSync.test.ts | 2 +- .../userDataSync/test/common/userDataAutoSyncService.test.ts | 2 +- .../test/common/userDataProfilesManifestMerge.test.ts | 2 +- .../test/common/userDataProfilesManifestSync.test.ts | 2 +- .../userDataSync/test/common/userDataSyncService.test.ts | 2 +- .../userDataSync/test/common/userDataSyncStoreService.test.ts | 2 +- .../platform/windows/test/electron-main/windowsFinder.test.ts | 2 +- .../windows/test/electron-main/windowsStateHandler.test.ts | 2 +- src/vs/platform/workspace/test/common/workspace.test.ts | 2 +- src/vs/platform/workspaces/test/common/workspaces.test.ts | 2 +- .../platform/workspaces/test/electron-main/workspaces.test.ts | 2 +- .../test/electron-main/workspacesHistoryStorage.test.ts | 2 +- .../electron-main/workspacesManagementMainService.test.ts | 2 +- src/vs/server/test/node/serverConnectionToken.test.ts | 2 +- src/vs/workbench/api/test/browser/extHost.api.impl.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostApiCommands.test.ts | 2 +- .../api/test/browser/extHostAuthentication.integrationTest.ts | 2 +- src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostCommands.test.ts | 2 +- .../workbench/api/test/browser/extHostConfiguration.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostDecorations.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts | 2 +- .../api/test/browser/extHostDocumentContentProvider.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostDocumentData.test.ts | 2 +- .../api/test/browser/extHostDocumentSaveParticipant.test.ts | 2 +- .../api/test/browser/extHostDocumentsAndEditors.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts | 2 +- .../api/test/browser/extHostFileSystemEventService.test.ts | 2 +- .../api/test/browser/extHostLanguageFeatures.test.ts | 2 +- .../workbench/api/test/browser/extHostMessagerService.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostNotebook.test.ts | 2 +- .../workbench/api/test/browser/extHostNotebookKernel.test.ts | 3 +-- src/vs/workbench/api/test/browser/extHostTelemetry.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostTesting.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostTextEditor.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostTreeViews.test.ts | 2 +- .../workbench/api/test/browser/extHostTypeConverter.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostTypes.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostWebview.test.ts | 2 +- src/vs/workbench/api/test/browser/extHostWorkspace.test.ts | 2 +- src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts | 2 +- src/vs/workbench/api/test/browser/mainThreadCommands.test.ts | 2 +- .../api/test/browser/mainThreadConfiguration.test.ts | 2 +- .../workbench/api/test/browser/mainThreadDiagnostics.test.ts | 2 +- .../test/browser/mainThreadDocumentContentProviders.test.ts | 2 +- src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts | 2 +- .../api/test/browser/mainThreadDocumentsAndEditors.test.ts | 2 +- src/vs/workbench/api/test/browser/mainThreadEditors.test.ts | 2 +- .../api/test/browser/mainThreadManagedSockets.test.ts | 2 +- src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts | 2 +- src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts | 2 +- .../api/test/common/extHostExtensionActivator.test.ts | 2 +- src/vs/workbench/api/test/common/extensionHostMain.test.ts | 2 +- src/vs/workbench/api/test/node/extHostSearch.test.ts | 2 +- src/vs/workbench/api/test/node/extHostTunnelService.test.ts | 2 +- .../contrib/bulkEdit/test/browser/bulkCellEdits.test.ts | 2 +- .../contrib/bulkEdit/test/browser/bulkEditPreview.test.ts | 2 +- .../workbench/contrib/chat/test/browser/chatVariables.test.ts | 2 +- src/vs/workbench/contrib/chat/test/common/chatAgents.test.ts | 2 +- src/vs/workbench/contrib/chat/test/common/chatModel.test.ts | 2 +- src/vs/workbench/contrib/chat/test/common/chatService.test.ts | 2 +- .../contrib/chat/test/common/chatWordCounter.test.ts | 2 +- .../workbench/contrib/chat/test/common/languageModels.test.ts | 2 +- .../contrib/chat/test/common/voiceChatService.test.ts | 2 +- .../chat/test/electron-sandbox/voiceChatActions.test.ts | 2 +- .../contrib/codeEditor/test/browser/saveParticipant.test.ts | 2 +- .../workbench/contrib/codeEditor/test/node/autoindent.test.ts | 2 +- .../contrib/comments/test/browser/commentsView.test.ts | 2 +- .../contrib/debug/test/browser/baseDebugView.test.ts | 2 +- .../workbench/contrib/debug/test/browser/breakpoints.test.ts | 2 +- src/vs/workbench/contrib/debug/test/browser/callStack.test.ts | 2 +- .../contrib/debug/test/browser/debugANSIHandling.test.ts | 2 +- .../debug/test/browser/debugConfigurationManager.test.ts | 2 +- .../workbench/contrib/debug/test/browser/debugHover.test.ts | 2 +- .../workbench/contrib/debug/test/browser/debugMemory.test.ts | 2 +- .../workbench/contrib/debug/test/browser/debugSession.test.ts | 2 +- .../workbench/contrib/debug/test/browser/debugSource.test.ts | 2 +- .../workbench/contrib/debug/test/browser/debugUtils.test.ts | 2 +- .../contrib/debug/test/browser/debugViewModel.test.ts | 2 +- .../workbench/contrib/debug/test/browser/linkDetector.test.ts | 2 +- .../contrib/debug/test/browser/rawDebugSession.test.ts | 2 +- src/vs/workbench/contrib/debug/test/browser/repl.test.ts | 2 +- src/vs/workbench/contrib/debug/test/browser/watch.test.ts | 2 +- .../contrib/debug/test/common/abstractDebugAdapter.test.ts | 2 +- src/vs/workbench/contrib/debug/test/common/debugModel.test.ts | 2 +- src/vs/workbench/contrib/debug/test/node/debugger.test.ts | 2 +- .../contrib/debug/test/node/streamDebugAdapter.test.ts | 2 +- src/vs/workbench/contrib/debug/test/node/terminals.test.ts | 2 +- .../contrib/editSessions/test/browser/editSessions.test.ts | 2 +- .../workbench/contrib/emmet/test/browser/emmetAction.test.ts | 2 +- .../contrib/extensions/test/common/extensionQuery.test.ts | 2 +- .../extensions/test/electron-sandbox/extension.test.ts | 2 +- .../electron-sandbox/extensionRecommendationsService.test.ts | 2 +- .../test/electron-sandbox/extensionsActions.test.ts | 4 +--- .../extensions/test/electron-sandbox/extensionsViews.test.ts | 3 +-- .../test/electron-sandbox/extensionsWorkbenchService.test.ts | 2 +- .../test/common/externalUriOpenerService.test.ts | 2 +- .../contrib/files/test/browser/editorAutoSave.test.ts | 2 +- .../files/test/browser/explorerFileNestingTrie.test.ts | 2 +- .../contrib/files/test/browser/explorerModel.test.ts | 2 +- .../workbench/contrib/files/test/browser/explorerView.test.ts | 2 +- .../workbench/contrib/files/test/browser/fileActions.test.ts | 2 +- .../contrib/files/test/browser/fileEditorInput.test.ts | 2 +- .../contrib/files/test/browser/fileOnDiskProvider.test.ts | 2 +- .../contrib/files/test/browser/textFileEditorTracker.test.ts | 2 +- .../inlineChat/test/browser/inlineChatController.test.ts | 2 +- .../contrib/inlineChat/test/browser/inlineChatSession.test.ts | 2 +- .../inlineChat/test/browser/inlineChatStrategies.test.ts | 2 +- .../workbench/contrib/issue/issue/testReporterModel.test.ts | 2 +- .../markdown/test/browser/markdownSettingRenderer.test.ts | 2 +- .../contrib/markers/test/browser/markersModel.test.ts | 2 +- .../contrib/mergeEditor/test/browser/mapping.test.ts | 2 +- .../workbench/contrib/mergeEditor/test/browser/model.test.ts | 2 +- .../contrib/notebook/test/browser/cellDecorations.test.ts | 2 +- .../workbench/contrib/notebook/test/browser/cellDnd.test.ts | 2 +- .../contrib/notebook/test/browser/cellOperations.test.ts | 2 +- .../contrib/contributedStatusBarItemController.test.ts | 2 +- .../test/browser/contrib/executionStatusBarItem.test.ts | 2 +- .../contrib/notebook/test/browser/contrib/find.test.ts | 2 +- .../notebook/test/browser/contrib/layoutActions.test.ts | 2 +- .../test/browser/contrib/notebookCellDiagnostics.test.ts | 2 +- .../notebook/test/browser/contrib/notebookClipboard.test.ts | 2 +- .../notebook/test/browser/contrib/notebookOutline.test.ts | 2 +- .../test/browser/contrib/notebookOutlineViewProviders.test.ts | 2 +- .../notebook/test/browser/contrib/notebookSymbols.test.ts | 2 +- .../notebook/test/browser/contrib/notebookUndoRedo.test.ts | 2 +- .../notebook/test/browser/contrib/outputCopyTests.test.ts | 2 +- .../contrib/notebook/test/browser/notebookBrowser.test.ts | 2 +- .../contrib/notebook/test/browser/notebookCellAnchor.test.ts | 2 +- .../contrib/notebook/test/browser/notebookCellList.test.ts | 2 +- .../contrib/notebook/test/browser/notebookCommon.test.ts | 2 +- .../contrib/notebook/test/browser/notebookDiff.test.ts | 2 +- .../contrib/notebook/test/browser/notebookEditor.test.ts | 2 +- .../contrib/notebook/test/browser/notebookEditorModel.test.ts | 2 +- .../notebook/test/browser/notebookExecutionService.test.ts | 2 +- .../test/browser/notebookExecutionStateService.test.ts | 2 +- .../contrib/notebook/test/browser/notebookFolding.test.ts | 2 +- .../notebook/test/browser/notebookKernelHistory.test.ts | 4 ++-- .../notebook/test/browser/notebookKernelService.test.ts | 4 ++-- .../test/browser/notebookRendererMessagingService.test.ts | 2 +- .../contrib/notebook/test/browser/notebookSelection.test.ts | 2 +- .../contrib/notebook/test/browser/notebookServiceImpl.test.ts | 2 +- .../notebook/test/browser/notebookStickyScroll.test.ts | 2 +- .../contrib/notebook/test/browser/notebookTextModel.test.ts | 2 +- .../notebook/test/browser/notebookVariablesDataSource.test.ts | 2 +- .../contrib/notebook/test/browser/notebookViewModel.test.ts | 2 +- .../contrib/notebook/test/browser/notebookViewZones.test.ts | 2 +- .../notebook/test/browser/notebookWorkbenchToolbar.test.ts | 2 +- .../contrib/output/test/browser/outputLinkProvider.test.ts | 2 +- .../test/browser/keybindingsEditorContribution.test.ts | 2 +- .../preferences/test/browser/settingsTreeModels.test.ts | 2 +- .../preferences/test/common/smartSnippetInserter.test.ts | 2 +- .../contrib/search/test/browser/searchActions.test.ts | 2 +- .../workbench/contrib/search/test/browser/searchModel.test.ts | 3 +-- .../contrib/search/test/browser/searchNotebookHelpers.test.ts | 2 +- .../contrib/search/test/browser/searchResult.test.ts | 2 +- .../contrib/search/test/browser/searchViewlet.test.ts | 2 +- .../workbench/contrib/search/test/common/cacheState.test.ts | 2 +- .../workbench/contrib/search/test/common/extractRange.test.ts | 3 +-- .../contrib/snippets/test/browser/snippetFile.test.ts | 2 +- .../contrib/snippets/test/browser/snippetsRegistry.test.ts | 2 +- .../contrib/snippets/test/browser/snippetsRewrite.test.ts | 2 +- .../contrib/snippets/test/browser/snippetsService.test.ts | 2 +- .../contrib/speech/test/common/speechService.test.ts | 2 +- src/vs/workbench/contrib/tags/test/node/workspaceTags.test.ts | 2 +- .../contrib/tasks/test/common/problemMatcher.test.ts | 2 +- .../contrib/tasks/test/common/taskConfiguration.test.ts | 2 +- .../terminal/test/common/terminalColorRegistry.test.ts | 2 +- .../terminal/test/common/terminalDataBuffering.test.ts | 2 +- .../accessibility/test/browser/bufferContentTracker.test.ts | 2 +- .../links/test/browser/terminalLinkHelpers.test.ts | 2 +- .../typeAhead/test/browser/terminalTypeAhead.test.ts | 2 +- .../test/browser/explorerProjections/nameProjection.test.ts | 3 +-- .../test/browser/explorerProjections/treeProjection.test.ts | 3 +-- .../contrib/testing/test/common/testCoverage.test.ts | 2 +- .../testing/test/common/testExplorerFilterState.test.ts | 2 +- .../contrib/testing/test/common/testProfileService.test.ts | 2 +- .../contrib/testing/test/common/testResultService.test.ts | 2 +- .../contrib/testing/test/common/testResultStorage.test.ts | 2 +- .../workbench/contrib/testing/test/common/testingUri.test.ts | 2 +- .../contrib/themes/test/node/colorRegistry.releaseTest.ts | 2 +- .../workbench/contrib/url/test/browser/trustedDomains.test.ts | 2 +- .../test/browser/gettingStartedMarkdownRenderer.test.ts | 2 +- .../test/common/aiRelatedInformationService.test.ts | 2 +- .../authentication/test/browser/authenticationService.test.ts | 2 +- .../services/commands/test/common/commandService.test.ts | 2 +- .../services/configuration/test/browser/configuration.test.ts | 2 +- .../configuration/test/browser/configurationEditing.test.ts | 2 +- .../configuration/test/browser/configurationService.test.ts | 2 +- .../configuration/test/common/configurationModels.test.ts | 2 +- .../electron-sandbox/configurationResolverService.test.ts | 2 +- .../decorations/test/browser/decorationsService.test.ts | 2 +- .../dialogs/test/electron-sandbox/fileDialogService.test.ts | 2 +- .../services/editor/test/browser/editorGroupsService.test.ts | 2 +- .../editor/test/browser/editorResolverService.test.ts | 2 +- .../services/editor/test/browser/editorService.test.ts | 2 +- .../services/editor/test/browser/editorsObserver.test.ts | 2 +- .../test/browser/extensionEnablementService.test.ts | 2 +- .../services/extensions/test/browser/extensionService.test.ts | 2 +- .../extensions/test/browser/extensionStorageMigration.test.ts | 2 +- .../test/common/extensionDescriptionRegistry.test.ts | 2 +- .../test/common/extensionManifestPropertiesService.test.ts | 2 +- .../services/extensions/test/common/rpcProtocol.test.ts | 2 +- .../services/history/test/browser/historyService.test.ts | 2 +- .../keybinding/test/browser/browserKeyboardMapper.test.ts | 2 +- .../keybinding/test/browser/keybindingEditing.test.ts | 2 +- .../services/keybinding/test/browser/keybindingIO.test.ts | 2 +- .../services/keybinding/test/node/keyboardMapperTestUtils.ts | 2 +- .../keybinding/test/node/macLinuxKeyboardMapper.test.ts | 2 +- src/vs/workbench/services/label/test/browser/label.test.ts | 2 +- .../lifecycle/test/electron-sandbox/lifecycleService.test.ts | 2 +- .../preferences/test/browser/keybindingsEditorModel.test.ts | 2 +- .../preferences/test/browser/preferencesService.test.ts | 2 +- .../preferences/test/common/preferencesValidation.test.ts | 2 +- .../services/progress/test/browser/progressIndicator.test.ts | 2 +- .../services/search/test/browser/queryBuilder.test.ts | 2 +- .../workbench/services/search/test/common/ignoreFile.test.ts | 2 +- .../services/search/test/common/queryBuilder.test.ts | 2 +- src/vs/workbench/services/search/test/common/replace.test.ts | 2 +- src/vs/workbench/services/search/test/common/search.test.ts | 2 +- .../services/search/test/common/searchHelpers.test.ts | 2 +- .../services/search/test/node/fileSearch.integrationTest.ts | 2 +- .../search/test/node/rawSearchService.integrationTest.ts | 2 +- .../services/search/test/node/ripgrepFileSearch.test.ts | 2 +- .../search/test/node/ripgrepTextSearchEngineUtils.test.ts | 2 +- .../services/search/test/node/search.integrationTest.ts | 2 +- .../services/search/test/node/textSearch.integrationTest.ts | 2 +- .../services/search/test/node/textSearchManager.test.ts | 2 +- .../services/telemetry/test/browser/commonProperties.test.ts | 2 +- .../services/telemetry/test/node/commonProperties.test.ts | 2 +- .../services/textMate/test/browser/arrayOperation.test.ts | 2 +- .../services/textfile/test/browser/textEditorService.test.ts | 2 +- .../test/browser/textFileEditorModel.integrationTest.ts | 2 +- .../textfile/test/browser/textFileEditorModel.test.ts | 2 +- .../textfile/test/browser/textFileEditorModelManager.test.ts | 2 +- .../services/textfile/test/browser/textFileService.test.ts | 2 +- .../services/textfile/test/common/textFileService.io.test.ts | 2 +- .../test/electron-sandbox/nativeTextFileService.test.ts | 2 +- .../textfile/test/node/encoding/encoding.integrationTest.ts | 2 +- .../services/textfile/test/node/encoding/encoding.test.ts | 2 +- .../test/browser/textModelResolverService.test.ts | 2 +- .../services/themes/test/node/tokenStyleResolving.test.ts | 2 +- .../test/browser/untitledTextEditor.integrationTest.ts | 2 +- .../services/untitled/test/browser/untitledTextEditor.test.ts | 2 +- .../userActivity/test/browser/domActivityTracker.test.ts | 2 +- .../services/views/test/browser/viewContainerModel.test.ts | 2 +- .../services/views/test/browser/viewDescriptorService.test.ts | 2 +- .../workingCopy/test/browser/fileWorkingCopyManager.test.ts | 2 +- .../workingCopy/test/browser/resourceWorkingCopy.test.ts | 2 +- .../workingCopy/test/browser/storedFileWorkingCopy.test.ts | 2 +- .../test/browser/storedFileWorkingCopyManager.test.ts | 2 +- .../workingCopy/test/browser/untitledFileWorkingCopy.test.ts | 2 +- .../test/browser/untitledFileWorkingCopyManager.test.ts | 2 +- .../test/browser/untitledScratchpadWorkingCopy.test.ts | 2 +- .../workingCopy/test/browser/workingCopyBackupTracker.test.ts | 2 +- .../workingCopy/test/browser/workingCopyEditorService.test.ts | 2 +- .../workingCopy/test/browser/workingCopyFileService.test.ts | 2 +- .../workingCopy/test/common/workingCopyService.test.ts | 2 +- .../test/electron-sandbox/workingCopyBackupService.test.ts | 2 +- .../test/electron-sandbox/workingCopyBackupTracker.test.ts | 2 +- .../test/electron-sandbox/workingCopyHistoryService.test.ts | 2 +- .../test/electron-sandbox/workingCopyHistoryTracker.test.ts | 2 +- .../services/workspaces/test/browser/workspaces.test.ts | 2 +- .../services/workspaces/test/common/workspaceTrust.test.ts | 2 +- src/vs/workbench/test/browser/codeeditor.test.ts | 2 +- src/vs/workbench/test/browser/contributions.test.ts | 2 +- src/vs/workbench/test/browser/part.test.ts | 2 +- .../test/browser/parts/editor/breadcrumbModel.test.ts | 2 +- .../test/browser/parts/editor/diffEditorInput.test.ts | 2 +- src/vs/workbench/test/browser/parts/editor/editor.test.ts | 2 +- .../test/browser/parts/editor/editorDiffModel.test.ts | 2 +- .../test/browser/parts/editor/editorGroupModel.test.ts | 2 +- .../workbench/test/browser/parts/editor/editorInput.test.ts | 2 +- .../workbench/test/browser/parts/editor/editorModel.test.ts | 2 +- src/vs/workbench/test/browser/parts/editor/editorPane.test.ts | 2 +- .../browser/parts/editor/filteredEditorGroupModel.test.ts | 2 +- .../test/browser/parts/editor/resourceEditorInput.test.ts | 2 +- .../test/browser/parts/editor/sideBySideEditorInput.test.ts | 2 +- .../test/browser/parts/editor/textEditorPane.test.ts | 2 +- .../test/browser/parts/editor/textResourceEditorInput.test.ts | 2 +- .../test/browser/parts/statusbar/statusbarModel.test.ts | 2 +- src/vs/workbench/test/browser/quickAccess.test.ts | 2 +- src/vs/workbench/test/browser/viewlet.test.ts | 2 +- src/vs/workbench/test/browser/webview.test.ts | 2 +- src/vs/workbench/test/browser/window.test.ts | 2 +- src/vs/workbench/test/common/memento.test.ts | 2 +- src/vs/workbench/test/common/notifications.test.ts | 2 +- src/vs/workbench/test/common/resources.test.ts | 2 +- src/vs/workbench/test/common/utils.ts | 2 +- .../workbench/test/electron-sandbox/resolveExternal.test.ts | 2 +- 598 files changed, 602 insertions(+), 613 deletions(-) diff --git a/src/vs/base/parts/ipc/test/browser/ipc.mp.test.ts b/src/vs/base/parts/ipc/test/browser/ipc.mp.test.ts index 00813be686f98..c49d9bf8855d0 100644 --- a/src/vs/base/parts/ipc/test/browser/ipc.mp.test.ts +++ b/src/vs/base/parts/ipc/test/browser/ipc.mp.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { Client as MessagePortClient } from 'vs/base/parts/ipc/browser/ipc.mp'; diff --git a/src/vs/base/parts/ipc/test/common/ipc.test.ts b/src/vs/base/parts/ipc/test/common/ipc.test.ts index 0515d24a49c7a..b9fc881a22200 100644 --- a/src/vs/base/parts/ipc/test/common/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/common/ipc.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/base/parts/ipc/test/electron-sandbox/ipc.mp.test.ts b/src/vs/base/parts/ipc/test/electron-sandbox/ipc.mp.test.ts index 44559562cea85..4bb851ebffe1c 100644 --- a/src/vs/base/parts/ipc/test/electron-sandbox/ipc.mp.test.ts +++ b/src/vs/base/parts/ipc/test/electron-sandbox/ipc.mp.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Client as MessagePortClient } from 'vs/base/parts/ipc/browser/ipc.mp'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts b/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts index d761f720de73b..9caacd5b5373e 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; diff --git a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts index 0e018300cea33..7186ee6b0b958 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EventEmitter } from 'events'; import { AddressInfo, connect, createServer, Server, Socket } from 'net'; import { tmpdir } from 'os'; diff --git a/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts b/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts index 837d80457d6ee..7724c4ed46553 100644 --- a/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts +++ b/src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { context, ipcRenderer, process, webFrame, webUtils } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/actionbar.test.ts b/src/vs/base/test/browser/actionbar.test.ts index fc119f36de958..5d197e8181b7d 100644 --- a/src/vs/base/test/browser/actionbar.test.ts +++ b/src/vs/base/test/browser/actionbar.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ActionBar, prepareActions } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action, Separator } from 'vs/base/common/actions'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/browser.test.ts b/src/vs/base/test/browser/browser.test.ts index 115112ff753f9..76049fb57213c 100644 --- a/src/vs/base/test/browser/browser.test.ts +++ b/src/vs/base/test/browser/browser.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isMacintosh, isWindows } from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/comparers.test.ts b/src/vs/base/test/browser/comparers.test.ts index 8848b04a6e87b..690e3eb47822f 100644 --- a/src/vs/base/test/browser/comparers.test.ts +++ b/src/vs/base/test/browser/comparers.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { compareFileExtensions, compareFileExtensionsDefault, compareFileExtensionsLower, compareFileExtensionsUnicode, compareFileExtensionsUpper, compareFileNames, compareFileNamesDefault, compareFileNamesLower, compareFileNamesUnicode, compareFileNamesUpper } from 'vs/base/common/comparers'; diff --git a/src/vs/base/test/browser/dom.test.ts b/src/vs/base/test/browser/dom.test.ts index 03d618b1f0ce9..98ad9441a92a3 100644 --- a/src/vs/base/test/browser/dom.test.ts +++ b/src/vs/base/test/browser/dom.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { $, asCssValueWithDefault, h, multibyteAwareBtoa, trackAttributes, copyAttributes, disposableWindowInterval, getWindows, getWindowsCount, getWindowId, getWindowById, hasWindow, getWindow, getDocument, isHTMLElement } from 'vs/base/browser/dom'; import { ensureCodeWindow, isAuxiliaryWindow, mainWindow } from 'vs/base/browser/window'; import { DeferredPromise, timeout } from 'vs/base/common/async'; diff --git a/src/vs/base/test/browser/formattedTextRenderer.test.ts b/src/vs/base/test/browser/formattedTextRenderer.test.ts index 12acef6e7b808..d4ba452786d33 100644 --- a/src/vs/base/test/browser/formattedTextRenderer.test.ts +++ b/src/vs/base/test/browser/formattedTextRenderer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { renderFormattedText, renderText } from 'vs/base/browser/formattedTextRenderer'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/hash.test.ts b/src/vs/base/test/browser/hash.test.ts index e613a1913f18b..d7f319bbe1594 100644 --- a/src/vs/base/test/browser/hash.test.ts +++ b/src/vs/base/test/browser/hash.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { sha1Hex } from 'vs/base/browser/hash'; import { hash, StringSHA1 } from 'vs/base/common/hash'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/highlightedLabel.test.ts b/src/vs/base/test/browser/highlightedLabel.test.ts index fe2ceb43d61ff..c18b20370629b 100644 --- a/src/vs/base/test/browser/highlightedLabel.test.ts +++ b/src/vs/base/test/browser/highlightedLabel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/iconLabels.test.ts b/src/vs/base/test/browser/iconLabels.test.ts index 3972977f65f4d..2a10f47241bec 100644 --- a/src/vs/base/test/browser/iconLabels.test.ts +++ b/src/vs/base/test/browser/iconLabels.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isHTMLElement } from 'vs/base/browser/dom'; import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/indexedDB.test.ts b/src/vs/base/test/browser/indexedDB.test.ts index a6266231292f8..8b1271562fdba 100644 --- a/src/vs/base/test/browser/indexedDB.test.ts +++ b/src/vs/base/test/browser/indexedDB.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IndexedDB } from 'vs/base/browser/indexedDB'; import { flakySuite } from 'vs/base/test/common/testUtils'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/markdownRenderer.test.ts b/src/vs/base/test/browser/markdownRenderer.test.ts index f9099c653e9e2..81abf8c9c9ecb 100644 --- a/src/vs/base/test/browser/markdownRenderer.test.ts +++ b/src/vs/base/test/browser/markdownRenderer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { fillInIncompleteTokens, renderMarkdown, renderMarkdownAsPlaintext } from 'vs/base/browser/markdownRenderer'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { marked } from 'vs/base/common/marked/marked'; diff --git a/src/vs/base/test/browser/progressBar.test.ts b/src/vs/base/test/browser/progressBar.test.ts index 9620ae31948cb..1cb98577b2a43 100644 --- a/src/vs/base/test/browser/progressBar.test.ts +++ b/src/vs/base/test/browser/progressBar.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { mainWindow } from 'vs/base/browser/window'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/ui/contextview/contextview.test.ts b/src/vs/base/test/browser/ui/contextview/contextview.test.ts index c302c35893750..45fded13807f0 100644 --- a/src/vs/base/test/browser/ui/contextview/contextview.test.ts +++ b/src/vs/base/test/browser/ui/contextview/contextview.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { layout, LayoutAnchorPosition } from 'vs/base/browser/ui/contextview/contextview'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/ui/grid/grid.test.ts b/src/vs/base/test/browser/ui/grid/grid.test.ts index 781a0a407f080..92296d1880b04 100644 --- a/src/vs/base/test/browser/ui/grid/grid.test.ts +++ b/src/vs/base/test/browser/ui/grid/grid.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { createSerializedGrid, Direction, getRelativeLocation, Grid, GridNode, GridNodeDescriptor, ISerializableView, isGridBranchNode, IViewDeserializer, Orientation, sanitizeGridNodeDescriptor, SerializableGrid, Sizing } from 'vs/base/browser/ui/grid/grid'; import { Event } from 'vs/base/common/event'; import { deepClone } from 'vs/base/common/objects'; diff --git a/src/vs/base/test/browser/ui/grid/gridview.test.ts b/src/vs/base/test/browser/ui/grid/gridview.test.ts index bbc7de0716f57..df0c3838e6bc2 100644 --- a/src/vs/base/test/browser/ui/grid/gridview.test.ts +++ b/src/vs/base/test/browser/ui/grid/gridview.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { $ } from 'vs/base/browser/dom'; import { GridView, IView, Orientation, Sizing } from 'vs/base/browser/ui/grid/gridview'; import { nodesToArrays, TestView } from 'vs/base/test/browser/ui/grid/util'; diff --git a/src/vs/base/test/browser/ui/grid/util.ts b/src/vs/base/test/browser/ui/grid/util.ts index 9ebe81b3c569f..ccadd7866e6fb 100644 --- a/src/vs/base/test/browser/ui/grid/util.ts +++ b/src/vs/base/test/browser/ui/grid/util.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IView } from 'vs/base/browser/ui/grid/grid'; import { GridNode, isGridBranchNode } from 'vs/base/browser/ui/grid/gridview'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/base/test/browser/ui/list/listView.test.ts b/src/vs/base/test/browser/ui/list/listView.test.ts index 7dcab8e7d25af..0a6dede20cc2c 100644 --- a/src/vs/base/test/browser/ui/list/listView.test.ts +++ b/src/vs/base/test/browser/ui/list/listView.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ListView } from 'vs/base/browser/ui/list/listView'; import { range } from 'vs/base/common/arrays'; diff --git a/src/vs/base/test/browser/ui/list/listWidget.test.ts b/src/vs/base/test/browser/ui/list/listWidget.test.ts index 28fd952434129..6d1263dd89ce8 100644 --- a/src/vs/base/test/browser/ui/list/listWidget.test.ts +++ b/src/vs/base/test/browser/ui/list/listWidget.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { range } from 'vs/base/common/arrays'; diff --git a/src/vs/base/test/browser/ui/list/rangeMap.test.ts b/src/vs/base/test/browser/ui/list/rangeMap.test.ts index 5b3b4a6c65fe8..0a4625c76b861 100644 --- a/src/vs/base/test/browser/ui/list/rangeMap.test.ts +++ b/src/vs/base/test/browser/ui/list/rangeMap.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { consolidate, groupIntersect, RangeMap } from 'vs/base/browser/ui/list/rangeMap'; import { Range } from 'vs/base/common/range'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/ui/menu/menubar.test.ts b/src/vs/base/test/browser/ui/menu/menubar.test.ts index 49420cc040499..af5e1da2e91dd 100644 --- a/src/vs/base/test/browser/ui/menu/menubar.test.ts +++ b/src/vs/base/test/browser/ui/menu/menubar.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { $ } from 'vs/base/browser/dom'; import { unthemedMenuStyles } from 'vs/base/browser/ui/menu/menu'; import { MenuBar } from 'vs/base/browser/ui/menu/menubar'; diff --git a/src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts b/src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts index 30879e441db06..cc662ab282f80 100644 --- a/src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts +++ b/src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts b/src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts index 0a4a2dd00db52..39876bc5d9182 100644 --- a/src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts +++ b/src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ScrollbarState } from 'vs/base/browser/ui/scrollbar/scrollbarState'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/browser/ui/splitview/splitview.test.ts b/src/vs/base/test/browser/ui/splitview/splitview.test.ts index 48ee43fe1b39a..7e20426f5a86f 100644 --- a/src/vs/base/test/browser/ui/splitview/splitview.test.ts +++ b/src/vs/base/test/browser/ui/splitview/splitview.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Sash, SashState } from 'vs/base/browser/ui/sash/sash'; import { IView, LayoutPriority, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts index c92a6273336c1..78b94a9577cd4 100644 --- a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { AsyncDataTree, CompressibleAsyncDataTree, ITreeCompressionDelegate } from 'vs/base/browser/ui/tree/asyncDataTree'; import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; diff --git a/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts index 79de7324a24df..9c5777b5fc53b 100644 --- a/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { compress, CompressedObjectTreeModel, decompress, ICompressedTreeElement, ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; import { IObjectTreeModelSetChildrenOptions } from 'vs/base/browser/ui/tree/objectTreeModel'; diff --git a/src/vs/base/test/browser/ui/tree/dataTree.test.ts b/src/vs/base/test/browser/ui/tree/dataTree.test.ts index fb821d3b662e8..37c586f00e0de 100644 --- a/src/vs/base/test/browser/ui/tree/dataTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/dataTree.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { DataTree } from 'vs/base/browser/ui/tree/dataTree'; import { IDataSource, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; diff --git a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts index 5657e458849bc..70277e01c8768 100644 --- a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IIndexTreeModelSpliceOptions, IIndexTreeNode, IList, IndexTreeModel } from 'vs/base/browser/ui/tree/indexTreeModel'; import { ITreeElement, ITreeFilter, ITreeNode, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; import { timeout } from 'vs/base/common/async'; diff --git a/src/vs/base/test/browser/ui/tree/objectTree.test.ts b/src/vs/base/test/browser/ui/tree/objectTree.test.ts index 05594bf561ae3..eaed09db6945d 100644 --- a/src/vs/base/test/browser/ui/tree/objectTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTree.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { CompressibleObjectTree, ICompressibleTreeRenderer, ObjectTree } from 'vs/base/browser/ui/tree/objectTree'; diff --git a/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts index 4c895d941309e..ffef4afb72b55 100644 --- a/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IList } from 'vs/base/browser/ui/tree/indexTreeModel'; import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; import { ITreeFilter, ITreeNode, ObjectTreeElementCollapseState, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; diff --git a/src/vs/base/test/common/arrays.test.ts b/src/vs/base/test/common/arrays.test.ts index 25a2620a86a16..617a766c96581 100644 --- a/src/vs/base/test/common/arrays.test.ts +++ b/src/vs/base/test/common/arrays.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as arrays from 'vs/base/common/arrays'; import * as arraysFind from 'vs/base/common/arraysFind'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/arraysFind.test.ts b/src/vs/base/test/common/arraysFind.test.ts index d932b68cbba40..caeea0fed224f 100644 --- a/src/vs/base/test/common/arraysFind.test.ts +++ b/src/vs/base/test/common/arraysFind.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MonotonousArray, findFirstMonotonous, findLastMonotonous } from 'vs/base/common/arraysFind'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/assert.test.ts b/src/vs/base/test/common/assert.test.ts index ed4e60e822266..f0052bade9738 100644 --- a/src/vs/base/test/common/assert.test.ts +++ b/src/vs/base/test/common/assert.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ok } from 'vs/base/common/assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/async.test.ts b/src/vs/base/test/common/async.test.ts index da309f944bfd8..e55200ff19266 100644 --- a/src/vs/base/test/common/async.test.ts +++ b/src/vs/base/test/common/async.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as async from 'vs/base/common/async'; import * as MicrotaskDelay from "vs/base/common/symbols"; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/base/test/common/buffer.test.ts b/src/vs/base/test/common/buffer.test.ts index 6c869a16b3faa..e94fd8755a053 100644 --- a/src/vs/base/test/common/buffer.test.ts +++ b/src/vs/base/test/common/buffer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { bufferedStreamToBuffer, bufferToReadable, bufferToStream, decodeBase64, encodeBase64, newWriteableBufferStream, readableToBuffer, streamToBuffer, VSBuffer } from 'vs/base/common/buffer'; import { peekStream } from 'vs/base/common/stream'; diff --git a/src/vs/base/test/common/cache.test.ts b/src/vs/base/test/common/cache.test.ts index b1946ed354ad5..ed4ca02f93bad 100644 --- a/src/vs/base/test/common/cache.test.ts +++ b/src/vs/base/test/common/cache.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { Cache } from 'vs/base/common/cache'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/cancellation.test.ts b/src/vs/base/test/common/cancellation.test.ts index 2e184c42267b5..178f77cde1e16 100644 --- a/src/vs/base/test/common/cancellation.test.ts +++ b/src/vs/base/test/common/cancellation.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/charCode.test.ts b/src/vs/base/test/common/charCode.test.ts index 49be69d857835..59c4e3fbcc94c 100644 --- a/src/vs/base/test/common/charCode.test.ts +++ b/src/vs/base/test/common/charCode.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CharCode } from 'vs/base/common/charCode'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/collections.test.ts b/src/vs/base/test/common/collections.test.ts index c2616cc377ebb..ae9ead05c412f 100644 --- a/src/vs/base/test/common/collections.test.ts +++ b/src/vs/base/test/common/collections.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as collections from 'vs/base/common/collections'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/color.test.ts b/src/vs/base/test/common/color.test.ts index 857c394d322d9..256397a713e9e 100644 --- a/src/vs/base/test/common/color.test.ts +++ b/src/vs/base/test/common/color.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Color, HSLA, HSVA, RGBA } from 'vs/base/common/color'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/console.test.ts b/src/vs/base/test/common/console.test.ts index 86842d1dcd1a0..457255eb6275d 100644 --- a/src/vs/base/test/common/console.test.ts +++ b/src/vs/base/test/common/console.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { getFirstFrame } from 'vs/base/common/console'; import { normalize } from 'vs/base/common/path'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/decorators.test.ts b/src/vs/base/test/common/decorators.test.ts index 92bce8c605b0c..33d78329dd5b1 100644 --- a/src/vs/base/test/common/decorators.test.ts +++ b/src/vs/base/test/common/decorators.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { memoize, throttle } from 'vs/base/common/decorators'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/diff/diff.test.ts b/src/vs/base/test/common/diff/diff.test.ts index 353b68ebd7e6c..eeee6328c835c 100644 --- a/src/vs/base/test/common/diff/diff.test.ts +++ b/src/vs/base/test/common/diff/diff.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDiffChange, LcsDiff, StringDiffSequence } from 'vs/base/common/diff/diff'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/errors.test.ts b/src/vs/base/test/common/errors.test.ts index 96210c5531462..3ebfaffe4de47 100644 --- a/src/vs/base/test/common/errors.test.ts +++ b/src/vs/base/test/common/errors.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/event.test.ts b/src/vs/base/test/common/event.test.ts index 161c7085fa6ae..3c65d9e77e9f5 100644 --- a/src/vs/base/test/common/event.test.ts +++ b/src/vs/base/test/common/event.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { stub } from 'sinon'; import { tail2 } from 'vs/base/common/arrays'; import { DeferredPromise, timeout } from 'vs/base/common/async'; diff --git a/src/vs/base/test/common/extpath.test.ts b/src/vs/base/test/common/extpath.test.ts index c13210daa13cd..45e411a7e1c98 100644 --- a/src/vs/base/test/common/extpath.test.ts +++ b/src/vs/base/test/common/extpath.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CharCode } from 'vs/base/common/charCode'; import * as extpath from 'vs/base/common/extpath'; import { isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 5bfe3856226f5..5da3552ec5647 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { anyScore, createMatches, fuzzyScore, fuzzyScoreGraceful, fuzzyScoreGracefulAggressive, FuzzyScorer, IFilter, IMatch, matchesCamelCase, matchesContiguousSubString, matchesPrefix, matchesStrictPrefix, matchesSubString, matchesWords, or } from 'vs/base/common/filters'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/fuzzyScorer.test.ts b/src/vs/base/test/common/fuzzyScorer.test.ts index 747e2ee18414f..4e41662631dbc 100644 --- a/src/vs/base/test/common/fuzzyScorer.test.ts +++ b/src/vs/base/test/common/fuzzyScorer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { compareItemsByFuzzyScore, FuzzyScore, FuzzyScore2, FuzzyScorerCache, IItemAccessor, IItemScore, pieceToQuery, prepareQuery, scoreFuzzy, scoreFuzzy2, scoreItemFuzzy } from 'vs/base/common/fuzzyScorer'; import { Schemas } from 'vs/base/common/network'; import { basename, dirname, posix, sep, win32 } from 'vs/base/common/path'; diff --git a/src/vs/base/test/common/glob.test.ts b/src/vs/base/test/common/glob.test.ts index 5bfb3dccfb3f4..2e721bd30028e 100644 --- a/src/vs/base/test/common/glob.test.ts +++ b/src/vs/base/test/common/glob.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as glob from 'vs/base/common/glob'; import { sep } from 'vs/base/common/path'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/base/test/common/history.test.ts b/src/vs/base/test/common/history.test.ts index 39143609b8801..07443052e78f7 100644 --- a/src/vs/base/test/common/history.test.ts +++ b/src/vs/base/test/common/history.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { HistoryNavigator, HistoryNavigator2 } from 'vs/base/common/history'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/iconLabels.test.ts b/src/vs/base/test/common/iconLabels.test.ts index 4f2cd802c64ac..4ce6b493afa8c 100644 --- a/src/vs/base/test/common/iconLabels.test.ts +++ b/src/vs/base/test/common/iconLabels.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IMatch } from 'vs/base/common/filters'; import { escapeIcons, getCodiconAriaLabel, IParsedLabelWithIcons, markdownEscapeEscapedIcons, matchesFuzzyIconAware, parseLabelWithIcons, stripIcons } from 'vs/base/common/iconLabels'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/iterator.test.ts b/src/vs/base/test/common/iterator.test.ts index ce69814ad4376..0d95a4afc24d5 100644 --- a/src/vs/base/test/common/iterator.test.ts +++ b/src/vs/base/test/common/iterator.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Iterable } from 'vs/base/common/iterator'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/json.test.ts b/src/vs/base/test/common/json.test.ts index 4ad121151b484..c8a6202bf06fb 100644 --- a/src/vs/base/test/common/json.test.ts +++ b/src/vs/base/test/common/json.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { createScanner, Node, parse, ParseError, ParseErrorCode, ParseOptions, parseTree, ScanError, SyntaxKind } from 'vs/base/common/json'; import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/jsonEdit.test.ts b/src/vs/base/test/common/jsonEdit.test.ts index fa5d41b481ace..060884ae9ffab 100644 --- a/src/vs/base/test/common/jsonEdit.test.ts +++ b/src/vs/base/test/common/jsonEdit.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { removeProperty, setProperty } from 'vs/base/common/jsonEdit'; import { Edit, FormattingOptions } from 'vs/base/common/jsonFormatter'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/jsonFormatter.test.ts b/src/vs/base/test/common/jsonFormatter.test.ts index 636d987c54a5c..80d8a22fd3593 100644 --- a/src/vs/base/test/common/jsonFormatter.test.ts +++ b/src/vs/base/test/common/jsonFormatter.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as Formatter from 'vs/base/common/jsonFormatter'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/keyCodes.test.ts b/src/vs/base/test/common/keyCodes.test.ts index e3c73412eab7b..ea539be7c627a 100644 --- a/src/vs/base/test/common/keyCodes.test.ts +++ b/src/vs/base/test/common/keyCodes.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EVENT_KEY_CODE_MAP, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, KeyChord, KeyCode, KeyCodeUtils, KeyMod, NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE, ScanCode, ScanCodeUtils } from 'vs/base/common/keyCodes'; import { decodeKeybinding, KeyCodeChord, Keybinding } from 'vs/base/common/keybindings'; import { OperatingSystem } from 'vs/base/common/platform'; diff --git a/src/vs/base/test/common/keybindings.test.ts b/src/vs/base/test/common/keybindings.test.ts index ab26cf2486472..5959f510cda5b 100644 --- a/src/vs/base/test/common/keybindings.test.ts +++ b/src/vs/base/test/common/keybindings.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyCode, ScanCode } from 'vs/base/common/keyCodes'; import { KeyCodeChord, ScanCodeChord } from 'vs/base/common/keybindings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/labels.test.ts b/src/vs/base/test/common/labels.test.ts index 6c9d3eb0f11ad..b74f0238c16dc 100644 --- a/src/vs/base/test/common/labels.test.ts +++ b/src/vs/base/test/common/labels.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as labels from 'vs/base/common/labels'; import { isMacintosh, isWindows, OperatingSystem } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/base/test/common/lazy.test.ts b/src/vs/base/test/common/lazy.test.ts index 361e3305d4322..220d0da6d10ab 100644 --- a/src/vs/base/test/common/lazy.test.ts +++ b/src/vs/base/test/common/lazy.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Lazy } from 'vs/base/common/lazy'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/lifecycle.test.ts b/src/vs/base/test/common/lifecycle.test.ts index 103009b521937..23080bc8a1217 100644 --- a/src/vs/base/test/common/lifecycle.test.ts +++ b/src/vs/base/test/common/lifecycle.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter } from 'vs/base/common/event'; import { DisposableStore, dispose, IDisposable, markAsSingleton, ReferenceCollection, SafeDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite, throwIfDisposablesAreLeaked } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/linkedList.test.ts b/src/vs/base/test/common/linkedList.test.ts index 181916d96257d..8bd3f6519a7dc 100644 --- a/src/vs/base/test/common/linkedList.test.ts +++ b/src/vs/base/test/common/linkedList.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { LinkedList } from 'vs/base/common/linkedList'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/linkedText.test.ts b/src/vs/base/test/common/linkedText.test.ts index dc3bdbd0609db..63f76d082c45f 100644 --- a/src/vs/base/test/common/linkedText.test.ts +++ b/src/vs/base/test/common/linkedText.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { parseLinkedText } from 'vs/base/common/linkedText'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index f92234c326648..f837920f1f9a8 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { BidirectionalMap, LinkedMap, LRUCache, mapsStrictEqualIgnoreOrder, MRUCache, ResourceMap, SetMap, Touch } from 'vs/base/common/map'; import { extUriIgnorePathCase } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/base/test/common/markdownString.test.ts b/src/vs/base/test/common/markdownString.test.ts index cb7df1696b398..4c40269251226 100644 --- a/src/vs/base/test/common/markdownString.test.ts +++ b/src/vs/base/test/common/markdownString.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/marshalling.test.ts b/src/vs/base/test/common/marshalling.test.ts index 7d3bb66cec74e..94d30b5b0bf38 100644 --- a/src/vs/base/test/common/marshalling.test.ts +++ b/src/vs/base/test/common/marshalling.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { parse, stringify } from 'vs/base/common/marshalling'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/mime.test.ts b/src/vs/base/test/common/mime.test.ts index fce56646ff8af..96fa3b6209e1f 100644 --- a/src/vs/base/test/common/mime.test.ts +++ b/src/vs/base/test/common/mime.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { normalizeMimeType } from 'vs/base/common/mime'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/network.test.ts b/src/vs/base/test/common/network.test.ts index a85b2b392a8ef..d741b0e457779 100644 --- a/src/vs/base/test/common/network.test.ts +++ b/src/vs/base/test/common/network.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FileAccess, Schemas } from 'vs/base/common/network'; import { isWeb } from 'vs/base/common/platform'; import { isEqual } from 'vs/base/common/resources'; diff --git a/src/vs/base/test/common/normalization.test.ts b/src/vs/base/test/common/normalization.test.ts index 65b44eb652ce6..58f4fe77e81a3 100644 --- a/src/vs/base/test/common/normalization.test.ts +++ b/src/vs/base/test/common/normalization.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { removeAccents } from 'vs/base/common/normalization'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/objects.test.ts b/src/vs/base/test/common/objects.test.ts index 2465585544fb2..ce600eb018145 100644 --- a/src/vs/base/test/common/objects.test.ts +++ b/src/vs/base/test/common/objects.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as objects from 'vs/base/common/objects'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/observable.test.ts b/src/vs/base/test/common/observable.test.ts index e2694d5c94bec..411d4c64ea528 100644 --- a/src/vs/base/test/common/observable.test.ts +++ b/src/vs/base/test/common/observable.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { ISettableObservable, autorun, derived, ITransaction, observableFromEvent, observableValue, transaction, keepObserved, waitForState, autorunHandleChanges, observableSignal } from 'vs/base/common/observable'; import { BaseObservable, IObservable, IObserver } from 'vs/base/common/observableInternal/base'; diff --git a/src/vs/base/test/common/paging.test.ts b/src/vs/base/test/common/paging.test.ts index f0ff02a4ab538..772083f361322 100644 --- a/src/vs/base/test/common/paging.test.ts +++ b/src/vs/base/test/common/paging.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { disposableTimeout } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { CancellationError, isCancellationError } from 'vs/base/common/errors'; diff --git a/src/vs/base/test/common/path.test.ts b/src/vs/base/test/common/path.test.ts index 62b43c91d0b56..f42abd1fed30b 100644 --- a/src/vs/base/test/common/path.test.ts +++ b/src/vs/base/test/common/path.test.ts @@ -27,7 +27,7 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -import * as assert from 'assert'; +import assert from 'assert'; import * as path from 'vs/base/common/path'; import { isWeb, isWindows } from 'vs/base/common/platform'; import * as process from 'vs/base/common/process'; diff --git a/src/vs/base/test/common/prefixTree.test.ts b/src/vs/base/test/common/prefixTree.test.ts index e5545734a8a68..10b77d96bbcca 100644 --- a/src/vs/base/test/common/prefixTree.test.ts +++ b/src/vs/base/test/common/prefixTree.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { WellDefinedPrefixTree } from 'vs/base/common/prefixTree'; -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; suite('WellDefinedPrefixTree', () => { diff --git a/src/vs/base/test/common/processes.test.ts b/src/vs/base/test/common/processes.test.ts index d575590ab109f..6c0d88e62bb80 100644 --- a/src/vs/base/test/common/processes.test.ts +++ b/src/vs/base/test/common/processes.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as processes from 'vs/base/common/processes'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/resourceTree.test.ts b/src/vs/base/test/common/resourceTree.test.ts index 9024269a1eff0..51fba68f7642a 100644 --- a/src/vs/base/test/common/resourceTree.test.ts +++ b/src/vs/base/test/common/resourceTree.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ResourceTree } from 'vs/base/common/resourceTree'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/resources.test.ts b/src/vs/base/test/common/resources.test.ts index d1e4e1025ae1f..d23156443769c 100644 --- a/src/vs/base/test/common/resources.test.ts +++ b/src/vs/base/test/common/resources.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { toSlashes } from 'vs/base/common/extpath'; import { posix, win32 } from 'vs/base/common/path'; import { isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/base/test/common/scrollable.test.ts b/src/vs/base/test/common/scrollable.test.ts index 7059d813daab3..41a33727b6e76 100644 --- a/src/vs/base/test/common/scrollable.test.ts +++ b/src/vs/base/test/common/scrollable.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { SmoothScrollingOperation, SmoothScrollingUpdate } from 'vs/base/common/scrollable'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/skipList.test.ts b/src/vs/base/test/common/skipList.test.ts index 8dadb0e34dd59..096bd6a268fb1 100644 --- a/src/vs/base/test/common/skipList.test.ts +++ b/src/vs/base/test/common/skipList.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { binarySearch } from 'vs/base/common/arrays'; import { SkipList } from 'vs/base/common/skipList'; import { StopWatch } from 'vs/base/common/stopwatch'; diff --git a/src/vs/base/test/common/stream.test.ts b/src/vs/base/test/common/stream.test.ts index 5589dfdceaf8e..a8473f0ff8f2e 100644 --- a/src/vs/base/test/common/stream.test.ts +++ b/src/vs/base/test/common/stream.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { bufferToReadable, VSBuffer } from 'vs/base/common/buffer'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index 4be439f465695..b84a193eba15a 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as strings from 'vs/base/common/strings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/stripComments.test.ts b/src/vs/base/test/common/stripComments.test.ts index 4aac8cdcb9d03..e3bdff0c27847 100644 --- a/src/vs/base/test/common/stripComments.test.ts +++ b/src/vs/base/test/common/stripComments.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { stripComments } from 'vs/base/common/stripComments'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/ternarySearchtree.test.ts b/src/vs/base/test/common/ternarySearchtree.test.ts index c1a8cc771a1ba..1e684933d46cf 100644 --- a/src/vs/base/test/common/ternarySearchtree.test.ts +++ b/src/vs/base/test/common/ternarySearchtree.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { shuffle } from 'vs/base/common/arrays'; import { randomPath } from 'vs/base/common/extpath'; import { StopWatch } from 'vs/base/common/stopwatch'; diff --git a/src/vs/base/test/common/tfIdf.test.ts b/src/vs/base/test/common/tfIdf.test.ts index 3a423f253a3e9..df5e37da27089 100644 --- a/src/vs/base/test/common/tfIdf.test.ts +++ b/src/vs/base/test/common/tfIdf.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { TfIdfCalculator, TfIdfDocument, TfIdfScore } from 'vs/base/common/tfIdf'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/types.test.ts b/src/vs/base/test/common/types.test.ts index 93e2464925aae..f9b894fb73a17 100644 --- a/src/vs/base/test/common/types.test.ts +++ b/src/vs/base/test/common/types.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as types from 'vs/base/common/types'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/uri.test.ts b/src/vs/base/test/common/uri.test.ts index 69e2abe720d7f..fa65209a56802 100644 --- a/src/vs/base/test/common/uri.test.ts +++ b/src/vs/base/test/common/uri.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import { URI, UriComponents, isUriComponents } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/common/uuid.test.ts b/src/vs/base/test/common/uuid.test.ts index a8defebb567e1..1cfbf5c12e888 100644 --- a/src/vs/base/test/common/uuid.test.ts +++ b/src/vs/base/test/common/uuid.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as uuid from 'vs/base/common/uuid'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/node/css.build.test.ts b/src/vs/base/test/node/css.build.test.ts index 16c79d4122573..4f824b375d9e5 100644 --- a/src/vs/base/test/node/css.build.test.ts +++ b/src/vs/base/test/node/css.build.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CSSPluginUtilities, rewriteUrls } from 'vs/css.build'; diff --git a/src/vs/base/test/node/extpath.test.ts b/src/vs/base/test/node/extpath.test.ts index 04aa1873295a1..b7d78dbee4690 100644 --- a/src/vs/base/test/node/extpath.test.ts +++ b/src/vs/base/test/node/extpath.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { tmpdir } from 'os'; import { realcase, realcaseSync, realpath, realpathSync } from 'vs/base/node/extpath'; import { Promises } from 'vs/base/node/pfs'; diff --git a/src/vs/base/test/node/id.test.ts b/src/vs/base/test/node/id.test.ts index 1a629134f067c..259b2312c1d60 100644 --- a/src/vs/base/test/node/id.test.ts +++ b/src/vs/base/test/node/id.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { getMachineId, getSqmMachineId, getdevDeviceId } from 'vs/base/node/id'; import { getMac } from 'vs/base/node/macAddress'; import { flakySuite } from 'vs/base/test/node/testUtils'; diff --git a/src/vs/base/test/node/nodeStreams.test.ts b/src/vs/base/test/node/nodeStreams.test.ts index 8cab1cc8420f0..44e7dd9154dde 100644 --- a/src/vs/base/test/node/nodeStreams.test.ts +++ b/src/vs/base/test/node/nodeStreams.test.ts @@ -5,7 +5,7 @@ import { Writable } from 'stream'; -import * as assert from 'assert'; +import assert from 'assert'; import { StreamSplitter } from 'vs/base/node/nodeStreams'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/node/pfs/pfs.test.ts b/src/vs/base/test/node/pfs/pfs.test.ts index b3ef62f232acc..8fec28d2bfc51 100644 --- a/src/vs/base/test/node/pfs/pfs.test.ts +++ b/src/vs/base/test/node/pfs/pfs.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as fs from 'fs'; import { tmpdir } from 'os'; import { timeout } from 'vs/base/common/async'; diff --git a/src/vs/base/test/node/port.test.ts b/src/vs/base/test/node/port.test.ts index 9230dc846844b..048cfc69bd11f 100644 --- a/src/vs/base/test/node/port.test.ts +++ b/src/vs/base/test/node/port.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as net from 'net'; import * as ports from 'vs/base/node/ports'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/base/test/node/powershell.test.ts b/src/vs/base/test/node/powershell.test.ts index a710bb80c4632..de9b669c769a5 100644 --- a/src/vs/base/test/node/powershell.test.ts +++ b/src/vs/base/test/node/powershell.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as fs from 'fs'; import * as platform from 'vs/base/common/platform'; import { enumeratePowerShellInstallations, getFirstAvailablePowerShellInstallation, IPowerShellExeDetails } from 'vs/base/node/powershell'; diff --git a/src/vs/base/test/node/processes/processes.integrationTest.ts b/src/vs/base/test/node/processes/processes.integrationTest.ts index ff52bf0205c2e..f8e827a8594f2 100644 --- a/src/vs/base/test/node/processes/processes.integrationTest.ts +++ b/src/vs/base/test/node/processes/processes.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as cp from 'child_process'; import { FileAccess } from 'vs/base/common/network'; import * as objects from 'vs/base/common/objects'; diff --git a/src/vs/base/test/node/uri.perf.test.ts b/src/vs/base/test/node/uri.perf.test.ts index 389f3c999ddd9..cd045f15d0ba0 100644 --- a/src/vs/base/test/node/uri.perf.test.ts +++ b/src/vs/base/test/node/uri.perf.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { readFileSync } from 'fs'; import { FileAccess } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/base/test/node/zip/zip.test.ts b/src/vs/base/test/node/zip/zip.test.ts index 0a898e2c7bca8..bde3eaf748257 100644 --- a/src/vs/base/test/node/zip/zip.test.ts +++ b/src/vs/base/test/node/zip/zip.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { tmpdir } from 'os'; import { createCancelablePromise } from 'vs/base/common/async'; import { FileAccess } from 'vs/base/common/network'; diff --git a/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts b/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts index 289fe8aa96a61..7a5f7e106e79a 100644 --- a/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts +++ b/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; diff --git a/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts index c1783a39f1188..a98da2b0e0da3 100644 --- a/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts index 641f1491d6f05..664a36b2dcad5 100644 --- a/src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyCodeChord } from 'vs/base/common/keybindings'; import { KeyCode } from 'vs/base/common/keyCodes'; import { OperatingSystem } from 'vs/base/common/platform'; @@ -101,4 +101,3 @@ function createCodeActionKeybinding(keycode: KeyCode, command: string, commandAr null, false); } - diff --git a/src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts index 71d6df33c0b4f..5946fb24f5047 100644 --- a/src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { promiseWithResolvers } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { assertType } from 'vs/base/common/types'; diff --git a/src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts index ff394a835bb9a..f40f7b1e25283 100644 --- a/src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts b/src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts index 3cecf3ee8eb30..d0e3423a47b3c 100644 --- a/src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts +++ b/src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts b/src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts index 194b8ee4f16bf..185d30db3e650 100644 --- a/src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts +++ b/src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/editor/contrib/dropOrPasteInto/test/browser/editSort.test.ts b/src/vs/editor/contrib/dropOrPasteInto/test/browser/editSort.test.ts index ee0b8e56b6133..ec61f04a463b1 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/test/browser/editSort.test.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/test/browser/editSort.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { DocumentDropEdit } from 'vs/editor/common/languages'; diff --git a/src/vs/editor/contrib/editorState/test/browser/editorState.test.ts b/src/vs/editor/contrib/editorState/test/browser/editorState.test.ts index cc2a8d0f93e74..239da13d2257c 100644 --- a/src/vs/editor/contrib/editorState/test/browser/editorState.test.ts +++ b/src/vs/editor/contrib/editorState/test/browser/editorState.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; diff --git a/src/vs/editor/contrib/find/test/browser/find.test.ts b/src/vs/editor/contrib/find/test/browser/find.test.ts index 466c39baf1e6e..580ea739b7646 100644 --- a/src/vs/editor/contrib/find/test/browser/find.test.ts +++ b/src/vs/editor/contrib/find/test/browser/find.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/contrib/find/test/browser/findController.test.ts b/src/vs/editor/contrib/find/test/browser/findController.test.ts index 9bdb1cb77861e..49fef95baf81a 100644 --- a/src/vs/editor/contrib/find/test/browser/findController.test.ts +++ b/src/vs/editor/contrib/find/test/browser/findController.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Delayer } from 'vs/base/common/async'; import * as platform from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/contrib/find/test/browser/findModel.test.ts b/src/vs/editor/contrib/find/test/browser/findModel.test.ts index 7d1ae5f5bd5b8..8cc753388b900 100644 --- a/src/vs/editor/contrib/find/test/browser/findModel.test.ts +++ b/src/vs/editor/contrib/find/test/browser/findModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; diff --git a/src/vs/editor/contrib/find/test/browser/replacePattern.test.ts b/src/vs/editor/contrib/find/test/browser/replacePattern.test.ts index cc9e76c93b5b3..1f534bbdae300 100644 --- a/src/vs/editor/contrib/find/test/browser/replacePattern.test.ts +++ b/src/vs/editor/contrib/find/test/browser/replacePattern.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { buildReplaceStringWithCasePreserved } from 'vs/base/common/search'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { parseReplaceString, ReplacePattern, ReplacePiece } from 'vs/editor/contrib/find/browser/replacePattern'; diff --git a/src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts b/src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts index 3cef0c2a56e0e..1ea615a5bd974 100644 --- a/src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; diff --git a/src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts b/src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts index 912cf515d1af0..a1a6dbe1dc19f 100644 --- a/src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { FoldingMarkers } from 'vs/editor/common/languages/languageConfiguration'; import { MAX_FOLDING_REGIONS, FoldRange, FoldingRegions, FoldSource } from 'vs/editor/contrib/folding/browser/foldingRanges'; diff --git a/src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts b/src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts index 71281efa963c5..6d57dec4e783b 100644 --- a/src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IRange } from 'vs/editor/common/core/range'; import { FoldingModel } from 'vs/editor/contrib/folding/browser/foldingModel'; import { HiddenRangeModel } from 'vs/editor/contrib/folding/browser/hiddenRangeModel'; diff --git a/src/vs/editor/contrib/folding/test/browser/indentFold.test.ts b/src/vs/editor/contrib/folding/test/browser/indentFold.test.ts index afee83dff2964..25db0e6d15d24 100644 --- a/src/vs/editor/contrib/folding/test/browser/indentFold.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/indentFold.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; diff --git a/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts b/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts index 0a1c3220e6407..837dd6c0bc4bd 100644 --- a/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { FoldingMarkers } from 'vs/editor/common/languages/languageConfiguration'; import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; diff --git a/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts b/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts index 3551f44660662..3b2bdb0648e17 100644 --- a/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ITextModel } from 'vs/editor/common/model'; import { FoldingContext, FoldingRange, FoldingRangeProvider, ProviderResult } from 'vs/editor/common/languages'; diff --git a/src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts b/src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts index d1195449779ff..a547f9450e1a6 100644 --- a/src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts +++ b/src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts b/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts index b41a164ec86ed..2ff019e7d9da3 100644 --- a/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts +++ b/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts index d6adda566d8c3..4bf731059949c 100644 --- a/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts +++ b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; @@ -1773,4 +1773,3 @@ suite('Auto Indent On Type - Lua', () => { }); }); }); - diff --git a/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts b/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts index 77afbe5c76d40..0a1b40949d74d 100644 --- a/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts +++ b/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; diff --git a/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsModel.test.ts b/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsModel.test.ts index 648f594059677..63ab19affbe24 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsModel.test.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsModel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Position } from 'vs/editor/common/core/position'; import { getSecondaryEdits } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel'; import { SingleTextEdit } from 'vs/editor/common/core/textEdit'; diff --git a/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts b/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts index e160c3daa015c..e318702da15be 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; diff --git a/src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts b/src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts index 354fa36b5af81..a860898c64e93 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts @@ -25,7 +25,7 @@ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; -import * as assert from 'assert'; +import assert from 'assert'; import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; diff --git a/src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts b/src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts index 4ef8e7d2cfc3b..17b47434db7f6 100644 --- a/src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts +++ b/src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import type { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction } from 'vs/editor/browser/editorExtensions'; diff --git a/src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts b/src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts index c53496fb5de3a..48348ae969034 100644 --- a/src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Selection } from 'vs/editor/common/core/selection'; import { CopyLinesCommand } from 'vs/editor/contrib/linesOperations/browser/copyLinesCommand'; diff --git a/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts index 5425697a2e4b6..f99fb62422de5 100644 --- a/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import type { ICodeEditor } from 'vs/editor/browser/editorBrowser'; diff --git a/src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts b/src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts index 982dc07426b82..80d6ed9373039 100644 --- a/src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts +++ b/src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; diff --git a/src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts b/src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts index 64de23fce27fa..008150e7c09cf 100644 --- a/src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts +++ b/src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts b/src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts index 6c84215bc72df..10372b408c4b7 100644 --- a/src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts +++ b/src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { promiseWithResolvers } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/editor/contrib/semanticTokens/test/browser/documentSemanticTokens.test.ts b/src/vs/editor/contrib/semanticTokens/test/browser/documentSemanticTokens.test.ts index c2d9a57c2026f..86d3bf5d62dca 100644 --- a/src/vs/editor/contrib/semanticTokens/test/browser/documentSemanticTokens.test.ts +++ b/src/vs/editor/contrib/semanticTokens/test/browser/documentSemanticTokens.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Barrier, timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/editor/contrib/semanticTokens/test/browser/getSemanticTokens.test.ts b/src/vs/editor/contrib/semanticTokens/test/browser/getSemanticTokens.test.ts index da8dc2f222d8d..6ac97ecde9616 100644 --- a/src/vs/editor/contrib/semanticTokens/test/browser/getSemanticTokens.test.ts +++ b/src/vs/editor/contrib/semanticTokens/test/browser/getSemanticTokens.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts b/src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts index dc9e9767d8183..1de9179cc2823 100644 --- a/src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts +++ b/src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts index e0f11350e8943..236ad70f27d82 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 1c9c3a80cdbe5..5b9a5e434f8fc 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts index ee2f1f1d24f9c..bbf24168409d1 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Choice, FormatString, Marker, Placeholder, Scanner, SnippetParser, Text, TextmateSnippet, TokenType, Transform, Variable } from 'vs/editor/contrib/snippet/browser/snippetParser'; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 6106184672439..0a9a3c76462da 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts index 53a9b272757af..b8ea4e5234255 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { sep } from 'vs/base/common/path'; diff --git a/src/vs/editor/contrib/stickyScroll/test/browser/stickyScroll.test.ts b/src/vs/editor/contrib/stickyScroll/test/browser/stickyScroll.test.ts index 04e852765caed..aaefcb65f3dc6 100644 --- a/src/vs/editor/contrib/stickyScroll/test/browser/stickyScroll.test.ts +++ b/src/vs/editor/contrib/stickyScroll/test/browser/stickyScroll.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { withAsyncTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { StickyScrollController } from 'vs/editor/contrib/stickyScroll/browser/stickyScrollController'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; diff --git a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts index cb08e56fb7f99..823d6865a84ae 100644 --- a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditorOptions, InternalSuggestOptions } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/contrib/suggest/test/browser/suggest.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggest.test.ts index d4df28ea332bc..b2e9fc0357754 100644 --- a/src/vs/editor/contrib/suggest/test/browser/suggest.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggest.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts index 617019ff5cfb7..64123de47db74 100644 --- a/src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/editor/contrib/suggest/test/browser/suggestInlineCompletions.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestInlineCompletions.test.ts index 1aaca84d48411..91d42374b1fcb 100644 --- a/src/vs/editor/contrib/suggest/test/browser/suggestInlineCompletions.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestInlineCompletions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts index 3bbc8c5883869..57d0d030d4879 100644 --- a/src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IPosition } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; diff --git a/src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts index 2bbfe524bfb15..5c673c0f35562 100644 --- a/src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts b/src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts index 04f7bce1cc1c3..15f238b162743 100644 --- a/src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts index a06bf07200a57..e65c88eeae303 100644 --- a/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; diff --git a/src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts b/src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts index 12258f71cfb67..b3a72759a0460 100644 --- a/src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts +++ b/src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorCommand } from 'vs/editor/browser/editorExtensions'; diff --git a/src/vs/editor/standalone/test/browser/monarch.test.ts b/src/vs/editor/standalone/test/browser/monarch.test.ts index 12feefa27d5f6..fbe58b6216962 100644 --- a/src/vs/editor/standalone/test/browser/monarch.test.ts +++ b/src/vs/editor/standalone/test/browser/monarch.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Token, TokenizationRegistry } from 'vs/editor/common/languages'; diff --git a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts index 92e385564acac..745c0075541cf 100644 --- a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts +++ b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Color } from 'vs/base/common/color'; import { Emitter } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/editor/standalone/test/browser/standaloneServices.test.ts b/src/vs/editor/standalone/test/browser/standaloneServices.test.ts index e44de083b985e..649783848e340 100644 --- a/src/vs/editor/standalone/test/browser/standaloneServices.test.ts +++ b/src/vs/editor/standalone/test/browser/standaloneServices.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyCode } from 'vs/base/common/keyCodes'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/browser/commands/shiftCommand.test.ts b/src/vs/editor/test/browser/commands/shiftCommand.test.ts index a769b21c4f9fc..8d98e80365847 100644 --- a/src/vs/editor/test/browser/commands/shiftCommand.test.ts +++ b/src/vs/editor/test/browser/commands/shiftCommand.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; diff --git a/src/vs/editor/test/browser/commands/sideEditing.test.ts b/src/vs/editor/test/browser/commands/sideEditing.test.ts index 6cdb2657aa7a4..fbd9a36c95a4a 100644 --- a/src/vs/editor/test/browser/commands/sideEditing.test.ts +++ b/src/vs/editor/test/browser/commands/sideEditing.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts b/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts index 5b4d0994a62dc..15f9bb999d43d 100644 --- a/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts +++ b/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { TrimTrailingWhitespaceCommand, trimTrailingWhitespace } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; diff --git a/src/vs/editor/test/browser/config/editorConfiguration.test.ts b/src/vs/editor/test/browser/config/editorConfiguration.test.ts index b507c54686f8f..911b73018c30e 100644 --- a/src/vs/editor/test/browser/config/editorConfiguration.test.ts +++ b/src/vs/editor/test/browser/config/editorConfiguration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IEnvConfiguration } from 'vs/editor/browser/config/editorConfiguration'; import { migrateOptions } from 'vs/editor/browser/config/migrateOptions'; diff --git a/src/vs/editor/test/browser/config/editorLayoutProvider.test.ts b/src/vs/editor/test/browser/config/editorLayoutProvider.test.ts index d44cc97a7f4b8..a2e3ace58f6d8 100644 --- a/src/vs/editor/test/browser/config/editorLayoutProvider.test.ts +++ b/src/vs/editor/test/browser/config/editorLayoutProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ComputedEditorOptions } from 'vs/editor/browser/config/editorConfiguration'; import { EditorLayoutInfo, EditorLayoutInfoComputer, EditorMinimapOptions, EditorOption, EditorOptions, InternalEditorRenderLineNumbersOptions, InternalEditorScrollbarOptions, RenderLineNumbersType, RenderMinimap } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/test/browser/controller/cursor.integrationTest.ts b/src/vs/editor/test/browser/controller/cursor.integrationTest.ts index 6373a6fd60389..bd956a353981f 100644 --- a/src/vs/editor/test/browser/controller/cursor.integrationTest.ts +++ b/src/vs/editor/test/browser/controller/cursor.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index a86e95c1303da..bb2abffb9c99b 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts index 2e312c53e3ea3..c4bee4b9f2b2f 100644 --- a/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/test/browser/controller/textAreaInput.test.ts b/src/vs/editor/test/browser/controller/textAreaInput.test.ts index 19fcf3b1970b6..fd2e23e375155 100644 --- a/src/vs/editor/test/browser/controller/textAreaInput.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { OperatingSystem } from 'vs/base/common/platform'; diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 087e99311f281..2baa9ddda39e3 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ITextAreaWrapper, PagedScreenReaderStrategy, TextAreaState } from 'vs/editor/browser/controller/textAreaState'; diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index b8eb27e6d0fef..9160c07070a72 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/browser/services/openerService.test.ts b/src/vs/editor/test/browser/services/openerService.test.ts index 26dea91e68196..d732776a8009a 100644 --- a/src/vs/editor/test/browser/services/openerService.test.ts +++ b/src/vs/editor/test/browser/services/openerService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/browser/testCommand.ts b/src/vs/editor/test/browser/testCommand.ts index 60abb6d301f6d..e12d2cc526a8a 100644 --- a/src/vs/editor/test/browser/testCommand.ts +++ b/src/vs/editor/test/browser/testCommand.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; import { ICommand, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; diff --git a/src/vs/editor/test/browser/view/minimapCharRenderer.test.ts b/src/vs/editor/test/browser/view/minimapCharRenderer.test.ts index ab0d682a7be83..4fcfa5cf3cddd 100644 --- a/src/vs/editor/test/browser/view/minimapCharRenderer.test.ts +++ b/src/vs/editor/test/browser/view/minimapCharRenderer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { MinimapCharRendererFactory } from 'vs/editor/browser/viewParts/minimap/minimapCharRendererFactory'; import { Constants } from 'vs/editor/browser/viewParts/minimap/minimapCharSheet'; diff --git a/src/vs/editor/test/browser/view/viewLayer.test.ts b/src/vs/editor/test/browser/view/viewLayer.test.ts index 0fcb0b1d57d1f..0f9588d870c01 100644 --- a/src/vs/editor/test/browser/view/viewLayer.test.ts +++ b/src/vs/editor/test/browser/view/viewLayer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ILine, RenderedLinesCollection } from 'vs/editor/browser/view/viewLayer'; diff --git a/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts b/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts index 0974ab8d183c5..292aa0ed1fa6c 100644 --- a/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts +++ b/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts b/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts index 02786c056b3d2..a89fc01e245dd 100644 --- a/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts +++ b/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts b/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts index 4b515f974b292..ff16b570be11e 100644 --- a/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts +++ b/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts b/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts index 192b4b6d8e49a..a09d5c98f1807 100644 --- a/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts +++ b/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/browser/widget/diffEditorWidget.test.ts b/src/vs/editor/test/browser/widget/diffEditorWidget.test.ts index 1f08e089c2e59..53ecda34e134b 100644 --- a/src/vs/editor/test/browser/widget/diffEditorWidget.test.ts +++ b/src/vs/editor/test/browser/widget/diffEditorWidget.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { UnchangedRegion } from 'vs/editor/browser/widget/diffEditor/diffEditorViewModel'; import { LineRange } from 'vs/editor/common/core/lineRange'; diff --git a/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts b/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts index 200cb5e226afb..9c2efda4f77ec 100644 --- a/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts +++ b/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/cursor/cursorAtomicMoveOperations'; diff --git a/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts b/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts index c2d8dc85a45bd..e90bdd5a5714d 100644 --- a/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; diff --git a/src/vs/editor/test/common/core/characterClassifier.test.ts b/src/vs/editor/test/common/core/characterClassifier.test.ts index dd4c4b02df3d1..4271d91f92318 100644 --- a/src/vs/editor/test/common/core/characterClassifier.test.ts +++ b/src/vs/editor/test/common/core/characterClassifier.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CharCode } from 'vs/base/common/charCode'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier'; diff --git a/src/vs/editor/test/common/core/lineRange.test.ts b/src/vs/editor/test/common/core/lineRange.test.ts index b67b9bdfb7baf..1b45b3f282909 100644 --- a/src/vs/editor/test/common/core/lineRange.test.ts +++ b/src/vs/editor/test/common/core/lineRange.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { LineRange, LineRangeSet } from 'vs/editor/common/core/lineRange'; diff --git a/src/vs/editor/test/common/core/lineTokens.test.ts b/src/vs/editor/test/common/core/lineTokens.test.ts index 177e66774df01..d2457fa2bc8ea 100644 --- a/src/vs/editor/test/common/core/lineTokens.test.ts +++ b/src/vs/editor/test/common/core/lineTokens.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { MetadataConsts } from 'vs/editor/common/encodedTokenAttributes'; import { LanguageIdCodec } from 'vs/editor/common/services/languagesRegistry'; diff --git a/src/vs/editor/test/common/core/positionOffsetTransformer.test.ts b/src/vs/editor/test/common/core/positionOffsetTransformer.test.ts index 39aead0a84852..1811a08e90f32 100644 --- a/src/vs/editor/test/common/core/positionOffsetTransformer.test.ts +++ b/src/vs/editor/test/common/core/positionOffsetTransformer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { OffsetRange } from 'vs/editor/common/core/offsetRange'; import { PositionOffsetTransformer } from 'vs/editor/common/core/positionToOffset'; diff --git a/src/vs/editor/test/common/core/range.test.ts b/src/vs/editor/test/common/core/range.test.ts index bf574592d4ea1..fcbb0cd0fccf3 100644 --- a/src/vs/editor/test/common/core/range.test.ts +++ b/src/vs/editor/test/common/core/range.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/core/stringBuilder.test.ts b/src/vs/editor/test/common/core/stringBuilder.test.ts index af90a1f5eb166..6afe99db33a0e 100644 --- a/src/vs/editor/test/common/core/stringBuilder.test.ts +++ b/src/vs/editor/test/common/core/stringBuilder.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { writeUInt16LE } from 'vs/base/common/buffer'; import { CharCode } from 'vs/base/common/charCode'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/common/core/textEdit.test.ts b/src/vs/editor/test/common/core/textEdit.test.ts index f02e8a9bd5036..4458eaf8a5b20 100644 --- a/src/vs/editor/test/common/core/textEdit.test.ts +++ b/src/vs/editor/test/common/core/textEdit.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { OffsetRange } from 'vs/editor/common/core/offsetRange'; import { StringText } from 'vs/editor/common/core/textEdit'; diff --git a/src/vs/editor/test/common/diff/diffComputer.test.ts b/src/vs/editor/test/common/diff/diffComputer.test.ts index 38378ef38263d..651dc5a79f205 100644 --- a/src/vs/editor/test/common/diff/diffComputer.test.ts +++ b/src/vs/editor/test/common/diff/diffComputer.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Constants } from 'vs/base/common/uint'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts index 264292f82ff07..514556238b536 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { splitLines } from 'vs/base/common/strings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/brackets.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/brackets.test.ts index 2a21907778def..1c2ea8c3b49e7 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/brackets.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/brackets.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { LanguageAgnosticBracketTokens } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/combineTextEditInfos.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/combineTextEditInfos.test.ts index 9155b32a9cae5..a1def431d2b7d 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/combineTextEditInfos.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/combineTextEditInfos.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { SingleTextEdit } from 'vs/editor/common/core/textEdit'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/concat23Trees.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/concat23Trees.test.ts index 42d0eae8f81cd..6fced6cef3e53 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/concat23Trees.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/concat23Trees.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { AstNode, AstNodeKind, ListAstNode, TextAstNode } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast'; import { concat23Trees } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts index 09c9e34a124f4..87215503dc4b0 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore, disposeOnReturn } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/length.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/length.test.ts index eb49c1048d118..57086d81ff884 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/length.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/length.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Length, lengthAdd, lengthDiffNonNegative, lengthToObj, toLength } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/smallImmutableSet.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/smallImmutableSet.test.ts index 45d4dcc68337a..2b5026e4f0cfc 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/smallImmutableSet.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/smallImmutableSet.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { DenseKeyProvider, SmallImmutableSet } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet'; diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts index a83b30a66eb42..f306d99ccabc3 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { LanguageId, MetadataConsts, StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; diff --git a/src/vs/editor/test/common/model/editStack.test.ts b/src/vs/editor/test/common/model/editStack.test.ts index d220d12e668e0..da409c9d8a3c4 100644 --- a/src/vs/editor/test/common/model/editStack.test.ts +++ b/src/vs/editor/test/common/model/editStack.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Selection } from 'vs/editor/common/core/selection'; import { TextChange } from 'vs/editor/common/core/textChange'; diff --git a/src/vs/editor/test/common/model/editableTextModel.test.ts b/src/vs/editor/test/common/model/editableTextModel.test.ts index aa39ad03e8c49..d2af9519432d5 100644 --- a/src/vs/editor/test/common/model/editableTextModel.test.ts +++ b/src/vs/editor/test/common/model/editableTextModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; diff --git a/src/vs/editor/test/common/model/editableTextModelTestUtils.ts b/src/vs/editor/test/common/model/editableTextModelTestUtils.ts index 06803315a7b9e..2228a6174a459 100644 --- a/src/vs/editor/test/common/model/editableTextModelTestUtils.ts +++ b/src/vs/editor/test/common/model/editableTextModelTestUtils.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { EndOfLinePreference, EndOfLineSequence } from 'vs/editor/common/model'; diff --git a/src/vs/editor/test/common/model/intervalTree.test.ts b/src/vs/editor/test/common/model/intervalTree.test.ts index 06534b6e2a667..dd2fd332be548 100644 --- a/src/vs/editor/test/common/model/intervalTree.test.ts +++ b/src/vs/editor/test/common/model/intervalTree.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { TrackedRangeStickiness } from 'vs/editor/common/model'; import { IntervalNode, IntervalTree, NodeColor, SENTINEL, getNodeColor, intervalCompare, nodeAcceptEdit, setNodeStickiness } from 'vs/editor/common/model/intervalTree'; @@ -912,4 +912,3 @@ function assertValidTree(T: IntervalTree): void { } //#endregion - diff --git a/src/vs/editor/test/common/model/linesTextBuffer/linesTextBuffer.test.ts b/src/vs/editor/test/common/model/linesTextBuffer/linesTextBuffer.test.ts index 77bc1e74cc16b..a4604874d657c 100644 --- a/src/vs/editor/test/common/model/linesTextBuffer/linesTextBuffer.test.ts +++ b/src/vs/editor/test/common/model/linesTextBuffer/linesTextBuffer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { DefaultEndOfLine } from 'vs/editor/common/model'; diff --git a/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test.ts b/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test.ts index 22f182090b8ed..662ef1fe8fde9 100644 --- a/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test.ts +++ b/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as strings from 'vs/base/common/strings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { DefaultEndOfLine } from 'vs/editor/common/model'; diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 5eb7462e045fa..91279c1d70d1e 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { MetadataConsts } from 'vs/editor/common/encodedTokenAttributes'; diff --git a/src/vs/editor/test/common/model/model.modes.test.ts b/src/vs/editor/test/common/model/model.modes.test.ts index fa48350404f4e..66df53d83df81 100644 --- a/src/vs/editor/test/common/model/model.modes.test.ts +++ b/src/vs/editor/test/common/model/model.modes.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; diff --git a/src/vs/editor/test/common/model/model.test.ts b/src/vs/editor/test/common/model/model.test.ts index a75e86e7b59c6..e699174a650d2 100644 --- a/src/vs/editor/test/common/model/model.test.ts +++ b/src/vs/editor/test/common/model/model.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; diff --git a/src/vs/editor/test/common/model/modelDecorations.test.ts b/src/vs/editor/test/common/model/modelDecorations.test.ts index dda14417b1acf..c00d0ce8f2a96 100644 --- a/src/vs/editor/test/common/model/modelDecorations.test.ts +++ b/src/vs/editor/test/common/model/modelDecorations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/editor/test/common/model/modelEditOperation.test.ts b/src/vs/editor/test/common/model/modelEditOperation.test.ts index a2cd24ce4f473..0aeebe90c6f52 100644 --- a/src/vs/editor/test/common/model/modelEditOperation.test.ts +++ b/src/vs/editor/test/common/model/modelEditOperation.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/model/modelInjectedText.test.ts b/src/vs/editor/test/common/model/modelInjectedText.test.ts index 72d0f9ba0a3a2..f7c023c4f8a86 100644 --- a/src/vs/editor/test/common/model/modelInjectedText.test.ts +++ b/src/vs/editor/test/common/model/modelInjectedText.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts index 007033dc79072..67a70b1bbb2ae 100644 --- a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts +++ b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { WordCharacterClassifier } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/model/textChange.test.ts b/src/vs/editor/test/common/model/textChange.test.ts index 164e7ff92e133..a58430b309f98 100644 --- a/src/vs/editor/test/common/model/textChange.test.ts +++ b/src/vs/editor/test/common/model/textChange.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { compressConsecutiveTextChanges, TextChange } from 'vs/editor/common/core/textChange'; diff --git a/src/vs/editor/test/common/model/textModel.test.ts b/src/vs/editor/test/common/model/textModel.test.ts index dc6037d6df4d0..3270a56338618 100644 --- a/src/vs/editor/test/common/model/textModel.test.ts +++ b/src/vs/editor/test/common/model/textModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { UTF8_BOM_CHARACTER } from 'vs/base/common/strings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/common/model/textModelSearch.test.ts b/src/vs/editor/test/common/model/textModelSearch.test.ts index 91ec41810f343..0f03a1e0730ba 100644 --- a/src/vs/editor/test/common/model/textModelSearch.test.ts +++ b/src/vs/editor/test/common/model/textModelSearch.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/model/textModelTokens.test.ts b/src/vs/editor/test/common/model/textModelTokens.test.ts index b425cc30fbf49..34171ea9b1de3 100644 --- a/src/vs/editor/test/common/model/textModelTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelTokens.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { OffsetRange } from 'vs/editor/common/core/offsetRange'; import { RangePriorityQueueImpl } from 'vs/editor/common/model/textModelTokens'; diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index cdb8528819bf5..54ef6b8d6283d 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/model/tokensStore.test.ts b/src/vs/editor/test/common/model/tokensStore.test.ts index 7ceba9ef59862..f4e9413a422c5 100644 --- a/src/vs/editor/test/common/model/tokensStore.test.ts +++ b/src/vs/editor/test/common/model/tokensStore.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; diff --git a/src/vs/editor/test/common/modes/languageConfiguration.test.ts b/src/vs/editor/test/common/modes/languageConfiguration.test.ts index 97c74722cc9d7..28e6340d9f3d8 100644 --- a/src/vs/editor/test/common/modes/languageConfiguration.test.ts +++ b/src/vs/editor/test/common/modes/languageConfiguration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; import { StandardAutoClosingPairConditional } from 'vs/editor/common/languages/languageConfiguration'; diff --git a/src/vs/editor/test/common/modes/languageSelector.test.ts b/src/vs/editor/test/common/modes/languageSelector.test.ts index ce3aa3f407800..3de1b762b5936 100644 --- a/src/vs/editor/test/common/modes/languageSelector.test.ts +++ b/src/vs/editor/test/common/modes/languageSelector.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { LanguageSelector, score } from 'vs/editor/common/languageSelector'; diff --git a/src/vs/editor/test/common/modes/linkComputer.test.ts b/src/vs/editor/test/common/modes/linkComputer.test.ts index 49411db88e964..2d769837672df 100644 --- a/src/vs/editor/test/common/modes/linkComputer.test.ts +++ b/src/vs/editor/test/common/modes/linkComputer.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ILink } from 'vs/editor/common/languages'; import { ILinkComputerTarget, computeLinks } from 'vs/editor/common/languages/linkComputer'; diff --git a/src/vs/editor/test/common/modes/supports/characterPair.test.ts b/src/vs/editor/test/common/modes/supports/characterPair.test.ts index 70c763ec16efa..e92b7db2e6e11 100644 --- a/src/vs/editor/test/common/modes/supports/characterPair.test.ts +++ b/src/vs/editor/test/common/modes/supports/characterPair.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; import { StandardAutoClosingPairConditional } from 'vs/editor/common/languages/languageConfiguration'; diff --git a/src/vs/editor/test/common/modes/supports/electricCharacter.test.ts b/src/vs/editor/test/common/modes/supports/electricCharacter.test.ts index 90d89185aa48d..20170cb8f4850 100644 --- a/src/vs/editor/test/common/modes/supports/electricCharacter.test.ts +++ b/src/vs/editor/test/common/modes/supports/electricCharacter.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; import { BracketElectricCharacterSupport, IElectricAction } from 'vs/editor/common/languages/supports/electricCharacter'; diff --git a/src/vs/editor/test/common/modes/supports/onEnter.test.ts b/src/vs/editor/test/common/modes/supports/onEnter.test.ts index 1daa14e160745..4ed40eb1abbbe 100644 --- a/src/vs/editor/test/common/modes/supports/onEnter.test.ts +++ b/src/vs/editor/test/common/modes/supports/onEnter.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CharacterPair, IndentAction } from 'vs/editor/common/languages/languageConfiguration'; import { OnEnterSupport } from 'vs/editor/common/languages/supports/onEnter'; import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/onEnterRules'; diff --git a/src/vs/editor/test/common/modes/supports/richEditBrackets.test.ts b/src/vs/editor/test/common/modes/supports/richEditBrackets.test.ts index f58f7105d7eb1..5fd90a7156101 100644 --- a/src/vs/editor/test/common/modes/supports/richEditBrackets.test.ts +++ b/src/vs/editor/test/common/modes/supports/richEditBrackets.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { BracketsUtils } from 'vs/editor/common/languages/supports/richEditBrackets'; diff --git a/src/vs/editor/test/common/modes/supports/tokenization.test.ts b/src/vs/editor/test/common/modes/supports/tokenization.test.ts index 26854898f0364..b5386ec1b3bb9 100644 --- a/src/vs/editor/test/common/modes/supports/tokenization.test.ts +++ b/src/vs/editor/test/common/modes/supports/tokenization.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { FontStyle } from 'vs/editor/common/encodedTokenAttributes'; import { ColorMap, ExternalThemeTrieElement, ParsedTokenThemeRule, ThemeTrieElementRule, TokenTheme, parseTokenTheme, strcmp } from 'vs/editor/common/languages/supports/tokenization'; diff --git a/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts b/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts index 7593ea14706e7..af7015a19b6c3 100644 --- a/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts +++ b/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ColorId, FontStyle, MetadataConsts } from 'vs/editor/common/encodedTokenAttributes'; diff --git a/src/vs/editor/test/common/services/editorSimpleWorker.test.ts b/src/vs/editor/test/common/services/editorSimpleWorker.test.ts index 5dc2dd11f16e6..781ff45021109 100644 --- a/src/vs/editor/test/common/services/editorSimpleWorker.test.ts +++ b/src/vs/editor/test/common/services/editorSimpleWorker.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/services/languageService.test.ts b/src/vs/editor/test/common/services/languageService.test.ts index b0b54a96746e3..e8317e6ae881f 100644 --- a/src/vs/editor/test/common/services/languageService.test.ts +++ b/src/vs/editor/test/common/services/languageService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { LanguageService } from 'vs/editor/common/services/languageService'; diff --git a/src/vs/editor/test/common/services/languagesAssociations.test.ts b/src/vs/editor/test/common/services/languagesAssociations.test.ts index 689457fe6788c..7d6ce3ba4dca4 100644 --- a/src/vs/editor/test/common/services/languagesAssociations.test.ts +++ b/src/vs/editor/test/common/services/languagesAssociations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { getMimeTypes, registerPlatformLanguageAssociation, registerConfiguredLanguageAssociation } from 'vs/editor/common/services/languagesAssociations'; diff --git a/src/vs/editor/test/common/services/languagesRegistry.test.ts b/src/vs/editor/test/common/services/languagesRegistry.test.ts index 74ec1559d437f..d4715b8534c04 100644 --- a/src/vs/editor/test/common/services/languagesRegistry.test.ts +++ b/src/vs/editor/test/common/services/languagesRegistry.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { LanguagesRegistry } from 'vs/editor/common/services/languagesRegistry'; diff --git a/src/vs/editor/test/common/services/modelService.test.ts b/src/vs/editor/test/common/services/modelService.test.ts index 53eb701ecfbc9..cd4b53d86df55 100644 --- a/src/vs/editor/test/common/services/modelService.test.ts +++ b/src/vs/editor/test/common/services/modelService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CharCode } from 'vs/base/common/charCode'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/editor/test/common/services/semanticTokensDto.test.ts b/src/vs/editor/test/common/services/semanticTokensDto.test.ts index b32e7e66c743a..7093691179dd5 100644 --- a/src/vs/editor/test/common/services/semanticTokensDto.test.ts +++ b/src/vs/editor/test/common/services/semanticTokensDto.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IFullSemanticTokensDto, IDeltaSemanticTokensDto, encodeSemanticTokensDto, ISemanticTokensDto, decodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto'; import { VSBuffer } from 'vs/base/common/buffer'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts b/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts index bfec2c00b1ad8..1128768e91911 100644 --- a/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts +++ b/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; import { MetadataConsts } from 'vs/editor/common/encodedTokenAttributes'; diff --git a/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts b/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts index 11410512dc631..c7fbd1afff21b 100644 --- a/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts +++ b/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IModelService } from 'vs/editor/common/services/model'; diff --git a/src/vs/editor/test/common/services/unicodeTextModelHighlighter.test.ts b/src/vs/editor/test/common/services/unicodeTextModelHighlighter.test.ts index b646a4c18bea9..9b5351bd6189e 100644 --- a/src/vs/editor/test/common/services/unicodeTextModelHighlighter.test.ts +++ b/src/vs/editor/test/common/services/unicodeTextModelHighlighter.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { UnicodeHighlighterOptions, UnicodeTextModelHighlighter } from 'vs/editor/common/services/unicodeTextModelHighlighter'; diff --git a/src/vs/editor/test/common/view/overviewZoneManager.test.ts b/src/vs/editor/test/common/view/overviewZoneManager.test.ts index 5896b2a928b07..b488141d7d7da 100644 --- a/src/vs/editor/test/common/view/overviewZoneManager.test.ts +++ b/src/vs/editor/test/common/view/overviewZoneManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ColorZone, OverviewRulerZone, OverviewZoneManager } from 'vs/editor/common/viewModel/overviewZoneManager'; diff --git a/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts b/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts index ecfde1e3d915c..d1058c422939d 100644 --- a/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts +++ b/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { DecorationSegment, LineDecoration, LineDecorationsNormalizer } from 'vs/editor/common/viewLayout/lineDecorations'; diff --git a/src/vs/editor/test/common/viewLayout/linesLayout.test.ts b/src/vs/editor/test/common/viewLayout/linesLayout.test.ts index c3f0fa635ab57..58f9217ea56af 100644 --- a/src/vs/editor/test/common/viewLayout/linesLayout.test.ts +++ b/src/vs/editor/test/common/viewLayout/linesLayout.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditorWhitespace, LinesLayout } from 'vs/editor/common/viewLayout/linesLayout'; diff --git a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts index 2fdbeaefdf82e..22e1c60f7af1d 100644 --- a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts +++ b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/editor/test/common/viewModel/glyphLanesModel.test.ts b/src/vs/editor/test/common/viewModel/glyphLanesModel.test.ts index 7c0522a84f0d5..84659a045c60c 100644 --- a/src/vs/editor/test/common/viewModel/glyphLanesModel.test.ts +++ b/src/vs/editor/test/common/viewModel/glyphLanesModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { GlyphMarginLanesModel, } from 'vs/editor/common/viewModel/glyphLanesModel'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/common/viewModel/lineBreakData.test.ts b/src/vs/editor/test/common/viewModel/lineBreakData.test.ts index 85792a4239099..b771b7e5ff8b4 100644 --- a/src/vs/editor/test/common/viewModel/lineBreakData.test.ts +++ b/src/vs/editor/test/common/viewModel/lineBreakData.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { PositionAffinity } from 'vs/editor/common/model'; import { ModelDecorationInjectedTextOptions } from 'vs/editor/common/model/textModel'; diff --git a/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts b/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts index 37727d4c8a1cd..a1defd0c4f54c 100644 --- a/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts +++ b/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EditorOptions, WrappingIndent } from 'vs/editor/common/config/editorOptions'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; diff --git a/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts b/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts index 1fdb7a2c10bd8..e1820e6e920bf 100644 --- a/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts +++ b/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { toUint32 } from 'vs/base/common/uint'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { PrefixSumComputer, PrefixSumIndexOfResult } from 'vs/editor/common/model/prefixSumComputer'; diff --git a/src/vs/editor/test/node/classification/typescript.test.ts b/src/vs/editor/test/node/classification/typescript.test.ts index e9e8d3fec1a21..d2657a7ce4122 100644 --- a/src/vs/editor/test/node/classification/typescript.test.ts +++ b/src/vs/editor/test/node/classification/typescript.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; import * as fs from 'fs'; // import { getPathFromAmdModule } from 'vs/base/test/node/testUtils'; diff --git a/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts b/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts index 995472ca78f5b..57a34dfc36457 100644 --- a/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts +++ b/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { RangeMapping } from 'vs/editor/common/diff/rangeMapping'; import { OffsetRange } from 'vs/editor/common/core/offsetRange'; diff --git a/src/vs/editor/test/node/diffing/fixtures.test.ts b/src/vs/editor/test/node/diffing/fixtures.test.ts index e944d133befbf..6a1cb32540948 100644 --- a/src/vs/editor/test/node/diffing/fixtures.test.ts +++ b/src/vs/editor/test/node/diffing/fixtures.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs'; import { join, resolve } from 'path'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; diff --git a/src/vs/platform/actions/test/common/menuService.test.ts b/src/vs/platform/actions/test/common/menuService.test.ts index 31e5d6c17be59..8a3b2c421a906 100644 --- a/src/vs/platform/actions/test/common/menuService.test.ts +++ b/src/vs/platform/actions/test/common/menuService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { generateUuid } from 'vs/base/common/uuid'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts index 9fd5c04506540..749cfa4e6e657 100644 --- a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts +++ b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { createHash } from 'crypto'; import * as fs from 'fs'; import * as os from 'os'; diff --git a/src/vs/platform/checksum/test/node/checksumService.test.ts b/src/vs/platform/checksum/test/node/checksumService.test.ts index 3e56af6472007..5e7e71cdd7a4c 100644 --- a/src/vs/platform/checksum/test/node/checksumService.test.ts +++ b/src/vs/platform/checksum/test/node/checksumService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FileAccess, Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/commands/test/common/commands.test.ts b/src/vs/platform/commands/test/common/commands.test.ts index eeb3ed5da2af2..f46f8e1a6ae71 100644 --- a/src/vs/platform/commands/test/common/commands.test.ts +++ b/src/vs/platform/commands/test/common/commands.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { combinedDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; diff --git a/src/vs/platform/configuration/test/common/configuration.test.ts b/src/vs/platform/configuration/test/common/configuration.test.ts index e7b169e734188..1f709cf2c0fd6 100644 --- a/src/vs/platform/configuration/test/common/configuration.test.ts +++ b/src/vs/platform/configuration/test/common/configuration.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { merge, removeFromValueTree } from 'vs/platform/configuration/common/configuration'; import { mergeChanges } from 'vs/platform/configuration/common/configurationModels'; diff --git a/src/vs/platform/configuration/test/common/configurationModels.test.ts b/src/vs/platform/configuration/test/common/configurationModels.test.ts index 50b612d83d900..ab425c4fd30f4 100644 --- a/src/vs/platform/configuration/test/common/configurationModels.test.ts +++ b/src/vs/platform/configuration/test/common/configurationModels.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ResourceMap } from 'vs/base/common/map'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts index 9fc9e709322bf..e2cf8972a2c33 100644 --- a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts +++ b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/platform/configuration/test/common/configurationService.test.ts b/src/vs/platform/configuration/test/common/configurationService.test.ts index 880e49e8e48c7..0eff504b9bd16 100644 --- a/src/vs/platform/configuration/test/common/configurationService.test.ts +++ b/src/vs/platform/configuration/test/common/configurationService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event } from 'vs/base/common/event'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/platform/configuration/test/common/configurations.test.ts b/src/vs/platform/configuration/test/common/configurations.test.ts index 378107be505f9..f86e6f662498c 100644 --- a/src/vs/platform/configuration/test/common/configurations.test.ts +++ b/src/vs/platform/configuration/test/common/configurations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { equals } from 'vs/base/common/objects'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/configuration/test/common/policyConfiguration.test.ts b/src/vs/platform/configuration/test/common/policyConfiguration.test.ts index 94ee037eb5d81..d3e44993618ec 100644 --- a/src/vs/platform/configuration/test/common/policyConfiguration.test.ts +++ b/src/vs/platform/configuration/test/common/policyConfiguration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { DefaultConfiguration, PolicyConfiguration } from 'vs/platform/configuration/common/configurations'; diff --git a/src/vs/platform/contextkey/test/browser/contextkey.test.ts b/src/vs/platform/contextkey/test/browser/contextkey.test.ts index b56d4b874da1e..d2301c19147e5 100644 --- a/src/vs/platform/contextkey/test/browser/contextkey.test.ts +++ b/src/vs/platform/contextkey/test/browser/contextkey.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DeferredPromise } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/platform/contextkey/test/common/contextkey.test.ts b/src/vs/platform/contextkey/test/common/contextkey.test.ts index 8f388fb13ee55..2555701c1d809 100644 --- a/src/vs/platform/contextkey/test/common/contextkey.test.ts +++ b/src/vs/platform/contextkey/test/common/contextkey.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ContextKeyExpr, ContextKeyExpression, implies } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/platform/contextkey/test/common/parser.test.ts b/src/vs/platform/contextkey/test/common/parser.test.ts index c5be259634180..17bfa468ec9eb 100644 --- a/src/vs/platform/contextkey/test/common/parser.test.ts +++ b/src/vs/platform/contextkey/test/common/parser.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Parser } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/platform/contextkey/test/common/scanner.test.ts b/src/vs/platform/contextkey/test/common/scanner.test.ts index df897db9e8a5d..dacbfbebbdd05 100644 --- a/src/vs/platform/contextkey/test/common/scanner.test.ts +++ b/src/vs/platform/contextkey/test/common/scanner.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Scanner, Token, TokenType } from 'vs/platform/contextkey/common/scanner'; diff --git a/src/vs/platform/environment/test/electron-main/environmentMainService.test.ts b/src/vs/platform/environment/test/electron-main/environmentMainService.test.ts index 78fd73545201a..268f5ce52bb76 100644 --- a/src/vs/platform/environment/test/electron-main/environmentMainService.test.ts +++ b/src/vs/platform/environment/test/electron-main/environmentMainService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import product from 'vs/platform/product/common/product'; import { isLinux } from 'vs/base/common/platform'; diff --git a/src/vs/platform/environment/test/node/argv.test.ts b/src/vs/platform/environment/test/node/argv.test.ts index a188b52b71130..a82be9607d068 100644 --- a/src/vs/platform/environment/test/node/argv.test.ts +++ b/src/vs/platform/environment/test/node/argv.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { formatOptions, Option, OptionDescriptions, Subcommand, parseArgs, ErrorReporter } from 'vs/platform/environment/node/argv'; import { addArg } from 'vs/platform/environment/node/argvHelper'; diff --git a/src/vs/platform/environment/test/node/environmentService.test.ts b/src/vs/platform/environment/test/node/environmentService.test.ts index ffe418fc70263..6f256621040aa 100644 --- a/src/vs/platform/environment/test/node/environmentService.test.ts +++ b/src/vs/platform/environment/test/node/environmentService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { parseExtensionHostDebugPort } from 'vs/platform/environment/common/environmentService'; import { OPTIONS, parseArgs } from 'vs/platform/environment/node/argv'; diff --git a/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts b/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts index 68128a214fd5e..81db8b4726705 100644 --- a/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts +++ b/src/vs/platform/environment/test/node/nativeModules.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import { flakySuite } from 'vs/base/test/common/testUtils'; @@ -19,7 +19,7 @@ flakySuite('Native Modules (all platforms)', () => { }); test('native-is-elevated', async () => { - const isElevated = await import('native-is-elevated'); + const isElevated = (await import('native-is-elevated')).default; assert.ok(typeof isElevated === 'function', testErrorMessage('native-is-elevated ')); const result = isElevated(); diff --git a/src/vs/platform/environment/test/node/userDataPath.test.ts b/src/vs/platform/environment/test/node/userDataPath.test.ts index 644260cff8ff3..72278e46ac0f4 100644 --- a/src/vs/platform/environment/test/node/userDataPath.test.ts +++ b/src/vs/platform/environment/test/node/userDataPath.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { OPTIONS, parseArgs } from 'vs/platform/environment/node/argv'; import { getUserDataPath } from 'vs/platform/environment/node/userDataPath'; diff --git a/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts b/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts index ce93c6e73d732..178293d88742a 100644 --- a/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts +++ b/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { getDomainsOfRemotes, getRemotes } from 'vs/platform/extensionManagement/common/configRemotes'; diff --git a/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts b/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts index cebafab4714a7..a4c9afd9c5826 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { isUUID } from 'vs/base/common/uuid'; diff --git a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts index d0813771c1878..1c3d62f7f0b92 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionKey } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; diff --git a/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts b/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts index a3c2603a1eb36..e23d69b9371b0 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { deepClone } from 'vs/base/common/objects'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ILocalizedString } from 'vs/platform/action/common/action'; diff --git a/src/vs/platform/extensionManagement/test/common/extensionsProfileScannerService.test.ts b/src/vs/platform/extensionManagement/test/common/extensionsProfileScannerService.test.ts index 5e71b85714e77..d94305a83fc55 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionsProfileScannerService.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionsProfileScannerService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { VSBuffer } from 'vs/base/common/buffer'; import { joinPath } from 'vs/base/common/resources'; diff --git a/src/vs/platform/extensionManagement/test/node/extensionDownloader.test.ts b/src/vs/platform/extensionManagement/test/node/extensionDownloader.test.ts index e803de72c79df..bae93bde80352 100644 --- a/src/vs/platform/extensionManagement/test/node/extensionDownloader.test.ts +++ b/src/vs/platform/extensionManagement/test/node/extensionDownloader.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { platform } from 'vs/base/common/platform'; import { arch } from 'vs/base/common/process'; diff --git a/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts b/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts index 9e72c1c174ab6..8c0569fe67b9a 100644 --- a/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts +++ b/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { dirname, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/platform/extensions/test/common/extensionValidator.test.ts b/src/vs/platform/extensions/test/common/extensionValidator.test.ts index 9060783778ac2..a9e95e6dcc7a5 100644 --- a/src/vs/platform/extensions/test/common/extensionValidator.test.ts +++ b/src/vs/platform/extensions/test/common/extensionValidator.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from 'vs/platform/extensions/common/extensionValidator'; diff --git a/src/vs/platform/files/test/browser/fileService.test.ts b/src/vs/platform/files/test/browser/fileService.test.ts index 114e98adefc17..166cf54968898 100644 --- a/src/vs/platform/files/test/browser/fileService.test.ts +++ b/src/vs/platform/files/test/browser/fileService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DeferredPromise, timeout } from 'vs/base/common/async'; import { bufferToReadable, bufferToStream, VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/platform/files/test/browser/indexedDBFileService.integrationTest.ts b/src/vs/platform/files/test/browser/indexedDBFileService.integrationTest.ts index 9290520ecdae4..c5f542918bafb 100644 --- a/src/vs/platform/files/test/browser/indexedDBFileService.integrationTest.ts +++ b/src/vs/platform/files/test/browser/indexedDBFileService.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IndexedDB } from 'vs/base/browser/indexedDB'; import { bufferToReadable, bufferToStream, VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/platform/files/test/common/files.test.ts b/src/vs/platform/files/test/common/files.test.ts index 1de7f86398af5..245d2222b9d4c 100644 --- a/src/vs/platform/files/test/common/files.test.ts +++ b/src/vs/platform/files/test/common/files.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isEqual, isEqualOrParent } from 'vs/base/common/extpath'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/platform/files/test/common/watcher.test.ts b/src/vs/platform/files/test/common/watcher.test.ts index 23776f54d82a4..6d7bb7f3b8322 100644 --- a/src/vs/platform/files/test/common/watcher.test.ts +++ b/src/vs/platform/files/test/common/watcher.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { isLinux, isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/platform/files/test/node/diskFileService.integrationTest.ts b/src/vs/platform/files/test/node/diskFileService.integrationTest.ts index fbf1ea0d870c5..fc2f28ffa9741 100644 --- a/src/vs/platform/files/test/node/diskFileService.integrationTest.ts +++ b/src/vs/platform/files/test/node/diskFileService.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { createReadStream, existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; import { tmpdir } from 'os'; import { timeout } from 'vs/base/common/async'; diff --git a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts index 836b67ed9d222..f4eaa0f2aac66 100644 --- a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { tmpdir } from 'os'; import { basename, dirname, join } from 'vs/base/common/path'; import { Promises, RimRafMode } from 'vs/base/node/pfs'; diff --git a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts index db85e28f34143..5bbeefc9036d3 100644 --- a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { realpathSync } from 'fs'; import { tmpdir } from 'os'; import { timeout } from 'vs/base/common/async'; diff --git a/src/vs/platform/instantiation/test/common/graph.test.ts b/src/vs/platform/instantiation/test/common/graph.test.ts index c5abc22ccff82..99e8e0e75a0bf 100644 --- a/src/vs/platform/instantiation/test/common/graph.test.ts +++ b/src/vs/platform/instantiation/test/common/graph.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Graph } from 'vs/platform/instantiation/common/graph'; diff --git a/src/vs/platform/instantiation/test/common/instantiationService.test.ts b/src/vs/platform/instantiation/test/common/instantiationService.test.ts index fd5bb77d2f72a..70718ba712d9b 100644 --- a/src/vs/platform/instantiation/test/common/instantiationService.test.ts +++ b/src/vs/platform/instantiation/test/common/instantiationService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { dispose } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index 2f79c811d5e73..88aa86a05d3b3 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { createSimpleKeybinding, ResolvedKeybinding, KeyCodeChord, Keybinding } from 'vs/base/common/keybindings'; import { Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts b/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts index dfc5df1e096b8..b88a747e454c0 100644 --- a/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts +++ b/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { OperatingSystem } from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts b/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts index 54bd2a6761dad..3fccf38754050 100644 --- a/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts +++ b/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { decodeKeybinding, createSimpleKeybinding, KeyCodeChord } from 'vs/base/common/keybindings'; import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { OS } from 'vs/base/common/platform'; diff --git a/src/vs/platform/markers/test/common/markerService.test.ts b/src/vs/platform/markers/test/common/markerService.test.ts index d8ebccf746fd2..1b9916a8adfd9 100644 --- a/src/vs/platform/markers/test/common/markerService.test.ts +++ b/src/vs/platform/markers/test/common/markerService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; diff --git a/src/vs/platform/opener/test/common/opener.test.ts b/src/vs/platform/opener/test/common/opener.test.ts index 35b6e027d66f3..93ee50f9901c8 100644 --- a/src/vs/platform/opener/test/common/opener.test.ts +++ b/src/vs/platform/opener/test/common/opener.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { extractSelection, withSelection } from 'vs/platform/opener/common/opener'; diff --git a/src/vs/platform/progress/test/common/progress.test.ts b/src/vs/platform/progress/test/common/progress.test.ts index 85bce306781a1..24c2ddb78defb 100644 --- a/src/vs/platform/progress/test/common/progress.test.ts +++ b/src/vs/platform/progress/test/common/progress.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { AsyncProgress } from 'vs/platform/progress/common/progress'; diff --git a/src/vs/platform/quickinput/test/browser/quickinput.test.ts b/src/vs/platform/quickinput/test/browser/quickinput.test.ts index 8e8fc694be0c9..6e7cb804d5a0a 100644 --- a/src/vs/platform/quickinput/test/browser/quickinput.test.ts +++ b/src/vs/platform/quickinput/test/browser/quickinput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { unthemedInboxStyles } from 'vs/base/browser/ui/inputbox/inputBox'; import { unthemedButtonStyles } from 'vs/base/browser/ui/button/button'; import { unthemedListStyles } from 'vs/base/browser/ui/list/listWidget'; diff --git a/src/vs/platform/registry/test/common/platform.test.ts b/src/vs/platform/registry/test/common/platform.test.ts index 3fe9188fa8d04..8ec965d503b34 100644 --- a/src/vs/platform/registry/test/common/platform.test.ts +++ b/src/vs/platform/registry/test/common/platform.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isFunction } from 'vs/base/common/types'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/platform/remote/test/common/remoteHosts.test.ts b/src/vs/platform/remote/test/common/remoteHosts.test.ts index cfbc105f465f7..ed564551df9a8 100644 --- a/src/vs/platform/remote/test/common/remoteHosts.test.ts +++ b/src/vs/platform/remote/test/common/remoteHosts.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { parseAuthorityWithOptionalPort, parseAuthorityWithPort } from 'vs/platform/remote/common/remoteHosts'; diff --git a/src/vs/platform/remote/test/electron-sandbox/remoteAuthorityResolverService.test.ts b/src/vs/platform/remote/test/electron-sandbox/remoteAuthorityResolverService.test.ts index a5bacbb8c86bb..67790a807c634 100644 --- a/src/vs/platform/remote/test/electron-sandbox/remoteAuthorityResolverService.test.ts +++ b/src/vs/platform/remote/test/electron-sandbox/remoteAuthorityResolverService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import product from 'vs/platform/product/common/product'; import { IProductService } from 'vs/platform/product/common/productService'; diff --git a/src/vs/platform/secrets/test/common/secrets.test.ts b/src/vs/platform/secrets/test/common/secrets.test.ts index b3a048af2f25f..50def3a9a92a6 100644 --- a/src/vs/platform/secrets/test/common/secrets.test.ts +++ b/src/vs/platform/secrets/test/common/secrets.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IEncryptionService, KnownStorageProvider } from 'vs/platform/encryption/common/encryptionService'; diff --git a/src/vs/platform/state/test/node/state.test.ts b/src/vs/platform/state/test/node/state.test.ts index 493d78d0e5179..acce49d3e9c6a 100644 --- a/src/vs/platform/state/test/node/state.test.ts +++ b/src/vs/platform/state/test/node/state.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { readFileSync } from 'fs'; import { tmpdir } from 'os'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/platform/telemetry/test/browser/1dsAppender.test.ts b/src/vs/platform/telemetry/test/browser/1dsAppender.test.ts index 2ee6f9bc99b6c..33a22c391b292 100644 --- a/src/vs/platform/telemetry/test/browser/1dsAppender.test.ts +++ b/src/vs/platform/telemetry/test/browser/1dsAppender.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import type { ITelemetryItem, ITelemetryUnloadState } from '@microsoft/1ds-core-js'; -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { OneDataSystemWebAppender } from 'vs/platform/telemetry/browser/1dsAppender'; import { IAppInsightsCore } from 'vs/platform/telemetry/common/1dsAppender'; diff --git a/src/vs/platform/telemetry/test/browser/telemetryService.test.ts b/src/vs/platform/telemetry/test/browser/telemetryService.test.ts index 8524e9a6996ec..bc75667e9496f 100644 --- a/src/vs/platform/telemetry/test/browser/telemetryService.test.ts +++ b/src/vs/platform/telemetry/test/browser/telemetryService.test.ts @@ -2,9 +2,9 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; -import * as sinonTest from 'sinon-test'; +import sinonTest from 'sinon-test'; import { mainWindow } from 'vs/base/browser/window'; import * as Errors from 'vs/base/common/errors'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts b/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts index 8de29c1eeeb33..2fe9b7a647778 100644 --- a/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts +++ b/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/platform/terminal/test/common/terminalRecorder.test.ts b/src/vs/platform/terminal/test/common/terminalRecorder.test.ts index b1c523a2228e4..66b317c468b6e 100644 --- a/src/vs/platform/terminal/test/common/terminalRecorder.test.ts +++ b/src/vs/platform/terminal/test/common/terminalRecorder.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ReplayEntry } from 'vs/platform/terminal/common/terminalProcess'; import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder'; diff --git a/src/vs/platform/tunnel/test/common/tunnel.test.ts b/src/vs/platform/tunnel/test/common/tunnel.test.ts index d86d3f47bd753..ae32707eb3051 100644 --- a/src/vs/platform/tunnel/test/common/tunnel.test.ts +++ b/src/vs/platform/tunnel/test/common/tunnel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { extractLocalHostUriMetaDataForPortMapping, diff --git a/src/vs/platform/undoRedo/test/common/undoRedoService.test.ts b/src/vs/platform/undoRedo/test/common/undoRedoService.test.ts index 27d69e4e5aced..32d33a7d23c5b 100644 --- a/src/vs/platform/undoRedo/test/common/undoRedoService.test.ts +++ b/src/vs/platform/undoRedo/test/common/undoRedoService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/uriIdentity/test/common/uriIdentityService.test.ts b/src/vs/platform/uriIdentity/test/common/uriIdentityService.test.ts index 32dde9e11d704..339e86bf938de 100644 --- a/src/vs/platform/uriIdentity/test/common/uriIdentityService.test.ts +++ b/src/vs/platform/uriIdentity/test/common/uriIdentityService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; import { mock } from 'vs/base/test/common/mock'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; diff --git a/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts b/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts index b6a05ce558fc2..8f0c5641d9f37 100644 --- a/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts +++ b/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts index 7e898dd15fa45..a7e2da87458b5 100644 --- a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts +++ b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FileService } from 'vs/platform/files/common/fileService'; import { NullLogService } from 'vs/platform/log/common/log'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts index 48a68ee98a186..3302b56ea6b0d 100644 --- a/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts +++ b/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { InMemoryStorageDatabase, IStorageItemsChangeEvent, IUpdateRequest, Storage } from 'vs/base/parts/storage/common/storage'; diff --git a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts index 515b2ce80da2b..8797fafc6c4b7 100644 --- a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts +++ b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FileService } from 'vs/platform/files/common/fileService'; import { NullLogService } from 'vs/platform/log/common/log'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts b/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts index 3436a31fb0782..1ecc7b900a419 100644 --- a/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { merge } from 'vs/platform/userDataSync/common/extensionsMerge'; import { ILocalSyncExtension, ISyncExtension } from 'vs/platform/userDataSync/common/userDataSync'; diff --git a/src/vs/platform/userDataSync/test/common/globalStateMerge.test.ts b/src/vs/platform/userDataSync/test/common/globalStateMerge.test.ts index 3c61cd98aca10..7a17fac286d42 100644 --- a/src/vs/platform/userDataSync/test/common/globalStateMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/globalStateMerge.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; import { merge } from 'vs/platform/userDataSync/common/globalStateMerge'; diff --git a/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts b/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts index d27a2d8d6ac1b..7d3ecaca73268 100644 --- a/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/platform/userDataSync/test/common/keybindingsMerge.test.ts b/src/vs/platform/userDataSync/test/common/keybindingsMerge.test.ts index 935c553a8727e..c7a1f8675e7fe 100644 --- a/src/vs/platform/userDataSync/test/common/keybindingsMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/keybindingsMerge.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { merge } from 'vs/platform/userDataSync/common/keybindingsMerge'; import { TestUserDataSyncUtilService } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; diff --git a/src/vs/platform/userDataSync/test/common/keybindingsSync.test.ts b/src/vs/platform/userDataSync/test/common/keybindingsSync.test.ts index 4799201077a13..660185fd8fda5 100644 --- a/src/vs/platform/userDataSync/test/common/keybindingsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/keybindingsSync.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/platform/userDataSync/test/common/settingsMerge.test.ts b/src/vs/platform/userDataSync/test/common/settingsMerge.test.ts index 274ac5ee6962c..625df21215c5a 100644 --- a/src/vs/platform/userDataSync/test/common/settingsMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/settingsMerge.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { addSetting, merge, updateIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge'; import type { IConflictSetting } from 'vs/platform/userDataSync/common/userDataSync'; diff --git a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts index 0cd110208b813..39246f25ce14f 100644 --- a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event } from 'vs/base/common/event'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; diff --git a/src/vs/platform/userDataSync/test/common/snippetsMerge.test.ts b/src/vs/platform/userDataSync/test/common/snippetsMerge.test.ts index f41039cbb9ecc..50e5caa545f04 100644 --- a/src/vs/platform/userDataSync/test/common/snippetsMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/snippetsMerge.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { merge } from 'vs/platform/userDataSync/common/snippetsMerge'; diff --git a/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts b/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts index fc9644c22450f..97f4ab83f13f2 100644 --- a/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { IStringDictionary } from 'vs/base/common/collections'; import { dirname, joinPath } from 'vs/base/common/resources'; diff --git a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts index 1e854038a9d01..a336ca3241166 100644 --- a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts +++ b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Barrier } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/platform/userDataSync/test/common/tasksSync.test.ts b/src/vs/platform/userDataSync/test/common/tasksSync.test.ts index 73fe0a6b23d52..c6cfd18a44bd4 100644 --- a/src/vs/platform/userDataSync/test/common/tasksSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/tasksSync.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts index 47cde8003c7af..e9c86afd301bd 100644 --- a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event } from 'vs/base/common/event'; import { joinPath } from 'vs/base/common/resources'; diff --git a/src/vs/platform/userDataSync/test/common/userDataProfilesManifestMerge.test.ts b/src/vs/platform/userDataSync/test/common/userDataProfilesManifestMerge.test.ts index 40cc6f3623dcf..e60f53147992f 100644 --- a/src/vs/platform/userDataSync/test/common/userDataProfilesManifestMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataProfilesManifestMerge.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IUserDataProfile, toUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile'; diff --git a/src/vs/platform/userDataSync/test/common/userDataProfilesManifestSync.test.ts b/src/vs/platform/userDataSync/test/common/userDataProfilesManifestSync.test.ts index 2d6d7de2bf0bc..2227e3d11826c 100644 --- a/src/vs/platform/userDataSync/test/common/userDataProfilesManifestSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataProfilesManifestSync.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts index 665d09ed41eae..a06d711277e60 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { dirname, joinPath } from 'vs/base/common/resources'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts b/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts index db83d62e16330..2a69d9d3ebfbb 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { newWriteableBufferStream } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts b/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts index 490d6858a62dc..f3ce84f9c7ac5 100644 --- a/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts +++ b/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { join } from 'vs/base/common/path'; diff --git a/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts b/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts index 0b96b1bf740da..65d1a9937f980 100644 --- a/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts +++ b/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { tmpdir } from 'os'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/platform/workspace/test/common/workspace.test.ts b/src/vs/platform/workspace/test/common/workspace.test.ts index 2464d5e4a3576..fb8c1cf18e65d 100644 --- a/src/vs/platform/workspace/test/common/workspace.test.ts +++ b/src/vs/platform/workspace/test/common/workspace.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { join } from 'vs/base/common/path'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; diff --git a/src/vs/platform/workspaces/test/common/workspaces.test.ts b/src/vs/platform/workspaces/test/common/workspaces.test.ts index a1f2f262d0075..a08f1035ce139 100644 --- a/src/vs/platform/workspaces/test/common/workspaces.test.ts +++ b/src/vs/platform/workspaces/test/common/workspaces.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ISerializedSingleFolderWorkspaceIdentifier, ISerializedWorkspaceIdentifier, reviveIdentifier, hasWorkspaceFileExtension, isWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IEmptyWorkspaceIdentifier, toWorkspaceIdentifier, isEmptyWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; diff --git a/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts b/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts index 56e4d92fdc983..42fd463b9bf4e 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'vs/base/common/path'; diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts index 2677ffba87dcc..f2102c3b0982e 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { tmpdir } from 'os'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts index 0234ce57bb9a3..fe5bd2994c80c 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as fs from 'fs'; import * as os from 'os'; import { isUNC, toSlashes } from 'vs/base/common/extpath'; diff --git a/src/vs/server/test/node/serverConnectionToken.test.ts b/src/vs/server/test/node/serverConnectionToken.test.ts index b624dd6d67660..b04dab4d30852 100644 --- a/src/vs/server/test/node/serverConnectionToken.test.ts +++ b/src/vs/server/test/node/serverConnectionToken.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; diff --git a/src/vs/workbench/api/test/browser/extHost.api.impl.test.ts b/src/vs/workbench/api/test/browser/extHost.api.impl.test.ts index 35e7ff353606e..d5db3ca4683f9 100644 --- a/src/vs/workbench/api/test/browser/extHost.api.impl.test.ts +++ b/src/vs/workbench/api/test/browser/extHost.api.impl.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { originalFSPath } from 'vs/base/common/resources'; import { isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts b/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts index f5dfeeb258c47..da5e8bb9e6f04 100644 --- a/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts +++ b/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts @@ -17,7 +17,7 @@ import 'vs/editor/contrib/suggest/browser/suggest'; import 'vs/editor/contrib/rename/browser/rename'; import 'vs/editor/contrib/inlayHints/browser/inlayHintsController'; -import * as assert from 'assert'; +import assert from 'assert'; import { setUnexpectedErrorHandler, errorHandler } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/api/test/browser/extHostAuthentication.integrationTest.ts b/src/vs/workbench/api/test/browser/extHostAuthentication.integrationTest.ts index dd77886bbf05b..de02ffff74523 100644 --- a/src/vs/workbench/api/test/browser/extHostAuthentication.integrationTest.ts +++ b/src/vs/workbench/api/test/browser/extHostAuthentication.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogService'; diff --git a/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts b/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts index 045f3d77cc136..be11d3a7353ba 100644 --- a/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts +++ b/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { MainContext, IWorkspaceEditDto, MainThreadBulkEditsShape, IWorkspaceTextEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/extHostCommands.test.ts b/src/vs/workbench/api/test/browser/extHostCommands.test.ts index 5697ffe78cfe3..5353ca9c069e9 100644 --- a/src/vs/workbench/api/test/browser/extHostCommands.test.ts +++ b/src/vs/workbench/api/test/browser/extHostCommands.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadCommandsShape } from 'vs/workbench/api/common/extHost.protocol'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; diff --git a/src/vs/workbench/api/test/browser/extHostConfiguration.test.ts b/src/vs/workbench/api/test/browser/extHostConfiguration.test.ts index ef43b937a9883..298299b3e56b3 100644 --- a/src/vs/workbench/api/test/browser/extHostConfiguration.test.ts +++ b/src/vs/workbench/api/test/browser/extHostConfiguration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; diff --git a/src/vs/workbench/api/test/browser/extHostDecorations.test.ts b/src/vs/workbench/api/test/browser/extHostDecorations.test.ts index 26b419f6e064e..8dca84bc5c1aa 100644 --- a/src/vs/workbench/api/test/browser/extHostDecorations.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDecorations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts b/src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts index 6c6de8c7e170d..2c866daee54f8 100644 --- a/src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI, UriComponents } from 'vs/base/common/uri'; import { DiagnosticCollection, ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import { Diagnostic, DiagnosticSeverity, Range, DiagnosticRelatedInformation, Location } from 'vs/workbench/api/common/extHostTypes'; diff --git a/src/vs/workbench/api/test/browser/extHostDocumentContentProvider.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentContentProvider.test.ts index 2132482c3aa49..f4795adebb491 100644 --- a/src/vs/workbench/api/test/browser/extHostDocumentContentProvider.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentContentProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; diff --git a/src/vs/workbench/api/test/browser/extHostDocumentData.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentData.test.ts index 3f60f5ef89885..298a2811954c7 100644 --- a/src/vs/workbench/api/test/browser/extHostDocumentData.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentData.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtHostDocumentData } from 'vs/workbench/api/common/extHostDocumentData'; import { Position } from 'vs/workbench/api/common/extHostTypes'; diff --git a/src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts index 632487d43c0a3..9f0a28ec02ad5 100644 --- a/src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; diff --git a/src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts index 3f4255c49c8dd..eda97538749f5 100644 --- a/src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; diff --git a/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts b/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts index cedfaa5e426fb..75f2ccce2d7f5 100644 --- a/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts +++ b/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import type * as vscode from 'vscode'; -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { IEditorTabDto, IEditorTabGroupDto, MainThreadEditorTabsShape, TabInputKind, TabModelOperationKind, TextInputDto } from 'vs/workbench/api/common/extHost.protocol'; diff --git a/src/vs/workbench/api/test/browser/extHostFileSystemEventService.test.ts b/src/vs/workbench/api/test/browser/extHostFileSystemEventService.test.ts index ba5e260f4d76a..953aff7ea0c58 100644 --- a/src/vs/workbench/api/test/browser/extHostFileSystemEventService.test.ts +++ b/src/vs/workbench/api/test/browser/extHostFileSystemEventService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ExtHostFileSystemEventService } from 'vs/workbench/api/common/extHostFileSystemEventService'; import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { NullLogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts index 585e3745c107c..6b7de3ca7167c 100644 --- a/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { setUnexpectedErrorHandler, errorHandler } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/extHostMessagerService.test.ts b/src/vs/workbench/api/test/browser/extHostMessagerService.test.ts index 465663c8288a4..a88e5a79bb92c 100644 --- a/src/vs/workbench/api/test/browser/extHostMessagerService.test.ts +++ b/src/vs/workbench/api/test/browser/extHostMessagerService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MainThreadMessageService } from 'vs/workbench/api/browser/mainThreadMessageService'; import { IDialogService, IPrompt, IPromptButton } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService, INotification, NoOpNotification, INotificationHandle, Severity, IPromptChoice, IPromptOptions, IStatusMessageOptions, INotificationSource, INotificationSourceFilter, NotificationsFilter } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/api/test/browser/extHostNotebook.test.ts b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts index 5a7ed7e4e70bc..49a2f011645cc 100644 --- a/src/vs/workbench/api/test/browser/extHostNotebook.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as vscode from 'vscode'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; diff --git a/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts b/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts index 5a7e6f434c28b..a1341bad58c69 100644 --- a/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Barrier } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; @@ -344,4 +344,3 @@ suite('NotebookKernel', function () { assert.ok(found); }); }); - diff --git a/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts b/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts index 97bfb308b9f41..789ffcd0bf4a0 100644 --- a/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ExtensionIdentifier, IExtensionDescription, TargetPlatform } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/api/test/browser/extHostTesting.test.ts b/src/vs/workbench/api/test/browser/extHostTesting.test.ts index 1d4da28f1eadf..251ead7ac948f 100644 --- a/src/vs/workbench/api/test/browser/extHostTesting.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTesting.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { timeout } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; diff --git a/src/vs/workbench/api/test/browser/extHostTextEditor.test.ts b/src/vs/workbench/api/test/browser/extHostTextEditor.test.ts index 106a30df4f8b0..98bc776615106 100644 --- a/src/vs/workbench/api/test/browser/extHostTextEditor.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTextEditor.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Lazy } from 'vs/base/common/lazy'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/api/test/browser/extHostTreeViews.test.ts b/src/vs/workbench/api/test/browser/extHostTreeViews.test.ts index 3f780a0329903..1e442c1ed88fc 100644 --- a/src/vs/workbench/api/test/browser/extHostTreeViews.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTreeViews.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { Emitter } from 'vs/base/common/event'; import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews'; diff --git a/src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts b/src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts index ab38b202b6e45..40a148042ff44 100644 --- a/src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { MarkdownString, NotebookCellOutputItem, NotebookData, LanguageSelector, WorkspaceEdit } from 'vs/workbench/api/common/extHostTypeConverters'; import { isEmptyObject } from 'vs/base/common/types'; diff --git a/src/vs/workbench/api/test/browser/extHostTypes.test.ts b/src/vs/workbench/api/test/browser/extHostTypes.test.ts index 6cef861c9c8f9..3d1ff69b2324b 100644 --- a/src/vs/workbench/api/test/browser/extHostTypes.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTypes.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import * as types from 'vs/workbench/api/common/extHostTypes'; import { isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/api/test/browser/extHostWebview.test.ts b/src/vs/workbench/api/test/browser/extHostWebview.test.ts index b741292bd00cb..e87300aeb0541 100644 --- a/src/vs/workbench/api/test/browser/extHostWebview.test.ts +++ b/src/vs/workbench/api/test/browser/extHostWebview.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/extHostWorkspace.test.ts b/src/vs/workbench/api/test/browser/extHostWorkspace.test.ts index 6abca46d3ff11..5b9dd312c74d9 100644 --- a/src/vs/workbench/api/test/browser/extHostWorkspace.test.ts +++ b/src/vs/workbench/api/test/browser/extHostWorkspace.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { basename } from 'vs/base/common/path'; import { URI, UriComponents } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts b/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts index 959705f233cb7..c6ef6939bfedf 100644 --- a/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadBulkEdits.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IWorkspaceTextEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { mock } from 'vs/base/test/common/mock'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts b/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts index 0c5d47544d105..d7503ca0d507f 100644 --- a/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; diff --git a/src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts b/src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts index a3a8e47755ca1..0c5a02f660647 100644 --- a/src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts b/src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts index bf67789ff1011..2f89e98e3586b 100644 --- a/src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { URI, UriComponents } from 'vs/base/common/uri'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; diff --git a/src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts b/src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts index 8eaa58798d793..949c2a78ffa72 100644 --- a/src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { MainThreadDocumentContentProviders } from 'vs/workbench/api/browser/mainThreadDocumentContentProviders'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; diff --git a/src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts b/src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts index 8331e51cc0381..fee65f2111975 100644 --- a/src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { BoundModelReferenceCollection } from 'vs/workbench/api/browser/mainThreadDocuments'; import { timeout } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts index d7190f1fe5c50..f0d0538ce226f 100644 --- a/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/browser/mainThreadDocumentsAndEditors'; import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; diff --git a/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts b/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts index 9809814a6c032..1ca165c1b5fcb 100644 --- a/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { DisposableStore, IReference, ImmortalReference } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/test/browser/mainThreadManagedSockets.test.ts b/src/vs/workbench/api/test/browser/mainThreadManagedSockets.test.ts index 8a714d8130dd9..dd20e3cd70cff 100644 --- a/src/vs/workbench/api/test/browser/mainThreadManagedSockets.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadManagedSockets.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { disposableTimeout, timeout } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts b/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts index 57b58ab67f6aa..f4ead1836b2f7 100644 --- a/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as assert from 'assert'; +import assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; diff --git a/src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts b/src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts index 5234d7abb3427..c784f4189507b 100644 --- a/src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts b/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts index 3a56656608b6c..04b5fc7847e0b 100644 --- a/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts +++ b/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { promiseWithResolvers, timeout } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/api/test/common/extensionHostMain.test.ts b/src/vs/workbench/api/test/common/extensionHostMain.test.ts index 928c06a1b2c76..1c5acf0e88821 100644 --- a/src/vs/workbench/api/test/common/extensionHostMain.test.ts +++ b/src/vs/workbench/api/test/common/extensionHostMain.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { SerializedError, errorHandler, onUnexpectedError } from 'vs/base/common/errors'; import { isFirefox, isSafari } from 'vs/base/common/platform'; import { TernarySearchTree } from 'vs/base/common/ternarySearchTree'; diff --git a/src/vs/workbench/api/test/node/extHostSearch.test.ts b/src/vs/workbench/api/test/node/extHostSearch.test.ts index 1502ef3f565ae..9b3b96a10c1e4 100644 --- a/src/vs/workbench/api/test/node/extHostSearch.test.ts +++ b/src/vs/workbench/api/test/node/extHostSearch.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mapArrayOrNot } from 'vs/base/common/arrays'; import { timeout } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/api/test/node/extHostTunnelService.test.ts b/src/vs/workbench/api/test/node/extHostTunnelService.test.ts index 2f567ef7f4b33..57fe15e52b43f 100644 --- a/src/vs/workbench/api/test/node/extHostTunnelService.test.ts +++ b/src/vs/workbench/api/test/node/extHostTunnelService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { findPorts, getRootProcesses, getSockets, loadConnectionTable, loadListeningPorts, parseIpAddress, tryFindRootPorts } from 'vs/workbench/api/node/extHostTunnelService'; const tcp = diff --git a/src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts b/src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts index 22c507ca0b336..dc00b4d61d275 100644 --- a/src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts +++ b/src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI } from 'vs/base/common/uri'; import { mockObject } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/contrib/bulkEdit/test/browser/bulkEditPreview.test.ts b/src/vs/workbench/contrib/bulkEdit/test/browser/bulkEditPreview.test.ts index a05e30502cc88..50cd0b41f8cce 100644 --- a/src/vs/workbench/contrib/bulkEdit/test/browser/bulkEditPreview.test.ts +++ b/src/vs/workbench/contrib/bulkEdit/test/browser/bulkEditPreview.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { IFileService } from 'vs/platform/files/common/files'; import { mock } from 'vs/workbench/test/common/workbenchTestServices'; diff --git a/src/vs/workbench/contrib/chat/test/browser/chatVariables.test.ts b/src/vs/workbench/contrib/chat/test/browser/chatVariables.test.ts index dcbe7a1782acb..2da25bc9817a2 100644 --- a/src/vs/workbench/contrib/chat/test/browser/chatVariables.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/chatVariables.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/contrib/chat/test/common/chatAgents.test.ts b/src/vs/workbench/contrib/chat/test/common/chatAgents.test.ts index 21bd0b3930ffa..f14ffdaa65188 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatAgents.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatAgents.test.ts @@ -8,7 +8,7 @@ import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/uti import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ChatAgentService, IChatAgentData, IChatAgentImplementation, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; -import * as assert from 'assert'; +import assert from 'assert'; const testAgentId = 'testAgent'; const testAgentData: IChatAgentData = { diff --git a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts index b9f38a04549b8..e7fb3834f67fb 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/chat/test/common/chatService.test.ts b/src/vs/workbench/contrib/chat/test/common/chatService.test.ts index 1e9ad196f8b68..cf1f2a174d597 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI } from 'vs/base/common/uri'; import { assertSnapshot } from 'vs/base/test/common/snapshot'; diff --git a/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts b/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts index 314b4589e312e..c6d32a8d93643 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { getNWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; diff --git a/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts b/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts index 9bf3d63938fe6..3f396bd5184a9 100644 --- a/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts b/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts index 2ff31b0173c85..144d996b5ae04 100644 --- a/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { IMarkdownString } from 'vs/base/common/htmlContent'; diff --git a/src/vs/workbench/contrib/chat/test/electron-sandbox/voiceChatActions.test.ts b/src/vs/workbench/contrib/chat/test/electron-sandbox/voiceChatActions.test.ts index 249fd8e457c6b..85d4a9cdb2fa7 100644 --- a/src/vs/workbench/contrib/chat/test/electron-sandbox/voiceChatActions.test.ts +++ b/src/vs/workbench/contrib/chat/test/electron-sandbox/voiceChatActions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { parseNextChatResponseChunk } from 'vs/workbench/contrib/chat/electron-sandbox/actions/voiceChatActions'; diff --git a/src/vs/workbench/contrib/codeEditor/test/browser/saveParticipant.test.ts b/src/vs/workbench/contrib/codeEditor/test/browser/saveParticipant.test.ts index f89603047934e..42cc4253ad20e 100644 --- a/src/vs/workbench/contrib/codeEditor/test/browser/saveParticipant.test.ts +++ b/src/vs/workbench/contrib/codeEditor/test/browser/saveParticipant.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FinalNewLineParticipant, TrimFinalNewLinesParticipant, TrimWhitespaceParticipant } from 'vs/workbench/contrib/codeEditor/browser/saveParticipants'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; diff --git a/src/vs/workbench/contrib/codeEditor/test/node/autoindent.test.ts b/src/vs/workbench/contrib/codeEditor/test/node/autoindent.test.ts index 10b9058bfb9cb..fe3632fb8d070 100644 --- a/src/vs/workbench/contrib/codeEditor/test/node/autoindent.test.ts +++ b/src/vs/workbench/contrib/codeEditor/test/node/autoindent.test.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; diff --git a/src/vs/workbench/contrib/comments/test/browser/commentsView.test.ts b/src/vs/workbench/contrib/comments/test/browser/commentsView.test.ts index 84e77afe298ca..9c7d9e80c1683 100644 --- a/src/vs/workbench/contrib/comments/test/browser/commentsView.test.ts +++ b/src/vs/workbench/contrib/comments/test/browser/commentsView.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IRange, Range } from 'vs/editor/common/core/range'; import { CommentsPanel } from 'vs/workbench/contrib/comments/browser/commentsView'; diff --git a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts index a5ba220e380c5..aa22ce774db34 100644 --- a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as dom from 'vs/base/browser/dom'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts b/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts index 6b47aa1dc3f18..292fa730381cc 100644 --- a/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { dispose } from 'vs/base/common/lifecycle'; import { URI as uri } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts index f5ec3d56c5adb..08c7f9096d8f9 100644 --- a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { ThemeIcon } from 'vs/base/common/themables'; import { Constants } from 'vs/base/common/uint'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts index c92a240a22055..41c662c091b8d 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isHTMLSpanElement } from 'vs/base/browser/dom'; import { Color, RGBA } from 'vs/base/common/color'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugConfigurationManager.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugConfigurationManager.test.ts index 71b53f1ab2522..6cde637373c15 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugConfigurationManager.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugConfigurationManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts index c45e6dba417c5..480c811fc87f8 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; import { findExpressionInStackFrame } from 'vs/workbench/contrib/debug/browser/debugHover'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugMemory.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugMemory.test.ts index 7647820f3d0bd..61e92664e502b 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugMemory.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugMemory.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { decodeBase64, encodeBase64, VSBuffer } from 'vs/base/common/buffer'; import { Emitter } from 'vs/base/common/event'; import { mockObject, MockObject } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugSession.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugSession.test.ts index a4b59eee38de0..b58f2509a7b01 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugSession.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugSession.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ThreadStatusScheduler } from 'vs/workbench/contrib/debug/browser/debugSession'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugSource.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugSource.test.ts index 672ae3c306195..aad31249a2c5f 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugSource.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugSource.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import { URI as uri } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts index 585497db087be..c57bb374b3d57 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IConfig } from 'vs/workbench/contrib/debug/common/debug'; import { formatPII, getExactExpressionStartAndEnd, getVisibleAndSorted } from 'vs/workbench/contrib/debug/common/debugUtils'; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugViewModel.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugViewModel.test.ts index d42de786cb5c3..6e2f76448ec38 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugViewModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugViewModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { NullLogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts index 6a38dac9fdc43..1b888a6e147ec 100644 --- a/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isHTMLAnchorElement } from 'vs/base/browser/dom'; import { isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/debug/test/browser/rawDebugSession.test.ts b/src/vs/workbench/contrib/debug/test/browser/rawDebugSession.test.ts index 3f3549c604e21..5a9f3f2f415d0 100644 --- a/src/vs/workbench/contrib/debug/test/browser/rawDebugSession.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/rawDebugSession.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mock, mockObject } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; diff --git a/src/vs/workbench/contrib/debug/test/browser/repl.test.ts b/src/vs/workbench/contrib/debug/test/browser/repl.test.ts index f385cbbb7b3de..54da8d61f1983 100644 --- a/src/vs/workbench/contrib/debug/test/browser/repl.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/repl.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TreeVisibility } from 'vs/base/browser/ui/tree/tree'; import { timeout } from 'vs/base/common/async'; import severity from 'vs/base/common/severity'; diff --git a/src/vs/workbench/contrib/debug/test/browser/watch.test.ts b/src/vs/workbench/contrib/debug/test/browser/watch.test.ts index dabf666859cd7..92b54afe7caa6 100644 --- a/src/vs/workbench/contrib/debug/test/browser/watch.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/watch.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { DebugModel, Expression } from 'vs/workbench/contrib/debug/common/debugModel'; import { createMockDebugModel } from 'vs/workbench/contrib/debug/test/browser/mockDebugModel'; diff --git a/src/vs/workbench/contrib/debug/test/common/abstractDebugAdapter.test.ts b/src/vs/workbench/contrib/debug/test/common/abstractDebugAdapter.test.ts index 2246b7fa2486b..cfcc1af8b877a 100644 --- a/src/vs/workbench/contrib/debug/test/common/abstractDebugAdapter.test.ts +++ b/src/vs/workbench/contrib/debug/test/common/abstractDebugAdapter.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { MockDebugAdapter } from 'vs/workbench/contrib/debug/test/common/mockDebug'; diff --git a/src/vs/workbench/contrib/debug/test/common/debugModel.test.ts b/src/vs/workbench/contrib/debug/test/common/debugModel.test.ts index 26c5549841b06..e3cf88f9b07f8 100644 --- a/src/vs/workbench/contrib/debug/test/common/debugModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/common/debugModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DeferredPromise } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { mockObject } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts index 4d2d38f1f651e..e6891cec75f67 100644 --- a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { join, normalize } from 'vs/base/common/path'; import * as platform from 'vs/base/common/platform'; import { IDebugAdapterExecutable, IConfig, IDebugSession, IAdapterManager } from 'vs/workbench/contrib/debug/common/debug'; diff --git a/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts b/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts index 9247a0ee6364a..89bb6968f5e9c 100644 --- a/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as crypto from 'crypto'; import * as net from 'net'; import * as platform from 'vs/base/common/platform'; diff --git a/src/vs/workbench/contrib/debug/test/node/terminals.test.ts b/src/vs/workbench/contrib/debug/test/node/terminals.test.ts index efdf2f940c3d4..bd81c9c13e238 100644 --- a/src/vs/workbench/contrib/debug/test/node/terminals.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/terminals.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { prepareCommand } from 'vs/workbench/contrib/debug/node/terminals'; diff --git a/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts b/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts index c6be96b073da1..244f3dfe5bcab 100644 --- a/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts +++ b/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts @@ -20,7 +20,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { mock } from 'vs/base/test/common/mock'; import * as sinon from 'sinon'; -import * as assert from 'assert'; +import assert from 'assert'; import { ChangeType, FileType, IEditSessionsLogService, IEditSessionsStorageService } from 'vs/workbench/contrib/editSessions/common/editSessions'; import { URI } from 'vs/base/common/uri'; import { joinPath } from 'vs/base/common/resources'; diff --git a/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts b/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts index f3a0b28bf0439..76d14f29f5493 100644 --- a/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts +++ b/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts @@ -5,7 +5,7 @@ import { IGrammarContributions, EmmetEditorAction } from 'vs/workbench/contrib/emmet/browser/emmetActions'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts b/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts index a743e9e184ea0..588f6a3cec50e 100644 --- a/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts +++ b/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; suite('Extension query', () => { diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extension.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extension.test.ts index 8c96cf7a48ead..efdcd3abd9869 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extension.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extension.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ExtensionState } from 'vs/workbench/contrib/extensions/common/extensions'; import { Extension } from 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService'; import { IGalleryExtension, IGalleryExtensionProperties, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts index 4e62c45838cf4..be1ca52ad70e7 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as sinon from 'sinon'; -import * as assert from 'assert'; +import assert from 'assert'; import * as uuid from 'vs/base/common/uuid'; import { IExtensionGalleryService, IGalleryExtensionAssets, IGalleryExtension, IExtensionManagementService, IExtensionTipsService, getTargetPlatform, diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts index 4194641f2ba17..7bcaed37ba395 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { generateUuid } from 'vs/base/common/uuid'; import { IExtensionsWorkbenchService, ExtensionContainers } from 'vs/workbench/contrib/extensions/common/extensions'; import * as ExtensionsActions from 'vs/workbench/contrib/extensions/browser/extensionsActions'; @@ -2652,5 +2652,3 @@ function createExtensionManagementService(installed: ILocalExtension[] = []): IP async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [] }; }, }; } - - diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts index c5de87fd0d314..6d62ecebd615a 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { generateUuid } from 'vs/base/common/uuid'; import { ExtensionsListView } from 'vs/workbench/contrib/extensions/browser/extensionsViews'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; @@ -574,4 +574,3 @@ suite('ExtensionsViews Tests', () => { } }); - diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts index 475cc3e3e03f3..95f83c91d4a2e 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as sinon from 'sinon'; -import * as assert from 'assert'; +import assert from 'assert'; import { generateUuid } from 'vs/base/common/uuid'; import { ExtensionState, AutoCheckUpdatesConfigurationKey, AutoUpdateConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService'; diff --git a/src/vs/workbench/contrib/externalUriOpener/test/common/externalUriOpenerService.test.ts b/src/vs/workbench/contrib/externalUriOpener/test/common/externalUriOpenerService.test.ts index 842599bb6be8c..5be58d5736596 100644 --- a/src/vs/workbench/contrib/externalUriOpener/test/common/externalUriOpenerService.test.ts +++ b/src/vs/workbench/contrib/externalUriOpener/test/common/externalUriOpenerService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts b/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts index f104ba762eb04..75b57831d842b 100644 --- a/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/editorAutoSave.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/files/test/browser/explorerFileNestingTrie.test.ts b/src/vs/workbench/contrib/files/test/browser/explorerFileNestingTrie.test.ts index 2c08f73b54c00..66481ab3a2383 100644 --- a/src/vs/workbench/contrib/files/test/browser/explorerFileNestingTrie.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/explorerFileNestingTrie.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { PreTrie, ExplorerFileNestingTrie, SufTrie } from 'vs/workbench/contrib/files/common/explorerFileNestingTrie'; -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; const fakeFilenameAttributes = { dirname: 'mydir', basename: '', extname: '' }; diff --git a/src/vs/workbench/contrib/files/test/browser/explorerModel.test.ts b/src/vs/workbench/contrib/files/test/browser/explorerModel.test.ts index 938fed848a2de..13870699b3ccc 100644 --- a/src/vs/workbench/contrib/files/test/browser/explorerModel.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/explorerModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isLinux, isWindows, OS } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/path'; diff --git a/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts b/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts index cea1d9c71724f..ea30440fa54e6 100644 --- a/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/explorerView.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter } from 'vs/base/common/event'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; import { TestFileService } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/contrib/files/test/browser/fileActions.test.ts b/src/vs/workbench/contrib/files/test/browser/fileActions.test.ts index e1e8db24108be..f5070edb1791d 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileActions.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileActions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { incrementFileName } from 'vs/workbench/contrib/files/browser/fileActions'; diff --git a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts index ef6adefcdd21b..1675b2d45714a 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput'; diff --git a/src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts b/src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts index ca865ea076ce4..94f9a716751e2 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileOnDiskProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts b/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts index 75e6c3b5cdc8b..f3d6c8fb19885 100644 --- a/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { TextFileEditorTracker } from 'vs/workbench/contrib/files/browser/editors/textFileEditorTracker'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts index 0088ab028f832..827280275d565 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { equals } from 'vs/base/common/arrays'; import { DeferredPromise, raceCancellation, timeout } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts index 86a3b614ff278..26e72175e2cd7 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatStrategies.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatStrategies.test.ts index e8d229d81fcf3..c6724b095e49d 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatStrategies.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatStrategies.test.ts @@ -7,7 +7,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { IntervalTimer } from 'vs/base/common/async'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { asProgressiveEdit } from '../../browser/utils'; -import * as assert from 'assert'; +import assert from 'assert'; suite('AsyncEdit', () => { diff --git a/src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts b/src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts index d86022dec6a81..60ea6c2089cb7 100644 --- a/src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts +++ b/src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IssueReporterModel } from 'vs/workbench/contrib/issue/browser/issueReporterModel'; import { IssueType } from 'vs/platform/issue/common/issue'; diff --git a/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts b/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts index 55e38f3d018d4..c0ee61a516173 100644 --- a/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts +++ b/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IAction } from 'vs/base/common/actions'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts b/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts index b8334c948d6e0..bec693957c3e2 100644 --- a/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts +++ b/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IMarker, MarkerSeverity, IRelatedInformation } from 'vs/platform/markers/common/markers'; import { MarkersModel, Marker, ResourceMarkers, RelatedInformation } from 'vs/workbench/contrib/markers/browser/markersModel'; diff --git a/src/vs/workbench/contrib/mergeEditor/test/browser/mapping.test.ts b/src/vs/workbench/contrib/mergeEditor/test/browser/mapping.test.ts index 85c475e3c2fe9..135d0d9a7ee4f 100644 --- a/src/vs/workbench/contrib/mergeEditor/test/browser/mapping.test.ts +++ b/src/vs/workbench/contrib/mergeEditor/test/browser/mapping.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/workbench/contrib/mergeEditor/test/browser/model.test.ts b/src/vs/workbench/contrib/mergeEditor/test/browser/model.test.ts index 0441e4483d36e..a07bc71e67580 100644 --- a/src/vs/workbench/contrib/mergeEditor/test/browser/model.test.ts +++ b/src/vs/workbench/contrib/mergeEditor/test/browser/model.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IReader, transaction } from 'vs/base/common/observable'; import { isDefined } from 'vs/base/common/types'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/cellDecorations.test.ts b/src/vs/workbench/contrib/notebook/test/browser/cellDecorations.test.ts index 17fbe22abaac9..7063f68850544 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/cellDecorations.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/cellDecorations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/cellDnd.test.ts b/src/vs/workbench/contrib/notebook/test/browser/cellDnd.test.ts index 0db4fb1920108..5867385c0aa0c 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/cellDnd.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/cellDnd.test.ts @@ -6,7 +6,7 @@ import { performCellDropEdits } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; -import * as assert from 'assert'; +import assert from 'assert'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts b/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts index 357927dbf609d..65ea08b7f2773 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { changeCellToKind, computeCellLinesContents, copyCellRange, insertCell, joinNotebookCells, moveCellRange, runDeleteAction } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { CellEditType, CellKind, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/contributedStatusBarItemController.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/contributedStatusBarItemController.test.ts index fefb3d36cff61..13b2d31e380de 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/contributedStatusBarItemController.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/contributedStatusBarItemController.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts index 80931b652e631..342bbd90a937b 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts @@ -8,7 +8,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { formatCellDuration } from 'vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts index c8f3a95808523..7f9571b91e19c 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { FindMatch, ITextBuffer, ValidAnnotatedEditOperation } from 'vs/editor/common/model'; import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/core/wordHelper'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts index 886806afb688f..11a24c15fecc1 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ToggleCellToolbarPositionAction } from 'vs/workbench/contrib/notebook/browser/contrib/layout/layoutActions'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookCellDiagnostics.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookCellDiagnostics.test.ts index ef1c965adb22f..86636c92a0ba0 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookCellDiagnostics.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookCellDiagnostics.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts index de3e3c30e92e1..501dcb337c99e 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { NotebookClipboardContribution, runCopyCells, runCutCells } from 'vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard'; import { CellKind, NOTEBOOK_EDITOR_ID, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts index 9145f0bf00bd9..582490022a127 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { setupInstantiationService, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; import { IFileIconTheme, IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts index e9d26500bed58..0e22c66ed0144 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDataSource } from 'vs/base/browser/ui/tree/tree'; import { CancellationToken } from 'vs/base/common/cancellation'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts index 90d732a0cf1c6..9c802bd233182 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts index 98628d0c1b945..0770113f20a3f 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CellEditType, CellKind, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { createNotebookCellList, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/outputCopyTests.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/outputCopyTests.test.ts index 066d89cc736b1..ade4aa5abc3d9 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/outputCopyTests.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/outputCopyTests.test.ts @@ -7,7 +7,7 @@ import { ICellOutputViewModel, ICellViewModel } from 'vs/workbench/contrib/noteb import { mock } from 'vs/base/test/common/mock'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ILogService } from 'vs/platform/log/common/log'; -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { IOutputItemDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { copyCellOutput } from 'vs/workbench/contrib/notebook/browser/contrib/clipboard/cellOutputClipboard'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts index 9b6eb24d20806..dedeec1068bca 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookCellAnchor.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookCellAnchor.test.ts index 782c8145df28d..b2dfc2be7ffdb 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookCellAnchor.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookCellAnchor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { CellFocusMode } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts index 6f9de776b5334..f62c916928ea4 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts index d18126e162b19..d0c5bc4bd91fc 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookDiff.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookDiff.test.ts index 654fe7ee807a4..f2bb130dba913 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookDiff.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookDiff.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { ISequence, LcsDiff } from 'vs/base/common/diff/diff'; import { Mimes } from 'vs/base/common/mime'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts index 1bd5ca8f03c87..8bfdf0497013a 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts index 071017d82d669..0775af913998a 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts index c4b0052845042..80d569a64e35a 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { AsyncIterableObject } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts index 7087aa9ec1aed..906bbb53e457b 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { AsyncIterableObject, DeferredPromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts index 4acfd482bf8bb..0d397b63bf6f7 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { setupInstantiationService, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts index a476f5caeadbc..237ec6bd5994b 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts @@ -3,10 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { setupInstantiationService, withTestNotebook as _withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; +import { setupInstantiationService } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { Emitter, Event } from 'vs/base/common/event'; import { INotebookKernel, INotebookKernelService, VariablesResult } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookKernelService } from 'vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts index 1ed657a1972bf..cbe5bf90b3bd7 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts @@ -3,10 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { setupInstantiationService, withTestNotebook as _withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; +import { setupInstantiationService } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { Emitter, Event } from 'vs/base/common/event'; import { INotebookKernel, INotebookKernelService, VariablesResult } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookKernelService } from 'vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookRendererMessagingService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookRendererMessagingService.test.ts index db9868edfa7ae..d40658ab3535c 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookRendererMessagingService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookRendererMessagingService.test.ts @@ -6,7 +6,7 @@ import { NullExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { stub } from 'sinon'; import { NotebookRendererMessagingService } from 'vs/workbench/contrib/notebook/browser/services/notebookRendererMessagingServiceImpl'; -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts index 5bbbf50a502a7..0fd1c9a92fe6a 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts index 647c96305ce73..ce634389f93bb 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts index 0cb027d1beb7f..9026b78d45712 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts index 4c250a43ab101..abcb1828caa59 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookVariablesDataSource.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookVariablesDataSource.test.ts index fa082d78e2353..ee359d70e9d0e 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookVariablesDataSource.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookVariablesDataSource.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { AsyncIterableObject, AsyncIterableSource } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts index f226b1c608ae3..1e512e7c1a0ed 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookViewZones.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookViewZones.test.ts index f2af8c327470c..199ee022a90c1 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookViewZones.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookViewZones.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookWorkbenchToolbar.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookWorkbenchToolbar.test.ts index 34c0a8c1a01e8..8d530e9c21cdb 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookWorkbenchToolbar.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookWorkbenchToolbar.test.ts @@ -5,7 +5,7 @@ import { workbenchCalculateActions, workbenchDynamicCalculateActions } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar'; import { Action, IAction, Separator } from 'vs/base/common/actions'; -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; interface IActionModel { diff --git a/src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts b/src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts index 2f7988f5236f7..722c80940c957 100644 --- a/src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts +++ b/src/vs/workbench/contrib/output/test/browser/outputLinkProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { isMacintosh, isLinux, isWindows } from 'vs/base/common/platform'; import { OutputLinkComputer } from 'vs/workbench/contrib/output/common/outputLinkComputer'; diff --git a/src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts b/src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts index e5b24e6bd3bfd..55c3c4dba66a5 100644 --- a/src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts +++ b/src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { KeybindingEditorDecorationsRenderer } from 'vs/workbench/contrib/preferences/browser/keybindingsEditorContribution'; diff --git a/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts b/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts index 6bb2d93fe7da2..c465c0472e18d 100644 --- a/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts +++ b/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { settingKeyToDisplayFormat, parseQuery, IParsedQuery } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; diff --git a/src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts b/src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts index 26d0c30d9cb8d..d8d614fb7d256 100644 --- a/src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts +++ b/src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { SmartSnippetInserter } from 'vs/workbench/contrib/preferences/common/smartSnippetInserter'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/workbench/contrib/search/test/browser/searchActions.test.ts b/src/vs/workbench/contrib/search/test/browser/searchActions.test.ts index 9b3b9e4f4ddd6..2e98bb36cb6d2 100644 --- a/src/vs/workbench/contrib/search/test/browser/searchActions.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchActions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Keybinding } from 'vs/base/common/keybindings'; import { OS } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/search/test/browser/searchModel.test.ts b/src/vs/workbench/contrib/search/test/browser/searchModel.test.ts index 17f9e88b338f4..5c79a6d804661 100644 --- a/src/vs/workbench/contrib/search/test/browser/searchModel.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchModel.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import * as arrays from 'vs/base/common/arrays'; import { DeferredPromise, timeout } from 'vs/base/common/async'; @@ -644,4 +644,3 @@ suite('SearchModel', () => { return notebookEditorWidgetService; } }); - diff --git a/src/vs/workbench/contrib/search/test/browser/searchNotebookHelpers.test.ts b/src/vs/workbench/contrib/search/test/browser/searchNotebookHelpers.test.ts index a90875c1384ff..f30dcaf0de32d 100644 --- a/src/vs/workbench/contrib/search/test/browser/searchNotebookHelpers.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchNotebookHelpers.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { FindMatch, IReadonlyTextBuffer } from 'vs/editor/common/model'; import { IFileMatch, ISearchRange, ITextSearchMatch, QueryType } from 'vs/workbench/services/search/common/search'; diff --git a/src/vs/workbench/contrib/search/test/browser/searchResult.test.ts b/src/vs/workbench/contrib/search/test/browser/searchResult.test.ts index e71fab4b13164..600cc67f97aa2 100644 --- a/src/vs/workbench/contrib/search/test/browser/searchResult.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchResult.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { Match, FileMatch, SearchResult, SearchModel, FolderMatch, CellMatch } from 'vs/workbench/contrib/search/browser/searchModel'; diff --git a/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts b/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts index 4feb3d343ed7c..c35d9b87da683 100644 --- a/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IModelService } from 'vs/editor/common/services/model'; diff --git a/src/vs/workbench/contrib/search/test/common/cacheState.test.ts b/src/vs/workbench/contrib/search/test/common/cacheState.test.ts index a986de9b0bfb8..ea1241bed901c 100644 --- a/src/vs/workbench/contrib/search/test/common/cacheState.test.ts +++ b/src/vs/workbench/contrib/search/test/common/cacheState.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as errors from 'vs/base/common/errors'; import { QueryType, IFileQuery } from 'vs/workbench/services/search/common/search'; import { FileQueryCacheState } from 'vs/workbench/contrib/search/common/cacheState'; diff --git a/src/vs/workbench/contrib/search/test/common/extractRange.test.ts b/src/vs/workbench/contrib/search/test/common/extractRange.test.ts index 4651bbc640333..0758b486cf691 100644 --- a/src/vs/workbench/contrib/search/test/common/extractRange.test.ts +++ b/src/vs/workbench/contrib/search/test/common/extractRange.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { extractRangeFromFilter } from 'vs/workbench/contrib/search/common/search'; @@ -98,4 +98,3 @@ suite('extractRangeFromFilter', () => { } }); }); - diff --git a/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts b/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts index 82e14ccc1a611..6b5bef90c2a04 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { SnippetFile, Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; import { URI } from 'vs/base/common/uri'; import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; diff --git a/src/vs/workbench/contrib/snippets/test/browser/snippetsRegistry.test.ts b/src/vs/workbench/contrib/snippets/test/browser/snippetsRegistry.test.ts index 8c185e766a5c9..d4824fdf3b962 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetsRegistry.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetsRegistry.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { getNonWhitespacePrefix } from 'vs/workbench/contrib/snippets/browser/snippetsService'; import { Position } from 'vs/editor/common/core/position'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/snippets/test/browser/snippetsRewrite.test.ts b/src/vs/workbench/contrib/snippets/test/browser/snippetsRewrite.test.ts index 5ac2018ef7dad..39b490f2fe3f4 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetsRewrite.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetsRewrite.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { generateUuid } from 'vs/base/common/uuid'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; diff --git a/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts b/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts index ce61496ec51e7..297836af6c83b 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { SnippetCompletion, SnippetCompletionProvider } from 'vs/workbench/contrib/snippets/browser/snippetCompletionProvider'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { createModelServices, instantiateTextModel } from 'vs/editor/test/common/testTextModel'; diff --git a/src/vs/workbench/contrib/speech/test/common/speechService.test.ts b/src/vs/workbench/contrib/speech/test/common/speechService.test.ts index d757eace7e08a..16a4f0d9b773a 100644 --- a/src/vs/workbench/contrib/speech/test/common/speechService.test.ts +++ b/src/vs/workbench/contrib/speech/test/common/speechService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { speechLanguageConfigToLanguage } from 'vs/workbench/contrib/speech/common/speechService'; diff --git a/src/vs/workbench/contrib/tags/test/node/workspaceTags.test.ts b/src/vs/workbench/contrib/tags/test/node/workspaceTags.test.ts index 13993422b73e4..d166a151900fe 100644 --- a/src/vs/workbench/contrib/tags/test/node/workspaceTags.test.ts +++ b/src/vs/workbench/contrib/tags/test/node/workspaceTags.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as crypto from 'crypto'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { getHashedRemotesFromConfig as baseGetHashedRemotesFromConfig } from 'vs/workbench/contrib/tags/common/workspaceTags'; diff --git a/src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts b/src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts index 6b41d88c5f781..eba74599af7c9 100644 --- a/src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts +++ b/src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as matchers from 'vs/workbench/contrib/tasks/common/problemMatcher'; -import * as assert from 'assert'; +import assert from 'assert'; import { ValidationState, IProblemReporter, ValidationStatus } from 'vs/base/common/parsers'; class ProblemReporter implements IProblemReporter { diff --git a/src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts b/src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts index 816894f6b321c..7aad1e553070d 100644 --- a/src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts +++ b/src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import * as assert from 'assert'; +import assert from 'assert'; import Severity from 'vs/base/common/severity'; import * as UUID from 'vs/base/common/uuid'; diff --git a/src/vs/workbench/contrib/terminal/test/common/terminalColorRegistry.test.ts b/src/vs/workbench/contrib/terminal/test/common/terminalColorRegistry.test.ts index 5ea55926c390e..a15a395d9d859 100644 --- a/src/vs/workbench/contrib/terminal/test/common/terminalColorRegistry.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/terminalColorRegistry.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Extensions as ThemeingExtensions, IColorRegistry, ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { ansiColorIdentifiers, registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; diff --git a/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts b/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts index dd74c5860606d..5aa97b16452ee 100644 --- a/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/terminalDataBuffering.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter } from 'vs/base/common/event'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { TerminalDataBufferer } from 'vs/platform/terminal/common/terminalDataBuffering'; diff --git a/src/vs/workbench/contrib/terminalContrib/accessibility/test/browser/bufferContentTracker.test.ts b/src/vs/workbench/contrib/terminalContrib/accessibility/test/browser/bufferContentTracker.test.ts index ef6c5b46e76ea..a547d3f68ae0e 100644 --- a/src/vs/workbench/contrib/terminalContrib/accessibility/test/browser/bufferContentTracker.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/accessibility/test/browser/bufferContentTracker.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { importAMDNodeModule } from 'vs/amdX'; import { isWindows } from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkHelpers.test.ts b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkHelpers.test.ts index b419b7b94cac5..80c28af629789 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkHelpers.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/test/browser/terminalLinkHelpers.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import type { IBufferLine, IBufferCell } from '@xterm/xterm'; import { convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminalContrib/links/browser/terminalLinkHelpers'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/terminalContrib/typeAhead/test/browser/terminalTypeAhead.test.ts b/src/vs/workbench/contrib/terminalContrib/typeAhead/test/browser/terminalTypeAhead.test.ts index 86972f65fa702..14f61b9868a4f 100644 --- a/src/vs/workbench/contrib/terminalContrib/typeAhead/test/browser/terminalTypeAhead.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/typeAhead/test/browser/terminalTypeAhead.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import type { IBuffer, Terminal } from '@xterm/xterm'; import { SinonStub, stub, useFakeTimers } from 'sinon'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/nameProjection.test.ts b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/nameProjection.test.ts index ea3ab5dfe0f8f..f0709ccc4e574 100644 --- a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/nameProjection.test.ts +++ b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/nameProjection.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter } from 'vs/base/common/event'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ListProjection } from 'vs/workbench/contrib/testing/browser/explorerProjections/listProjection'; @@ -92,4 +92,3 @@ suite('Workbench - Testing Explorer Hierarchal by Name Projection', () => { ]); }); }); - diff --git a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts index cebf9e01a5dac..5414267c1d0e3 100644 --- a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts +++ b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; @@ -268,4 +268,3 @@ suite('Workbench - Testing Explorer Hierarchal by Location Projection', () => { }); }); - diff --git a/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts b/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts index ea8bb1e5b6e9a..c4ff9a8875331 100644 --- a/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts @@ -8,7 +8,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { SinonSandbox, createSandbox } from 'sinon'; import { Iterable } from 'vs/base/common/iterator'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/contrib/testing/test/common/testExplorerFilterState.test.ts b/src/vs/workbench/contrib/testing/test/common/testExplorerFilterState.test.ts index 2be30fb7d2aa3..192515892c716 100644 --- a/src/vs/workbench/contrib/testing/test/common/testExplorerFilterState.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testExplorerFilterState.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { InMemoryStorageService } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/workbench/contrib/testing/test/common/testProfileService.test.ts b/src/vs/workbench/contrib/testing/test/common/testProfileService.test.ts index 1d5771ae4bb36..c83d3e7d3b9a1 100644 --- a/src/vs/workbench/contrib/testing/test/common/testProfileService.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testProfileService.test.ts @@ -5,7 +5,7 @@ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; diff --git a/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts b/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts index da47d907d00f8..58f015704594d 100644 --- a/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts b/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts index d040484a930d1..118dcf18b5be6 100644 --- a/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { range } from 'vs/base/common/arrays'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/testing/test/common/testingUri.test.ts b/src/vs/workbench/contrib/testing/test/common/testingUri.test.ts index 6dd030f9b530d..6e9ce5b745ae9 100644 --- a/src/vs/workbench/contrib/testing/test/common/testingUri.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testingUri.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { buildTestUri, ParsedTestUri, parseTestUri, TestUriType } from 'vs/workbench/contrib/testing/common/testingUri'; diff --git a/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts b/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts index ee279e630894c..710fb4da3c430 100644 --- a/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts +++ b/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts @@ -8,7 +8,7 @@ import { IColorRegistry, Extensions, ColorContribution, asCssVariableName } from import { asTextOrError } from 'vs/platform/request/common/request'; import * as pfs from 'vs/base/node/pfs'; import * as path from 'vs/base/common/path'; -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { RequestService } from 'vs/platform/request/node/requestService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; diff --git a/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts b/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts index baab39f82b690..db1c149501f97 100644 --- a/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts +++ b/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/test/browser/gettingStartedMarkdownRenderer.test.ts b/src/vs/workbench/contrib/welcomeGettingStarted/test/browser/gettingStartedMarkdownRenderer.test.ts index b7b09ca9417ca..3a63341f1d8b3 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/test/browser/gettingStartedMarkdownRenderer.test.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/test/browser/gettingStartedMarkdownRenderer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FileAccess } from 'vs/base/common/network'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { LanguageService } from 'vs/editor/common/services/languageService'; diff --git a/src/vs/workbench/services/aiRelatedInformation/test/common/aiRelatedInformationService.test.ts b/src/vs/workbench/services/aiRelatedInformation/test/common/aiRelatedInformationService.test.ts index 52e00d57f7b40..db9b4febfbd6d 100644 --- a/src/vs/workbench/services/aiRelatedInformation/test/common/aiRelatedInformationService.test.ts +++ b/src/vs/workbench/services/aiRelatedInformation/test/common/aiRelatedInformationService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { AiRelatedInformationService } from 'vs/workbench/services/aiRelatedInformation/common/aiRelatedInformationService'; import { NullLogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/services/authentication/test/browser/authenticationService.test.ts b/src/vs/workbench/services/authentication/test/browser/authenticationService.test.ts index 854aea75cdac2..891c718ac73a4 100644 --- a/src/vs/workbench/services/authentication/test/browser/authenticationService.test.ts +++ b/src/vs/workbench/services/authentication/test/browser/authenticationService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { AuthenticationAccessService } from 'vs/workbench/services/authentication/browser/authenticationAccessService'; diff --git a/src/vs/workbench/services/commands/test/common/commandService.test.ts b/src/vs/workbench/services/commands/test/common/commandService.test.ts index 38c6f24d3f456..0c87ce176e1b9 100644 --- a/src/vs/workbench/services/commands/test/common/commandService.test.ts +++ b/src/vs/workbench/services/commands/test/common/commandService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { CommandService } from 'vs/workbench/services/commands/common/commandService'; diff --git a/src/vs/workbench/services/configuration/test/browser/configuration.test.ts b/src/vs/workbench/services/configuration/test/browser/configuration.test.ts index b03e14cb2d55d..266ccaf978b5d 100644 --- a/src/vs/workbench/services/configuration/test/browser/configuration.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configuration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts index 31139bf5737cc..8575a047a795d 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as sinon from 'sinon'; -import * as assert from 'assert'; +import assert from 'assert'; import * as json from 'vs/base/common/json'; import { Event } from 'vs/base/common/event'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts index eab8d6064f58c..bd6c6a3d5ef3a 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts b/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts index 9cfc93c8dfec1..bbfd61cdd7d40 100644 --- a/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts +++ b/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Registry } from 'vs/platform/registry/common/platform'; import { StandaloneConfigurationModelParser, Configuration } from 'vs/workbench/services/configuration/common/configurationModels'; import { ConfigurationModelParser, ConfigurationModel, ConfigurationParseOptions } from 'vs/platform/configuration/common/configurationModels'; diff --git a/src/vs/workbench/services/configurationResolver/test/electron-sandbox/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/electron-sandbox/configurationResolverService.test.ts index b776e512ce8b8..c3636300a65f0 100644 --- a/src/vs/workbench/services/configurationResolver/test/electron-sandbox/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/electron-sandbox/configurationResolverService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { stub } from 'sinon'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts index ae94c92179d9a..e3e9fbb209eef 100644 --- a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DecorationsService } from 'vs/workbench/services/decorations/browser/decorationsService'; import { IDecorationsProvider, IDecorationData } from 'vs/workbench/services/decorations/common/decorations'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts index 5439e7be42f36..1c3c9233ac8b9 100644 --- a/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts +++ b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index 80455d79ac1aa..e2fd3321cac86 100644 --- a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { workbenchInstantiationService, registerTestEditor, TestFileEditorInput, TestEditorPart, TestServiceAccessor, ITestInstantiationService, workbenchTeardown, createEditorParts, TestEditorParts } from 'vs/workbench/test/browser/workbenchTestServices'; import { GroupDirection, GroupsOrder, MergeGroupMode, GroupOrientation, GroupLocation, isEditorGroup, IEditorGroupsService, GroupsArrangement, IEditorGroupContextKeyProvider } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CloseDirection, IEditorPartOptions, EditorsOrder, EditorInputCapabilities, GroupModelChangeKind, SideBySideEditor, IEditorFactoryRegistry, EditorExtensions } from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/services/editor/test/browser/editorResolverService.test.ts b/src/vs/workbench/services/editor/test/browser/editorResolverService.test.ts index 2e44db0f38c29..59ddcd67c571e 100644 --- a/src/vs/workbench/services/editor/test/browser/editorResolverService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorResolverService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index 7671e480d79bd..ce6d1a08d6cb9 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EditorActivation, IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts b/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts index 4d8100c5640ff..b968288e9d23d 100644 --- a/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorsObserver.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IEditorFactoryRegistry, EditorExtensions, EditorInputCapabilities } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; import { workbenchInstantiationService, TestFileEditorInput, registerTestEditor, TestEditorPart, createEditorPart, registerTestSideBySideEditor } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts index 8f496d54b04cb..8983896971378 100644 --- a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts +++ b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { IExtensionManagementService, DidUninstallExtensionEvent, ILocalExtension, InstallExtensionEvent, InstallExtensionResult, UninstallExtensionEvent, DidUpdateExtensionMetadata } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, ExtensionInstallLocation, IProfileAwareExtensionManagementService, DidChangeProfileEvent } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; diff --git a/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts b/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts index 3ced43a5f42ae..b6b2edb844bf7 100644 --- a/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts +++ b/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/services/extensions/test/browser/extensionStorageMigration.test.ts b/src/vs/workbench/services/extensions/test/browser/extensionStorageMigration.test.ts index ae0a893194472..f51e36b151a3f 100644 --- a/src/vs/workbench/services/extensions/test/browser/extensionStorageMigration.test.ts +++ b/src/vs/workbench/services/extensions/test/browser/extensionStorageMigration.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { FileService } from 'vs/platform/files/common/fileService'; diff --git a/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts b/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts index 97a4d42235255..7ac88d4cdad82 100644 --- a/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts +++ b/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ExtensionIdentifier, IExtensionDescription, TargetPlatform } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts b/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts index ab5a069fe14ee..52d7abfebcd20 100644 --- a/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts +++ b/src/vs/workbench/services/extensions/test/common/extensionManifestPropertiesService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { isWeb } from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts b/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts index e351f2485fe90..cffda52a23832 100644 --- a/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts +++ b/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/services/history/test/browser/historyService.test.ts b/src/vs/workbench/services/history/test/browser/historyService.test.ts index 06478095336ca..e00cd8ae218eb 100644 --- a/src/vs/workbench/services/history/test/browser/historyService.test.ts +++ b/src/vs/workbench/services/history/test/browser/historyService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; import { URI } from 'vs/base/common/uri'; import { workbenchInstantiationService, TestFileEditorInput, registerTestEditor, createEditorPart, registerTestFileEditor, TestServiceAccessor, TestTextFileEditor, workbenchTeardown, registerTestSideBySideEditor } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/keybinding/test/browser/browserKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/browser/browserKeyboardMapper.test.ts index 0e2778b6191fa..7c3e693e96dbe 100644 --- a/src/vs/workbench/services/keybinding/test/browser/browserKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/browser/browserKeyboardMapper.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/en.darwin'; import 'vs/workbench/services/keybinding/browser/keyboardLayouts/de.darwin'; import { KeyboardLayoutContribution } from 'vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution'; diff --git a/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts index 34591dbfc3582..e2064decab99a 100644 --- a/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as json from 'vs/base/common/json'; import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCodeChord } from 'vs/base/common/keybindings'; diff --git a/src/vs/workbench/services/keybinding/test/browser/keybindingIO.test.ts b/src/vs/workbench/services/keybinding/test/browser/keybindingIO.test.ts index cfc697b817e8d..3f7687029a902 100644 --- a/src/vs/workbench/services/keybinding/test/browser/keybindingIO.test.ts +++ b/src/vs/workbench/services/keybinding/test/browser/keybindingIO.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyChord, KeyCode, KeyMod, ScanCode } from 'vs/base/common/keyCodes'; import { KeyCodeChord, decodeKeybinding, ScanCodeChord, Keybinding } from 'vs/base/common/keybindings'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; diff --git a/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts b/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts index 5ee442c7285e1..1ef7cb70863f2 100644 --- a/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts +++ b/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as path from 'vs/base/common/path'; import { SingleModifierChord, ResolvedKeybinding, Keybinding } from 'vs/base/common/keybindings'; import { Promises } from 'vs/base/node/pfs'; diff --git a/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts index 05a8db5fc738c..7ca4e5a54fc6a 100644 --- a/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { KeyChord, KeyCode, KeyMod, ScanCode, ScanCodeUtils } from 'vs/base/common/keyCodes'; import { KeyCodeChord, decodeKeybinding, createSimpleKeybinding, ScanCodeChord, Keybinding } from 'vs/base/common/keybindings'; import { UserSettingsLabelProvider } from 'vs/base/common/keybindingLabels'; diff --git a/src/vs/workbench/services/label/test/browser/label.test.ts b/src/vs/workbench/services/label/test/browser/label.test.ts index f5098c5df7250..84afcb96d3797 100644 --- a/src/vs/workbench/services/label/test/browser/label.test.ts +++ b/src/vs/workbench/services/label/test/browser/label.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as resources from 'vs/base/common/resources'; -import * as assert from 'assert'; +import assert from 'assert'; import { TestEnvironmentService, TestLifecycleService, TestPathService, TestRemoteAgentService } from 'vs/workbench/test/browser/workbenchTestServices'; import { URI } from 'vs/base/common/uri'; import { LabelService } from 'vs/workbench/services/label/common/labelService'; diff --git a/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts b/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts index 948741f9d0ab1..0d71a2086937c 100644 --- a/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts +++ b/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ShutdownReason } from 'vs/workbench/services/lifecycle/common/lifecycle'; diff --git a/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts b/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts index af8f0deed6b29..a6009748222e3 100644 --- a/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts +++ b/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as uuid from 'vs/base/common/uuid'; import { OS, OperatingSystem } from 'vs/base/common/platform'; import { KeyCode } from 'vs/base/common/keyCodes'; diff --git a/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts b/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts index 8dd960a0eb6f0..af47ad2f8ea7f 100644 --- a/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts +++ b/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { TestCommandService } from 'vs/editor/test/browser/editorTestServices'; import { ICommandService } from 'vs/platform/commands/common/commands'; diff --git a/src/vs/workbench/services/preferences/test/common/preferencesValidation.test.ts b/src/vs/workbench/services/preferences/test/common/preferencesValidation.test.ts index 2b4f6f8d667be..85ef6771d8406 100644 --- a/src/vs/workbench/services/preferences/test/common/preferencesValidation.test.ts +++ b/src/vs/workbench/services/preferences/test/common/preferencesValidation.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; import { createValidator, getInvalidTypeError } from 'vs/workbench/services/preferences/common/preferencesValidation'; diff --git a/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts index 16f3067679c05..7bc1cec7e490b 100644 --- a/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts +++ b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { AbstractProgressScope, ScopedProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; diff --git a/src/vs/workbench/services/search/test/browser/queryBuilder.test.ts b/src/vs/workbench/services/search/test/browser/queryBuilder.test.ts index 53209bfbe45e7..e117233667371 100644 --- a/src/vs/workbench/services/search/test/browser/queryBuilder.test.ts +++ b/src/vs/workbench/services/search/test/browser/queryBuilder.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IExpression } from 'vs/base/common/glob'; import { join } from 'vs/base/common/path'; import { isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/services/search/test/common/ignoreFile.test.ts b/src/vs/workbench/services/search/test/common/ignoreFile.test.ts index d5627df9bf157..75a456be6ec85 100644 --- a/src/vs/workbench/services/search/test/common/ignoreFile.test.ts +++ b/src/vs/workbench/services/search/test/common/ignoreFile.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IgnoreFile } from 'vs/workbench/services/search/common/ignoreFile'; diff --git a/src/vs/workbench/services/search/test/common/queryBuilder.test.ts b/src/vs/workbench/services/search/test/common/queryBuilder.test.ts index a10084b5db914..a4a7ce1cf1855 100644 --- a/src/vs/workbench/services/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/services/search/test/common/queryBuilder.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/services/search/test/common/replace.test.ts b/src/vs/workbench/services/search/test/common/replace.test.ts index 5b4b721a30f4b..871c7e39f6fb5 100644 --- a/src/vs/workbench/services/search/test/common/replace.test.ts +++ b/src/vs/workbench/services/search/test/common/replace.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ReplacePattern } from 'vs/workbench/services/search/common/replace'; diff --git a/src/vs/workbench/services/search/test/common/search.test.ts b/src/vs/workbench/services/search/test/common/search.test.ts index 13fdd72544172..5f0ec330f8ab4 100644 --- a/src/vs/workbench/services/search/test/common/search.test.ts +++ b/src/vs/workbench/services/search/test/common/search.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ITextSearchPreviewOptions, OneLineRange, TextSearchMatch, SearchRange } from 'vs/workbench/services/search/common/search'; diff --git a/src/vs/workbench/services/search/test/common/searchHelpers.test.ts b/src/vs/workbench/services/search/test/common/searchHelpers.test.ts index bc51969faef04..2d9db98c70d2a 100644 --- a/src/vs/workbench/services/search/test/common/searchHelpers.test.ts +++ b/src/vs/workbench/services/search/test/common/searchHelpers.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; import { FindMatch, ITextModel } from 'vs/editor/common/model'; diff --git a/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts b/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts index ac3dd097c7637..126561405bb24 100644 --- a/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { FileAccess } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/services/search/test/node/rawSearchService.integrationTest.ts b/src/vs/workbench/services/search/test/node/rawSearchService.integrationTest.ts index 1838e82c12d8e..7c2a5407a3780 100644 --- a/src/vs/workbench/services/search/test/node/rawSearchService.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/rawSearchService.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts index fae2e5b6c4c17..98d8e8a421d1b 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as platform from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { fixDriveC, getAbsoluteGlob } from 'vs/workbench/services/search/node/ripgrepFileSearch'; diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts index 09f3320cf2811..e93c4efb2691e 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { fixRegexNewline, IRgMatch, IRgMessage, RipgrepParser, unicodeEscapesToPCRE2, fixNewline, getRgArgs, performBraceExpansionForRipgrep } from 'vs/workbench/services/search/node/ripgrepTextSearchEngine'; diff --git a/src/vs/workbench/services/search/test/node/search.integrationTest.ts b/src/vs/workbench/services/search/test/node/search.integrationTest.ts index cc9b541e70443..ae3a4b4fe7445 100644 --- a/src/vs/workbench/services/search/test/node/search.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/search.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as path from 'vs/base/common/path'; import * as platform from 'vs/base/common/platform'; import { joinPath } from 'vs/base/common/resources'; diff --git a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts index 206de297464a9..503b314ffbe53 100644 --- a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as path from 'vs/base/common/path'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as glob from 'vs/base/common/glob'; diff --git a/src/vs/workbench/services/search/test/node/textSearchManager.test.ts b/src/vs/workbench/services/search/test/node/textSearchManager.test.ts index 693c4e9f0c024..1eb64535a8d47 100644 --- a/src/vs/workbench/services/search/test/node/textSearchManager.test.ts +++ b/src/vs/workbench/services/search/test/node/textSearchManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts b/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts index 950605ae82595..c11cf65851478 100644 --- a/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts +++ b/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { resolveWorkbenchCommonProperties } from 'vs/workbench/services/telemetry/browser/workbenchCommonProperties'; import { InMemoryStorageService } from 'vs/platform/storage/common/storage'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts b/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts index e51736b4ee9a8..bb4004c54197b 100644 --- a/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts +++ b/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { release, hostname } from 'os'; import { resolveWorkbenchCommonProperties } from 'vs/workbench/services/telemetry/common/workbenchCommonProperties'; import { StorageScope, InMemoryStorageService, StorageTarget } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/workbench/services/textMate/test/browser/arrayOperation.test.ts b/src/vs/workbench/services/textMate/test/browser/arrayOperation.test.ts index 917849e3b576f..3844a0f51d147 100644 --- a/src/vs/workbench/services/textMate/test/browser/arrayOperation.test.ts +++ b/src/vs/workbench/services/textMate/test/browser/arrayOperation.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ArrayEdit, MonotonousIndexTransformer, SingleArrayEdit } from 'vs/workbench/services/textMate/browser/arrayOperation'; diff --git a/src/vs/workbench/services/textfile/test/browser/textEditorService.test.ts b/src/vs/workbench/services/textfile/test/browser/textEditorService.test.ts index 749f3cc6dc57d..af8317daf52da 100644 --- a/src/vs/workbench/services/textfile/test/browser/textEditorService.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textEditorService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IResourceDiffEditorInput, IResourceSideBySideEditorInput, isResourceDiffEditorInput, isResourceSideBySideEditorInput, isUntitledResourceEditorInput } from 'vs/workbench/common/editor'; import { workbenchInstantiationService, registerTestEditor, TestFileEditorInput, registerTestResourceEditor, registerTestSideBySideEditor } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.integrationTest.ts b/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.integrationTest.ts index 866265c14fa5a..622f4e90151f7 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.integrationTest.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts index 069b90a09d92c..e7d5625101883 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { EncodingMode, TextFileEditorModelState, snapshotToString, isTextFileEditorModel, ITextFileEditorModelSaveEvent } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts index 6cbeccc887666..8c3c0574bf64b 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { workbenchInstantiationService, TestServiceAccessor, ITestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts index e3f16f160656b..a1cc6f8bafc44 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { workbenchInstantiationService, TestServiceAccessor, ITestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts index c01ba24353e03..5442b00a9aa9c 100644 --- a/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ITextFileService, snapshotToString, TextFileOperationError, TextFileOperationResult, stringToSnapshot } from 'vs/workbench/services/textfile/common/textfiles'; import { URI } from 'vs/base/common/uri'; import { join, basename } from 'vs/base/common/path'; diff --git a/src/vs/workbench/services/textfile/test/electron-sandbox/nativeTextFileService.test.ts b/src/vs/workbench/services/textfile/test/electron-sandbox/nativeTextFileService.test.ts index a48728e4a7a31..a767ca64fba61 100644 --- a/src/vs/workbench/services/textfile/test/electron-sandbox/nativeTextFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/electron-sandbox/nativeTextFileService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService } from 'vs/platform/files/common/files'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; diff --git a/src/vs/workbench/services/textfile/test/node/encoding/encoding.integrationTest.ts b/src/vs/workbench/services/textfile/test/node/encoding/encoding.integrationTest.ts index b7da6009727fc..ebaeb4ab36c33 100644 --- a/src/vs/workbench/services/textfile/test/node/encoding/encoding.integrationTest.ts +++ b/src/vs/workbench/services/textfile/test/node/encoding/encoding.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as terminalEncoding from 'vs/base/node/terminalEncoding'; import * as encoding from 'vs/workbench/services/textfile/common/encoding'; diff --git a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts index f2a811f980774..9d86f5f146b9f 100644 --- a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts +++ b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import * as fs from 'fs'; import * as encoding from 'vs/workbench/services/textfile/common/encoding'; import * as streams from 'vs/base/common/stream'; diff --git a/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts index f38d12fc2bbdd..34d9c854314a9 100644 --- a/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts +++ b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ITextModel } from 'vs/editor/common/model'; import { URI } from 'vs/base/common/uri'; import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; diff --git a/src/vs/workbench/services/themes/test/node/tokenStyleResolving.test.ts b/src/vs/workbench/services/themes/test/node/tokenStyleResolving.test.ts index 98701b3dadadb..3376ac6e47d83 100644 --- a/src/vs/workbench/services/themes/test/node/tokenStyleResolving.test.ts +++ b/src/vs/workbench/services/themes/test/node/tokenStyleResolving.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ColorThemeData } from 'vs/workbench/services/themes/common/colorThemeData'; -import * as assert from 'assert'; +import assert from 'assert'; import { ITokenColorCustomizations } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { TokenStyle, getTokenClassificationRegistry } from 'vs/platform/theme/common/tokenClassificationRegistry'; import { Color } from 'vs/base/common/color'; diff --git a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.integrationTest.ts b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.integrationTest.ts index f64d8c7e4c835..35936c00f50e2 100644 --- a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.integrationTest.ts +++ b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.integrationTest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput'; diff --git a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts index 9ccf8fa049a06..1ccafa64c8106 100644 --- a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts +++ b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/path'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts b/src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts index f97c4ab35ba48..94c72c799df49 100644 --- a/src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts +++ b/src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts @@ -7,7 +7,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { DomActivityTracker } from 'vs/workbench/services/userActivity/browser/domActivityTracker'; import { UserActivityService } from 'vs/workbench/services/userActivity/common/userActivityService'; import * as sinon from 'sinon'; -import * as assert from 'assert'; +import assert from 'assert'; suite('DomActivityTracker', () => { let uas: UserActivityService; diff --git a/src/vs/workbench/services/views/test/browser/viewContainerModel.test.ts b/src/vs/workbench/services/views/test/browser/viewContainerModel.test.ts index f37d4af42b73f..c20ad890065c7 100644 --- a/src/vs/workbench/services/views/test/browser/viewContainerModel.test.ts +++ b/src/vs/workbench/services/views/test/browser/viewContainerModel.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as assert from 'assert'; +import assert from 'assert'; import * as sinon from 'sinon'; import { IViewsRegistry, IViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewContainerModel, IViewDescriptorService, ViewContainer } from 'vs/workbench/common/views'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/views/test/browser/viewDescriptorService.test.ts b/src/vs/workbench/services/views/test/browser/viewDescriptorService.test.ts index 31b8bb8a6a335..f9ab97f41e2d3 100644 --- a/src/vs/workbench/services/views/test/browser/viewDescriptorService.test.ts +++ b/src/vs/workbench/services/views/test/browser/viewDescriptorService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as assert from 'assert'; +import assert from 'assert'; import { IViewsRegistry, IViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, ViewContainer, ViewContainerLocationToString } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/fileWorkingCopyManager.test.ts b/src/vs/workbench/services/workingCopy/test/browser/fileWorkingCopyManager.test.ts index 2988bbb28dc04..be93a5dea1f5c 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/fileWorkingCopyManager.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/fileWorkingCopyManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { workbenchInstantiationService, TestServiceAccessor, TestInMemoryFileSystemProvider } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/resourceWorkingCopy.test.ts b/src/vs/workbench/services/workingCopy/test/browser/resourceWorkingCopy.test.ts index fee71d4e7d07b..527e47deac1e4 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/resourceWorkingCopy.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/resourceWorkingCopy.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts b/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts index ab5922a8e16f4..33c986d3432f0 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event, Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { StoredFileWorkingCopy, StoredFileWorkingCopyState, IStoredFileWorkingCopyModel, IStoredFileWorkingCopyModelContentChangedEvent, IStoredFileWorkingCopyModelFactory, isStoredFileWorkingCopySaveEvent, IStoredFileWorkingCopySaveEvent } from 'vs/workbench/services/workingCopy/common/storedFileWorkingCopy'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopyManager.test.ts b/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopyManager.test.ts index fc20107d8107d..08dc69d5ae5e4 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopyManager.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopyManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { workbenchInstantiationService, TestServiceAccessor, TestWillShutdownEvent } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopy.test.ts b/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopy.test.ts index 42177887afd29..5b9239849f7c3 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopy.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopy.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBufferReadableStream, newWriteableBufferStream, VSBuffer, streamToBuffer, bufferToStream, readableToBuffer, VSBufferReadable } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopyManager.test.ts b/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopyManager.test.ts index e123722055477..45e86fd3d38c7 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopyManager.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/untitledFileWorkingCopyManager.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { bufferToStream, VSBuffer } from 'vs/base/common/buffer'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/untitledScratchpadWorkingCopy.test.ts b/src/vs/workbench/services/workingCopy/test/browser/untitledScratchpadWorkingCopy.test.ts index a04a7c4951ac8..91926cb177481 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/untitledScratchpadWorkingCopy.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/untitledScratchpadWorkingCopy.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { VSBufferReadableStream, VSBuffer, streamToBuffer, bufferToStream, readableToBuffer, VSBufferReadable } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts b/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts index 1e741e7bc9ee9..5dff0762979d0 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/workingCopyEditorService.test.ts b/src/vs/workbench/services/workingCopy/test/browser/workingCopyEditorService.test.ts index 9821fae2c4a2f..e759ceb0d82bb 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyEditorService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyEditorService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts index af1ee0b5b00c7..a6458af7ac947 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts b/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts index 384e3b1795561..e0214cd2d79ea 100644 --- a/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IWorkingCopy } from 'vs/workbench/services/workingCopy/common/workingCopy'; import { URI } from 'vs/base/common/uri'; import { TestWorkingCopy } from 'vs/workbench/test/common/workbenchTestServices'; diff --git a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts index b4ee3100922e6..2e70ca1e8b48d 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import { insert } from 'vs/base/common/arrays'; import { hash } from 'vs/base/common/hash'; diff --git a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupTracker.test.ts b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupTracker.test.ts index fa293b361cf92..ae14f5d12d438 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupTracker.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupTracker.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { isMacintosh, isWindows } from 'vs/base/common/platform'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryService.test.ts b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryService.test.ts index 40a3f059f9b3b..83bd0aeebad34 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryService.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TestContextService, TestStorageService, TestWorkingCopy } from 'vs/workbench/test/common/workbenchTestServices'; import { NullLogService } from 'vs/platform/log/common/log'; import { FileService } from 'vs/platform/files/common/fileService'; diff --git a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryTracker.test.ts b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryTracker.test.ts index ef04d7041db52..b749708ada9c5 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryTracker.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyHistoryTracker.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Event } from 'vs/base/common/event'; import { TestContextService, TestWorkingCopy } from 'vs/workbench/test/common/workbenchTestServices'; import { randomPath } from 'vs/base/common/extpath'; diff --git a/src/vs/workbench/services/workspaces/test/browser/workspaces.test.ts b/src/vs/workbench/services/workspaces/test/browser/workspaces.test.ts index a1e1a9f728f33..166b616d4c596 100644 --- a/src/vs/workbench/services/workspaces/test/browser/workspaces.test.ts +++ b/src/vs/workbench/services/workspaces/test/browser/workspaces.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { getWorkspaceIdentifier, getSingleFolderWorkspaceIdentifier } from 'vs/workbench/services/workspaces/browser/workspaces'; diff --git a/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts b/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts index 6b9bd8a882db0..203cde08ee20b 100644 --- a/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts +++ b/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/test/browser/codeeditor.test.ts b/src/vs/workbench/test/browser/codeeditor.test.ts index 686bc17e88bec..59ac60e96ffbc 100644 --- a/src/vs/workbench/test/browser/codeeditor.test.ts +++ b/src/vs/workbench/test/browser/codeeditor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { URI } from 'vs/base/common/uri'; import { workbenchInstantiationService, TestEditorService } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/test/browser/contributions.test.ts b/src/vs/workbench/test/browser/contributions.test.ts index 8f878d6ab538c..adb429673b1c9 100644 --- a/src/vs/workbench/test/browser/contributions.test.ts +++ b/src/vs/workbench/test/browser/contributions.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DeferredPromise } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { isCI } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/test/browser/part.test.ts b/src/vs/workbench/test/browser/part.test.ts index 38e6ef77ccef6..6666c5b50b4ac 100644 --- a/src/vs/workbench/test/browser/part.test.ts +++ b/src/vs/workbench/test/browser/part.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Part } from 'vs/workbench/browser/part'; import { isEmptyObject } from 'vs/base/common/types'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; diff --git a/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts b/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts index 47eb7efceba9b..2b68bdea2ddd6 100644 --- a/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { BreadcrumbsModel, FileElement } from 'vs/workbench/browser/parts/editor/breadcrumbsModel'; diff --git a/src/vs/workbench/test/browser/parts/editor/diffEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/diffEditorInput.test.ts index be64312662062..60d9d1339816f 100644 --- a/src/vs/workbench/test/browser/parts/editor/diffEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/diffEditorInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/test/browser/parts/editor/editor.test.ts b/src/vs/workbench/test/browser/parts/editor/editor.test.ts index eaf064119d07b..00add777446e7 100644 --- a/src/vs/workbench/test/browser/parts/editor/editor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EditorResourceAccessor, SideBySideEditor, EditorInputWithPreferredResource, EditorInputCapabilities, isEditorIdentifier, IResourceDiffEditorInput, IUntitledTextResourceEditorInput, isResourceEditorInput, isUntitledResourceEditorInput, isResourceDiffEditorInput, isEditorInputWithOptionsAndGroup, EditorInputWithOptions, isEditorInputWithOptions, isEditorInput, EditorInputWithOptionsAndGroup, isResourceSideBySideEditorInput, IResourceSideBySideEditorInput, isTextEditorViewState, isResourceMergeEditorInput, IResourceMergeEditorInput } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts index b6ece8430e7e7..a2047327ff1de 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorModel'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; diff --git a/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts index 22a0fd80cf981..f87bac4abaa59 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EditorGroupModel, IGroupEditorChangeEvent, IGroupEditorCloseEvent, IGroupEditorMoveEvent, IGroupEditorOpenEvent, ISerializedEditorGroupModel, isGroupEditorChangeEvent, isGroupEditorCloseEvent, isGroupEditorMoveEvent, isGroupEditorOpenEvent } from 'vs/workbench/common/editor/editorGroupModel'; import { EditorExtensions, IEditorFactoryRegistry, IFileEditorInput, IEditorSerializer, CloseDirection, EditorsOrder, IResourceDiffEditorInput, IResourceSideBySideEditorInput, SideBySideEditor, EditorCloseContext, GroupModelChangeKind } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/browser/parts/editor/editorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/editorInput.test.ts index 4c1b74c31e770..e66b98bd3ad22 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts index f293125aad4cd..05cc0e521e6a7 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { IModelService } from 'vs/editor/common/services/model'; diff --git a/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts b/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts index 3d817b86fea87..2aae30b52436b 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EditorPane, EditorMemento } from 'vs/workbench/browser/parts/editor/editorPane'; import { WorkspaceTrustRequiredPlaceholderEditor } from 'vs/workbench/browser/parts/editor/editorPlaceholder'; import { IEditorSerializer, IEditorFactoryRegistry, EditorExtensions, EditorInputCapabilities, IEditorDescriptor, IEditorPane } from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/test/browser/parts/editor/filteredEditorGroupModel.test.ts b/src/vs/workbench/test/browser/parts/editor/filteredEditorGroupModel.test.ts index 80765957797e0..53db7729f74a0 100644 --- a/src/vs/workbench/test/browser/parts/editor/filteredEditorGroupModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/filteredEditorGroupModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { EditorGroupModel, ISerializedEditorGroupModel } from 'vs/workbench/common/editor/editorGroupModel'; import { EditorExtensions, IEditorFactoryRegistry, IFileEditorInput, IEditorSerializer, EditorsOrder, GroupModelChangeKind } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts index 2002d562f559f..c3dd4fd67a81c 100644 --- a/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/test/browser/parts/editor/sideBySideEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/sideBySideEditorInput.test.ts index cbd6264885fe5..4be1b5c4fc44e 100644 --- a/src/vs/workbench/test/browser/parts/editor/sideBySideEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/sideBySideEditorInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts b/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts index 60ab56b329ad7..a13dc9884dcd2 100644 --- a/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite, toResource } from 'vs/base/test/common/utils'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { workbenchInstantiationService, TestServiceAccessor, registerTestFileEditor, createEditorPart, TestTextFileEditor } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts index 029ad438984c6..24d70f5a76e72 100644 --- a/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; import { TextResourceEditorModel } from 'vs/workbench/common/editor/textResourceEditorModel'; diff --git a/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts b/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts index 3f0f767be4290..67a0a5140e13f 100644 --- a/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts +++ b/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { StatusbarViewModel } from 'vs/workbench/browser/parts/statusbar/statusbarModel'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; import { StatusbarAlignment } from 'vs/workbench/services/statusbar/browser/statusbar'; diff --git a/src/vs/workbench/test/browser/quickAccess.test.ts b/src/vs/workbench/test/browser/quickAccess.test.ts index 9d71c84ccf332..49c7811127462 100644 --- a/src/vs/workbench/test/browser/quickAccess.test.ts +++ b/src/vs/workbench/test/browser/quickAccess.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Registry } from 'vs/platform/registry/common/platform'; import { IQuickAccessRegistry, Extensions, IQuickAccessProvider, QuickAccessRegistry } from 'vs/platform/quickinput/common/quickAccess'; import { IQuickPick, IQuickPickItem, IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; diff --git a/src/vs/workbench/test/browser/viewlet.test.ts b/src/vs/workbench/test/browser/viewlet.test.ts index eefc87cb2d69f..0c970c81ce784 100644 --- a/src/vs/workbench/test/browser/viewlet.test.ts +++ b/src/vs/workbench/test/browser/viewlet.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { Registry } from 'vs/platform/registry/common/platform'; import { PaneCompositeDescriptor, Extensions, PaneCompositeRegistry, PaneComposite } from 'vs/workbench/browser/panecomposite'; import { isFunction } from 'vs/base/common/types'; diff --git a/src/vs/workbench/test/browser/webview.test.ts b/src/vs/workbench/test/browser/webview.test.ts index 3d0c3701f1410..31d546e934f46 100644 --- a/src/vs/workbench/test/browser/webview.test.ts +++ b/src/vs/workbench/test/browser/webview.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { parentOriginHash } from 'vs/base/browser/iframe'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/test/browser/window.test.ts b/src/vs/workbench/test/browser/window.test.ts index f65d50c3aea54..fe3c2ff236a81 100644 --- a/src/vs/workbench/test/browser/window.test.ts +++ b/src/vs/workbench/test/browser/window.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { IRegisteredCodeWindow } from 'vs/base/browser/dom'; import { CodeWindow, mainWindow } from 'vs/base/browser/window'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/test/common/memento.test.ts b/src/vs/workbench/test/common/memento.test.ts index 84502b1c32185..7850379177f00 100644 --- a/src/vs/workbench/test/common/memento.test.ts +++ b/src/vs/workbench/test/common/memento.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { StorageScope, IStorageService, StorageTarget } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/workbench/test/common/notifications.test.ts b/src/vs/workbench/test/common/notifications.test.ts index de27e6b87cd1c..ac087cde92926 100644 --- a/src/vs/workbench/test/common/notifications.test.ts +++ b/src/vs/workbench/test/common/notifications.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { NotificationsModel, NotificationViewItem, INotificationChangeEvent, NotificationChangeType, NotificationViewItemContentChangeKind, IStatusMessageChangeEvent, StatusMessageChangeType, INotificationsFilter } from 'vs/workbench/common/notifications'; import { Action } from 'vs/base/common/actions'; import { INotification, Severity, NotificationsFilter, NotificationPriority } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/test/common/resources.test.ts b/src/vs/workbench/test/common/resources.test.ts index 6ce08bcf9ea27..82cb89a37a366 100644 --- a/src/vs/workbench/test/common/resources.test.ts +++ b/src/vs/workbench/test/common/resources.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/test/common/utils.ts b/src/vs/workbench/test/common/utils.ts index b28eb1d1c8bea..697812f153cf3 100644 --- a/src/vs/workbench/test/common/utils.ts +++ b/src/vs/workbench/test/common/utils.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { LanguagesRegistry } from 'vs/editor/common/services/languagesRegistry'; /** diff --git a/src/vs/workbench/test/electron-sandbox/resolveExternal.test.ts b/src/vs/workbench/test/electron-sandbox/resolveExternal.test.ts index 14536883beabe..ff49db5e3c7d2 100644 --- a/src/vs/workbench/test/electron-sandbox/resolveExternal.test.ts +++ b/src/vs/workbench/test/electron-sandbox/resolveExternal.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; +import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NativeWindow } from 'vs/workbench/electron-sandbox/window'; import { ITunnelService, RemoteTunnel } from 'vs/platform/tunnel/common/tunnel'; From 5012cb8fb863450625c9bc7b38e8d6df4376d303 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 3 Jun 2024 17:21:09 +0200 Subject: [PATCH 015/755] adding missing bundle.js compile output --- build/lib/bundle.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/lib/bundle.js b/build/lib/bundle.js index 61d9f0156241b..1a2f870991f3c 100644 --- a/build/lib/bundle.js +++ b/build/lib/bundle.js @@ -231,6 +231,9 @@ function removeDuplicateTSBoilerplate(destFiles) { { start: /^var __param/, end: /^};$/ }, { start: /^var __awaiter/, end: /^};$/ }, { start: /^var __generator/, end: /^};$/ }, + { start: /^var __createBinding/, end: /^}\)\);$/ }, + { start: /^var __setModuleDefault/, end: /^}\);$/ }, + { start: /^var __importStar/, end: /^};$/ }, ]; destFiles.forEach((destFile) => { const SEEN_BOILERPLATE = []; From 660018a75f944cd9cc27073eef4fc6918ef7ae23 Mon Sep 17 00:00:00 2001 From: Andrea Mah <31675041+andreamah@users.noreply.github.com> Date: Mon, 3 Jun 2024 08:31:42 -0700 Subject: [PATCH 016/755] dispose child instantiation service in search (#214145) --- src/vs/workbench/contrib/search/browser/searchResultsView.ts | 2 +- src/vs/workbench/contrib/search/browser/searchView.ts | 4 ++-- src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/search/browser/searchResultsView.ts b/src/vs/workbench/contrib/search/browser/searchResultsView.ts index d7c088c442e05..5e66ae72d6c78 100644 --- a/src/vs/workbench/contrib/search/browser/searchResultsView.ts +++ b/src/vs/workbench/contrib/search/browser/searchResultsView.ts @@ -136,7 +136,7 @@ export class FolderMatchRenderer extends Disposable implements ICompressibleTree SearchContext.FileFocusKey.bindTo(contextKeyServiceMain).set(false); SearchContext.FolderFocusKey.bindTo(contextKeyServiceMain).set(true); - const instantiationService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, contextKeyServiceMain])); + const instantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, contextKeyServiceMain]))); const actions = disposables.add(instantiationService.createInstance(MenuWorkbenchToolBar, actionBarContainer, MenuId.SearchActionMenu, { menuOptions: { shouldForwardArgs: true diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 69e8a91054004..6359674b81f6f 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -237,8 +237,8 @@ export class SearchView extends ViewPane { this.inputPatternExclusionsFocused = Constants.SearchContext.PatternExcludesFocusedKey.bindTo(this.contextKeyService); this.isEditableItem = Constants.SearchContext.IsEditableItemKey.bindTo(this.contextKeyService); - this.instantiationService = this.instantiationService.createChild( - new ServiceCollection([IContextKeyService, this.contextKeyService])); + this.instantiationService = this._register(this.instantiationService.createChild( + new ServiceCollection([IContextKeyService, this.contextKeyService]))); this._register(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('search.sortOrder')) { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index c0f0f27dbfa18..e1929d3a93001 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -141,7 +141,7 @@ export class SearchEditor extends AbstractTextCodeEditor this.createQueryEditor( this.queryEditorContainer, - this.instantiationService.createChild(new ServiceCollection([IContextKeyService, scopedContextKeyService])), + this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, scopedContextKeyService]))), SearchContext.InputBoxFocusedKey.bindTo(scopedContextKeyService) ); } From 1ec00252ae8d6a508631b2011d0659e239de68f0 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 3 Jun 2024 08:53:24 -0700 Subject: [PATCH 017/755] xterm@5.6.0-beta.18 Fixes #214142 --- package.json | 14 ++++----- remote/package.json | 14 ++++----- remote/web/package.json | 12 ++++---- remote/web/yarn.lock | 58 +++++++++++++++++------------------ remote/yarn.lock | 68 ++++++++++++++++++++--------------------- yarn.lock | 68 ++++++++++++++++++++--------------------- 6 files changed, 117 insertions(+), 117 deletions(-) diff --git a/package.json b/package.json index 1965949114daf..63471db823f09 100644 --- a/package.json +++ b/package.json @@ -82,13 +82,13 @@ "@vscode/windows-mutex": "^0.5.0", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-image": "0.9.0-beta.17", - "@xterm/addon-search": "0.16.0-beta.17", - "@xterm/addon-serialize": "0.14.0-beta.17", - "@xterm/addon-unicode11": "0.9.0-beta.17", - "@xterm/addon-webgl": "0.19.0-beta.17", - "@xterm/headless": "5.6.0-beta.17", - "@xterm/xterm": "5.6.0-beta.17", + "@xterm/addon-image": "0.9.0-beta.18", + "@xterm/addon-search": "0.16.0-beta.18", + "@xterm/addon-serialize": "0.14.0-beta.18", + "@xterm/addon-unicode11": "0.9.0-beta.18", + "@xterm/addon-webgl": "0.19.0-beta.18", + "@xterm/headless": "5.6.0-beta.18", + "@xterm/xterm": "5.6.0-beta.18", "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", diff --git a/remote/package.json b/remote/package.json index b84f5136fb171..ad0f9efc07d55 100644 --- a/remote/package.json +++ b/remote/package.json @@ -14,13 +14,13 @@ "@vscode/vscode-languagedetection": "1.0.21", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-image": "0.9.0-beta.17", - "@xterm/addon-search": "0.16.0-beta.17", - "@xterm/addon-serialize": "0.14.0-beta.17", - "@xterm/addon-unicode11": "0.9.0-beta.17", - "@xterm/addon-webgl": "0.19.0-beta.17", - "@xterm/headless": "5.6.0-beta.17", - "@xterm/xterm": "5.6.0-beta.17", + "@xterm/addon-image": "0.9.0-beta.18", + "@xterm/addon-search": "0.16.0-beta.18", + "@xterm/addon-serialize": "0.14.0-beta.18", + "@xterm/addon-unicode11": "0.9.0-beta.18", + "@xterm/addon-webgl": "0.19.0-beta.18", + "@xterm/headless": "5.6.0-beta.18", + "@xterm/xterm": "5.6.0-beta.18", "cookie": "^0.4.0", "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", diff --git a/remote/web/package.json b/remote/web/package.json index 76375094a7dae..9dce97a17af50 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -7,12 +7,12 @@ "@microsoft/1ds-post-js": "^3.2.13", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/vscode-languagedetection": "1.0.21", - "@xterm/addon-image": "0.9.0-beta.17", - "@xterm/addon-search": "0.16.0-beta.17", - "@xterm/addon-serialize": "0.14.0-beta.17", - "@xterm/addon-unicode11": "0.9.0-beta.17", - "@xterm/addon-webgl": "0.19.0-beta.17", - "@xterm/xterm": "5.6.0-beta.17", + "@xterm/addon-image": "0.9.0-beta.18", + "@xterm/addon-search": "0.16.0-beta.18", + "@xterm/addon-serialize": "0.14.0-beta.18", + "@xterm/addon-unicode11": "0.9.0-beta.18", + "@xterm/addon-webgl": "0.19.0-beta.18", + "@xterm/xterm": "5.6.0-beta.18", "jschardet": "3.0.0", "tas-client-umd": "0.2.0", "vscode-oniguruma": "1.7.0", diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index 81215235ac655..8e908085a48a6 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -48,35 +48,35 @@ resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" integrity sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g== -"@xterm/addon-image@0.9.0-beta.17": - version "0.9.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.17.tgz#343d0665a6060d4f893b4f2d32de6ccbbd00bb63" - integrity sha512-g0r2hpBcLABY5as4llsMP36RHtkWooEn7tf+7U0/hTndJoCAvs4uGDqZNQigFgeAM3lJ4PnRYh4lfnEh9bGt8A== - -"@xterm/addon-search@0.16.0-beta.17": - version "0.16.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.17.tgz#7cb01c7f498405909d37040884ee22d1889a36d2" - integrity sha512-wBfxmWOeqG6HHHE5mVamDJ75zBdHC35ERNy5/aTpQsQsyxrnV0Ks76c8ZVTaTu9wyBCAyx7UmZT42Ot80khY/g== - -"@xterm/addon-serialize@0.14.0-beta.17": - version "0.14.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.17.tgz#1cb8e35c0d118060a807adb340624fa7f80dd9c5" - integrity sha512-/c3W39kdRgGGYDoYjXb5HrUC421qwPn6NryAT4WJuJWnyMtFbe2DPwKsTfHuCBPiPyovS3a9j950Md3O3YXDZA== - -"@xterm/addon-unicode11@0.9.0-beta.17": - version "0.9.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.17.tgz#b5558148029a796c6a6d78e2a8b7255f92a51530" - integrity sha512-z7v8uojFVrO1aLSWtnz5MzSrfWRT8phde7kh9ufqHLBv7YYtMHxlPVjSuW8PZ2h4eY1LOZf6icUAzrmyJmJ7Kg== - -"@xterm/addon-webgl@0.19.0-beta.17": - version "0.19.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.17.tgz#68ad9e68dd1cf581b391971de33f5c04966b0d8e" - integrity sha512-X8ObRgoZl7UZTgdndM+mpSO3hLzAhWKoXXrGvUQg/7XabRKAPrQ2XvdyZm04nYwibE6Tpit2h5kkxjlVqupIig== - -"@xterm/xterm@5.6.0-beta.17": - version "5.6.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.17.tgz#67ce2e2ff45bd6cc9f26d455d5522c6c4a122ed9" - integrity sha512-+wAv8PhaGQSN9yXWIa8EFtT33pbrA4lZakMB1P05fr+DQ7zoH66QOAUoDY95uOf/4+S6Ihz8wzP2+FH8zETQEA== +"@xterm/addon-image@0.9.0-beta.18": + version "0.9.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.18.tgz#c33c0612349f2446399f9da8db4d71252b0c1c73" + integrity sha512-X1m2lwxfxma1oZaH1w5UalE1VFqTuof2pw23UqP2ol0nGIcpd1KN+0LKrd0g+GvyFbiAgNi0ANuDfupNfjVLQQ== + +"@xterm/addon-search@0.16.0-beta.18": + version "0.16.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.18.tgz#7271cb43a56892de0ce35e650bcaec742b220fcb" + integrity sha512-iYqzlg9ujecT8opZjmjrSrFHcDt9bq6SruKlxXzWMQapMA9cdQGOJZe74tRjwQxkG3wySDHm3bPHNPB5iPKLfQ== + +"@xterm/addon-serialize@0.14.0-beta.18": + version "0.14.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.18.tgz#22a59ce3135326073cfc146123f9113e87de331d" + integrity sha512-ebNfRggeIx9hOs0kM0XaquMAvKfLwjOGRRhXCK3OAJSqkG6jNPIZ+7foHIUVxcFYb8EKfvS67ZoDStO4mZCiEg== + +"@xterm/addon-unicode11@0.9.0-beta.18": + version "0.9.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.18.tgz#993e872c7f1a58fd35c4c64aef6f34259d099e8e" + integrity sha512-kfF9i0MS/T6wGwv7Y6+nVGd/cf4GT5OdPDldiyYpINCusIkFfTC5UMojNucvbL0nN0rvRoCBhTjh8LkafQV5hw== + +"@xterm/addon-webgl@0.19.0-beta.18": + version "0.19.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.18.tgz#62f961e1255cde12444559e5ea105409598aa6d8" + integrity sha512-3vFr51TrbjXtR9RBbY4o3amGKsoni5sdgKg4NKSNZew/K3TyTFwCkj7z1HjyEsW/j9ee9KXH435pTMSmH/L40g== + +"@xterm/xterm@5.6.0-beta.18": + version "5.6.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.18.tgz#c346d5773b1e253b2cef986b5c7f9bfe372e5c54" + integrity sha512-PKpqGVlJ5e65RFxG9CgCR1Gdpz1eSttdRZZd5eEFJIyz3VQv1DUlZgfwlFhMMGRi42zyw40HuArkrw+fRRDU7Q== jschardet@3.0.0: version "3.0.0" diff --git a/remote/yarn.lock b/remote/yarn.lock index 4241bf03b14ac..4018559683c19 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -122,40 +122,40 @@ resolved "https://registry.yarnpkg.com/@vscode/windows-registry/-/windows-registry-1.1.0.tgz#03dace7c29c46f658588b9885b9580e453ad21f9" integrity sha512-5AZzuWJpGscyiMOed0IuyEwt6iKmV5Us7zuwCDCFYMIq7tsvooO9BUiciywsvuthGz6UG4LSpeDeCxvgMVhnIw== -"@xterm/addon-image@0.9.0-beta.17": - version "0.9.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.17.tgz#343d0665a6060d4f893b4f2d32de6ccbbd00bb63" - integrity sha512-g0r2hpBcLABY5as4llsMP36RHtkWooEn7tf+7U0/hTndJoCAvs4uGDqZNQigFgeAM3lJ4PnRYh4lfnEh9bGt8A== - -"@xterm/addon-search@0.16.0-beta.17": - version "0.16.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.17.tgz#7cb01c7f498405909d37040884ee22d1889a36d2" - integrity sha512-wBfxmWOeqG6HHHE5mVamDJ75zBdHC35ERNy5/aTpQsQsyxrnV0Ks76c8ZVTaTu9wyBCAyx7UmZT42Ot80khY/g== - -"@xterm/addon-serialize@0.14.0-beta.17": - version "0.14.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.17.tgz#1cb8e35c0d118060a807adb340624fa7f80dd9c5" - integrity sha512-/c3W39kdRgGGYDoYjXb5HrUC421qwPn6NryAT4WJuJWnyMtFbe2DPwKsTfHuCBPiPyovS3a9j950Md3O3YXDZA== - -"@xterm/addon-unicode11@0.9.0-beta.17": - version "0.9.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.17.tgz#b5558148029a796c6a6d78e2a8b7255f92a51530" - integrity sha512-z7v8uojFVrO1aLSWtnz5MzSrfWRT8phde7kh9ufqHLBv7YYtMHxlPVjSuW8PZ2h4eY1LOZf6icUAzrmyJmJ7Kg== - -"@xterm/addon-webgl@0.19.0-beta.17": - version "0.19.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.17.tgz#68ad9e68dd1cf581b391971de33f5c04966b0d8e" - integrity sha512-X8ObRgoZl7UZTgdndM+mpSO3hLzAhWKoXXrGvUQg/7XabRKAPrQ2XvdyZm04nYwibE6Tpit2h5kkxjlVqupIig== - -"@xterm/headless@5.6.0-beta.17": - version "5.6.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.17.tgz#bff1d67c9c061c57adff22571e733d54e3aba2b7" - integrity sha512-ehS7y/XRqX1ppx4RPiYc0vu0SdIQ91aA4lSN/2XNOf3IGdP0A38Q7a0T6mzqxRGZKiiyA0kTR1szr78wnY+wmA== - -"@xterm/xterm@5.6.0-beta.17": - version "5.6.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.17.tgz#67ce2e2ff45bd6cc9f26d455d5522c6c4a122ed9" - integrity sha512-+wAv8PhaGQSN9yXWIa8EFtT33pbrA4lZakMB1P05fr+DQ7zoH66QOAUoDY95uOf/4+S6Ihz8wzP2+FH8zETQEA== +"@xterm/addon-image@0.9.0-beta.18": + version "0.9.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.18.tgz#c33c0612349f2446399f9da8db4d71252b0c1c73" + integrity sha512-X1m2lwxfxma1oZaH1w5UalE1VFqTuof2pw23UqP2ol0nGIcpd1KN+0LKrd0g+GvyFbiAgNi0ANuDfupNfjVLQQ== + +"@xterm/addon-search@0.16.0-beta.18": + version "0.16.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.18.tgz#7271cb43a56892de0ce35e650bcaec742b220fcb" + integrity sha512-iYqzlg9ujecT8opZjmjrSrFHcDt9bq6SruKlxXzWMQapMA9cdQGOJZe74tRjwQxkG3wySDHm3bPHNPB5iPKLfQ== + +"@xterm/addon-serialize@0.14.0-beta.18": + version "0.14.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.18.tgz#22a59ce3135326073cfc146123f9113e87de331d" + integrity sha512-ebNfRggeIx9hOs0kM0XaquMAvKfLwjOGRRhXCK3OAJSqkG6jNPIZ+7foHIUVxcFYb8EKfvS67ZoDStO4mZCiEg== + +"@xterm/addon-unicode11@0.9.0-beta.18": + version "0.9.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.18.tgz#993e872c7f1a58fd35c4c64aef6f34259d099e8e" + integrity sha512-kfF9i0MS/T6wGwv7Y6+nVGd/cf4GT5OdPDldiyYpINCusIkFfTC5UMojNucvbL0nN0rvRoCBhTjh8LkafQV5hw== + +"@xterm/addon-webgl@0.19.0-beta.18": + version "0.19.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.18.tgz#62f961e1255cde12444559e5ea105409598aa6d8" + integrity sha512-3vFr51TrbjXtR9RBbY4o3amGKsoni5sdgKg4NKSNZew/K3TyTFwCkj7z1HjyEsW/j9ee9KXH435pTMSmH/L40g== + +"@xterm/headless@5.6.0-beta.18": + version "5.6.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.18.tgz#27a774455bf68565257916a3355cc61151eb9d10" + integrity sha512-3EUxNyjki4YHRlI4p/uMT6Hok3Ln4fZVi1HbFDopk3CZ0W+TXUQW4F+4fy4nkcFWYnBR9egKBcRmP2Vxk13RKQ== + +"@xterm/xterm@5.6.0-beta.18": + version "5.6.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.18.tgz#c346d5773b1e253b2cef986b5c7f9bfe372e5c54" + integrity sha512-PKpqGVlJ5e65RFxG9CgCR1Gdpz1eSttdRZZd5eEFJIyz3VQv1DUlZgfwlFhMMGRi42zyw40HuArkrw+fRRDU7Q== agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" diff --git a/yarn.lock b/yarn.lock index f2613ceef5146..b651237b72f5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1982,40 +1982,40 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@xterm/addon-image@0.9.0-beta.17": - version "0.9.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.17.tgz#343d0665a6060d4f893b4f2d32de6ccbbd00bb63" - integrity sha512-g0r2hpBcLABY5as4llsMP36RHtkWooEn7tf+7U0/hTndJoCAvs4uGDqZNQigFgeAM3lJ4PnRYh4lfnEh9bGt8A== - -"@xterm/addon-search@0.16.0-beta.17": - version "0.16.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.17.tgz#7cb01c7f498405909d37040884ee22d1889a36d2" - integrity sha512-wBfxmWOeqG6HHHE5mVamDJ75zBdHC35ERNy5/aTpQsQsyxrnV0Ks76c8ZVTaTu9wyBCAyx7UmZT42Ot80khY/g== - -"@xterm/addon-serialize@0.14.0-beta.17": - version "0.14.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.17.tgz#1cb8e35c0d118060a807adb340624fa7f80dd9c5" - integrity sha512-/c3W39kdRgGGYDoYjXb5HrUC421qwPn6NryAT4WJuJWnyMtFbe2DPwKsTfHuCBPiPyovS3a9j950Md3O3YXDZA== - -"@xterm/addon-unicode11@0.9.0-beta.17": - version "0.9.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.17.tgz#b5558148029a796c6a6d78e2a8b7255f92a51530" - integrity sha512-z7v8uojFVrO1aLSWtnz5MzSrfWRT8phde7kh9ufqHLBv7YYtMHxlPVjSuW8PZ2h4eY1LOZf6icUAzrmyJmJ7Kg== - -"@xterm/addon-webgl@0.19.0-beta.17": - version "0.19.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.17.tgz#68ad9e68dd1cf581b391971de33f5c04966b0d8e" - integrity sha512-X8ObRgoZl7UZTgdndM+mpSO3hLzAhWKoXXrGvUQg/7XabRKAPrQ2XvdyZm04nYwibE6Tpit2h5kkxjlVqupIig== - -"@xterm/headless@5.6.0-beta.17": - version "5.6.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.17.tgz#bff1d67c9c061c57adff22571e733d54e3aba2b7" - integrity sha512-ehS7y/XRqX1ppx4RPiYc0vu0SdIQ91aA4lSN/2XNOf3IGdP0A38Q7a0T6mzqxRGZKiiyA0kTR1szr78wnY+wmA== - -"@xterm/xterm@5.6.0-beta.17": - version "5.6.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.17.tgz#67ce2e2ff45bd6cc9f26d455d5522c6c4a122ed9" - integrity sha512-+wAv8PhaGQSN9yXWIa8EFtT33pbrA4lZakMB1P05fr+DQ7zoH66QOAUoDY95uOf/4+S6Ihz8wzP2+FH8zETQEA== +"@xterm/addon-image@0.9.0-beta.18": + version "0.9.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.18.tgz#c33c0612349f2446399f9da8db4d71252b0c1c73" + integrity sha512-X1m2lwxfxma1oZaH1w5UalE1VFqTuof2pw23UqP2ol0nGIcpd1KN+0LKrd0g+GvyFbiAgNi0ANuDfupNfjVLQQ== + +"@xterm/addon-search@0.16.0-beta.18": + version "0.16.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.18.tgz#7271cb43a56892de0ce35e650bcaec742b220fcb" + integrity sha512-iYqzlg9ujecT8opZjmjrSrFHcDt9bq6SruKlxXzWMQapMA9cdQGOJZe74tRjwQxkG3wySDHm3bPHNPB5iPKLfQ== + +"@xterm/addon-serialize@0.14.0-beta.18": + version "0.14.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.18.tgz#22a59ce3135326073cfc146123f9113e87de331d" + integrity sha512-ebNfRggeIx9hOs0kM0XaquMAvKfLwjOGRRhXCK3OAJSqkG6jNPIZ+7foHIUVxcFYb8EKfvS67ZoDStO4mZCiEg== + +"@xterm/addon-unicode11@0.9.0-beta.18": + version "0.9.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.18.tgz#993e872c7f1a58fd35c4c64aef6f34259d099e8e" + integrity sha512-kfF9i0MS/T6wGwv7Y6+nVGd/cf4GT5OdPDldiyYpINCusIkFfTC5UMojNucvbL0nN0rvRoCBhTjh8LkafQV5hw== + +"@xterm/addon-webgl@0.19.0-beta.18": + version "0.19.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.18.tgz#62f961e1255cde12444559e5ea105409598aa6d8" + integrity sha512-3vFr51TrbjXtR9RBbY4o3amGKsoni5sdgKg4NKSNZew/K3TyTFwCkj7z1HjyEsW/j9ee9KXH435pTMSmH/L40g== + +"@xterm/headless@5.6.0-beta.18": + version "5.6.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.18.tgz#27a774455bf68565257916a3355cc61151eb9d10" + integrity sha512-3EUxNyjki4YHRlI4p/uMT6Hok3Ln4fZVi1HbFDopk3CZ0W+TXUQW4F+4fy4nkcFWYnBR9egKBcRmP2Vxk13RKQ== + +"@xterm/xterm@5.6.0-beta.18": + version "5.6.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.18.tgz#c346d5773b1e253b2cef986b5c7f9bfe372e5c54" + integrity sha512-PKpqGVlJ5e65RFxG9CgCR1Gdpz1eSttdRZZd5eEFJIyz3VQv1DUlZgfwlFhMMGRi42zyw40HuArkrw+fRRDU7Q== "@xtuc/ieee754@^1.2.0": version "1.2.0" From 9dba4c57f56b204058acbecc9e94ddb9a204527c Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 3 Jun 2024 09:10:02 -0700 Subject: [PATCH 018/755] update default value for setting to `.experimental` (#214149) fix #213968 --- .../contrib/accessibility/browser/accessibilityConfiguration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts index 2622ffd8dafe2..1d163de1af463 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts @@ -267,7 +267,7 @@ const configuration: IConfigurationNode = { 'default': { 'volume': 70, 'debouncePositionChanges': false, - 'delays': { + 'experimental.delays': { 'general': { 'announcement': 3000, 'sound': 400 From bb102e45225bbd520f2f87b935652492573c631d Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Mon, 3 Jun 2024 09:21:04 -0700 Subject: [PATCH 019/755] get the serializer from the notebook service each time (#214036) * get the serializer from the notebook service each time * add logservice parameter * fix unit test --- .../browser/services/notebookServiceImpl.ts | 8 ++++ .../notebook/common/notebookEditorModel.ts | 28 +++++++---- .../notebookEditorModelResolverServiceImpl.ts | 2 +- .../notebook/common/notebookService.ts | 1 + .../test/browser/notebookEditorModel.test.ts | 46 +++++++++++++++---- 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts index 6a0fd2912769e..d7a74993bed63 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts @@ -697,6 +697,14 @@ export class NotebookService extends Disposable implements INotebookService { return result; } + tryGetDataProviderSync(viewType: string): SimpleNotebookProviderInfo | undefined { + const selected = this.notebookProviderInfoStore.get(viewType); + if (!selected) { + return undefined; + } + return this._notebookProviders.get(selected.id); + } + private _persistMementos(): void { this._memento.saveMemento(); diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts index 3c26eff229a02..a6a06d6318600 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts @@ -15,6 +15,7 @@ import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWriteFileOptions, IFileStatWithMetadata } from 'vs/platform/files/common/files'; +import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IRevertOptions, ISaveOptions, IUntypedEditorInput } from 'vs/workbench/common/editor'; import { EditorModel } from 'vs/workbench/common/editor/editorModel'; @@ -197,7 +198,8 @@ export class NotebookFileWorkingCopyModel extends Disposable implements IStoredF private readonly _notebookModel: NotebookTextModel, private readonly _notebookService: INotebookService, private readonly _configurationService: IConfigurationService, - private readonly _telemetryService: ITelemetryService + private readonly _telemetryService: ITelemetryService, + private readonly _logService: ILogService ) { super(); @@ -237,13 +239,22 @@ export class NotebookFileWorkingCopyModel extends Disposable implements IStoredF } private async setSaveDelegate() { - const serializer = await this.getNotebookSerializer(); - this.save = async (options: IWriteFileOptions, token: CancellationToken) => { - if (token.isCancellationRequested) { - throw new CancellationError(); - } + // make sure we wait for a serializer to resolve before we try to handle saves in the EH + await this.getNotebookSerializer(); + this.save = async (options: IWriteFileOptions, token: CancellationToken) => { try { + let serializer = this._notebookService.tryGetDataProviderSync(this.notebookModel.viewType)?.serializer; + + if (!serializer) { + this._logService.warn('No serializer found for notebook model, checking if provider still needs to be resolved'); + serializer = await this.getNotebookSerializer(); + } + + if (token.isCancellationRequested) { + throw new CancellationError(); + } + const stat = await serializer.save(this._notebookModel.uri, this._notebookModel.versionId, options, token); return stat; } catch (error) { @@ -358,7 +369,8 @@ export class NotebookFileWorkingCopyModelFactory implements IStoredFileWorkingCo private readonly _viewType: string, @INotebookService private readonly _notebookService: INotebookService, @IConfigurationService private readonly _configurationService: IConfigurationService, - @ITelemetryService private readonly _telemetryService: ITelemetryService + @ITelemetryService private readonly _telemetryService: ITelemetryService, + @ILogService private readonly _logService: ILogService ) { } async createModel(resource: URI, stream: VSBufferReadableStream, token: CancellationToken): Promise { @@ -376,7 +388,7 @@ export class NotebookFileWorkingCopyModelFactory implements IStoredFileWorkingCo } const notebookModel = this._notebookService.createNotebookTextModel(info.viewType, resource, data, info.serializer.options); - return new NotebookFileWorkingCopyModel(notebookModel, this._notebookService, this._configurationService, this._telemetryService); + return new NotebookFileWorkingCopyModel(notebookModel, this._notebookService, this._configurationService, this._telemetryService, this._logService); } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts index 9d0a90e457608..318a2a967315c 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts @@ -70,7 +70,7 @@ class NotebookModelReferenceCollection extends ReferenceCollection>this._instantiationService.createInstance( FileWorkingCopyManager, workingCopyTypeId, diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 7709674b93787..50e49939035e6 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -65,6 +65,7 @@ export interface INotebookService { registerNotebookSerializer(viewType: string, extensionData: NotebookExtensionDescription, serializer: INotebookSerializer): IDisposable; withNotebookDataProvider(viewType: string): Promise; + tryGetDataProviderSync(viewType: string): SimpleNotebookProviderInfo | undefined; getOutputMimeTypeInfo(textModel: NotebookTextModel, kernelProvides: readonly string[] | undefined, output: IOutputDto): readonly IOrderedMimeType[]; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts index 071017d82d669..9e91b28392632 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookEditorModel.test.ts @@ -15,6 +15,7 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IFileStatWithMetadata } from 'vs/platform/files/common/files'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CellKind, IOutputDto, NotebookData, NotebookSetting, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -28,7 +29,10 @@ suite('NotebookFileWorkingCopyModel', function () { let disposables: DisposableStore; let instantiationService: TestInstantiationService; const configurationService = new TestConfigurationService(); - const telemetryService = new class extends mock() { }; + const telemetryService = new class extends mock() { + override publicLogError2() { } + }; + const logservice = new class extends mock() { }; teardown(() => disposables.dispose()); @@ -65,7 +69,8 @@ suite('NotebookFileWorkingCopyModel', function () { } ), configurationService, - telemetryService + telemetryService, + logservice )); await model.snapshot(SnapshotContext.Save, CancellationToken.None); @@ -88,7 +93,8 @@ suite('NotebookFileWorkingCopyModel', function () { } ), configurationService, - telemetryService + telemetryService, + logservice )); await model.snapshot(SnapshotContext.Save, CancellationToken.None); assert.strictEqual(callCount, 1); @@ -123,7 +129,8 @@ suite('NotebookFileWorkingCopyModel', function () { } ), configurationService, - telemetryService + telemetryService, + logservice )); await model.snapshot(SnapshotContext.Save, CancellationToken.None); @@ -147,6 +154,7 @@ suite('NotebookFileWorkingCopyModel', function () { ), configurationService, telemetryService, + logservice )); await model.snapshot(SnapshotContext.Save, CancellationToken.None); @@ -181,7 +189,8 @@ suite('NotebookFileWorkingCopyModel', function () { } ), configurationService, - telemetryService + telemetryService, + logservice )); await model.snapshot(SnapshotContext.Save, CancellationToken.None); @@ -204,7 +213,8 @@ suite('NotebookFileWorkingCopyModel', function () { } ), configurationService, - telemetryService + telemetryService, + logservice )); await model.snapshot(SnapshotContext.Save, CancellationToken.None); assert.strictEqual(callCount, 1); @@ -239,7 +249,8 @@ suite('NotebookFileWorkingCopyModel', function () { } ), configurationService, - telemetryService + telemetryService, + logservice )); try { @@ -282,7 +293,8 @@ suite('NotebookFileWorkingCopyModel', function () { notebook, notebookService, configurationService, - telemetryService + telemetryService, + logservice )); // the save method should not be set if the serializer is not yet resolved @@ -299,11 +311,25 @@ suite('NotebookFileWorkingCopyModel', function () { function mockNotebookService(notebook: NotebookTextModel, notebookSerializer: Promise | INotebookSerializer) { return new class extends mock() { + private serializer: INotebookSerializer | undefined = undefined; override async withNotebookDataProvider(viewType: string): Promise { - const serializer = await notebookSerializer; + this.serializer = await notebookSerializer; + return new SimpleNotebookProviderInfo( + notebook.viewType, + this.serializer, + { + id: new ExtensionIdentifier('test'), + location: undefined + } + ); + } + override tryGetDataProviderSync(viewType: string): SimpleNotebookProviderInfo | undefined { + if (!this.serializer) { + return undefined; + } return new SimpleNotebookProviderInfo( notebook.viewType, - serializer, + this.serializer, { id: new ExtensionIdentifier('test'), location: undefined From b9b51f0fb0c85fd134766c46f1105dffe2c41edf Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 3 Jun 2024 18:40:56 +0200 Subject: [PATCH 020/755] tweak SWC options to allow module interop --- build/lib/tsb/transpiler.js | 4 ++-- build/lib/tsb/transpiler.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/lib/tsb/transpiler.js b/build/lib/tsb/transpiler.js index afec9062692b7..5dcc4ca1ed389 100644 --- a/build/lib/tsb/transpiler.js +++ b/build/lib/tsb/transpiler.js @@ -305,7 +305,7 @@ class SwcTranspiler { }, module: { type: 'amd', - noInterop: true + noInterop: false }, minify: false, }; @@ -313,7 +313,7 @@ class SwcTranspiler { ...this._swcrcAmd, module: { type: 'commonjs', - importInterop: 'none' + importInterop: 'swc' } }; static _swcrcEsm = { diff --git a/build/lib/tsb/transpiler.ts b/build/lib/tsb/transpiler.ts index a546ea63316d4..cbc3d9e8eeeb6 100644 --- a/build/lib/tsb/transpiler.ts +++ b/build/lib/tsb/transpiler.ts @@ -388,7 +388,7 @@ export class SwcTranspiler implements ITranspiler { }, module: { type: 'amd', - noInterop: true + noInterop: false }, minify: false, }; @@ -397,7 +397,7 @@ export class SwcTranspiler implements ITranspiler { ...this._swcrcAmd, module: { type: 'commonjs', - importInterop: 'none' + importInterop: 'swc' } }; From 176b64ac00c41a0b781c6e70bfcc10ca1a7ca946 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 3 Jun 2024 10:39:02 -0700 Subject: [PATCH 021/755] [Engineering] Update locker.yml to skip locking closed backlog candidate issues (#214160) Update locker.yml to ignore closed backlog candidate issues --- .github/workflows/locker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index 5860349a43758..cc6e89aa6da11 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -21,8 +21,8 @@ jobs: uses: ./actions/locker with: daysSinceClose: 45 - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} daysSinceUpdate: 3 ignoredLabel: "*out-of-scope,accessibility" ignoreLabelUntil: "author-verification-requested" + ignoredMilestones: "Backlog Candidates" labelUntil: "verified" From 06a16255cacde9970cffe420e52932ef186de2a9 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Mon, 3 Jun 2024 10:49:51 -0700 Subject: [PATCH 022/755] switch default interactive.execute keybinding (#214161) switch default keybinding --- .../contrib/interactive/browser/interactive.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index cc21b0371a639..24e4478a2782f 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -816,7 +816,7 @@ Registry.as(ConfigurationExtensions.Configuration).regis }, ['interactiveWindow.executeWithShiftEnter']: { type: 'boolean', - default: true, + default: false, markdownDescription: localize('interactiveWindow.executeWithShiftEnter', "Execute the interactive window (REPL) input box with shift+enter, so that enter can be used to create a newline.") } } From 2a2a0dbbac1cab6a95245b3b6bcd23d493b03171 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 3 Jun 2024 11:13:55 -0700 Subject: [PATCH 023/755] Use correct offset when removing instruction breakpoints (#214162) Fix #212496 --- src/vs/workbench/contrib/debug/browser/breakpointsView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index 8b989fb46f485..4afa61df99c5b 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -1643,7 +1643,7 @@ registerAction2(class extends Action2 { } else if (breakpoint instanceof DataBreakpoint) { await debugService.removeDataBreakpoints(breakpoint.getId()); } else if (breakpoint instanceof InstructionBreakpoint) { - await debugService.removeInstructionBreakpoints(breakpoint.instructionReference); + await debugService.removeInstructionBreakpoints(breakpoint.instructionReference, breakpoint.offset); } } }); From 21033da56ffd67b6917695141353810745c24ad0 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 3 Jun 2024 11:22:31 -0700 Subject: [PATCH 024/755] deconstruct `signalOptions` config object, migrate settings (#214163) fix #213618 --- .../browser/accessibilityConfiguration.ts | 213 ++++++++---------- 1 file changed, 89 insertions(+), 124 deletions(-) diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts index 1d163de1af463..0ed847ca9fde0 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts @@ -171,118 +171,77 @@ const configuration: IConfigurationNode = { type: 'boolean', default: true }, - 'accessibility.signalOptions': { - description: 'Configures the behavior of signals (audio cues and announcements) in the workbench. Includes volume, debounce position changes, and delays for different types of signals.', - type: 'object', - additionalProperties: false, - properties: { - 'volume': { - 'description': localize('accessibility.signalOptions.volume', "The volume of the sounds in percent (0-100)."), + 'accessibility.signalOptions.volume': { + 'description': localize('accessibility.signalOptions.volume', "The volume of the sounds in percent (0-100)."), + 'type': 'number', + 'minimum': 0, + 'maximum': 100, + 'default': 70, + 'tags': ['accessibility'] + }, + 'accessibility.signalOptions.debouncePositionChanges': { + 'description': localize('accessibility.signalOptions.debouncePositionChanges', "Whether or not position changes should be debounced"), + 'type': 'boolean', + 'default': false, + 'tags': ['accessibility'] + }, + 'accessibility.signalOptions.experimental.delays.general': { + 'type': 'object', + 'description': 'Delays for all signals besides error and warning at position', + 'additionalProperties': false, + 'properties': { + 'announcement': { + 'description': localize('accessibility.signalOptions.delays.general.announcement', "The delay in milliseconds before an announcement is made."), 'type': 'number', 'minimum': 0, - 'maximum': 100, - 'default': 70, + 'default': 3000 }, - 'debouncePositionChanges': { - 'description': localize('accessibility.signalOptions.debouncePositionChanges', "Whether or not position changes should be debounced"), - 'type': 'boolean', - 'default': false, - }, - 'experimental.delays': { - 'type': 'object', - 'additionalProperties': false, - 'properties': { - 'general': { - 'type': 'object', - 'description': 'Delays for all signals besides error and warning at position', - 'additionalProperties': false, - 'properties': { - 'announcement': { - 'description': localize('accessibility.signalOptions.delays.general.announcement', "The delay in milliseconds before an announcement is made."), - 'type': 'number', - 'minimum': 0, - 'default': 3000 - }, - 'sound': { - 'description': localize('accessibility.signalOptions.delays.general.sound', "The delay in milliseconds before a sound is played."), - 'type': 'number', - 'minimum': 0, - 'default': 400 - } - }, - }, - 'warningAtPosition': { - 'type': 'object', - 'additionalProperties': false, - 'properties': { - 'announcement': { - 'description': localize('accessibility.signalOptions.delays.warningAtPosition.announcement', "The delay in milliseconds before an announcement is made when there's a warning at the position."), - 'type': 'number', - 'minimum': 0, - 'default': 3000 - }, - 'sound': { - 'description': localize('accessibility.signalOptions.delays.warningAtPosition.sound', "The delay in milliseconds before a sound is played when there's a warning at the position."), - 'type': 'number', - 'minimum': 0, - 'default': 1000 - } - }, - }, - 'errorAtPosition': { - 'type': 'object', - 'additionalProperties': false, - 'properties': { - 'announcement': { - 'description': localize('accessibility.signalOptions.delays.errorAtPosition.announcement', "The delay in milliseconds before an announcement is made when there's an error at the position."), - 'type': 'number', - 'minimum': 0, - 'default': 3000 - }, - 'sound': { - 'description': localize('accessibility.signalOptions.delays.errorAtPosition.sound', "The delay in milliseconds before a sound is played when there's an error at the position."), - 'type': 'number', - 'minimum': 0, - 'default': 1000 - } - }, - }, - }, - 'default': { - 'general': { - 'announcement': 3000, - 'sound': 400 - }, - 'warningAtPosition': { - 'announcement': 3000, - 'sound': 1000 - }, - 'errorAtPosition': { - 'announcement': 3000, - 'sound': 1000 - } - } + 'sound': { + 'description': localize('accessibility.signalOptions.delays.general.sound', "The delay in milliseconds before a sound is played."), + 'type': 'number', + 'minimum': 0, + 'default': 400 + } + }, + 'tags': ['accessibility'] + }, + 'accessibility.signalOptions.experimental.delays.warningAtPosition': { + 'type': 'object', + 'additionalProperties': false, + 'properties': { + 'announcement': { + 'description': localize('accessibility.signalOptions.delays.warningAtPosition.announcement', "The delay in milliseconds before an announcement is made when there's a warning at the position."), + 'type': 'number', + 'minimum': 0, + 'default': 3000 }, + 'sound': { + 'description': localize('accessibility.signalOptions.delays.warningAtPosition.sound', "The delay in milliseconds before a sound is played when there's a warning at the position."), + 'type': 'number', + 'minimum': 0, + 'default': 1000 + } }, - 'default': { - 'volume': 70, - 'debouncePositionChanges': false, - 'experimental.delays': { - 'general': { - 'announcement': 3000, - 'sound': 400 - }, - 'warningAtPosition': { - 'announcement': 3000, - 'sound': 1000 - }, - 'errorAtPosition': { - 'announcement': 3000, - 'sound': 1000 - } + 'tags': ['accessibility'] + }, + 'accessibility.signalOptions.experimental.delays.errorAtPosition': { + 'type': 'object', + 'additionalProperties': false, + 'properties': { + 'announcement': { + 'description': localize('accessibility.signalOptions.delays.errorAtPosition.announcement', "The delay in milliseconds before an announcement is made when there's an error at the position."), + 'type': 'number', + 'minimum': 0, + 'default': 3000 + }, + 'sound': { + 'description': localize('accessibility.signalOptions.delays.errorAtPosition.sound', "The delay in milliseconds before a sound is played when there's an error at the position."), + 'type': 'number', + 'minimum': 0, + 'default': 1000 } }, - tags: ['accessibility'] + 'tags': ['accessibility'] }, 'accessibility.signals.lineHasBreakpoint': { ...signalFeatureBase, @@ -804,10 +763,9 @@ export class DynamicSpeechAccessibilityConfiguration extends Disposable implemen Registry.as(WorkbenchExtensions.ConfigurationMigration) .registerConfigurationMigrations([{ key: 'audioCues.volume', - migrateFn: (volume, accessor) => { - const debouncePositionChanges = getDebouncePositionChangesFromConfig(accessor); + migrateFn: (value, accessor) => { return [ - ['accessibility.signalOptions', { value: debouncePositionChanges !== undefined ? { volume, debouncePositionChanges } : { volume } }], + ['accessibility.signalOptions.volume', { value }], ['audioCues.volume', { value: undefined }] ]; } @@ -816,10 +774,9 @@ Registry.as(WorkbenchExtensions.ConfigurationMi Registry.as(WorkbenchExtensions.ConfigurationMigration) .registerConfigurationMigrations([{ key: 'audioCues.debouncePositionChanges', - migrateFn: (debouncePositionChanges, accessor) => { - const volume = getVolumeFromConfig(accessor); + migrateFn: (value) => { return [ - ['accessibility.signalOptions', { value: volume !== undefined ? { volume, debouncePositionChanges } : { debouncePositionChanges } }], + ['accessibility.signalOptions.debouncePositionChanges', { value }], ['audioCues.debouncePositionChanges', { value: undefined }] ]; } @@ -829,12 +786,18 @@ Registry.as(WorkbenchExtensions.ConfigurationMi .registerConfigurationMigrations([{ key: 'accessibility.signalOptions', migrateFn: (value, accessor) => { - const delays = value.delays; - if (!delays) { - return []; - } + const delayGeneral = getDelaysFromConfig(accessor, 'general'); + const delayError = getDelaysFromConfig(accessor, 'errorAtPosition'); + const delayWarning = getDelaysFromConfig(accessor, 'warningAtPosition'); + const volume = getVolumeFromConfig(accessor); + const debouncePositionChanges = getDebouncePositionChangesFromConfig(accessor); return [ - ['accessibility.signalOptions', { value: { ...value, 'experimental.delays': delays, 'delays': undefined } }], + ['accessibility.signalOptions.volume', { value: volume }], + ['accessibility.signalOptions.debouncePositionChanges', { value: debouncePositionChanges }], + ['accessibility.signalOptions.experimental.delays.general', { value: delayGeneral }], + ['accessibility.signalOptions.experimental.delays.errorAtPosition', { value: delayError }], + ['accessibility.signalOptions.experimental.delays.warningAtPosition', { value: delayWarning }], + ['accessibility.signalOptions', { value: undefined }], ]; } }]); @@ -843,10 +806,9 @@ Registry.as(WorkbenchExtensions.ConfigurationMi Registry.as(WorkbenchExtensions.ConfigurationMigration) .registerConfigurationMigrations([{ key: 'accessibility.signals.sounds.volume', - migrateFn: (volume, accessor) => { - const debouncePositionChanges = getDebouncePositionChangesFromConfig(accessor); + migrateFn: (value) => { return [ - ['accessibility.signalOptions', { value: debouncePositionChanges !== undefined ? { volume, debouncePositionChanges } : { volume } }], + ['accessibility.signalOptions.volume', { value }], ['accessibility.signals.sounds.volume', { value: undefined }] ]; } @@ -855,21 +817,24 @@ Registry.as(WorkbenchExtensions.ConfigurationMi Registry.as(WorkbenchExtensions.ConfigurationMigration) .registerConfigurationMigrations([{ key: 'accessibility.signals.debouncePositionChanges', - migrateFn: (debouncePositionChanges, accessor) => { - const volume = getVolumeFromConfig(accessor); + migrateFn: (value) => { return [ - ['accessibility.signalOptions', { value: volume !== undefined ? { volume, debouncePositionChanges } : { debouncePositionChanges } }], + ['accessibility.signalOptions.debouncePositionChanges', { value }], ['accessibility.signals.debouncePositionChanges', { value: undefined }] ]; } }]); +function getDelaysFromConfig(accessor: (key: string) => any, type: 'general' | 'errorAtPosition' | 'warningAtPosition'): { announcement: number; sound: number } | undefined { + return accessor(`accessibility.signalOptions.experimental.delays.${type}`) || accessor('accessibility.signalOptions')?.['experimental.delays']?.[`${type}`] || accessor('accessibility.signalOptions')?.['delays']?.[`${type}`]; +} + function getVolumeFromConfig(accessor: (key: string) => any): string | undefined { - return accessor('accessibility.signalOptions')?.volume || accessor('accessibility.signals.sounds.volume') || accessor('audioCues.volume'); + return accessor('accessibility.signalOptions.volume') || accessor('accessibility.signalOptions')?.volume || accessor('accessibility.signals.sounds.volume') || accessor('audioCues.volume'); } function getDebouncePositionChangesFromConfig(accessor: (key: string) => any): number | undefined { - return accessor('accessibility.signalOptions')?.debouncePositionChanges || accessor('accessibility.signals.debouncePositionChanges') || accessor('audioCues.debouncePositionChanges'); + return accessor('accessibility.signalOptions.debouncePositionChanges') || accessor('accessibility.signalOptions')?.debouncePositionChanges || accessor('accessibility.signals.debouncePositionChanges') || accessor('audioCues.debouncePositionChanges'); } Registry.as(WorkbenchExtensions.ConfigurationMigration) From 438ea79aa116ff28e26a708c05956fb205f9eb13 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Mon, 3 Jun 2024 11:36:49 -0700 Subject: [PATCH 025/755] refactor: move Add Context... actions to core (#214167) --- .../api/browser/mainThreadChatVariables.ts | 7 --- .../workbench/api/common/extHost.api.impl.ts | 4 -- .../workbench/api/common/extHost.protocol.ts | 2 - .../api/common/extHostChatVariables.ts | 4 -- .../browser/actions/chatContextActions.ts | 56 +++++++++++++++++++ .../vscode.proposed.chatVariableResolver.d.ts | 9 --- 6 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadChatVariables.ts b/src/vs/workbench/api/browser/mainThreadChatVariables.ts index bf7103206a0d9..9e08e5d14232c 100644 --- a/src/vs/workbench/api/browser/mainThreadChatVariables.ts +++ b/src/vs/workbench/api/browser/mainThreadChatVariables.ts @@ -5,10 +5,7 @@ import { DisposableMap } from 'vs/base/common/lifecycle'; import { revive } from 'vs/base/common/marshalling'; -import { URI } from 'vs/base/common/uri'; -import { Location } from 'vs/editor/common/languages'; import { ExtHostChatVariablesShape, ExtHostContext, IChatVariableResolverProgressDto, MainContext, MainThreadChatVariablesShape } from 'vs/workbench/api/common/extHost.protocol'; -import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IChatRequestVariableValue, IChatVariableData, IChatVariableResolverProgress, IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import { IExtHostContext, extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; @@ -50,8 +47,4 @@ export class MainThreadChatVariables implements MainThreadChatVariablesShape { $unregisterVariable(handle: number): void { this._variables.deleteAndDispose(handle); } - - $attachContext(name: string, value: string | URI | Location | unknown, location: ChatAgentLocation.Panel): void { - this._chatVariablesService.attachContext(name, revive(value), location); - } } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 680d04cb5ddaa..d76d6aa4bf088 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1429,10 +1429,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I createDynamicChatParticipant(id: string, dynamicProps: vscode.DynamicChatParticipantProps, handler: vscode.ChatExtendedRequestHandler): vscode.ChatParticipant { checkProposedApiEnabled(extension, 'chatParticipantPrivate'); return extHostChatAgents2.createDynamicChatAgent(extension, id, dynamicProps, handler); - }, - attachContext(name: string, value: string | vscode.Uri | vscode.Location | unknown, location: vscode.ChatLocation.Panel) { - checkProposedApiEnabled(extension, 'chatVariableResolver'); - return extHostChatVariables.attachContext(name, value, location); } }; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2d10d6b712967..ee8399645e8a5 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -6,7 +6,6 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IRemoteConsoleLog } from 'vs/base/common/console'; -import { Location } from 'vs/editor/common/languages'; import { SerializedError } from 'vs/base/common/errors'; import { IRelativePattern } from 'vs/base/common/glob'; import { IMarkdownString } from 'vs/base/common/htmlContent'; @@ -1291,7 +1290,6 @@ export interface MainThreadChatVariablesShape extends IDisposable { $registerVariable(handle: number, data: IChatVariableData): void; $handleProgressChunk(requestId: string, progress: IChatVariableResolverProgressDto): Promise; $unregisterVariable(handle: number): void; - $attachContext(name: string, value: string | Dto | URI | unknown, location: ChatAgentLocation): void; } export type IChatRequestVariableValueDto = Dto; diff --git a/src/vs/workbench/api/common/extHostChatVariables.ts b/src/vs/workbench/api/common/extHostChatVariables.ts index 5f0bf7d244953..dfc37201bd40f 100644 --- a/src/vs/workbench/api/common/extHostChatVariables.ts +++ b/src/vs/workbench/api/common/extHostChatVariables.ts @@ -64,10 +64,6 @@ export class ExtHostChatVariables implements ExtHostChatVariablesShape { this._proxy.$unregisterVariable(handle); }); } - - attachContext(name: string, value: string | vscode.Location | vscode.Uri | unknown, location: vscode.ChatLocation.Panel) { - this._proxy.$attachContext(name, extHostTypes.Location.isLocation(value) ? typeConvert.Location.from(value) : value, typeConvert.ChatLocation.from(location)); - } } class ChatVariableResolverResponseStream { diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index 01a8f050bac9d..f37af7c9d29a6 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -30,9 +30,13 @@ import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVari import { AnythingQuickAccessProvider } from 'vs/workbench/contrib/search/browser/anythingQuickAccess'; import { ISymbolQuickPickItem, SymbolsQuickAccessProvider } from 'vs/workbench/contrib/search/browser/symbolsQuickAccess'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { EditorType } from 'vs/editor/common/editorCommon'; export function registerChatContextActions() { registerAction2(AttachContextAction); + registerAction2(AttachFileAction); + registerAction2(AttachSelectionAction); } export type IChatContextQuickPickItem = IFileQuickPickItem | IDynamicVariableQuickPickItem | IStaticVariableQuickPickItem | IGotoSymbolQuickPickItem | ISymbolQuickPickItem | IQuickAccessQuickPickItem; @@ -77,6 +81,58 @@ export interface IQuickAccessQuickPickItem extends IQuickPickItem { prefix: string; } +class AttachFileAction extends Action2 { + + static readonly ID = 'workbench.action.chat.attachFile'; + + constructor() { + super({ + id: AttachFileAction.ID, + title: localize2('workbench.action.chat.attachFile.label', "Attach File"), + category: CHAT_CATEGORY, + f1: false + }); + } + + override async run(accessor: ServicesAccessor, ...args: any[]): Promise { + const variablesService = accessor.get(IChatVariablesService); + const textEditorService = accessor.get(IEditorService); + + const activeUri = textEditorService.activeEditor?.resource; + if (textEditorService.activeTextEditorControl?.getEditorType() === EditorType.ICodeEditor && activeUri && [Schemas.file, Schemas.vscodeRemote].includes(activeUri.scheme)) { + variablesService.attachContext('file', activeUri, ChatAgentLocation.Panel); + } + } +} + +class AttachSelectionAction extends Action2 { + + static readonly ID = 'workbench.action.chat.attachSelection'; + + constructor() { + super({ + id: AttachSelectionAction.ID, + title: localize2('workbench.action.chat.attachSelection.label', "Add Selection to Chat"), + category: CHAT_CATEGORY, + f1: false + }); + } + + override async run(accessor: ServicesAccessor, ...args: any[]): Promise { + const variablesService = accessor.get(IChatVariablesService); + const textEditorService = accessor.get(IEditorService); + + const activeEditor = textEditorService.activeTextEditorControl; + const activeUri = textEditorService.activeEditor?.resource; + if (textEditorService.activeTextEditorControl?.getEditorType() === EditorType.ICodeEditor && activeUri && [Schemas.file, Schemas.vscodeRemote].includes(activeUri.scheme)) { + const selection = activeEditor?.getSelection(); + if (selection) { + variablesService.attachContext('file', { uri: activeUri, range: selection }, ChatAgentLocation.Panel); + } + } + } +} + class AttachContextAction extends Action2 { static readonly ID = 'workbench.action.chat.attachContext'; diff --git a/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts b/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts index 1b404980e2ccc..62f07234bb1af 100644 --- a/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts +++ b/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts @@ -19,15 +19,6 @@ declare module 'vscode' { * @param icon An icon to display when selecting context in the picker UI. */ export function registerChatVariableResolver(id: string, name: string, userDescription: string, modelDescription: string | undefined, isSlow: boolean | undefined, resolver: ChatVariableResolver, fullName?: string, icon?: ThemeIcon): Disposable; - - /** - * Attaches a chat context with the specified name, value, and location. - * - * @param name - The name of the chat context. - * @param value - The value of the chat context. - * @param location - The location of the chat context. - */ - export function attachContext(name: string, value: string | Uri | Location | unknown, location: ChatLocation.Panel): void; } export interface ChatVariableValue { From beda79d40290073eb72352aea168981c2e78d9c7 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 3 Jun 2024 11:46:17 -0700 Subject: [PATCH 026/755] debug: fix allowing logpoints to be set and triggering bps (#214168) Fixes #213216 --- .../contrib/debug/browser/breakpointWidget.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts index 59a3a4dd4bfa1..6aada91c2145b 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts @@ -264,7 +264,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi } private createTriggerBreakpointInput(container: HTMLElement) { - const breakpoints = this.debugService.getModel().getBreakpoints().filter(bp => bp !== this.breakpoint); + const breakpoints = this.debugService.getModel().getBreakpoints().filter(bp => bp !== this.breakpoint && !bp.logMessage); const breakpointOptions: ISelectOptionItem[] = [ { text: nls.localize('noTriggerByBreakpoint', 'None'), isDisabled: true }, ...breakpoints.map(bp => ({ @@ -433,12 +433,12 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi if (success) { // if there is already a breakpoint on this location - remove it. - let condition = this.breakpoint?.condition; - let hitCondition = this.breakpoint?.hitCondition; - let logMessage = this.breakpoint?.logMessage; - let triggeredBy = this.breakpoint?.triggeredBy; - let mode = this.breakpoint?.mode; - let modeLabel = this.breakpoint?.modeLabel; + let condition: string | undefined = undefined; + let hitCondition: string | undefined = undefined; + let logMessage: string | undefined = undefined; + let triggeredBy: string | undefined = undefined; + let mode: string | undefined = undefined; + let modeLabel: string | undefined = undefined; this.rememberInput(); From df2861b7379fc26616fb2ed917862e277f8c8860 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 3 Jun 2024 12:07:18 -0700 Subject: [PATCH 027/755] Pick up TS 5.5 for builtin ts extension (#214170) For #214169 --- extensions/package.json | 2 +- .../fileConfigurationManager.ts | 1 - .../src/tsServer/protocol/protocol.d.ts | 65 ------------------- extensions/yarn.lock | 8 +-- 4 files changed, 5 insertions(+), 71 deletions(-) diff --git a/extensions/package.json b/extensions/package.json index 2c83af40936a7..5475af18d409c 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -4,7 +4,7 @@ "license": "MIT", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "5.4.5" + "typescript": "^5.5.0-dev.20240603" }, "scripts": { "postinstall": "node ./postinstall.mjs" diff --git a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts index f96f89452b9a5..bddd062b3e8bb 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts @@ -191,7 +191,6 @@ export default class FileConfigurationManager extends Disposable { includeCompletionsWithClassMemberSnippets: config.get('suggest.classMemberSnippets.enabled', true), includeCompletionsWithObjectLiteralMethodSnippets: config.get('suggest.objectLiteralMethodSnippets.enabled', true), autoImportFileExcludePatterns: this.getAutoImportFileExcludePatternsPreference(preferencesConfig, vscode.workspace.getWorkspaceFolder(document.uri)?.uri), - // @ts-expect-error until 5.3 #56090 preferTypeOnlyAutoImports: preferencesConfig.get('preferTypeOnlyAutoImports', false), useLabelDetailsInCompletionEntries: true, allowIncompleteCompletions: true, diff --git a/extensions/typescript-language-features/src/tsServer/protocol/protocol.d.ts b/extensions/typescript-language-features/src/tsServer/protocol/protocol.d.ts index 900d66f37abba..747e7c22e3724 100644 --- a/extensions/typescript-language-features/src/tsServer/protocol/protocol.d.ts +++ b/extensions/typescript-language-features/src/tsServer/protocol/protocol.d.ts @@ -19,70 +19,5 @@ declare module '../../../../node_modules/typescript/lib/typescript' { interface Response { readonly _serverType?: ServerType; } - - //#region MapCode - export interface MapCodeRequestArgs extends FileRequestArgs { - /** - * The files and changes to try and apply/map. - */ - mapping: MapCodeRequestDocumentMapping; - } - - export interface MapCodeRequestDocumentMapping { - /** - * The specific code to map/insert/replace in the file. - */ - contents: string[]; - - /** - * Areas of "focus" to inform the code mapper with. For example, cursor - * location, current selection, viewport, etc. Nested arrays denote - * priority: toplevel arrays are more important than inner arrays, and - * inner array priorities are based on items within that array. Items - * earlier in the arrays have higher priority. - */ - focusLocations?: TextSpan[][]; - } - - export interface MapCodeRequest extends FileRequest { - command: 'mapCode'; - arguments: MapCodeRequestArgs; - } - - export interface MapCodeResponse extends Response { - body: FileCodeEdits[] - } - //#endregion - - //#region Paste - export interface GetPasteEditsRequest extends Request { - command: 'getPasteEdits'; - arguments: GetPasteEditsRequestArgs; - } - - export interface GetPasteEditsRequestArgs extends FileRequestArgs { - /** The text that gets pasted in a file. */ - pastedText: string[]; - /** Locations of where the `pastedText` gets added in a file. If the length of the `pastedText` and `pastedLocations` are not the same, - * then the `pastedText` is combined into one and added at all the `pastedLocations`. - */ - pasteLocations: TextSpan[]; - /** The source location of each `pastedText`. If present, the length of `spans` must be equal to the length of `pastedText`. */ - copiedFrom?: { - file: string; - spans: TextSpan[]; - }; - } - - export interface GetPasteEditsResponse extends Response { - body: PasteEditsAction; - } - export interface PasteEditsAction { - edits: FileCodeEdits[]; - fixId?: {}; - } - //#endregion } } - - diff --git a/extensions/yarn.lock b/extensions/yarn.lock index fa4595ffa747f..cb3213ad8e75e 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -234,10 +234,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -typescript@5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@^5.5.0-dev.20240603: + version "5.5.0-dev.20240603" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.0-dev.20240603.tgz#a1b7311df5039a8abbaaa2213c21cac6ec547490" + integrity sha512-gdm3Sh1A+Pjj9ZlfBEJY3o2rs3tvpcSbu3vYqcCijMe09BePQBtZlsuShuPn+zCnP+qBLxdKjFiw5v1tkna3tA== vscode-grammar-updater@^1.1.0: version "1.1.0" From 14addc7735fcb99fd42c35e5d7e8e984611132b8 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 3 Jun 2024 12:20:52 -0700 Subject: [PATCH 028/755] Pick up latest TS for building VS Code (#214171) --- package.json | 2 +- .../editor/common/services/getIconClasses.ts | 2 +- src/vs/monaco.d.ts | 10 ++--- .../themes/browser/fileIconThemeData.ts | 2 +- yarn.lock | 39 +++++++++++++++---- 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 8d306cca71208..5a8230ea72c59 100644 --- a/package.json +++ b/package.json @@ -208,7 +208,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "tsec": "0.2.7", - "typescript": "^5.5.0-dev.20240521", + "typescript": "^5.5.0-dev.20240603", "util": "^0.12.4", "vscode-nls-dev": "^3.3.1", "webpack": "^5.91.0", diff --git a/src/vs/editor/common/services/getIconClasses.ts b/src/vs/editor/common/services/getIconClasses.ts index 3608f3042a856..52a1e2633e639 100644 --- a/src/vs/editor/common/services/getIconClasses.ts +++ b/src/vs/editor/common/services/getIconClasses.ts @@ -123,5 +123,5 @@ function detectLanguageId(modelService: IModelService, languageService: ILanguag } function cssEscape(str: string): string { - return str.replace(/[\11\12\14\15\40]/g, '/'); // HTML class names can not contain certain whitespace characters, use / instead, which doesn't exist in file names. + return str.replace(/[\x11\x12\x14\x15\x40]/g, '/'); // HTML class names can not contain certain whitespace characters, use / instead, which doesn't exist in file names. } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index ea2f3c43a06a7..ba936cd9e8272 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -5003,8 +5003,8 @@ declare namespace monaco.editor { screenReaderAnnounceInlineSuggestion: IEditorOption; autoClosingBrackets: IEditorOption; autoClosingComments: IEditorOption; - autoClosingDelete: IEditorOption; - autoClosingOvertype: IEditorOption; + autoClosingDelete: IEditorOption; + autoClosingOvertype: IEditorOption; autoClosingQuotes: IEditorOption; autoIndent: IEditorOption; automaticLayout: IEditorOption; @@ -5016,7 +5016,7 @@ declare namespace monaco.editor { codeLensFontFamily: IEditorOption; codeLensFontSize: IEditorOption; colorDecorators: IEditorOption; - colorDecoratorActivatedOn: IEditorOption; + colorDecoratorActivatedOn: IEditorOption; colorDecoratorsLimit: IEditorOption; columnSelection: IEditorOption; comments: IEditorOption>>; @@ -5124,13 +5124,13 @@ declare namespace monaco.editor { tabCompletion: IEditorOption; tabIndex: IEditorOption; unicodeHighlight: IEditorOption; - unusualLineTerminators: IEditorOption; + unusualLineTerminators: IEditorOption; useShadowDOM: IEditorOption; useTabStops: IEditorOption; wordBreak: IEditorOption; wordSegmenterLocales: IEditorOption; wordSeparators: IEditorOption; - wordWrap: IEditorOption; + wordWrap: IEditorOption; wordWrapBreakAfterCharacters: IEditorOption; wordWrapBreakBeforeCharacters: IEditorOption; wordWrapColumn: IEditorOption; diff --git a/src/vs/workbench/services/themes/browser/fileIconThemeData.ts b/src/vs/workbench/services/themes/browser/fileIconThemeData.ts index ec8f4a607cd1b..ae2c1c6cd0b22 100644 --- a/src/vs/workbench/services/themes/browser/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/browser/fileIconThemeData.ts @@ -465,6 +465,6 @@ function handleParentFolder(key: string, selectors: string[]): string { } function escapeCSS(str: string) { - str = str.replace(/[\11\12\14\15\40]/g, '/'); // HTML class names can not contain certain whitespace characters, use / instead, which doesn't exist in file names. + str = str.replace(/[\x11\x12\x14\x15\x40]/g, '/'); // HTML class names can not contain certain whitespace characters, use / instead, which doesn't exist in file names. return mainWindow.CSS.escape(str); } diff --git a/yarn.lock b/yarn.lock index ee60608ade2bd..e7fd243f0b516 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9321,7 +9321,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9365,6 +9365,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9418,7 +9427,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9453,6 +9462,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10055,10 +10071,10 @@ typescript@^4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^5.5.0-dev.20240521: - version "5.5.0-dev.20240521" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.0-dev.20240521.tgz#a53f71ad2f5e4c4401a56c35993474b77813364c" - integrity sha512-52WLKX9mbRmStK1lb30KM78dSo5ssgQT8WQERYiv8JihXir4HUgwlgTz4crExojzpsGjFGFJROL/bZrhXUiOEQ== +typescript@^5.5.0-dev.20240603: + version "5.5.0-dev.20240603" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.0-dev.20240603.tgz#a1b7311df5039a8abbaaa2213c21cac6ec547490" + integrity sha512-gdm3Sh1A+Pjj9ZlfBEJY3o2rs3tvpcSbu3vYqcCijMe09BePQBtZlsuShuPn+zCnP+qBLxdKjFiw5v1tkna3tA== typical@^4.0.0: version "4.0.0" @@ -10608,7 +10624,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10643,6 +10659,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 1f3326e5ef1ff44f33e1e4d70f3a40b86b412150 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 3 Jun 2024 13:00:35 -0700 Subject: [PATCH 029/755] do not show terminal hint for reconnected terminals (#214174) fix #212278 --- .../chat/browser/terminal.initialHint.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index bf22031f1b121..eb9cce925226d 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -124,7 +124,7 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm private _createHint(): void { const instance = this._instance instanceof TerminalInstance ? this._instance : undefined; const commandDetectionCapability = instance?.capabilities.get(TerminalCapability.CommandDetection); - if (!instance || !this._xterm || this._hintWidget || !commandDetectionCapability || commandDetectionCapability.promptInputModel.value || instance.reconnectionProperties) { + if (!instance || !this._xterm || this._hintWidget || !commandDetectionCapability || commandDetectionCapability.promptInputModel.value || !!instance.shellLaunchConfig.attachPersistentProcess) { return; } From 1d415f3a904e4edc8b08024265a1527dedfb0b7a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:29:55 -0700 Subject: [PATCH 030/755] xterm@5.6.0-beta.19 Fixes #213174 Fixes #213304 --- package.json | 14 +++--- remote/package.json | 14 +++--- remote/web/package.json | 12 ++--- remote/web/yarn.lock | 58 ++++++++++++------------ remote/yarn.lock | 68 ++++++++++++++-------------- yarn.lock | 99 +++++++++++++++-------------------------- 6 files changed, 120 insertions(+), 145 deletions(-) diff --git a/package.json b/package.json index 5a8230ea72c59..014e508cb0735 100644 --- a/package.json +++ b/package.json @@ -82,13 +82,13 @@ "@vscode/windows-mutex": "^0.5.0", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-image": "0.9.0-beta.18", - "@xterm/addon-search": "0.16.0-beta.18", - "@xterm/addon-serialize": "0.14.0-beta.18", - "@xterm/addon-unicode11": "0.9.0-beta.18", - "@xterm/addon-webgl": "0.19.0-beta.18", - "@xterm/headless": "5.6.0-beta.18", - "@xterm/xterm": "5.6.0-beta.18", + "@xterm/addon-image": "0.9.0-beta.19", + "@xterm/addon-search": "0.16.0-beta.19", + "@xterm/addon-serialize": "0.14.0-beta.19", + "@xterm/addon-unicode11": "0.9.0-beta.19", + "@xterm/addon-webgl": "0.19.0-beta.19", + "@xterm/headless": "5.6.0-beta.19", + "@xterm/xterm": "5.6.0-beta.19", "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", diff --git a/remote/package.json b/remote/package.json index cded7ebea1a39..0641f0779ddcd 100644 --- a/remote/package.json +++ b/remote/package.json @@ -14,13 +14,13 @@ "@vscode/vscode-languagedetection": "1.0.21", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-image": "0.9.0-beta.18", - "@xterm/addon-search": "0.16.0-beta.18", - "@xterm/addon-serialize": "0.14.0-beta.18", - "@xterm/addon-unicode11": "0.9.0-beta.18", - "@xterm/addon-webgl": "0.19.0-beta.18", - "@xterm/headless": "5.6.0-beta.18", - "@xterm/xterm": "5.6.0-beta.18", + "@xterm/addon-image": "0.9.0-beta.19", + "@xterm/addon-search": "0.16.0-beta.19", + "@xterm/addon-serialize": "0.14.0-beta.19", + "@xterm/addon-unicode11": "0.9.0-beta.19", + "@xterm/addon-webgl": "0.19.0-beta.19", + "@xterm/headless": "5.6.0-beta.19", + "@xterm/xterm": "5.6.0-beta.19", "cookie": "^0.4.0", "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", diff --git a/remote/web/package.json b/remote/web/package.json index d920465ca2eff..efd58cd8310f4 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -7,12 +7,12 @@ "@microsoft/1ds-post-js": "^3.2.13", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/vscode-languagedetection": "1.0.21", - "@xterm/addon-image": "0.9.0-beta.18", - "@xterm/addon-search": "0.16.0-beta.18", - "@xterm/addon-serialize": "0.14.0-beta.18", - "@xterm/addon-unicode11": "0.9.0-beta.18", - "@xterm/addon-webgl": "0.19.0-beta.18", - "@xterm/xterm": "5.6.0-beta.18", + "@xterm/addon-image": "0.9.0-beta.19", + "@xterm/addon-search": "0.16.0-beta.19", + "@xterm/addon-serialize": "0.14.0-beta.19", + "@xterm/addon-unicode11": "0.9.0-beta.19", + "@xterm/addon-webgl": "0.19.0-beta.19", + "@xterm/xterm": "5.6.0-beta.19", "jschardet": "3.1.2", "tas-client-umd": "0.2.0", "vscode-oniguruma": "1.7.0", diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index e77a58360ab57..1aa2186623925 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -48,35 +48,35 @@ resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" integrity sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g== -"@xterm/addon-image@0.9.0-beta.18": - version "0.9.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.18.tgz#c33c0612349f2446399f9da8db4d71252b0c1c73" - integrity sha512-X1m2lwxfxma1oZaH1w5UalE1VFqTuof2pw23UqP2ol0nGIcpd1KN+0LKrd0g+GvyFbiAgNi0ANuDfupNfjVLQQ== - -"@xterm/addon-search@0.16.0-beta.18": - version "0.16.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.18.tgz#7271cb43a56892de0ce35e650bcaec742b220fcb" - integrity sha512-iYqzlg9ujecT8opZjmjrSrFHcDt9bq6SruKlxXzWMQapMA9cdQGOJZe74tRjwQxkG3wySDHm3bPHNPB5iPKLfQ== - -"@xterm/addon-serialize@0.14.0-beta.18": - version "0.14.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.18.tgz#22a59ce3135326073cfc146123f9113e87de331d" - integrity sha512-ebNfRggeIx9hOs0kM0XaquMAvKfLwjOGRRhXCK3OAJSqkG6jNPIZ+7foHIUVxcFYb8EKfvS67ZoDStO4mZCiEg== - -"@xterm/addon-unicode11@0.9.0-beta.18": - version "0.9.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.18.tgz#993e872c7f1a58fd35c4c64aef6f34259d099e8e" - integrity sha512-kfF9i0MS/T6wGwv7Y6+nVGd/cf4GT5OdPDldiyYpINCusIkFfTC5UMojNucvbL0nN0rvRoCBhTjh8LkafQV5hw== - -"@xterm/addon-webgl@0.19.0-beta.18": - version "0.19.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.18.tgz#62f961e1255cde12444559e5ea105409598aa6d8" - integrity sha512-3vFr51TrbjXtR9RBbY4o3amGKsoni5sdgKg4NKSNZew/K3TyTFwCkj7z1HjyEsW/j9ee9KXH435pTMSmH/L40g== - -"@xterm/xterm@5.6.0-beta.18": - version "5.6.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.18.tgz#c346d5773b1e253b2cef986b5c7f9bfe372e5c54" - integrity sha512-PKpqGVlJ5e65RFxG9CgCR1Gdpz1eSttdRZZd5eEFJIyz3VQv1DUlZgfwlFhMMGRi42zyw40HuArkrw+fRRDU7Q== +"@xterm/addon-image@0.9.0-beta.19": + version "0.9.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.19.tgz#3823382e5c55268998f0e0d8d77e8b7810925830" + integrity sha512-LX9g03po3mXYE/HZFoKbdnIRvdD56Qw84FpQ9LCJGDsyx9SFIf47DXLS+lXCEpJ2hjKIing46BQxP+MDEayXDw== + +"@xterm/addon-search@0.16.0-beta.19": + version "0.16.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.19.tgz#46b3374eb312a1bff974a5df188b1ebf777ff49d" + integrity sha512-iTJVUEsKSdL8SyhcDBqN6gYxhqv0wrwtP1QCUGLKNAAVDI7HKVgig3V9wToqRxYfOnu/anyU+u0qFUoKCRLnCg== + +"@xterm/addon-serialize@0.14.0-beta.19": + version "0.14.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.19.tgz#c7a0a0e5f5b1bd94a35a775ec6224ba42282556c" + integrity sha512-D+BiXQfuxDb3azAIBq1RJTQGZlvo459V6U/2s/3dKpTAvRybqCRMazuf8cLoffUoNcjTb3uSWpii9+MVVvHIrQ== + +"@xterm/addon-unicode11@0.9.0-beta.19": + version "0.9.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.19.tgz#529d8b22d9378cff8c31df1b7e76250b2f8079c3" + integrity sha512-0Umiu9GkjwL/jaT85Rcfka9HVyJw3UhJsnOVOVZd/3YBZqMY2SZMHqz73W/qpXl5nz6vvyCWKbpkfddsJhpToA== + +"@xterm/addon-webgl@0.19.0-beta.19": + version "0.19.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.19.tgz#655d1e27b1249c19352c65a8ea1d0bf319397b35" + integrity sha512-Y5efISx8X5hpFAsPOTza1Fp0xiD8x+l3MuH+mv68v1El8tpna/MW5EM4oX25qYOsPDZY00mpmkBmPbAT5loMEg== + +"@xterm/xterm@5.6.0-beta.19": + version "5.6.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.19.tgz#2cc292fc93b25c7c655ed6d1f0425a636b36747d" + integrity sha512-mGoJxrUxAL4dueZEqw2e23KCrGNSvYaw5twTnccKqK7lITK/hDrosWCxb1jL1AjFf7bBzMxw9/dZdhWncKQQmw== jschardet@3.1.2: version "3.1.2" diff --git a/remote/yarn.lock b/remote/yarn.lock index dcf8b277eca57..dc0c4938aaf17 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -122,40 +122,40 @@ resolved "https://registry.yarnpkg.com/@vscode/windows-registry/-/windows-registry-1.1.0.tgz#03dace7c29c46f658588b9885b9580e453ad21f9" integrity sha512-5AZzuWJpGscyiMOed0IuyEwt6iKmV5Us7zuwCDCFYMIq7tsvooO9BUiciywsvuthGz6UG4LSpeDeCxvgMVhnIw== -"@xterm/addon-image@0.9.0-beta.18": - version "0.9.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.18.tgz#c33c0612349f2446399f9da8db4d71252b0c1c73" - integrity sha512-X1m2lwxfxma1oZaH1w5UalE1VFqTuof2pw23UqP2ol0nGIcpd1KN+0LKrd0g+GvyFbiAgNi0ANuDfupNfjVLQQ== - -"@xterm/addon-search@0.16.0-beta.18": - version "0.16.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.18.tgz#7271cb43a56892de0ce35e650bcaec742b220fcb" - integrity sha512-iYqzlg9ujecT8opZjmjrSrFHcDt9bq6SruKlxXzWMQapMA9cdQGOJZe74tRjwQxkG3wySDHm3bPHNPB5iPKLfQ== - -"@xterm/addon-serialize@0.14.0-beta.18": - version "0.14.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.18.tgz#22a59ce3135326073cfc146123f9113e87de331d" - integrity sha512-ebNfRggeIx9hOs0kM0XaquMAvKfLwjOGRRhXCK3OAJSqkG6jNPIZ+7foHIUVxcFYb8EKfvS67ZoDStO4mZCiEg== - -"@xterm/addon-unicode11@0.9.0-beta.18": - version "0.9.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.18.tgz#993e872c7f1a58fd35c4c64aef6f34259d099e8e" - integrity sha512-kfF9i0MS/T6wGwv7Y6+nVGd/cf4GT5OdPDldiyYpINCusIkFfTC5UMojNucvbL0nN0rvRoCBhTjh8LkafQV5hw== - -"@xterm/addon-webgl@0.19.0-beta.18": - version "0.19.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.18.tgz#62f961e1255cde12444559e5ea105409598aa6d8" - integrity sha512-3vFr51TrbjXtR9RBbY4o3amGKsoni5sdgKg4NKSNZew/K3TyTFwCkj7z1HjyEsW/j9ee9KXH435pTMSmH/L40g== - -"@xterm/headless@5.6.0-beta.18": - version "5.6.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.18.tgz#27a774455bf68565257916a3355cc61151eb9d10" - integrity sha512-3EUxNyjki4YHRlI4p/uMT6Hok3Ln4fZVi1HbFDopk3CZ0W+TXUQW4F+4fy4nkcFWYnBR9egKBcRmP2Vxk13RKQ== - -"@xterm/xterm@5.6.0-beta.18": - version "5.6.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.18.tgz#c346d5773b1e253b2cef986b5c7f9bfe372e5c54" - integrity sha512-PKpqGVlJ5e65RFxG9CgCR1Gdpz1eSttdRZZd5eEFJIyz3VQv1DUlZgfwlFhMMGRi42zyw40HuArkrw+fRRDU7Q== +"@xterm/addon-image@0.9.0-beta.19": + version "0.9.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.19.tgz#3823382e5c55268998f0e0d8d77e8b7810925830" + integrity sha512-LX9g03po3mXYE/HZFoKbdnIRvdD56Qw84FpQ9LCJGDsyx9SFIf47DXLS+lXCEpJ2hjKIing46BQxP+MDEayXDw== + +"@xterm/addon-search@0.16.0-beta.19": + version "0.16.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.19.tgz#46b3374eb312a1bff974a5df188b1ebf777ff49d" + integrity sha512-iTJVUEsKSdL8SyhcDBqN6gYxhqv0wrwtP1QCUGLKNAAVDI7HKVgig3V9wToqRxYfOnu/anyU+u0qFUoKCRLnCg== + +"@xterm/addon-serialize@0.14.0-beta.19": + version "0.14.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.19.tgz#c7a0a0e5f5b1bd94a35a775ec6224ba42282556c" + integrity sha512-D+BiXQfuxDb3azAIBq1RJTQGZlvo459V6U/2s/3dKpTAvRybqCRMazuf8cLoffUoNcjTb3uSWpii9+MVVvHIrQ== + +"@xterm/addon-unicode11@0.9.0-beta.19": + version "0.9.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.19.tgz#529d8b22d9378cff8c31df1b7e76250b2f8079c3" + integrity sha512-0Umiu9GkjwL/jaT85Rcfka9HVyJw3UhJsnOVOVZd/3YBZqMY2SZMHqz73W/qpXl5nz6vvyCWKbpkfddsJhpToA== + +"@xterm/addon-webgl@0.19.0-beta.19": + version "0.19.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.19.tgz#655d1e27b1249c19352c65a8ea1d0bf319397b35" + integrity sha512-Y5efISx8X5hpFAsPOTza1Fp0xiD8x+l3MuH+mv68v1El8tpna/MW5EM4oX25qYOsPDZY00mpmkBmPbAT5loMEg== + +"@xterm/headless@5.6.0-beta.19": + version "5.6.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.19.tgz#dbbd4dd420e24e9bdee6e533153f405bfc1ba89b" + integrity sha512-zFTcftonaaMEbMqfQnFwos1YQCmqWnvIzSNXwmfIymkEvSxhsB03oynEjFwm48dT2filTcJXpYT91io4qvR+3g== + +"@xterm/xterm@5.6.0-beta.19": + version "5.6.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.19.tgz#2cc292fc93b25c7c655ed6d1f0425a636b36747d" + integrity sha512-mGoJxrUxAL4dueZEqw2e23KCrGNSvYaw5twTnccKqK7lITK/hDrosWCxb1jL1AjFf7bBzMxw9/dZdhWncKQQmw== agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" diff --git a/yarn.lock b/yarn.lock index e7fd243f0b516..7cb89bdf1c010 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1982,40 +1982,40 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@xterm/addon-image@0.9.0-beta.18": - version "0.9.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.18.tgz#c33c0612349f2446399f9da8db4d71252b0c1c73" - integrity sha512-X1m2lwxfxma1oZaH1w5UalE1VFqTuof2pw23UqP2ol0nGIcpd1KN+0LKrd0g+GvyFbiAgNi0ANuDfupNfjVLQQ== - -"@xterm/addon-search@0.16.0-beta.18": - version "0.16.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.18.tgz#7271cb43a56892de0ce35e650bcaec742b220fcb" - integrity sha512-iYqzlg9ujecT8opZjmjrSrFHcDt9bq6SruKlxXzWMQapMA9cdQGOJZe74tRjwQxkG3wySDHm3bPHNPB5iPKLfQ== - -"@xterm/addon-serialize@0.14.0-beta.18": - version "0.14.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.18.tgz#22a59ce3135326073cfc146123f9113e87de331d" - integrity sha512-ebNfRggeIx9hOs0kM0XaquMAvKfLwjOGRRhXCK3OAJSqkG6jNPIZ+7foHIUVxcFYb8EKfvS67ZoDStO4mZCiEg== - -"@xterm/addon-unicode11@0.9.0-beta.18": - version "0.9.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.18.tgz#993e872c7f1a58fd35c4c64aef6f34259d099e8e" - integrity sha512-kfF9i0MS/T6wGwv7Y6+nVGd/cf4GT5OdPDldiyYpINCusIkFfTC5UMojNucvbL0nN0rvRoCBhTjh8LkafQV5hw== - -"@xterm/addon-webgl@0.19.0-beta.18": - version "0.19.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.18.tgz#62f961e1255cde12444559e5ea105409598aa6d8" - integrity sha512-3vFr51TrbjXtR9RBbY4o3amGKsoni5sdgKg4NKSNZew/K3TyTFwCkj7z1HjyEsW/j9ee9KXH435pTMSmH/L40g== - -"@xterm/headless@5.6.0-beta.18": - version "5.6.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.18.tgz#27a774455bf68565257916a3355cc61151eb9d10" - integrity sha512-3EUxNyjki4YHRlI4p/uMT6Hok3Ln4fZVi1HbFDopk3CZ0W+TXUQW4F+4fy4nkcFWYnBR9egKBcRmP2Vxk13RKQ== - -"@xterm/xterm@5.6.0-beta.18": - version "5.6.0-beta.18" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.18.tgz#c346d5773b1e253b2cef986b5c7f9bfe372e5c54" - integrity sha512-PKpqGVlJ5e65RFxG9CgCR1Gdpz1eSttdRZZd5eEFJIyz3VQv1DUlZgfwlFhMMGRi42zyw40HuArkrw+fRRDU7Q== +"@xterm/addon-image@0.9.0-beta.19": + version "0.9.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.19.tgz#3823382e5c55268998f0e0d8d77e8b7810925830" + integrity sha512-LX9g03po3mXYE/HZFoKbdnIRvdD56Qw84FpQ9LCJGDsyx9SFIf47DXLS+lXCEpJ2hjKIing46BQxP+MDEayXDw== + +"@xterm/addon-search@0.16.0-beta.19": + version "0.16.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.19.tgz#46b3374eb312a1bff974a5df188b1ebf777ff49d" + integrity sha512-iTJVUEsKSdL8SyhcDBqN6gYxhqv0wrwtP1QCUGLKNAAVDI7HKVgig3V9wToqRxYfOnu/anyU+u0qFUoKCRLnCg== + +"@xterm/addon-serialize@0.14.0-beta.19": + version "0.14.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.19.tgz#c7a0a0e5f5b1bd94a35a775ec6224ba42282556c" + integrity sha512-D+BiXQfuxDb3azAIBq1RJTQGZlvo459V6U/2s/3dKpTAvRybqCRMazuf8cLoffUoNcjTb3uSWpii9+MVVvHIrQ== + +"@xterm/addon-unicode11@0.9.0-beta.19": + version "0.9.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.19.tgz#529d8b22d9378cff8c31df1b7e76250b2f8079c3" + integrity sha512-0Umiu9GkjwL/jaT85Rcfka9HVyJw3UhJsnOVOVZd/3YBZqMY2SZMHqz73W/qpXl5nz6vvyCWKbpkfddsJhpToA== + +"@xterm/addon-webgl@0.19.0-beta.19": + version "0.19.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.19.tgz#655d1e27b1249c19352c65a8ea1d0bf319397b35" + integrity sha512-Y5efISx8X5hpFAsPOTza1Fp0xiD8x+l3MuH+mv68v1El8tpna/MW5EM4oX25qYOsPDZY00mpmkBmPbAT5loMEg== + +"@xterm/headless@5.6.0-beta.19": + version "5.6.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.19.tgz#dbbd4dd420e24e9bdee6e533153f405bfc1ba89b" + integrity sha512-zFTcftonaaMEbMqfQnFwos1YQCmqWnvIzSNXwmfIymkEvSxhsB03oynEjFwm48dT2filTcJXpYT91io4qvR+3g== + +"@xterm/xterm@5.6.0-beta.19": + version "5.6.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.19.tgz#2cc292fc93b25c7c655ed6d1f0425a636b36747d" + integrity sha512-mGoJxrUxAL4dueZEqw2e23KCrGNSvYaw5twTnccKqK7lITK/hDrosWCxb1jL1AjFf7bBzMxw9/dZdhWncKQQmw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -9321,7 +9321,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9365,15 +9365,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9427,7 +9418,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9462,13 +9453,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10624,7 +10608,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10659,15 +10643,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 6922d001749558bf908f3716307bac9c531676e8 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 3 Jun 2024 14:45:17 -0700 Subject: [PATCH 031/755] Count codeblocks correctly in basicRenderElement (#214179) Not trying to fix progressive rendering here Better fix for #214071 --- .../contrib/chat/browser/chatListRenderer.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 9d1f8781ed6eb..6e29cb908748c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -105,6 +105,10 @@ interface IItemHeightChangeParams { height: number; } +interface IChatMarkdownRenderResult extends IMarkdownRenderResult { + codeBlockCount: number; +} + const forceVerboseLayoutTracing = false; export interface IChatRendererDelegate { @@ -481,11 +485,12 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { const result = data.kind === 'treeData' ? this.renderTreeData(data.treeData, element, templateData, fileTreeIndex++) : data.kind === 'markdownContent' - ? this.renderMarkdown(data.content, element, templateData, fillInIncompleteTokens) + ? this.renderMarkdown(data.content, element, templateData, fillInIncompleteTokens, codeBlockIndex) : data.kind === 'progressMessage' && onlyProgressMessagesAfterI(value, index) ? this.renderProgressMessage(data, false) // TODO render command : data.kind === 'progressTask' ? this.renderProgressTask(data, false, element, templateData) : data.kind === 'command' ? this.renderCommandButton(element, data) @@ -497,6 +502,10 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { @@ -1193,6 +1202,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer disposables.add(d)); return { + codeBlockCount: codeBlockIndex - codeBlockStartIndex, element: result.element, dispose() { result.dispose(); From 3c6a63a0956835aade45adca303aac82df0dc105 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 3 Jun 2024 15:00:06 -0700 Subject: [PATCH 032/755] testing: fix testController.items.delete is not removing the item from the tree UI (#214182) Fixes #213316 --- src/vs/base/common/iterator.ts | 5 +- .../explorerProjections/treeProjection.ts | 6 ++- .../treeProjection.test.ts | 48 +++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index 0bbc2413bb540..0dad18867e8c9 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -44,9 +44,10 @@ export namespace Iterable { return iterable[Symbol.iterator]().next().value; } - export function some(iterable: Iterable, predicate: (t: T) => unknown): boolean { + export function some(iterable: Iterable, predicate: (t: T, i: number) => unknown): boolean { + let i = 0; for (const element of iterable) { - if (predicate(element)) { + if (predicate(element, i++)) { return true; } } diff --git a/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.ts b/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.ts index 33060d117ea11..9e752e5f4ef48 100644 --- a/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.ts +++ b/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.ts @@ -223,9 +223,11 @@ export class TreeProjection extends Disposable implements ITestTreeProjection { break; } - // The first element will cause the root to be hidden + // Removing the first element will cause the root to be hidden. + // Changing first-level elements will need the root to re-render if + // there are no other controllers with items. const parent = toRemove.parent; - const affectsRootElement = toRemove.depth === 1 && parent?.children.size === 1; + const affectsRootElement = toRemove.depth === 1 && (parent?.children.size === 1 || !Iterable.some(this.rootsWithChildren, (_, i) => i === 1)); this.changedParents.add(affectsRootElement ? null : parent); const queue: Iterable[] = [[toRemove]]; diff --git a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts index cebf9e01a5dac..2063c9fe11a4a 100644 --- a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts +++ b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/treeProjection.test.ts @@ -267,5 +267,53 @@ suite('Workbench - Testing Explorer Hierarchal by Location Projection', () => { ]); }); + test('fixes #213316 (single root)', async () => { + harness.flush(); + assert.deepStrictEqual(harness.tree.getRendered(), [ + { e: 'a' }, { e: 'b' } + ]); + harness.pushDiff({ + op: TestDiffOpType.Remove, + itemId: new TestId(['ctrlId', 'id-a']).toString(), + }); + harness.flush(); + assert.deepStrictEqual(harness.tree.getRendered(), [ + { e: 'b' } + ]); + }); + + test('fixes #213316 (multi root)', async () => { + harness.pushDiff({ + op: TestDiffOpType.Add, + item: { controllerId: 'ctrl2', expand: TestItemExpandState.Expanded, item: new TestTestItem(new TestId(['ctrlId2']), 'c').toTestItem() }, + }, { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrl2', expand: TestItemExpandState.NotExpandable, item: new TestTestItem(new TestId(['ctrlId2', 'id-c']), 'ca').toTestItem() }, + }); + harness.flush(); + assert.deepStrictEqual(harness.flush(), [ + { e: 'c', children: [{ e: 'ca' }] }, + { e: 'root', children: [{ e: 'a' }, { e: 'b' }] } + ]); + + harness.pushDiff({ + op: TestDiffOpType.Remove, + itemId: new TestId(['ctrlId', 'id-a']).toString(), + }); + harness.flush(); + assert.deepStrictEqual(harness.tree.getRendered(), [ + { e: 'c', children: [{ e: 'ca' }] }, + { e: 'root', children: [{ e: 'b' }] } + ]); + + harness.pushDiff({ + op: TestDiffOpType.Remove, + itemId: new TestId(['ctrlId', 'id-b']).toString(), + }); + harness.flush(); + assert.deepStrictEqual(harness.tree.getRendered(), [ + { e: 'ca' } + ]); + }); }); From 9f447e79cda4a62dd7a939ae5177637e675e0034 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Mon, 3 Jun 2024 15:24:15 -0700 Subject: [PATCH 033/755] chore: remove empty editor chat hint setting migration --- .../emptyTextEditorHint.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index b047830a88148..3da7716211763 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -29,8 +29,6 @@ import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLa import { OS } from 'vs/base/common/platform'; import { status } from 'vs/base/browser/ui/aria/aria'; import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { Extensions, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration'; import { LOG_MODE_ID, OUTPUT_MODE_ID } from 'vs/workbench/services/output/common/output'; import { SEARCH_RESULT_LANGUAGE_ID } from 'vs/workbench/services/search/common/search'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; @@ -39,23 +37,6 @@ import { ChatAgentLocation, IChatAgent, IChatAgentService } from 'vs/workbench/c const $ = dom.$; -// TODO@joyceerhl remove this after a few iterations -Registry.as(Extensions.ConfigurationMigration) - .registerConfigurationMigrations([{ - key: 'workbench.editor.untitled.hint', - migrateFn: (value, _accessor) => ([ - [emptyTextEditorHintSetting, { value }], - ['workbench.editor.untitled.hint', { value: undefined }] - ]) - }, - { - key: 'accessibility.verbosity.untitledHint', - migrateFn: (value, _accessor) => ([ - [AccessibilityVerbositySettingId.EmptyEditorHint, { value }], - ['accessibility.verbosity.untitledHint', { value: undefined }] - ]) - }]); - export interface IEmptyTextEditorHintOptions { readonly clickable?: boolean; } From 2b7f9e2fff1286227db33e8ca31b4dfac29eb067 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Mon, 3 Jun 2024 15:42:58 -0700 Subject: [PATCH 034/755] feat: right click to hide empty text editor hint --- .../emptyTextEditorHint/emptyTextEditorHint.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index 3da7716211763..37931a102eac6 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -199,6 +199,12 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { return EmptyTextEditorHintContentWidget.ID; } + private _disableHint() { + this.configurationService.updateValue(emptyTextEditorHintSetting, 'hidden'); + this.dispose(); + this.editor.focus(); + } + private _getHintInlineChat(providers: IChatAgent[]) { const providerName = (providers.length === 1 ? providers[0].fullName : undefined) ?? this.productService.nameShort; @@ -238,6 +244,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { const hintPart = $('a', undefined, fragment); hintPart.style.fontStyle = 'italic'; hintPart.style.cursor = 'pointer'; + this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, () => this._disableHint())); this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CLICK, handleClick)); return hintPart; } else { @@ -256,6 +263,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { if (this.options.clickable) { label.element.style.cursor = 'pointer'; + this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, () => this._disableHint())); this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CLICK, handleClick)); } @@ -278,7 +286,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { hintElement.appendChild(rendered); } - return { ariaLabel, hintHandler, hintElement }; + return { ariaLabel, hintElement }; } private _getHintDefault() { @@ -296,7 +304,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { chooseEditorOnClickOrTap(event.browserEvent); break; case '3': - dontShowOnClickOrTap(); + this._disableHint(); break; } } @@ -341,12 +349,6 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { } }; - const dontShowOnClickOrTap = () => { - this.configurationService.updateValue(emptyTextEditorHintSetting, 'hidden'); - this.dispose(); - this.editor.focus(); - }; - const hintMsg = localize({ key: 'message', comment: [ From 5d1faee1610052c3aaca4798e1a7fb3638953386 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 3 Jun 2024 16:46:04 -0700 Subject: [PATCH 035/755] debug: fix hover disappearing 'too quickly' (#214186) What was actually happening is that in the process of hovering into the debug hover, another position was briefly hovered. No data was available for this position, so the hover was hidden. This PR implements "safe triangle" logic to avoid changing the hover position if the mouse moves in the safe triangle created by a displayed hover widget. Fixes #212924 --- src/vs/base/browser/dom.ts | 51 +++++++++++++++++++ src/vs/base/common/numbers.ts | 27 ++++++++++ src/vs/base/test/common/numbers.test.ts | 27 ++++++++++ .../debug/browser/debugEditorContribution.ts | 15 +++--- .../contrib/debug/browser/debugHover.ts | 19 +++++-- 5 files changed, 128 insertions(+), 11 deletions(-) create mode 100644 src/vs/base/test/common/numbers.test.ts diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 3614986c44523..1c2fafb031630 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -18,6 +18,7 @@ import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { hash } from 'vs/base/common/hash'; import { CodeWindow, ensureCodeWindow, mainWindow } from 'vs/base/browser/window'; +import { isPointWithinTriangle } from 'vs/base/common/numbers'; export interface IRegisteredCodeWindow { readonly window: CodeWindow; @@ -2408,3 +2409,53 @@ export function trackAttributes(from: Element, to: Element, filter?: string[]): return disposables; } + +/** + * Helper for calculating the "safe triangle" occluded by hovers to avoid early dismissal. + * @see https://www.smashingmagazine.com/2023/08/better-context-menus-safe-triangles/ for example + */ +export class SafeTriangle { + // 4 triangles, 2 points (x, y) stored for each + private triangles: number[] = []; + + constructor( + private readonly originX: number, + private readonly originY: number, + target: HTMLElement + ) { + const { top, left, right, bottom } = target.getBoundingClientRect(); + const t = this.triangles; + let i = 0; + + t[i++] = left; + t[i++] = top; + t[i++] = right; + t[i++] = top; + + t[i++] = left; + t[i++] = top; + t[i++] = left; + t[i++] = bottom; + + t[i++] = right; + t[i++] = top; + t[i++] = right; + t[i++] = bottom; + + t[i++] = left; + t[i++] = bottom; + t[i++] = right; + t[i++] = bottom; + } + + public contains(x: number, y: number) { + const { triangles, originX, originY } = this; + for (let i = 0; i < 4; i++) { + if (isPointWithinTriangle(x, y, originX, originY, triangles[2 * i], triangles[2 * i + 1], triangles[2 * i + 2], triangles[2 * i + 3])) { + return true; + } + } + + return false; + } +} diff --git a/src/vs/base/common/numbers.ts b/src/vs/base/common/numbers.ts index 29e65b8603240..ab4c9f92e0629 100644 --- a/src/vs/base/common/numbers.ts +++ b/src/vs/base/common/numbers.ts @@ -69,3 +69,30 @@ export class SlidingWindowAverage { return this._val; } } + +/** Returns whether the point is within the triangle formed by the following 6 x/y point pairs */ +export function isPointWithinTriangle( + x: number, y: number, + ax: number, ay: number, + bx: number, by: number, + cx: number, cy: number +) { + const v0x = cx - ax; + const v0y = cy - ay; + const v1x = bx - ax; + const v1y = by - ay; + const v2x = x - ax; + const v2y = y - ay; + + const dot00 = v0x * v0x + v0y * v0y; + const dot01 = v0x * v1x + v0y * v1y; + const dot02 = v0x * v2x + v0y * v2y; + const dot11 = v1x * v1x + v1y * v1y; + const dot12 = v1x * v2x + v1y * v2y; + + const invDenom = 1 / (dot00 * dot11 - dot01 * dot01); + const u = (dot11 * dot02 - dot01 * dot12) * invDenom; + const v = (dot00 * dot12 - dot01 * dot02) * invDenom; + + return u >= 0 && v >= 0 && u + v < 1; +} diff --git a/src/vs/base/test/common/numbers.test.ts b/src/vs/base/test/common/numbers.test.ts new file mode 100644 index 0000000000000..7095b7aae40e1 --- /dev/null +++ b/src/vs/base/test/common/numbers.test.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { isPointWithinTriangle } from 'vs/base/common/numbers'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; + +suite('isPointWithinTriangle', () => { + ensureNoDisposablesAreLeakedInTestSuite(); + + test('should return true if the point is within the triangle', () => { + const result = isPointWithinTriangle(0.25, 0.25, 0, 0, 1, 0, 0, 1); + assert.ok(result); + }); + + test('should return false if the point is outside the triangle', () => { + const result = isPointWithinTriangle(2, 2, 0, 0, 1, 0, 0, 1); + assert.ok(!result); + }); + + test('should return true if the point is on the edge of the triangle', () => { + const result = isPointWithinTriangle(0.5, 0, 0, 0, 1, 0, 0, 1); + assert.ok(result); + }); +}); diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts index 4ab2ba9d777c7..1612646a1e9bd 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts @@ -6,6 +6,7 @@ import { addDisposableListener, isKeyboardEvent } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { distinct } from 'vs/base/common/arrays'; import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; @@ -208,7 +209,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { private toDispose: IDisposable[]; private hoverWidget: DebugHoverWidget; - private hoverPosition: Position | null = null; + private hoverPosition?: { position: Position; event: IMouseEvent }; private mouseDown = false; private exceptionWidgetVisible: IContextKey; private gutterIsHovered = false; @@ -341,7 +342,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { if (debugHoverWasVisible && this.hoverPosition) { // If the debug hover was visible immediately show the editor hover for the alt transition to be smooth - this.showEditorHover(this.hoverPosition, false); + this.showEditorHover(this.hoverPosition.position, false); } const onKeyUp = new DomEmitter(ownerDocument, 'keyup'); @@ -361,14 +362,14 @@ export class DebugEditorContribution implements IDebugEditorContribution { }); } - async showHover(position: Position, focus: boolean): Promise { + async showHover(position: Position, focus: boolean, mouseEvent?: IMouseEvent): Promise { // normally will already be set in `showHoverScheduler`, but public callers may hit this directly: this.preventDefaultEditorHover(); const sf = this.debugService.getViewModel().focusedStackFrame; const model = this.editor.getModel(); if (sf && model && this.uriIdentityService.extUri.isEqual(sf.source.uri, model.uri)) { - const result = await this.hoverWidget.showAt(position, focus); + const result = await this.hoverWidget.showAt(position, focus, mouseEvent); if (result === ShowDebugHoverResult.NOT_AVAILABLE) { // When no expression available fallback to editor hover this.showEditorHover(position, focus); @@ -438,7 +439,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { private get showHoverScheduler() { const scheduler = new RunOnceScheduler(() => { if (this.hoverPosition && !this.altPressed) { - this.showHover(this.hoverPosition, false); + this.showHover(this.hoverPosition.position, false, this.hoverPosition.event); } }, this.hoverDelay); this.toDispose.push(scheduler); @@ -493,8 +494,8 @@ export class DebugEditorContribution implements IDebugEditorContribution { } if (target.type === MouseTargetType.CONTENT_TEXT) { - if (target.position && !Position.equals(target.position, this.hoverPosition)) { - this.hoverPosition = target.position; + if (target.position && !Position.equals(target.position, this.hoverPosition?.position || null) && !this.hoverWidget.isInSafeTriangle(mouseEvent.event.posx, mouseEvent.event.posy)) { + this.hoverPosition = { position: target.position, event: mouseEvent.event }; // Disable the editor hover during the request to avoid flickering this.preventDefaultEditorHover(); this.showHoverScheduler.schedule(this.hoverDelay); diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index b534c3fba676a..c3191626a327d 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -5,6 +5,7 @@ import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; @@ -83,6 +84,7 @@ export class DebugHoverWidget implements IContentWidget { readonly allowEditorOverflow = true; private _isVisible: boolean; + private safeTriangle?: dom.SafeTriangle; private showCancellationSource?: CancellationTokenSource; private domNode!: HTMLElement; private tree!: AsyncDataTree; @@ -228,7 +230,15 @@ export class DebugHoverWidget implements IContentWidget { return this.domNode; } - async showAt(position: Position, focus: boolean): Promise { + /** + * Gets whether the given coordinates are in the safe triangle formed from + * the position at which the hover was initiated. + */ + isInSafeTriangle(x: number, y: number) { + return this._isVisible && !!this.safeTriangle?.contains(x, y); + } + + async showAt(position: Position, focus: boolean, mouseEvent?: IMouseEvent): Promise { this.showCancellationSource?.cancel(); const cancellationSource = this.showCancellationSource = new CancellationTokenSource(); const session = this.debugService.getViewModel().focusedSession; @@ -269,7 +279,7 @@ export class DebugHoverWidget implements IContentWidget { options: DebugHoverWidget._HOVER_HIGHLIGHT_DECORATION_OPTIONS }]); - return this.doShow(result.range.getStartPosition(), expression, focus); + return this.doShow(result.range.getStartPosition(), expression, focus, mouseEvent); } private static readonly _HOVER_HIGHLIGHT_DECORATION_OPTIONS = ModelDecorationOptions.register({ @@ -277,7 +287,7 @@ export class DebugHoverWidget implements IContentWidget { className: 'hoverHighlight' }); - private async doShow(position: Position, expression: IExpression, focus: boolean, forceValueHover = false): Promise { + private async doShow(position: Position, expression: IExpression, focus: boolean, mouseEvent: IMouseEvent | undefined): Promise { if (!this.domNode) { this.create(); } @@ -285,7 +295,7 @@ export class DebugHoverWidget implements IContentWidget { this.showAtPosition = position; this._isVisible = true; - if (!expression.hasChildren || forceValueHover) { + if (!expression.hasChildren) { this.complexValueContainer.hidden = true; this.valueContainer.hidden = false; renderExpressionValue(expression, this.valueContainer, { @@ -312,6 +322,7 @@ export class DebugHoverWidget implements IContentWidget { this.tree.scrollTop = 0; this.tree.scrollLeft = 0; this.complexValueContainer.hidden = false; + this.safeTriangle = mouseEvent && new dom.SafeTriangle(mouseEvent.posx, mouseEvent.posy, this.domNode); if (focus) { this.editor.render(); From f721872ba667bea76c904999e0f7ac0227a7557c Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 3 Jun 2024 17:09:23 -0700 Subject: [PATCH 036/755] not specifying `maxResults` on `findTextInFiles`->`textSearchProvider` will use `MAX_INT` for `maxResults` Fixes #214189 --- .../workbench/contrib/search/browser/search.contribution.ts | 4 ++-- src/vs/workbench/services/search/common/search.ts | 1 + src/vs/workbench/services/search/common/searchService.ts | 4 ++-- src/vs/workbench/services/search/common/textSearchManager.ts | 4 ++-- src/vs/workbench/services/search/node/rawSearchService.ts | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index e80602a3f826e..6d39cc532d2cf 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -26,7 +26,7 @@ import { registerContributions as searchWidgetContributions } from 'vs/workbench import { SymbolsQuickAccessProvider } from 'vs/workbench/contrib/search/browser/symbolsQuickAccess'; import { ISearchHistoryService, SearchHistoryService } from 'vs/workbench/contrib/search/common/searchHistoryService'; import { ISearchViewModelWorkbenchService, SearchViewModelWorkbenchService } from 'vs/workbench/contrib/search/browser/searchModel'; -import { SearchSortOrder, SEARCH_EXCLUDE_CONFIG, VIEWLET_ID, ViewMode, VIEW_ID } from 'vs/workbench/services/search/common/search'; +import { SearchSortOrder, SEARCH_EXCLUDE_CONFIG, VIEWLET_ID, ViewMode, VIEW_ID, DEFAULT_MAX_SEARCH_RESULTS } from 'vs/workbench/services/search/common/search'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { assertType } from 'vs/base/common/types'; import { getWorkspaceSymbols, IWorkspaceSymbol } from 'vs/workbench/contrib/search/common/search'; @@ -238,7 +238,7 @@ configurationRegistry.registerConfiguration({ }, 'search.maxResults': { type: ['number', 'null'], - default: 20000, + default: DEFAULT_MAX_SEARCH_RESULTS, markdownDescription: nls.localize('search.maxResults', "Controls the maximum number of search results, this can be set to `null` (empty) to return unlimited results.") }, 'search.collapseResults': { diff --git a/src/vs/workbench/services/search/common/search.ts b/src/vs/workbench/services/search/common/search.ts index cb0231edff50a..d03e606db74e9 100644 --- a/src/vs/workbench/services/search/common/search.ts +++ b/src/vs/workbench/services/search/common/search.ts @@ -29,6 +29,7 @@ export const VIEW_ID = 'workbench.view.search'; export const SEARCH_RESULT_LANGUAGE_ID = 'search-result'; export const SEARCH_EXCLUDE_CONFIG = 'search.exclude'; +export const DEFAULT_MAX_SEARCH_RESULTS = 20000; // Warning: this pattern is used in the search editor to detect offsets. If you // change this, also change the search-result built-in extension diff --git a/src/vs/workbench/services/search/common/searchService.ts b/src/vs/workbench/services/search/common/searchService.ts index cec7fb1114ce5..f4e35c525e166 100644 --- a/src/vs/workbench/services/search/common/searchService.ts +++ b/src/vs/workbench/services/search/common/searchService.ts @@ -21,7 +21,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { deserializeSearchError, FileMatch, IAITextQuery, ICachedSearchStats, IFileMatch, IFileQuery, IFileSearchStats, IFolderQuery, IProgressMessage, ISearchComplete, ISearchEngineStats, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, isFileMatch, isProgressMessage, ITextQuery, pathIncludedInQuery, QueryType, SEARCH_RESULT_LANGUAGE_ID, SearchError, SearchErrorCode, SearchProviderType } from 'vs/workbench/services/search/common/search'; +import { DEFAULT_MAX_SEARCH_RESULTS, deserializeSearchError, FileMatch, IAITextQuery, ICachedSearchStats, IFileMatch, IFileQuery, IFileSearchStats, IFolderQuery, IProgressMessage, ISearchComplete, ISearchEngineStats, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, isFileMatch, isProgressMessage, ITextQuery, pathIncludedInQuery, QueryType, SEARCH_RESULT_LANGUAGE_ID, SearchError, SearchErrorCode, SearchProviderType } from 'vs/workbench/services/search/common/search'; import { getTextSearchMatchWithModelContext, editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers'; export class SearchService extends Disposable implements ISearchService { @@ -529,7 +529,7 @@ export class SearchService extends Disposable implements ISearchService { } // Use editor API to find matches - const askMax = isNumber(query.maxResults) ? query.maxResults + 1 : Number.MAX_SAFE_INTEGER; + const askMax = (isNumber(query.maxResults) ? query.maxResults : DEFAULT_MAX_SEARCH_RESULTS) + 1; let matches = model.findMatches(query.contentPattern.pattern, false, !!query.contentPattern.isRegExp, !!query.contentPattern.isCaseSensitive, query.contentPattern.isWordMatch ? query.contentPattern.wordSeparators! : null, false, askMax); if (matches.length) { if (askMax && matches.length >= askMax) { diff --git a/src/vs/workbench/services/search/common/textSearchManager.ts b/src/vs/workbench/services/search/common/textSearchManager.ts index 3abb626f64b9c..d135124aa055d 100644 --- a/src/vs/workbench/services/search/common/textSearchManager.ts +++ b/src/vs/workbench/services/search/common/textSearchManager.ts @@ -11,7 +11,7 @@ import { Schemas } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { hasSiblingPromiseFn, IAITextQuery, IExtendedExtensionSearchOptions, IFileMatch, IFolderQuery, IPatternInfo, ISearchCompleteStats, ITextQuery, ITextSearchContext, ITextSearchMatch, ITextSearchResult, ITextSearchStats, QueryGlobTester, QueryType, resolvePatternsForProvider } from 'vs/workbench/services/search/common/search'; +import { DEFAULT_MAX_SEARCH_RESULTS, hasSiblingPromiseFn, IAITextQuery, IExtendedExtensionSearchOptions, IFileMatch, IFolderQuery, IPatternInfo, ISearchCompleteStats, ITextQuery, ITextSearchContext, ITextSearchMatch, ITextSearchResult, ITextSearchStats, QueryGlobTester, QueryType, resolvePatternsForProvider } from 'vs/workbench/services/search/common/search'; import { AITextSearchProvider, Range, TextSearchComplete, TextSearchMatch, TextSearchOptions, TextSearchProvider, TextSearchQuery, TextSearchResult } from 'vs/workbench/services/search/common/searchExtTypes'; export interface IFileUtils { @@ -210,7 +210,7 @@ export class TextSearchManager { followSymlinks: !fq.ignoreSymlinks, encoding: fq.fileEncoding && this.fileUtils.toCanonicalName(fq.fileEncoding), maxFileSize: this.query.maxFileSize, - maxResults: this.query.maxResults ?? Number.MAX_SAFE_INTEGER, + maxResults: this.query.maxResults ?? DEFAULT_MAX_SEARCH_RESULTS, previewOptions: this.query.previewOptions, afterContext: this.query.afterContext, beforeContext: this.query.beforeContext diff --git a/src/vs/workbench/services/search/node/rawSearchService.ts b/src/vs/workbench/services/search/node/rawSearchService.ts index 8849a12897150..f33611b3a01c9 100644 --- a/src/vs/workbench/services/search/node/rawSearchService.ts +++ b/src/vs/workbench/services/search/node/rawSearchService.ts @@ -13,7 +13,7 @@ import { basename, dirname, join, sep } from 'vs/base/common/path'; import { StopWatch } from 'vs/base/common/stopwatch'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ByteSize } from 'vs/platform/files/common/files'; -import { ICachedSearchStats, IFileQuery, IFileSearchProgressItem, IFileSearchStats, IFolderQuery, IProgressMessage, IRawFileMatch, IRawFileQuery, IRawQuery, IRawSearchService, IRawTextQuery, ISearchEngine, ISearchEngineSuccess, ISerializedFileMatch, ISerializedSearchComplete, ISerializedSearchProgressItem, ISerializedSearchSuccess, isFilePatternMatch, ITextQuery } from 'vs/workbench/services/search/common/search'; +import { DEFAULT_MAX_SEARCH_RESULTS, ICachedSearchStats, IFileQuery, IFileSearchProgressItem, IFileSearchStats, IFolderQuery, IProgressMessage, IRawFileMatch, IRawFileQuery, IRawQuery, IRawSearchService, IRawTextQuery, ISearchEngine, ISearchEngineSuccess, ISerializedFileMatch, ISerializedSearchComplete, ISerializedSearchProgressItem, ISerializedSearchSuccess, isFilePatternMatch, ITextQuery } from 'vs/workbench/services/search/common/search'; import { Engine as FileSearchEngine } from 'vs/workbench/services/search/node/fileSearch'; import { TextSearchEngineAdapter } from 'vs/workbench/services/search/node/textSearchAdapter'; @@ -258,7 +258,7 @@ export class SearchService implements IRawSearchService { const query = prepareQuery(config.filePattern || ''); const compare = (matchA: IRawFileMatch, matchB: IRawFileMatch) => compareItemsByFuzzyScore(matchA, matchB, query, true, FileMatchItemAccessor, scorerCache); - const maxResults = typeof config.maxResults === 'number' ? config.maxResults : Number.MAX_VALUE; + const maxResults = typeof config.maxResults === 'number' ? config.maxResults : DEFAULT_MAX_SEARCH_RESULTS; return arrays.topAsync(results, compare, maxResults, 10000, token); } From fcf8c0bc4fa552876ec095937b30520ac723080c Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 3 Jun 2024 17:17:11 -0700 Subject: [PATCH 037/755] more instances of max safe integer --- .../search/browser/notebookSearch/notebookSearchService.ts | 4 ++-- src/vs/workbench/contrib/search/browser/searchModel.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/search/browser/notebookSearch/notebookSearchService.ts b/src/vs/workbench/contrib/search/browser/notebookSearch/notebookSearchService.ts index b39946294c80e..4ef1cdae76eb6 100644 --- a/src/vs/workbench/contrib/search/browser/notebookSearch/notebookSearchService.ts +++ b/src/vs/workbench/contrib/search/browser/notebookSearch/notebookSearchService.ts @@ -13,7 +13,7 @@ import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/note import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { INotebookSearchService } from 'vs/workbench/contrib/search/common/notebookSearch'; import { INotebookCellMatchWithModel, INotebookFileMatchWithModel, contentMatchesToTextSearchMatches, webviewMatchesToTextSearchMatches } from 'vs/workbench/contrib/search/browser/notebookSearch/searchNotebookHelpers'; -import { ITextQuery, QueryType, ISearchProgressItem, ISearchComplete, ISearchConfigurationProperties, pathIncludedInQuery, ISearchService, IFolderQuery } from 'vs/workbench/services/search/common/search'; +import { ITextQuery, QueryType, ISearchProgressItem, ISearchComplete, ISearchConfigurationProperties, pathIncludedInQuery, ISearchService, IFolderQuery, DEFAULT_MAX_SEARCH_RESULTS } from 'vs/workbench/services/search/common/search'; import * as arrays from 'vs/base/common/arrays'; import { isNumber } from 'vs/base/common/types'; import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService'; @@ -232,7 +232,7 @@ export class NotebookSearchService implements INotebookSearchService { if (!widget.hasModel()) { continue; } - const askMax = isNumber(query.maxResults) ? query.maxResults + 1 : Number.MAX_SAFE_INTEGER; + const askMax = (isNumber(query.maxResults) ? query.maxResults : DEFAULT_MAX_SEARCH_RESULTS) + 1; const uri = widget.viewModel!.uri; if (!pathIncludedInQuery(query, uri.fsPath)) { diff --git a/src/vs/workbench/contrib/search/browser/searchModel.ts b/src/vs/workbench/contrib/search/browser/searchModel.ts index 82c166d796db6..764f8966664a8 100644 --- a/src/vs/workbench/contrib/search/browser/searchModel.ts +++ b/src/vs/workbench/contrib/search/browser/searchModel.ts @@ -41,7 +41,7 @@ import { contentMatchesToTextSearchMatches, webviewMatchesToTextSearchMatches, I import { INotebookSearchService } from 'vs/workbench/contrib/search/common/notebookSearch'; import { rawCellPrefix, INotebookCellMatchNoModel, isINotebookFileMatchNoModel } from 'vs/workbench/contrib/search/common/searchNotebookHelpers'; import { ReplacePattern } from 'vs/workbench/services/search/common/replace'; -import { IAITextQuery, IFileMatch, IPatternInfo, ISearchComplete, ISearchConfigurationProperties, ISearchProgressItem, ISearchRange, ISearchService, ITextQuery, ITextSearchContext, ITextSearchMatch, ITextSearchPreviewOptions, ITextSearchResult, ITextSearchStats, OneLineRange, QueryType, resultIsMatch, SearchCompletionExitCode, SearchSortOrder } from 'vs/workbench/services/search/common/search'; +import { DEFAULT_MAX_SEARCH_RESULTS, IAITextQuery, IFileMatch, IPatternInfo, ISearchComplete, ISearchConfigurationProperties, ISearchProgressItem, ISearchRange, ISearchService, ITextQuery, ITextSearchContext, ITextSearchMatch, ITextSearchPreviewOptions, ITextSearchResult, ITextSearchStats, OneLineRange, QueryType, resultIsMatch, SearchCompletionExitCode, SearchSortOrder } from 'vs/workbench/services/search/common/search'; import { getTextSearchMatchWithModelContext, editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers'; import { CellSearchModel } from 'vs/workbench/contrib/search/common/cellSearchModel'; import { CellFindMatchModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findModel'; @@ -529,7 +529,7 @@ export class FileMatch extends Disposable implements IFileMatch { const wordSeparators = this._query.isWordMatch && this._query.wordSeparators ? this._query.wordSeparators : null; const matches = this._model - .findMatches(this._query.pattern, this._model.getFullModelRange(), !!this._query.isRegExp, !!this._query.isCaseSensitive, wordSeparators, false, this._maxResults ?? Number.MAX_SAFE_INTEGER); + .findMatches(this._query.pattern, this._model.getFullModelRange(), !!this._query.isRegExp, !!this._query.isCaseSensitive, wordSeparators, false, this._maxResults ?? DEFAULT_MAX_SEARCH_RESULTS); this.updateMatches(matches, true, this._model, false); } @@ -550,7 +550,7 @@ export class FileMatch extends Disposable implements IFileMatch { oldMatches.forEach(match => this._textMatches.delete(match.id())); const wordSeparators = this._query.isWordMatch && this._query.wordSeparators ? this._query.wordSeparators : null; - const matches = this._model.findMatches(this._query.pattern, range, !!this._query.isRegExp, !!this._query.isCaseSensitive, wordSeparators, false, this._maxResults ?? Number.MAX_SAFE_INTEGER); + const matches = this._model.findMatches(this._query.pattern, range, !!this._query.isRegExp, !!this._query.isCaseSensitive, wordSeparators, false, this._maxResults ?? DEFAULT_MAX_SEARCH_RESULTS); this.updateMatches(matches, modelChange, this._model, false); // await this.updateMatchesForEditorWidget(); From 35faacda9302da1bff0c33b2e2ea6bb8c0e36b6f Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 4 Jun 2024 08:23:17 +0200 Subject: [PATCH 038/755] print loader error --- test/unit/node/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/node/index.js b/test/unit/node/index.js index 14ceed7177cb8..e876bd1e0075f 100644 --- a/test/unit/node/index.js +++ b/test/unit/node/index.js @@ -228,7 +228,7 @@ function main() { // set up last test Mocha.suite('Loader', function () { test('should not explode while loading', function () { - assert.ok(!didErr, 'should not explode while loading'); + assert.ok(!didErr, `should not explode while loading: ${didErr}`); }); }); } From bc4fdf7520ddda60261019ad893807b1fd5591bf Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Jun 2024 08:38:14 +0200 Subject: [PATCH 039/755] improvements to profiles editor (#214198) * feedback * use list * reduce size * fix checkbox and selectbox * preview profile * rename * disable while creating and previewing * improvements * refactor * fix --- .../userDataProfile/common/userDataProfile.ts | 107 ++++- src/vs/platform/window/common/window.ts | 6 +- .../electron-main/windowsMainService.ts | 2 +- .../browser/media/userDataProfilesEditor.css | 91 ++-- .../browser/userDataProfile.ts | 4 +- .../browser/userDataProfilesEditor.ts | 372 ++++++++------- .../browser/userDataProfilesEditorModel.ts | 451 +++++++++++++----- .../browser/extensionsResource.ts | 2 + .../userDataProfileImportExportService.ts | 20 +- .../browser/userDataProfileManagement.ts | 9 +- .../userDataProfile/common/userDataProfile.ts | 15 +- 11 files changed, 709 insertions(+), 370 deletions(-) diff --git a/src/vs/platform/userDataProfile/common/userDataProfile.ts b/src/vs/platform/userDataProfile/common/userDataProfile.ts index b65c078f83a12..f18ae0970505e 100644 --- a/src/vs/platform/userDataProfile/common/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/common/userDataProfile.ts @@ -168,6 +168,10 @@ export type UserDataProfilesObject = { emptyWindows: Map; }; +type TransientUserDataProfilesObject = UserDataProfilesObject & { + folders: ResourceMap; +}; + export type StoredUserDataProfile = { name: string; location: URI; @@ -209,8 +213,9 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf private profileCreationPromises = new Map>(); - protected readonly transientProfilesObject: UserDataProfilesObject = { + protected readonly transientProfilesObject: TransientUserDataProfilesObject = { profiles: [], + folders: new ResourceMap(), workspaces: new ResourceMap(), emptyWindows: new Map() }; @@ -454,6 +459,7 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf } async resetWorkspaces(): Promise { + this.transientProfilesObject.folders.clear(); this.transientProfilesObject.workspaces.clear(); this.transientProfilesObject.emptyWindows.clear(); this.profilesObject.workspaces.clear(); @@ -484,7 +490,17 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf getProfileForWorkspace(workspaceIdentifier: IAnyWorkspaceIdentifier): IUserDataProfile | undefined { const workspace = this.getWorkspace(workspaceIdentifier); - return URI.isUri(workspace) ? this.transientProfilesObject.workspaces.get(workspace) ?? this.profilesObject.workspaces.get(workspace) : this.transientProfilesObject.emptyWindows.get(workspace) ?? this.profilesObject.emptyWindows.get(workspace); + const profile = URI.isUri(workspace) ? this.profilesObject.workspaces.get(workspace) : this.profilesObject.emptyWindows.get(workspace); + if (profile) { + return profile; + } + if (isSingleFolderWorkspaceIdentifier(workspaceIdentifier)) { + return this.transientProfilesObject.folders.get(workspaceIdentifier.uri); + } + if (isWorkspaceIdentifier(workspaceIdentifier)) { + return this.transientProfilesObject.workspaces.get(workspaceIdentifier.configPath); + } + return this.transientProfilesObject.emptyWindows.get(workspaceIdentifier.id); } protected getWorkspace(workspaceIdentifier: IAnyWorkspaceIdentifier): URI | string { @@ -498,16 +514,19 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf } private isProfileAssociatedToWorkspace(profile: IUserDataProfile): boolean { - if ([...this.transientProfilesObject.emptyWindows.values()].some(windowProfile => this.uriIdentityService.extUri.isEqual(windowProfile.location, profile.location))) { + if ([...this.profilesObject.emptyWindows.values()].some(windowProfile => this.uriIdentityService.extUri.isEqual(windowProfile.location, profile.location))) { return true; } - if ([...this.transientProfilesObject.workspaces.values()].some(workspaceProfile => this.uriIdentityService.extUri.isEqual(workspaceProfile.location, profile.location))) { + if ([...this.profilesObject.workspaces.values()].some(workspaceProfile => this.uriIdentityService.extUri.isEqual(workspaceProfile.location, profile.location))) { return true; } - if ([...this.profilesObject.emptyWindows.values()].some(windowProfile => this.uriIdentityService.extUri.isEqual(windowProfile.location, profile.location))) { + if ([...this.transientProfilesObject.emptyWindows.values()].some(windowProfile => this.uriIdentityService.extUri.isEqual(windowProfile.location, profile.location))) { return true; } - if ([...this.profilesObject.workspaces.values()].some(workspaceProfile => this.uriIdentityService.extUri.isEqual(workspaceProfile.location, profile.location))) { + if ([...this.transientProfilesObject.workspaces.values()].some(workspaceProfile => this.uriIdentityService.extUri.isEqual(workspaceProfile.location, profile.location))) { + return true; + } + if ([...this.transientProfilesObject.folders.values()].some(workspaceProfile => this.uriIdentityService.extUri.isEqual(workspaceProfile.location, profile.location))) { return true; } return false; @@ -516,6 +535,7 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf private updateProfiles(added: IUserDataProfile[], removed: IUserDataProfile[], updated: IUserDataProfile[]): void { const allProfiles = [...this.profiles, ...added]; const storedProfiles: StoredUserDataProfile[] = []; + const transientProfiles = this.transientProfilesObject.profiles; this.transientProfilesObject.profiles = []; for (let profile of allProfiles) { if (profile.isDefault) { @@ -525,9 +545,30 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf continue; } profile = updated.find(p => profile.id === p.id) ?? profile; + const transientProfile = transientProfiles.find(p => profile.id === p.id); if (profile.isTransient) { this.transientProfilesObject.profiles.push(profile); } else { + if (transientProfile) { + for (const [windowId, p] of this.transientProfilesObject.emptyWindows.entries()) { + if (profile.id === p.id) { + this.updateWorkspaceAssociation({ id: windowId }, profile); + break; + } + } + for (const [workspace, p] of this.transientProfilesObject.workspaces.entries()) { + if (profile.id === p.id) { + this.updateWorkspaceAssociation({ id: '', configPath: workspace }, profile); + break; + } + } + for (const [folder, p] of this.transientProfilesObject.folders.entries()) { + if (profile.id === p.id) { + this.updateWorkspaceAssociation({ id: '', uri: folder }, profile); + break; + } + } + } storedProfiles.push({ location: profile.location, name: profile.name, shortName: profile.shortName, icon: profile.icon, useDefaultFlags: profile.useDefaultFlags }); } } @@ -544,30 +585,48 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf // Force transient if the new profile to associate is transient transient = newProfile?.isTransient ? true : transient; - if (!transient) { - // Unset the transiet workspace association if any - this.updateWorkspaceAssociation(workspaceIdentifier, undefined, true); - } + if (transient) { + if (isSingleFolderWorkspaceIdentifier(workspaceIdentifier)) { + this.transientProfilesObject.folders.delete(workspaceIdentifier.uri); + if (newProfile) { + this.transientProfilesObject.folders.set(workspaceIdentifier.uri, newProfile); + } + } - const workspace = this.getWorkspace(workspaceIdentifier); - const profilesObject = transient ? this.transientProfilesObject : this.profilesObject; + else if (isWorkspaceIdentifier(workspaceIdentifier)) { + this.transientProfilesObject.workspaces.delete(workspaceIdentifier.configPath); + if (newProfile) { + this.transientProfilesObject.workspaces.set(workspaceIdentifier.configPath, newProfile); + } + } - // Folder or Multiroot workspace - if (URI.isUri(workspace)) { - profilesObject.workspaces.delete(workspace); - if (newProfile) { - profilesObject.workspaces.set(workspace, newProfile); + else { + this.transientProfilesObject.emptyWindows.delete(workspaceIdentifier.id); + if (newProfile) { + this.transientProfilesObject.emptyWindows.set(workspaceIdentifier.id, newProfile); + } } } - // Empty Window + else { - profilesObject.emptyWindows.delete(workspace); - if (newProfile) { - profilesObject.emptyWindows.set(workspace, newProfile); - } - } + // Unset the transiet workspace association if any + this.updateWorkspaceAssociation(workspaceIdentifier, undefined, true); + const workspace = this.getWorkspace(workspaceIdentifier); - if (!transient) { + // Folder or Multiroot workspace + if (URI.isUri(workspace)) { + this.profilesObject.workspaces.delete(workspace); + if (newProfile) { + this.profilesObject.workspaces.set(workspace, newProfile); + } + } + // Empty Window + else { + this.profilesObject.emptyWindows.delete(workspace); + if (newProfile) { + this.profilesObject.emptyWindows.set(workspace, newProfile); + } + } this.updateStoredProfileAssociations(); } } diff --git a/src/vs/platform/window/common/window.ts b/src/vs/platform/window/common/window.ts index 16eef424015ad..2b7ffc4651f01 100644 --- a/src/vs/platform/window/common/window.ts +++ b/src/vs/platform/window/common/window.ts @@ -49,6 +49,9 @@ export interface IBaseOpenWindowsOptions { * If not set, defaults to the remote authority of the current window. */ readonly remoteAuthority?: string | null; + + readonly forceProfile?: string; + readonly forceTempProfile?: boolean; } export interface IOpenWindowOptions extends IBaseOpenWindowsOptions { @@ -64,9 +67,6 @@ export interface IOpenWindowOptions extends IBaseOpenWindowsOptions { readonly gotoLineMode?: boolean; readonly waitMarkerFileURI?: URI; - - readonly forceProfile?: string; - readonly forceTempProfile?: boolean; } export interface IAddFoldersRequest { diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index 8c9cb2b186853..fd704a5cfe6b5 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -269,7 +269,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic const forceReuseWindow = options?.forceReuseWindow; const forceNewWindow = !forceReuseWindow; - return this.open({ ...openConfig, cli, forceEmpty, forceNewWindow, forceReuseWindow, remoteAuthority }); + return this.open({ ...openConfig, cli, forceEmpty, forceNewWindow, forceReuseWindow, remoteAuthority, forceTempProfile: options?.forceTempProfile, forceProfile: options?.forceProfile }); } openExistingWindow(window: ICodeWindow, openConfig: IOpenConfiguration): void { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index 0233dfd53099b..a37be4b9d8425 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -15,15 +15,21 @@ height: 100%; } -.profiles-editor .contents-container, -.profiles-editor .sidebar-container { +.profiles-editor .contents-container { padding: 0px 20px; height: 100%; } +.profiles-editor .sidebar-container { + padding-left: 20px; + height: 100%; +} + .profiles-editor .sidebar-container .new-profile-button { + padding: 0px 20px 0px 18px; display: flex; align-items: center; + height: 40px; } .profiles-editor .sidebar-container .new-profile-button > .monaco-button-dropdown { @@ -36,20 +42,25 @@ padding: 0 4px; } -.profiles-editor .sidebar-container .profiles-tree { +.profiles-editor .sidebar-container .profiles-list { margin-top: 10px; } -.profiles-editor .sidebar-container .profiles-tree .profile-tree-item { +.profiles-editor .sidebar-container .profiles-list .profile-list-item { + padding-left: 20px; display: flex; align-items: center; } -.profiles-editor .sidebar-container .profiles-tree .profile-tree-item > * { +.profiles-editor .sidebar-container .profiles-list .profile-list-item > * { margin-right: 5px; } -.profiles-editor .sidebar-container .profiles-tree .profile-tree-item > .profile-tree-item-description { +.profiles-editor .sidebar-container .profiles-list .profile-list-item > .profile-list-item-label.new-profile { + font-style: italic; +} + +.profiles-editor .sidebar-container .profiles-list .profile-list-item > .profile-list-item-description { margin-left: 2px; display: flex; align-items: center; @@ -63,14 +74,35 @@ .profiles-editor .contents-container .profile-header { display: flex; - height: 34px; + height: 40px; align-items: center; } -.profiles-editor .contents-container .profile-header .profile-title { - font-size: x-large; - font-weight: bold; +.profiles-editor .contents-container .profile-header .profile-title-container { flex: 1; + display: flex; + align-items: center; + font-size: large; +} + +.profiles-editor .contents-container .profile-title-container .codicon { + cursor: pointer; + font-size: x-large; + padding: 4px; + margin-right: 8px; +} + +.profiles-editor .contents-container .profile-title-container .monaco-inputbox { + width: 330px; +} + +.profiles-editor .contents-container .profile-header .profile-button-container { + display: flex; + align-items: center; +} + +.profiles-editor .contents-container .profile-header .profile-button-container .monaco-button { + margin-right: 4px; } .profiles-editor .contents-container .profile-header .profile-actions-container { @@ -84,10 +116,11 @@ .profiles-editor .contents-container .profile-header .profile-actions-container .actions-container .codicon { font-size: 18px; + padding: 6px; } .profiles-editor .contents-container .profile-header .profile-actions-container .profile-button-container { - margin-right: 5px; + margin-left:6px; min-width: 120px; } @@ -100,24 +133,6 @@ margin-top: 20px; } -.profiles-editor .contents-container .profile-name-container { - margin: 0px 0px 20px 15px; - display: flex; - width: 330px; - align-items: center; -} - -.profiles-editor .contents-container .profile-name-container .codicon { - cursor: pointer; - font-size: 20px; - padding: 2px; -} - -.profiles-editor .contents-container .profile-name-container .monaco-inputbox { - flex: 1; - margin-left: 10px; -} - .profiles-editor .contents-container .profile-select-container { overflow: hidden; display: flex; @@ -139,7 +154,7 @@ } .profiles-editor .contents-container .profile-copy-from-container > .profile-copy-from-label { - margin-right: 10px; + margin-right: 33px; display: inline-flex; align-items: center; } @@ -158,8 +173,22 @@ align-items: center; } +.profiles-editor .contents-container .profile-tree-item-container > .profile-resource-type-label { + width: 200px; +} + +.profiles-editor .contents-container .profile-tree-item-container > .inherit-container { + display: flex; + align-items: center; +} + +.profiles-editor .contents-container .profile-tree-item-container > .inherit-container > .inherit-label { + /* font-size: 0.9em; */ + opacity: 0.8; +} + .profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-resource-type-label-container { - width: 150px; + width: 170px; } .profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-select-container { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts index f215f1fcbfd60..1644a5c41b1c4 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts @@ -184,7 +184,9 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements private registerProfilesActions(): void { this.profilesDisposable.value = new DisposableStore(); for (const profile of this.userDataProfilesService.profiles) { - this.profilesDisposable.value.add(this.registerProfileEntryAction(profile)); + if (!profile.isTransient) { + this.profilesDisposable.value.add(this.registerProfileEntryAction(profile)); + } } } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 4c294d03ac234..80be141258f48 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -20,15 +20,15 @@ import { IEditorOpenContext, IEditorSerializer, IUntypedEditorInput } from 'vs/w import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { IUserDataProfilesEditor } from 'vs/workbench/contrib/userDataProfile/common/userDataProfile'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { defaultUserDataProfileIcon, IProfileResourceChildTreeItem, IProfileTemplateInfo, IUserDataProfileManagementService, PROFILE_FILTER } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { defaultUserDataProfileIcon, IProfileTemplateInfo, IUserDataProfileManagementService, PROFILE_FILTER } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import { Orientation, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; import { Button, ButtonWithDropdown } from 'vs/base/browser/ui/button/button'; import { defaultButtonStyles, defaultCheckboxStyles, defaultInputBoxStyles, defaultSelectBoxStyles } from 'vs/platform/theme/browser/defaultStyles'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { PANEL_BORDER } from 'vs/workbench/common/theme'; -import { WorkbenchAsyncDataTree, WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; -import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { IAsyncDataSource, IObjectTreeElement, ITreeNode, ITreeRenderer, ObjectTreeElementCollapseState } from 'vs/base/browser/ui/tree/tree'; +import { WorkbenchAsyncDataTree, WorkbenchList } from 'vs/platform/list/browser/listService'; +import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { IAsyncDataSource, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { Disposable, DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; @@ -44,18 +44,14 @@ import { IHoverWidget } from 'vs/base/browser/ui/hover/hover'; import { ISelectOptionItem, SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { URI } from 'vs/base/common/uri'; import { IEditorProgressService } from 'vs/platform/progress/common/progress'; -import { ExtensionsResourceTreeItem } from 'vs/workbench/services/userDataProfile/browser/extensionsResource'; -import { isString, isUndefined } from 'vs/base/common/types'; +import { isUndefined } from 'vs/base/common/types'; import { basename } from 'vs/base/common/resources'; import { RenderIndentGuides } from 'vs/base/browser/ui/tree/abstractTree'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { API_OPEN_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; -import { SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { DEFAULT_LABELS_CONTAINER, IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { AbstractUserDataProfileElement, IProfileElement, NewProfileElement, UserDataProfileElement, UserDataProfilesEditorModel } from 'vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel'; +import { AbstractUserDataProfileElement, isProfileResourceChildElement, isProfileResourceTypeElement, IProfileChildElement, IProfileResourceTypeChildElement, IProfileResourceTypeElement, NewProfileElement, UserDataProfileElement, UserDataProfilesEditorModel } from 'vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel'; import { Codicon } from 'vs/base/common/codicons'; import { WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { createInstantHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; @@ -68,7 +64,7 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi private container: HTMLElement | undefined; private splitView: SplitView | undefined; - private profilesTree: WorkbenchObjectTree | undefined; + private profilesList: WorkbenchList | undefined; private profileWidget: ProfileWidget | undefined; private model: UserDataProfilesEditorModel | undefined; @@ -116,20 +112,21 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi this.splitView.addView({ onDidChange: Event.None, element: sidebarView, - minimumSize: 175, + minimumSize: 200, maximumSize: 350, layout: (width, _, height) => { sidebarView.style.width = `${width}px`; - if (height && this.profilesTree) { - this.profilesTree.getHTMLElement().style.height = `${height - 38}px`; - this.profilesTree.layout(height - 38, width); + if (height && this.profilesList) { + const listHeight = height - 40 /* new profile button */ - 10 /* padding */; + this.profilesList.getHTMLElement().style.height = `${listHeight}px`; + this.profilesList.layout(listHeight, width); } } }, 300, undefined, true); this.splitView.addView({ onDidChange: Event.None, element: contentsView, - minimumSize: 500, + minimumSize: 550, maximumSize: Number.POSITIVE_INFINITY, layout: (width, _, height) => { contentsView.style.width = `${width}px`; @@ -154,11 +151,11 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi // render New Profile Button this.renderNewProfileButton(append(parent, $('.new-profile-button'))); - // render profiles and templates tree - const renderer = this.instantiationService.createInstance(ProfileTreeElementRenderer); - const delegate = new ProfileTreeElementDelegate(); - this.profilesTree = this._register(this.instantiationService.createInstance(WorkbenchObjectTree, 'ProfilesTree', - append(parent, $('.profiles-tree')), + // render profiles list + const renderer = this.instantiationService.createInstance(ProfileElementRenderer); + const delegate = new ProfileElementDelegate(); + this.profilesList = this._register(this.instantiationService.createInstance(WorkbenchList, 'ProfilesList', + append(parent, $('.profiles-list')), delegate, [renderer], { @@ -166,15 +163,14 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi setRowLineHeight: false, horizontalScrolling: false, accessibilityProvider: { - getAriaLabel(extensionFeature: IProfileElement | null): string { - return extensionFeature?.name ?? ''; + getAriaLabel(profileElement: AbstractUserDataProfileElement | null): string { + return profileElement?.name ?? ''; }, getWidgetAriaLabel(): string { return localize('profiles', "Profiles"); } }, openOnSingleClick: true, - enableStickyScroll: false, identityProvider: { getId(e) { if (e instanceof UserDataProfileElement) { @@ -212,15 +208,15 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi } private registerListeners(): void { - if (this.profilesTree) { - this._register(this.profilesTree.onDidChangeSelection(e => { + if (this.profilesList) { + this._register(this.profilesList.onDidChangeSelection(e => { const [element] = e.elements; if (element instanceof AbstractUserDataProfileElement) { this.profileWidget?.render(element); } })); - this._register(this.profilesTree.onContextMenu(e => { + this._register(this.profilesList.onContextMenu(e => { if (e.element instanceof AbstractUserDataProfileElement) { this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, @@ -300,83 +296,76 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi override async setInput(input: UserDataProfilesEditorInput, options: IEditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise { await super.setInput(input, options, context, token); this.model = await input.resolve(); - this.updateProfilesTree(); + this.updateProfilesList(); this._register(this.model.onDidChange((element) => { - this.updateProfilesTree(element); + this.updateProfilesList(element); })); } override focus(): void { super.focus(); - this.profilesTree?.domFocus(); + this.profilesList?.domFocus(); } - private updateProfilesTree(elementToSelect?: IProfileElement): void { + private updateProfilesList(elementToSelect?: AbstractUserDataProfileElement): void { if (!this.model) { return; } - const profileElements: IObjectTreeElement[] = this.model.profiles.map(element => ({ element })); - const currentSelection = this.profilesTree?.getSelection()?.[0]; - this.profilesTree?.setChildren(null, [ - { - element: { name: localize('profiles', "Profiles") }, - children: profileElements, - collapsible: false, - collapsed: ObjectTreeElementCollapseState.Expanded - } - ]); + const currentSelectionIndex = this.profilesList?.getSelection()?.[0]; + const currentSelection = currentSelectionIndex !== undefined ? this.profilesList?.element(currentSelectionIndex) : undefined; + this.profilesList?.splice(0, this.profilesList.length, this.model.profiles); + if (elementToSelect) { - this.profilesTree?.setSelection([elementToSelect]); + this.profilesList?.setSelection([this.model.profiles.indexOf(elementToSelect)]); } else if (currentSelection) { - if (currentSelection instanceof AbstractUserDataProfileElement) { - if (!this.model.profiles.includes(currentSelection)) { - const elementToSelect = this.model.profiles.find(profile => profile.name === currentSelection.name) ?? this.model.profiles[0]; - if (elementToSelect) { - this.profilesTree?.setSelection([elementToSelect]); - } + if (!this.model.profiles.includes(currentSelection)) { + const elementToSelect = this.model.profiles.find(profile => profile.name === currentSelection.name) ?? this.model.profiles[0]; + if (elementToSelect) { + this.profilesList?.setSelection([this.model.profiles.indexOf(elementToSelect)]); } } } else { const elementToSelect = this.model.profiles.find(profile => profile.active) ?? this.model.profiles[0]; if (elementToSelect) { - this.profilesTree?.setSelection([elementToSelect]); + this.profilesList?.setSelection([this.model.profiles.indexOf(elementToSelect)]); } } } } -interface IProfileTreeElementTemplateData { +interface IProfileElementTemplateData { readonly icon: HTMLElement; readonly label: HTMLElement; readonly description: HTMLElement; readonly disposables: DisposableStore; } -class ProfileTreeElementDelegate implements IListVirtualDelegate { - getHeight(element: IProfileElement) { +class ProfileElementDelegate implements IListVirtualDelegate { + getHeight(element: AbstractUserDataProfileElement) { return 30; } - getTemplateId() { return 'profileTreeElement'; } + getTemplateId() { return 'profileListElement'; } } -class ProfileTreeElementRenderer implements ITreeRenderer { +class ProfileElementRenderer implements IListRenderer { - readonly templateId = 'profileTreeElement'; + readonly templateId = 'profileListElement'; - renderTemplate(container: HTMLElement): IProfileTreeElementTemplateData { - container.classList.add('profile-tree-item'); - const icon = append(container, $('.profile-tree-item-icon')); - const label = append(container, $('.profile-tree-item-label')); - const description = append(container, $('.profile-tree-item-description')); + renderTemplate(container: HTMLElement): IProfileElementTemplateData { + container.classList.add('profile-list-item'); + const icon = append(container, $('.profile-list-item-icon')); + const label = append(container, $('.profile-list-item-label')); + const description = append(container, $('.profile-list-item-description')); append(description, $(`span${ThemeIcon.asCSSSelector(Codicon.check)}`)); append(description, $('span', undefined, localize('activeProfile', "Active"))); return { label, icon, description, disposables: new DisposableStore() }; } - renderElement({ element }: ITreeNode, index: number, templateData: IProfileTreeElementTemplateData, height: number | undefined): void { + renderElement(element: AbstractUserDataProfileElement, index: number, templateData: IProfileElementTemplateData, height: number | undefined) { templateData.disposables.clear(); templateData.label.textContent = element.name; + templateData.label.classList.toggle('new-profile', element instanceof NewProfileElement); if (element.icon) { templateData.icon.className = ThemeIcon.asClassName(ThemeIcon.fromId(element.icon)); } else { @@ -402,7 +391,7 @@ class ProfileTreeElementRenderer implements ITreeRendererelement?.element).resourceType) { + return (element?.element).resourceType; } - if (element?.element) { - return element.element.label?.label ?? ''; + if ((element?.element).label) { + return (element?.element).label; } return ''; }, @@ -545,10 +531,7 @@ class ProfileWidget extends Disposable { }, identityProvider: { getId(element) { - if (isString(element?.element)) { - return element.element; - } - if (element?.element) { + if (element?.element.handle) { return element.element.handle; } return ''; @@ -556,8 +539,8 @@ class ProfileWidget extends Disposable { }, expandOnlyOnTwistieClick: true, renderIndentGuides: RenderIndentGuides.None, - openOnSingleClick: true, enableStickyScroll: false, + collapseByDefault: () => false })); this._register(this.resourcesTree.onDidOpen(async (e) => { if (!e.browserEvent) { @@ -566,12 +549,8 @@ class ProfileWidget extends Disposable { if (e.browserEvent.target && (e.browserEvent.target as HTMLElement).classList.contains(Checkbox.CLASS_NAME)) { return; } - if (e.element && !isString(e.element.element)) { - if (e.element.element.resourceUri) { - await this.commandService.executeCommand(API_OPEN_EDITOR_COMMAND_ID, e.element.element.resourceUri, [SIDE_GROUP], undefined, e); - } else if (e.element.element.parent instanceof ExtensionsResourceTreeItem) { - await this.commandService.executeCommand('extension.open', e.element.element.handle, undefined, true, undefined, true); - } + if (e.element?.element.action) { + await e.element.element.action.run(); } })); } @@ -583,6 +562,9 @@ class ProfileWidget extends Disposable { if (this._profileElement.value?.element instanceof UserDataProfileElement && this._profileElement.value.element.profile.isDefault) { return; } + if (this._profileElement.value?.element.disabled) { + return; + } iconSelectBox.clearInput(); hoverWidget = this.hoverService.showHover({ content: iconSelectBox.domNode, @@ -664,11 +646,13 @@ class ProfileWidget extends Disposable { disposables.add(profileElement.onDidChange(e => this.renderProfileElement(profileElement))); const profile = profileElement instanceof UserDataProfileElement ? profileElement.profile : undefined; - this.nameInput.setEnabled(!profile?.isDefault); + this.profileTitle.classList.toggle('hide', !profile?.isDefault); + this.nameInput.element.classList.toggle('hide', !!profile?.isDefault); + this.iconElement.classList.toggle('hide', !!profile?.isDefault); this.resourcesTree.setInput(profileElement); disposables.add(profileElement.onDidChange(e => { - if (e.flags || e.copyFrom) { + if (e.flags || e.copyFrom || e.copyFlags) { const viewState = this.resourcesTree.getViewState(); this.resourcesTree.setInput(profileElement, { ...viewState, @@ -677,34 +661,52 @@ class ProfileWidget extends Disposable { } })); - if (profileElement.primaryAction) { + if (profileElement.primaryAction || profileElement.secondaryAction) { this.buttonContainer.classList.remove('hide'); - const button = disposables.add(new Button(this.buttonContainer, { - supportIcons: true, - ...defaultButtonStyles - })); - button.label = profileElement.primaryAction.label; - button.enabled = profileElement.primaryAction.enabled; - disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(profileElement.primaryAction!.run()))); - disposables.add(profileElement.primaryAction.onDidChange((e) => { - if (!isUndefined(e.enabled)) { - button.enabled = profileElement.primaryAction!.enabled; - } - })); - disposables.add(profileElement.onDidChange(e => { - if (e.message) { - button.setTitle(profileElement.message ?? profileElement.primaryAction!.label); - button.element.classList.toggle('error', !!profileElement.message); - } - })); + + if (profileElement.primaryAction) { + const button = disposables.add(new Button(this.buttonContainer, { + ...defaultButtonStyles + })); + button.label = profileElement.primaryAction.label; + button.enabled = profileElement.primaryAction.enabled; + disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(profileElement.primaryAction!.run()))); + disposables.add(profileElement.primaryAction.onDidChange((e) => { + if (!isUndefined(e.enabled)) { + button.enabled = profileElement.primaryAction!.enabled; + } + })); + disposables.add(profileElement.onDidChange(e => { + if (e.message) { + button.setTitle(profileElement.message ?? profileElement.primaryAction!.label); + button.element.classList.toggle('error', !!profileElement.message); + } + })); + } + + if (profileElement.secondaryAction) { + const button = disposables.add(new Button(this.buttonContainer, { + ...defaultButtonStyles, + secondary: true + })); + button.label = profileElement.secondaryAction.label; + button.enabled = profileElement.secondaryAction.enabled; + disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(profileElement.secondaryAction!.run()))); + disposables.add(profileElement.secondaryAction.onDidChange((e) => { + if (!isUndefined(e.enabled)) { + button.enabled = profileElement.secondaryAction!.enabled; + } + })); + } + } else { this.buttonContainer.classList.add('hide'); } this.toolbar.setActions(profileElement.titleActions[0].slice(0), profileElement.titleActions[1].slice(0)); - this.nameInput.focus(); if (profileElement instanceof NewProfileElement) { + this.nameInput.focus(); this.nameInput.select(); } } @@ -712,6 +714,11 @@ class ProfileWidget extends Disposable { private renderProfileElement(profileElement: AbstractUserDataProfileElement): void { this.profileTitle.textContent = profileElement.name; this.nameInput.value = profileElement.name; + if (profileElement.disabled) { + this.nameInput.disable(); + } else { + this.nameInput.enable(); + } if (profileElement.icon) { this.iconElement.className = ThemeIcon.asClassName(ThemeIcon.fromId(profileElement.icon)); } else { @@ -725,7 +732,7 @@ class ProfileWidget extends Disposable { : 0; if (index !== -1) { this.copyFromSelectBox.setOptions(this.copyFromOptions); - this.copyFromSelectBox.setEnabled(true); + this.copyFromSelectBox.setEnabled(!profileElement.previewProfile && !profileElement.disabled); this.copyFromSelectBox.select(index); } else { this.copyFromSelectBox.setOptions([{ text: basename(profileElement.copyFrom as URI) }]); @@ -739,13 +746,13 @@ class ProfileWidget extends Disposable { interface ProfileResourceTreeElement { - element: ProfileResourceType | IProfileResourceChildTreeItem; + element: IProfileChildElement; root: AbstractUserDataProfileElement; } class ProfileResourceTreeElementDelegate implements IListVirtualDelegate { getTemplateId(element: ProfileResourceTreeElement) { - if (!isString(element.element)) { + if (!(element.element).resourceType) { return ProfileResourceChildTreeItemRenderer.TEMPLATE_ID; } if (element.root instanceof NewProfileElement) { @@ -768,12 +775,20 @@ class ProfileResourceTreeDataSource implements IAsyncDataSourceelement.element).resourceType) { + if ((element.element).resourceType !== ProfileResourceType.Extensions && (element.element).resourceType !== ProfileResourceType.Snippets) { return false; } if (element.root instanceof NewProfileElement) { - return element.root.copyFrom !== undefined; + if (element.root.getFlag((element.element).resourceType)) { + return true; + } + if (element.root.copyFrom === undefined) { + return false; + } + if (!element.root.getCopyFlag((element.element).resourceType)) { + return false; + } } return true; } @@ -782,20 +797,14 @@ class ProfileResourceTreeDataSource implements IAsyncDataSource { if (element instanceof AbstractUserDataProfileElement) { - const resourceTypes = [ - ProfileResourceType.Settings, - ProfileResourceType.Keybindings, - ProfileResourceType.Snippets, - ProfileResourceType.Tasks, - ProfileResourceType.Extensions - ]; - return resourceTypes.map(resourceType => ({ element: resourceType, root: element })); + const children = await element.getChildren(); + return children.map(e => ({ element: e, root: element })); } - if (isString(element.element)) { - const progressRunner = this.editorProgressService.show(true); + if ((element.element).resourceType) { + const progressRunner = this.editorProgressService.show(true, 500); try { - const extensions = await element.root.getChildren(element.element); - return extensions.map(extension => ({ element: extension, root: element.root })); + const extensions = await element.root.getChildren((element.element).resourceType); + return extensions.map(e => ({ element: e, root: element.root })); } finally { progressRunner.done(); } @@ -810,9 +819,9 @@ interface IProfileResourceTemplateData { } interface IExistingProfileResourceTemplateData extends IProfileResourceTemplateData { - readonly checkbox: Checkbox; readonly label: HTMLElement; - readonly description: HTMLElement; + readonly inheritContainer: HTMLElement; + readonly checkbox: Checkbox; } interface INewProfileResourceTemplateData extends IProfileResourceTemplateData { @@ -863,11 +872,13 @@ class ExistingProfileResourceTreeRenderer extends AbstractProfileResourceTreeRen renderTemplate(parent: HTMLElement): IExistingProfileResourceTemplateData { const disposables = new DisposableStore(); const container = append(parent, $('.profile-tree-item-container.existing-profile-resource-type-container')); - const checkbox = disposables.add(new Checkbox('', false, defaultCheckboxStyles)); - append(container, checkbox.domNode); const label = append(container, $('.profile-resource-type-label')); - const description = append(container, $('.profile-resource-type-description', undefined, localize('using defaults', "Using Default Profile"))); - return { checkbox, label, description, disposables, elementDisposables: disposables.add(new DisposableStore()) }; + + const inheritContainer = append(container, $('.inherit-container')); + const checkbox = disposables.add(new Checkbox('', false, defaultCheckboxStyles)); + append(inheritContainer, checkbox.domNode); + append(inheritContainer, $('.inherit-label', undefined, localize('default profile', "Use Default Profile"))); + return { checkbox, label, inheritContainer, disposables, elementDisposables: disposables.add(new DisposableStore()) }; } renderElement({ element: profileResourceTreeElement }: ITreeNode, index: number, templateData: IExistingProfileResourceTemplateData, height: number | undefined): void { @@ -876,26 +887,17 @@ class ExistingProfileResourceTreeRenderer extends AbstractProfileResourceTreeRen if (!(root instanceof UserDataProfileElement)) { throw new Error('ExistingProfileResourceTreeRenderer can only render existing profile element'); } - if (!isString(element)) { - throw new Error('ExistingProfileResourceTreeRenderer can only render profile resource types'); + if (!isProfileResourceTypeElement(element)) { + throw new Error('Invalid profile resource element'); } - templateData.label.textContent = this.getResourceTypeTitle(element); + templateData.label.textContent = this.getResourceTypeTitle(element.resourceType); if (root instanceof UserDataProfileElement && root.profile.isDefault) { - templateData.checkbox.checked = true; - templateData.checkbox.disable(); - templateData.description.classList.add('hide'); + templateData.inheritContainer.classList.add('hide'); } else { - templateData.checkbox.enable(); - const checked = !root.getFlag(element); - templateData.checkbox.checked = checked; - templateData.description.classList.toggle('hide', checked); - templateData.elementDisposables.add(templateData.checkbox.onChange(() => root.setFlag(element, !templateData.checkbox.checked))); - templateData.elementDisposables.add(root.onDidChange(e => { - if (e.flags) { - templateData.description.classList.toggle('hide', !root.getFlag(element)); - } - })); + templateData.inheritContainer.classList.remove('hide'); + templateData.checkbox.checked = root.getFlag(element.resourceType); + templateData.elementDisposables.add(templateData.checkbox.onChange(() => root.setFlag(element.resourceType, templateData.checkbox.checked))); } } @@ -920,11 +922,7 @@ class NewProfileResourceTreeRenderer extends AbstractProfileResourceTreeRenderer const labelContainer = append(container, $('.profile-resource-type-label-container')); const label = append(labelContainer, $('span.profile-resource-type-label')); const selectBox = this._register(this.instantiationService.createInstance(SelectBox, - [ - { text: localize('empty', "Empty") }, - { text: localize('copy', "Copy") }, - { text: localize('default', "Use Default Profile") } - ], + [], 0, this.contextViewService, defaultSelectBoxStyles, @@ -944,15 +942,32 @@ class NewProfileResourceTreeRenderer extends AbstractProfileResourceTreeRenderer if (!(root instanceof NewProfileElement)) { throw new Error('NewProfileResourceTreeRenderer can only render new profile element'); } - if (!isString(element)) { - throw new Error('NewProfileResourceTreeRenderer can only profile resoyrce types'); + if (!isProfileResourceTypeElement(element)) { + throw new Error('Invalid profile resource element'); } - templateData.label.textContent = this.getResourceTypeTitle(element); - templateData.selectBox.select(root.getCopyFlag(element) ? 1 : root.getFlag(element) ? 2 : 0); - templateData.elementDisposables.add(templateData.selectBox.onDidSelect(option => { - root.setFlag(element, option.index === 2); - root.setCopyFlag(element, option.index === 1); - })); + templateData.label.textContent = this.getResourceTypeTitle(element.resourceType); + if (root.copyFrom) { + templateData.selectBox.setOptions([ + { text: localize('empty', "Empty") }, + { text: localize('copy', "Copy") }, + { text: localize('default', "Use Default Profile") } + ]); + templateData.selectBox.select(root.getCopyFlag(element.resourceType) ? 1 : root.getFlag(element.resourceType) ? 2 : 0); + templateData.elementDisposables.add(templateData.selectBox.onDidSelect(option => { + root.setFlag(element.resourceType, option.index === 2); + root.setCopyFlag(element.resourceType, option.index === 1); + })); + } else { + templateData.selectBox.setOptions([ + { text: localize('empty', "Empty") }, + { text: localize('default', "Use Default Profile") } + ]); + templateData.selectBox.select(root.getFlag(element.resourceType) ? 1 : 0); + templateData.elementDisposables.add(templateData.selectBox.onDidSelect(option => { + root.setFlag(element.resourceType, option.index === 1); + })); + } + templateData.selectBox.setEnabled(!root.disabled); } } @@ -984,9 +999,11 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe renderElement({ element: profileResourceTreeElement }: ITreeNode, index: number, templateData: IProfileResourceChildTreeItemTemplateData, height: number | undefined): void { templateData.elementDisposables.clear(); const { element } = profileResourceTreeElement; - if (isString(element)) { - throw new Error('NewProfileResourceTreeRenderer can only render profile resource child tree items'); + + if (!isProfileResourceChildElement(element)) { + throw new Error('Invalid profile resource element'); } + if (element.checkbox) { templateData.checkbox.domNode.classList.remove('hide'); templateData.checkbox.checked = element.checkbox.isChecked; @@ -998,16 +1015,15 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe templateData.checkbox.domNode.classList.add('hide'); } - const resource = URI.revive(element.resourceUri); templateData.resourceLabel.setResource( { - name: resource ? basename(resource) : element.label?.label, - description: isString(element.description) ? element.description : undefined, - resource + name: element.resource ? basename(element.resource) : element.label, + resource: element.resource }, { forceLabel: true, - hideIcon: !resource, + icon: element.icon, + hideIcon: !element.resource && !element.icon, }); } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index bde549ecefaaf..02347c6845c23 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Action, IAction, Separator } from 'vs/base/common/actions'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Emitter } from 'vs/base/common/event'; import { ThemeIcon } from 'vs/base/common/themables'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -26,6 +26,12 @@ import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFil import { IFileService } from 'vs/platform/files/common/files'; import { generateUuid } from 'vs/base/common/uuid'; import { RunOnceScheduler } from 'vs/base/common/async'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { ITreeItemCheckboxState } from 'vs/workbench/common/views'; +import { API_OPEN_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; +import { SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; export type ChangeEvent = { readonly name?: boolean; @@ -35,15 +41,32 @@ export type ChangeEvent = { readonly message?: boolean; readonly copyFrom?: boolean; readonly copyFlags?: boolean; + readonly preview?: boolean; + readonly disabled?: boolean; }; -export interface IProfileElement { - readonly onDidChange?: Event; - readonly name: string; - readonly icon?: string; - readonly flags?: UseDefaultProfileFlags; - readonly active?: boolean; - readonly message?: string; +export interface IProfileChildElement { + readonly handle: string; + readonly action?: IAction; + readonly checkbox?: ITreeItemCheckboxState; +} + +export interface IProfileResourceTypeElement extends IProfileChildElement { + readonly resourceType: ProfileResourceType; +} + +export interface IProfileResourceTypeChildElement extends IProfileChildElement { + readonly label: string; + readonly resource?: URI; + readonly icon?: ThemeIcon; +} + +export function isProfileResourceTypeElement(element: IProfileChildElement): element is IProfileResourceTypeElement { + return (element as IProfileResourceTypeElement).resourceType !== undefined; +} + +export function isProfileResourceChildElement(element: IProfileChildElement): element is IProfileResourceTypeChildElement { + return (element as IProfileResourceTypeChildElement).label !== undefined; } export abstract class AbstractUserDataProfileElement extends Disposable { @@ -51,12 +74,16 @@ export abstract class AbstractUserDataProfileElement extends Disposable { protected readonly _onDidChange = this._register(new Emitter()); readonly onDidChange = this._onDidChange.event; + private readonly saveScheduler = this._register(new RunOnceScheduler(() => this.doSave(), 500)); + constructor( name: string, icon: string | undefined, flags: UseDefaultProfileFlags | undefined, isActive: boolean, + @IUserDataProfileManagementService protected readonly userDataProfileManagementService: IUserDataProfileManagementService, @IUserDataProfilesService protected readonly userDataProfilesService: IUserDataProfilesService, + @ICommandService protected readonly commandService: ICommandService, @IInstantiationService protected readonly instantiationService: IInstantiationService, ) { super(); @@ -68,9 +95,7 @@ export abstract class AbstractUserDataProfileElement extends Disposable { if (!e.message) { this.validate(); } - if (this.primaryAction) { - this.primaryAction.enabled = !this.message; - } + this.save(); })); } @@ -119,6 +144,15 @@ export abstract class AbstractUserDataProfileElement extends Disposable { } } + private _disabled: boolean = false; + get disabled(): boolean { return this._disabled; } + set disabled(saving: boolean) { + if (this._disabled !== saving) { + this._disabled = saving; + this._onDidChange.fire({ disabled: true }); + } + } + getFlag(key: ProfileResourceType): boolean { return this.flags?.[key] ?? false; } @@ -151,51 +185,139 @@ export abstract class AbstractUserDataProfileElement extends Disposable { this.message = undefined; } - async getChildren(resourceType: ProfileResourceType): Promise { + async getChildren(resourceType?: ProfileResourceType): Promise { + if (resourceType === undefined) { + const resourceTypes = [ + ProfileResourceType.Settings, + ProfileResourceType.Keybindings, + ProfileResourceType.Tasks, + ProfileResourceType.Snippets, + ProfileResourceType.Extensions + ]; + return resourceTypes.map(resourceType => ({ + handle: resourceType, + checkbox: undefined, + resourceType, + action: resourceType === ProfileResourceType.Settings + || resourceType === ProfileResourceType.Keybindings + || resourceType === ProfileResourceType.Tasks + ? new Action('_open', '', undefined, true, async () => { + const children = await this.getChildren(resourceType); + children[0]?.action?.run(); + }) : undefined + })); + } + return this.getChildrenForResourceType(resourceType); + } + + protected async getChildrenForResourceType(resourceType: ProfileResourceType): Promise { return []; } - protected async getChildrenFromProfile(profile: IUserDataProfile, resourceType: ProfileResourceType): Promise { + protected async getChildrenFromProfile(profile: IUserDataProfile, resourceType: ProfileResourceType): Promise { profile = this.getFlag(resourceType) ? this.userDataProfilesService.defaultProfile : profile; + let children: IProfileResourceChildTreeItem[] = []; switch (resourceType) { case ProfileResourceType.Settings: - return this.instantiationService.createInstance(SettingsResourceTreeItem, profile).getChildren(); + children = await this.instantiationService.createInstance(SettingsResourceTreeItem, profile).getChildren(); + break; case ProfileResourceType.Keybindings: - return this.instantiationService.createInstance(KeybindingsResourceTreeItem, profile).getChildren(); + children = await this.instantiationService.createInstance(KeybindingsResourceTreeItem, profile).getChildren(); + break; case ProfileResourceType.Snippets: - return (await this.instantiationService.createInstance(SnippetsResourceTreeItem, profile).getChildren()) ?? []; + children = (await this.instantiationService.createInstance(SnippetsResourceTreeItem, profile).getChildren()) ?? []; + break; case ProfileResourceType.Tasks: - return this.instantiationService.createInstance(TasksResourceTreeItem, profile).getChildren(); + children = await this.instantiationService.createInstance(TasksResourceTreeItem, profile).getChildren(); + break; case ProfileResourceType.Extensions: - return this.instantiationService.createInstance(ExtensionsResourceExportTreeItem, profile).getChildren(); - } - return []; + children = await this.instantiationService.createInstance(ExtensionsResourceExportTreeItem, profile).getChildren(); + break; + } + return children.map(child => this.toUserDataProfileResourceChildElement(child)); + } + + protected toUserDataProfileResourceChildElement(child: IProfileResourceChildTreeItem): IProfileResourceTypeChildElement { + return { + handle: child.handle, + checkbox: child.checkbox, + label: child.label?.label ?? '', + resource: URI.revive(child.resourceUri), + icon: child.themeIcon, + action: new Action('_openChild', '', undefined, true, async () => { + if (child.parent.type === ProfileResourceType.Extensions) { + await this.commandService.executeCommand('extension.open', child.handle, undefined, true, undefined, true); + } else if (child.resourceUri) { + await this.commandService.executeCommand(API_OPEN_EDITOR_COMMAND_ID, child.resourceUri, [SIDE_GROUP], undefined); + } + }) + }; + } protected getInitialName(): string { return ''; } + save(): void { + this.saveScheduler.schedule(); + } + + private hasUnsavedChanges(profile: IUserDataProfile): boolean { + if (this.name !== profile.name) { + return true; + } + if (this.icon !== profile.icon) { + return true; + } + if (!equals(this.flags ?? {}, profile.useDefaultFlags ?? {})) { + return true; + } + return false; + } + + protected async saveProfile(profile: IUserDataProfile): Promise { + if (!this.hasUnsavedChanges(profile)) { + return; + } + this.validate(); + if (this.message) { + return; + } + const useDefaultFlags: UseDefaultProfileFlags | undefined = this.flags + ? this.flags.settings && this.flags.keybindings && this.flags.tasks && this.flags.globalState && this.flags.extensions ? undefined : this.flags + : undefined; + + return await this.userDataProfileManagementService.updateProfile(profile, { + name: this.name, + icon: this.icon, + useDefaultFlags: profile.useDefaultFlags && !useDefaultFlags ? {} : useDefaultFlags + }); + } + abstract readonly primaryAction?: Action; + abstract readonly secondaryAction?: Action; abstract readonly titleActions: [IAction[], IAction[]]; abstract readonly contextMenuActions: IAction[]; + + protected abstract doSave(): Promise; } -export class UserDataProfileElement extends AbstractUserDataProfileElement implements IProfileElement { +export class UserDataProfileElement extends AbstractUserDataProfileElement { get profile(): IUserDataProfile { return this._profile; } readonly primaryAction = undefined; - - private readonly saveScheduler = this._register(new RunOnceScheduler(() => this.doSave(), 500)); + readonly secondaryAction = undefined; constructor( private _profile: IUserDataProfile, readonly titleActions: [IAction[], IAction[]], readonly contextMenuActions: IAction[], @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, - @IUserDataProfileManagementService private readonly userDataProfileManagementService: IUserDataProfileManagementService, + @IUserDataProfileManagementService userDataProfileManagementService: IUserDataProfileManagementService, @IUserDataProfilesService userDataProfilesService: IUserDataProfilesService, + @ICommandService commandService: ICommandService, @IInstantiationService instantiationService: IInstantiationService, ) { super( @@ -203,7 +325,9 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement imple _profile.icon, _profile.useDefaultFlags, userDataProfileService.currentProfile.id === _profile.id, + userDataProfileManagementService, userDataProfilesService, + commandService, instantiationService, ); this._register(this.userDataProfileService.onDidChangeCurrentProfile(() => this.active = this.userDataProfileService.currentProfile.id === this.profile.id)); @@ -216,48 +340,13 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement imple this.flags = profile.useDefaultFlags; } })); - this._register(this.onDidChange(e => { - this.save(); - })); } - private hasUnsavedChanges(): boolean { - if (this.name !== this.profile.name) { - return true; - } - if (this.icon !== this.profile.icon) { - return true; - } - if (!equals(this.flags ?? {}, this.profile.useDefaultFlags ?? {})) { - return true; - } - return false; - } - - save(): void { - this.saveScheduler.schedule(); - } - - private async doSave(): Promise { - if (!this.hasUnsavedChanges()) { - return; - } - this.validate(); - if (this.message) { - return; - } - const useDefaultFlags: UseDefaultProfileFlags | undefined = this.flags - ? this.flags.settings && this.flags.keybindings && this.flags.tasks && this.flags.globalState && this.flags.extensions ? undefined : this.flags - : undefined; - - await this.userDataProfileManagementService.updateProfile(this.profile, { - name: this.name, - icon: this.icon, - useDefaultFlags: this.profile.useDefaultFlags && !useDefaultFlags ? {} : useDefaultFlags - }); + protected override async doSave(): Promise { + await this.saveProfile(this.profile); } - override async getChildren(resourceType: ProfileResourceType): Promise { + protected override async getChildrenForResourceType(resourceType: ProfileResourceType): Promise { return this.getChildrenFromProfile(this.profile, resourceType); } @@ -269,17 +358,20 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement imple const USER_DATA_PROFILE_TEMPLATE_PREVIEW_SCHEME = 'userdataprofiletemplatepreview'; -export class NewProfileElement extends AbstractUserDataProfileElement implements IProfileElement { +export class NewProfileElement extends AbstractUserDataProfileElement { constructor( name: string, copyFrom: URI | IUserDataProfile | undefined, readonly primaryAction: Action, + readonly secondaryAction: Action, readonly titleActions: [IAction[], IAction[]], readonly contextMenuActions: Action[], @IFileService private readonly fileService: IFileService, @IUserDataProfileImportExportService private readonly userDataProfileImportExportService: IUserDataProfileImportExportService, + @IUserDataProfileManagementService userDataProfileManagementService: IUserDataProfileManagementService, @IUserDataProfilesService userDataProfilesService: IUserDataProfilesService, + @ICommandService commandService: ICommandService, @IInstantiationService instantiationService: IInstantiationService, ) { super( @@ -287,7 +379,9 @@ export class NewProfileElement extends AbstractUserDataProfileElement implements undefined, undefined, false, + userDataProfileManagementService, userDataProfilesService, + commandService, instantiationService, ); this._copyFrom = copyFrom; @@ -315,6 +409,15 @@ export class NewProfileElement extends AbstractUserDataProfileElement implements } } + private _previewProfile: IUserDataProfile | undefined; + get previewProfile(): IUserDataProfile | undefined { return this._previewProfile; } + set previewProfile(profile: IUserDataProfile | undefined) { + if (this._previewProfile !== profile) { + this._previewProfile = profile; + this._onDidChange.fire({ preview: true }); + } + } + private getCopyFlagsFrom(copyFrom: URI | IUserDataProfile | undefined): ProfileResourceTypeFlags | undefined { return copyFrom ? { settings: true, @@ -335,7 +438,10 @@ export class NewProfileElement extends AbstractUserDataProfileElement implements this.copyFlags = flags; } - override async getChildren(resourceType: ProfileResourceType): Promise { + protected override async getChildrenForResourceType(resourceType: ProfileResourceType): Promise { + if (this.getFlag(resourceType)) { + return this.getChildrenFromProfile(this.userDataProfilesService.defaultProfile, resourceType); + } if (!this.getCopyFlag(resourceType)) { return []; } @@ -349,42 +455,58 @@ export class NewProfileElement extends AbstractUserDataProfileElement implements if (this.copyFrom) { return this.getChildrenFromProfile(this.copyFrom, resourceType); } - if (this.getFlag(resourceType)) { - return this.getChildrenFromProfile(this.userDataProfilesService.defaultProfile, resourceType); - } return []; } - private async getChildrenFromProfileTemplate(profileTemplate: IUserDataProfileTemplate, resourceType: ProfileResourceType): Promise { + private async getChildrenFromProfileTemplate(profileTemplate: IUserDataProfileTemplate, resourceType: ProfileResourceType): Promise { const profile = toUserDataProfile(generateUuid(), this.name, URI.file('/root').with({ scheme: USER_DATA_PROFILE_TEMPLATE_PREVIEW_SCHEME }), URI.file('/cache').with({ scheme: USER_DATA_PROFILE_TEMPLATE_PREVIEW_SCHEME })); switch (resourceType) { case ProfileResourceType.Settings: if (profileTemplate.settings) { await this.instantiationService.createInstance(SettingsResource).apply(profileTemplate.settings, profile); + return this.getChildrenFromProfile(profile, resourceType); } - return this.getChildrenFromProfile(profile, resourceType); + return []; case ProfileResourceType.Keybindings: if (profileTemplate.keybindings) { await this.instantiationService.createInstance(KeybindingsResource).apply(profileTemplate.keybindings, profile); + return this.getChildrenFromProfile(profile, resourceType); } - return this.getChildrenFromProfile(profile, resourceType); + return []; case ProfileResourceType.Snippets: if (profileTemplate.snippets) { await this.instantiationService.createInstance(SnippetsResource).apply(profileTemplate.snippets, profile); + return this.getChildrenFromProfile(profile, resourceType); } - return this.getChildrenFromProfile(profile, resourceType); + return []; case ProfileResourceType.Tasks: if (profileTemplate.tasks) { await this.instantiationService.createInstance(TasksResource).apply(profileTemplate.tasks, profile); + return this.getChildrenFromProfile(profile, resourceType); } - return this.getChildrenFromProfile(profile, resourceType); + return []; case ProfileResourceType.Extensions: if (profileTemplate.extensions) { - return this.instantiationService.createInstance(ExtensionsResourceImportTreeItem, profileTemplate.extensions).getChildren(); + const children = await this.instantiationService.createInstance(ExtensionsResourceImportTreeItem, profileTemplate.extensions).getChildren(); + return children.map(child => this.toUserDataProfileResourceChildElement(child)); } + return []; } return []; } + + protected override getInitialName(): string { + return this.previewProfile?.name ?? ''; + } + + protected override async doSave(): Promise { + if (this.previewProfile) { + const profile = await this.saveProfile(this.previewProfile); + if (profile) { + this.previewProfile = profile; + } + } + } } export class UserDataProfilesEditorModel extends EditorModel { @@ -430,11 +552,14 @@ export class UserDataProfilesEditorModel extends EditorModel { @IUserDataProfileImportExportService private readonly userDataProfileImportExportService: IUserDataProfileImportExportService, @IDialogService private readonly dialogService: IDialogService, @ITelemetryService private readonly telemetryService: ITelemetryService, + @IHostService private readonly hostService: IHostService, @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); for (const profile of userDataProfilesService.profiles) { - this._profiles.push(this.createProfileElement(profile)); + if (!profile.isTransient) { + this._profiles.push(this.createProfileElement(profile)); + } } this._register(toDisposable(() => this._profiles.splice(0, this._profiles.length).map(([, disposables]) => disposables.dispose()))); this._register(userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e))); @@ -442,11 +567,14 @@ export class UserDataProfilesEditorModel extends EditorModel { private onDidChangeProfiles(e: DidChangeProfilesEvent): void { for (const profile of e.added) { - if (profile.name !== this.newProfileElement?.name) { + if (!profile.isTransient && profile.name !== this.newProfileElement?.name) { this._profiles.push(this.createProfileElement(profile)); } } for (const profile of e.removed) { + if (profile.id === this.newProfileElement?.previewProfile?.id) { + this.newProfileElement.previewProfile = undefined; + } const index = this._profiles.findIndex(([p]) => p instanceof UserDataProfileElement && p.profile.id === profile.id); if (index !== -1) { this._profiles.splice(index, 1).map(([, disposables]) => disposables.dispose()); @@ -458,25 +586,28 @@ export class UserDataProfilesEditorModel extends EditorModel { private createProfileElement(profile: IUserDataProfile): [UserDataProfileElement, DisposableStore] { const disposables = new DisposableStore(); - const activateAction = disposables.add(new Action('userDataProfile.activate', localize('active', "Activate"), ThemeIcon.asClassName(Codicon.check), true, () => this.userDataProfileManagementService.switchProfile(profile))); + const activateAction = disposables.add(new Action('userDataProfile.activate', localize('active', "Active"), ThemeIcon.asClassName(Codicon.check), true, () => this.userDataProfileManagementService.switchProfile(profile))); activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id; disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(() => activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id)); const copyFromProfileAction = disposables.add(new Action('userDataProfile.copyFromProfile', localize('copyFromProfile', "Save As..."), ThemeIcon.asClassName(Codicon.copy), true, () => this.createNewProfile(profile))); const exportAction = disposables.add(new Action('userDataProfile.export', localize('export', "Export..."), ThemeIcon.asClassName(Codicon.export), true, () => this.exportProfile(profile))); const deleteAction = disposables.add(new Action('userDataProfile.delete', localize('delete', "Delete"), ThemeIcon.asClassName(Codicon.trash), true, () => this.removeProfile(profile))); + const newWindowAction = disposables.add(new Action('userDataProfile.newWindow', localize('new window', "New Window"), ThemeIcon.asClassName(Codicon.emptyWindow), true, () => this.openWindow(profile))); const titlePrimaryActions: IAction[] = []; - titlePrimaryActions.push(activateAction); + titlePrimaryActions.push(copyFromProfileAction); titlePrimaryActions.push(exportAction); if (!profile.isDefault) { titlePrimaryActions.push(deleteAction); } const titleSecondaryActions: IAction[] = []; - titleSecondaryActions.push(copyFromProfileAction); + titleSecondaryActions.push(activateAction); + titleSecondaryActions.push(newWindowAction); const secondaryActions: IAction[] = []; secondaryActions.push(activateAction); + secondaryActions.push(newWindowAction); secondaryActions.push(new Separator()); secondaryActions.push(copyFromProfileAction); secondaryActions.push(exportAction); @@ -492,20 +623,51 @@ export class UserDataProfilesEditorModel extends EditorModel { return [profileElement, disposables]; } - createNewProfile(copyFrom?: URI | IUserDataProfile): IProfileElement { + createNewProfile(copyFrom?: URI | IUserDataProfile): AbstractUserDataProfileElement { if (!this.newProfileElement) { const disposables = new DisposableStore(); - const discardAction = disposables.add(new Action('userDataProfile.discard', localize('discard', "Discard"), ThemeIcon.asClassName(Codicon.close), true, () => { - this.removeNewProfile(); - this._onDidChange.fire(undefined); - })); + const cancellationTokenSource = new CancellationTokenSource(); + disposables.add(toDisposable(() => cancellationTokenSource.dispose(true))); + const createAction = disposables.add(new Action( + 'userDataProfile.create', + localize('create', "Create"), + undefined, + true, + () => this.saveNewProfile(false, cancellationTokenSource.token) + )); + const cancelAction = disposables.add(new Action( + 'userDataProfile.cancel', + localize('cancel', "Cancel"), + ThemeIcon.asClassName(Codicon.close), + true, + () => this.discardNewProfile() + )); + const previewProfileAction = disposables.add(new Action( + 'userDataProfile.preview', + localize('preview', "Open Preview"), + ThemeIcon.asClassName(Codicon.openPreview), + true, + () => this.previewNewProfile(cancellationTokenSource.token) + )); this.newProfileElement = disposables.add(this.instantiationService.createInstance(NewProfileElement, localize('untitled', "Untitled"), copyFrom, - disposables.add(new Action('userDataProfile.create', localize('create', "Create & Apply"), undefined, true, () => this.saveNewProfile())), - [[discardAction], []], - [discardAction], + createAction, + cancelAction, + [[ + previewProfileAction + ], []], + [], )); + disposables.add(this.newProfileElement.onDidChange(e => { + if (e.preview) { + previewProfileAction.checked = !!this.newProfileElement?.previewProfile; + } + if (e.disabled) { + previewProfileAction.enabled = !this.newProfileElement?.disabled; + createAction.enabled = !this.newProfileElement?.disabled; + } + })); this._profiles.push([this.newProfileElement, disposables]); this._onDidChange.fire(this.newProfileElement); } @@ -527,45 +689,102 @@ export class UserDataProfilesEditorModel extends EditorModel { } } - async saveNewProfile(): Promise { + private async previewNewProfile(token: CancellationToken): Promise { if (!this.newProfileElement) { return; } + if (this.newProfileElement.previewProfile) { + return; + } + const profile = await this.saveNewProfile(true, token); + if (profile) { + this.newProfileElement.previewProfile = profile; + await this.openWindow(profile); + } + } + + async saveNewProfile(transient?: boolean, token?: CancellationToken): Promise { + if (!this.newProfileElement) { + return undefined; + } + this.newProfileElement.validate(); if (this.newProfileElement.message) { - return; + return undefined; } - const { flags, icon, name, copyFrom } = this.newProfileElement; - const useDefaultFlags: UseDefaultProfileFlags | undefined = flags - ? flags.settings && flags.keybindings && flags.tasks && flags.globalState && flags.extensions ? undefined : flags - : undefined; - type CreateProfileInfoClassification = { - owner: 'sandy081'; - comment: 'Report when profile is about to be created'; - source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Type of profile source' }; - }; - type CreateProfileInfoEvent = { - source: string | undefined; - }; - const createProfileTelemetryData: CreateProfileInfoEvent = { source: copyFrom instanceof URI ? 'template' : isUserDataProfile(copyFrom) ? 'profile' : copyFrom ? 'external' : undefined }; - - if (copyFrom instanceof URI) { - this.telemetryService.publicLog2('userDataProfile.createFromTemplate', createProfileTelemetryData); - await this.userDataProfileImportExportService.importProfile(copyFrom, { mode: 'apply', name: name, useDefaultFlags, icon: icon ? icon : undefined, resourceTypeFlags: this.newProfileElement.copyFlags }); - } else if (isUserDataProfile(copyFrom)) { - this.telemetryService.publicLog2('userDataProfile.createFromProfile', createProfileTelemetryData); - await this.userDataProfileImportExportService.createFromProfile(copyFrom, name, { useDefaultFlags, icon: icon ? icon : undefined, resourceTypeFlags: this.newProfileElement.copyFlags }); - } else { - this.telemetryService.publicLog2('userDataProfile.createEmptyProfile', createProfileTelemetryData); - await this.userDataProfileManagementService.createAndEnterProfile(name, { useDefaultFlags, icon: icon ? icon : undefined }); + this.newProfileElement.disabled = true; + let profile: IUserDataProfile | undefined; + + try { + if (this.newProfileElement.previewProfile) { + if (!transient) { + profile = await this.userDataProfileManagementService.updateProfile(this.newProfileElement.previewProfile, { transient: false }); + } + } + else { + const { flags, icon, name, copyFrom } = this.newProfileElement; + const useDefaultFlags: UseDefaultProfileFlags | undefined = flags + ? flags.settings && flags.keybindings && flags.tasks && flags.globalState && flags.extensions ? undefined : flags + : undefined; + + type CreateProfileInfoClassification = { + owner: 'sandy081'; + comment: 'Report when profile is about to be created'; + source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Type of profile source' }; + }; + type CreateProfileInfoEvent = { + source: string | undefined; + }; + const createProfileTelemetryData: CreateProfileInfoEvent = { source: copyFrom instanceof URI ? 'template' : isUserDataProfile(copyFrom) ? 'profile' : copyFrom ? 'external' : undefined }; + + if (copyFrom instanceof URI) { + this.telemetryService.publicLog2('userDataProfile.createFromTemplate', createProfileTelemetryData); + await this.userDataProfileImportExportService.importProfile(copyFrom, { mode: 'apply', name: name, useDefaultFlags, icon: icon ? icon : undefined, resourceTypeFlags: this.newProfileElement.copyFlags, donotSwitch: true, transient }); + } else if (isUserDataProfile(copyFrom)) { + this.telemetryService.publicLog2('userDataProfile.createFromProfile', createProfileTelemetryData); + await this.userDataProfileImportExportService.createFromProfile(copyFrom, name, { useDefaultFlags, icon: icon ? icon : undefined, resourceTypeFlags: this.newProfileElement.copyFlags, donotSwitch: true, transient }); + } else { + this.telemetryService.publicLog2('userDataProfile.createEmptyProfile', createProfileTelemetryData); + await this.userDataProfileManagementService.createProfile(name, { useDefaultFlags, icon: icon ? icon : undefined, transient }); + } + + profile = this.userDataProfilesService.profiles.find(p => p.name === name); + } + } finally { + if (this.newProfileElement) { + this.newProfileElement.disabled = false; + } } - this.removeNewProfile(); - const profile = this.userDataProfilesService.profiles.find(p => p.name === name); - if (profile) { + if (token?.isCancellationRequested) { + if (profile) { + try { + await this.userDataProfileManagementService.removeProfile(profile); + } catch (error) { + // ignore + } + } + return; + } + + if (profile && !profile.isTransient && this.newProfileElement) { + this.removeNewProfile(); this.onDidChangeProfiles({ added: [profile], removed: [], updated: [], all: this.userDataProfilesService.profiles }); } + + return profile; + } + + private async discardNewProfile(): Promise { + if (!this.newProfileElement) { + return; + } + if (this.newProfileElement.previewProfile) { + await this.userDataProfileManagementService.removeProfile(this.newProfileElement.previewProfile); + } + this.removeNewProfile(); + this._onDidChange.fire(undefined); } private async removeProfile(profile: IUserDataProfile): Promise { @@ -580,6 +799,10 @@ export class UserDataProfilesEditorModel extends EditorModel { } } + private async openWindow(profile: IUserDataProfile): Promise { + await this.hostService.openWindow({ forceProfile: profile.name }); + } + private async exportProfile(profile: IUserDataProfile): Promise { return this.userDataProfileImportExportService.exportProfile2(profile); } diff --git a/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts b/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts index 06c54a5729cc2..2885c3cac7e30 100644 --- a/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts +++ b/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CancellationToken } from 'vs/base/common/cancellation'; +import { Codicon } from 'vs/base/common/codicons'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; @@ -284,6 +285,7 @@ export abstract class ExtensionsResourceTreeItem implements IProfileResourceTree label: localize('exclude', "Select {0} Extension", e.displayName || e.identifier.id), } } : undefined, + themeIcon: Codicon.extensions, command: { id: 'extension.open', title: '', diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts index 13b592b7e0e14..a880ac1ff5087 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts @@ -225,7 +225,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU if (mode === 'preview') { await this.previewProfile(profileTemplate, options); } else if (mode === 'apply') { - await this.createAndSwitch(profileTemplate, false, true, options, localize('create profile', "Create Profile")); + await this.createAndSwitch(profileTemplate, !!options?.transient, true, options, localize('create profile', "Create Profile"), !options?.donotSwitch); } else if (mode === 'both') { await this.importAndPreviewProfile(uri, profileTemplate, options); } @@ -531,7 +531,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU } else if (isUserDataProfileTemplate(source)) { source.name = result.name; this.telemetryService.publicLog2('userDataProfile.createFromExternalTemplate', createProfileTelemetryData); - await this.createAndSwitch(source, false, true, { useDefaultFlags, icon: result.icon ? result.icon : undefined }, localize('create profile', "Create Profile")); + await this.createAndSwitch(source, false, true, { useDefaultFlags, icon: result.icon ? result.icon : undefined }, localize('create profile', "Create Profile"), true); } else { this.telemetryService.publicLog2('userDataProfile.createEmptyProfile', createProfileTelemetryData); await this.userDataProfileManagementService.createAndEnterProfile(result.name, { useDefaultFlags, icon: result.icon ? result.icon : undefined }); @@ -592,15 +592,17 @@ export class UserDataProfileImportExportService extends Disposable implements IU sticky: true, }, async progress => { const reportProgress = (message: string) => progress.report({ message: localize('create from profile', "Create Profile: {0}", message) }); - const createdProfile = await this.doCreateProfile(profileTemplate, false, false, { useDefaultFlags: options?.useDefaultFlags, icon: options?.icon }, reportProgress); + const createdProfile = await this.doCreateProfile(profileTemplate, false, false, { useDefaultFlags: options?.useDefaultFlags, icon: options?.icon, transient: options?.transient }, reportProgress); if (createdProfile) { if (options?.resourceTypeFlags?.extensions ?? true) { reportProgress(localize('progress extensions', "Applying Extensions...")); await this.instantiationService.createInstance(ExtensionsResource).copy(profile, createdProfile, false); } - reportProgress(localize('switching profile', "Switching Profile...")); - await this.userDataProfileManagementService.switchProfile(createdProfile); + if (!options?.donotSwitch) { + reportProgress(localize('switching profile', "Switching Profile...")); + await this.userDataProfileManagementService.switchProfile(createdProfile); + } } }); } finally { @@ -750,7 +752,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU const userDataProfileImportState = disposables.add(this.instantiationService.createInstance(UserDataProfileImportState, profileTemplate)); profileTemplate = await userDataProfileImportState.getProfileTemplateToImport(); - const importedProfile = await this.createAndSwitch(profileTemplate, true, false, options, localize('preview profile', "Preview Profile")); + const importedProfile = await this.createAndSwitch(profileTemplate, true, false, options, localize('preview profile', "Preview Profile"), true); if (!importedProfile) { return; @@ -821,7 +823,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU try { const userDataProfileImportState = disposables.add(this.instantiationService.createInstance(UserDataProfileImportState, profileTemplate)); if (userDataProfileImportState.isEmpty()) { - await this.createAndSwitch(profileTemplate, false, true, options, localize('create profile', "Create Profile")); + await this.createAndSwitch(profileTemplate, false, true, options, localize('create profile', "Create Profile"), true); } else { const barrier = new Barrier(); const cancelAction = new BarrierAction(barrier, new Action('cancel', localize('cancel', "Cancel")), this.notificationService); @@ -847,7 +849,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU return importAction; } - private async createAndSwitch(profileTemplate: IUserDataProfileTemplate, temporaryProfile: boolean, extensions: boolean, options: IUserDataProfileOptions | undefined, title: string): Promise { + private async createAndSwitch(profileTemplate: IUserDataProfileTemplate, temporaryProfile: boolean, extensions: boolean, options: IUserDataProfileOptions | undefined, title: string, switchProfile: boolean): Promise { return this.progressService.withProgress({ location: ProgressLocation.Notification, delay: 500, @@ -857,7 +859,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU progress.report({ message: title }); const reportProgress = (message: string) => progress.report({ message: `${title}: ${message}` }); const profile = await this.doCreateProfile(profileTemplate, temporaryProfile, extensions, options, reportProgress); - if (profile) { + if (profile && switchProfile) { reportProgress(localize('switching profile', "Switching Profile...")); await this.userDataProfileManagementService.switchProfile(profile); } diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts index e454c34038ad9..ff845818b8db3 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.ts @@ -79,6 +79,10 @@ export class UserDataProfileManagementService extends Disposable implements IUse } } + async createProfile(name: string, options?: IUserDataProfileOptions): Promise { + return this.userDataProfilesService.createNamedProfile(name, options); + } + async createAndEnterProfile(name: string, options?: IUserDataProfileOptions): Promise { const profile = await this.userDataProfilesService.createNamedProfile(name, options, toWorkspaceIdentifier(this.workspaceContextService.getWorkspace())); await this.changeCurrentProfile(profile); @@ -93,15 +97,16 @@ export class UserDataProfileManagementService extends Disposable implements IUse return profile; } - async updateProfile(profile: IUserDataProfile, updateOptions: IUserDataProfileUpdateOptions): Promise { + async updateProfile(profile: IUserDataProfile, updateOptions: IUserDataProfileUpdateOptions): Promise { if (!this.userDataProfilesService.profiles.some(p => p.id === profile.id)) { throw new Error(`Profile ${profile.name} does not exist`); } if (profile.isDefault) { throw new Error(localize('cannotRenameDefaultProfile', "Cannot rename the default profile")); } - await this.userDataProfilesService.updateProfile(profile, updateOptions); + const updatedProfile = await this.userDataProfilesService.updateProfile(profile, updateOptions); this.telemetryService.publicLog2('profileManagementActionExecuted', { id: 'updateProfile' }); + return updatedProfile; } async removeProfile(profile: IUserDataProfile): Promise { diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts index d2c5cb4487eb7..3afec944efd06 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts @@ -42,10 +42,11 @@ export const IUserDataProfileManagementService = createDecorator; createAndEnterProfile(name: string, options?: IUserDataProfileOptions): Promise; createAndEnterTransientProfile(): Promise; removeProfile(profile: IUserDataProfile): Promise; - updateProfile(profile: IUserDataProfile, updateOptions: IUserDataProfileUpdateOptions): Promise; + updateProfile(profile: IUserDataProfile, updateOptions: IUserDataProfileUpdateOptions): Promise; switchProfile(profile: IUserDataProfile): Promise; getBuiltinProfileTemplates(): Promise; @@ -78,15 +79,15 @@ export function toUserDataProfileUri(path: string, productService: IProductServi }); } -export interface IProfileImportOptions extends IUserDataProfileOptions { - readonly name?: string; - readonly icon?: string; - readonly mode?: 'preview' | 'apply' | 'both'; +export interface IUserDataProfileCreateOptions extends IUserDataProfileOptions { readonly resourceTypeFlags?: ProfileResourceTypeFlags; + readonly donotSwitch?: boolean; } -export interface IUserDataProfileCreateOptions extends IUserDataProfileOptions { - readonly resourceTypeFlags?: ProfileResourceTypeFlags; +export interface IProfileImportOptions extends IUserDataProfileCreateOptions { + readonly name?: string; + readonly icon?: string; + readonly mode?: 'preview' | 'apply' | 'both'; } export const IUserDataProfileImportExportService = createDecorator('IUserDataProfileImportExportService'); From 782128f01ada56e6d1ce3ad64d72284fe36f4840 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 4 Jun 2024 09:20:19 +0200 Subject: [PATCH 040/755] remove graceful-fs error message --- src/vs/platform/files/node/diskFileSystemProvider.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/platform/files/node/diskFileSystemProvider.ts b/src/vs/platform/files/node/diskFileSystemProvider.ts index 180aa7e2960ff..023a47a5a4c93 100644 --- a/src/vs/platform/files/node/diskFileSystemProvider.ts +++ b/src/vs/platform/files/node/diskFileSystemProvider.ts @@ -24,7 +24,6 @@ import { readFileIntoStream } from 'vs/platform/files/common/io'; import { AbstractNonRecursiveWatcherClient, AbstractUniversalWatcherClient, ILogMessage } from 'vs/platform/files/common/watcher'; import { ILogService } from 'vs/platform/log/common/log'; import { AbstractDiskFileSystemProvider, IDiskFileSystemProviderOptions } from 'vs/platform/files/common/diskFileSystemProvider'; -import { toErrorMessage } from 'vs/base/common/errorMessage'; import { UniversalWatcherClient } from 'vs/platform/files/node/watcher/watcherClient'; import { NodeJSWatcherClient } from 'vs/platform/files/node/watcher/nodejs/nodejsClient'; @@ -36,7 +35,7 @@ import { NodeJSWatcherClient } from 'vs/platform/files/node/watcher/nodejs/nodej try { gracefulify(fs); } catch (error) { - console.error(`Error enabling graceful-fs: ${toErrorMessage(error)}`); + // console.error(`Error enabling graceful-fs: ${toErrorMessage(error)}`); } })(); From 0592fdf38b6509a93d5bd364aa3565677034dea9 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 4 Jun 2024 09:25:47 +0200 Subject: [PATCH 041/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20use=20observab?= =?UTF-8?q?les=20for=20count=20and=20statusBarCommands=20(#214202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vs/workbench/api/browser/mainThreadSCM.ts | 11 +++++++++ .../scm/browser/scmRepositoryRenderer.ts | 24 ++++++------------- src/vs/workbench/contrib/scm/common/scm.ts | 2 ++ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index a54fc865a9839..3b2e06b708cd4 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -231,6 +231,12 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { get statusBarCommands(): Command[] | undefined { return this.features.statusBarCommands; } get count(): number | undefined { return this.features.count; } + private readonly _countObs = observableValue(this, undefined); + get countObs() { return this._countObs; } + + private readonly _statusBarCommandsObs = observableValue(this, undefined); + get statusBarCommandsObs() { return this._statusBarCommandsObs; } + private readonly _name: string | undefined; get name(): string { return this._name ?? this._label; } @@ -280,7 +286,12 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { this._commitTemplate.set(features.commitTemplate, undefined); } + if (typeof features.count !== 'undefined') { + this._countObs.set(features.count, undefined); + } + if (typeof features.statusBarCommands !== 'undefined') { + this._statusBarCommandsObs.set(features.statusBarCommands, undefined); this._onDidChangeStatusBarCommands.fire(this.statusBarCommands!); } diff --git a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts index e33a86c854a46..50a684ed24716 100644 --- a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts +++ b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/scm'; -import { IDisposable, DisposableStore, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; +import { autorun } from 'vs/base/common/observable'; import { append, $ } from 'vs/base/browser/dom'; import { ISCMProvider, ISCMRepository, ISCMViewService } from 'vs/workbench/contrib/scm/common/scm'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; @@ -109,29 +110,18 @@ export class RepositoryRenderer implements ICompressibleTreeRenderer { - const commands = repository.provider.statusBarCommands || []; + templateData.elementDisposables.add(autorun(reader => { + const commands = repository.provider.statusBarCommandsObs.read(reader) ?? []; statusPrimaryActions = commands.map(c => new StatusBarAction(c, this.commandService)); updateToolbar(); + })); - const count = repository.provider.count || 0; + templateData.elementDisposables.add(autorun(reader => { + const count = repository.provider.countObs.read(reader) ?? 0; templateData.countContainer.setAttribute('data-count', String(count)); templateData.count.setCount(count); - }; - - // TODO@joao TODO@lszomoru - let disposed = false; - templateData.elementDisposables.add(toDisposable(() => disposed = true)); - templateData.elementDisposables.add(repository.provider.onDidChange(() => { - if (disposed) { - return; - } - - onDidChangeProvider(); })); - onDidChangeProvider(); - const repositoryMenus = this.scmViewService.menus.getRepositoryMenus(repository.provider); const menu = this.toolbarMenuId === MenuId.SCMTitle ? repositoryMenus.titleMenu.menu : repositoryMenus.repositoryMenu; templateData.elementDisposables.add(connectPrimaryMenu(menu, (primary, secondary) => { diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index c0a56b7ee90bc..8dcf49cf49bcb 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -74,6 +74,7 @@ export interface ISCMProvider extends IDisposable { readonly rootUri?: URI; readonly inputBoxTextModel: ITextModel; readonly count?: number; + readonly countObs: IObservable; readonly commitTemplate: IObservable; readonly historyProvider?: ISCMHistoryProvider; readonly onDidChangeHistoryProvider: Event; @@ -81,6 +82,7 @@ export interface ISCMProvider extends IDisposable { readonly acceptInputCommand?: Command; readonly actionButton?: ISCMActionButtonDescriptor; readonly statusBarCommands?: readonly Command[]; + readonly statusBarCommandsObs: IObservable; readonly onDidChange: Event; getOriginalResource(uri: URI): Promise; From 00f0f260b9a78ea9ed9202d0d78e00009b0e1ba9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 4 Jun 2024 09:27:08 +0200 Subject: [PATCH 042/755] esm - remove `graceful-fs` (#214164) * esm - remove `graceful-fs` This module was used to patch `fs`, which is not supported in ESM. Besides, it makes us behave different from standard node.js that has meanwhile evolved from the time where `graceful-fs` was created. * update comment * update comment * use more `fs.promises` * :lipstick: --- .eslintrc.json | 1 - package.json | 2 - remote/package.json | 1 - remote/yarn.lock | 2 +- src/vs/base/node/pfs.ts | 81 ++++++++----------- .../files/node/diskFileSystemProvider.ts | 18 +---- yarn.lock | 17 ++-- 7 files changed, 42 insertions(+), 80 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 4d5b300eafbd5..9186fd66558ce 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -645,7 +645,6 @@ "events", "fs", "fs/promises", - "graceful-fs", "http", "https", "minimist", diff --git a/package.json b/package.json index 014e508cb0735..e427510eee867 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,6 @@ "@xterm/addon-webgl": "0.19.0-beta.19", "@xterm/headless": "5.6.0-beta.19", "@xterm/xterm": "5.6.0-beta.19", - "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", "jschardet": "3.1.2", @@ -112,7 +111,6 @@ "@swc/core": "1.3.62", "@types/cookie": "^0.3.3", "@types/debug": "^4.1.5", - "@types/graceful-fs": "4.1.2", "@types/gulp-svgmin": "^1.2.1", "@types/http-proxy-agent": "^2.0.1", "@types/kerberos": "^1.1.2", diff --git a/remote/package.json b/remote/package.json index 0641f0779ddcd..c21f50ac7ccef 100644 --- a/remote/package.json +++ b/remote/package.json @@ -22,7 +22,6 @@ "@xterm/headless": "5.6.0-beta.19", "@xterm/xterm": "5.6.0-beta.19", "cookie": "^0.4.0", - "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", "jschardet": "3.1.2", diff --git a/remote/yarn.lock b/remote/yarn.lock index dc0c4938aaf17..513f4c15908a3 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -289,7 +289,7 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -graceful-fs@4.2.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index 025df98b423c1..1c0ce08162502 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -60,14 +60,6 @@ async function rimraf(path: string, mode = RimRafMode.UNLINK, moveToPath?: strin async function rimrafMove(path: string, moveToPath = randomPath(tmpdir())): Promise { try { try { - // Intentionally using `fs.promises` here to skip - // the patched graceful-fs method that can result - // in very long running `rename` calls when the - // folder is locked by a file watcher. We do not - // really want to slow down this operation more - // than necessary and we have a fallback to delete - // via unlink. - // https://github.com/microsoft/vscode/issues/139908 await fs.promises.rename(path, moveToPath); } catch (error) { if (error.code === 'ENOENT') { @@ -87,7 +79,7 @@ async function rimrafMove(path: string, moveToPath = randomPath(tmpdir())): Prom } async function rimrafUnlink(path: string): Promise { - return promisify(fs.rm)(path, { recursive: true, force: true, maxRetries: 3 }); + return fs.promises.rm(path, { recursive: true, force: true, maxRetries: 3 }); } export function rimrafSync(path: string): void { @@ -118,12 +110,12 @@ export interface IDirent { async function readdir(path: string): Promise; async function readdir(path: string, options: { withFileTypes: true }): Promise; async function readdir(path: string, options?: { withFileTypes: true }): Promise<(string | IDirent)[]> { - return handleDirectoryChildren(await (options ? safeReaddirWithFileTypes(path) : promisify(fs.readdir)(path))); + return handleDirectoryChildren(await (options ? safeReaddirWithFileTypes(path) : fs.promises.readdir(path))); } async function safeReaddirWithFileTypes(path: string): Promise { try { - return await promisify(fs.readdir)(path, { withFileTypes: true }); + return await fs.promises.readdir(path, { withFileTypes: true }); } catch (error) { console.warn('[node.js fs] readdir with filetypes failed with error: ', error); } @@ -493,7 +485,7 @@ function ensureWriteOptions(options?: IWriteFileOptions): IEnsuredWriteFileOptio * - allows to move across multiple disks * - attempts to retry the operation for certain error codes on Windows */ -async function rename(source: string, target: string, windowsRetryTimeout: number | false = 60000 /* matches graceful-fs */): Promise { +async function rename(source: string, target: string, windowsRetryTimeout: number | false = 60000): Promise { if (source === target) { return; // simulate node.js behaviour here and do a no-op if paths match } @@ -501,12 +493,10 @@ async function rename(source: string, target: string, windowsRetryTimeout: numbe try { if (isWindows && typeof windowsRetryTimeout === 'number') { // On Windows, a rename can fail when either source or target - // is locked by AV software. We do leverage graceful-fs to iron - // out these issues, however in case the target file exists, - // graceful-fs will immediately return without retry for fs.rename(). + // is locked by AV software. await renameWithRetry(source, target, Date.now(), windowsRetryTimeout); } else { - await promisify(fs.rename)(source, target); + await fs.promises.rename(source, target); } } catch (error) { // In two cases we fallback to classic copy and delete: @@ -528,7 +518,7 @@ async function rename(source: string, target: string, windowsRetryTimeout: numbe async function renameWithRetry(source: string, target: string, startTime: number, retryTimeout: number, attempt = 0): Promise { try { - return await promisify(fs.rename)(source, target); + return await fs.promises.rename(source, target); } catch (error) { if (error.code !== 'EACCES' && error.code !== 'EPERM' && error.code !== 'EBUSY') { throw error; // only for errors we think are temporary @@ -670,30 +660,27 @@ async function doCopySymlink(source: string, target: string, payload: ICopyPaylo //#region Promise based fs methods /** - * Prefer this helper class over the `fs.promises` API to - * enable `graceful-fs` to function properly. Given issue - * https://github.com/isaacs/node-graceful-fs/issues/160 it - * is evident that the module only takes care of the non-promise - * based fs methods. + * Provides promise based 'fs' methods by wrapping around the + * original callback based methods. * - * Another reason is `realpath` being entirely different in - * the promise based implementation compared to the other - * one (https://github.com/microsoft/vscode/issues/118562) + * At least `realpath` is implemented differently in the promise + * based implementation compared to the callback based one. The + * promise based implementation actually calls `fs.realpath.native`. + * (https://github.com/microsoft/vscode/issues/118562) * - * Note: using getters for a reason, since `graceful-fs` - * patching might kick in later after modules have been - * loaded we need to defer access to fs methods. - * (https://github.com/microsoft/vscode/issues/124176) + * TODO@bpasero we should move away from this towards `fs.promises` + * eventually and only keep those methods around where we explicitly + * want the callback based behaviour. */ export const Promises = new class { //#region Implemented by node.js - get access() { return promisify(fs.access); } + get access() { return fs.promises.access; } - get stat() { return promisify(fs.stat); } - get lstat() { return promisify(fs.lstat); } - get utimes() { return promisify(fs.utimes); } + get stat() { return fs.promises.stat; } + get lstat() { return fs.promises.lstat; } + get utimes() { return fs.promises.utimes; } get read() { @@ -713,7 +700,7 @@ export const Promises = new class { }); }; } - get readFile() { return promisify(fs.readFile); } + get readFile() { return fs.promises.readFile; } get write() { @@ -734,27 +721,27 @@ export const Promises = new class { }; } - get appendFile() { return promisify(fs.appendFile); } + get appendFile() { return fs.promises.appendFile; } - get fdatasync() { return promisify(fs.fdatasync); } - get truncate() { return promisify(fs.truncate); } + get fdatasync() { return promisify(fs.fdatasync); } // not exposed as API in 20.x yet + get truncate() { return fs.promises.truncate; } - get copyFile() { return promisify(fs.copyFile); } + get copyFile() { return fs.promises.copyFile; } - get open() { return promisify(fs.open); } - get close() { return promisify(fs.close); } + get open() { return promisify(fs.open); } // changed to return `FileHandle` in promise API + get close() { return promisify(fs.close); } // not exposed as API due to the `FileHandle` return type of `open` - get symlink() { return promisify(fs.symlink); } - get readlink() { return promisify(fs.readlink); } + get symlink() { return fs.promises.symlink; } + get readlink() { return fs.promises.readlink; } - get chmod() { return promisify(fs.chmod); } + get chmod() { return fs.promises.chmod; } - get mkdir() { return promisify(fs.mkdir); } + get mkdir() { return fs.promises.mkdir; } - get unlink() { return promisify(fs.unlink); } - get rmdir() { return promisify(fs.rmdir); } + get unlink() { return fs.promises.unlink; } + get rmdir() { return fs.promises.rmdir; } - get realpath() { return promisify(fs.realpath); } + get realpath() { return promisify(fs.realpath); } // `fs.promises.realpath` will use `fs.realpath.native` which we do not want //#endregion diff --git a/src/vs/platform/files/node/diskFileSystemProvider.ts b/src/vs/platform/files/node/diskFileSystemProvider.ts index 180aa7e2960ff..5e923bdfab51a 100644 --- a/src/vs/platform/files/node/diskFileSystemProvider.ts +++ b/src/vs/platform/files/node/diskFileSystemProvider.ts @@ -3,8 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as fs from 'fs'; -import { gracefulify } from 'graceful-fs'; +import { Stats } from 'fs'; import { Barrier, retry } from 'vs/base/common/async'; import { ResourceMap } from 'vs/base/common/map'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -24,22 +23,9 @@ import { readFileIntoStream } from 'vs/platform/files/common/io'; import { AbstractNonRecursiveWatcherClient, AbstractUniversalWatcherClient, ILogMessage } from 'vs/platform/files/common/watcher'; import { ILogService } from 'vs/platform/log/common/log'; import { AbstractDiskFileSystemProvider, IDiskFileSystemProviderOptions } from 'vs/platform/files/common/diskFileSystemProvider'; -import { toErrorMessage } from 'vs/base/common/errorMessage'; import { UniversalWatcherClient } from 'vs/platform/files/node/watcher/watcherClient'; import { NodeJSWatcherClient } from 'vs/platform/files/node/watcher/nodejs/nodejsClient'; -/** - * Enable graceful-fs very early from here to have it enabled - * in all contexts that leverage the disk file system provider. - */ -(() => { - try { - gracefulify(fs); - } catch (error) { - console.error(`Error enabling graceful-fs: ${toErrorMessage(error)}`); - } -})(); - export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability, @@ -139,7 +125,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple } } - private toType(entry: fs.Stats | IDirent, symbolicLink?: { dangling: boolean }): FileType { + private toType(entry: Stats | IDirent, symbolicLink?: { dangling: boolean }): FileType { // Signal file type by checking for file / directory, except: // - symbolic links pointing to nonexistent files are FileType.Unknown diff --git a/yarn.lock b/yarn.lock index 7cb89bdf1c010..2c4c4fe78a7b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1145,13 +1145,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/graceful-fs@4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.2.tgz#fbc9575dbcc6d1d91dd768d30c5fc0c19f6c50bd" - integrity sha512-epDhsJAVxJsWfeqpzEDFhLnhHMbHie/VMFY+2Hvt5p7FemeW5ELM+6gcVYL/ZsUwdu3zrWpDE3VUTddXW+EMYg== - dependencies: - "@types/node" "*" - "@types/gulp-svgmin@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@types/gulp-svgmin/-/gulp-svgmin-1.2.1.tgz#e18f344ea09560554652406b37e1dc3253a6bda2" @@ -5127,11 +5120,6 @@ got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@4.2.11, graceful-fs@^4.2.11: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -5142,6 +5130,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.2.11: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" From c46c45742eb94d96b2c4f8cb1c4c7c4a9b49a88d Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Tue, 4 Jun 2024 11:06:21 +0200 Subject: [PATCH 043/755] Store `minRebuildRromLine` field so sticky scroll is ultimately correctly rerendered (#213916) * adding changes * on this branch we have all the other changes * using the next rebuild from line variable * adding changes * polishing the code --- .../browser/stickyScrollController.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts index 6f5e09d5a483f..22b8c67a2942e 100644 --- a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts +++ b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts @@ -68,6 +68,7 @@ export class StickyScrollController extends Disposable implements IEditorContrib private _onMouseDown = false; private _endLineNumbers: number[] = []; private _showEndForLine: number | undefined; + private _minRebuildFromLine: number | undefined; constructor( private readonly _editor: ICodeEditor, @@ -485,22 +486,23 @@ export class StickyScrollController extends Disposable implements IEditorContrib this._resetState(); return; } + const nextRebuildFromLine = this._updateAndGetMinRebuildFromLine(rebuildFromLine); const stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId(); const shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId(); if (shouldUpdateState) { if (!this._focused) { - await this._updateState(rebuildFromLine); + await this._updateState(nextRebuildFromLine); } else { // Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused if (this._focusedStickyElementIndex === -1) { - await this._updateState(rebuildFromLine); + await this._updateState(nextRebuildFromLine); this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1; if (this._focusedStickyElementIndex !== -1) { this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex); } } else { const focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex]; - await this._updateState(rebuildFromLine); + await this._updateState(nextRebuildFromLine); // Suppose that after setting the state, there are no sticky lines, set the focused index to -1 if (this._stickyScrollWidget.lineNumberCount === 0) { this._focusedStickyElementIndex = -1; @@ -518,7 +520,17 @@ export class StickyScrollController extends Disposable implements IEditorContrib } } } + + private _updateAndGetMinRebuildFromLine(rebuildFromLine: number | undefined): number | undefined { + if (rebuildFromLine !== undefined) { + const minRebuildFromLineOrInfinity = this._minRebuildFromLine !== undefined ? this._minRebuildFromLine : Infinity; + this._minRebuildFromLine = Math.min(rebuildFromLine, minRebuildFromLineOrInfinity); + } + return this._minRebuildFromLine; + } + private async _updateState(rebuildFromLine?: number): Promise { + this._minRebuildFromLine = undefined; this._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined; this._widgetState = this.findScrollWidgetState(); const stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0; @@ -527,6 +539,7 @@ export class StickyScrollController extends Disposable implements IEditorContrib } private async _resetState(): Promise { + this._minRebuildFromLine = undefined; this._foldingModel = undefined; this._widgetState = StickyScrollWidgetState.Empty; this._stickyScrollVisibleContextKey.set(false); From 3aba04042a6d6cb5bcbed5be3c041efc046f1e5e Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 4 Jun 2024 12:26:26 +0200 Subject: [PATCH 044/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20remove=20the?= =?UTF-8?q?=20use=20of=20a=20sequencer=20(#213997)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "SCM - all calls from extHostSCM to mainThreadSCM should use a sequencer to ensure that the source control object is created (#213792)" This reverts commit 24dd222ff2b0f5fb70ef1daa1f00783bbf7669ae. * Initial implementation * Pull request feedback * Revert unnecessary change * Use map of barriers instead * 💄 rename --- src/vs/workbench/api/browser/mainThreadSCM.ts | 53 ++++++++++++------- .../workbench/api/common/extHost.protocol.ts | 28 +++++----- src/vs/workbench/api/common/extHostSCM.ts | 52 +++++++++--------- 3 files changed, 74 insertions(+), 59 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 3b2e06b708cd4..10f26d51387a9 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -3,8 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Barrier } from 'vs/base/common/async'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; +import { observableValue } from 'vs/base/common/observable'; import { IDisposable, DisposableStore, combinedDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation, ISCMViewService, InputValidationType, ISCMActionButtonDescriptor } from 'vs/workbench/contrib/scm/common/scm'; import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, SCMHistoryItemGroupDto } from '../common/extHost.protocol'; @@ -25,7 +27,6 @@ import { IModelService } from 'vs/editor/common/services/model'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { Schemas } from 'vs/base/common/network'; import { ITextModel } from 'vs/editor/common/model'; -import { observableValue } from 'vs/base/common/observable'; function getIconFromIconDto(iconDto?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon): URI | { light: URI; dark: URI } | ThemeIcon | undefined { if (iconDto === undefined) { @@ -453,6 +454,7 @@ export class MainThreadSCM implements MainThreadSCMShape { private readonly _proxy: ExtHostSCMShape; private _repositories = new Map(); + private _repositoryBarriers = new Map(); private _repositoryDisposables = new Map(); private readonly _disposables = new DisposableStore(); @@ -483,9 +485,9 @@ export class MainThreadSCM implements MainThreadSCMShape { } async $registerSourceControl(handle: number, id: string, label: string, rootUri: UriComponents | undefined, inputBoxDocumentUri: UriComponents): Promise { - // Eagerly create the text model for the input box - const inputBoxTextModelRef = await this.textModelService.createModelReference(URI.revive(inputBoxDocumentUri)); + this._repositoryBarriers.set(handle, new Barrier()); + const inputBoxTextModelRef = await this.textModelService.createModelReference(URI.revive(inputBoxDocumentUri)); const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService); const repository = this.scmService.registerSCMProvider(provider); this._repositories.set(handle, repository); @@ -495,6 +497,7 @@ export class MainThreadSCM implements MainThreadSCMShape { Event.filter(this.scmViewService.onDidFocusRepository, r => r === repository)(_ => this._proxy.$setSelectedSourceControl(handle)), repository.input.onDidChange(({ value }) => this._proxy.$onInputBoxValueChange(handle, value)) ); + this._repositoryDisposables.set(handle, disposable); if (this.scmViewService.focusedRepository === repository) { setTimeout(() => this._proxy.$setSelectedSourceControl(handle), 0); @@ -504,10 +507,11 @@ export class MainThreadSCM implements MainThreadSCMShape { setTimeout(() => this._proxy.$onInputBoxValueChange(handle, repository.input.value), 0); } - this._repositoryDisposables.set(handle, disposable); + this._repositoryBarriers.get(handle)?.open(); } - $updateSourceControl(handle: number, features: SCMProviderFeatures): void { + async $updateSourceControl(handle: number, features: SCMProviderFeatures): Promise { + await this._repositoryBarriers.get(handle)?.wait(); const repository = this._repositories.get(handle); if (!repository) { @@ -518,7 +522,8 @@ export class MainThreadSCM implements MainThreadSCMShape { provider.$updateSourceControl(features); } - $unregisterSourceControl(handle: number): void { + async $unregisterSourceControl(handle: number): Promise { + await this._repositoryBarriers.get(handle)?.wait(); const repository = this._repositories.get(handle); if (!repository) { @@ -532,7 +537,8 @@ export class MainThreadSCM implements MainThreadSCMShape { this._repositories.delete(handle); } - $registerGroups(sourceControlHandle: number, groups: [number /*handle*/, string /*id*/, string /*label*/, SCMGroupFeatures, /* multiDiffEditorEnableViewChanges */ boolean][], splices: SCMRawResourceSplices[]): void { + async $registerGroups(sourceControlHandle: number, groups: [number /*handle*/, string /*id*/, string /*label*/, SCMGroupFeatures, /* multiDiffEditorEnableViewChanges */ boolean][], splices: SCMRawResourceSplices[]): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -544,7 +550,8 @@ export class MainThreadSCM implements MainThreadSCMShape { provider.$spliceGroupResourceStates(splices); } - $updateGroup(sourceControlHandle: number, groupHandle: number, features: SCMGroupFeatures): void { + async $updateGroup(sourceControlHandle: number, groupHandle: number, features: SCMGroupFeatures): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -555,7 +562,8 @@ export class MainThreadSCM implements MainThreadSCMShape { provider.$updateGroup(groupHandle, features); } - $updateGroupLabel(sourceControlHandle: number, groupHandle: number, label: string): void { + async $updateGroupLabel(sourceControlHandle: number, groupHandle: number, label: string): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -566,7 +574,8 @@ export class MainThreadSCM implements MainThreadSCMShape { provider.$updateGroupLabel(groupHandle, label); } - $spliceResourceStates(sourceControlHandle: number, splices: SCMRawResourceSplices[]): void { + async $spliceResourceStates(sourceControlHandle: number, splices: SCMRawResourceSplices[]): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -577,7 +586,8 @@ export class MainThreadSCM implements MainThreadSCMShape { provider.$spliceGroupResourceStates(splices); } - $unregisterGroup(sourceControlHandle: number, handle: number): void { + async $unregisterGroup(sourceControlHandle: number, handle: number): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -588,7 +598,8 @@ export class MainThreadSCM implements MainThreadSCMShape { provider.$unregisterGroup(handle); } - $setInputBoxValue(sourceControlHandle: number, value: string): void { + async $setInputBoxValue(sourceControlHandle: number, value: string): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -598,7 +609,8 @@ export class MainThreadSCM implements MainThreadSCMShape { repository.input.setValue(value, false); } - $setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): void { + async $setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -608,7 +620,8 @@ export class MainThreadSCM implements MainThreadSCMShape { repository.input.placeholder = placeholder; } - $setInputBoxEnablement(sourceControlHandle: number, enabled: boolean): void { + async $setInputBoxEnablement(sourceControlHandle: number, enabled: boolean): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -618,7 +631,8 @@ export class MainThreadSCM implements MainThreadSCMShape { repository.input.enabled = enabled; } - $setInputBoxVisibility(sourceControlHandle: number, visible: boolean): void { + async $setInputBoxVisibility(sourceControlHandle: number, visible: boolean): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -628,7 +642,8 @@ export class MainThreadSCM implements MainThreadSCMShape { repository.input.visible = visible; } - $showValidationMessage(sourceControlHandle: number, message: string | IMarkdownString, type: InputValidationType) { + async $showValidationMessage(sourceControlHandle: number, message: string | IMarkdownString, type: InputValidationType): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { return; @@ -637,7 +652,8 @@ export class MainThreadSCM implements MainThreadSCMShape { repository.input.showValidationMessage(message, type); } - $setValidationProviderIsEnabled(sourceControlHandle: number, enabled: boolean): void { + async $setValidationProviderIsEnabled(sourceControlHandle: number, enabled: boolean): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { @@ -654,7 +670,8 @@ export class MainThreadSCM implements MainThreadSCMShape { } } - $onDidChangeHistoryProviderCurrentHistoryItemGroup(sourceControlHandle: number, historyItemGroup: SCMHistoryItemGroupDto | undefined): void { + async $onDidChangeHistoryProviderCurrentHistoryItemGroup(sourceControlHandle: number, historyItemGroup: SCMHistoryItemGroupDto | undefined): Promise { + await this._repositoryBarriers.get(sourceControlHandle)?.wait(); const repository = this._repositories.get(sourceControlHandle); if (!repository) { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index ee8399645e8a5..a4d9cb6aa7721 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1521,24 +1521,24 @@ export interface SCMHistoryItemChangeDto { export interface MainThreadSCMShape extends IDisposable { $registerSourceControl(handle: number, id: string, label: string, rootUri: UriComponents | undefined, inputBoxDocumentUri: UriComponents): Promise; - $updateSourceControl(handle: number, features: SCMProviderFeatures): void; - $unregisterSourceControl(handle: number): void; + $updateSourceControl(handle: number, features: SCMProviderFeatures): Promise; + $unregisterSourceControl(handle: number): Promise; - $registerGroups(sourceControlHandle: number, groups: [number /*handle*/, string /*id*/, string /*label*/, SCMGroupFeatures, /* multiDiffEditorEnableViewChanges */ boolean][], splices: SCMRawResourceSplices[]): void; - $updateGroup(sourceControlHandle: number, handle: number, features: SCMGroupFeatures): void; - $updateGroupLabel(sourceControlHandle: number, handle: number, label: string): void; - $unregisterGroup(sourceControlHandle: number, handle: number): void; + $registerGroups(sourceControlHandle: number, groups: [number /*handle*/, string /*id*/, string /*label*/, SCMGroupFeatures, /* multiDiffEditorEnableViewChanges */ boolean][], splices: SCMRawResourceSplices[]): Promise; + $updateGroup(sourceControlHandle: number, handle: number, features: SCMGroupFeatures): Promise; + $updateGroupLabel(sourceControlHandle: number, handle: number, label: string): Promise; + $unregisterGroup(sourceControlHandle: number, handle: number): Promise; - $spliceResourceStates(sourceControlHandle: number, splices: SCMRawResourceSplices[]): void; + $spliceResourceStates(sourceControlHandle: number, splices: SCMRawResourceSplices[]): Promise; - $setInputBoxValue(sourceControlHandle: number, value: string): void; - $setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): void; - $setInputBoxEnablement(sourceControlHandle: number, enabled: boolean): void; - $setInputBoxVisibility(sourceControlHandle: number, visible: boolean): void; - $showValidationMessage(sourceControlHandle: number, message: string | IMarkdownString, type: InputValidationType): void; - $setValidationProviderIsEnabled(sourceControlHandle: number, enabled: boolean): void; + $setInputBoxValue(sourceControlHandle: number, value: string): Promise; + $setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): Promise; + $setInputBoxEnablement(sourceControlHandle: number, enabled: boolean): Promise; + $setInputBoxVisibility(sourceControlHandle: number, visible: boolean): Promise; + $showValidationMessage(sourceControlHandle: number, message: string | IMarkdownString, type: InputValidationType): Promise; + $setValidationProviderIsEnabled(sourceControlHandle: number, enabled: boolean): Promise; - $onDidChangeHistoryProviderCurrentHistoryItemGroup(sourceControlHandle: number, historyItemGroup: SCMHistoryItemGroupDto | undefined): void; + $onDidChangeHistoryProviderCurrentHistoryItemGroup(sourceControlHandle: number, historyItemGroup: SCMHistoryItemGroupDto | undefined): Promise; } export interface MainThreadQuickDiffShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index c63a3afd1722b..c746b79ed3556 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -9,7 +9,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { debounce } from 'vs/base/common/decorators'; import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { asPromise, Sequencer } from 'vs/base/common/async'; +import { asPromise } from 'vs/base/common/async'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, ICommandDto, MainThreadTelemetryShape, SCMGroupFeatures, SCMHistoryItemDto, SCMHistoryItemChangeDto } from './extHost.protocol'; import { sortedDiff, equals } from 'vs/base/common/arrays'; @@ -259,7 +259,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { set value(value: string) { value = value ?? ''; - this._sequencer.queue(async () => this.#proxy.$setInputBoxValue(this._sourceControlHandle, value)); + this.#proxy.$setInputBoxValue(this._sourceControlHandle, value); this.updateValue(value); } @@ -276,7 +276,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { } set placeholder(placeholder: string) { - this._sequencer.queue(async () => this.#proxy.$setInputBoxPlaceholder(this._sourceControlHandle, placeholder)); + this.#proxy.$setInputBoxPlaceholder(this._sourceControlHandle, placeholder); this._placeholder = placeholder; } @@ -296,7 +296,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { } this._validateInput = fn; - this._sequencer.queue(async () => this.#proxy.$setValidationProviderIsEnabled(this._sourceControlHandle, !!fn)); + this.#proxy.$setValidationProviderIsEnabled(this._sourceControlHandle, !!fn); } private _enabled: boolean = true; @@ -313,7 +313,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { } this._enabled = enabled; - this._sequencer.queue(async () => this.#proxy.$setInputBoxEnablement(this._sourceControlHandle, enabled)); + this.#proxy.$setInputBoxEnablement(this._sourceControlHandle, enabled); } private _visible: boolean = true; @@ -330,7 +330,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { } this._visible = visible; - this._sequencer.queue(async () => this.#proxy.$setInputBoxVisibility(this._sourceControlHandle, visible)); + this.#proxy.$setInputBoxVisibility(this._sourceControlHandle, visible); } get document(): vscode.TextDocument { @@ -339,7 +339,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { return this.#extHostDocuments.getDocument(this._documentUri); } - constructor(private _extension: IExtensionDescription, _extHostDocuments: ExtHostDocuments, proxy: MainThreadSCMShape, private _sequencer: Sequencer, private _sourceControlHandle: number, private _documentUri: URI) { + constructor(private _extension: IExtensionDescription, _extHostDocuments: ExtHostDocuments, proxy: MainThreadSCMShape, private _sourceControlHandle: number, private _documentUri: URI) { this.#extHostDocuments = _extHostDocuments; this.#proxy = proxy; } @@ -347,7 +347,7 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox { showValidationMessage(message: string | vscode.MarkdownString, type: vscode.SourceControlInputBoxValidationType) { checkProposedApiEnabled(this._extension, 'scmValidation'); - this._sequencer.queue(async () => this.#proxy.$showValidationMessage(this._sourceControlHandle, message, type as any)); + this.#proxy.$showValidationMessage(this._sourceControlHandle, message, type as any); } $onInputBoxValueChange(value: string): void { @@ -386,14 +386,14 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG get label(): string { return this._label; } set label(label: string) { this._label = label; - this._sequencer.queue(async () => this._proxy.$updateGroupLabel(this._sourceControlHandle, this.handle, label)); + this._proxy.$updateGroupLabel(this._sourceControlHandle, this.handle, label); } private _hideWhenEmpty: boolean | undefined = undefined; get hideWhenEmpty(): boolean | undefined { return this._hideWhenEmpty; } set hideWhenEmpty(hideWhenEmpty: boolean | undefined) { this._hideWhenEmpty = hideWhenEmpty; - this._sequencer.queue(async () => this._proxy.$updateGroup(this._sourceControlHandle, this.handle, this.features)); + this._proxy.$updateGroup(this._sourceControlHandle, this.handle, this.features); } get features(): SCMGroupFeatures { @@ -413,7 +413,6 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG constructor( private _proxy: MainThreadSCMShape, private _commands: ExtHostCommands, - private _sequencer: Sequencer, private _sourceControlHandle: number, private _id: string, private _label: string, @@ -512,7 +511,6 @@ class ExtHostSourceControl implements vscode.SourceControl { #proxy: MainThreadSCMShape; - private readonly _sequencer = new Sequencer(); private _groups: Map = new Map(); get id(): string { @@ -542,7 +540,7 @@ class ExtHostSourceControl implements vscode.SourceControl { } this._count = count; - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { count })); + this.#proxy.$updateSourceControl(this.handle, { count }); } private _quickDiffProvider: vscode.QuickDiffProvider | undefined = undefined; @@ -557,7 +555,7 @@ class ExtHostSourceControl implements vscode.SourceControl { if (isProposedApiEnabled(this._extension, 'quickDiffProvider')) { quickDiffLabel = quickDiffProvider?.label; } - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { hasQuickDiffProvider: !!quickDiffProvider, quickDiffLabel })); + this.#proxy.$updateSourceControl(this.handle, { hasQuickDiffProvider: !!quickDiffProvider, quickDiffLabel }); } private _historyProvider: vscode.SourceControlHistoryProvider | undefined; @@ -575,12 +573,12 @@ class ExtHostSourceControl implements vscode.SourceControl { this._historyProvider = historyProvider; this._historyProviderDisposable.value = new DisposableStore(); - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { hasHistoryProvider: !!historyProvider })); + this.#proxy.$updateSourceControl(this.handle, { hasHistoryProvider: !!historyProvider }); if (historyProvider) { this._historyProviderDisposable.value.add(historyProvider.onDidChangeCurrentHistoryItemGroup(() => { this._historyProviderCurrentHistoryItemGroup = historyProvider?.currentHistoryItemGroup; - this._sequencer.queue(async () => this.#proxy.$onDidChangeHistoryProviderCurrentHistoryItemGroup(this.handle, this._historyProviderCurrentHistoryItemGroup)); + this.#proxy.$onDidChangeHistoryProviderCurrentHistoryItemGroup(this.handle, this._historyProviderCurrentHistoryItemGroup); })); } } @@ -597,7 +595,7 @@ class ExtHostSourceControl implements vscode.SourceControl { } this._commitTemplate = commitTemplate; - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { commitTemplate })); + this.#proxy.$updateSourceControl(this.handle, { commitTemplate }); } private readonly _acceptInputDisposables = new MutableDisposable(); @@ -613,7 +611,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._acceptInputCommand = acceptInputCommand; const internal = this._commands.converter.toInternal(acceptInputCommand, this._acceptInputDisposables.value); - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { acceptInputCommand: internal })); + this.#proxy.$updateSourceControl(this.handle, { acceptInputCommand: internal }); } private readonly _actionButtonDisposables = new MutableDisposable(); @@ -637,7 +635,7 @@ class ExtHostSourceControl implements vscode.SourceControl { description: actionButton.description, enabled: actionButton.enabled } : undefined; - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { actionButton: internal ?? null })); + this.#proxy.$updateSourceControl(this.handle, { actionButton: internal ?? null }); } @@ -658,7 +656,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._statusBarCommands = statusBarCommands; const internal = (statusBarCommands || []).map(c => this._commands.converter.toInternal(c, this._statusBarDisposables.value!)) as ICommandDto[]; - this._sequencer.queue(async () => this.#proxy.$updateSourceControl(this.handle, { statusBarCommands: internal })); + this.#proxy.$updateSourceControl(this.handle, { statusBarCommands: internal }); } private _selected: boolean = false; @@ -689,8 +687,8 @@ class ExtHostSourceControl implements vscode.SourceControl { query: _rootUri ? `rootUri=${encodeURIComponent(_rootUri.toString())}` : undefined }); - this._sequencer.queue(() => this.#proxy.$registerSourceControl(this.handle, _id, _label, _rootUri, inputBoxDocumentUri)); - this._inputBox = new ExtHostSCMInputBox(_extension, _extHostDocuments, this.#proxy, this._sequencer, this.handle, inputBoxDocumentUri); + this._inputBox = new ExtHostSCMInputBox(_extension, _extHostDocuments, this.#proxy, this.handle, inputBoxDocumentUri); + this.#proxy.$registerSourceControl(this.handle, _id, _label, _rootUri, inputBoxDocumentUri); } private createdResourceGroups = new Map(); @@ -698,7 +696,7 @@ class ExtHostSourceControl implements vscode.SourceControl { createResourceGroup(id: string, label: string, options?: { multiDiffEditorEnableViewChanges?: boolean }): ExtHostSourceControlResourceGroup { const multiDiffEditorEnableViewChanges = isProposedApiEnabled(this._extension, 'scmMultiDiffEditor') && options?.multiDiffEditorEnableViewChanges === true; - const group = new ExtHostSourceControlResourceGroup(this.#proxy, this._commands, this._sequencer, this.handle, id, label, multiDiffEditorEnableViewChanges, this._extension); + const group = new ExtHostSourceControlResourceGroup(this.#proxy, this._commands, this.handle, id, label, multiDiffEditorEnableViewChanges, this._extension); const disposable = Event.once(group.onDidDispose)(() => this.createdResourceGroups.delete(group)); this.createdResourceGroups.set(group, disposable); this.eventuallyAddResourceGroups(); @@ -722,7 +720,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this.updatedResourceGroups.delete(group); updateListener.dispose(); this._groups.delete(group.handle); - this._sequencer.queue(async () => this.#proxy.$unregisterGroup(this.handle, group.handle)); + this.#proxy.$unregisterGroup(this.handle, group.handle); }); groups.push([group.handle, group.id, group.label, group.features, group.multiDiffEditorEnableViewChanges]); @@ -736,7 +734,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._groups.set(group.handle, group); } - this._sequencer.queue(async () => this.#proxy.$registerGroups(this.handle, groups, splices)); + this.#proxy.$registerGroups(this.handle, groups, splices); this.createdResourceGroups.clear(); } @@ -755,7 +753,7 @@ class ExtHostSourceControl implements vscode.SourceControl { }); if (splices.length > 0) { - this._sequencer.queue(async () => this.#proxy.$spliceResourceStates(this.handle, splices)); + this.#proxy.$spliceResourceStates(this.handle, splices); } this.updatedResourceGroups.clear(); @@ -776,7 +774,7 @@ class ExtHostSourceControl implements vscode.SourceControl { this._statusBarDisposables.dispose(); this._groups.forEach(group => group.dispose()); - this._sequencer.queue(async () => this.#proxy.$unregisterSourceControl(this.handle)); + this.#proxy.$unregisterSourceControl(this.handle); } } From a790cb6a7eccf9b4da54085f104c48c32c6a1f40 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Tue, 4 Jun 2024 12:36:10 +0200 Subject: [PATCH 045/755] Refactoring the `contentHoverController.ts` file (#214214) refactoring the content hover controller file --- .../hover/browser/contentHoverController.ts | 143 +++++++++++------- .../hover/browser/contentHoverTypes.ts | 8 +- 2 files changed, 93 insertions(+), 58 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index 81ad7b790edab..91b66edfc5aeb 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -5,7 +5,7 @@ import * as dom from 'vs/base/browser/dom'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; @@ -28,6 +28,7 @@ import { Emitter } from 'vs/base/common/event'; export class ContentHoverController extends Disposable implements IHoverWidget { private _currentResult: HoverResult | null = null; + private _colorWidget: IEditorHoverColorPickerWidget | null = null; private readonly _computer: ContentHoverComputer; private readonly _widget: ContentHoverWidget; @@ -163,12 +164,12 @@ export class ContentHoverController extends Disposable implements IHoverWidget { // avoid updating the DOM to avoid resetting the user selection return; } - if (hoverResult && hoverResult.messages.length === 0) { + if (hoverResult && hoverResult.hoverParts.length === 0) { hoverResult = null; } this._currentResult = hoverResult; if (this._currentResult) { - this._renderMessages(this._currentResult.anchor, this._currentResult.messages); + this._showHover(this._currentResult.anchor, this._currentResult.hoverParts); } else { this._widget.hide(); } @@ -197,7 +198,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { return; } - if (this._computer.insistOnKeepingHoverVisible && hoverResult.messages.length === 0) { + if (this._computer.insistOnKeepingHoverVisible && hoverResult.hoverParts.length === 0) { // The hover would now hide normally, so we'll keep the previous messages return; } @@ -206,68 +207,102 @@ export class ContentHoverController extends Disposable implements IHoverWidget { this._setCurrentResult(hoverResult); } - private _renderMessages(anchor: HoverAnchor, messages: IHoverPart[]): void { - const { showAtPosition, showAtSecondaryPosition, highlightRange } = ContentHoverController.computeHoverRanges(this._editor, anchor.range, messages); + private _showHover(anchor: HoverAnchor, hoverParts: IHoverPart[]): void { - const disposables = new DisposableStore(); - const statusBar = disposables.add(new EditorHoverStatusBar(this._keybindingService)); const fragment = document.createDocumentFragment(); + const disposables = this._renderHoverPartsInFragment(fragment, hoverParts); + const fragmentHasContent = fragment.hasChildNodes(); + if (fragmentHasContent) { + this._doShowHover(fragment, hoverParts, anchor, disposables); + } else { + disposables.dispose(); + } + } - let colorPicker: IEditorHoverColorPickerWidget | null = null; - const context: IEditorHoverRenderContext = { - fragment, - statusBar, - setColorPicker: (widget) => colorPicker = widget, - onContentsChanged: () => this._doOnContentsChanged(), - setMinimumDimensions: (dimensions: dom.Dimension) => this._widget.setMinimumDimensions(dimensions), - hide: () => this.hide() + private _getHoverContext(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): IEditorHoverRenderContext { + const hide = () => { + this.hide(); + }; + const onContentsChanged = () => { + this._onContentsChanged.fire(); + this._widget.onContentsChanged(); + }; + const setColorPicker = (widget: IEditorHoverColorPickerWidget) => { + this._colorWidget = widget; }; + const setMinimumDimensions = (dimensions: dom.Dimension) => { + this._widget.setMinimumDimensions(dimensions); + }; + const context: IEditorHoverRenderContext = { fragment, statusBar, hide, onContentsChanged, setColorPicker, setMinimumDimensions }; + return context; + } + private _renderHoverPartsInFragment(fragment: DocumentFragment, hoverParts: IHoverPart[]): DisposableStore { + const disposables = new DisposableStore(); + const statusBar = new EditorHoverStatusBar(this._keybindingService); + const context = this._getHoverContext(fragment, statusBar); + disposables.add(this._renderHoverPartsUsingContext(context, hoverParts)); + disposables.add(this._renderStatusBar(fragment, statusBar)); + return disposables; + } + + private _renderHoverPartsUsingContext(context: IEditorHoverRenderContext, hoverParts: IHoverPart[]): IDisposable { + const disposables = new DisposableStore(); for (const participant of this._participants) { - const hoverParts = messages.filter(msg => msg.owner === participant); - if (hoverParts.length > 0) { - disposables.add(participant.renderHoverParts(context, hoverParts)); + const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant); + if (hoverPartsForParticipant.length === 0) { + continue; } + disposables.add(participant.renderHoverParts(context, hoverPartsForParticipant)); } + return disposables; + } - const isBeforeContent = messages.some(m => m.isBeforeContent); - - if (statusBar.hasContent) { - fragment.appendChild(statusBar.hoverElement); - } - - if (fragment.hasChildNodes()) { - if (highlightRange) { - const highlightDecoration = this._editor.createDecorationsCollection(); - highlightDecoration.set([{ - range: highlightRange, - options: ContentHoverController._DECORATION_OPTIONS - }]); - disposables.add(toDisposable(() => { - highlightDecoration.clear(); - })); - } - - this._widget.showAt(fragment, new ContentHoverVisibleData( - anchor.initialMousePosX, - anchor.initialMousePosY, - colorPicker, - showAtPosition, - showAtSecondaryPosition, - this._editor.getOption(EditorOption.hover).above, - this._computer.shouldFocus, - this._computer.source, - isBeforeContent, - disposables - )); - } else { - disposables.dispose(); + private _renderStatusBar(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): IDisposable { + if (!statusBar.hasContent) { + return Disposable.None; } + fragment.appendChild(statusBar.hoverElement); + return statusBar; + } + + private _doShowHover(fragment: DocumentFragment, hoverParts: IHoverPart[], anchor: HoverAnchor, disposables: DisposableStore): void { + const { showAtPosition, showAtSecondaryPosition, highlightRange } = ContentHoverController.computeHoverRanges(this._editor, anchor.range, hoverParts); + this._addEditorDecorations(highlightRange, disposables); + const initialMousePosX = anchor.initialMousePosX; + const initialMousePosY = anchor.initialMousePosY; + const preferAbove = this._editor.getOption(EditorOption.hover).above; + const stoleFocus = this._computer.shouldFocus; + const hoverSource = this._computer.source; + const isBeforeContent = hoverParts.some(m => m.isBeforeContent); + + const contentHoverVisibleData = new ContentHoverVisibleData( + initialMousePosX, + initialMousePosY, + this._colorWidget, + showAtPosition, + showAtSecondaryPosition, + preferAbove, + stoleFocus, + hoverSource, + isBeforeContent, + disposables + ); + this._widget.showAt(fragment, contentHoverVisibleData); } - private _doOnContentsChanged(): void { - this._onContentsChanged.fire(); - this._widget.onContentsChanged(); + private _addEditorDecorations(highlightRange: Range | undefined, disposables: DisposableStore) { + if (!highlightRange) { + return; + } + const highlightDecoration = this._editor.createDecorationsCollection(); + highlightDecoration.set([{ + range: highlightRange, + options: ContentHoverController._DECORATION_OPTIONS + }]); + disposables.add(toDisposable(() => { + highlightDecoration.clear(); + })); } private static readonly _DECORATION_OPTIONS = ModelDecorationOptions.register({ diff --git a/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts b/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts index 5d32dc8356070..eb6eef20ea4bd 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts @@ -12,16 +12,16 @@ export class HoverResult { constructor( public readonly anchor: HoverAnchor, - public readonly messages: IHoverPart[], + public readonly hoverParts: IHoverPart[], public readonly isComplete: boolean ) { } public filter(anchor: HoverAnchor): HoverResult { - const filteredMessages = this.messages.filter((m) => m.isValidForHoverAnchor(anchor)); - if (filteredMessages.length === this.messages.length) { + const filteredHoverParts = this.hoverParts.filter((m) => m.isValidForHoverAnchor(anchor)); + if (filteredHoverParts.length === this.hoverParts.length) { return this; } - return new FilteredHoverResult(this, this.anchor, filteredMessages, this.isComplete); + return new FilteredHoverResult(this, this.anchor, filteredHoverParts, this.isComplete); } } From d674a83b12bb1f6dca2c9cb54bdb474363b29abb Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 4 Jun 2024 05:11:14 -0700 Subject: [PATCH 046/755] Comment text cut off in comments panel (#214212) Fixes #212956 --- src/vs/workbench/contrib/comments/browser/media/panel.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/comments/browser/media/panel.css b/src/vs/workbench/contrib/comments/browser/media/panel.css index 938c658fd2dea..8527341bdae05 100644 --- a/src/vs/workbench/contrib/comments/browser/media/panel.css +++ b/src/vs/workbench/contrib/comments/browser/media/panel.css @@ -90,11 +90,14 @@ .comments-panel .comments-panel-container .tree-container .comment-thread-container .text * { margin: 0; text-overflow: ellipsis; - max-width: 500px; overflow: hidden; padding-right: 5px; } +.comments-panel .comments-panel-container .tree-container .comment-thread-container .comment-metadata .text * { + max-width: 700px; +} + .comments-panel .comments-panel-container .tree-container .comment-thread-container .range { opacity: 0.8; } From 7994fdb1ce2f959070336ad44665e0eadffcd1a9 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:31:35 +0200 Subject: [PATCH 047/755] SCM - fix input theming (#214225) --- .../contrib/scm/browser/media/scm.css | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css index c8939c63fbe40..ca6716b258edf 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm.css +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -67,10 +67,6 @@ justify-content: flex-end; } -.scm-view .monaco-editor .selected-text { - border-radius: 0; -} - /** * The following rules are very specific because of inline drop down menus * https://github.com/microsoft/vscode/issues/101410 @@ -332,8 +328,21 @@ border-radius: 2px; } +.scm-view .scm-editor-container .monaco-editor .selected-text { + background-color: rgba(var(--vscode-input-background), 0.4); + border-radius: 0; +} + .scm-view .scm-editor-container .monaco-editor .focused .selected-text { - background-color: var(--vscode-editor-selectionBackground); + background-color: var(--vscode-selection-background, var(--vscode-editor-selectionBackground)); +} + +.scm-view .scm-editor-container .monaco-editor .view-line span.inline-selected-text { + color: var(--vscode-input-foreground); +} + +.scm-view .scm-editor-container .monaco-editor-background { + background-color: var(--vscode-input-background); } .scm-view .scm-editor { From 463c55397c10fe6e3affacbdf0cc7461cadd7e13 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:23:10 +0200 Subject: [PATCH 048/755] SCM - fix timing issue with setting context keys (#214229) --- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index ca07b9168af4d..224dd28257f03 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -3412,8 +3412,8 @@ export class SCMViewPane extends ViewPane { return; } - this.isAnyRepositoryCollapsibleContextKey.set(this.scmViewService.visibleRepositories.some(r => this.tree.hasElement(r) && this.tree.isCollapsible(r))); - this.areAllRepositoriesCollapsedContextKey.set(this.scmViewService.visibleRepositories.every(r => this.tree.hasElement(r) && (!this.tree.isCollapsible(r) || this.tree.isCollapsed(r)))); + this.isAnyRepositoryCollapsibleContextKey.set(this.scmViewService.visibleRepositories.some(r => this.tree.hasNode(r) && this.tree.isCollapsible(r))); + this.areAllRepositoriesCollapsedContextKey.set(this.scmViewService.visibleRepositories.every(r => this.tree.hasNode(r) && (!this.tree.isCollapsible(r) || this.tree.isCollapsed(r)))); } collapseAllRepositories(): void { From 75142169cf81fe202fec2c3f0d9921538fe61124 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:27:50 +0200 Subject: [PATCH 049/755] Engineering - update winget configuration file (#214228) * Engineering - update winget configuration file * Fix the version number --- .configurations/configuration.dsc.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.configurations/configuration.dsc.yaml b/.configurations/configuration.dsc.yaml index 255da69a5bb7b..780b1dfa9596b 100644 --- a/.configurations/configuration.dsc.yaml +++ b/.configurations/configuration.dsc.yaml @@ -12,11 +12,11 @@ properties: - resource: Microsoft.WinGet.DSC/WinGetPackage id: npm directives: - description: Install NodeJS version >=18.15.x and <19 + description: Install NodeJS version 20 allowPrerelease: true settings: id: OpenJS.NodeJS.LTS - version: "18.18.0" + version: "20.14.0" source: winget - resource: NpmDsc/NpmPackage id: yarn From 8a474b4d1687005a3ce78ba414de74c1c08dac1a Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Tue, 4 Jun 2024 15:53:39 +0200 Subject: [PATCH 050/755] Fixes #207423 (#214232) --- .../textMate/browser/textMateTokenizationFeatureImpl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts b/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts index 74a52fae9ff3f..8214f7caef331 100644 --- a/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts +++ b/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts @@ -85,9 +85,9 @@ export class TextMateTokenizationFeature extends Disposable implements ITextMate this._updateTheme(this._themeService.getColorTheme(), false); })); - this._languageService.onDidRequestRichLanguageFeatures((languageId) => { + this._register(this._languageService.onDidRequestRichLanguageFeatures((languageId) => { this._createdModes.push(languageId); - }); + })); } private getAsyncTokenizationEnabled(): boolean { From 0fba8ea5f408ec560b92b7d4bfae66e41ddb2b15 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Tue, 4 Jun 2024 15:56:57 +0200 Subject: [PATCH 051/755] Fixes #207433 (#214233) --- src/vs/workbench/services/extensions/common/rpcProtocol.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/common/rpcProtocol.ts b/src/vs/workbench/services/extensions/common/rpcProtocol.ts index c7fbf71b0b7a3..e936f43f09fb6 100644 --- a/src/vs/workbench/services/extensions/common/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/common/rpcProtocol.ts @@ -158,7 +158,7 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { this._unacknowledgedCount = 0; this._unresponsiveTime = 0; this._asyncCheckUresponsive = this._register(new RunOnceScheduler(() => this._checkUnresponsive(), 1000)); - this._protocol.onMessage((msg) => this._receiveOneMessage(msg)); + this._register(this._protocol.onMessage((msg) => this._receiveOneMessage(msg))); } public override dispose(): void { From 3bb57eb6ef04824b426e4dd76e305cb2bfca3f75 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 4 Jun 2024 16:17:50 +0200 Subject: [PATCH 052/755] improves obsCodeEditor helper (#214215) * improves obsCodeEditor helper --- src/vs/base/common/equals.ts | 31 ++- src/vs/base/common/observable.ts | 3 + src/vs/base/common/observableInternal/api.ts | 31 +++ src/vs/base/common/observableInternal/base.ts | 15 +- .../common/observableInternal/debugName.ts | 8 + .../observableInternal/lazyObservableValue.ts | 146 ++++++++++++ .../base/common/observableInternal/utils.ts | 13 +- src/vs/editor/browser/observableUtilities.ts | 142 +++++++++++- .../widget/codeEditor/codeEditorWidget.ts | 10 + src/vs/editor/common/model/textModel.ts | 2 +- .../editor/common/viewModel/viewModelImpl.ts | 22 +- .../browser/inlineCompletionsController.ts | 106 ++++----- .../browser/inlineCompletionsModel.ts | 14 +- .../browser/inlineCompletionsSource.ts | 10 +- .../suggestWidgetInlineCompletionProvider.ts | 31 +-- .../test/browser/viewModel/testViewModel.ts | 2 + .../widget/observableCodeEditor.test.ts | 209 ++++++++++++++++++ 17 files changed, 668 insertions(+), 127 deletions(-) create mode 100644 src/vs/base/common/observableInternal/api.ts create mode 100644 src/vs/base/common/observableInternal/lazyObservableValue.ts create mode 100644 src/vs/editor/test/browser/widget/observableCodeEditor.test.ts diff --git a/src/vs/base/common/equals.ts b/src/vs/base/common/equals.ts index 22825c59d9e65..6e2ae8503abb5 100644 --- a/src/vs/base/common/equals.ts +++ b/src/vs/base/common/equals.ts @@ -6,6 +6,10 @@ import * as arrays from 'vs/base/common/arrays'; export type EqualityComparer = (a: T, b: T) => boolean; + +/** + * Compares two items for equality using strict equality. +*/ export const strictEquals: EqualityComparer = (a, b) => a === b; /** @@ -30,11 +34,30 @@ export function itemEquals(): EqualityC return (a, b) => a.equals(b); } -export function equalsIfDefined(v1: T | undefined, v2: T | undefined, equals: EqualityComparer): boolean { - if (!v1 || !v2) { - return v1 === v2; +/** + * Checks if two items are both null or undefined, or are equal according to the provided equality comparer. +*/ +export function equalsIfDefined(v1: T | undefined | null, v2: T | undefined | null, equals: EqualityComparer): boolean; +/** + * Returns an equality comparer that checks if two items are both null or undefined, or are equal according to the provided equality comparer. +*/ +export function equalsIfDefined(equals: EqualityComparer): EqualityComparer; +export function equalsIfDefined(equalsOrV1: EqualityComparer | T, v2?: T | undefined | null, equals?: EqualityComparer): EqualityComparer | boolean { + if (equals !== undefined) { + const v1 = equalsOrV1 as T | undefined; + if (v1 === undefined || v1 === null || v2 === undefined || v2 === null) { + return v2 === v1; + } + return equals(v1, v2); + } else { + const equals = equalsOrV1 as EqualityComparer; + return (v1, v2) => { + if (v1 === undefined || v1 === null || v2 === undefined || v2 === null) { + return v2 === v1; + } + return equals(v1, v2); + }; } - return equals(v1, v2); } /** diff --git a/src/vs/base/common/observable.ts b/src/vs/base/common/observable.ts index a4b21404a1a35..c090a27206858 100644 --- a/src/vs/base/common/observable.ts +++ b/src/vs/base/common/observable.ts @@ -60,6 +60,9 @@ export { waitForState, derivedWithCancellationToken, } from 'vs/base/common/observableInternal/promise'; +export { + observableValueOpts +} from 'vs/base/common/observableInternal/api'; import { ConsoleObservableLogger, setLogger } from 'vs/base/common/observableInternal/logging'; diff --git a/src/vs/base/common/observableInternal/api.ts b/src/vs/base/common/observableInternal/api.ts new file mode 100644 index 0000000000000..6e56671b7e587 --- /dev/null +++ b/src/vs/base/common/observableInternal/api.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { EqualityComparer, strictEquals } from 'vs/base/common/equals'; +import { ISettableObservable } from 'vs/base/common/observable'; +import { ObservableValue } from 'vs/base/common/observableInternal/base'; +import { IDebugNameData, DebugNameData } from 'vs/base/common/observableInternal/debugName'; +import { LazyObservableValue } from 'vs/base/common/observableInternal/lazyObservableValue'; + +export function observableValueOpts( + options: IDebugNameData & { + equalsFn?: EqualityComparer; + lazy?: boolean; + }, + initialValue: T +): ISettableObservable { + if (options.lazy) { + return new LazyObservableValue( + new DebugNameData(options.owner, options.debugName, undefined), + initialValue, + options.equalsFn ?? strictEquals, + ); + } + return new ObservableValue( + new DebugNameData(options.owner, options.debugName, undefined), + initialValue, + options.equalsFn ?? strictEquals, + ); +} diff --git a/src/vs/base/common/observableInternal/base.ts b/src/vs/base/common/observableInternal/base.ts index 7f76c8cc1abe1..fe3a465dfb116 100644 --- a/src/vs/base/common/observableInternal/base.ts +++ b/src/vs/base/common/observableInternal/base.ts @@ -6,7 +6,7 @@ import { strictEquals, EqualityComparer } from 'vs/base/common/equals'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { keepObserved, recomputeInitiallyAndOnChange } from 'vs/base/common/observable'; -import { DebugNameData, IDebugNameData, Owner, getFunctionName } from 'vs/base/common/observableInternal/debugName'; +import { DebugNameData, Owner, getFunctionName } from 'vs/base/common/observableInternal/debugName'; import type { derivedOpts } from 'vs/base/common/observableInternal/derived'; import { getLogger } from 'vs/base/common/observableInternal/logging'; @@ -385,19 +385,6 @@ export function observableValue(nameOrOwner: string | object, return new ObservableValue(debugNameData, initialValue, strictEquals); } -export function observableValueOpts( - options: IDebugNameData & { - equalsFn?: EqualityComparer; - }, - initialValue: T -): ISettableObservable { - return new ObservableValue( - new DebugNameData(options.owner, options.debugName, undefined), - initialValue, - options.equalsFn ?? strictEquals, - ); -} - export class ObservableValue extends BaseObservable implements ISettableObservable { diff --git a/src/vs/base/common/observableInternal/debugName.ts b/src/vs/base/common/observableInternal/debugName.ts index 481d24f03777d..3dff1889137ac 100644 --- a/src/vs/base/common/observableInternal/debugName.ts +++ b/src/vs/base/common/observableInternal/debugName.ts @@ -113,6 +113,14 @@ function findKey(obj: object, value: object): string | undefined { const countPerClassName = new Map(); const ownerId = new WeakMap(); +/** + * Don't call this method outside of tests. +*/ +export function testingClearObservableNamingCache(): void { + countPerName.clear(); + countPerClassName.clear(); +} + function formatOwner(owner: object): string { const id = ownerId.get(owner); if (id) { diff --git a/src/vs/base/common/observableInternal/lazyObservableValue.ts b/src/vs/base/common/observableInternal/lazyObservableValue.ts new file mode 100644 index 0000000000000..1c35f45816172 --- /dev/null +++ b/src/vs/base/common/observableInternal/lazyObservableValue.ts @@ -0,0 +1,146 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { EqualityComparer } from 'vs/base/common/equals'; +import { ISettableObservable, ITransaction } from 'vs/base/common/observable'; +import { BaseObservable, IObserver, TransactionImpl } from 'vs/base/common/observableInternal/base'; +import { DebugNameData } from 'vs/base/common/observableInternal/debugName'; + +/** + * Holds off updating observers until the value is actually read. +*/ +export class LazyObservableValue + extends BaseObservable + implements ISettableObservable { + protected _value: T; + private _isUpToDate = true; + private readonly _deltas: TChange[] = []; + + get debugName() { + return this._debugNameData.getDebugName(this) ?? 'LazyObservableValue'; + } + + constructor( + private readonly _debugNameData: DebugNameData, + initialValue: T, + private readonly _equalityComparator: EqualityComparer, + ) { + super(); + this._value = initialValue; + } + + public override get(): T { + this._update(); + return this._value; + } + + private _update(): void { + if (this._isUpToDate) { + return; + } + this._isUpToDate = true; + + if (this._deltas.length > 0) { + for (const observer of this.observers) { + for (const change of this._deltas) { + observer.handleChange(this, change); + } + } + this._deltas.length = 0; + } else { + for (const observer of this.observers) { + observer.handleChange(this, undefined); + } + } + } + + private _updateCounter = 0; + + private _beginUpdate(): void { + this._updateCounter++; + if (this._updateCounter === 1) { + for (const observer of this.observers) { + observer.beginUpdate(this); + } + } + } + + private _endUpdate(): void { + this._updateCounter--; + if (this._updateCounter === 0) { + this._update(); + + // End update could change the observer list. + const observers = [...this.observers]; + for (const r of observers) { + r.endUpdate(this); + } + } + } + + public override addObserver(observer: IObserver): void { + const shouldCallBeginUpdate = !this.observers.has(observer) && this._updateCounter > 0; + super.addObserver(observer); + + if (shouldCallBeginUpdate) { + observer.beginUpdate(this); + } + } + + public override removeObserver(observer: IObserver): void { + const shouldCallEndUpdate = this.observers.has(observer) && this._updateCounter > 0; + super.removeObserver(observer); + + if (shouldCallEndUpdate) { + // Calling end update after removing the observer makes sure endUpdate cannot be called twice here. + observer.endUpdate(this); + } + } + + public set(value: T, tx: ITransaction | undefined, change: TChange): void { + if (change === undefined && this._equalityComparator(this._value, value)) { + return; + } + + let _tx: TransactionImpl | undefined; + if (!tx) { + tx = _tx = new TransactionImpl(() => { }, () => `Setting ${this.debugName}`); + } + try { + this._isUpToDate = false; + this._setValue(value); + if (change !== undefined) { + this._deltas.push(change); + } + + tx.updateObserver({ + beginUpdate: () => this._beginUpdate(), + endUpdate: () => this._endUpdate(), + handleChange: (observable, change) => { }, + handlePossibleChange: (observable) => { }, + }, this); + + if (this._updateCounter > 1) { + // We already started begin/end update, so we need to manually call handlePossibleChange + for (const observer of this.observers) { + observer.handlePossibleChange(this); + } + } + + } finally { + if (_tx) { + _tx.finish(); + } + } + } + + override toString(): string { + return `${this.debugName}: ${this._value}`; + } + + protected _setValue(newValue: T): void { + this._value = newValue; + } +} diff --git a/src/vs/base/common/observableInternal/utils.ts b/src/vs/base/common/observableInternal/utils.ts index 409fe4a10ecaf..d1597b8b48ae7 100644 --- a/src/vs/base/common/observableInternal/utils.ts +++ b/src/vs/base/common/observableInternal/utils.ts @@ -54,9 +54,9 @@ export function observableFromPromise(promise: Promise): IObservable<{ val export function observableFromEvent( event: Event, - getValue: (args: TArgs | undefined) => T + getValue: (args: TArgs | undefined) => T, ): IObservable { - return new FromEventObservable(event, getValue); + return new FromEventObservable(event, getValue, () => FromEventObservable.globalTransaction); } export class FromEventObservable extends BaseObservable { @@ -68,7 +68,8 @@ export class FromEventObservable extends BaseObservable { constructor( private readonly event: Event, - public readonly _getValue: (args: TArgs | undefined) => T + public readonly _getValue: (args: TArgs | undefined) => T, + private readonly _getTransaction: () => ITransaction | undefined, ) { super(); } @@ -99,7 +100,7 @@ export class FromEventObservable extends BaseObservable { if (this.hasValue) { didRunTransaction = true; subtransaction( - FromEventObservable.globalTransaction, + this._getTransaction(), (tx) => { getLogger()?.handleFromEventObservableTriggered(this, { oldValue, newValue, change: undefined, didChange, hadValue: this.hasValue }); @@ -229,6 +230,10 @@ class ObservableSignal extends BaseObservable implements return new DebugNameData(this._owner, this._debugName, undefined).getDebugName(this) ?? 'Observable Signal'; } + public override toString(): string { + return this.debugName; + } + constructor( private readonly _debugName: string | undefined, private readonly _owner?: object, diff --git a/src/vs/editor/browser/observableUtilities.ts b/src/vs/editor/browser/observableUtilities.ts index 7bcfe7ecd6ac0..6e99c148d7781 100644 --- a/src/vs/editor/browser/observableUtilities.ts +++ b/src/vs/editor/browser/observableUtilities.ts @@ -3,11 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { autorunOpts, derivedOpts, IObservable, observableFromEvent } from 'vs/base/common/observable'; +import { equalsIfDefined, itemsEquals } from 'vs/base/common/equals'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { IObservable, ITransaction, autorunOpts, derived, derivedOpts, observableFromEvent, observableSignal, observableValue, observableValueOpts } from 'vs/base/common/observable'; +import { TransactionImpl } from 'vs/base/common/observableInternal/base'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; -import { IModelDeltaDecoration } from 'vs/editor/common/model'; +import { Selection } from 'vs/editor/common/core/selection'; +import { ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; +import { IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; /** * Returns a facade for the code editor that provides observables for various states/events. @@ -16,7 +22,7 @@ export function obsCodeEditor(editor: ICodeEditor): ObservableCodeEditor { return ObservableCodeEditor.get(editor); } -class ObservableCodeEditor { +class ObservableCodeEditor extends Disposable { private static _map = new Map(); /** @@ -28,21 +34,129 @@ class ObservableCodeEditor { result = new ObservableCodeEditor(editor); ObservableCodeEditor._map.set(editor, result); const d = editor.onDidDispose(() => { - ObservableCodeEditor._map.delete(editor); - d.dispose(); + const item = ObservableCodeEditor._map.get(editor); + if (item) { + ObservableCodeEditor._map.delete(editor); + item.dispose(); + d.dispose(); + } }); } return result; } + private _updateCounter = 0; + private _currentTransaction: TransactionImpl | undefined = undefined; + + private _beginUpdate(): void { + this._updateCounter++; + if (this._updateCounter === 1) { + this._currentTransaction = new TransactionImpl(() => { + /** @description Update editor state */ + }); + } + } + + private _endUpdate(): void { + this._updateCounter--; + if (this._updateCounter === 0) { + const t = this._currentTransaction!; + this._currentTransaction = undefined; + t.finish(); + } + } + private constructor(public readonly editor: ICodeEditor) { + super(); + + this._register(this.editor.onBeginUpdate(() => this._beginUpdate())); + this._register(this.editor.onEndUpdate(() => this._endUpdate())); + + this._register(this.editor.onDidChangeModel(() => { + this._beginUpdate(); + try { + this._model.set(this.editor.getModel(), this._currentTransaction); + this._forceUpdate(); + } finally { + this._endUpdate(); + } + })); + + this._register(this.editor.onDidType((e) => { + this._beginUpdate(); + try { + this._forceUpdate(); + this.onDidType.trigger(this._currentTransaction, e); + } finally { + this._endUpdate(); + } + })); + + this._register(this.editor.onDidChangeModelContent(e => { + this._beginUpdate(); + try { + this._versionId.set(this.editor.getModel()?.getVersionId() ?? null, this._currentTransaction, e); + this._forceUpdate(); + } finally { + this._endUpdate(); + } + })); + + this._register(this.editor.onDidChangeCursorSelection(e => { + this._beginUpdate(); + try { + this._selections.set(this.editor.getSelections(), this._currentTransaction, e); + this._forceUpdate(); + } finally { + this._endUpdate(); + } + })); } - public readonly model = observableFromEvent(this.editor.onDidChangeModel, () => this.editor.getModel()); - public readonly value = observableFromEvent(this.editor.onDidChangeModelContent, () => this.editor.getValue()); - public readonly valueIsEmpty = observableFromEvent(this.editor.onDidChangeModelContent, () => this.editor.getModel()?.getValueLength() === 0); - public readonly selections = observableFromEvent(this.editor.onDidChangeCursorSelection, () => this.editor.getSelections()); - public readonly cursorPosition = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.selections.read(reader)?.[0]?.getPosition() ?? null); + public forceUpdate(): void; + public forceUpdate(cb: (tx: ITransaction) => T): T; + public forceUpdate(cb?: (tx: ITransaction) => T): T { + this._beginUpdate(); + try { + this._forceUpdate(); + if (!cb) { return undefined as T; } + return cb(this._currentTransaction!); + } finally { + this._endUpdate(); + } + } + + private _forceUpdate(): void { + this._beginUpdate(); + try { + this._model.set(this.editor.getModel(), this._currentTransaction); + this._versionId.set(this.editor.getModel()?.getVersionId() ?? null, this._currentTransaction, undefined); + this._selections.set(this.editor.getSelections(), this._currentTransaction, undefined); + } finally { + this._endUpdate(); + } + } + + private readonly _model = observableValue(this, this.editor.getModel()); + public readonly model: IObservable = this._model; + + public readonly isReadonly = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.readOnly)); + + private readonly _versionId = observableValueOpts({ owner: this, lazy: true }, this.editor.getModel()?.getVersionId() ?? null); + public readonly versionId: IObservable = this._versionId; + + private readonly _selections = observableValueOpts( + { owner: this, equalsFn: equalsIfDefined(itemsEquals(Selection.selectionsEqual)), lazy: true }, + this.editor.getSelections() ?? null + ); + public readonly selections: IObservable = this._selections; + + + public readonly positions = derivedOpts( + { owner: this, equalsFn: equalsIfDefined(itemsEquals(Position.equals)) }, + reader => this.selections.read(reader)?.map(s => s.getStartPosition()) ?? null + ); + public readonly isFocused = observableFromEvent(e => { const d1 = this.editor.onDidFocusEditorWidget(e); const d2 = this.editor.onDidBlurEditorWidget(e); @@ -54,6 +168,12 @@ class ObservableCodeEditor { }; }, () => this.editor.hasWidgetFocus()); + public readonly value = derived(this, reader => { this.versionId.read(reader); return this.model.read(reader)?.getValue(); }); + public readonly valueIsEmpty = derived(this, reader => { this.versionId.read(reader); return this.editor.getModel()?.getValueLength() === 0; }); + public readonly cursorPosition = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.selections.read(reader)?.[0]?.getPosition() ?? null); + + public readonly onDidType = observableSignal(this); + public setDecorations(decorations: IObservable): IDisposable { const d = new DisposableStore(); const decorationsCollection = this.editor.createDecorationsCollection(); diff --git a/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts index 07753688f7ed9..0ca963b351123 100644 --- a/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts @@ -1648,6 +1648,16 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this.languageConfigurationService, this._themeService, attachedView, + { + batchChanges: (cb) => { + try { + this._beginUpdate(); + return cb(); + } finally { + this._endUpdate(); + } + }, + } ); // Someone might destroy the model from under the editor, so prevent any exceptions by setting a null model diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 626217e8bffd9..75653b9ed6cf1 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -413,7 +413,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati private _assertNotDisposed(): void { if (this._isDisposed) { - throw new Error('Model is disposed!'); + throw new BugIndicatingError('Model is disposed!'); } } diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index c5af99cca77bf..50366d5495827 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -71,6 +71,7 @@ export class ViewModel extends Disposable implements IViewModel { private readonly languageConfigurationService: ILanguageConfigurationService, private readonly _themeService: IThemeService, private readonly _attachedView: IAttachedView, + private readonly _transactionalTarget: IBatchableTarget, ) { super(); @@ -1102,12 +1103,14 @@ export class ViewModel extends Disposable implements IViewModel { //#endregion private _withViewEventsCollector(callback: (eventsCollector: ViewModelEventsCollector) => T): T { - try { - const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); - return callback(eventsCollector); - } finally { - this._eventDispatcher.endEmitViewEvents(); - } + return this._transactionalTarget.batchChanges(() => { + try { + const eventsCollector = this._eventDispatcher.beginEmitViewEvents(); + return callback(eventsCollector); + } finally { + this._eventDispatcher.endEmitViewEvents(); + } + }); } public batchEvents(callback: () => void): void { @@ -1127,6 +1130,13 @@ export class ViewModel extends Disposable implements IViewModel { } } +export interface IBatchableTarget { + /** + * Allows the target to apply the changes introduced by the callback in a batch. + */ + batchChanges(cb: () => T): T; +} + class ViewportStart implements IDisposable { public static create(model: ITextModel): ViewportStart { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts index c11920c4d65d5..bfe080474d87e 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts @@ -7,26 +7,25 @@ import { createStyleSheet2 } from 'vs/base/browser/dom'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { timeout } from 'vs/base/common/async'; import { cancelOnDispose } from 'vs/base/common/cancellation'; -import { itemEquals, itemsEquals } from 'vs/base/common/equals'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { IObservable, ITransaction, autorun, autorunHandleChanges, constObservable, derived, disposableObservableValue, observableFromEvent, observableSignal, observableValue, transaction, waitForState } from 'vs/base/common/observable'; -import { ISettableObservable, observableValueOpts } from 'vs/base/common/observableInternal/base'; +import { IObservable, ITransaction, autorun, autorunHandleChanges, autorunWithStoreHandleChanges, constObservable, derived, disposableObservableValue, observableFromEvent, observableSignal, observableValue, transaction, waitForState } from 'vs/base/common/observable'; +import { ISettableObservable } from 'vs/base/common/observableInternal/base'; import { mapObservableArrayCached } from 'vs/base/common/observableInternal/utils'; import { isUndefined } from 'vs/base/common/types'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { obsCodeEditor } from 'vs/editor/browser/observableUtilities'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; import { ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; -import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { inlineSuggestCommitId } from 'vs/editor/contrib/inlineCompletions/browser/commandIds'; import { GhostTextWidget } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextWidget'; import { InlineCompletionContextKeys } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys'; import { InlineCompletionsHintsWidget, InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget'; -import { InlineCompletionsModel, VersionIdChangeReason } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel'; +import { InlineCompletionsModel } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel'; import { SuggestWidgetAdaptor } from 'vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider'; import { localize } from 'vs/nls'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; @@ -44,42 +43,47 @@ export class InlineCompletionsController extends Disposable { return editor.getContribution(InlineCompletionsController.ID); } - public readonly model = this._register(disposableObservableValue('inlineCompletionModel', undefined)); - private readonly _textModelVersionId = observableValue(this, -1); - private readonly _positions = observableValueOpts({ owner: this, equalsFn: itemsEquals(itemEquals()) }, [new Position(1, 1)]); + public readonly model = this._register(disposableObservableValue(this, undefined)); + private readonly _editorObs = obsCodeEditor(this.editor); + private readonly _positions = derived(this, reader => this._editorObs.positions.read(reader) ?? [new Position(1, 1)]); private readonly _suggestWidgetAdaptor = this._register(new SuggestWidgetAdaptor( this.editor, - () => this.model.get()?.selectedInlineCompletion.get()?.toSingleTextEdit(undefined), - (tx) => this.updateObservables(tx, VersionIdChangeReason.Other), + () => { + this._editorObs.forceUpdate(); + return this.model.get()?.selectedInlineCompletion.get()?.toSingleTextEdit(undefined); + }, (item) => { - transaction(tx => { + this._editorObs.forceUpdate(tx => { /** @description InlineCompletionsController.handleSuggestAccepted */ - this.updateObservables(tx, VersionIdChangeReason.Other); this.model.get()?.handleSuggestAccepted(item); }); } )); + private readonly _suggestWidgetSelectedItem = observableFromEvent(cb => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => { + this._editorObs.forceUpdate(_tx => cb(undefined)); + }), () => this._suggestWidgetAdaptor.selectedItem); private readonly _enabledInConfig = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).enabled); private readonly _isScreenReaderEnabled = observableFromEvent(this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); - private readonly _editorDictationInProgress = observableFromEvent(this._contextKeyService.onDidChangeContext, () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true); + private readonly _editorDictationInProgress = observableFromEvent( + this._contextKeyService.onDidChangeContext, + () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true + ); private readonly _enabled = derived(this, reader => this._enabledInConfig.read(reader) && (!this._isScreenReaderEnabled.read(reader) || !this._editorDictationInProgress.read(reader))); - private readonly _fontFamily = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).fontFamily); private readonly _ghostTexts = derived(this, (reader) => { const model = this.model.read(reader); return model?.ghostTexts.read(reader) ?? []; }); - private readonly _stablizedGhostTexts = convertItemsToStableObservables(this._ghostTexts, this._store); - private readonly _ghostTextWidgets = mapObservableArrayCached(this, this._stablizedGhostTexts, (ghostText, store) => { - return store.add(this._instantiationService.createInstance(GhostTextWidget, this.editor, { + private readonly _ghostTextWidgets = mapObservableArrayCached(this, this._stablizedGhostTexts, (ghostText, store) => + store.add(this._instantiationService.createInstance(GhostTextWidget, this.editor, { ghostText: ghostText, minReservedLineCount: constObservable(0), targetTextModel: this.model.map(v => v?.textModel), - })); - }).recomputeInitiallyAndOnChange(this._store); + })) + ).recomputeInitiallyAndOnChange(this._store); private readonly _debounceValue = this._debounceService.for( this._languageFeaturesService.inlineCompletionsProvider, @@ -88,10 +92,7 @@ export class InlineCompletionsController extends Disposable { ); private readonly _playAccessibilitySignal = observableSignal(this); - - private readonly _isReadonly = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.readOnly)); - private readonly _textModel = observableFromEvent(this.editor.onDidChangeModel, () => this.editor.getModel()); - private readonly _textModelIfWritable = derived(reader => this._isReadonly.read(reader) ? undefined : this._textModel.read(reader)); + private readonly _textModelIfWritable = derived(reader => this._editorObs.isReadonly.read(reader) ? undefined : this._editorObs.model.read(reader)); constructor( public readonly editor: ICodeEditor, @@ -115,14 +116,12 @@ export class InlineCompletionsController extends Disposable { transaction(tx => { /** @description InlineCompletionsController.onDidChangeModel/readonly */ this.model.set(undefined, tx); - this.updateObservables(tx, VersionIdChangeReason.Other); - if (textModel) { const model = _instantiationService.createInstance( InlineCompletionsModel, textModel, - this._suggestWidgetAdaptor.selectedItem, - this._textModelVersionId, + this._suggestWidgetSelectedItem, + this._editorObs.versionId, this._positions, this._debounceValue, observableFromEvent(editor.onDidChangeConfiguration, () => editor.getOption(EditorOption.suggest).preview), @@ -146,28 +145,26 @@ export class InlineCompletionsController extends Disposable { }`); })); - const getReason = (e: IModelContentChangedEvent): VersionIdChangeReason => { - if (e.isUndoing) { return VersionIdChangeReason.Undo; } - if (e.isRedoing) { return VersionIdChangeReason.Redo; } - if (this.model.get()?.isAcceptingPartially) { return VersionIdChangeReason.AcceptWord; } - return VersionIdChangeReason.Other; - }; - this._register(editor.onDidChangeModelContent((e) => transaction(tx => - /** @description InlineCompletionsController.onDidChangeModelContent */ - this.updateObservables(tx, getReason(e)) - ))); - - this._register(editor.onDidChangeCursorPosition(e => transaction(tx => { - /** @description InlineCompletionsController.onDidChangeCursorPosition */ - this.updateObservables(tx, VersionIdChangeReason.Other); - if (e.reason === CursorChangeReason.Explicit || e.source === 'api') { - this.model.get()?.stop(tx); + this._register(autorunWithStoreHandleChanges({ + createEmptyChangeSummary: () => ({ shouldStop: false }), + handleChange: (context, changeSummary) => { + if (context.didChange(this._editorObs.selections)) { + const e = context.change; + if (e && (e.reason === CursorChangeReason.Explicit || e.source === 'api')) { + changeSummary.shouldStop = true; + } + } + return changeSummary.shouldStop; + }, + }, (reader, changeSummary) => { + this._editorObs.selections.read(reader); + if (changeSummary.shouldStop) { + this.model.get()?.stop(undefined); } - }))); + })); - this._register(editor.onDidType(() => transaction(tx => { + this._register(editor.onDidType(() => this._editorObs.forceUpdate(tx => { /** @description InlineCompletionsController.onDidType */ - this.updateObservables(tx, VersionIdChangeReason.Other); if (this._enabled.get()) { this.model.get()?.trigger(tx); } @@ -183,7 +180,7 @@ export class InlineCompletionsController extends Disposable { 'acceptSelectedSuggestion', ]); if (commands.has(e.commandId) && editor.hasTextFocus() && this._enabled.get()) { - transaction(tx => { + this._editorObs.forceUpdate(tx => { /** @description onDidExecuteCommand */ this.model.get()?.trigger(tx); }); @@ -246,7 +243,7 @@ export class InlineCompletionsController extends Disposable { const lineText = model.textModel.getLineContent(state.primaryGhostText.lineNumber); await timeout(50, cancelOnDispose(cancellationStore)); - await waitForState(this._suggestWidgetAdaptor.selectedItem, isUndefined, () => false, cancelOnDispose(cancellationStore)); + await waitForState(this._suggestWidgetSelectedItem, isUndefined, () => false, cancelOnDispose(cancellationStore)); await this._accessibilitySignalService.playSignal(AccessibilitySignal.inlineSuggestion); @@ -257,6 +254,8 @@ export class InlineCompletionsController extends Disposable { })); this._register(new InlineCompletionsHintsWidget(this.editor, this.model, this._instantiationService)); + + // TODO@hediet this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('accessibility.verbosity.inlineCompletions')) { this.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') }); @@ -279,17 +278,6 @@ export class InlineCompletionsController extends Disposable { hint ? alert(content + ', ' + hint) : alert(content); } - /** - * Copies over the relevant state from the text model to observables. - * This solves all kind of eventing issues, as we make sure we always operate on the latest state, - * regardless of who calls into us. - */ - private updateObservables(tx: ITransaction, changeReason: VersionIdChangeReason): void { - const newModel = this.editor.getModel(); - this._textModelVersionId.set(newModel?.getVersionId() ?? -1, tx, changeReason); - this._positions.set(this.editor.getSelections()?.map(selection => selection.getPosition()) ?? [new Position(1, 1)], tx); - } - public shouldShowHoverAt(range: Range) { const ghostText = this.model.get()?.primaryGhostText.get(); if (ghostText) { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts index bc10c23e4917f..3a7ac0f015f4a 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts @@ -23,6 +23,7 @@ import { Command, InlineCompletionContext, InlineCompletionTriggerKind, PartialA import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { EndOfLinePreference, ITextModel } from 'vs/editor/common/model'; import { IFeatureDebounceInformation } from 'vs/editor/common/services/languageFeatureDebounce'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { GhostText, GhostTextOrReplacement, ghostTextOrReplacementEquals, ghostTextsOrReplacementsEqual } from 'vs/editor/contrib/inlineCompletions/browser/ghostText'; import { InlineCompletionWithUpdatedRange, InlineCompletionsSource } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource'; import { computeGhostText, singleTextEditAugments, singleTextRemoveCommonPrefix } from 'vs/editor/contrib/inlineCompletions/browser/singleTextEdit'; @@ -41,7 +42,7 @@ export enum VersionIdChangeReason { export class InlineCompletionsModel extends Disposable { private readonly _source = this._register(this._instantiationService.createInstance(InlineCompletionsSource, this.textModel, this.textModelVersionId, this._debounceValue)); - private readonly _isActive = observableValue(this, false); + private readonly _isActive = observableValue(this, false); readonly _forceUpdateExplicitlySignal = observableSignal(this); // We use a semantic id to keep the same inline completion selected even if the provider reorders the completions. @@ -54,7 +55,7 @@ export class InlineCompletionsModel extends Disposable { constructor( public readonly textModel: ITextModel, public readonly selectedSuggestItem: IObservable, - public readonly textModelVersionId: IObservable, + public readonly textModelVersionId: IObservable, private readonly _positions: IObservable, private readonly _debounceValue: IFeatureDebounceInformation, private readonly _suggestPreviewEnabled: IObservable, @@ -91,6 +92,13 @@ export class InlineCompletionsModel extends Disposable { VersionIdChangeReason.AcceptWord, ]); + private _getReason(e: IModelContentChangedEvent | undefined): VersionIdChangeReason { + if (e?.isUndoing) { return VersionIdChangeReason.Undo; } + if (e?.isRedoing) { return VersionIdChangeReason.Redo; } + if (this.isAcceptingPartially) { return VersionIdChangeReason.AcceptWord; } + return VersionIdChangeReason.Other; + } + private readonly _fetchInlineCompletionsPromise = derivedHandleChanges({ owner: this, createEmptyChangeSummary: () => ({ @@ -99,7 +107,7 @@ export class InlineCompletionsModel extends Disposable { }), handleChange: (ctx, changeSummary) => { /** @description fetch inline completions */ - if (ctx.didChange(this.textModelVersionId) && this._preserveCurrentCompletionReasons.has(ctx.change)) { + if (ctx.didChange(this.textModelVersionId) && this._preserveCurrentCompletionReasons.has(this._getReason(ctx.change))) { changeSummary.preserveCurrentCompletion = true; } else if (ctx.didChange(this._forceUpdateExplicitlySignal)) { changeSummary.inlineCompletionTriggerKind = InlineCompletionTriggerKind.Explicit; diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource.ts index 32b77dd23fe5e..1eb06aa11c1f0 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource.ts @@ -27,7 +27,7 @@ export class InlineCompletionsSource extends Disposable { constructor( private readonly textModel: ITextModel, - private readonly versionId: IObservable, + private readonly versionId: IObservable, private readonly _debounceValue: IFeatureDebounceInformation, @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService, @@ -62,7 +62,7 @@ export class InlineCompletionsSource extends Disposable { await wait(this._debounceValue.get(this.textModel), source.token); } - if (source.token.isCancellationRequested || this.textModel.getVersionId() !== request.versionId) { + if (source.token.isCancellationRequested || this._store.isDisposed || this.textModel.getVersionId() !== request.versionId) { return false; } @@ -76,7 +76,7 @@ export class InlineCompletionsSource extends Disposable { this.languageConfigurationService ); - if (source.token.isCancellationRequested || this.textModel.getVersionId() !== request.versionId) { + if (source.token.isCancellationRequested || this._store.isDisposed || this.textModel.getVersionId() !== request.versionId) { return false; } @@ -182,7 +182,7 @@ export class UpToDateInlineCompletions implements IDisposable { private readonly inlineCompletionProviderResult: InlineCompletionProviderResult, public readonly request: UpdateRequest, private readonly _textModel: ITextModel, - private readonly _versionId: IObservable, + private readonly _versionId: IObservable, ) { const ids = _textModel.deltaDecorations([], inlineCompletionProviderResult.completions.map(i => ({ range: i.range, @@ -254,7 +254,7 @@ export class InlineCompletionWithUpdatedRange { public readonly inlineCompletion: InlineCompletionItem, public readonly decorationId: string, private readonly _textModel: ITextModel, - private readonly _modelVersion: IObservable, + private readonly _modelVersion: IObservable, ) { } diff --git a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts index 95d135ce324e5..daf73173ef438 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts @@ -3,39 +3,36 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event } from 'vs/base/common/event'; +import { compareBy, numberComparator } from 'vs/base/common/arrays'; +import { findFirstMax } from 'vs/base/common/arraysFind'; +import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; +import { SingleTextEdit } from 'vs/editor/common/core/textEdit'; import { CompletionItemInsertTextRule, CompletionItemKind, SelectedSuggestionInfo } from 'vs/editor/common/languages'; +import { ITextModel } from 'vs/editor/common/model'; +import { singleTextEditAugments, singleTextRemoveCommonPrefix } from 'vs/editor/contrib/inlineCompletions/browser/singleTextEdit'; import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession'; import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; -import { IObservable, ITransaction, observableValue, transaction } from 'vs/base/common/observable'; -import { SingleTextEdit } from 'vs/editor/common/core/textEdit'; -import { ITextModel } from 'vs/editor/common/model'; -import { compareBy, numberComparator } from 'vs/base/common/arrays'; -import { findFirstMax } from 'vs/base/common/arraysFind'; -import { singleTextEditAugments, singleTextRemoveCommonPrefix } from 'vs/editor/contrib/inlineCompletions/browser/singleTextEdit'; export class SuggestWidgetAdaptor extends Disposable { private isSuggestWidgetVisible: boolean = false; private isShiftKeyPressed = false; private _isActive = false; private _currentSuggestItemInfo: SuggestItemInfo | undefined = undefined; - - private readonly _selectedItem = observableValue(this, undefined as SuggestItemInfo | undefined); - - public get selectedItem(): IObservable { - return this._selectedItem; + public get selectedItem(): SuggestItemInfo | undefined { + return this._currentSuggestItemInfo; } + private _onDidSelectedItemChange = this._register(new Emitter()); + public readonly onDidSelectedItemChange: Event = this._onDidSelectedItemChange.event; constructor( private readonly editor: ICodeEditor, private readonly suggestControllerPreselector: () => SingleTextEdit | undefined, - private readonly checkModelVersion: (tx: ITransaction) => void, private readonly onWillAccept: (item: SuggestItemInfo) => void, ) { super(); @@ -59,8 +56,6 @@ export class SuggestWidgetAdaptor extends Disposable { this._register(suggestController.registerSelector({ priority: 100, select: (model, pos, suggestItems) => { - transaction(tx => this.checkModelVersion(tx)); - const textModel = this.editor.getModel(); if (!textModel) { // Should not happen @@ -142,11 +137,7 @@ export class SuggestWidgetAdaptor extends Disposable { this._isActive = newActive; this._currentSuggestItemInfo = newInlineCompletion; - transaction(tx => { - /** @description Update state from suggest widget */ - this.checkModelVersion(tx); - this._selectedItem.set(this._isActive ? this._currentSuggestItemInfo : undefined, tx); - }); + this._onDidSelectedItemChange.fire(); } } diff --git a/src/vs/editor/test/browser/viewModel/testViewModel.ts b/src/vs/editor/test/browser/viewModel/testViewModel.ts index fe7f0c6e2dbf9..36749b71bd667 100644 --- a/src/vs/editor/test/browser/viewModel/testViewModel.ts +++ b/src/vs/editor/test/browser/viewModel/testViewModel.ts @@ -22,6 +22,8 @@ export function testViewModel(text: string[], options: IEditorOptions, callback: const viewModel = new ViewModel(EDITOR_ID, configuration, model, monospaceLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, null!, testLanguageConfigurationService, new TestThemeService(), { setVisibleLines(visibleLines, stabilized) { }, + }, { + batchChanges: (cb) => cb(), }); callback(viewModel, model); diff --git a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts new file mode 100644 index 0000000000000..b2f5eb36cbb98 --- /dev/null +++ b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts @@ -0,0 +1,209 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { IObservable, derivedHandleChanges } from 'vs/base/common/observable'; +import { testingClearObservableNamingCache } from 'vs/base/common/observableInternal/debugName'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { obsCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { Position } from 'vs/editor/common/core/position'; +import { Range } from 'vs/editor/common/core/range'; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; +import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; + +suite('CodeEditorWidget', () => { + + ensureNoDisposablesAreLeakedInTestSuite(); + + function withTestFixture(cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void) { + withEditorSetupTestFixture(undefined, cb); + } + + function withEditorSetupTestFixture( + preSetupCallback: ((editor: ICodeEditor, disposables: DisposableStore) => void) | undefined, + cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void, + ) { + testingClearObservableNamingCache(); + withTestCodeEditor('hello world', {}, (editor, viewModel) => { + + const disposables = new DisposableStore(); + + preSetupCallback?.(editor, disposables); + + const obsEditor = obsCodeEditor(editor); + + const log = new Log(); + + const derived = derivedHandleChanges({ + createEmptyChangeSummary: () => undefined, + handleChange: (context, changeSummary) => { + const formattedChange = JSON.stringify( + context.change, + (key, value) => { + if (value instanceof Range) { + return value.toString(); + } + if (value === false || Array.isArray(value) && value.length === 0) { return undefined; } + return value; + } + ); + log.log(`handle change ${context.changedObservable.toString()} ${formattedChange}`); + return true; + }, + }, reader => { + const versionId = obsEditor.versionId.read(reader); + const selection = obsEditor.selections.read(reader)?.map(s => s.toString()).join(', '); + obsEditor.onDidType.read(reader); + + const str = `running derived -> selection: ${selection}, value: ${versionId}`; + log.log(str); + return str; + }); + + derived.recomputeInitiallyAndOnChange(disposables); + + assert.deepStrictEqual(log.getAndClearEntries(), (["running derived -> selection: [1,1 -> 1,1], value: 1"])); + + cb({ editor, viewModel, log, derived }); + + disposables.dispose(); + }); + } + + test('setPosition', () => withTestFixture(({ editor, log }) => { + editor.setPosition(new Position(1, 2)); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change ObservableCodeEditor._selections: [1,2 -> 1,2] {"selection":"[1,2 -> 1,2]","modelVersionId":1,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"api","reason":0}', + "running derived -> selection: [1,2 -> 1,2], value: 1", + ]); + })); + + test('keyboard.type', () => withTestFixture(({ editor, log }) => { + editor.trigger('keyboard', 'type', { text: 'abc' }); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change ObservableCodeEditor.onDidType "abc"', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change ObservableCodeEditor._selections: [1,4 -> 1,4] {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived -> selection: [1,4 -> 1,4], value: 4", + ]); + })); + + test('keyboard.type and set position', () => withTestFixture(({ editor, log }) => { + editor.trigger('keyboard', 'type', { text: 'abc' }); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change ObservableCodeEditor.onDidType "abc"', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change ObservableCodeEditor._selections: [1,4 -> 1,4] {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived -> selection: [1,4 -> 1,4], value: 4", + ]); + + editor.setPosition(new Position(1, 5), 'test'); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change ObservableCodeEditor._selections: [1,5 -> 1,5] {"selection":"[1,5 -> 1,5]","modelVersionId":4,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":4,"source":"test","reason":0}', + "running derived -> selection: [1,5 -> 1,5], value: 4", + ]); + })); + + test('listener interaction', () => { + let derived: IObservable; + let log: Log; + let force = false; + withEditorSetupTestFixture( + (editor, disposables) => { + disposables.add(editor.onDidChangeModelContent(() => { + if (force) { + log.log('>>> before forceUpdate'); + obsCodeEditor(editor).forceUpdate(); + } + log.log('>>> before get'); + derived.get(); + log.log('<<< after get'); + })); + }, + (args) => { + const editor = args.editor; + derived = args.derived; + log = args.log; + + editor.trigger("keyboard", "type", { text: "a" }); + assert.deepStrictEqual(log.getAndClearEntries(), [ + ">>> before get", + "<<< after get", + 'handle change ObservableCodeEditor.onDidType "a"', + 'handle change ObservableCodeEditor._versionId: 2 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change ObservableCodeEditor._selections: [1,2 -> 1,2] {"selection":"[1,2 -> 1,2]","modelVersionId":2,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived -> selection: [1,2 -> 1,2], value: 2", + ]); + + editor.executeEdits(undefined, [ + { range: new Range(1, 1, 1, 1), text: "x" }, + ]); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + ">>> before get", + "<<< after get", + 'handle change ObservableCodeEditor._versionId: 3 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":3}', + 'handle change ObservableCodeEditor._selections: [1,3 -> 1,3] {"selection":"[1,3 -> 1,3]","modelVersionId":3,"oldSelections":["[1,2 -> 1,2]"],"oldModelVersionId":3,"source":"modelChange","reason":2}', + "running derived -> selection: [1,3 -> 1,3], value: 3", + ]); + + force = true; + + editor.trigger("keyboard", "type", { text: "a" }); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + ">>> before forceUpdate", + ">>> before get", + "handle change ObservableCodeEditor._versionId: 4 undefined", + "running derived -> selection: [1,4 -> 1,4], value: 4", + "<<< after get", + 'handle change ObservableCodeEditor.onDidType "a"', + 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"a","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change ObservableCodeEditor._selections: [1,4 -> 1,4] {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,3 -> 1,3]"],"oldModelVersionId":3,"source":"keyboard","reason":0}', + "running derived -> selection: [1,4 -> 1,4], value: 4", + ]); + + editor.executeEdits(undefined, [ + { range: new Range(1, 1, 1, 1), text: "x" }, + ]); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + ">>> before forceUpdate", + ">>> before get", + "handle change ObservableCodeEditor._versionId: 5 undefined", + "running derived -> selection: [1,5 -> 1,5], value: 5", + "<<< after get", + 'handle change ObservableCodeEditor._versionId: 5 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":5}', + 'handle change ObservableCodeEditor._selections: [1,5 -> 1,5] {"selection":"[1,5 -> 1,5]","modelVersionId":5,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":5,"source":"modelChange","reason":2}', + "running derived -> selection: [1,5 -> 1,5], value: 5", + ]); + + } + ); + }); +}); + +class Log { + private readonly entries: string[] = []; + public log(message: string): void { + this.entries.push(message); + } + + public getAndClearEntries(): string[] { + const entries = [...this.entries]; + this.entries.length = 0; + return entries; + } +} From 7e64cba5a19e8b084a10cff72b21fab4abb96d5c Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 4 Jun 2024 17:03:16 +0200 Subject: [PATCH 053/755] Fixes #214049 --- .../diffEditorViewZones.ts | 8 +++--- .../editor/test/node/diffing/fixtures.test.ts | 2 +- .../node/diffing/fixtures/issue-214049/1.txt | 2 ++ .../node/diffing/fixtures/issue-214049/2.txt | 3 +++ .../issue-214049/advanced.expected.diff.json | 26 +++++++++++++++++++ .../issue-214049/legacy.expected.diff.json | 17 ++++++++++++ 6 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/vs/editor/test/node/diffing/fixtures/issue-214049/1.txt create mode 100644 src/vs/editor/test/node/diffing/fixtures/issue-214049/2.txt create mode 100644 src/vs/editor/test/node/diffing/fixtures/issue-214049/advanced.expected.diff.json create mode 100644 src/vs/editor/test/node/diffing/fixtures/issue-214049/legacy.expected.diff.json diff --git a/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts b/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts index 23a75bac47d12..d7c6be3e3a48f 100644 --- a/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts +++ b/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts @@ -525,13 +525,15 @@ function computeRangeAlignment( let lastModLineNumber = c.modified.startLineNumber; let lastOrigLineNumber = c.original.startLineNumber; - function emitAlignment(origLineNumberExclusive: number, modLineNumberExclusive: number) { + function emitAlignment(origLineNumberExclusive: number, modLineNumberExclusive: number, forceAlignment = false) { if (origLineNumberExclusive < lastOrigLineNumber || modLineNumberExclusive < lastModLineNumber) { return; } if (first) { first = false; - } else if (origLineNumberExclusive === lastOrigLineNumber || modLineNumberExclusive === lastModLineNumber) { + } else if (!forceAlignment && (origLineNumberExclusive === lastOrigLineNumber || modLineNumberExclusive === lastModLineNumber)) { + // This causes a re-alignment of an already aligned line. + // However, we don't care for the final alignment. return; } const originalRange = new LineRange(lastOrigLineNumber, origLineNumberExclusive); @@ -575,7 +577,7 @@ function computeRangeAlignment( } } - emitAlignment(c.original.endLineNumberExclusive, c.modified.endLineNumberExclusive); + emitAlignment(c.original.endLineNumberExclusive, c.modified.endLineNumberExclusive, true); lastOriginalLineNumber = c.original.endLineNumberExclusive; lastModifiedLineNumber = c.modified.endLineNumberExclusive; diff --git a/src/vs/editor/test/node/diffing/fixtures.test.ts b/src/vs/editor/test/node/diffing/fixtures.test.ts index 6a1cb32540948..901ed758ff1f9 100644 --- a/src/vs/editor/test/node/diffing/fixtures.test.ts +++ b/src/vs/editor/test/node/diffing/fixtures.test.ts @@ -123,7 +123,7 @@ suite('diffing fixtures', () => { } test(`test`, () => { - runTest('shifting-twice', 'advanced'); + runTest('issue-214049', 'advanced'); }); for (const folder of folders) { diff --git a/src/vs/editor/test/node/diffing/fixtures/issue-214049/1.txt b/src/vs/editor/test/node/diffing/fixtures/issue-214049/1.txt new file mode 100644 index 0000000000000..db510b7563551 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/issue-214049/1.txt @@ -0,0 +1,2 @@ +hello world; +y \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/issue-214049/2.txt b/src/vs/editor/test/node/diffing/fixtures/issue-214049/2.txt new file mode 100644 index 0000000000000..0dc735e1c5ac9 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/issue-214049/2.txt @@ -0,0 +1,3 @@ +hello world; +// new line +y \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/issue-214049/advanced.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/issue-214049/advanced.expected.diff.json new file mode 100644 index 0000000000000..181c78999fa59 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/issue-214049/advanced.expected.diff.json @@ -0,0 +1,26 @@ +{ + "diffs": [ + { + "innerChanges": [ + { + "modifiedRange": "[1,13 -> 1,13 EOL]", + "originalRange": "[1,13 -> 1,14 EOL]" + }, + { + "modifiedRange": "[2,1 -> 3,1]", + "originalRange": "[2,1 -> 2,1]" + } + ], + "modifiedRange": "[1,3)", + "originalRange": "[1,2)" + } + ], + "modified": { + "content": "hello world;\n// new line\ny", + "fileName": "./2.txt" + }, + "original": { + "content": "hello world; \ny", + "fileName": "./1.txt" + } +} diff --git a/src/vs/editor/test/node/diffing/fixtures/issue-214049/legacy.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/issue-214049/legacy.expected.diff.json new file mode 100644 index 0000000000000..727c2e8eb55f6 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/issue-214049/legacy.expected.diff.json @@ -0,0 +1,17 @@ +{ + "original": { + "content": "hello world; \ny", + "fileName": "./1.txt" + }, + "modified": { + "content": "hello world;\n// new line\ny", + "fileName": "./2.txt" + }, + "diffs": [ + { + "originalRange": "[1,2)", + "modifiedRange": "[1,3)", + "innerChanges": null + } + ] +} \ No newline at end of file From aef8e26d88f37dd2fcfbb6652d58504fa6028950 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 09:57:17 -0700 Subject: [PATCH 054/755] serve-web: fix `SECRET_KEY_MINT_PATH` does not honour `server-base-path` (#214250) Fixes #212369 --- cli/src/commands/serve_web.rs | 55 ++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/cli/src/commands/serve_web.rs b/cli/src/commands/serve_web.rs index fba927234260a..12c0cdafec908 100644 --- a/cli/src/commands/serve_web.rs +++ b/cli/src/commands/serve_web.rs @@ -12,7 +12,6 @@ use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; -use const_format::concatcp; use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request, Response, Server}; use tokio::io::{AsyncBufReadExt, BufReader}; @@ -56,16 +55,9 @@ const RELEASE_CACHE_SECS: u64 = 60 * 60; /// Number of bytes for the secret keys. See workbench.ts for their usage. const SECRET_KEY_BYTES: usize = 32; /// Path to mint the key combining server and client parts. -const SECRET_KEY_MINT_PATH: &str = "/_vscode-cli/mint-key"; +const SECRET_KEY_MINT_PATH: &str = "_vscode-cli/mint-key"; /// Cookie set to the `SECRET_KEY_MINT_PATH` const PATH_COOKIE_NAME: &str = "vscode-secret-key-path"; -/// Cookie set to the `SECRET_KEY_MINT_PATH` -const PATH_COOKIE_VALUE: &str = concatcp!( - PATH_COOKIE_NAME, - "=", - SECRET_KEY_MINT_PATH, - "; SameSite=Strict; Path=/" -); /// HTTP-only cookie where the client's secret half is stored. const SECRET_KEY_COOKIE_NAME: &str = "vscode-cli-secret-half"; @@ -158,17 +150,22 @@ struct HandleContext { /// Handler function for an inbound request async fn handle(ctx: HandleContext, req: Request) -> Result, Infallible> { let client_key_half = get_client_key_half(&req); - let mut res = match req.uri().path() { - SECRET_KEY_MINT_PATH => handle_secret_mint(ctx, req), - _ => handle_proxied(ctx, req).await, + let path = req.uri().path(); + + let mut res = if path.starts_with(&ctx.cm.base_path) + && path.get(ctx.cm.base_path.len()..).unwrap_or_default() == SECRET_KEY_MINT_PATH + { + handle_secret_mint(&ctx, req) + } else { + handle_proxied(&ctx, req).await }; - append_secret_headers(&mut res, &client_key_half); + append_secret_headers(&ctx.cm.base_path, &mut res, &client_key_half); Ok(res) } -async fn handle_proxied(ctx: HandleContext, req: Request) -> Response { +async fn handle_proxied(ctx: &HandleContext, req: Request) -> Response { let release = if let Some((r, _)) = get_release_from_path(req.uri().path(), ctx.cm.platform) { r } else { @@ -194,7 +191,7 @@ async fn handle_proxied(ctx: HandleContext, req: Request) -> Response) -> Response { +fn handle_secret_mint(ctx: &HandleContext, req: Request) -> Response { use sha2::{Digest, Sha256}; let mut hasher = Sha256::new(); @@ -208,11 +205,20 @@ fn handle_secret_mint(ctx: HandleContext, req: Request) -> Response /// Appends headers to response to maintain the secret storage of the workbench: /// sets the `PATH_COOKIE_VALUE` so workbench.ts knows about the 'mint' endpoint, /// and maintains the http-only cookie the client will use for cookies. -fn append_secret_headers(res: &mut Response, client_key_half: &SecretKeyPart) { +fn append_secret_headers( + base_path: &str, + res: &mut Response, + client_key_half: &SecretKeyPart, +) { let headers = res.headers_mut(); headers.append( hyper::header::SET_COOKIE, - PATH_COOKIE_VALUE.parse().unwrap(), + format!( + "{}={}{}; SameSite=Strict; Path=/", + PATH_COOKIE_NAME, base_path, SECRET_KEY_MINT_PATH, + ) + .parse() + .unwrap(), ); headers.append( hyper::header::SET_COOKIE, @@ -496,6 +502,8 @@ struct ConnectionManager { pub platform: Platform, pub log: log::Logger, args: ServeWebArgs, + /// Server base path, ending in `/` + base_path: String, /// Cache where servers are stored cache: DownloadCache, /// Mapping of (Quality, Commit) to the state each server is in @@ -510,11 +518,24 @@ fn key_for_release(release: &Release) -> (Quality, String) { (release.quality, release.commit.clone()) } +fn normalize_base_path(p: &str) -> String { + let p = p.trim_matches('/'); + + if p.is_empty() { + return "/".to_string(); + } + + format!("/{}/", p.trim_matches('/')) +} + impl ConnectionManager { pub fn new(ctx: &CommandContext, platform: Platform, args: ServeWebArgs) -> Arc { + let base_path = normalize_base_path(args.server_base_path.as_deref().unwrap_or_default()); + Arc::new(Self { platform, args, + base_path, log: ctx.log.clone(), cache: DownloadCache::new(ctx.paths.web_server_storage()), update_service: UpdateService::new( From 04a79b6ea66ba2d797bb3249aae289afe9ad1977 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 4 Jun 2024 10:00:49 -0700 Subject: [PATCH 055/755] Add API proposal to reveal a comment thread (#214251) Fixes #167253 --- src/vs/editor/common/languages.ts | 5 +++ src/vs/monaco.d.ts | 5 +++ .../api/browser/mainThreadComments.ts | 23 ++++++++++++- .../workbench/api/common/extHost.protocol.ts | 1 + .../workbench/api/common/extHostComments.ts | 6 ++++ .../comments/browser/commentsController.ts | 9 ++++-- .../common/extensionsApiProposals.ts | 1 + .../vscode.proposed.commentReveal.d.ts | 32 +++++++++++++++++++ .../vscode.proposed.fileComments.d.ts | 3 ++ 9 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 src/vscode-dts/vscode.proposed.commentReveal.d.ts diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 68fbf632fb4cf..018258e559d45 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -1847,6 +1847,11 @@ export interface CommentInput { uri: URI; } +export interface CommentThreadRevealOptions { + preserveFocus: boolean; + focusReply: boolean; +} + /** * @internal */ diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index ba936cd9e8272..a05b9885c8416 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -7939,6 +7939,11 @@ declare namespace monaco.languages { arguments?: any[]; } + export interface CommentThreadRevealOptions { + preserveFocus: boolean; + focusReply: boolean; + } + export interface CommentAuthorInformation { name: string; iconPath?: UriComponents; diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 4eb6385cbed35..2e342290e96a6 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -27,6 +27,10 @@ import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { Schemas } from 'vs/base/common/network'; import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; import { MarshalledCommentThread } from 'vs/workbench/common/comments'; +import { revealCommentThread } from 'vs/workbench/contrib/comments/browser/commentsController'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { CommentThreadRevealOptions } from 'vs/editor/common/languages'; export class MainThreadCommentThread implements languages.CommentThread { private _input?: languages.CommentInput; @@ -520,7 +524,9 @@ export class MainThreadComments extends Disposable implements MainThreadComments extHostContext: IExtHostContext, @ICommentService private readonly _commentService: ICommentService, @IViewsService private readonly _viewsService: IViewsService, - @IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService + @IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService, + @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService, + @IEditorService private readonly _editorService: IEditorService ) { super(); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostComments); @@ -631,6 +637,21 @@ export class MainThreadComments extends Disposable implements MainThreadComments provider.updateCommentingRanges(resourceHints); } + async $revealCommentThread(handle: number, commentThreadHandle: number, options: CommentThreadRevealOptions): Promise { + const provider = this._commentControllers.get(handle); + + if (!provider) { + return Promise.resolve(); + } + + const thread = provider.getAllComments().find(thread => thread.commentThreadHandle === commentThreadHandle); + if (!thread || !thread.isDocumentCommentThread()) { + return Promise.resolve(); + } + + revealCommentThread(this._commentService, this._editorService, this._uriIdentityService, thread, undefined, options.focusReply, undefined, options.preserveFocus); + } + private registerView(commentsViewAlreadyRegistered: boolean) { if (!commentsViewAlreadyRegistered) { const VIEW_CONTAINER: ViewContainer = Registry.as(ViewExtensions.ViewContainersRegistry).registerViewContainer({ diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index a4d9cb6aa7721..bb0a38e3bf9ef 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -147,6 +147,7 @@ export interface MainThreadCommentsShape extends IDisposable { $updateCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, changes: CommentThreadChanges): void; $deleteCommentThread(handle: number, commentThreadHandle: number): void; $updateCommentingRanges(handle: number, resourceHints?: languages.CommentingRangeResourceHint): void; + $revealCommentThread(handle: number, commentThreadHandle: number, options: languages.CommentThreadRevealOptions): Promise; } export interface AuthenticationForceNewSessionOptions { diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index b3f54666152a6..fea2727292578 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -465,6 +465,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo set label(value: string | undefined) { that.label = value; }, get state(): vscode.CommentThreadState | { resolved?: vscode.CommentThreadState; applicability?: vscode.CommentThreadApplicability } | undefined { return that.state; }, set state(value: vscode.CommentThreadState | { resolved?: vscode.CommentThreadState; applicability?: vscode.CommentThreadApplicability }) { that.state = value; }, + reveal: (options?: vscode.CommentThreadRevealOptions) => that.reveal(options), dispose: () => { that.dispose(); } @@ -548,6 +549,11 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo return; } + async reveal(options?: vscode.CommentThreadRevealOptions): Promise { + checkProposedApiEnabled(this.extensionDescription, 'commentReveal'); + return proxy.$revealCommentThread(this._commentControllerHandle, this.handle, { preserveFocus: false, focusReply: false, ...options }); + } + dispose() { this._isDiposed = true; this._acceptInputDisposables.dispose(); diff --git a/src/vs/workbench/contrib/comments/browser/commentsController.ts b/src/vs/workbench/contrib/comments/browser/commentsController.ts index c55036a111dc3..8f60630a00ef1 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsController.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsController.ts @@ -430,6 +430,7 @@ export class CommentController implements IEditorContribution { private _commentingRangeSpaceReserved = false; private _commentingRangeAmountReserved = 0; private _computePromise: CancelablePromise> | null; + private _computeAndSetPromise: Promise | undefined; private _addInProgress!: boolean; private _emptyThreadsToAddQueue: [Range | undefined, IEditorMouseEvent | undefined][] = []; private _computeCommentingRangePromise!: CancelablePromise | null; @@ -645,10 +646,12 @@ export class CommentController implements IEditorContribution { return Promise.resolve([]); }); - return this._computePromise.then(async commentInfos => { + this._computeAndSetPromise = this._computePromise.then(async commentInfos => { await this.setComments(coalesce(commentInfos)); this._computePromise = null; }, error => console.log(error)); + this._computePromise.then(() => this._computeAndSetPromise = undefined); + return this._computeAndSetPromise; } private beginComputeCommentingRanges() { @@ -687,8 +690,8 @@ export class CommentController implements IEditorContribution { if (commentThreadWidget.length === 1) { commentThreadWidget[0].reveal(commentUniqueId, focus); } else if (fetchOnceIfNotExist) { - if (this._computePromise) { - this._computePromise.then(_ => { + if (this._computeAndSetPromise) { + this._computeAndSetPromise.then(_ => { this.revealCommentThread(threadId, commentUniqueId, false, focus); }); } else { diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 28cf88a67b333..dcf32109014c1 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -23,6 +23,7 @@ export const allApiProposals = Object.freeze({ codeActionRanges: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionRanges.d.ts', codiconDecoration: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codiconDecoration.d.ts', commentReactor: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentReactor.d.ts', + commentReveal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentReveal.d.ts', commentThreadApplicability: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts', commentingRangeHint: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentingRangeHint.d.ts', commentsDraftState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentsDraftState.d.ts', diff --git a/src/vscode-dts/vscode.proposed.commentReveal.d.ts b/src/vscode-dts/vscode.proposed.commentReveal.d.ts new file mode 100644 index 0000000000000..168c4691de5de --- /dev/null +++ b/src/vscode-dts/vscode.proposed.commentReveal.d.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // @alexr00 https://github.com/microsoft/vscode/issues/167253 + + /** + * Options to reveal a comment thread in an editor. + */ + export interface CommentThreadRevealOptions { + /** + * By default, the comment thread will be focused. Set `preserveFocus` to `true` to maintain the original focus. + */ + preserveFocus?: boolean; + + /** + * Focus the comment thread reply editor, if the thread supports replying. + */ + focusReply?: boolean; + } + + export interface CommentThread { + /** + * Reveal the comment thread in an editor. + */ + reveal(options?: CommentThreadRevealOptions): Thenable; + } + +} diff --git a/src/vscode-dts/vscode.proposed.fileComments.d.ts b/src/vscode-dts/vscode.proposed.fileComments.d.ts index 7370f22f762f4..e21b3abfb7af3 100644 --- a/src/vscode-dts/vscode.proposed.fileComments.d.ts +++ b/src/vscode-dts/vscode.proposed.fileComments.d.ts @@ -68,6 +68,9 @@ declare module 'vscode' { * Once disposed, this comment thread will be removed from visible editors and Comment Panel when appropriate. */ dispose(): void; + + // Part of the comment reveal proposal + reveal(options?: CommentThreadRevealOptions): Thenable; } export interface CommentController { From 6378dbe3cc366c58eddcfeb59c6c7832bca625b6 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Tue, 4 Jun 2024 10:03:08 -0700 Subject: [PATCH 056/755] dont calculate element dimensions before styles are loaded (#214249) * dont calculate element dimensions before styles are loaded * remove unused import --- .../notebook/browser/notebookEditorWidget.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 2f83ab690ff5a..01f43a3a99a93 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -1826,6 +1826,19 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return; } + const whenContainerStylesLoaded = this.layoutService.whenContainerStylesLoaded(DOM.getWindow(this.getDomNode())); + if (whenContainerStylesLoaded) { + // In floating windows, we need to ensure that the + // container is ready for us to compute certain + // layout related properties. + whenContainerStylesLoaded.then(() => this.layoutNotebook(dimension, shadowElement, position)); + } else { + this.layoutNotebook(dimension, shadowElement, position); + } + + } + + private layoutNotebook(dimension: DOM.Dimension, shadowElement?: HTMLElement, position?: DOM.IDomPosition) { if (shadowElement) { this.updateShadowElement(shadowElement, dimension, position); } From a4aa0a330d560f1f1e0e7894e9bd04a83fbd60f7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 4 Jun 2024 19:31:20 +0200 Subject: [PATCH 057/755] more profile editor improvements (#214255) --- src/vs/workbench/common/configuration.ts | 2 +- .../browser/media/userDataProfilesEditor.css | 16 +- .../browser/userDataProfile.ts | 149 +++++++++++------- .../browser/userDataProfilesEditor.ts | 35 ++-- .../browser/userDataProfilesEditorModel.ts | 48 +++++- 5 files changed, 174 insertions(+), 76 deletions(-) diff --git a/src/vs/workbench/common/configuration.ts b/src/vs/workbench/common/configuration.ts index 01b4d2b510d57..f4aff57ea8595 100644 --- a/src/vs/workbench/common/configuration.ts +++ b/src/vs/workbench/common/configuration.ts @@ -234,7 +234,7 @@ export class DynamicWorkbenchSecurityConfiguration extends Disposable implements } } -const CONFIG_NEW_WINDOW_PROFILE = 'window.newWindowProfile'; +export const CONFIG_NEW_WINDOW_PROFILE = 'window.newWindowProfile'; export class DynamicWindowConfiguration extends Disposable implements IWorkbenchContribution { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index a37be4b9d8425..c16d45512d92e 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -87,8 +87,8 @@ .profiles-editor .contents-container .profile-title-container .codicon { cursor: pointer; - font-size: x-large; - padding: 4px; + font-size: large; + padding: 6px; margin-right: 8px; } @@ -150,11 +150,11 @@ .profiles-editor .contents-container .profile-copy-from-container { display: flex; align-items: center; - margin: 0px 0px 20px 20px; + margin: 0px 0px 20px 28px; } .profiles-editor .contents-container .profile-copy-from-container > .profile-copy-from-label { - margin-right: 33px; + margin-right: 25px; display: inline-flex; align-items: center; } @@ -163,9 +163,15 @@ width: 250px; } +.profiles-editor .contents-container .profile-use-as-default-container { + display: flex; + align-items: center; + margin: 25px 20px 20px 28px; + cursor: pointer; +} + .profiles-editor .contents-container .profile-contents-container { margin: 0px 0px 10px 20px; - font-size: medium; } .profiles-editor .contents-container .profile-tree-item-container { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts index 1644a5c41b1c4..cdfb41bec612e 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts @@ -30,6 +30,7 @@ import { UserDataProfilesEditor, UserDataProfilesEditorInput, UserDataProfilesEd import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; type IProfileTemplateQuickPickItem = IQuickPickItem & IProfileTemplateInfo; @@ -123,6 +124,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements submenu: ProfilesMenu, group: '2_configuration', order: 1, + when: HAS_PROFILES_CONTEXT, }); MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { get title() { @@ -131,61 +133,19 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements submenu: ProfilesMenu, group: '2_configuration', order: 1, - when: PROFILES_ENABLEMENT_CONTEXT, + when: HAS_PROFILES_CONTEXT, }); } - private registerManageProfilesAction(): IDisposable { - const disposables = new DisposableStore(); - const when = ContextKeyExpr.equals('config.workbench.experimental.enableNewProfilesUI', true); - disposables.add(registerAction2(class ManageProfilesAction extends Action2 { - constructor() { - super({ - id: `workbench.profiles.actions.manageProfiles`, - title: { - ...localize2('manage profiles', "Profiles"), - mnemonicTitle: localize({ key: 'miOpenProfiles', comment: ['&& denotes a mnemonic'] }, "&&Profiles"), - }, - menu: [ - { - id: MenuId.GlobalActivity, - group: '2_configuration', - when, - order: 1 - }, - { - id: MenuId.MenubarPreferencesMenu, - group: '2_configuration', - when, - order: 1 - } - ] - }); - } - run(accessor: ServicesAccessor) { - const editorGroupsService = accessor.get(IEditorGroupsService); - const instantiationService = accessor.get(IInstantiationService); - return editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(instantiationService)); - } - })); - disposables.add(MenuRegistry.appendMenuItem(MenuId.CommandPalette, { - command: { - id: 'workbench.profiles.actions.manageProfiles', - category: Categories.Preferences, - title: localize2('open profiles', "Open Profiles (UI)"), - precondition: when, - }, - })); - - return disposables; - } - private readonly profilesDisposable = this._register(new MutableDisposable()); private registerProfilesActions(): void { this.profilesDisposable.value = new DisposableStore(); for (const profile of this.userDataProfilesService.profiles) { if (!profile.isTransient) { this.profilesDisposable.value.add(this.registerProfileEntryAction(profile)); + if (!profile.isDefault) { + this.profilesDisposable.value.add(this.registerNewWindowAction(profile)); + } } } } @@ -228,6 +188,31 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements }); } + private registerNewWindowAction(profile: IUserDataProfile): IDisposable { + return registerAction2(class NewWindowAction extends Action2 { + + constructor() { + super({ + id: `workbench.action.${profile.name.toLowerCase().replace('/\s+/', '_')}.newWindow`, + title: { + ...localize2('newWindow', "New {0} Window", profile.name), + }, + f1: true, + menu: { + id: MenuId.MenubarFileMenu, + group: '1_new', + order: 4 + } + }); + } + + override run(accessor: ServicesAccessor): Promise { + const hostService = accessor.get(IHostService); + return hostService.openWindow({ remoteAuthority: null, forceProfile: profile.name }); + } + }); + } + private registerSwitchProfileAction(): IDisposable { return registerAction2(class SwitchProfileAction extends Action2 { constructor() { @@ -268,21 +253,73 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements this.currentprofileActionsDisposable.value.add(this.registerImportProfileAction()); } + private registerManageProfilesAction(): IDisposable { + const disposables = new DisposableStore(); + const precondition = ContextKeyExpr.equals('config.workbench.experimental.enableNewProfilesUI', true); + disposables.add(registerAction2(class ManageProfilesAction extends Action2 { + constructor() { + super({ + id: `workbench.profiles.actions.manageProfiles`, + title: { + ...localize2('manage profiles', "Profiles"), + mnemonicTitle: localize({ key: 'miOpenProfiles', comment: ['&& denotes a mnemonic'] }, "&&Profiles"), + }, + menu: [ + { + id: ProfilesMenu, + group: '2_manage_current', + when: precondition, + order: 1 + }, + { + id: MenuId.GlobalActivity, + group: '2_configuration', + order: 1, + when: ContextKeyExpr.and(HAS_PROFILES_CONTEXT.negate(), precondition), + }, + { + id: MenuId.MenubarPreferencesMenu, + group: '2_configuration', + order: 1, + when: ContextKeyExpr.and(HAS_PROFILES_CONTEXT.negate(), precondition), + }, + ] + }); + } + run(accessor: ServicesAccessor) { + const editorGroupsService = accessor.get(IEditorGroupsService); + const instantiationService = accessor.get(IInstantiationService); + return editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(instantiationService)); + } + })); + disposables.add(MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: 'workbench.profiles.actions.manageProfiles', + category: Categories.Preferences, + title: localize2('open profiles', "Open Profiles (UI)"), + precondition: precondition, + }, + })); + + return disposables; + } + + private registerEditCurrentProfileAction(): IDisposable { const that = this; return registerAction2(class RenameCurrentProfileAction extends Action2 { constructor() { - const when = ContextKeyExpr.and(ContextKeyExpr.notEquals(CURRENT_PROFILE_CONTEXT.key, that.userDataProfilesService.defaultProfile.id), IS_CURRENT_PROFILE_TRANSIENT_CONTEXT.toNegated()); + const precondition = ContextKeyExpr.and(ContextKeyExpr.notEquals(CURRENT_PROFILE_CONTEXT.key, that.userDataProfilesService.defaultProfile.id), IS_CURRENT_PROFILE_TRANSIENT_CONTEXT.toNegated()); super({ id: `workbench.profiles.actions.editCurrentProfile`, title: localize2('edit profile', "Edit Profile..."), - precondition: when, + precondition: precondition, f1: true, menu: [ { id: ProfilesMenu, group: '2_manage_current', - when, + when: ContextKeyExpr.and(precondition, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), order: 2 } ] @@ -306,9 +343,8 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements { id: ProfilesMenu, group: '2_manage_current', - order: 3 - }, { - id: MenuId.CommandPalette + order: 3, + when: ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true) } ] }); @@ -336,7 +372,8 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements { id: ProfilesMenu, group: '4_import_export_profiles', - order: 1 + order: 1, + when: ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true), }, { id: MenuId.CommandPalette } @@ -374,7 +411,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements { id: ProfilesMenu, group: '4_import_export_profiles', - when: PROFILES_ENABLEMENT_CONTEXT, + when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), order: 2 }, { id: MenuId.CommandPalette, @@ -495,7 +532,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements { id: ProfilesMenu, group: '3_manage_profiles', - when: PROFILES_ENABLEMENT_CONTEXT, + when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), order: 1 } ] @@ -521,7 +558,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements { id: ProfilesMenu, group: '3_manage_profiles', - when: PROFILES_ENABLEMENT_CONTEXT, + when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), order: 2 } ] diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 80be141258f48..f236412049a42 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -366,11 +366,7 @@ class ProfileElementRenderer implements IListRenderer { @@ -402,6 +398,8 @@ class ProfileWidget extends Disposable { private readonly toolbar: WorkbenchToolBar; private readonly buttonContainer: HTMLElement; private readonly iconElement: HTMLElement; + private readonly useAsDefaultProfileContainer: HTMLElement; + private readonly useAsDefaultProfileCheckbox: Checkbox; private readonly nameInput: InputBox; private readonly copyFromContainer: HTMLElement; private readonly copyFromSelectBox: SelectBox; @@ -485,7 +483,7 @@ class ProfileWidget extends Disposable { const body = append(parent, $('.profile-body')); this.copyFromContainer = append(body, $('.profile-copy-from-container')); - append(this.copyFromContainer, $('.profile-copy-from-label', undefined, localize('create from', "Copy from:"))); + append(this.copyFromContainer, $('.profile-copy-from-label', undefined, localize('create from', "Copy from"))); this.copyFromSelectBox = this._register(this.instantiationService.createInstance(SelectBox, [], 0, @@ -498,8 +496,21 @@ class ProfileWidget extends Disposable { )); this.copyFromSelectBox.render(append(this.copyFromContainer, $('.profile-select-container'))); - const contentsContainer = append(body, $('.profile-contents-container')); - append(contentsContainer, $('.profile-contents-label', undefined, localize('contents', "Contents"))); + this.useAsDefaultProfileContainer = append(body, $('.profile-use-as-default-container')); + const useAsDefaultProfileTitle = localize('enable for new windows', "Enable this profile for new windows"); + this.useAsDefaultProfileCheckbox = this._register(new Checkbox(useAsDefaultProfileTitle, false, defaultCheckboxStyles)); + append(this.useAsDefaultProfileContainer, this.useAsDefaultProfileCheckbox.domNode); + const useAsDefaultProfileLabel = append(this.useAsDefaultProfileContainer, $('.profile-use-as-default-label', undefined, useAsDefaultProfileTitle)); + this._register(this.useAsDefaultProfileCheckbox.onChange(() => { + if (this._profileElement.value?.element instanceof UserDataProfileElement) { + this._profileElement.value.element.toggleNewWindowProfile(); + } + })); + this._register(addDisposableListener(useAsDefaultProfileLabel, EventType.CLICK, () => { + if (this._profileElement.value?.element instanceof UserDataProfileElement) { + this._profileElement.value.element.toggleNewWindowProfile(); + } + })); const delegate = new ProfileResourceTreeElementDelegate(); this.resourcesTree = this._register(this.instantiationService.createInstance(WorkbenchAsyncDataTree, @@ -540,7 +551,7 @@ class ProfileWidget extends Disposable { expandOnlyOnTwistieClick: true, renderIndentGuides: RenderIndentGuides.None, enableStickyScroll: false, - collapseByDefault: () => false + openOnSingleClick: false })); this._register(this.resourcesTree.onDidOpen(async (e) => { if (!e.browserEvent) { @@ -648,7 +659,6 @@ class ProfileWidget extends Disposable { const profile = profileElement instanceof UserDataProfileElement ? profileElement.profile : undefined; this.profileTitle.classList.toggle('hide', !profile?.isDefault); this.nameInput.element.classList.toggle('hide', !!profile?.isDefault); - this.iconElement.classList.toggle('hide', !!profile?.isDefault); this.resourcesTree.setInput(profileElement); disposables.add(profileElement.onDidChange(e => { @@ -725,6 +735,7 @@ class ProfileWidget extends Disposable { this.iconElement.className = ThemeIcon.asClassName(ThemeIcon.fromId(DEFAULT_ICON.id)); } if (profileElement instanceof NewProfileElement) { + this.useAsDefaultProfileContainer.classList.add('hide'); this.copyFromContainer.classList.remove('hide'); const id = profileElement.copyFrom instanceof URI ? profileElement.copyFrom.toString() : profileElement.copyFrom?.id; const index = id @@ -738,7 +749,9 @@ class ProfileWidget extends Disposable { this.copyFromSelectBox.setOptions([{ text: basename(profileElement.copyFrom as URI) }]); this.copyFromSelectBox.setEnabled(false); } - } else { + } else if (profileElement instanceof UserDataProfileElement) { + this.useAsDefaultProfileContainer.classList.remove('hide'); + this.useAsDefaultProfileCheckbox.checked = profileElement.isNewWindowProfile; this.copyFromContainer.classList.add('hide'); } } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 02347c6845c23..f4a5c42a76b4e 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -32,6 +32,8 @@ import { ITreeItemCheckboxState } from 'vs/workbench/common/views'; import { API_OPEN_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { CONFIG_NEW_WINDOW_PROFILE } from 'vs/workbench/common/configuration'; export type ChangeEvent = { readonly name?: boolean; @@ -43,6 +45,7 @@ export type ChangeEvent = { readonly copyFlags?: boolean; readonly preview?: boolean; readonly disabled?: boolean; + readonly newWindowProfile?: boolean; }; export interface IProfileChildElement { @@ -315,6 +318,7 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement { readonly titleActions: [IAction[], IAction[]], readonly contextMenuActions: IAction[], @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, + @IConfigurationService private readonly configurationService: IConfigurationService, @IUserDataProfileManagementService userDataProfileManagementService: IUserDataProfileManagementService, @IUserDataProfilesService userDataProfilesService: IUserDataProfilesService, @ICommandService commandService: ICommandService, @@ -330,6 +334,13 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement { commandService, instantiationService, ); + this._isNewWindowProfile = this.configurationService.getValue(CONFIG_NEW_WINDOW_PROFILE) === this.profile.name; + this._register(configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(CONFIG_NEW_WINDOW_PROFILE)) { + this.isNewWindowProfile = this.configurationService.getValue(CONFIG_NEW_WINDOW_PROFILE) === this.profile.name; + } + } + )); this._register(this.userDataProfileService.onDidChangeCurrentProfile(() => this.active = this.userDataProfileService.currentProfile.id === this.profile.id)); this._register(this.userDataProfilesService.onDidChangeProfiles(() => { const profile = this.userDataProfilesService.profiles.find(p => p.id === this.profile.id); @@ -342,6 +353,23 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement { })); } + public async toggleNewWindowProfile(): Promise { + if (this._isNewWindowProfile) { + await this.configurationService.updateValue(CONFIG_NEW_WINDOW_PROFILE, null); + } else { + await this.configurationService.updateValue(CONFIG_NEW_WINDOW_PROFILE, this.profile.name); + } + } + + private _isNewWindowProfile: boolean = false; + get isNewWindowProfile(): boolean { return this._isNewWindowProfile; } + set isNewWindowProfile(isNewWindowProfile: boolean) { + if (this._isNewWindowProfile !== isNewWindowProfile) { + this._isNewWindowProfile = isNewWindowProfile; + this._onDidChange.fire({ newWindowProfile: true }); + } + } + protected override async doSave(): Promise { await this.saveProfile(this.profile); } @@ -592,7 +620,8 @@ export class UserDataProfilesEditorModel extends EditorModel { const copyFromProfileAction = disposables.add(new Action('userDataProfile.copyFromProfile', localize('copyFromProfile', "Save As..."), ThemeIcon.asClassName(Codicon.copy), true, () => this.createNewProfile(profile))); const exportAction = disposables.add(new Action('userDataProfile.export', localize('export', "Export..."), ThemeIcon.asClassName(Codicon.export), true, () => this.exportProfile(profile))); const deleteAction = disposables.add(new Action('userDataProfile.delete', localize('delete', "Delete"), ThemeIcon.asClassName(Codicon.trash), true, () => this.removeProfile(profile))); - const newWindowAction = disposables.add(new Action('userDataProfile.newWindow', localize('new window', "New Window"), ThemeIcon.asClassName(Codicon.emptyWindow), true, () => this.openWindow(profile))); + const newWindowAction = disposables.add(new Action('userDataProfile.newWindow', localize('new window', "New {0} Window", profile.name), ThemeIcon.asClassName(Codicon.emptyWindow), true, () => this.openWindow(profile))); + const useAsNewWindowProfileAction = disposables.add(new Action('userDataProfile.useAsNewWindowProfile', localize('use as new window', "Enable for New Windows", profile.name), undefined, true, () => profileElement.toggleNewWindowProfile())); const titlePrimaryActions: IAction[] = []; titlePrimaryActions.push(copyFromProfileAction); @@ -602,11 +631,11 @@ export class UserDataProfilesEditorModel extends EditorModel { } const titleSecondaryActions: IAction[] = []; - titleSecondaryActions.push(activateAction); - titleSecondaryActions.push(newWindowAction); const secondaryActions: IAction[] = []; secondaryActions.push(activateAction); + secondaryActions.push(useAsNewWindowProfileAction); + secondaryActions.push(new Separator()); secondaryActions.push(newWindowAction); secondaryActions.push(new Separator()); secondaryActions.push(copyFromProfileAction); @@ -620,6 +649,19 @@ export class UserDataProfilesEditorModel extends EditorModel { [titlePrimaryActions, titleSecondaryActions], secondaryActions, )); + + useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile; + useAsNewWindowProfileAction.label = profileElement.isNewWindowProfile ? localize('donot use as new window', "Disable for New Windows") : localize('use as new window', "Enable for New Windows"); + + disposables.add(profileElement.onDidChange(e => { + if (e.name) { + newWindowAction.label = localize('new window', "New {0} Window", profileElement.name); + } + if (e.newWindowProfile) { + useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile; + useAsNewWindowProfileAction.label = profileElement.isNewWindowProfile ? localize('donot use as new window', "Disable for New Windows") : localize('use as new window', "Enable for New Windows"); + } + })); return [profileElement, disposables]; } From db894f6d6c8b98765b9d391fb6890bbe7e97666a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:45:33 -0700 Subject: [PATCH 058/755] Add example usage to exitCode Part of #145234 --- ...scode.proposed.terminalShellIntegration.d.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts index 9ea09344b8aae..89cc33c82bcbb 100644 --- a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts +++ b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts @@ -286,6 +286,23 @@ declare module 'vscode' { /** * The exit code reported by the shell. `undefined` means the shell did not report an exit * code or the shell reported a command started before the command finished. + * + * @example + * const execution = shellIntegration.executeCommand({ + * command: 'echo', + * args: ['Hello world'] + * }); + * window.onDidEndTerminalShellExecution(event => { + * if (event.execution === execution) { + * if (event.exitCode === undefined) { + * console.log('Command finished but exit code is unknown'); + * } else if (event.exitCode === 0) { + * console.log('Command succeeded'); + * } else { + * console.log('Command failed'); + * } + * } + * }); */ readonly exitCode: number | undefined; } From 932303ba654b880096870161c6acc110bf0ba1f6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:52:59 -0700 Subject: [PATCH 059/755] Register some listeners Part of #214234 --- .../browser/externalTerminal.contribution.ts | 4 +-- .../browser/terminalProfileResolverService.ts | 11 ++++--- .../browser/terminalProfileService.ts | 2 +- .../terminal/browser/terminalService.ts | 32 ++++++++++--------- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 6ca5f7d48f06f..3388ec7baeab4 100644 --- a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -138,11 +138,11 @@ export class ExternalTerminalContribution extends Disposable implements IWorkben MenuRegistry.appendMenuItem(MenuId.ExplorerContext, this._openInTerminalMenuItem); MenuRegistry.appendMenuItem(MenuId.ExplorerContext, this._openInIntegratedTerminalMenuItem); - this._configurationService.onDidChangeConfiguration(e => { + this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('terminal.explorerKind') || e.affectsConfiguration('terminal.external')) { this._refreshOpenInTerminalMenuItemTitle(); } - }); + })); this._refreshOpenInTerminalMenuItemTitle(); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts b/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts index 24dde378f303d..a4b662a065c97 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts @@ -22,6 +22,7 @@ import { URI } from 'vs/base/common/uri'; import { deepClone } from 'vs/base/common/objects'; import { isUriComponents } from 'vs/platform/terminal/common/terminalProfiles'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { Disposable } from 'vs/base/common/lifecycle'; export interface IProfileContextProvider { getDefaultSystemShell(remoteAuthority: string | undefined, os: OperatingSystem): Promise; @@ -34,7 +35,7 @@ const generatedProfileName = 'Generated'; * Resolves terminal shell launch config and terminal profiles for the given operating system, * environment, and user configuration. */ -export abstract class BaseTerminalProfileResolverService implements ITerminalProfileResolverService { +export abstract class BaseTerminalProfileResolverService extends Disposable implements ITerminalProfileResolverService { declare _serviceBrand: undefined; private _primaryBackendOs: OperatingSystem | undefined; @@ -54,19 +55,21 @@ export abstract class BaseTerminalProfileResolverService implements ITerminalPro private readonly _workspaceContextService: IWorkspaceContextService, private readonly _remoteAgentService: IRemoteAgentService ) { + super(); + if (this._remoteAgentService.getConnection()) { this._remoteAgentService.getEnvironment().then(env => this._primaryBackendOs = env?.os || OS); } else { this._primaryBackendOs = OS; } - this._configurationService.onDidChangeConfiguration(e => { + this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(TerminalSettingId.DefaultProfileWindows) || e.affectsConfiguration(TerminalSettingId.DefaultProfileMacOs) || e.affectsConfiguration(TerminalSettingId.DefaultProfileLinux)) { this._refreshDefaultProfileName(); } - }); - this._terminalProfileService.onDidChangeAvailableProfiles(() => this._refreshDefaultProfileName()); + })); + this._register(this._terminalProfileService.onDidChangeAvailableProfiles(() => this._refreshDefaultProfileName())); } @debounce(200) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProfileService.ts b/src/vs/workbench/contrib/terminal/browser/terminalProfileService.ts index eb3dc1c08f32f..ce5bf14c23ca2 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProfileService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProfileService.ts @@ -71,7 +71,7 @@ export class TerminalProfileService extends Disposable implements ITerminalProfi // in web, we don't want to show the dropdown unless there's a web extension // that contributes a profile - this._extensionService.onDidChangeExtensions(() => this.refreshAvailableProfiles()); + this._register(this._extensionService.onDidChangeExtensions(() => this.refreshAvailableProfiles())); this._webExtensionContributedProfileContextKey = TerminalContextKeys.webExtensionContributedProfile.bindTo(this._contextKeyService); this._updateWebContextKey(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index af9508e1b1f6e..d711f8b52683b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -285,24 +285,26 @@ export class TerminalService extends Disposable implements ITerminalService { const isPersistentRemote = !!this._environmentService.remoteAuthority && enableTerminalReconnection; - this._primaryBackend?.onDidRequestDetach(async (e) => { - const instanceToDetach = this.getInstanceFromResource(getTerminalUri(e.workspaceId, e.instanceId)); - if (instanceToDetach) { - const persistentProcessId = instanceToDetach?.persistentProcessId; - if (persistentProcessId && !instanceToDetach.shellLaunchConfig.isFeatureTerminal && !instanceToDetach.shellLaunchConfig.customPtyImplementation) { - if (instanceToDetach.target === TerminalLocation.Editor) { - this._terminalEditorService.detachInstance(instanceToDetach); + if (this._primaryBackend) { + this._register(this._primaryBackend.onDidRequestDetach(async (e) => { + const instanceToDetach = this.getInstanceFromResource(getTerminalUri(e.workspaceId, e.instanceId)); + if (instanceToDetach) { + const persistentProcessId = instanceToDetach?.persistentProcessId; + if (persistentProcessId && !instanceToDetach.shellLaunchConfig.isFeatureTerminal && !instanceToDetach.shellLaunchConfig.customPtyImplementation) { + if (instanceToDetach.target === TerminalLocation.Editor) { + this._terminalEditorService.detachInstance(instanceToDetach); + } else { + this._terminalGroupService.getGroupForInstance(instanceToDetach)?.removeInstance(instanceToDetach); + } + await instanceToDetach.detachProcessAndDispose(TerminalExitReason.User); + await this._primaryBackend?.acceptDetachInstanceReply(e.requestId, persistentProcessId); } else { - this._terminalGroupService.getGroupForInstance(instanceToDetach)?.removeInstance(instanceToDetach); + // will get rejected without a persistentProcessId to attach to + await this._primaryBackend?.acceptDetachInstanceReply(e.requestId, undefined); } - await instanceToDetach.detachProcessAndDispose(TerminalExitReason.User); - await this._primaryBackend?.acceptDetachInstanceReply(e.requestId, persistentProcessId); - } else { - // will get rejected without a persistentProcessId to attach to - await this._primaryBackend?.acceptDetachInstanceReply(e.requestId, undefined); } - } - }); + })); + } mark('code/terminal/willReconnect'); let reconnectedPromise: Promise; From 201adc0103334330a4a5a8a5106788bda5404d5b Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:59:32 -0700 Subject: [PATCH 060/755] Remove CommandDetectionCapability.hasInput Fixes #213694 --- .../common/capabilities/capabilities.ts | 5 ----- .../capabilities/commandDetectionCapability.ts | 17 ----------------- .../terminal/browser/terminalInstance.ts | 2 +- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/src/vs/platform/terminal/common/capabilities/capabilities.ts b/src/vs/platform/terminal/common/capabilities/capabilities.ts index 426de4a8ff7ec..1ffe6ff109abb 100644 --- a/src/vs/platform/terminal/common/capabilities/capabilities.ts +++ b/src/vs/platform/terminal/common/capabilities/capabilities.ts @@ -169,11 +169,6 @@ export interface ICommandDetectionCapability { readonly executingCommandObject: ITerminalCommand | undefined; /** The current cwd at the cursor's position. */ readonly cwd: string | undefined; - /** - * Whether a command is currently being input. If the a command is current not being input or - * the state cannot reliably be detected the fallback of undefined will be used. - */ - readonly hasInput: boolean | undefined; readonly currentCommand: ICurrentPartialCommand | undefined; readonly onCommandStarted: Event; readonly onCommandFinished: Event; diff --git a/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts b/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts index 8df3d3b8f4282..024c79d5c6658 100644 --- a/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts +++ b/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts @@ -56,23 +56,6 @@ export class CommandDetectionCapability extends Disposable implements ICommandDe } get cwd(): string | undefined { return this._cwd; } get promptTerminator(): string | undefined { return this._promptTerminator; } - private get _isInputting(): boolean { - return !!(this._currentCommand.commandStartMarker && !this._currentCommand.commandExecutedMarker); - } - - get hasInput(): boolean | undefined { - if (!this._isInputting || !this._currentCommand?.commandStartMarker) { - return undefined; - } - if (this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY === this._currentCommand.commandStartMarker?.line) { - const line = this._terminal.buffer.active.getLine(this._terminal.buffer.active.cursorY)?.translateToString(true, this._currentCommand.commandStartX); - if (line === undefined) { - return undefined; - } - return line.length > 0; - } - return true; - } private readonly _onCommandStarted = this._register(new Emitter()); readonly onCommandStarted = this._onCommandStarted.event; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index f7bc50614cfce..721aa7d22e3c3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -858,7 +858,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // Determine whether to send ETX (ctrl+c) before running the command. This should always // happen unless command detection can reliably say that a command is being entered and // there is no content in the prompt - if (commandDetection?.hasInput !== false) { + if (!commandDetection || commandDetection.promptInputModel.value.length > 0) { await this.sendText('\x03', false); // Wait a little before running the command to avoid the sequences being echoed while the ^C // is being evaluated From 30e78576e7cfad2d7c7afaf29f5d72015e21e7af Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:32:59 -0700 Subject: [PATCH 061/755] Support for OSC52 clipboard access Fixes #193508 --- .eslintrc.json | 1 + build/.webignore | 3 + package.json | 15 ++-- remote/package.json | 15 ++-- remote/web/package.json | 13 +-- remote/web/yarn.lock | 70 +++++++++------- remote/yarn.lock | 80 +++++++++++-------- scripts/xterm-update.js | 1 + src/bootstrap-window.js | 1 + .../browser/xterm/vscodeClipboardAddon.ts | 31 +++++++ .../terminal/browser/xterm/xtermTerminal.ts | 5 ++ yarn.lock | 80 +++++++++++-------- 12 files changed, 198 insertions(+), 117 deletions(-) create mode 100644 src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts diff --git a/.eslintrc.json b/.eslintrc.json index 9186fd66558ce..1a9117cfaeb69 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -666,6 +666,7 @@ "vscode-regexpp", "vscode-textmate", "worker_threads", + "@xterm/addon-clipboard", "@xterm/addon-image", "@xterm/addon-search", "@xterm/addon-serialize", diff --git a/build/.webignore b/build/.webignore index 88fe96f5cc16d..15935edce8a61 100644 --- a/build/.webignore +++ b/build/.webignore @@ -20,6 +20,9 @@ vscode-textmate/webpack.config.js @xterm/xterm/src/** +@xterm/addon-clipboard/src/** +@xterm/addon-clipboard/out/** + @xterm/addon-image/src/** @xterm/addon-image/out/** diff --git a/package.json b/package.json index e427510eee867..b3264e10b0403 100644 --- a/package.json +++ b/package.json @@ -82,13 +82,14 @@ "@vscode/windows-mutex": "^0.5.0", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-image": "0.9.0-beta.19", - "@xterm/addon-search": "0.16.0-beta.19", - "@xterm/addon-serialize": "0.14.0-beta.19", - "@xterm/addon-unicode11": "0.9.0-beta.19", - "@xterm/addon-webgl": "0.19.0-beta.19", - "@xterm/headless": "5.6.0-beta.19", - "@xterm/xterm": "5.6.0-beta.19", + "@xterm/addon-clipboard": "0.2.0-beta.4", + "@xterm/addon-image": "0.9.0-beta.21", + "@xterm/addon-search": "0.16.0-beta.21", + "@xterm/addon-serialize": "0.14.0-beta.21", + "@xterm/addon-unicode11": "0.9.0-beta.21", + "@xterm/addon-webgl": "0.19.0-beta.21", + "@xterm/headless": "5.6.0-beta.21", + "@xterm/xterm": "5.6.0-beta.21", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", "jschardet": "3.1.2", diff --git a/remote/package.json b/remote/package.json index c21f50ac7ccef..d3baa3243764d 100644 --- a/remote/package.json +++ b/remote/package.json @@ -14,13 +14,14 @@ "@vscode/vscode-languagedetection": "1.0.21", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-image": "0.9.0-beta.19", - "@xterm/addon-search": "0.16.0-beta.19", - "@xterm/addon-serialize": "0.14.0-beta.19", - "@xterm/addon-unicode11": "0.9.0-beta.19", - "@xterm/addon-webgl": "0.19.0-beta.19", - "@xterm/headless": "5.6.0-beta.19", - "@xterm/xterm": "5.6.0-beta.19", + "@xterm/addon-clipboard": "0.2.0-beta.4", + "@xterm/addon-image": "0.9.0-beta.21", + "@xterm/addon-search": "0.16.0-beta.21", + "@xterm/addon-serialize": "0.14.0-beta.21", + "@xterm/addon-unicode11": "0.9.0-beta.21", + "@xterm/addon-webgl": "0.19.0-beta.21", + "@xterm/headless": "5.6.0-beta.21", + "@xterm/xterm": "5.6.0-beta.21", "cookie": "^0.4.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", diff --git a/remote/web/package.json b/remote/web/package.json index efd58cd8310f4..a6c6353246045 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -7,12 +7,13 @@ "@microsoft/1ds-post-js": "^3.2.13", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/vscode-languagedetection": "1.0.21", - "@xterm/addon-image": "0.9.0-beta.19", - "@xterm/addon-search": "0.16.0-beta.19", - "@xterm/addon-serialize": "0.14.0-beta.19", - "@xterm/addon-unicode11": "0.9.0-beta.19", - "@xterm/addon-webgl": "0.19.0-beta.19", - "@xterm/xterm": "5.6.0-beta.19", + "@xterm/addon-clipboard": "0.2.0-beta.4", + "@xterm/addon-image": "0.9.0-beta.21", + "@xterm/addon-search": "0.16.0-beta.21", + "@xterm/addon-serialize": "0.14.0-beta.21", + "@xterm/addon-unicode11": "0.9.0-beta.21", + "@xterm/addon-webgl": "0.19.0-beta.21", + "@xterm/xterm": "5.6.0-beta.21", "jschardet": "3.1.2", "tas-client-umd": "0.2.0", "vscode-oniguruma": "1.7.0", diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index 1aa2186623925..3a330eae06164 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -48,35 +48,47 @@ resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" integrity sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g== -"@xterm/addon-image@0.9.0-beta.19": - version "0.9.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.19.tgz#3823382e5c55268998f0e0d8d77e8b7810925830" - integrity sha512-LX9g03po3mXYE/HZFoKbdnIRvdD56Qw84FpQ9LCJGDsyx9SFIf47DXLS+lXCEpJ2hjKIing46BQxP+MDEayXDw== - -"@xterm/addon-search@0.16.0-beta.19": - version "0.16.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.19.tgz#46b3374eb312a1bff974a5df188b1ebf777ff49d" - integrity sha512-iTJVUEsKSdL8SyhcDBqN6gYxhqv0wrwtP1QCUGLKNAAVDI7HKVgig3V9wToqRxYfOnu/anyU+u0qFUoKCRLnCg== - -"@xterm/addon-serialize@0.14.0-beta.19": - version "0.14.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.19.tgz#c7a0a0e5f5b1bd94a35a775ec6224ba42282556c" - integrity sha512-D+BiXQfuxDb3azAIBq1RJTQGZlvo459V6U/2s/3dKpTAvRybqCRMazuf8cLoffUoNcjTb3uSWpii9+MVVvHIrQ== - -"@xterm/addon-unicode11@0.9.0-beta.19": - version "0.9.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.19.tgz#529d8b22d9378cff8c31df1b7e76250b2f8079c3" - integrity sha512-0Umiu9GkjwL/jaT85Rcfka9HVyJw3UhJsnOVOVZd/3YBZqMY2SZMHqz73W/qpXl5nz6vvyCWKbpkfddsJhpToA== - -"@xterm/addon-webgl@0.19.0-beta.19": - version "0.19.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.19.tgz#655d1e27b1249c19352c65a8ea1d0bf319397b35" - integrity sha512-Y5efISx8X5hpFAsPOTza1Fp0xiD8x+l3MuH+mv68v1El8tpna/MW5EM4oX25qYOsPDZY00mpmkBmPbAT5loMEg== - -"@xterm/xterm@5.6.0-beta.19": - version "5.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.19.tgz#2cc292fc93b25c7c655ed6d1f0425a636b36747d" - integrity sha512-mGoJxrUxAL4dueZEqw2e23KCrGNSvYaw5twTnccKqK7lITK/hDrosWCxb1jL1AjFf7bBzMxw9/dZdhWncKQQmw== +"@xterm/addon-clipboard@0.2.0-beta.4": + version "0.2.0-beta.4" + resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.4.tgz#9911baaebfbc07a698ae62366a596bfdeac8fa7e" + integrity sha512-p2KGTFUDK4YFthCgfsv2wT66JDTZPcIuoWeDT+TmSFbS1smDPTMCyM/rDDkGY+duHRcQsIMVzGC+2NRb/exX6A== + dependencies: + js-base64 "^3.7.5" + +"@xterm/addon-image@0.9.0-beta.21": + version "0.9.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.21.tgz#64fe50ee623f3e518574e1cbbe649cc0c0d60265" + integrity sha512-kTArrrS7K5+WYTTO8Ktt1aYxKTO4/jUm3KmyvPVjf9iw7OhLtG9mU+X9dXo56DTAqmbIUfJgY3OQbWffcyNk7w== + +"@xterm/addon-search@0.16.0-beta.21": + version "0.16.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.21.tgz#b8a20e83c1ff24afa675c3723244b2068255688d" + integrity sha512-RVn8yRx+w6R7abWiIttyAR0+Myh+XCYOLAkwco3iIYgzlztmox3Qp6YNzWJj0G8iwSvzxaSu7Fbjbb2PXTOSIg== + +"@xterm/addon-serialize@0.14.0-beta.21": + version "0.14.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.21.tgz#a074c5fdd2105c07574e6848babefef2905d84cb" + integrity sha512-Eg1QT2WG0pAIV+RrPv921+dVQvQqMhoFv2DQfMYDcqNbD2mTvIbX/ecEMb1bmn3WI0jNNomQ8UHZRFNRbDA+BA== + +"@xterm/addon-unicode11@0.9.0-beta.21": + version "0.9.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.21.tgz#dc843df701e518bc459e77dcd4fd65fe49adbb4b" + integrity sha512-IiHYZ+88m5MCoAyOHWQ4xXzecOh6FsDDr8lZpJktbFHyzYjBlIDQ6z9cJg+3ApApfo5Xosnmzjs27kf7wG2L0w== + +"@xterm/addon-webgl@0.19.0-beta.21": + version "0.19.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.21.tgz#68b92a47bf6768babd57bfbaf3ac97a7c670d8df" + integrity sha512-YV8Aaxp4QokXXehSCJ7NvudZKPDyBiXv4HqENqDpQllCj4hOWC5xJYSoFoPtu5+UhlzfqqvYRX/Il7QegPFPDg== + +"@xterm/xterm@5.6.0-beta.21": + version "5.6.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.21.tgz#87a4e45752e5708cffc5c583d7f15e107313eb4e" + integrity sha512-1tLJaGudNSg1hEC+ZwUU7PiUvzURzKB5v1IRaJdmZK81ZCxvEF6Qfo281pTZsZFnv2iOWqFEC0C5uRmBXLm0lQ== + +js-base64@^3.7.5: + version "3.7.7" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" + integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== jschardet@3.1.2: version "3.1.2" diff --git a/remote/yarn.lock b/remote/yarn.lock index 513f4c15908a3..7e3b539a3d96e 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -122,40 +122,47 @@ resolved "https://registry.yarnpkg.com/@vscode/windows-registry/-/windows-registry-1.1.0.tgz#03dace7c29c46f658588b9885b9580e453ad21f9" integrity sha512-5AZzuWJpGscyiMOed0IuyEwt6iKmV5Us7zuwCDCFYMIq7tsvooO9BUiciywsvuthGz6UG4LSpeDeCxvgMVhnIw== -"@xterm/addon-image@0.9.0-beta.19": - version "0.9.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.19.tgz#3823382e5c55268998f0e0d8d77e8b7810925830" - integrity sha512-LX9g03po3mXYE/HZFoKbdnIRvdD56Qw84FpQ9LCJGDsyx9SFIf47DXLS+lXCEpJ2hjKIing46BQxP+MDEayXDw== - -"@xterm/addon-search@0.16.0-beta.19": - version "0.16.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.19.tgz#46b3374eb312a1bff974a5df188b1ebf777ff49d" - integrity sha512-iTJVUEsKSdL8SyhcDBqN6gYxhqv0wrwtP1QCUGLKNAAVDI7HKVgig3V9wToqRxYfOnu/anyU+u0qFUoKCRLnCg== - -"@xterm/addon-serialize@0.14.0-beta.19": - version "0.14.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.19.tgz#c7a0a0e5f5b1bd94a35a775ec6224ba42282556c" - integrity sha512-D+BiXQfuxDb3azAIBq1RJTQGZlvo459V6U/2s/3dKpTAvRybqCRMazuf8cLoffUoNcjTb3uSWpii9+MVVvHIrQ== - -"@xterm/addon-unicode11@0.9.0-beta.19": - version "0.9.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.19.tgz#529d8b22d9378cff8c31df1b7e76250b2f8079c3" - integrity sha512-0Umiu9GkjwL/jaT85Rcfka9HVyJw3UhJsnOVOVZd/3YBZqMY2SZMHqz73W/qpXl5nz6vvyCWKbpkfddsJhpToA== - -"@xterm/addon-webgl@0.19.0-beta.19": - version "0.19.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.19.tgz#655d1e27b1249c19352c65a8ea1d0bf319397b35" - integrity sha512-Y5efISx8X5hpFAsPOTza1Fp0xiD8x+l3MuH+mv68v1El8tpna/MW5EM4oX25qYOsPDZY00mpmkBmPbAT5loMEg== - -"@xterm/headless@5.6.0-beta.19": - version "5.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.19.tgz#dbbd4dd420e24e9bdee6e533153f405bfc1ba89b" - integrity sha512-zFTcftonaaMEbMqfQnFwos1YQCmqWnvIzSNXwmfIymkEvSxhsB03oynEjFwm48dT2filTcJXpYT91io4qvR+3g== - -"@xterm/xterm@5.6.0-beta.19": - version "5.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.19.tgz#2cc292fc93b25c7c655ed6d1f0425a636b36747d" - integrity sha512-mGoJxrUxAL4dueZEqw2e23KCrGNSvYaw5twTnccKqK7lITK/hDrosWCxb1jL1AjFf7bBzMxw9/dZdhWncKQQmw== +"@xterm/addon-clipboard@0.2.0-beta.4": + version "0.2.0-beta.4" + resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.4.tgz#9911baaebfbc07a698ae62366a596bfdeac8fa7e" + integrity sha512-p2KGTFUDK4YFthCgfsv2wT66JDTZPcIuoWeDT+TmSFbS1smDPTMCyM/rDDkGY+duHRcQsIMVzGC+2NRb/exX6A== + dependencies: + js-base64 "^3.7.5" + +"@xterm/addon-image@0.9.0-beta.21": + version "0.9.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.21.tgz#64fe50ee623f3e518574e1cbbe649cc0c0d60265" + integrity sha512-kTArrrS7K5+WYTTO8Ktt1aYxKTO4/jUm3KmyvPVjf9iw7OhLtG9mU+X9dXo56DTAqmbIUfJgY3OQbWffcyNk7w== + +"@xterm/addon-search@0.16.0-beta.21": + version "0.16.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.21.tgz#b8a20e83c1ff24afa675c3723244b2068255688d" + integrity sha512-RVn8yRx+w6R7abWiIttyAR0+Myh+XCYOLAkwco3iIYgzlztmox3Qp6YNzWJj0G8iwSvzxaSu7Fbjbb2PXTOSIg== + +"@xterm/addon-serialize@0.14.0-beta.21": + version "0.14.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.21.tgz#a074c5fdd2105c07574e6848babefef2905d84cb" + integrity sha512-Eg1QT2WG0pAIV+RrPv921+dVQvQqMhoFv2DQfMYDcqNbD2mTvIbX/ecEMb1bmn3WI0jNNomQ8UHZRFNRbDA+BA== + +"@xterm/addon-unicode11@0.9.0-beta.21": + version "0.9.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.21.tgz#dc843df701e518bc459e77dcd4fd65fe49adbb4b" + integrity sha512-IiHYZ+88m5MCoAyOHWQ4xXzecOh6FsDDr8lZpJktbFHyzYjBlIDQ6z9cJg+3ApApfo5Xosnmzjs27kf7wG2L0w== + +"@xterm/addon-webgl@0.19.0-beta.21": + version "0.19.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.21.tgz#68b92a47bf6768babd57bfbaf3ac97a7c670d8df" + integrity sha512-YV8Aaxp4QokXXehSCJ7NvudZKPDyBiXv4HqENqDpQllCj4hOWC5xJYSoFoPtu5+UhlzfqqvYRX/Il7QegPFPDg== + +"@xterm/headless@5.6.0-beta.21": + version "5.6.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.21.tgz#110fa33b59f4bf2d1de188e318bb944c8d774e97" + integrity sha512-RtKsv7KZb/ee8hwkvMNYuUofDoBR/KWUjoB5mo10C+dHyDJcMYiG2k48cAvcaJRjPH721iOELORKQk3NAlowkg== + +"@xterm/xterm@5.6.0-beta.21": + version "5.6.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.21.tgz#87a4e45752e5708cffc5c583d7f15e107313eb4e" + integrity sha512-1tLJaGudNSg1hEC+ZwUU7PiUvzURzKB5v1IRaJdmZK81ZCxvEF6Qfo281pTZsZFnv2iOWqFEC0C5uRmBXLm0lQ== agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" @@ -347,6 +354,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +js-base64@^3.7.5: + version "3.7.7" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" + integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== + jschardet@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" diff --git a/scripts/xterm-update.js b/scripts/xterm-update.js index 851b296af62c5..8ede619160b73 100644 --- a/scripts/xterm-update.js +++ b/scripts/xterm-update.js @@ -8,6 +8,7 @@ const path = require('path'); const moduleNames = [ '@xterm/xterm', + '@xterm/addon-clipboard', '@xterm/addon-image', '@xterm/addon-search', '@xterm/addon-serialize', diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index fa3bc5eb839dc..40d15e7c59e73 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -124,6 +124,7 @@ 'vscode-oniguruma': `${baseNodeModulesPath}/vscode-oniguruma/release/main.js`, 'vsda': `${baseNodeModulesPath}/vsda/index.js`, '@xterm/xterm': `${baseNodeModulesPath}/@xterm/xterm/lib/xterm.js`, + '@xterm/addon-clipboard': `${baseNodeModulesPath}/@xterm/addon-clipboard/lib/addon-clipboard.js`, '@xterm/addon-image': `${baseNodeModulesPath}/@xterm/addon-image/lib/addon-image.js`, '@xterm/addon-search': `${baseNodeModulesPath}/@xterm/addon-search/lib/addon-search.js`, '@xterm/addon-serialize': `${baseNodeModulesPath}/@xterm/addon-serialize/lib/addon-serialize.js`, diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts new file mode 100644 index 0000000000000..3d6c4725a5a8e --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ClipboardAddon, type ClipboardSelectionType, type IClipboardProvider } from '@xterm/addon-clipboard'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; + +export class VscodeClipboardAddon extends ClipboardAddon { + constructor( + @IInstantiationService instantiationService: IInstantiationService + ) { + super(undefined, instantiationService.createInstance(VscodeClipboardProvider)); + } +} + +class VscodeClipboardProvider implements IClipboardProvider { + constructor( + @IClipboardService private readonly _clipboardService: IClipboardService + ) { + } + + public async readText(type: ClipboardSelectionType): Promise { + return this._clipboardService.readText(type === 'p' ? 'selection' : 'clipboard'); + } + + public async writeText(type: ClipboardSelectionType, text: string): Promise { + return this._clipboardService.writeText(text, type === 'p' ? 'selection' : 'clipboard'); + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index 67136657ac519..081d2dd79cd88 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -9,6 +9,7 @@ import type { Unicode11Addon as Unicode11AddonType } from '@xterm/addon-unicode1 import type { WebglAddon as WebglAddonType } from '@xterm/addon-webgl'; import type { SerializeAddon as SerializeAddonType } from '@xterm/addon-serialize'; import type { ImageAddon as ImageAddonType } from '@xterm/addon-image'; +import type { ClipboardAddon as ClipboardAddonType } from '@xterm/addon-clipboard'; import * as dom from 'vs/base/browser/dom'; import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -39,6 +40,7 @@ import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableEle import { IMouseWheelEvent, StandardWheelEvent } from 'vs/base/browser/mouseEvent'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { AccessibilitySignal, IAccessibilitySignalService } from 'vs/platform/accessibilitySignal/browser/accessibilitySignalService'; +import { VscodeClipboardAddon } from 'vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon'; const enum RenderConstants { SmoothScrollDuration = 125 @@ -117,6 +119,7 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach private _markNavigationAddon: MarkNavigationAddon; private _shellIntegrationAddon: ShellIntegrationAddon; private _decorationAddon: DecorationAddon; + private _clipboardAddon: ClipboardAddonType; // Optional addons private _searchAddon?: SearchAddonType; @@ -273,6 +276,8 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach this.raw.loadAddon(this._decorationAddon); this._shellIntegrationAddon = new ShellIntegrationAddon(shellIntegrationNonce, disableShellIntegrationReporting, this._telemetryService, this._logService); this.raw.loadAddon(this._shellIntegrationAddon); + this._clipboardAddon = this._instantiationService.createInstance(VscodeClipboardAddon); + this.raw.loadAddon(this._clipboardAddon); this._anyTerminalFocusContextKey = TerminalContextKeys.focusInAny.bindTo(contextKeyService); this._anyFocusedTerminalHasSelection = TerminalContextKeys.textSelectedInFocused.bindTo(contextKeyService); diff --git a/yarn.lock b/yarn.lock index 2c4c4fe78a7b7..fa5f0a1f2bdbe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1975,40 +1975,47 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@xterm/addon-image@0.9.0-beta.19": - version "0.9.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.19.tgz#3823382e5c55268998f0e0d8d77e8b7810925830" - integrity sha512-LX9g03po3mXYE/HZFoKbdnIRvdD56Qw84FpQ9LCJGDsyx9SFIf47DXLS+lXCEpJ2hjKIing46BQxP+MDEayXDw== - -"@xterm/addon-search@0.16.0-beta.19": - version "0.16.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.19.tgz#46b3374eb312a1bff974a5df188b1ebf777ff49d" - integrity sha512-iTJVUEsKSdL8SyhcDBqN6gYxhqv0wrwtP1QCUGLKNAAVDI7HKVgig3V9wToqRxYfOnu/anyU+u0qFUoKCRLnCg== - -"@xterm/addon-serialize@0.14.0-beta.19": - version "0.14.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.19.tgz#c7a0a0e5f5b1bd94a35a775ec6224ba42282556c" - integrity sha512-D+BiXQfuxDb3azAIBq1RJTQGZlvo459V6U/2s/3dKpTAvRybqCRMazuf8cLoffUoNcjTb3uSWpii9+MVVvHIrQ== - -"@xterm/addon-unicode11@0.9.0-beta.19": - version "0.9.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.19.tgz#529d8b22d9378cff8c31df1b7e76250b2f8079c3" - integrity sha512-0Umiu9GkjwL/jaT85Rcfka9HVyJw3UhJsnOVOVZd/3YBZqMY2SZMHqz73W/qpXl5nz6vvyCWKbpkfddsJhpToA== - -"@xterm/addon-webgl@0.19.0-beta.19": - version "0.19.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.19.tgz#655d1e27b1249c19352c65a8ea1d0bf319397b35" - integrity sha512-Y5efISx8X5hpFAsPOTza1Fp0xiD8x+l3MuH+mv68v1El8tpna/MW5EM4oX25qYOsPDZY00mpmkBmPbAT5loMEg== - -"@xterm/headless@5.6.0-beta.19": - version "5.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.19.tgz#dbbd4dd420e24e9bdee6e533153f405bfc1ba89b" - integrity sha512-zFTcftonaaMEbMqfQnFwos1YQCmqWnvIzSNXwmfIymkEvSxhsB03oynEjFwm48dT2filTcJXpYT91io4qvR+3g== - -"@xterm/xterm@5.6.0-beta.19": - version "5.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.19.tgz#2cc292fc93b25c7c655ed6d1f0425a636b36747d" - integrity sha512-mGoJxrUxAL4dueZEqw2e23KCrGNSvYaw5twTnccKqK7lITK/hDrosWCxb1jL1AjFf7bBzMxw9/dZdhWncKQQmw== +"@xterm/addon-clipboard@0.2.0-beta.4": + version "0.2.0-beta.4" + resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.4.tgz#9911baaebfbc07a698ae62366a596bfdeac8fa7e" + integrity sha512-p2KGTFUDK4YFthCgfsv2wT66JDTZPcIuoWeDT+TmSFbS1smDPTMCyM/rDDkGY+duHRcQsIMVzGC+2NRb/exX6A== + dependencies: + js-base64 "^3.7.5" + +"@xterm/addon-image@0.9.0-beta.21": + version "0.9.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.21.tgz#64fe50ee623f3e518574e1cbbe649cc0c0d60265" + integrity sha512-kTArrrS7K5+WYTTO8Ktt1aYxKTO4/jUm3KmyvPVjf9iw7OhLtG9mU+X9dXo56DTAqmbIUfJgY3OQbWffcyNk7w== + +"@xterm/addon-search@0.16.0-beta.21": + version "0.16.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.21.tgz#b8a20e83c1ff24afa675c3723244b2068255688d" + integrity sha512-RVn8yRx+w6R7abWiIttyAR0+Myh+XCYOLAkwco3iIYgzlztmox3Qp6YNzWJj0G8iwSvzxaSu7Fbjbb2PXTOSIg== + +"@xterm/addon-serialize@0.14.0-beta.21": + version "0.14.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.21.tgz#a074c5fdd2105c07574e6848babefef2905d84cb" + integrity sha512-Eg1QT2WG0pAIV+RrPv921+dVQvQqMhoFv2DQfMYDcqNbD2mTvIbX/ecEMb1bmn3WI0jNNomQ8UHZRFNRbDA+BA== + +"@xterm/addon-unicode11@0.9.0-beta.21": + version "0.9.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.21.tgz#dc843df701e518bc459e77dcd4fd65fe49adbb4b" + integrity sha512-IiHYZ+88m5MCoAyOHWQ4xXzecOh6FsDDr8lZpJktbFHyzYjBlIDQ6z9cJg+3ApApfo5Xosnmzjs27kf7wG2L0w== + +"@xterm/addon-webgl@0.19.0-beta.21": + version "0.19.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.21.tgz#68b92a47bf6768babd57bfbaf3ac97a7c670d8df" + integrity sha512-YV8Aaxp4QokXXehSCJ7NvudZKPDyBiXv4HqENqDpQllCj4hOWC5xJYSoFoPtu5+UhlzfqqvYRX/Il7QegPFPDg== + +"@xterm/headless@5.6.0-beta.21": + version "5.6.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.21.tgz#110fa33b59f4bf2d1de188e318bb944c8d774e97" + integrity sha512-RtKsv7KZb/ee8hwkvMNYuUofDoBR/KWUjoB5mo10C+dHyDJcMYiG2k48cAvcaJRjPH721iOELORKQk3NAlowkg== + +"@xterm/xterm@5.6.0-beta.21": + version "5.6.0-beta.21" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.21.tgz#87a4e45752e5708cffc5c583d7f15e107313eb4e" + integrity sha512-1tLJaGudNSg1hEC+ZwUU7PiUvzURzKB5v1IRaJdmZK81ZCxvEF6Qfo281pTZsZFnv2iOWqFEC0C5uRmBXLm0lQ== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -6186,6 +6193,11 @@ js-base64@^3.7.4: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.4.tgz#af95b20f23efc8034afd2d1cc5b9d0adf7419037" integrity sha512-wpM/wi20Tl+3ifTyi0RdDckS4YTD4Lf953mBRrpG8547T7hInHNPEj8+ck4gB8VDcGyeAWFK++Wb/fU1BeavKQ== +js-base64@^3.7.5: + version "3.7.7" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" + integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== + js-beautify@^1.8.9: version "1.8.9" resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.8.9.tgz#08e3c05ead3ecfbd4f512c3895b1cda76c87d523" From c42ce37dc8a3a135909906a131476f461086d897 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:34:27 -0700 Subject: [PATCH 062/755] Fix typo in shell integration api docs --- .../vscode.proposed.terminalShellIntegration.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts index 9ea09344b8aae..1e7f0662c3787 100644 --- a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts +++ b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts @@ -29,9 +29,9 @@ declare module 'vscode' { * }); * function summarizeCommandLine(commandLine: TerminalShellExecutionCommandLine) { * return [ - * ` Command line: ${command.ommandLine.value}`, - * ` Confidence: ${command.ommandLine.confidence}`, - * ` Trusted: ${command.ommandLine.isTrusted} + * ` Command line: ${command.commandLine.value}`, + * ` Confidence: ${command.commandLine.confidence}`, + * ` Trusted: ${command.commandLine.isTrusted} * ].join('\n'); * } */ From 447099bc5e53ed6ee795339d3f309e30c3906a21 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 11:49:48 -0700 Subject: [PATCH 063/755] testing: fix "Run Tests" explorer option does not discover tests before trying to run (#214261) Fixes #212342 --- src/vs/workbench/contrib/testing/common/testService.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/testing/common/testService.ts b/src/vs/workbench/contrib/testing/common/testService.ts index d3026db22eb8a..919fb4dbe1f38 100644 --- a/src/vs/workbench/contrib/testing/common/testService.ts +++ b/src/vs/workbench/contrib/testing/common/testService.ts @@ -201,12 +201,9 @@ export const testsUnderUri = async function* (testService: ITestService, ident: // tests already encompass their children. if (!test) { // no-op - } else if (!test.item.uri) { - queue.push(test.children.values()); - continue; - } else if (ident.extUri.isEqualOrParent(test.item.uri, uri)) { + } else if (test.item.uri && ident.extUri.isEqualOrParent(test.item.uri, uri)) { yield test; - } else if (ident.extUri.isEqualOrParent(uri, test.item.uri)) { + } else if (!test.item.uri || ident.extUri.isEqualOrParent(uri, test.item.uri)) { if (test.expand === TestItemExpandState.Expandable) { await testService.collection.expand(test.item.extId, 1); } From ef849e41eefd7ce2494a0446ba594569b6e20e22 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Tue, 4 Jun 2024 21:18:19 +0200 Subject: [PATCH 064/755] Fixes #207457 (#214267) --- .../backgroundTokenization/worker/textMateWorkerTokenizer.ts | 2 ++ .../textMate/browser/textMateTokenizationFeatureImpl.ts | 4 ++-- .../tokenizationSupport/tokenizationSupportWithLineLimit.ts | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateWorkerTokenizer.ts b/src/vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateWorkerTokenizer.ts index bc98f7239ce53..112d76ec0d930 100644 --- a/src/vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateWorkerTokenizer.ts +++ b/src/vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateWorkerTokenizer.ts @@ -19,6 +19,7 @@ import { TokenizationSupportWithLineLimit } from 'vs/workbench/services/textMate import type { StackDiff, StateStack, diffStateStacksRefEq } from 'vscode-textmate'; import { ICreateGrammarResult } from 'vs/workbench/services/textMate/common/TMGrammarFactory'; import { StateDeltas } from 'vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateTokenizationWorker.worker'; +import { Disposable } from 'vs/base/common/lifecycle'; export interface TextMateModelTokenizerHost { getOrCreateGrammar(languageId: string, encodedLanguageId: LanguageId): Promise; @@ -98,6 +99,7 @@ export class TextMateWorkerTokenizer extends MirrorTextModel { }, false ), + Disposable.None, this._maxTokenizationLineLength ); this._tokenizerWithStateStore = new TokenizerWithStateStore(this._lines.length, tokenizationSupport); diff --git a/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts b/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts index 8214f7caef331..ee98f91bc1692 100644 --- a/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts +++ b/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts @@ -302,14 +302,14 @@ export class TextMateTokenizationFeature extends Disposable implements ITextMate }, true, ); - tokenization.onDidEncounterLanguage((encodedLanguageId) => { + const disposable = tokenization.onDidEncounterLanguage((encodedLanguageId) => { if (!this._encounteredLanguages[encodedLanguageId]) { const languageId = this._languageService.languageIdCodec.decodeLanguageId(encodedLanguageId); this._encounteredLanguages[encodedLanguageId] = true; this._languageService.requestBasicLanguageFeatures(languageId); } }); - return new TokenizationSupportWithLineLimit(encodedLanguageId, tokenization, maxTokenizationLineLength); + return new TokenizationSupportWithLineLimit(encodedLanguageId, tokenization, disposable, maxTokenizationLineLength); } catch (err) { if (err.message && err.message === missingTMGrammarErrorMessage) { // Don't log this error message diff --git a/src/vs/workbench/services/textMate/browser/tokenizationSupport/tokenizationSupportWithLineLimit.ts b/src/vs/workbench/services/textMate/browser/tokenizationSupport/tokenizationSupportWithLineLimit.ts index f5bd00e965ee8..a32113c6e8e27 100644 --- a/src/vs/workbench/services/textMate/browser/tokenizationSupport/tokenizationSupportWithLineLimit.ts +++ b/src/vs/workbench/services/textMate/browser/tokenizationSupport/tokenizationSupportWithLineLimit.ts @@ -7,7 +7,7 @@ import { LanguageId } from 'vs/editor/common/encodedTokenAttributes'; import { EncodedTokenizationResult, IBackgroundTokenizationStore, IBackgroundTokenizer, IState, ITokenizationSupport, TokenizationResult } from 'vs/editor/common/languages'; import { nullTokenizeEncoded } from 'vs/editor/common/languages/nullTokenize'; import { ITextModel } from 'vs/editor/common/model'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IObservable, keepObserved } from 'vs/base/common/observable'; export class TokenizationSupportWithLineLimit extends Disposable implements ITokenizationSupport { @@ -18,11 +18,13 @@ export class TokenizationSupportWithLineLimit extends Disposable implements ITok constructor( private readonly _encodedLanguageId: LanguageId, private readonly _actual: ITokenizationSupport, + disposable: IDisposable, private readonly _maxTokenizationLineLength: IObservable, ) { super(); this._register(keepObserved(this._maxTokenizationLineLength)); + this._register(disposable); } getInitialState(): IState { From 4d465ecade61e465773a44ad7fd6a1a597cb1a78 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Tue, 4 Jun 2024 21:26:07 +0200 Subject: [PATCH 065/755] Avoid leaking disposables (#214234) (#214268) --- .../browser/toggleMultiCursorModifier.ts | 16 +++++++++------- .../contrib/codeEditor/browser/toggleWordWrap.ts | 16 ++++++++-------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier.ts b/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier.ts index f5b2c84ebcb5b..5b5081623cf63 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier.ts @@ -3,15 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { localize, localize2 } from 'vs/nls'; +import { Disposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; +import { localize, localize2 } from 'vs/nls'; import { Action2, MenuId, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; export class ToggleMultiCursorModifierAction extends Action2 { @@ -39,7 +40,7 @@ export class ToggleMultiCursorModifierAction extends Action2 { const multiCursorModifier = new RawContextKey('multiCursorModifier', 'altKey'); -class MultiCursorModifierContextKeyController implements IWorkbenchContribution { +class MultiCursorModifierContextKeyController extends Disposable implements IWorkbenchContribution { private readonly _multiCursorModifier: IContextKey; @@ -47,14 +48,15 @@ class MultiCursorModifierContextKeyController implements IWorkbenchContribution @IConfigurationService private readonly configurationService: IConfigurationService, @IContextKeyService contextKeyService: IContextKeyService ) { + super(); this._multiCursorModifier = multiCursorModifier.bindTo(contextKeyService); this._update(); - configurationService.onDidChangeConfiguration((e) => { + this._register(configurationService.onDidChangeConfiguration((e) => { if (e.affectsConfiguration('editor.multiCursorModifier')) { this._update(); } - }); + })); } private _update(): void { diff --git a/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap.ts b/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap.ts index 7cdd7d910ad4c..043e3f5c9e71e 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap.ts @@ -3,25 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; +import { addDisposableListener, onDidRegisterWindow } from 'vs/base/browser/dom'; +import { mainWindow } from 'vs/base/browser/window'; +import { Codicon } from 'vs/base/common/codicons'; +import { Event } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { EditorAction, ServicesAccessor, registerEditorAction, registerEditorContribution, registerDiffEditorContribution, EditorContributionInstantiation } from 'vs/editor/browser/editorExtensions'; +import { EditorAction, EditorContributionInstantiation, ServicesAccessor, registerDiffEditorContribution, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IDiffEditorContribution, IEditorContribution } from 'vs/editor/common/editorCommon'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; +import * as nls from 'vs/nls'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { Codicon } from 'vs/base/common/codicons'; import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from 'vs/workbench/common/contributions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { Event } from 'vs/base/common/event'; -import { addDisposableListener, onDidRegisterWindow } from 'vs/base/browser/dom'; -import { mainWindow } from 'vs/base/browser/window'; const transientWordWrapState = 'transientWordWrapState'; const isWordWrapMinifiedKey = 'isWordWrapMinified'; @@ -271,7 +271,7 @@ class EditorWordWrapContextKeyTracker extends Disposable implements IWorkbenchCo disposables.add(addDisposableListener(window, 'focus', () => this._update(), true)); disposables.add(addDisposableListener(window, 'blur', () => this._update(), true)); }, { window: mainWindow, disposables: this._store })); - this._editorService.onDidActiveEditorChange(() => this._update()); + this._register(this._editorService.onDidActiveEditorChange(() => this._update())); this._canToggleWordWrap = CAN_TOGGLE_WORD_WRAP.bindTo(this._contextService); this._editorWordWrap = EDITOR_WORD_WRAP.bindTo(this._contextService); this._activeEditor = null; From 42fe841df76165ab1f67cfa157345fa51c20cffb Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 13:10:41 -0700 Subject: [PATCH 066/755] testing: ensure run all runs everything, use consistent profile for re-runs (#214260) * testing: ensure run all runs everything, use consistent profile for re-runs Fixes #212628 * fixup * fix compile --- src/vs/base/common/iterator.ts | 7 ++ src/vs/workbench/api/common/extHostTesting.ts | 2 +- .../testing/browser/testExplorerActions.ts | 74 ++++++++++++------- .../testing/browser/testingDecorations.ts | 2 +- .../testing/browser/testingExplorerView.ts | 2 +- .../testing/common/testProfileService.ts | 22 +++--- .../testing/common/testResultService.ts | 4 +- .../contrib/testing/common/testServiceImpl.ts | 43 +++++++---- .../contrib/testing/common/testTypes.ts | 2 +- .../common/testingContinuousRunService.ts | 2 +- .../test/common/testResultService.test.ts | 2 +- .../test/common/testResultStorage.test.ts | 3 +- 12 files changed, 100 insertions(+), 65 deletions(-) diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index 0dad18867e8c9..c329ed6dc71cf 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -83,6 +83,13 @@ export namespace Iterable { } } + export function* flatMap(iterable: Iterable, fn: (t: T, index: number) => Iterable): Iterable { + let index = 0; + for (const element of iterable) { + yield* fn(element, index++); + } + } + export function* concat(...iterables: Iterable[]): Iterable { for (const iterable of iterables) { yield* iterable; diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index 48aaa9c491f4a..bafd07810d283 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -218,9 +218,9 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { await this.proxy.$runTests({ preserveFocus: req.preserveFocus ?? true, + group: profileGroupToBitset[profile.kind], targets: [{ testIds: req.include?.map(t => TestId.fromExtHostTestItem(t, controller.collection.root.id).toString()) ?? [controller.collection.root.id], - profileGroup: profileGroupToBitset[profile.kind], profileId: profile.profileId, controllerId: profile.controllerId, }], diff --git a/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts b/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts index 6851abd333bdd..37cb8843ff5a4 100644 --- a/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts +++ b/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts @@ -44,7 +44,7 @@ import { ITestProfileService, canUseProfileWithTest } from 'vs/workbench/contrib import { ITestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { IMainThreadTestCollection, IMainThreadTestController, ITestService, expandAndGetTestById, testsInFile, testsUnderUri } from 'vs/workbench/contrib/testing/common/testService'; -import { ExtTestRunProfileKind, ITestRunProfile, InternalTestItem, TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testTypes'; +import { ExtTestRunProfileKind, ITestRunProfile, InternalTestItem, TestItemExpandState, TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testTypes'; import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys'; import { ITestingContinuousRunService } from 'vs/workbench/contrib/testing/common/testingContinuousRunService'; import { ITestingPeekOpener } from 'vs/workbench/contrib/testing/common/testingPeekOpener'; @@ -224,8 +224,8 @@ export class RunUsingProfileAction extends Action2 { } testService.runResolvedTests({ + group: profile.group, targets: [{ - profileGroup: profile.group, profileId: profile.profileId, controllerId: profile.controllerId, testIds: elements.filter(t => canUseProfileWithTest(profile, t.test)).map(t => t.test.item.extId) @@ -625,7 +625,8 @@ abstract class RunOrDebugAllTestsAction extends Action2 { const testService = accessor.get(ITestService); const notifications = accessor.get(INotificationService); - const roots = [...testService.collection.rootItems]; + const roots = [...testService.collection.rootItems].filter(r => r.children.size + || r.expand === TestItemExpandState.Expandable || r.expand === TestItemExpandState.BusyExpanding); if (!roots.length) { notifications.info(this.noTestsFoundError); return; @@ -1345,7 +1346,8 @@ abstract class RunOrDebugFailedTests extends RunOrDebugExtsByPath { } } -abstract class RunOrDebugLastRun extends RunOrDebugExtsByPath { + +abstract class RunOrDebugLastRun extends Action2 { constructor(options: IAction2Options) { super({ ...options, @@ -1359,21 +1361,46 @@ abstract class RunOrDebugLastRun extends RunOrDebugExtsByPath { }); } - /** - * @inheritdoc - */ - protected *getTestExtIdsToRun(accessor: ServicesAccessor, runId?: string): Iterable { + protected abstract getGroup(): TestRunProfileBitset; + + protected getLastTestRunRequest(accessor: ServicesAccessor, runId?: string) { + const resultService = accessor.get(ITestResultService); + const lastResult = runId ? resultService.results.find(r => r.id === runId) : resultService.results[0]; + return lastResult?.request; + } + + /** @inheritdoc */ + public override async run(accessor: ServicesAccessor, runId?: string) { const resultService = accessor.get(ITestResultService); const lastResult = runId ? resultService.results.find(r => r.id === runId) : resultService.results[0]; if (!lastResult) { return; } - for (const test of lastResult.request.targets) { - for (const testId of test.testIds) { - yield testId; - } - } + const req = lastResult.request; + const testService = accessor.get(ITestService); + const profileService = accessor.get(ITestProfileService); + const profileExists = (t: { controllerId: string; profileId: number }) => + profileService.getControllerProfiles(t.controllerId).some(p => p.profileId === t.profileId); + + await discoverAndRunTests( + testService.collection, + accessor.get(IProgressService), + req.targets.flatMap(t => t.testIds), + tests => { + // If we're requesting a re-run in the same group and have the same profiles + // as were used before, then use those exactly. Otherwise guess naively. + if (this.getGroup() & req.group && req.targets.every(profileExists)) { + return testService.runResolvedTests({ + targets: req.targets, + group: req.group, + exclude: req.exclude, + }); + } else { + return testService.runTests({ tests, group: this.getGroup() }); + } + }, + ); } } @@ -1432,11 +1459,8 @@ export class ReRunLastRun extends RunOrDebugLastRun { }); } - protected runTest(service: ITestService, internalTests: InternalTestItem[]): Promise { - return service.runTests({ - group: TestRunProfileBitset.Run, - tests: internalTests, - }); + protected override getGroup(): TestRunProfileBitset { + return TestRunProfileBitset.Run; } } @@ -1453,11 +1477,8 @@ export class DebugLastRun extends RunOrDebugLastRun { }); } - protected runTest(service: ITestService, internalTests: InternalTestItem[]): Promise { - return service.runTests({ - group: TestRunProfileBitset.Debug, - tests: internalTests, - }); + protected override getGroup(): TestRunProfileBitset { + return TestRunProfileBitset.Debug; } } @@ -1474,11 +1495,8 @@ export class CoverageLastRun extends RunOrDebugLastRun { }); } - protected runTest(service: ITestService, internalTests: InternalTestItem[]): Promise { - return service.runTests({ - group: TestRunProfileBitset.Coverage, - tests: internalTests, - }); + protected override getGroup(): TestRunProfileBitset { + return TestRunProfileBitset.Coverage; } } diff --git a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts index b2742e2480dc2..9afbdafa1929e 100644 --- a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts @@ -856,8 +856,8 @@ abstract class RunTestDecoration { } this.testService.runResolvedTests({ + group: profile.group, targets: [{ - profileGroup: profile.group, profileId: profile.profileId, controllerId: profile.controllerId, testIds: [test.item.extId] diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 5c5572d1dc0a0..9e102574c7451 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -337,8 +337,8 @@ export class TestingExplorerView extends ViewPane { const { include, exclude } = this.getTreeIncludeExclude(undefined, profile); this.testService.runResolvedTests({ exclude: exclude.map(e => e.item.extId), + group: profile.group, targets: [{ - profileGroup: profile.group, profileId: profile.profileId, controllerId: profile.controllerId, testIds: include.map(i => i.item.extId), diff --git a/src/vs/workbench/contrib/testing/common/testProfileService.ts b/src/vs/workbench/contrib/testing/common/testProfileService.ts index adf73855e6cb8..d01101c6919dd 100644 --- a/src/vs/workbench/contrib/testing/common/testProfileService.ts +++ b/src/vs/workbench/contrib/testing/common/testProfileService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; +import { Iterable } from 'vs/base/common/iterator'; import { Disposable } from 'vs/base/common/lifecycle'; import { deepClone } from 'vs/base/common/objects'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -64,7 +65,7 @@ export interface ITestProfileService { /** * Gets the default profiles to be run for a given run group. */ - getGroupDefaultProfiles(group: TestRunProfileBitset): ITestRunProfile[]; + getGroupDefaultProfiles(group: TestRunProfileBitset, controllerId?: string): ITestRunProfile[]; /** * Sets the default profiles to be run for a given run group. @@ -252,20 +253,17 @@ export class TestProfileService extends Disposable implements ITestProfileServic } /** @inheritdoc */ - public getGroupDefaultProfiles(group: TestRunProfileBitset) { - let defaults: ITestRunProfile[] = []; - for (const { profiles } of this.controllerProfiles.values()) { - defaults = defaults.concat(profiles.filter(c => c.group === group && c.isDefault)); - } + public getGroupDefaultProfiles(group: TestRunProfileBitset, controllerId?: string) { + const allProfiles = controllerId + ? (this.controllerProfiles.get(controllerId)?.profiles || []) + : [...Iterable.flatMap(this.controllerProfiles.values(), c => c.profiles)]; + const defaults = allProfiles.filter(c => c.group === group && c.isDefault); // have *some* default profile to run if none are set otherwise if (defaults.length === 0) { - for (const { profiles } of this.controllerProfiles.values()) { - const first = profiles.find(p => p.group === group); - if (first) { - defaults.push(first); - break; - } + const first = allProfiles.find(p => p.group === group); + if (first) { + defaults.push(first); } } diff --git a/src/vs/workbench/contrib/testing/common/testResultService.ts b/src/vs/workbench/contrib/testing/common/testResultService.ts index 3035be654dffc..88bdd37b5c294 100644 --- a/src/vs/workbench/contrib/testing/common/testResultService.ts +++ b/src/vs/workbench/contrib/testing/common/testResultService.ts @@ -16,7 +16,7 @@ import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingC import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; import { ITestResult, LiveTestResult, TestResultItemChange, TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultStorage, RETAIN_MAX_RESULTS } from 'vs/workbench/contrib/testing/common/testResultStorage'; -import { ExtensionRunTestsRequest, ITestRunProfile, ResolvedTestRunRequest, TestResultItem, TestResultState } from 'vs/workbench/contrib/testing/common/testTypes'; +import { ExtensionRunTestsRequest, ITestRunProfile, ResolvedTestRunRequest, TestResultItem, TestResultState, TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testTypes'; export type ResultChangeEvent = | { completed: LiveTestResult } @@ -153,11 +153,11 @@ export class TestResultService extends Disposable implements ITestResultService targets: [], exclude: req.exclude, continuous: req.continuous, + group: profile?.group ?? TestRunProfileBitset.Run, }; if (profile) { resolved.targets.push({ - profileGroup: profile.group, profileId: profile.profileId, controllerId: req.controllerId, testIds: req.include, diff --git a/src/vs/workbench/contrib/testing/common/testServiceImpl.ts b/src/vs/workbench/contrib/testing/common/testServiceImpl.ts index fd3ffcd0999fb..7b0e47cd891bf 100644 --- a/src/vs/workbench/contrib/testing/common/testServiceImpl.ts +++ b/src/vs/workbench/contrib/testing/common/testServiceImpl.ts @@ -28,7 +28,7 @@ import { canUseProfileWithTest, ITestProfileService } from 'vs/workbench/contrib import { ITestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { AmbiguousRunTestsRequest, IMainThreadTestController, IMainThreadTestHostProxy, ITestFollowups, ITestService } from 'vs/workbench/contrib/testing/common/testService'; -import { ResolvedTestRunRequest, TestDiffOpType, TestMessageFollowupRequest, TestsDiff } from 'vs/workbench/contrib/testing/common/testTypes'; +import { InternalTestItem, ITestRunProfile, ResolvedTestRunRequest, TestDiffOpType, TestMessageFollowupRequest, TestsDiff } from 'vs/workbench/contrib/testing/common/testTypes'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; export class TestService extends Disposable implements ITestService { @@ -133,25 +133,37 @@ export class TestService extends Disposable implements ITestService { * @inheritdoc */ public async runTests(req: AmbiguousRunTestsRequest, token = CancellationToken.None): Promise { + // We try to ensure that all tests in the request will be run, preferring + // to use default profiles for each controller when possible. + const byProfile: { profile: ITestRunProfile; tests: InternalTestItem[] }[] = []; + for (const test of req.tests) { + const existing = byProfile.find(p => canUseProfileWithTest(p.profile, test)); + if (existing) { + existing.tests.push(test); + continue; + } + + const allProfiles = this.testProfiles.getControllerProfiles(test.controllerId) + .filter(p => (p.group & req.group) !== 0 && canUseProfileWithTest(p, test)); + const bestProfile = allProfiles.find(p => p.isDefault) || allProfiles[0]; + if (!bestProfile) { + continue; + } + + byProfile.push({ profile: bestProfile, tests: [test] }); + } + const resolved: ResolvedTestRunRequest = { - targets: [], + targets: byProfile.map(({ profile, tests }) => ({ + profileId: profile.profileId, + controllerId: tests[0].controllerId, + testIds: tests.map(t => t.item.extId), + })), + group: req.group, exclude: req.exclude?.map(t => t.item.extId), continuous: req.continuous, }; - // First, try to run the tests using the default run profiles... - for (const profile of this.testProfiles.getGroupDefaultProfiles(req.group)) { - const testIds = req.tests.filter(t => canUseProfileWithTest(profile, t)).map(t => t.item.extId); - if (testIds.length) { - resolved.targets.push({ - testIds: testIds, - profileGroup: profile.group, - profileId: profile.profileId, - controllerId: profile.controllerId, - }); - } - } - // If no tests are covered by the defaults, just use whatever the defaults // for their controller are. This can happen if the user chose specific // profiles for the run button, but then asked to run a single test from the @@ -169,7 +181,6 @@ export class TestService extends Disposable implements ITestService { if (profile) { resolved.targets.push({ testIds: byProfile.map(t => t.test.item.extId), - profileGroup: req.group, profileId: profile.profileId, controllerId: profile.controllerId, }); diff --git a/src/vs/workbench/contrib/testing/common/testTypes.ts b/src/vs/workbench/contrib/testing/common/testTypes.ts index 75f7b37136209..941ead406119b 100644 --- a/src/vs/workbench/contrib/testing/common/testTypes.ts +++ b/src/vs/workbench/contrib/testing/common/testTypes.ts @@ -78,10 +78,10 @@ export interface ITestRunProfile { * and extension host. */ export interface ResolvedTestRunRequest { + group: TestRunProfileBitset; targets: { testIds: string[]; controllerId: string; - profileGroup: TestRunProfileBitset; profileId: number; }[]; exclude?: string[]; diff --git a/src/vs/workbench/contrib/testing/common/testingContinuousRunService.ts b/src/vs/workbench/contrib/testing/common/testingContinuousRunService.ts index b8053615c6b0c..47be6dfacba61 100644 --- a/src/vs/workbench/contrib/testing/common/testingContinuousRunService.ts +++ b/src/vs/workbench/contrib/testing/common/testingContinuousRunService.ts @@ -177,10 +177,10 @@ export class TestingContinuousRunService extends Disposable implements ITestingC if (actualProfiles.length) { this.testService.startContinuousRun({ continuous: true, + group: actualProfiles[0].group, targets: actualProfiles.map(p => ({ testIds: [testId ?? p.controllerId], controllerId: p.controllerId, - profileGroup: p.group, profileId: p.profileId })), }, cts.token); diff --git a/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts b/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts index 58f015704594d..4ccd1f6da369c 100644 --- a/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts @@ -32,8 +32,8 @@ suite('Workbench - Test Results Service', () => { let tests: TestTestCollection; const defaultOpts = (testIds: string[]): ResolvedTestRunRequest => ({ + group: TestRunProfileBitset.Run, targets: [{ - profileGroup: TestRunProfileBitset.Run, profileId: 0, controllerId: 'ctrlId', testIds, diff --git a/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts b/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts index 118dcf18b5be6..c7c61884c44fe 100644 --- a/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts @@ -12,6 +12,7 @@ import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtil import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ITestResult, LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { InMemoryResultStorage, RETAIN_MAX_RESULTS } from 'vs/workbench/contrib/testing/common/testResultStorage'; +import { TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testTypes'; import { testStubs } from 'vs/workbench/contrib/testing/test/common/testStubs'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; @@ -23,7 +24,7 @@ suite('Workbench - Test Result Storage', () => { const t = ds.add(new LiveTestResult( '', true, - { targets: [] }, + { targets: [], group: TestRunProfileBitset.Run }, NullTelemetryService, )); From 8d662c804b805907e9950f7a1893aca65f8f94e1 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 13:36:21 -0700 Subject: [PATCH 067/755] testing: fix new test runs are not collapsible (#214271) Fixes #212875 --- src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index a05b7d50fe062..5c981d840966d 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -2057,6 +2057,7 @@ class OutputPeekTree extends Disposable { result = Iterable.concat( Iterable.single>({ element: new CoverageElement(results, task, coverageService), + collapsible: true, incompressible: true, }), result, @@ -2082,6 +2083,7 @@ class OutputPeekTree extends Disposable { return ({ element: taskElem, incompressible: false, + collapsible: true, children: getTaskChildren(taskElem), }); }); @@ -2092,6 +2094,7 @@ class OutputPeekTree extends Disposable { return { element, incompressible: true, + collapsible: true, collapsed: this.tree.hasElement(element) ? this.tree.isCollapsed(element) : true, children: getResultChildren(result) }; From 55fdf6259408490323f28e963f35f3d6804efbb2 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 4 Jun 2024 13:54:56 -0700 Subject: [PATCH 068/755] dispose terminal hint decoration on config change (#214178) --- .../browser/terminal.initialHint.contribution.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index eb9cce925226d..4e32cf4263641 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -146,19 +146,24 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm marker, x: this._xterm.raw.buffer.active.cursorX + 1, }); + if (this._decoration) { + this._register(this._decoration); + } } - this._register(this._xterm.raw.onKey(() => { - this._decoration?.dispose(); - this._addon?.dispose(); + this._register(this._xterm.raw.onKey(() => this.dispose())); + + this._register(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(TerminalInitialHintSettingId.Enabled) && !this._configurationService.getValue(TerminalInitialHintSettingId.Enabled)) { + this.dispose(); + } })); const inputModel = commandDetectionCapability.promptInputModel; if (inputModel) { this._register(inputModel.onDidChangeInput(() => { if (inputModel.value) { - this._decoration?.dispose(); - this._addon?.dispose(); + this.dispose(); } })); } From d9148b110ef6f3cd97081c16e4c0547d421af5c3 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 4 Jun 2024 13:55:17 -0700 Subject: [PATCH 069/755] mute terminal hint color (#214173) fix #213647 --- build/lib/stylelint/vscode-known-variables.json | 1 + .../contrib/terminal/common/terminalColorRegistry.ts | 6 ++++++ .../chat/browser/media/terminalInitialHint.css | 3 +-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index d8b28e0dd2481..0fd6d003b5319 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -703,6 +703,7 @@ "--vscode-terminal-selectionBackground", "--vscode-terminal-selectionForeground", "--vscode-terminal-tab-activeBorder", + "--vscode-terminal-initialHintForeground", "--vscode-terminalCommandDecoration-defaultBackground", "--vscode-terminalCommandDecoration-errorBackground", "--vscode-terminalCommandDecoration-successBackground", diff --git a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts index ced2afffa11ef..0750923f614b1 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts @@ -120,6 +120,12 @@ export const TERMINAL_TAB_ACTIVE_BORDER = registerColor('terminal.tab.activeBord hcDark: TAB_ACTIVE_BORDER, hcLight: TAB_ACTIVE_BORDER }, nls.localize('terminal.tab.activeBorder', 'Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.')); +export const TERMINAL_INITIAL_HINT_FOREGROUND = registerColor('terminal.initialHintForeground', { + dark: '#ffffff56', + light: '#0007', + hcDark: null, + hcLight: null +}, nls.localize('terminalInitialHintForeground', 'Foreground color of the terminal initial hint.')); export const ansiColorMap: { [key: string]: { index: number; defaults: ColorDefaults } } = { 'terminal.ansiBlack': { diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/media/terminalInitialHint.css b/src/vs/workbench/contrib/terminalContrib/chat/browser/media/terminalInitialHint.css index 6055da8a2a958..c2f0de22f7db3 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/media/terminalInitialHint.css +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/media/terminalInitialHint.css @@ -4,11 +4,10 @@ *--------------------------------------------------------------------------------------------*/ .monaco-workbench .pane-body.integrated-terminal .terminal-initial-hint { - color: var(--vscode-input-placeholderForeground); + color: var(--vscode-terminal-initialHintForeground); } .monaco-workbench .pane-body.integrated-terminal .terminal-initial-hint a { cursor: pointer; - color: var(--vscode-textLink-foreground); } .monaco-workbench .pane-body.integrated-terminal .terminal-initial-hint a, From ad4f719bd5138e6d9a5736eaf6e6a32595c9d118 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 4 Jun 2024 23:02:31 +0200 Subject: [PATCH 070/755] Inline completions refactoring (#214272) --- src/vs/base/browser/domObservable.ts | 17 ++ src/vs/editor/browser/observableUtilities.ts | 38 +++- .../browser/inlineCompletionsController.ts | 199 ++++++++---------- .../browser/inlineCompletionsModel.ts | 67 +++--- 4 files changed, 171 insertions(+), 150 deletions(-) create mode 100644 src/vs/base/browser/domObservable.ts diff --git a/src/vs/base/browser/domObservable.ts b/src/vs/base/browser/domObservable.ts new file mode 100644 index 0000000000000..dd20637727b37 --- /dev/null +++ b/src/vs/base/browser/domObservable.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createStyleSheet2 } from 'vs/base/browser/dom'; +import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { autorun, IObservable } from 'vs/base/common/observable'; + +export function createStyleSheetFromObservable(css: IObservable): IDisposable { + const store = new DisposableStore(); + const w = store.add(createStyleSheet2()); + store.add(autorun(reader => { + w.setStyle(css.read(reader)); + })); + return store; +} diff --git a/src/vs/editor/browser/observableUtilities.ts b/src/vs/editor/browser/observableUtilities.ts index 6e99c148d7781..22be6af0488ac 100644 --- a/src/vs/editor/browser/observableUtilities.ts +++ b/src/vs/editor/browser/observableUtilities.ts @@ -5,7 +5,7 @@ import { equalsIfDefined, itemsEquals } from 'vs/base/common/equals'; import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; -import { IObservable, ITransaction, autorunOpts, derived, derivedOpts, observableFromEvent, observableSignal, observableValue, observableValueOpts } from 'vs/base/common/observable'; +import { IObservable, ITransaction, autorunOpts, autorunWithStoreHandleChanges, derived, derivedOpts, observableFromEvent, observableSignal, observableValue, observableValueOpts } from 'vs/base/common/observable'; import { TransactionImpl } from 'vs/base/common/observableInternal/base'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -189,3 +189,39 @@ class ObservableCodeEditor extends Disposable { return d; } } + +type RemoveUndefined = T extends undefined ? never : T; +export function reactToChange(observable: IObservable, cb: (value: T, deltas: RemoveUndefined[]) => void): IDisposable { + return autorunWithStoreHandleChanges({ + createEmptyChangeSummary: () => ({ deltas: [] as RemoveUndefined[], didChange: false }), + handleChange: (context, changeSummary) => { + if (context.didChange(observable)) { + const e = context.change; + if (e !== undefined) { + changeSummary.deltas.push(e as RemoveUndefined); + } + changeSummary.didChange = true; + } + return true; + }, + }, (reader, changeSummary) => { + const value = observable.read(reader); + if (changeSummary.didChange) { + cb(value, changeSummary.deltas); + } + }); +} + +export function reactToChangeWithStore(observable: IObservable, cb: (value: T, deltas: RemoveUndefined[], store: DisposableStore) => void): IDisposable { + const store = new DisposableStore(); + const disposable = reactToChange(observable, (value, deltas) => { + store.clear(); + cb(value, deltas, store); + }); + return { + dispose() { + disposable.dispose(); + store.dispose(); + } + }; +} diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts index bfe080474d87e..021849ea7da84 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts @@ -3,18 +3,19 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createStyleSheet2 } from 'vs/base/browser/dom'; +import { createStyleSheetFromObservable } from 'vs/base/browser/domObservable'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { timeout } from 'vs/base/common/async'; import { cancelOnDispose } from 'vs/base/common/cancellation'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { IObservable, ITransaction, autorun, autorunHandleChanges, autorunWithStoreHandleChanges, constObservable, derived, disposableObservableValue, observableFromEvent, observableSignal, observableValue, transaction, waitForState } from 'vs/base/common/observable'; +import { IObservable, ITransaction, autorun, constObservable, derived, observableFromEvent, observableSignal, observableValue, transaction, waitForState } from 'vs/base/common/observable'; import { ISettableObservable } from 'vs/base/common/observableInternal/base'; -import { mapObservableArrayCached } from 'vs/base/common/observableInternal/utils'; +import { derivedDisposable } from 'vs/base/common/observableInternal/derived'; +import { derivedObservableWithCache, mapObservableArrayCached } from 'vs/base/common/observableInternal/utils'; import { isUndefined } from 'vs/base/common/types'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { obsCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { obsCodeEditor, reactToChange, reactToChangeWithStore } from 'vs/editor/browser/observableUtilities'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -43,25 +44,26 @@ export class InlineCompletionsController extends Disposable { return editor.getContribution(InlineCompletionsController.ID); } - public readonly model = this._register(disposableObservableValue(this, undefined)); private readonly _editorObs = obsCodeEditor(this.editor); private readonly _positions = derived(this, reader => this._editorObs.positions.read(reader) ?? [new Position(1, 1)]); + private readonly _suggestWidgetAdaptor = this._register(new SuggestWidgetAdaptor( this.editor, () => { this._editorObs.forceUpdate(); return this.model.get()?.selectedInlineCompletion.get()?.toSingleTextEdit(undefined); }, - (item) => { - this._editorObs.forceUpdate(tx => { - /** @description InlineCompletionsController.handleSuggestAccepted */ - this.model.get()?.handleSuggestAccepted(item); - }); - } + (item) => this._editorObs.forceUpdate(_tx => { + /** @description InlineCompletionsController.handleSuggestAccepted */ + this.model.get()?.handleSuggestAccepted(item); + }) )); + private readonly _suggestWidgetSelectedItem = observableFromEvent(cb => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => { this._editorObs.forceUpdate(_tx => cb(undefined)); }), () => this._suggestWidgetAdaptor.selectedItem); + + private readonly _enabledInConfig = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).enabled); private readonly _isScreenReaderEnabled = observableFromEvent(this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); private readonly _editorDictationInProgress = observableFromEvent( @@ -69,7 +71,32 @@ export class InlineCompletionsController extends Disposable { () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true ); private readonly _enabled = derived(this, reader => this._enabledInConfig.read(reader) && (!this._isScreenReaderEnabled.read(reader) || !this._editorDictationInProgress.read(reader))); - private readonly _fontFamily = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).fontFamily); + + private readonly _debounceValue = this._debounceService.for( + this._languageFeaturesService.inlineCompletionsProvider, + 'InlineCompletionsDebounce', + { min: 50, max: 50 } + ); + + public readonly model = derivedDisposable(this, reader => { + if (this._editorObs.isReadonly.read(reader)) { return undefined; } + const textModel = this._editorObs.model.read(reader); + if (!textModel) { return undefined; } + + const model: InlineCompletionsModel = this._instantiationService.createInstance( + InlineCompletionsModel, + textModel, + this._suggestWidgetSelectedItem, + this._editorObs.versionId, + this._positions, + this._debounceValue, + observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.suggest).preview), + observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.suggest).previewMode), + observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).mode), + this._enabled, + ); + return model; + }).recomputeInitiallyAndOnChange(this._store); private readonly _ghostTexts = derived(this, (reader) => { const model = this.model.read(reader); @@ -85,14 +112,9 @@ export class InlineCompletionsController extends Disposable { })) ).recomputeInitiallyAndOnChange(this._store); - private readonly _debounceValue = this._debounceService.for( - this._languageFeaturesService.inlineCompletionsProvider, - 'InlineCompletionsDebounce', - { min: 50, max: 50 } - ); - private readonly _playAccessibilitySignal = observableSignal(this); - private readonly _textModelIfWritable = derived(reader => this._editorObs.isReadonly.read(reader) ? undefined : this._editorObs.model.read(reader)); + + private readonly _fontFamily = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).fontFamily); constructor( public readonly editor: ICodeEditor, @@ -110,65 +132,11 @@ export class InlineCompletionsController extends Disposable { this._register(new InlineCompletionContextKeys(this._contextKeyService, this.model)); - this._register(autorun(reader => { - /** @description InlineCompletionsController.update model */ - const textModel = this._textModelIfWritable.read(reader); - transaction(tx => { - /** @description InlineCompletionsController.onDidChangeModel/readonly */ - this.model.set(undefined, tx); - if (textModel) { - const model = _instantiationService.createInstance( - InlineCompletionsModel, - textModel, - this._suggestWidgetSelectedItem, - this._editorObs.versionId, - this._positions, - this._debounceValue, - observableFromEvent(editor.onDidChangeConfiguration, () => editor.getOption(EditorOption.suggest).preview), - observableFromEvent(editor.onDidChangeConfiguration, () => editor.getOption(EditorOption.suggest).previewMode), - observableFromEvent(editor.onDidChangeConfiguration, () => editor.getOption(EditorOption.inlineSuggest).mode), - this._enabled, - ); - this.model.set(model, tx); - } - }); - })); - - const styleElement = this._register(createStyleSheet2()); - this._register(autorun(reader => { - const fontFamily = this._fontFamily.read(reader); - styleElement.setStyle(fontFamily === '' || fontFamily === 'default' ? `` : ` -.monaco-editor .ghost-text-decoration, -.monaco-editor .ghost-text-decoration-preview, -.monaco-editor .ghost-text { - font-family: ${fontFamily}; -}`); - })); - - this._register(autorunWithStoreHandleChanges({ - createEmptyChangeSummary: () => ({ shouldStop: false }), - handleChange: (context, changeSummary) => { - if (context.didChange(this._editorObs.selections)) { - const e = context.change; - if (e && (e.reason === CursorChangeReason.Explicit || e.source === 'api')) { - changeSummary.shouldStop = true; - } - } - return changeSummary.shouldStop; - }, - }, (reader, changeSummary) => { - this._editorObs.selections.read(reader); - if (changeSummary.shouldStop) { - this.model.get()?.stop(undefined); - } - })); - - this._register(editor.onDidType(() => this._editorObs.forceUpdate(tx => { - /** @description InlineCompletionsController.onDidType */ + this._register(reactToChange(this._editorObs.onDidType, (_value, _changes) => { if (this._enabled.get()) { - this.model.get()?.trigger(tx); + this.model.get()?.trigger(); } - }))); + })); this._register(this._commandService.onDidExecuteCommand((e) => { // These commands don't trigger onDidType. @@ -187,15 +155,21 @@ export class InlineCompletionsController extends Disposable { } })); + this._register(reactToChange(this._editorObs.selections, (_value, changes) => { + if (changes.some(e => e.reason === CursorChangeReason.Explicit || e.source === 'api')) { + this.model.get()?.stop(); + } + })); + this._register(this.editor.onDidBlurEditorWidget(() => { // This is a hidden setting very useful for debugging - if (this._contextKeyService.getContextKeyValue('accessibleViewIsShown') || this._configurationService.getValue('editor.inlineSuggest.keepOnBlur') || - editor.getOption(EditorOption.inlineSuggest).keepOnBlur) { - return; - } - if (InlineSuggestionHintsContentWidget.dropDownVisible) { + if (this._contextKeyService.getContextKeyValue('accessibleViewIsShown') + || this._configurationService.getValue('editor.inlineSuggest.keepOnBlur') + || editor.getOption(EditorOption.inlineSuggest).keepOnBlur + || InlineSuggestionHintsContentWidget.dropDownVisible) { return; } + transaction(tx => { /** @description InlineCompletionsController.onDidBlurEditorWidget */ this.model.get()?.stop(tx); @@ -217,44 +191,47 @@ export class InlineCompletionsController extends Disposable { this._suggestWidgetAdaptor.stopForceRenderingAbove(); })); - const cancellationStore = this._register(new DisposableStore()); - let lastInlineCompletionId: string | undefined = undefined; - this._register(autorunHandleChanges({ - handleChange: (context, changeSummary) => { - if (context.didChange(this._playAccessibilitySignal)) { - lastInlineCompletionId = undefined; - } - return true; - }, - }, async (reader, _) => { - /** @description InlineCompletionsController.playAccessibilitySignalAndReadSuggestion */ - this._playAccessibilitySignal.read(reader); - + const currentInlineCompletionBySemanticId = derivedObservableWithCache(this, (reader, last) => { const model = this.model.read(reader); const state = model?.state.read(reader); - if (!model || !state || !state.inlineCompletion) { - lastInlineCompletionId = undefined; - return; + if (this._suggestWidgetSelectedItem.get()) { + return last; } + return state?.inlineCompletion?.semanticId; + }); + this._register(reactToChangeWithStore(derived(reader => { + this._playAccessibilitySignal.read(reader); + currentInlineCompletionBySemanticId.read(reader); + return {}; + }), async (_value, _deltas, store) => { + /** @description InlineCompletionsController.playAccessibilitySignalAndReadSuggestion */ + const model = this.model.get(); + const state = model?.state.get(); + if (!state || !model) { return; } + const lineText = model.textModel.getLineContent(state.primaryGhostText.lineNumber); - if (state.inlineCompletion.semanticId !== lastInlineCompletionId) { - cancellationStore.clear(); - lastInlineCompletionId = state.inlineCompletion.semanticId; - const lineText = model.textModel.getLineContent(state.primaryGhostText.lineNumber); - - await timeout(50, cancelOnDispose(cancellationStore)); - await waitForState(this._suggestWidgetSelectedItem, isUndefined, () => false, cancelOnDispose(cancellationStore)); - - await this._accessibilitySignalService.playSignal(AccessibilitySignal.inlineSuggestion); + await timeout(50, cancelOnDispose(store)); + await waitForState(this._suggestWidgetSelectedItem, isUndefined, () => false, cancelOnDispose(store)); - if (this.editor.getOption(EditorOption.screenReaderAnnounceInlineSuggestion)) { - this.provideScreenReaderUpdate(state.primaryGhostText.renderForScreenReader(lineText)); - } + await this._accessibilitySignalService.playSignal(AccessibilitySignal.inlineSuggestion); + if (this.editor.getOption(EditorOption.screenReaderAnnounceInlineSuggestion)) { + this._provideScreenReaderUpdate(state.primaryGhostText.renderForScreenReader(lineText)); } })); this._register(new InlineCompletionsHintsWidget(this.editor, this.model, this._instantiationService)); + this._register(createStyleSheetFromObservable(derived(reader => { + const fontFamily = this._fontFamily.read(reader); + if (fontFamily === '' || fontFamily === 'default') { return ''; } + return ` +.monaco-editor .ghost-text-decoration, +.monaco-editor .ghost-text-decoration-preview, +.monaco-editor .ghost-text { + font-family: ${fontFamily}; +}`; + }))); + // TODO@hediet this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('accessibility.verbosity.inlineCompletions')) { @@ -268,14 +245,14 @@ export class InlineCompletionsController extends Disposable { this._playAccessibilitySignal.trigger(tx); } - private provideScreenReaderUpdate(content: string): void { + private _provideScreenReaderUpdate(content: string): void { const accessibleViewShowing = this._contextKeyService.getContextKeyValue('accessibleViewIsShown'); const accessibleViewKeybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView'); let hint: string | undefined; if (!accessibleViewShowing && accessibleViewKeybinding && this.editor.getOption(EditorOption.inlineCompletionsAccessibilityVerbose)) { hint = localize('showAccessibleViewHint', "Inspect this in the accessible view ({0})", accessibleViewKeybinding.getAriaLabel()); } - hint ? alert(content + ', ' + hint) : alert(content); + alert(hint ? content + ', ' + hint : content); } public shouldShowHoverAt(range: Range) { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts index 3a7ac0f015f4a..92013fd598282 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Permutation } from 'vs/base/common/arrays'; +import { compareBy, Permutation } from 'vs/base/common/arrays'; import { mapFindFirst } from 'vs/base/common/arraysFind'; import { itemsEquals } from 'vs/base/common/equals'; import { BugIndicatingError, onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/errors'; @@ -33,17 +33,10 @@ import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetCon import { ICommandService } from 'vs/platform/commands/common/commands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -export enum VersionIdChangeReason { - Undo, - Redo, - AcceptWord, - Other, -} - export class InlineCompletionsModel extends Disposable { - private readonly _source = this._register(this._instantiationService.createInstance(InlineCompletionsSource, this.textModel, this.textModelVersionId, this._debounceValue)); + private readonly _source = this._register(this._instantiationService.createInstance(InlineCompletionsSource, this.textModel, this._textModelVersionId, this._debounceValue)); private readonly _isActive = observableValue(this, false); - readonly _forceUpdateExplicitlySignal = observableSignal(this); + private readonly _forceUpdateExplicitlySignal = observableSignal(this); // We use a semantic id to keep the same inline completion selected even if the provider reorders the completions. private readonly _selectedInlineCompletionId = observableValue(this, undefined); @@ -55,7 +48,7 @@ export class InlineCompletionsModel extends Disposable { constructor( public readonly textModel: ITextModel, public readonly selectedSuggestItem: IObservable, - public readonly textModelVersionId: IObservable, + public readonly _textModelVersionId: IObservable, private readonly _positions: IObservable, private readonly _debounceValue: IFeatureDebounceInformation, private readonly _suggestPreviewEnabled: IObservable, @@ -107,7 +100,7 @@ export class InlineCompletionsModel extends Disposable { }), handleChange: (ctx, changeSummary) => { /** @description fetch inline completions */ - if (ctx.didChange(this.textModelVersionId) && this._preserveCurrentCompletionReasons.has(this._getReason(ctx.change))) { + if (ctx.didChange(this._textModelVersionId) && this._preserveCurrentCompletionReasons.has(this._getReason(ctx.change))) { changeSummary.preserveCurrentCompletion = true; } else if (ctx.didChange(this._forceUpdateExplicitlySignal)) { changeSummary.inlineCompletionTriggerKind = InlineCompletionTriggerKind.Explicit; @@ -122,7 +115,7 @@ export class InlineCompletionsModel extends Disposable { return undefined; } - this.textModelVersionId.read(reader); // Refetch on text change + this._textModelVersionId.read(reader); // Refetch on text change const suggestWidgetInlineCompletions = this._source.suggestWidgetInlineCompletions.get(); const suggestItem = this.selectedSuggestItem.read(reader); @@ -272,26 +265,24 @@ export class InlineCompletionsModel extends Disposable { const augmentedCompletion = mapFindFirst(candidateInlineCompletions, completion => { let r = completion.toSingleTextEdit(reader); - r = singleTextRemoveCommonPrefix(r, model, Range.fromPositions(r.range.getStartPosition(), suggestCompletion.range.getEndPosition())); + r = singleTextRemoveCommonPrefix( + r, + model, + Range.fromPositions(r.range.getStartPosition(), suggestCompletion.range.getEndPosition()) + ); return singleTextEditAugments(r, suggestCompletion) ? { completion, edit: r } : undefined; }); return augmentedCompletion; } - public readonly ghostTexts = derivedOpts({ - owner: this, - equalsFn: ghostTextsOrReplacementsEqual - }, reader => { + public readonly ghostTexts = derivedOpts({ owner: this, equalsFn: ghostTextsOrReplacementsEqual }, reader => { const v = this.state.read(reader); if (!v) { return undefined; } return v.ghostTexts; }); - public readonly primaryGhostText = derivedOpts({ - owner: this, - equalsFn: ghostTextOrReplacementEquals - }, reader => { + public readonly primaryGhostText = derivedOpts({ owner: this, equalsFn: ghostTextOrReplacementEquals }, reader => { const v = this.state.read(reader); if (!v) { return undefined; } return v?.primaryGhostText; @@ -328,6 +319,11 @@ export class InlineCompletionsModel extends Disposable { } const completion = state.inlineCompletion.toInlineCompletion(undefined); + if (completion.command) { + // Make sure the completion list will not be disposed. + completion.source.addRef(); + } + editor.pushUndoStop(); if (completion.snippetInfo) { editor.executeEdits( @@ -349,18 +345,8 @@ export class InlineCompletionsModel extends Disposable { editor.setSelections(selections, 'inlineCompletionAccept'); } - if (completion.command) { - // Make sure the completion list will not be disposed. - completion.source.addRef(); - } - - // Reset before invoking the command, since the command might cause a follow up trigger. - transaction(tx => { - this._source.clear(tx); - // Potentially, isActive will get set back to true by the typing or accept inline suggest event - // if automatic inline suggestions are enabled. - this._isActive.set(false, tx); - }); + // Reset before invoking the command, as the command might cause a follow up trigger (which we don't want to reset). + this.stop(); if (completion.command) { await this._commandService @@ -466,9 +452,7 @@ export class InlineCompletionsModel extends Disposable { completion.source.inlineCompletions, completion.sourceInlineCompletion, text.length, - { - kind, - } + { kind, } ); } } finally { @@ -493,6 +477,13 @@ export class InlineCompletionsModel extends Disposable { } } +export enum VersionIdChangeReason { + Undo, + Redo, + AcceptWord, + Other, +} + export function getSecondaryEdits(textModel: ITextModel, positions: readonly Position[], primaryEdit: SingleTextEdit): SingleTextEdit[] { if (positions.length === 1) { // No secondary cursor positions @@ -535,7 +526,7 @@ function substringPos(text: string, pos: Position): string { } function getEndPositionsAfterApplying(edits: readonly SingleTextEdit[]): Position[] { - const sortPerm = Permutation.createSortPermutation(edits, (edit1, edit2) => Range.compareRangesUsingStarts(edit1.range, edit2.range)); + const sortPerm = Permutation.createSortPermutation(edits, compareBy(e => e.range, Range.compareRangesUsingStarts)); const edit = new TextEdit(sortPerm.apply(edits)); const sortedNewRanges = edit.getNewRanges(); const newRanges = sortPerm.inverse().apply(sortedNewRanges); From 4af0c6a8f4e8b7ba223d27acd2d894a76a912a5e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 14:18:21 -0700 Subject: [PATCH 071/755] testing: fix confusing line decorations when hovering over line numbers (#214275) Fixes #212585 --- .../contrib/testing/browser/codeCoverageDecorations.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts index 1d74aeaed36e6..a4ba28d633489 100644 --- a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts @@ -51,7 +51,6 @@ import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; import { CoverageDetails, DetailType, IDeclarationCoverage, IStatementCoverage } from 'vs/workbench/contrib/testing/common/testTypes'; import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys'; -const MAX_HOVERED_LINES = 30; const CLASS_HIT = 'coverage-deco-hit'; const CLASS_MISS = 'coverage-deco-miss'; const TOGGLE_INLINE_COMMAND_TEXT = localize('testing.toggleInlineCoverage', 'Toggle Inline'); @@ -213,9 +212,14 @@ export class CodeCoverageDecorations extends Disposable implements IEditorContri const todo = [{ line: lineNumber, dir: 0 }]; const toEnable = new Set(); + const ranges = this.editor.getVisibleRanges(); if (!this.coverage.showInline.get()) { - for (let i = 0; i < todo.length && i < MAX_HOVERED_LINES; i++) { + for (let i = 0; i < todo.length; i++) { const { line, dir } = todo[i]; + if (!ranges.some(r => r.startLineNumber <= line && r.endLineNumber >= line)) { + continue; // stop once outside the viewport + } + let found = false; for (const decoration of model.getLineDecorations(line)) { if (this.decorationIds.has(decoration.id)) { From f93c5bc0c5e4557ff21f8473e3581444ea95ab2d Mon Sep 17 00:00:00 2001 From: Francisca Carneiro Date: Tue, 4 Jun 2024 23:13:40 +0100 Subject: [PATCH 072/755] Fix #182308: Pressing PageUp in the search panel no longer causes the layout to change. (#213067) Bug (previous behavior): 1.Press Ctrl+Shift+F to open the search panel. 2.Enter any text into the search input. 3.Press PageUp/PageDown. 4.The layout shifts to the right, hiding the line that indicates the current tab in the activity bar. Solution: When search results are displayed, pressing PageUp or PageDown now moves the cursor to the start or end of the search input, respectively. This is achieved by assigning specific functionality to these keys, overriding their default behavior of moving through the page. Testing: A smoke test was implemented to assess the fix. The test involves entering text into the search editor, pressing the PageUp and PageDown keys, and checking for any changes in the activity bar's layout. --- .../contrib/search/browser/searchWidget.ts | 19 +++++++++++++++++++ test/automation/src/search.ts | 15 +++++++++++++++ test/smoke/src/areas/search/search.test.ts | 11 +++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index d5b801343416e..52daf5fda2d66 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -665,6 +665,25 @@ export class SearchWidget extends Widget { else if (keyboardEvent.equals(KeyCode.DownArrow)) { stopPropagationForMultiLineDownwards(keyboardEvent, this.searchInput?.getValue() ?? '', this.searchInput?.domNode.querySelector('textarea') ?? null); } + + else if (keyboardEvent.equals(KeyCode.PageUp)) { + const inputElement = this.searchInput?.inputBox.inputElement; + if (inputElement) { + inputElement.setSelectionRange(0, 0); + inputElement.focus(); + keyboardEvent.preventDefault(); + } + } + + else if (keyboardEvent.equals(KeyCode.PageDown)) { + const inputElement = this.searchInput?.inputBox.inputElement; + if (inputElement) { + const endOfText = inputElement.value.length; + inputElement.setSelectionRange(endOfText, endOfText); + inputElement.focus(); + keyboardEvent.preventDefault(); + } + } } private onCaseSensitiveKeyDown(keyboardEvent: IKeyboardEvent) { diff --git a/test/automation/src/search.ts b/test/automation/src/search.ts index 567ec20fa915d..5cf6018b72a1f 100644 --- a/test/automation/src/search.ts +++ b/test/automation/src/search.ts @@ -61,6 +61,21 @@ export class Search extends Viewlet { await this.submitSearch(); } + async hasActivityBarMoved() { + await this.code.waitForElement('.activitybar'); + + const elementBoundingBox = await this.code.driver.getElementXY('.activitybar'); + return elementBoundingBox !== null && elementBoundingBox.x === 48 && elementBoundingBox.y === 375; + } + + async waitForPageUp(): Promise { + await this.code.dispatchKeybinding('PageUp'); + } + + async waitForPageDown(): Promise { + await this.code.dispatchKeybinding('PageDown'); + } + async submitSearch(): Promise { await this.waitForInputFocus(INPUT); diff --git a/test/smoke/src/areas/search/search.test.ts b/test/smoke/src/areas/search/search.test.ts index 92c75f14404af..78f79b61838f8 100644 --- a/test/smoke/src/areas/search/search.test.ts +++ b/test/smoke/src/areas/search/search.test.ts @@ -19,6 +19,17 @@ export function setup(logger: Logger) { retry(async () => cp.execSync('git reset --hard HEAD --quiet', { cwd: app.workspacePathOrFolder }), 0, 5); }); + it('verifies the sidebar moves to the right', async function () { + const app = this.app as Application; + await app.workbench.search.openSearchViewlet(); + + await app.code.dispatchKeybinding('PageUp'); + await app.workbench.search.hasActivityBarMoved(); + + await app.code.dispatchKeybinding('PageUp'); + await app.workbench.search.hasActivityBarMoved(); + }); + it('searches for body & checks for correct result number', async function () { const app = this.app as Application; await app.workbench.search.openSearchViewlet(); From 5ca72043a3d9216de2669ec6b6e80d6fea3d9d8e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 15:20:52 -0700 Subject: [PATCH 073/755] debug: support 'source' in group output events (#214278) Fixes #212304 --- .../contrib/debug/browser/media/repl.css | 5 +- .../contrib/debug/browser/replViewer.ts | 96 ++++++++++++------- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/media/repl.css b/src/vs/workbench/contrib/debug/browser/media/repl.css index 5baf2c48fb2c2..59696ad50041a 100644 --- a/src/vs/workbench/contrib/debug/browser/media/repl.css +++ b/src/vs/workbench/contrib/debug/browser/media/repl.css @@ -52,7 +52,7 @@ display: flex; } -.monaco-workbench .repl .repl-tree .output.expression.value-and-source .value { +.monaco-workbench .repl .repl-tree .output.expression.value-and-source .label { margin-right: 4px; } @@ -71,7 +71,8 @@ left: 2px; } -.monaco-workbench .repl .repl-tree .output.expression.value-and-source .source { +.monaco-workbench .repl .repl-tree .output.expression.value-and-source .source, +.monaco-workbench .repl .repl-tree .group .source { margin-left: auto; margin-right: 8px; cursor: pointer; diff --git a/src/vs/workbench/contrib/debug/browser/replViewer.ts b/src/vs/workbench/contrib/debug/browser/replViewer.ts index bae5c31696c7c..500ea4a03b9d4 100644 --- a/src/vs/workbench/contrib/debug/browser/replViewer.ts +++ b/src/vs/workbench/contrib/debug/browser/replViewer.ts @@ -6,20 +6,25 @@ import * as dom from 'vs/base/browser/dom'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; +import { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { CachedListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IAsyncDataSource, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { createMatches, FuzzyScore } from 'vs/base/common/filters'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { basename } from 'vs/base/common/path'; import severity from 'vs/base/common/severity'; +import { ThemeIcon } from 'vs/base/common/themables'; import { localize } from 'vs/nls'; +import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILabelService } from 'vs/platform/label/common/label'; import { defaultCountBadgeStyles } from 'vs/platform/theme/browser/defaultStyles'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { ThemeIcon } from 'vs/base/common/themables'; import { AbstractExpressionsRenderer, IExpressionTemplateData, IInputBoxOptions, renderExpressionValue, renderVariable } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import { handleANSIOutput } from 'vs/workbench/contrib/debug/browser/debugANSIHandling'; import { debugConsoleEvaluationInput } from 'vs/workbench/contrib/debug/browser/debugIcons'; @@ -28,9 +33,6 @@ import { IDebugConfiguration, IDebugService, IDebugSession, IExpression, IExpres import { Variable } from 'vs/workbench/contrib/debug/common/debugModel'; import { RawObjectReplElement, ReplEvaluationInput, ReplEvaluationResult, ReplGroup, ReplOutputElement, ReplVariableElement } from 'vs/workbench/contrib/debug/common/replModel'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IHoverService } from 'vs/platform/hover/browser/hover'; const $ = dom.$; @@ -40,6 +42,7 @@ interface IReplEvaluationInputTemplateData { interface IReplGroupTemplateData { label: HTMLElement; + source: SourceWidget; } interface IReplEvaluationResultTemplateData { @@ -51,9 +54,8 @@ interface IOutputReplElementTemplateData { count: CountBadge; countContainer: HTMLElement; value: HTMLElement; - source: HTMLElement; + source: SourceWidget; getReplElementSource(): IReplElementSource | undefined; - toDispose: IDisposable[]; elementListener: IDisposable; } @@ -94,7 +96,8 @@ export class ReplGroupRenderer implements ITreeRenderer, _index: number, templateData: IReplGroupTemplateData): void { @@ -111,10 +117,11 @@ export class ReplGroupRenderer implements ITreeRenderer { - e.preventDefault(); - e.stopPropagation(); - const source = data.getReplElementSource(); - if (source) { - source.source.openInEditor(this.editorService, { - startLineNumber: source.lineNumber, - startColumn: source.column, - endLineNumber: source.lineNumber, - endColumn: source.column - }); - } - })); + data.value = dom.append(expression, $('span.value.label')); + data.source = this.instaService.createInstance(SourceWidget, expression); return data; } @@ -204,8 +195,7 @@ export class ReplOutputElementRenderer implements ITreeRenderer element.sourceData; } @@ -219,7 +209,7 @@ export class ReplOutputElementRenderer implements ITreeRenderer, _index: number, templateData: IOutputReplElementTemplateData): void { @@ -431,3 +421,39 @@ export class ReplAccessibilityProvider implements IListAccessibilityProvider { + e.preventDefault(); + e.stopPropagation(); + if (this.source) { + this.source.source.openInEditor(editorService, { + startLineNumber: this.source.lineNumber, + startColumn: this.source.column, + endLineNumber: this.source.lineNumber, + endColumn: this.source.column + }); + } + })); + + } + + public setSource(source?: IReplElementSource) { + this.source = source; + this.el.textContent = source ? `${basename(source.source.name)}:${source.lineNumber}` : ''; + + this.hover ??= this._register(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.el, '')); + this.hover.update(source ? `${this.labelService.getUriLabel(source.source.uri)}:${source.lineNumber}` : ''); + } +} From a131a88231e3152d34d1e03eb9c0b0eb36e749cc Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Wed, 5 Jun 2024 00:21:08 +0200 Subject: [PATCH 074/755] Replace `removeChild` with `remove` (#213465) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace removeChild with remove This replaces most uses of `parent.removeChild(child)` with `child.remove()`. The two are almost equivalent. The only difference is that `parent.removeChild(child)` throws if the given node is not a child of the parent, whereas `child.remove()` never throws. There is no noticable performance difference. The only reason to use `removeChild` is to support Internet Explorer, but that’s no longer supported by Monaco editor. * Fix broken CSP hash The script content changed, so the sha256 hash changed too. * Update src/vs/editor/browser/config/charWidthReader.ts Co-authored-by: Logan Ramos --------- Co-authored-by: Logan Ramos --- extensions/notebook-renderers/src/index.ts | 4 +-- src/vs/base/browser/dnd.ts | 2 +- src/vs/base/browser/dom.ts | 8 +++--- src/vs/base/browser/markdownRenderer.ts | 2 +- src/vs/base/browser/ui/actionbar/actionbar.ts | 2 +- .../browser/ui/centered/centeredViewLayout.ts | 6 ++--- .../browser/ui/contextview/contextview.ts | 4 +-- src/vs/base/browser/ui/grid/gridview.ts | 4 +-- src/vs/base/browser/ui/list/listView.ts | 8 +++--- src/vs/base/browser/ui/list/rowCache.ts | 10 +------- src/vs/base/browser/ui/sash/sash.ts | 2 +- .../browser/ui/selectBox/selectBoxCustom.ts | 25 ++++++++----------- src/vs/base/browser/ui/splitview/paneview.ts | 2 +- src/vs/base/browser/ui/splitview/splitview.ts | 2 +- src/vs/base/browser/ui/tree/abstractTree.ts | 2 +- src/vs/base/test/browser/progressBar.test.ts | 2 +- .../editor/browser/config/charWidthReader.ts | 2 +- .../browser/controller/textAreaHandler.ts | 2 +- .../services/abstractCodeEditorService.ts | 2 +- .../browser/view/domLineBreaksComputer.ts | 2 +- src/vs/editor/browser/view/viewLayer.ts | 16 +++--------- .../contentWidgets/contentWidgets.ts | 2 +- .../viewParts/glyphMargin/glyphMargin.ts | 2 +- .../browser/viewParts/viewZones/viewZones.ts | 4 +-- .../widget/codeEditor/codeEditorWidget.ts | 6 ++--- .../widget/diffEditor/diffEditorWidget.ts | 2 +- .../editor/browser/widget/diffEditor/utils.ts | 4 +-- .../widget/diffEditor/utils/editorGutter.ts | 2 +- .../editor/contrib/find/browser/findWidget.ts | 4 +-- .../platform/actions/browser/floatingMenu.ts | 2 +- .../clipboard/browser/clipboardService.ts | 2 +- .../quickinput/browser/quickInputTree.ts | 2 +- .../test/browser/quickinput.test.ts | 2 +- .../browser/actions/developerActions.ts | 2 +- .../browser/parts/editor/editorDropTarget.ts | 2 +- .../browser/parts/editor/editorPanes.ts | 2 +- .../browser/parts/editor/sideBySideEditor.ts | 2 +- .../notifications/notificationsToasts.ts | 2 +- .../workbench/browser/parts/views/checkbox.ts | 2 +- .../browser/parts/views/viewPaneContainer.ts | 2 +- .../contrib/chat/browser/chatInputPart.ts | 2 +- .../browser/find/simpleFindWidget.ts | 4 +-- .../comments/browser/commentThreadBody.ts | 2 +- .../extensions/browser/extensionsWidgets.ts | 12 +++------ .../workbench/contrib/issue/browser/issue.ts | 6 ++--- .../electron-sandbox/issueReporterService.ts | 4 +-- .../electron-sandbox/issueReporterService2.ts | 4 +-- .../mergeEditor/browser/view/editorGutter.ts | 3 +-- .../contrib/find/notebookFindReplaceWidget.ts | 4 +-- .../contrib/find/notebookFindWidget.ts | 4 +-- .../browser/diff/diffElementOutputs.ts | 4 +-- .../browser/view/cellParts/cellDnd.ts | 2 +- .../browser/view/cellParts/cellOutput.ts | 10 +++----- .../browser/view/cellParts/cellStatusPart.ts | 2 +- .../browser/view/cellParts/codeCell.ts | 4 +-- .../browser/view/renderers/webviewPreloads.ts | 2 +- .../viewParts/notebookEditorToolbar.ts | 2 +- .../preferences/browser/settingsTree.ts | 2 +- .../preferences/browser/settingsWidgets.ts | 2 +- .../contrib/splash/browser/partsSplash.ts | 4 +-- .../contrib/terminal/browser/terminalGroup.ts | 4 +-- .../terminal/browser/terminalInstance.ts | 4 +-- .../terminal/browser/terminalService.ts | 2 +- .../terminal/browser/terminalTabbedView.ts | 4 +-- .../contrib/terminal/browser/terminalView.ts | 2 +- .../terminal/browser/widgets/widgetManager.ts | 4 +-- .../testing/browser/testCoverageBars.ts | 2 +- .../testing/browser/testingExplorerView.ts | 2 +- .../testing/browser/testingOutputPeek.ts | 4 +-- .../webview/browser/pre/index-no-csp.html | 6 ++--- .../contrib/webview/browser/pre/index.html | 8 +++--- .../browser/gettingStarted.ts | 2 +- .../browser/gettingStartedList.ts | 2 +- .../browser/walkThroughPart.ts | 4 +-- src/vs/workbench/test/browser/part.test.ts | 2 +- 75 files changed, 116 insertions(+), 172 deletions(-) diff --git a/extensions/notebook-renderers/src/index.ts b/extensions/notebook-renderers/src/index.ts index 8954017fffc54..551192a84dfa0 100644 --- a/extensions/notebook-renderers/src/index.ts +++ b/extensions/notebook-renderers/src/index.ts @@ -11,7 +11,7 @@ import { formatStackTrace } from './stackTraceHelper'; function clearContainer(container: HTMLElement) { while (container.firstChild) { - container.removeChild(container.firstChild); + container.firstChild.remove(); } } @@ -378,7 +378,7 @@ function renderStream(outputInfo: OutputWithAppend, outputElement: HTMLElement, contentParent = document.createElement('div'); contentParent.appendChild(newContent); while (outputElement.firstChild) { - outputElement.removeChild(outputElement.firstChild); + outputElement.firstChild.remove(); } outputElement.appendChild(contentParent); } diff --git a/src/vs/base/browser/dnd.ts b/src/vs/base/browser/dnd.ts index e55b238b08d88..96259a4e63d21 100644 --- a/src/vs/base/browser/dnd.ts +++ b/src/vs/base/browser/dnd.ts @@ -100,7 +100,7 @@ export function applyDragImage(event: DragEvent, label: string | null, clazz: st event.dataTransfer.setDragImage(dragImage, -10, -10); // Removes the element when the DND operation is done - setTimeout(() => ownerDocument.body.removeChild(dragImage), 0); + setTimeout(() => dragImage.remove(), 0); } } diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 1c2fafb031630..c258342ad6f0a 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -968,7 +968,7 @@ export function createStyleSheet(container: HTMLElement = mainWindow.document.he container.appendChild(style); if (disposableStore) { - disposableStore.add(toDisposable(() => container.removeChild(style))); + disposableStore.add(toDisposable(() => style.remove())); } // With as container, the stylesheet becomes global and is tracked @@ -1005,7 +1005,7 @@ function cloneGlobalStyleSheet(globalStylesheet: HTMLStyleElement, globalStylesh const clone = globalStylesheet.cloneNode(true) as HTMLStyleElement; targetWindow.document.head.appendChild(clone); - disposables.add(toDisposable(() => targetWindow.document.head.removeChild(clone))); + disposables.add(toDisposable(() => clone.remove())); for (const rule of getDynamicStyleSheetRules(globalStylesheet)) { clone.sheet?.insertRule(rule.cssText, clone.sheet?.cssRules.length); @@ -1727,7 +1727,7 @@ export function triggerDownload(dataOrUri: Uint8Array | URI, name: string): void anchor.click(); // Ensure to remove the element from DOM eventually - setTimeout(() => activeWindow.document.body.removeChild(anchor)); + setTimeout(() => anchor.remove()); } export function triggerUpload(): Promise { @@ -1750,7 +1750,7 @@ export function triggerUpload(): Promise { input.click(); // Ensure to remove the element from DOM eventually - setTimeout(() => activeWindow.document.body.removeChild(input)); + setTimeout(() => input.remove()); }); } diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index b1a304845a3f7..278f3efd03376 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -427,7 +427,7 @@ function sanitizeRenderedMarkdown( if (element.attributes.getNamedItem('type')?.value === 'checkbox') { element.setAttribute('disabled', ''); } else if (!options.replaceWithPlaintext) { - element.parentElement?.removeChild(element); + element.remove(); } } diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index a9b62dd7be535..06995b2e8274d 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -422,7 +422,7 @@ export class ActionBar extends Disposable implements IActionRunner { pull(index: number): void { if (index >= 0 && index < this.viewItems.length) { - this.actionsList.removeChild(this.actionsList.childNodes[index]); + this.actionsList.childNodes[index].remove(); this.viewItemDisposables.deleteAndDispose(this.viewItems[index]); dispose(this.viewItems.splice(index, 1)); this.refreshRole(); diff --git a/src/vs/base/browser/ui/centered/centeredViewLayout.ts b/src/vs/base/browser/ui/centered/centeredViewLayout.ts index db13907259a56..b6bc80b1d9922 100644 --- a/src/vs/base/browser/ui/centered/centeredViewLayout.ts +++ b/src/vs/base/browser/ui/centered/centeredViewLayout.ts @@ -166,7 +166,7 @@ export class CenteredViewLayout implements IDisposable { } if (active) { - this.container.removeChild(this.view.element); + this.view.element.remove(); this.splitView = new SplitView(this.container, { inverseAltBehavior: true, orientation: Orientation.HORIZONTAL, @@ -195,9 +195,7 @@ export class CenteredViewLayout implements IDisposable { this.resizeSplitViews(); } else { - if (this.splitView) { - this.container.removeChild(this.splitView.el); - } + this.splitView?.el.remove(); this.splitViewDisposables.clear(); this.splitView?.dispose(); this.splitView = undefined; diff --git a/src/vs/base/browser/ui/contextview/contextview.ts b/src/vs/base/browser/ui/contextview/contextview.ts index 4f07df5b8f901..1edda5b714c5a 100644 --- a/src/vs/base/browser/ui/contextview/contextview.ts +++ b/src/vs/base/browser/ui/contextview/contextview.ts @@ -169,13 +169,11 @@ export class ContextView extends Disposable { if (this.container) { this.toDisposeOnSetContainer.dispose(); + this.view.remove(); if (this.shadowRoot) { - this.shadowRoot.removeChild(this.view); this.shadowRoot = null; this.shadowRootHostElement?.remove(); this.shadowRootHostElement = null; - } else { - this.container.removeChild(this.view); } this.container = null; diff --git a/src/vs/base/browser/ui/grid/gridview.ts b/src/vs/base/browser/ui/grid/gridview.ts index 1d7eacf9fdc60..17b2455062271 100644 --- a/src/vs/base/browser/ui/grid/gridview.ts +++ b/src/vs/base/browser/ui/grid/gridview.ts @@ -1063,7 +1063,7 @@ export class GridView implements IDisposable { const oldRoot = this._root; if (oldRoot) { - this.element.removeChild(oldRoot.element); + oldRoot.element.remove(); oldRoot.dispose(); } @@ -1831,6 +1831,6 @@ export class GridView implements IDisposable { dispose(): void { this.onDidSashResetRelay.dispose(); this.root.dispose(); - this.element.parentElement?.removeChild(this.element); + this.element.remove(); } } diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 005d34d67385f..276cba0d2c68b 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -1158,7 +1158,7 @@ export class ListView implements IListView { const container = getDragImageContainer(this.domNode); container.appendChild(dragImage); event.dataTransfer.setDragImage(dragImage, -10, -10); - setTimeout(() => container.removeChild(dragImage), 0); + setTimeout(() => dragImage.remove(), 0); } this.domNode.classList.add('dragging'); @@ -1542,7 +1542,7 @@ export class ListView implements IListView { this.virtualDelegate.setDynamicHeight?.(item.element, item.size); item.lastDynamicHeightWidth = this.renderWidth; - this.rowsContainer.removeChild(row.domNode); + row.domNode.remove(); this.cache.release(row); return item.size - size; @@ -1570,9 +1570,7 @@ export class ListView implements IListView { this.items = []; - if (this.domNode && this.domNode.parentNode) { - this.domNode.parentNode.removeChild(this.domNode); - } + this.domNode?.remove(); this.dragOverAnimationDisposable?.dispose(); this.disposables.dispose(); diff --git a/src/vs/base/browser/ui/list/rowCache.ts b/src/vs/base/browser/ui/list/rowCache.ts index f71bdfd01f394..ff605b097ce63 100644 --- a/src/vs/base/browser/ui/list/rowCache.ts +++ b/src/vs/base/browser/ui/list/rowCache.ts @@ -13,14 +13,6 @@ export interface IRow { templateData: any; } -function removeFromParent(element: HTMLElement): void { - try { - element.parentElement?.removeChild(element); - } catch (e) { - // this will throw if this happens due to a blur event, nasty business - } -} - export class RowCache implements IDisposable { private cache = new Map(); @@ -104,7 +96,7 @@ export class RowCache implements IDisposable { private doRemoveNode(domNode: HTMLElement) { domNode.classList.remove('scrolling'); - removeFromParent(domNode); + domNode.remove(); } private getTemplateCache(templateId: string): IRow[] { diff --git a/src/vs/base/browser/ui/sash/sash.ts b/src/vs/base/browser/ui/sash/sash.ts index dfacef7d6e2a0..210b98af009df 100644 --- a/src/vs/base/browser/ui/sash/sash.ts +++ b/src/vs/base/browser/ui/sash/sash.ts @@ -575,7 +575,7 @@ export class Sash extends Disposable { const onPointerUp = (e: PointerEvent) => { EventHelper.stop(e, false); - this.el.removeChild(style); + style.remove(); this.el.classList.remove('active'); this._onDidEnd.fire(); diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index a58782d95df74..5351157185587 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -520,12 +520,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi return { dispose: () => { // contextView will dispose itself if moving from one View to another - try { - container.removeChild(this.selectDropDownContainer); // remove to take out the CSS rules we add - } - catch (error) { - // Ignore, removed already by change of focus - } + this.selectDropDownContainer.remove(); // remove to take out the CSS rules we add } }; } @@ -612,20 +607,20 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi && this.options.length > maxVisibleOptionsBelow ) { this._dropDownPosition = AnchorPosition.ABOVE; - this.selectDropDownContainer.removeChild(this.selectDropDownListContainer); - this.selectDropDownContainer.removeChild(this.selectionDetailsPane); - this.selectDropDownContainer.appendChild(this.selectionDetailsPane); - this.selectDropDownContainer.appendChild(this.selectDropDownListContainer); + this.selectDropDownListContainer.remove(); + this.selectionDetailsPane.remove(); + this.selectionDetailsPane.remove(); + this.selectDropDownListContainer.remove(); this.selectionDetailsPane.classList.remove('border-top'); this.selectionDetailsPane.classList.add('border-bottom'); } else { this._dropDownPosition = AnchorPosition.BELOW; - this.selectDropDownContainer.removeChild(this.selectDropDownListContainer); - this.selectDropDownContainer.removeChild(this.selectionDetailsPane); - this.selectDropDownContainer.appendChild(this.selectDropDownListContainer); - this.selectDropDownContainer.appendChild(this.selectionDetailsPane); + this.selectDropDownListContainer.remove(); + this.selectionDetailsPane.remove(); + this.selectDropDownListContainer.remove(); + this.selectionDetailsPane.remove(); this.selectionDetailsPane.classList.remove('border-bottom'); this.selectionDetailsPane.classList.add('border-top'); @@ -879,7 +874,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi const tagName = child.tagName && child.tagName.toLowerCase(); if (tagName === 'img') { - element.removeChild(child); + child.remove(); } else { cleanRenderedMarkdown(child); } diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts index a934addd1fb3f..6a78dee386053 100644 --- a/src/vs/base/browser/ui/splitview/paneview.ts +++ b/src/vs/base/browser/ui/splitview/paneview.ts @@ -382,7 +382,7 @@ class PaneDraggable extends Disposable { const dragImage = append(this.pane.element.ownerDocument.body, $('.monaco-drag-image', {}, this.pane.draggableElement.textContent || '')); e.dataTransfer.setDragImage(dragImage, -10, -10); - setTimeout(() => this.pane.element.ownerDocument.body.removeChild(dragImage), 0); + setTimeout(() => dragImage.remove(), 0); this.context.draggable = this; } diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index ae7ad6708e46b..ac966adf4351d 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -1127,7 +1127,7 @@ export class SplitView this.onViewChange(item, size)); - const containerDisposable = toDisposable(() => this.viewContainer.removeChild(container)); + const containerDisposable = toDisposable(() => container.remove()); const disposable = combinedDisposable(onChangeDisposable, containerDisposable); let viewSize: ViewItemSize; diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 7868ee55f6be8..250efbc42969b 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -796,7 +796,7 @@ class FindWidget extends Disposable { super(); container.appendChild(this.elements.root); - this._register(toDisposable(() => container.removeChild(this.elements.root))); + this._register(toDisposable(() => this.elements.root.remove())); const styles = options?.styles ?? unthemedFindWidgetStyles; diff --git a/src/vs/base/test/browser/progressBar.test.ts b/src/vs/base/test/browser/progressBar.test.ts index 1cb98577b2a43..8490fd1789709 100644 --- a/src/vs/base/test/browser/progressBar.test.ts +++ b/src/vs/base/test/browser/progressBar.test.ts @@ -17,7 +17,7 @@ suite('ProgressBar', () => { }); teardown(() => { - mainWindow.document.body.removeChild(fixture); + fixture.remove(); }); test('Progress Bar', function () { diff --git a/src/vs/editor/browser/config/charWidthReader.ts b/src/vs/editor/browser/config/charWidthReader.ts index 90bafb662845e..e1d36f142bf3d 100644 --- a/src/vs/editor/browser/config/charWidthReader.ts +++ b/src/vs/editor/browser/config/charWidthReader.ts @@ -56,7 +56,7 @@ class DomCharWidthReader { this._readFromDomElements(); // Remove the container from the DOM - targetWindow.document.body.removeChild(this._container!); + this._container?.remove(); this._container = null; this._testElements = null; diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index c8e5b7e50a47c..a5f824ca45065 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -950,7 +950,7 @@ function measureText(targetDocument: Document, text: string, fontInfo: FontInfo, const res = regularDomNode.offsetWidth; - targetDocument.body.removeChild(container); + container.remove(); return res; } diff --git a/src/vs/editor/browser/services/abstractCodeEditorService.ts b/src/vs/editor/browser/services/abstractCodeEditorService.ts index b960f48191e1a..1fedb4d17c42c 100644 --- a/src/vs/editor/browser/services/abstractCodeEditorService.ts +++ b/src/vs/editor/browser/services/abstractCodeEditorService.ts @@ -341,7 +341,7 @@ class RefCountedStyleSheet { public unref(): void { this._refCount--; if (this._refCount === 0) { - this._styleSheet.parentNode?.removeChild(this._styleSheet); + this._styleSheet.remove(); this._parent._removeEditorStyleSheets(this._editorId); } } diff --git a/src/vs/editor/browser/view/domLineBreaksComputer.ts b/src/vs/editor/browser/view/domLineBreaksComputer.ts index 64fb2185eedae..2861fd8f82a7e 100644 --- a/src/vs/editor/browser/view/domLineBreaksComputer.ts +++ b/src/vs/editor/browser/view/domLineBreaksComputer.ts @@ -184,7 +184,7 @@ function createLineBreaks(targetWindow: Window, requests: string[], fontInfo: Fo result[i] = new ModelLineProjectionData(injectionOffsets, injectionOptions, breakOffsets, breakOffsetsVisibleColumn, wrappedTextIndentLength); } - targetWindow.document.body.removeChild(containerDomNode); + containerDomNode.remove(); return result; } diff --git a/src/vs/editor/browser/view/viewLayer.ts b/src/vs/editor/browser/view/viewLayer.ts index bbbb0dd9d7314..971d8ae40114d 100644 --- a/src/vs/editor/browser/view/viewLayer.ts +++ b/src/vs/editor/browser/view/viewLayer.ts @@ -295,9 +295,7 @@ export class VisibleLinesCollection { // Remove from DOM for (let i = 0, len = deleted.length; i < len; i++) { const lineDomNode = deleted[i].getDomNode(); - if (lineDomNode) { - this.domNode.domNode.removeChild(lineDomNode); - } + lineDomNode?.remove(); } } @@ -310,9 +308,7 @@ export class VisibleLinesCollection { // Remove from DOM for (let i = 0, len = deleted.length; i < len; i++) { const lineDomNode = deleted[i].getDomNode(); - if (lineDomNode) { - this.domNode.domNode.removeChild(lineDomNode); - } + lineDomNode?.remove(); } } @@ -481,9 +477,7 @@ class ViewLayerRenderer { private _removeLinesBefore(ctx: IRendererContext, removeCount: number): void { for (let i = 0; i < removeCount; i++) { const lineDomNode = ctx.lines[i].getDomNode(); - if (lineDomNode) { - this.domNode.removeChild(lineDomNode); - } + lineDomNode?.remove(); } ctx.lines.splice(0, removeCount); } @@ -502,9 +496,7 @@ class ViewLayerRenderer { for (let i = 0; i < removeCount; i++) { const lineDomNode = ctx.lines[removeIndex + i].getDomNode(); - if (lineDomNode) { - this.domNode.removeChild(lineDomNode); - } + lineDomNode?.remove(); } ctx.lines.splice(removeIndex, removeCount); } diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index a11435b8e7373..bdf8eb77d210b 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -121,7 +121,7 @@ export class ViewContentWidgets extends ViewPart { delete this._widgets[widgetId]; const domNode = myWidget.domNode.domNode; - domNode.parentNode!.removeChild(domNode); + domNode.remove(); domNode.removeAttribute('monaco-visible-content-widget'); this.setShouldRender(); diff --git a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts index 48c79a783ead7..164b2299b75c4 100644 --- a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts +++ b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts @@ -243,7 +243,7 @@ export class GlyphMarginWidgets extends ViewPart { const domNode = widgetData.domNode.domNode; delete this._widgets[widgetId]; - domNode.parentNode?.removeChild(domNode); + domNode.remove(); this.setShouldRender(); } } diff --git a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts index 37914a70335d2..a99dac77cde29 100644 --- a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +++ b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts @@ -271,12 +271,12 @@ export class ViewZones extends ViewPart { zone.domNode.removeAttribute('monaco-visible-view-zone'); zone.domNode.removeAttribute('monaco-view-zone'); - zone.domNode.domNode.parentNode!.removeChild(zone.domNode.domNode); + zone.domNode.domNode.remove(); if (zone.marginDomNode) { zone.marginDomNode.removeAttribute('monaco-visible-view-zone'); zone.marginDomNode.removeAttribute('monaco-view-zone'); - zone.marginDomNode.domNode.parentNode!.removeChild(zone.marginDomNode.domNode); + zone.marginDomNode.domNode.remove(); } this.setShouldRender(); diff --git a/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts index 0ca963b351123..f8ed64fba6c7c 100644 --- a/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts @@ -1613,7 +1613,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE public setBanner(domNode: HTMLElement | null, domNodeHeight: number): void { if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) { - this._domElement.removeChild(this._bannerDomNode); + this._bannerDomNode.remove(); } this._bannerDomNode = domNode; @@ -1884,10 +1884,10 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this._domElement.removeAttribute('data-mode-id'); if (removeDomNode && this._domElement.contains(removeDomNode)) { - this._domElement.removeChild(removeDomNode); + removeDomNode.remove(); } if (this._bannerDomNode && this._domElement.contains(this._bannerDomNode)) { - this._domElement.removeChild(this._bannerDomNode); + this._bannerDomNode.remove(); } return model; } diff --git a/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts index c3c798529caf9..cdc985a11a53e 100644 --- a/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts @@ -111,7 +111,7 @@ export class DiffEditorWidget extends DelegatingEditor implements IDiffEditor { this._contextKeyService.createKey('isInDiffEditor', true); this._domElement.appendChild(this.elements.root); - this._register(toDisposable(() => this._domElement.removeChild(this.elements.root))); + this._register(toDisposable(() => this.elements.root.remove())); this._rootSizeObserver = this._register(new ObservableElementSizeObserver(this.elements.root, options.dimension)); this._rootSizeObserver.setAutomaticLayout(options.automaticLayout ?? false); diff --git a/src/vs/editor/browser/widget/diffEditor/utils.ts b/src/vs/editor/browser/widget/diffEditor/utils.ts index 76c37c4185dbe..99d9580c94a7e 100644 --- a/src/vs/editor/browser/widget/diffEditor/utils.ts +++ b/src/vs/editor/browser/widget/diffEditor/utils.ts @@ -76,14 +76,14 @@ export function applyObservableDecorations(editor: ICodeEditor, decorations: IOb export function appendRemoveOnDispose(parent: HTMLElement, child: HTMLElement) { parent.appendChild(child); return toDisposable(() => { - parent.removeChild(child); + child.remove(); }); } export function prependRemoveOnDispose(parent: HTMLElement, child: HTMLElement) { parent.prepend(child); return toDisposable(() => { - parent.removeChild(child); + child.remove(); }); } diff --git a/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts b/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts index 1c3341a73ef14..9516f37857235 100644 --- a/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts +++ b/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts @@ -136,7 +136,7 @@ export class EditorGutter extends D for (const id of unusedIds) { const view = this.views.get(id)!; view.gutterItemView.dispose(); - this._domNode.removeChild(view.domNode); + view.domNode.remove(); this.views.delete(id); } } diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 303a9a58aaa02..30c36379c65c2 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -410,9 +410,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL } // remove previous content - if (this._matchesCount.firstChild) { - this._matchesCount.removeChild(this._matchesCount.firstChild); - } + this._matchesCount.firstChild?.remove(); let label: string; if (this._state.matchesCount > 0) { diff --git a/src/vs/platform/actions/browser/floatingMenu.ts b/src/vs/platform/actions/browser/floatingMenu.ts index e6840b10e1010..e7285146aa093 100644 --- a/src/vs/platform/actions/browser/floatingMenu.ts +++ b/src/vs/platform/actions/browser/floatingMenu.ts @@ -119,7 +119,7 @@ export class FloatingClickMenu extends AbstractFloatingClickMenu { const w = this.instantiationService.createInstance(FloatingClickWidget, action.label); const node = w.getDomNode(); this.options.container.appendChild(node); - disposable.add(toDisposable(() => this.options.container.removeChild(node))); + disposable.add(toDisposable(() => node.remove())); return w; } diff --git a/src/vs/platform/clipboard/browser/clipboardService.ts b/src/vs/platform/clipboard/browser/clipboardService.ts index ed5490e783f74..d22b7bb5bc0eb 100644 --- a/src/vs/platform/clipboard/browser/clipboardService.ts +++ b/src/vs/platform/clipboard/browser/clipboardService.ts @@ -134,7 +134,7 @@ export class BrowserClipboardService extends Disposable implements IClipboardSer activeElement.focus(); } - activeDocument.body.removeChild(textArea); + textArea.remove(); } async readText(type?: string): Promise { diff --git a/src/vs/platform/quickinput/browser/quickInputTree.ts b/src/vs/platform/quickinput/browser/quickInputTree.ts index 6fa28c37170a3..dc3527c39129c 100644 --- a/src/vs/platform/quickinput/browser/quickInputTree.ts +++ b/src/vs/platform/quickinput/browser/quickInputTree.ts @@ -1125,7 +1125,7 @@ export class QuickInputTree extends Disposable { const parent = focusedElement?.parentNode; if (focusedElement && parent) { const nextSibling = focusedElement.nextSibling; - parent.removeChild(focusedElement); + focusedElement.remove(); parent.insertBefore(focusedElement, nextSibling); } }, 0); diff --git a/src/vs/platform/quickinput/test/browser/quickinput.test.ts b/src/vs/platform/quickinput/test/browser/quickinput.test.ts index 6e7cb804d5a0a..328c43d72fb8e 100644 --- a/src/vs/platform/quickinput/test/browser/quickinput.test.ts +++ b/src/vs/platform/quickinput/test/browser/quickinput.test.ts @@ -57,7 +57,7 @@ suite('QuickInput', () => { // https://github.com/microsoft/vscode/issues/147543 setup(() => { const fixture = document.createElement('div'); mainWindow.document.body.appendChild(fixture); - store.add(toDisposable(() => mainWindow.document.body.removeChild(fixture))); + store.add(toDisposable(() => fixture.remove())); const instantiationService = new TestInstantiationService(); diff --git a/src/vs/workbench/browser/actions/developerActions.ts b/src/vs/workbench/browser/actions/developerActions.ts index 2c20a3572e203..7823fa988c073 100644 --- a/src/vs/workbench/browser/actions/developerActions.ts +++ b/src/vs/workbench/browser/actions/developerActions.ts @@ -63,7 +63,7 @@ class InspectContextKeysAction extends Action2 { const hoverFeedback = document.createElement('div'); const activeDocument = getActiveDocument(); activeDocument.body.appendChild(hoverFeedback); - disposables.add(toDisposable(() => activeDocument.body.removeChild(hoverFeedback))); + disposables.add(toDisposable(() => hoverFeedback.remove())); hoverFeedback.style.position = 'absolute'; hoverFeedback.style.pointerEvents = 'none'; diff --git a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts index 463b527e3b667..b11c66e605773 100644 --- a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts +++ b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts @@ -92,7 +92,7 @@ class DropOverlay extends Themable { this.groupView.element.appendChild(container); this.groupView.element.classList.add('dragged-over'); this._register(toDisposable(() => { - this.groupView.element.removeChild(container); + container.remove(); this.groupView.element.classList.remove('dragged-over'); })); diff --git a/src/vs/workbench/browser/parts/editor/editorPanes.ts b/src/vs/workbench/browser/parts/editor/editorPanes.ts index 5d638871273ab..ef1b25dd681c5 100644 --- a/src/vs/workbench/browser/parts/editor/editorPanes.ts +++ b/src/vs/workbench/browser/parts/editor/editorPanes.ts @@ -466,7 +466,7 @@ export class EditorPanes extends Disposable { // Remove editor pane from parent const editorPaneContainer = this._activeEditorPane.getContainer(); if (editorPaneContainer) { - this.editorPanesParent.removeChild(editorPaneContainer); + editorPaneContainer.remove(); hide(editorPaneContainer); } diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts index c3d7a0cce9dab..2dab828b50ab6 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts @@ -160,7 +160,7 @@ export class SideBySideEditor extends AbstractEditorWithViewState { - this.paneElement.removeChild(this.container); + this.container.remove(); this.paneElement.classList.remove('dragged-over'); })); diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index 90acf8cf0b104..961472ae70ca4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -279,7 +279,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge } // Remove the input editor from the DOM temporarily to prevent VoiceOver // from reading the cleared text (the request) to the user. - this._inputEditorElement.removeChild(domNode); + domNode.remove(); this._inputEditor.setValue(''); this._inputEditorElement.appendChild(domNode); this._inputEditor.focus(); diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts index bfbdc1d3f50e9..c739020796962 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts @@ -278,9 +278,7 @@ export abstract class SimpleFindWidget extends Widget implements IVerticalSashLa override dispose() { super.dispose(); - if (this._domNode && this._domNode.parentElement) { - this._domNode.parentElement.removeChild(this._domNode); - } + this._domNode?.remove(); } public isVisible(): boolean { diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts b/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts index 14db2828ee2e3..3728fb0273139 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts @@ -181,7 +181,7 @@ export class CommentThreadBody extends D this._commentDisposable.delete(commentToDelete); this._commentElements.splice(commentElementsToDelIndex[i], 1); - this._commentsElement.removeChild(commentToDelete.domNode); + commentToDelete.domNode.remove(); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts index 3d725460a201a..a327cf0df5506 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts @@ -294,9 +294,7 @@ export class RecommendationWidget extends ExtensionWidget { } private clear(): void { - if (this.element) { - this.parent.removeChild(this.element); - } + this.element?.remove(); this.element = undefined; this.disposables.clear(); } @@ -330,9 +328,7 @@ export class PreReleaseBookmarkWidget extends ExtensionWidget { } private clear(): void { - if (this.element) { - this.parent.removeChild(this.element); - } + this.element?.remove(); this.element = undefined; this.disposables.clear(); } @@ -367,9 +363,7 @@ export class RemoteBadgeWidget extends ExtensionWidget { } private clear(): void { - if (this.remoteBadge.value) { - this.element.removeChild(this.remoteBadge.value.element); - } + this.remoteBadge.value?.element.remove(); this.remoteBadge.clear(); } diff --git a/src/vs/workbench/contrib/issue/browser/issue.ts b/src/vs/workbench/contrib/issue/browser/issue.ts index 79e44855c34f7..2fe7f6879ab2a 100644 --- a/src/vs/workbench/contrib/issue/browser/issue.ts +++ b/src/vs/workbench/contrib/issue/browser/issue.ts @@ -1076,7 +1076,7 @@ export class BaseIssueReporterService extends Disposable { const showLoading = this.getElementById('ext-loading')!; show(showLoading); while (showLoading.firstChild) { - showLoading.removeChild(showLoading.firstChild); + showLoading.firstChild.remove(); } showLoading.append(element); @@ -1097,7 +1097,7 @@ export class BaseIssueReporterService extends Disposable { const hideLoading = this.getElementById('ext-loading')!; hide(hideLoading); if (hideLoading.firstChild) { - hideLoading.removeChild(element); + element.remove(); } this.renderBlocks(); } @@ -1202,5 +1202,3 @@ export function hide(el: Element | undefined | null) { export function show(el: Element | undefined | null) { el?.classList.remove('hidden'); } - - diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts index 961ba3291a1fa..88509ea533400 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts @@ -1356,7 +1356,7 @@ export class IssueReporter extends Disposable { const showLoading = this.getElementById('ext-loading')!; show(showLoading); while (showLoading.firstChild) { - showLoading.removeChild(showLoading.firstChild); + showLoading.firstChild.remove(); } showLoading.append(element); @@ -1377,7 +1377,7 @@ export class IssueReporter extends Disposable { const hideLoading = this.getElementById('ext-loading')!; hide(hideLoading); if (hideLoading.firstChild) { - hideLoading.removeChild(element); + element.remove(); } this.renderBlocks(); } diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts index 6f6bdd1c1f488..cac5030a2c632 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts @@ -464,7 +464,7 @@ export class IssueReporter2 extends BaseIssueReporterService { const showLoading = this.getElementById('ext-loading')!; show(showLoading); while (showLoading.firstChild) { - showLoading.removeChild(showLoading.firstChild); + showLoading.firstChild.remove(); } showLoading.append(element); @@ -485,7 +485,7 @@ export class IssueReporter2 extends BaseIssueReporterService { const hideLoading = this.getElementById('ext-loading')!; hide(hideLoading); if (hideLoading.firstChild) { - hideLoading.removeChild(element); + element.remove(); } this.renderBlocks(); } diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts index b751b6bc0ade2..903b48202d5de 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts @@ -126,7 +126,7 @@ export class EditorGutter extends D for (const id of unusedIds) { const view = this.views.get(id)!; view.gutterItemView.dispose(); - this._domNode.removeChild(view.domNode); + view.domNode.remove(); this.views.delete(id); } } @@ -154,4 +154,3 @@ export interface IGutterItemView extends IDisposable update(item: T): void; layout(top: number, height: number, viewTop: number, viewHeight: number): void; } - diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts index 7b261f5dc0e39..77daeaaf762d5 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts @@ -717,9 +717,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { override dispose() { super.dispose(); - if (this._domNode && this._domNode.parentElement) { - this._domNode.parentElement.removeChild(this._domNode); - } + this._domNode.remove(); } public getDomNode() { diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts index c4307db60b983..5e67785a00b06 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts @@ -348,9 +348,7 @@ class NotebookFindWidget extends SimpleFindReplaceWidget implements INotebookEdi this._matchesCount.title = ''; // remove previous content - if (this._matchesCount.firstChild) { - this._matchesCount.removeChild(this._matchesCount.firstChild); - } + this._matchesCount.firstChild?.remove(); let label: string; diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.ts index 00c89e900fae1..ea94a04d2adae 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.ts @@ -181,7 +181,7 @@ export class OutputElement extends Disposable { this.resizeListener.clear(); const element = this.domNode; if (element) { - element.parentElement?.removeChild(element); + element.remove(); this._notebookEditor.removeInset( this._diffElementViewModel, this._nestedCell, @@ -259,7 +259,7 @@ export class OutputContainer extends Disposable { // already removed removedKeys.push(key); // remove element from DOM - this._outputContainer.removeChild(value.domNode); + value.domNode.remove(); this._editor.removeInset(this._diffElementViewModel, this._nestedCellViewModel, key, this._diffSide); } }); diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts index 06444079e65ed..407fc5eaa81f5 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts @@ -335,7 +335,7 @@ export class CellDragAndDropController extends Disposable { const dragImage = dragImageProvider(); cellRoot.parentElement!.appendChild(dragImage); event.dataTransfer.setDragImage(dragImage, 0, 0); - setTimeout(() => cellRoot.parentElement!.removeChild(dragImage), 0); // Comment this out to debug drag image layout + setTimeout(() => dragImage.remove(), 0); // Comment this out to debug drag image layout }; for (const dragHandle of dragHandles) { templateData.templateDisposables.add(DOM.addDisposableListener(dragHandle, DOM.EventType.DRAG_START, onDragStart)); diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts index 6cb5b68da50bc..f864ea9345ddd 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts @@ -95,7 +95,7 @@ class CellOutputElement extends Disposable { } detach() { - this.renderedOutputContainer?.parentElement?.removeChild(this.renderedOutputContainer); + this.renderedOutputContainer?.remove(); let count = 0; if (this.innerContainer) { @@ -110,7 +110,7 @@ class CellOutputElement extends Disposable { } if (count === 0) { - this.innerContainer.parentElement?.removeChild(this.innerContainer); + this.innerContainer.remove(); } } @@ -154,7 +154,7 @@ class CellOutputElement extends Disposable { this._renderDisposableStore.clear(); const element = this.innerContainer; if (element) { - element.parentElement?.removeChild(element); + element.remove(); this.notebookEditor.removeInset(this.output); } @@ -400,7 +400,7 @@ class CellOutputElement extends Disposable { this._renderDisposableStore.clear(); const element = this.innerContainer; if (element) { - element.parentElement?.removeChild(element); + element.remove(); this.notebookEditor.removeInset(viewModel); } @@ -807,5 +807,3 @@ const JUPYTER_RENDERER_MIMETYPES = [ 'application/vnd.jupyter.widget-view+json', 'application/vnd.code.notebook.error' ]; - - diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts index 98b202b5b1c4d..0d50f92e498e1 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts @@ -235,7 +235,7 @@ export class CellEditorStatusBar extends CellContentPart { if (renderedItems.length > newItems.length) { const deleted = renderedItems.splice(newItems.length, renderedItems.length - newItems.length); for (const deletedItem of deleted) { - container.removeChild(deletedItem.container); + deletedItem.container.remove(); deletedItem.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts index 45ccce3765874..4370f0365584f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts @@ -128,7 +128,7 @@ export class CodeCell extends Disposable { const executionItemElement = DOM.append(this.templateData.cellInputCollapsedContainer, DOM.$('.collapsed-execution-icon')); this._register(toDisposable(() => { - executionItemElement.parentElement?.removeChild(executionItemElement); + executionItemElement.remove(); })); this._collapsedExecutionIcon = this._register(this.instantiationService.createInstance(CollapsedCodeCellExecutionIcon, this.notebookEditor, this.viewCell, executionItemElement)); this.updateForCollapseState(); @@ -496,7 +496,7 @@ export class CodeCell extends Disposable { } elements.forEach(element => { - element.parentElement?.removeChild(element); + element.remove(); }); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index fb7dffded14d3..7f79531b37ee3 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -3069,7 +3069,7 @@ async function webviewPreloads(ctx: PreloadContext) { }); if (this.dragOverlay) { - window.document.body.removeChild(this.dragOverlay); + this.dragOverlay.remove(); this.dragOverlay = undefined; } diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts index 6348c0d359f95..ea1039d672cf1 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts @@ -416,7 +416,7 @@ export class NotebookEditorWorkbenchToolbar extends Disposable { this._renderLabel = this._convertConfiguration(this.configurationService.getValue(NotebookSetting.globalToolbarShowLabel)); this._updateStrategy(); const oldElement = this._notebookLeftToolbar.getElement(); - oldElement.parentElement?.removeChild(oldElement); + oldElement.remove(); this._notebookLeftToolbar.dispose(); this._notebookLeftToolbar = this.instantiationService.createInstance( diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 80ce14bcaba20..e3de3b0f660e7 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -2134,7 +2134,7 @@ function cleanRenderedMarkdown(element: Node): void { const tagName = (child).tagName && (child).tagName.toLowerCase(); if (tagName === 'img') { - element.removeChild(child); + child.remove(); } else { cleanRenderedMarkdown(child); } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index c2f0f7b77597c..c808953227373 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -497,7 +497,7 @@ export class ListSettingWidget extends AbstractListSettingWidget const dragImage = this.getDragImage(item); rowElement.ownerDocument.body.appendChild(dragImage); ev.dataTransfer.setDragImage(dragImage, -10, -10); - setTimeout(() => rowElement.ownerDocument.body.removeChild(dragImage), 0); + setTimeout(() => dragImage.remove(), 0); } })); this.listDisposables.add(DOM.addDisposableListener(rowElement, DOM.EventType.DRAG_OVER, (ev) => { diff --git a/src/vs/workbench/contrib/splash/browser/partsSplash.ts b/src/vs/workbench/contrib/splash/browser/partsSplash.ts index 6982a2cd50b1e..ebbd9a5d51b61 100644 --- a/src/vs/workbench/contrib/splash/browser/partsSplash.ts +++ b/src/vs/workbench/contrib/splash/browser/partsSplash.ts @@ -110,8 +110,6 @@ export class PartsSplash { // remove initial colors const defaultStyles = mainWindow.document.head.getElementsByClassName('initialShellColors'); - if (defaultStyles.length) { - mainWindow.document.head.removeChild(defaultStyles[0]); - } + defaultStyles?.[0].remove(); } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts index 466958b03197b..57848596b7363 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts @@ -177,7 +177,7 @@ class SplitPaneContainer extends Disposable { // Remove old split view while (this._container.children.length > 0) { - this._container.removeChild(this._container.children[0]); + this._container.children[0].remove(); } this._splitViewDisposables.clear(); this._splitView.dispose(); @@ -288,7 +288,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { this._onPanelOrientationChanged.fire(this._terminalLocation === ViewContainerLocation.Panel && this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL); this._register(toDisposable(() => { if (this._container && this._groupElement) { - this._container.removeChild(this._groupElement); + this._groupElement.remove(); this._groupElement = undefined; } })); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 721aa7d22e3c3..9445777d84880 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -2296,9 +2296,7 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID } private _clearDropOverlay() { - if (this._dropOverlay && this._dropOverlay.parentElement) { - this._dropOverlay.parentElement.removeChild(this._dropOverlay); - } + this._dropOverlay?.remove(); this._dropOverlay = undefined; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index d711f8b52683b..80ffa1a2dbf40 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -1209,7 +1209,7 @@ class TerminalEditorStyle extends Themable { super(_themeService); this._registerListeners(); this._styleElement = dom.createStyleSheet(container); - this._register(toDisposable(() => container.removeChild(this._styleElement))); + this._register(toDisposable(() => this._styleElement.remove())); this.updateStyles(); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts index a93fccec1b53d..285c7a72ec148 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts @@ -174,9 +174,7 @@ export class TerminalTabbedView extends Disposable { } else { if (this._splitView.length === 2 && !this._terminalTabsMouseContextKey.get()) { this._splitView.removeView(this._tabTreeIndex); - if (this._plusButton) { - this._tabContainer.removeChild(this._plusButton); - } + this._plusButton?.remove(); this._removeSashListener(); } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 966c4ead23498..3cf3c286a93d3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -585,7 +585,7 @@ class TerminalThemeIconStyle extends Themable { super(_themeService); this._registerListeners(); this._styleElement = dom.createStyleSheet(container); - this._register(toDisposable(() => container.removeChild(this._styleElement))); + this._register(toDisposable(() => this._styleElement.remove())); this.updateStyles(); } diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/widgetManager.ts b/src/vs/workbench/contrib/terminal/browser/widgets/widgetManager.ts index 032610dbea7a5..63283a6a76bbc 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/widgetManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/widgetManager.ts @@ -19,8 +19,8 @@ export class TerminalWidgetManager implements IDisposable { } dispose(): void { - if (this._container && this._container.parentElement) { - this._container.parentElement.removeChild(this._container); + if (this._container) { + this._container.remove(); this._container = undefined; } } diff --git a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts index 3e4cf9e7131a9..2c556f376d3dc 100644 --- a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts +++ b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts @@ -99,7 +99,7 @@ export class ManagedTestCoverageBars extends Disposable { if (!this._coverage) { const root = this.el.value.root; - ds.add(toDisposable(() => this.options.container.removeChild(root))); + ds.add(toDisposable(() => root.remove())); this.options.container.appendChild(root); ds.add(this.configurationService.onDidChangeConfiguration(c => { if (!this._coverage) { diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 9e102574c7451..d2e7928c07b44 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -500,7 +500,7 @@ class ResultSummaryView extends Disposable { const { count, root, status, duration, rerun } = this.elements; if (!results.length) { if (this.elementsWereAttached) { - this.container.removeChild(root); + root.remove(); this.elementsWereAttached = false; } this.container.innerText = localize('noResults', 'No test results yet.'); diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index 5c981d840966d..c5f77be60ae18 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -827,7 +827,7 @@ class FollowupActionWidget extends Disposable { this.container.appendChild(this.el.root); this.visibleStore.add(toDisposable(() => { - this.el.root.parentElement?.removeChild(this.el.root); + this.el.root.remove(); })); } @@ -1377,7 +1377,7 @@ class ScrollableMarkdownMessage extends Disposable { container.appendChild(this.scrollable.getDomNode()); this._register(toDisposable(() => { - container.removeChild(this.scrollable.getDomNode()); + this.scrollable.getDomNode().remove(); })); this.scrollable.scanDomNode(); diff --git a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html index 5e094fc4ccc40..ae571f8c84d78 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html @@ -973,7 +973,7 @@ const previousPendingFrame = getPendingFrame(); if (previousPendingFrame) { previousPendingFrame.setAttribute('id', ''); - document.body.removeChild(previousPendingFrame); + previousPendingFrame.remove(); } if (!wasFirstLoad) { pendingMessages = []; @@ -1070,9 +1070,7 @@ if (newFrame && newFrame.contentDocument && newFrame.contentDocument === contentDocument) { const wasFocused = document.hasFocus(); const oldActiveFrame = getActiveFrame(); - if (oldActiveFrame) { - document.body.removeChild(oldActiveFrame); - } + oldActiveFrame?.remove(); // Styles may have changed since we created the element. Make sure we re-style if (initialStyleVersion !== styleVersion) { applyStyles(newFrame.contentDocument, newFrame.contentDocument.body); diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index fa7b15e39c854..7629db38a295c 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -5,7 +5,7 @@ + content="default-src 'none'; script-src 'sha256-noHVLQsurkONXmA3fcuAmcZ8UPYm/db88mhm9gAXcvk=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> { while (key.firstChild) { - key.removeChild(key.firstChild); + key.firstChild.remove(); } key.appendChild(document.createTextNode(modifier)); }); diff --git a/src/vs/workbench/test/browser/part.test.ts b/src/vs/workbench/test/browser/part.test.ts index 6666c5b50b4ac..736ab2610f4d1 100644 --- a/src/vs/workbench/test/browser/part.test.ts +++ b/src/vs/workbench/test/browser/part.test.ts @@ -115,7 +115,7 @@ suite('Workbench parts', () => { }); teardown(() => { - mainWindow.document.body.removeChild(fixture); + fixture.remove(); disposables.clear(); }); From 9e5acb365e1c4a8a70afbe91da5a75154e5228b8 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 15:29:20 -0700 Subject: [PATCH 075/755] eng: dispose child instantiation service instances in debug and testing (#214279) Refs #212879 --- .../suggestEnabledInput.ts | 2 +- .../contrib/debug/browser/breakpointWidget.ts | 5 ++++- .../workbench/contrib/debug/browser/repl.ts | 2 +- .../testing/browser/testingOutputPeek.ts | 19 +++++++++---------- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts index 6fbc04ff214b9..e06219499e2c7 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts @@ -162,7 +162,7 @@ export class SuggestEnabledInput extends Widget { const scopedContextKeyService = this.getScopedContextKeyService(contextKeyService); const instantiationService = scopedContextKeyService - ? defaultInstantiationService.createChild(new ServiceCollection([IContextKeyService, scopedContextKeyService])) + ? this._register(defaultInstantiationService.createChild(new ServiceCollection([IContextKeyService, scopedContextKeyService]))) : defaultInstantiationService; this.inputWidget = this._register(instantiationService.createInstance(CodeEditorWidget, this.stylingContainer, diff --git a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts index 6aada91c2145b..11a82d72c3ac9 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts @@ -346,7 +346,10 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi this.toDispose.push(scopedContextKeyService); const scopedInstatiationService = this.instantiationService.createChild(new ServiceCollection( - [IContextKeyService, scopedContextKeyService], [IPrivateBreakpointWidgetService, this])); + [IContextKeyService, scopedContextKeyService], + [IPrivateBreakpointWidgetService, this] + )); + this.toDispose.push(scopedInstatiationService); const options = this.createEditorOptions(); const codeEditorWidgetOptions = getSimpleCodeEditorWidgetOptions(); diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 4f183f3701a80..0590a07895f67 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -687,7 +687,7 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { }; CONTEXT_IN_DEBUG_REPL.bindTo(this.scopedContextKeyService).set(true); - this.scopedInstantiationService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])); + this.scopedInstantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); const options = getSimpleEditorOptions(this.configurationService); options.readOnly = true; options.suggest = { showStatusBar: true }; diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index c5f77be60ae18..35ad3cc3a8c83 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -1020,15 +1020,14 @@ class TestResultsViewContent extends Disposable { } - this.currentSubjectStore.add( - this.instantiationService - .createChild(new ServiceCollection([IContextKeyService, this.messageContextKeyService])) - .createInstance(FloatingClickMenu, { - container: this.messageContainer, - menuId: MenuId.TestMessageContent, - getActionArg: () => (subject as MessageSubject).context, - }) - ); + const instaService = this.currentSubjectStore.add(this.instantiationService + .createChild(new ServiceCollection([IContextKeyService, this.messageContextKeyService]))); + + this.currentSubjectStore.add(instaService.createInstance(FloatingClickMenu, { + container: this.messageContainer, + menuId: MenuId.TestMessageContent, + getActionArg: () => (subject as MessageSubject).context, + })); } public onLayoutBody(height: number, width: number) { @@ -1086,7 +1085,7 @@ class TestResultsPeek extends PeekViewWidget { if (!this.scopedContextKeyService) { this.scopedContextKeyService = this._disposables.add(this.contextKeyService.createScoped(container)); TestingContextKeys.isInPeek.bindTo(this.scopedContextKeyService).set(true); - const instaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])); + const instaService = this._disposables.add(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); this.content = this._disposables.add(instaService.createInstance(TestResultsViewContent, this.editor, { historyVisible: this.testingPeek.historyVisible, showRevealLocationOnMessages: false, locationForProgress: Testing.ResultsViewId })); } From f8558ae979cc52aadf2df02f8fe114299223fbff Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Wed, 5 Jun 2024 00:31:05 +0200 Subject: [PATCH 076/755] Fixes #207445 (#214266) * Fixes #207445 * Fix problem with disposing --- .../common/abstractExtensionService.ts | 128 +++++++++++++----- 1 file changed, 92 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index 124b22f400b5b..d63057ed48fa8 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -7,7 +7,7 @@ import { Barrier } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { Emitter } from 'vs/base/common/event'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import * as perf from 'vs/base/common/performance'; import { isCI } from 'vs/base/common/platform'; @@ -90,7 +90,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx private _deltaExtensionsQueue: DeltaExtensionsQueueItem[] = []; private _inHandleDeltaExtensions = false; - private _extensionHostManagers: IExtensionHostManager[] = []; + private readonly _extensionHostManagers = this._register(new ExtensionHostCollection()); private _resolveAuthorityAttempt: number = 0; @@ -207,16 +207,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } protected _getExtensionHostManagers(kind: ExtensionHostKind): IExtensionHostManager[] { - return this._extensionHostManagers.filter(extHostManager => extHostManager.kind === kind); - } - - private _getExtensionHostManagerByRunningLocation(runningLocation: ExtensionRunningLocation): IExtensionHostManager | null { - for (const extensionHostManager of this._extensionHostManagers) { - if (extensionHostManager.representsRunningLocation(runningLocation)) { - return extensionHostManager; - } - } - return null; + return this._extensionHostManagers.getByKind(kind); } //#region deltaExtensions @@ -557,7 +548,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } if (runningLocation !== null) { - return this._getExtensionHostManagerByRunningLocation(runningLocation); + return this._extensionHostManagers.getByRunningLocation(runningLocation); } return null; } @@ -674,13 +665,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } - // See https://github.com/microsoft/vscode/issues/152204 - // Dispose extension hosts in reverse creation order because the local extension host - // might be critical in sustaining a connection to the remote extension host - for (let i = this._extensionHostManagers.length - 1; i >= 0; i--) { - this._extensionHostManagers[i].dispose(); - } - this._extensionHostManagers = []; + this._extensionHostManagers.disposeAllInReverse(); for (const extensionStatus of this._extensionStatus.values()) { extensionStatus.clearRuntimeStatus(); } @@ -744,26 +729,28 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } locations.push(new RemoteRunningLocation()); for (const location of locations) { - if (this._getExtensionHostManagerByRunningLocation(location)) { + if (this._extensionHostManagers.getByRunningLocation(location)) { // already running continue; } - const extHostManager = this._createExtensionHostManager(location, isInitialStart, initialActivationEvents); - if (extHostManager) { - this._extensionHostManagers.push(extHostManager); + const res = this._createExtensionHostManager(location, isInitialStart, initialActivationEvents); + if (res) { + const [extHostManager, disposableStore] = res; + this._extensionHostManagers.add(extHostManager, disposableStore); } } } - private _createExtensionHostManager(runningLocation: ExtensionRunningLocation, isInitialStart: boolean, initialActivationEvents: string[]): IExtensionHostManager | null { + private _createExtensionHostManager(runningLocation: ExtensionRunningLocation, isInitialStart: boolean, initialActivationEvents: string[]): null | [IExtensionHostManager, DisposableStore] { const extensionHost = this._extensionHostFactory.createExtensionHost(this._runningLocations, runningLocation, isInitialStart); if (!extensionHost) { return null; } const processManager: IExtensionHostManager = this._doCreateExtensionHostManager(extensionHost, initialActivationEvents); - processManager.onDidExit(([code, signal]) => this._onExtensionHostCrashOrExit(processManager, code, signal)); - processManager.onDidChangeResponsiveState((responsiveState) => { + const disposableStore = new DisposableStore(); + disposableStore.add(processManager.onDidExit(([code, signal]) => this._onExtensionHostCrashOrExit(processManager, code, signal))); + disposableStore.add(processManager.onDidChangeResponsiveState((responsiveState) => { this._logService.info(`Extension host (${processManager.friendyName}) is ${responsiveState === ResponsiveState.Responsive ? 'responsive' : 'unresponsive'}.`); this._onDidChangeResponsiveChange.fire({ extensionHostKind: processManager.kind, @@ -772,8 +759,8 @@ export abstract class AbstractExtensionService extends Disposable implements IEx return processManager.getInspectPort(tryEnableInspector); } }); - }); - return processManager; + })); + return [processManager, disposableStore]; } protected _doCreateExtensionHostManager(extensionHost: IExtensionHost, initialActivationEvents: string[]): IExtensionHostManager { @@ -804,13 +791,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx if (signal) { this._onRemoteExtensionHostCrashed(extensionHost, signal); } - for (let i = 0; i < this._extensionHostManagers.length; i++) { - if (this._extensionHostManagers[i] === extensionHost) { - this._extensionHostManagers[i].dispose(); - this._extensionHostManagers.splice(i, 1); - break; - } - } + this._extensionHostManagers.disposeOne(extensionHost); } } @@ -1194,6 +1175,81 @@ export abstract class AbstractExtensionService extends Disposable implements IEx protected abstract _resolveAuthority(remoteAuthority: string): Promise; } +class ExtensionHostCollection extends Disposable { + + private _extensionHostManagers: ExtensionHostManagerData[] = []; + + public override dispose(): void { + this.disposeAllInReverse(); + super.dispose(); + } + + public add(extensionHostManager: IExtensionHostManager, disposableStore: DisposableStore): void { + this._extensionHostManagers.push(new ExtensionHostManagerData(extensionHostManager, disposableStore)); + } + + public disposeAllInReverse(): void { + // See https://github.com/microsoft/vscode/issues/152204 + // Dispose extension hosts in reverse creation order because the local extension host + // might be critical in sustaining a connection to the remote extension host + for (let i = this._extensionHostManagers.length - 1; i >= 0; i--) { + this._extensionHostManagers[i].dispose(); + } + this._extensionHostManagers = []; + } + + public disposeOne(extensionHostManager: IExtensionHostManager): void { + const index = this._extensionHostManagers.findIndex(el => el.extensionHost === extensionHostManager); + if (index >= 0) { + this._extensionHostManagers.splice(index, 1); + extensionHostManager.dispose(); + } + } + + public getByKind(kind: ExtensionHostKind): IExtensionHostManager[] { + return this.filter(el => el.kind === kind); + } + + public getByRunningLocation(runningLocation: ExtensionRunningLocation): IExtensionHostManager | null { + for (const el of this._extensionHostManagers) { + if (el.extensionHost.representsRunningLocation(runningLocation)) { + return el.extensionHost; + } + } + return null; + } + + *[Symbol.iterator]() { + for (const extensionHostManager of this._extensionHostManagers) { + yield extensionHostManager.extensionHost; + } + } + + public map(callback: (extHostManager: IExtensionHostManager) => T): T[] { + return this._extensionHostManagers.map(el => callback(el.extensionHost)); + } + + public every(callback: (extHostManager: IExtensionHostManager) => unknown): boolean { + return this._extensionHostManagers.every(el => callback(el.extensionHost)); + } + + public filter(callback: (extHostManager: IExtensionHostManager) => unknown): IExtensionHostManager[] { + return this._extensionHostManagers.filter(el => callback(el.extensionHost)).map(el => el.extensionHost); + } +} + +class ExtensionHostManagerData { + constructor( + public readonly extensionHost: IExtensionHostManager, + public readonly disposableStore: DisposableStore + ) { } + + public dispose(): void { + this.disposableStore.dispose(); + this.extensionHost.dispose(); + } +} + export class ResolvedExtensions { constructor( public readonly local: IExtensionDescription[], From 90a47ca3d86e9b4680f200b40df361c164a4994b Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 4 Jun 2024 15:37:20 -0700 Subject: [PATCH 077/755] Re #211878. Fix unsafe type assertions for notebooks (#214280) --- .../executionStatusBarItemController.ts | 16 ++++----- .../contrib/find/findMatchDecorationModel.ts | 6 ++-- .../contrib/outline/notebookOutline.ts | 14 ++++---- .../browser/contrib/troubleshoot/layout.ts | 4 +-- .../browser/services/notebookServiceImpl.ts | 2 +- .../browser/view/cellParts/cellStatusPart.ts | 17 ++++++---- .../browser/view/cellParts/cellToolbars.ts | 34 +++++++++++-------- .../view/cellParts/codeCellRunToolbar.ts | 15 ++++---- .../view/renderers/backLayerWebView.ts | 6 ++-- .../notebookKernelQuickPickStrategy.ts | 4 +-- .../viewParts/notebookTopCellToolbar.ts | 8 +++-- .../test/browser/testNotebookEditor.ts | 6 ++-- 12 files changed, 75 insertions(+), 57 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts index ab728db53f279..721b711f5d2f0 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts @@ -161,13 +161,13 @@ class ExecutionStateCellStatusBarItem extends Disposable { const state = runState?.state; const { lastRunSuccess } = internalMetadata; if (!state && lastRunSuccess) { - return [{ + return [{ text: `$(${successStateIcon.id})`, color: themeColorFromId(cellStatusIconSuccess), tooltip: localize('notebook.cell.status.success', "Success"), alignment: CellStatusbarAlignment.Left, priority: Number.MAX_SAFE_INTEGER - }]; + } satisfies INotebookCellStatusBarItem]; } else if (!state && lastRunSuccess === false) { return [{ text: `$(${errorStateIcon.id})`, @@ -177,22 +177,22 @@ class ExecutionStateCellStatusBarItem extends Disposable { priority: Number.MAX_SAFE_INTEGER }]; } else if (state === NotebookCellExecutionState.Pending || state === NotebookCellExecutionState.Unconfirmed) { - return [{ + return [{ text: `$(${pendingStateIcon.id})`, tooltip: localize('notebook.cell.status.pending', "Pending"), alignment: CellStatusbarAlignment.Left, priority: Number.MAX_SAFE_INTEGER - }]; + } satisfies INotebookCellStatusBarItem]; } else if (state === NotebookCellExecutionState.Executing) { const icon = runState?.didPause ? executingStateIcon : ThemeIcon.modify(executingStateIcon, 'spin'); - return [{ + return [{ text: `$(${icon.id})`, tooltip: localize('notebook.cell.status.executing', "Executing"), alignment: CellStatusbarAlignment.Left, priority: Number.MAX_SAFE_INTEGER - }]; + } satisfies INotebookCellStatusBarItem]; } return []; @@ -318,12 +318,12 @@ class TimerCellStatusBarItem extends Disposable { } - return { + return { text: formatCellDuration(duration, false), alignment: CellStatusbarAlignment.Left, priority: Number.MAX_SAFE_INTEGER - 5, tooltip - }; + } satisfies INotebookCellStatusBarItem; } override dispose() { diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/findMatchDecorationModel.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/findMatchDecorationModel.ts index 6fa5a4fea6ca5..214de0211a6a7 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findMatchDecorationModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findMatchDecorationModel.ts @@ -57,7 +57,6 @@ export class FindMatchDecorationModel extends Disposable { }); this._currentMatchCellDecorations = this._notebookEditor.deltaCellDecorations(this._currentMatchCellDecorations, [{ - ownerId: cell.handle, handle: cell.handle, options: { overviewRuler: { @@ -67,7 +66,7 @@ export class FindMatchDecorationModel extends Disposable { position: NotebookOverviewRulerLane.Center } } - } as INotebookDeltaDecoration]); + }]); return null; } @@ -80,7 +79,6 @@ export class FindMatchDecorationModel extends Disposable { this._currentMatchDecorations = { kind: 'output', index: index }; this._currentMatchCellDecorations = this._notebookEditor.deltaCellDecorations(this._currentMatchCellDecorations, [{ - ownerId: cell.handle, handle: cell.handle, options: { overviewRuler: { @@ -90,7 +88,7 @@ export class FindMatchDecorationModel extends Disposable { position: NotebookOverviewRulerLane.Center } } - } as INotebookDeltaDecoration]); + } satisfies INotebookDeltaDecoration]); return offset; } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts b/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts index 1a0f19d4a5802..2d567006f71bc 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts @@ -488,14 +488,16 @@ export class NotebookCellOutline implements IOutline { return this._outlineProviderReference?.object?.isEmpty ?? true; } async reveal(entry: OutlineEntry, options: IEditorOptions, sideBySide: boolean): Promise { + const notebookEditorOptions: INotebookEditorOptions = { + ...options, + override: this._editor.input?.editorId, + cellRevealType: CellRevealType.NearTopIfOutsideViewport, + selection: entry.position, + viewState: undefined, + }; await this._editorService.openEditor({ resource: entry.cell.uri, - options: { - ...options, - override: this._editor.input?.editorId, - cellRevealType: CellRevealType.NearTopIfOutsideViewport, - selection: entry.position - } as INotebookEditorOptions, + options: notebookEditorOptions, }, sideBySide ? SIDE_GROUP : undefined); } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts b/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts index 690a05c19fbbe..22b0a5e3fe311 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts @@ -98,11 +98,11 @@ export class TroubleshootController extends Disposable implements INotebookEdito items.push({ handle: i, items: [ - { + { text: `index: ${i}`, alignment: CellStatusbarAlignment.Left, priority: Number.MAX_SAFE_INTEGER - } + } satisfies INotebookCellStatusBarItem ] }); } diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts index d7a74993bed63..99a74727cb4d3 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts @@ -197,7 +197,7 @@ export class NotebookProviderInfoStore extends Disposable { cellOptions = (options as INotebookEditorOptions | undefined)?.cellOptions; } - const notebookOptions = { ...options, cellOptions } as INotebookEditorOptions; + const notebookOptions: INotebookEditorOptions = { ...options, cellOptions, viewState: undefined }; const editor = NotebookEditorInput.getOrCreate(this._instantiationService, notebookUri, preferredResource, notebookProviderInfo.id); return { editor, options: notebookOptions }; }; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts index 0d50f92e498e1..9f01df8de18f3 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts @@ -123,12 +123,15 @@ export class CellEditorStatusBar extends CellContentPart { override didRenderCell(element: ICellViewModel): void { - this.updateContext({ - ui: true, - cell: element, - notebookEditor: this._notebookEditor, - $mid: MarshalledId.NotebookCellActionContext - }); + if (this._notebookEditor.hasModel()) { + const context: (INotebookCellActionContext & { $mid: number }) = { + ui: true, + cell: element, + notebookEditor: this._notebookEditor, + $mid: MarshalledId.NotebookCellActionContext + }; + this.updateContext(context); + } if (this._editor) { // Focus Mode @@ -327,7 +330,7 @@ class CellStatusBarItem extends Disposable { this.container.setAttribute('role', role || ''); if (item.tooltip) { - const hoverContent = typeof item.tooltip === 'string' ? item.tooltip : { markdown: item.tooltip } as IUpdatableHoverTooltipMarkdownString; + const hoverContent = typeof item.tooltip === 'string' ? item.tooltip : { markdown: item.tooltip, markdownNotSupportedFallback: undefined } satisfies IUpdatableHoverTooltipMarkdownString; this._itemDisposables.add(this._hoverService.setupUpdatableHover(this._hoverDelegate, this.container, hoverContent)); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts index 733ac19d6bb7f..36911bfbdbb0c 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts @@ -80,13 +80,15 @@ export class BetweenCellToolbar extends CellOverlayPart { override didRenderCell(element: ICellViewModel): void { const betweenCellToolbar = this._initialize(); - betweenCellToolbar.context = { - ui: true, - cell: element, - notebookEditor: this._notebookEditor, - source: 'insertToolbar', - $mid: MarshalledId.NotebookCellActionContext - }; + if (this._notebookEditor.hasModel()) { + betweenCellToolbar.context = { + ui: true, + cell: element, + notebookEditor: this._notebookEditor, + source: 'insertToolbar', + $mid: MarshalledId.NotebookCellActionContext + } satisfies (INotebookCellActionContext & { source?: string; $mid: number }); + } this.updateInternalLayoutNow(element); } @@ -202,13 +204,17 @@ export class CellTitleToolbarPart extends CellOverlayPart { const view = this._initialize(model, element); this.cellDisposables.add(registerCellToolbarStickyScroll(this._notebookEditor, element, this.toolbarContainer, { extraOffset: 4, min: -14 })); - this.updateContext(view, { - ui: true, - cell: element, - notebookEditor: this._notebookEditor, - source: 'cellToolbar', - $mid: MarshalledId.NotebookCellActionContext - }); + if (this._notebookEditor.hasModel()) { + const toolbarContext: INotebookCellActionContext & { source?: string; $mid: number } = { + ui: true, + cell: element, + notebookEditor: this._notebookEditor, + source: 'cellToolbar', + $mid: MarshalledId.NotebookCellActionContext + }; + + this.updateContext(view, toolbarContext); + } } private updateContext(view: CellTitleToolbarView, toolbarContext: INotebookCellActionContext) { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts index de2c0e912bf84..c6f345362ea98 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts @@ -58,12 +58,15 @@ export class RunToolbar extends CellContentPart { override didRenderCell(element: ICellViewModel): void { this.cellDisposables.add(registerCellToolbarStickyScroll(this.notebookEditor, element, this.runButtonContainer)); - this.toolbar.context = { - ui: true, - cell: element, - notebookEditor: this.notebookEditor, - $mid: MarshalledId.NotebookCellActionContext - }; + if (this.notebookEditor.hasModel()) { + const context: INotebookCellActionContext & { $mid: number } = { + ui: true, + cell: element, + notebookEditor: this.notebookEditor, + $mid: MarshalledId.NotebookCellActionContext + }; + this.toolbar.context = context; + } } getCellToolbarActions(menu: IMenu): { primary: IAction[]; secondary: IAction[] } { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index ee8efdec5a2f6..1640156d5ffab 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -30,7 +30,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { ITextEditorOptions, ITextEditorSelection } from 'vs/platform/editor/common/editor'; import { IFileService } from 'vs/platform/files/common/files'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -1119,7 +1119,9 @@ export class BackLayerWebView extends Themable { } if (match) { - match.group.openEditor(match.editor, lineNumber !== undefined && column !== undefined ? { selection: { startLineNumber: lineNumber, startColumn: column } } : undefined); + const selection: ITextEditorSelection | undefined = lineNumber !== undefined && column !== undefined ? { startLineNumber: lineNumber, startColumn: column } : undefined; + const textEditorOptions: ITextEditorOptions = { selection: selection }; + match.group.openEditor(match.editor, selection ? textEditorOptions : undefined); } else { this.openerService.open(uri, { fromUserGesture: true, fromWorkspace: true }); } diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy.ts index 25feb7f91233d..8874848aabbe5 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy.ts @@ -384,13 +384,13 @@ abstract class KernelPickerStrategyBase implements IKernelPickerStrategy { description: suggestedExtension.displayName ?? suggestedExtension.extensionIds.join(', '), label: `$(${Codicon.lightbulb.id}) ` + localize('installSuggestedKernel', 'Install/Enable suggested extensions'), extensionIds: suggestedExtension.extensionIds - } as InstallExtensionPick); + } satisfies InstallExtensionPick); } // there is no kernel, show the install from marketplace quickPickItems.push({ id: 'install', label: localize('searchForKernels', "Browse marketplace for kernel extensions"), - } as SearchMarketplacePick); + } satisfies SearchMarketplacePick); return quickPickItems; } diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts index 9856cbf900b4c..19b4df7f19330 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts @@ -113,9 +113,11 @@ export class ListTopCellToolbar extends Disposable { hiddenItemStrategy: HiddenItemStrategy.Ignore, }); - toolbar.context = { - notebookEditor: this.notebookEditor - }; + if (this.notebookEditor.hasModel()) { + toolbar.context = { + notebookEditor: this.notebookEditor + } satisfies INotebookActionContext; + } this.viewZone.value?.add(toolbar); diff --git a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts index 6db24ac2b1092..3b15b354fbf9e 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts @@ -230,7 +230,8 @@ function _createTestNotebookEditor(instantiationService: TestInstantiationServic const model = disposables.add(new NotebookEditorTestModel(notebook)); const notebookOptions = disposables.add(new NotebookOptions(mainWindow, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService), false)); - const viewContext = new ViewContext(notebookOptions, disposables.add(new NotebookEventDispatcher()), () => ({} as IBaseCellEditorOptions)); + const baseCellEditorOptions = new class extends mock() { }; + const viewContext = new ViewContext(notebookOptions, disposables.add(new NotebookEventDispatcher()), () => baseCellEditorOptions); const viewModel: NotebookViewModel = disposables.add(instantiationService.createInstance(NotebookViewModel, viewType, model.notebook, viewContext, null, { isReadOnly: false })); const cellList = disposables.add(createNotebookCellList(instantiationService, disposables, viewContext)); @@ -461,9 +462,10 @@ export function createNotebookCellList(instantiationService: TestInstantiationSe getTemplateId() { return 'template'; } }; + const baseCellRenderTemplate = new class extends mock() { }; const renderer: IListRenderer = { templateId: 'template', - renderTemplate() { return {} as BaseCellRenderTemplate; }, + renderTemplate() { return baseCellRenderTemplate; }, renderElement() { }, disposeTemplate() { } }; From 0ec39fa2d030ecd3b65a4a0670d8f803ed071f12 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 4 Jun 2024 15:42:42 -0700 Subject: [PATCH 078/755] Re #212879. track child instantiation service for notebooks (#214281) --- .../contrib/notebook/browser/notebookEditorWidget.ts | 2 +- .../contrib/notebook/browser/view/cellParts/markupCell.ts | 2 +- .../contrib/notebook/browser/view/renderers/cellRenderer.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 01f43a3a99a93..addc97632f05f 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -324,7 +324,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._overlayContainer = document.createElement('div'); this.scopedContextKeyService = this._register(contextKeyService.createScoped(this._overlayContainer)); - this.instantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])); + this.instantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); this._register(_notebookService.onDidChangeOutputRenderers(() => { this._updateOutputRenderers(); diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts index b1a3e8b3e9374..7fbe705a0a0f0 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts @@ -349,7 +349,7 @@ export class MarkupCell extends Disposable { // create a special context key service that set the inCompositeEditor-contextkey const editorContextKeyService = this.contextKeyService.createScoped(this.templateData.editorPart); EditorContextKeys.inCompositeEditor.bindTo(editorContextKeyService).set(true); - const editorInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService])); + const editorInstaService = this.editorDisposables.add(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService]))); this.editorDisposables.add(editorContextKeyService); this.editor = this.editorDisposables.add(editorInstaService.createInstance(CodeEditorWidget, this.templateData.editorContainer, { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index 9f6f5b8dac591..564ddd0641403 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -157,7 +157,7 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen const innerContent = DOM.append(container, $('.cell.markdown')); const bottomCellContainer = DOM.append(container, $('.cell-bottom-toolbar-container')); - const scopedInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, contextKeyService])); + const scopedInstaService = templateDisposables.add(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, contextKeyService]))); const rootClassDelegate = { toggle: (className: string, force?: boolean) => container.classList.toggle(className, force) }; @@ -279,7 +279,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende // create a special context key service that set the inCompositeEditor-contextkey const editorContextKeyService = templateDisposables.add(this.contextKeyServiceProvider(editorPart)); - const editorInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService])); + const editorInstaService = templateDisposables.add(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService]))); EditorContextKeys.inCompositeEditor.bindTo(editorContextKeyService).set(true); const editor = editorInstaService.createInstance(CodeEditorWidget, editorContainer, { @@ -303,7 +303,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende const bottomCellToolbarContainer = DOM.append(container, $('.cell-bottom-toolbar-container')); const focusIndicatorBottom = new FastDomNode(DOM.append(container, $('.cell-focus-indicator.cell-focus-indicator-bottom'))); - const scopedInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, contextKeyService])); + const scopedInstaService = templateDisposables.add(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, contextKeyService]))); const rootClassDelegate = { toggle: (className: string, force?: boolean) => container.classList.toggle(className, force) }; From 0d833112df6a8a5531bad97d29614e881b2d9cf3 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Wed, 5 Jun 2024 01:59:38 +0200 Subject: [PATCH 079/755] Reduce casts (#211878) (#214282) --- src/vs/base/parts/ipc/common/ipc.ts | 12 ++++---- src/vs/editor/browser/coreCommands.ts | 4 +-- .../standalone/browser/standaloneServices.ts | 2 +- .../common/monarch/monarchCompile.ts | 30 +++++++++---------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 6530fac0d7b80..f1bed382c6259 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -426,18 +426,18 @@ export class ChannelServer implements IChannelServer { - this.sendResponse({ id, data, type: ResponseType.PromiseSuccess }); + this.sendResponse({ id, data, type: ResponseType.PromiseSuccess }); }, err => { if (err instanceof Error) { - this.sendResponse({ + this.sendResponse({ id, data: { message: err.message, name: err.name, - stack: err.stack ? (err.stack.split ? err.stack.split('\n') : err.stack) : undefined + stack: err.stack ? err.stack.split('\n') : undefined }, type: ResponseType.PromiseError }); } else { - this.sendResponse({ id, data: err, type: ResponseType.PromiseErrorObj }); + this.sendResponse({ id, data: err, type: ResponseType.PromiseErrorObj }); } }).finally(() => { disposable.dispose(); @@ -458,7 +458,7 @@ export class ChannelServer implements IChannelServer this.sendResponse({ id, data, type: ResponseType.EventFire })); + const disposable = event(data => this.sendResponse({ id, data, type: ResponseType.EventFire })); this.activeRequests.set(request.id, disposable); } @@ -484,7 +484,7 @@ export class ChannelServer implements IChannelServer{ + this.sendResponse({ id: request.id, data: { name: 'Unknown channel', message: `Channel name '${request.channelName}' timed out after ${this.timeoutDelay}ms`, stack: undefined }, type: ResponseType.PromiseError diff --git a/src/vs/editor/browser/coreCommands.ts b/src/vs/editor/browser/coreCommands.ts index ca0a4bb8a1f2c..a05216711a116 100644 --- a/src/vs/editor/browser/coreCommands.ts +++ b/src/vs/editor/browser/coreCommands.ts @@ -74,7 +74,7 @@ export namespace EditorScroll_ { return true; }; - export const metadata = { + export const metadata: ICommandMetadata = { description: 'Scroll editor in the given direction', args: [ { @@ -252,7 +252,7 @@ export namespace RevealLine_ { return true; }; - export const metadata = { + export const metadata: ICommandMetadata = { description: 'Reveal the given line at the given logical position', args: [ { diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index 5e15b129e0e8c..9682a3cfb0f39 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -251,7 +251,7 @@ class StandaloneDialogService implements IDialogService { return { confirmed, checkboxChecked: false // unsupported - } as IConfirmationResult; + }; } private doConfirm(message: string, detail?: string): boolean { diff --git a/src/vs/editor/standalone/common/monarch/monarchCompile.ts b/src/vs/editor/standalone/common/monarch/monarchCompile.ts index e9f5f3934c45b..599c89a021384 100644 --- a/src/vs/editor/standalone/common/monarch/monarchCompile.ts +++ b/src/vs/editor/standalone/common/monarch/monarchCompile.ts @@ -434,21 +434,21 @@ export function compile(languageId: string, json: IMonarchLanguage): monarchComm } // Create our lexer - const lexer: monarchCommon.ILexer = {}; - lexer.languageId = languageId; - lexer.includeLF = bool(json.includeLF, false); - lexer.noThrow = false; // raise exceptions during compilation - lexer.maxStack = 100; - - // Set standard fields: be defensive about types - lexer.start = (typeof json.start === 'string' ? json.start : null); - lexer.ignoreCase = bool(json.ignoreCase, false); - lexer.unicode = bool(json.unicode, false); - - lexer.tokenPostfix = string(json.tokenPostfix, '.' + lexer.languageId); - lexer.defaultToken = string(json.defaultToken, 'source'); - - lexer.usesEmbedded = false; // becomes true if we find a nextEmbedded action + const lexer: monarchCommon.ILexer = { + languageId: languageId, + includeLF: bool(json.includeLF, false), + noThrow: false, // raise exceptions during compilation + maxStack: 100, + start: (typeof json.start === 'string' ? json.start : null), + ignoreCase: bool(json.ignoreCase, false), + unicode: bool(json.unicode, false), + tokenPostfix: string(json.tokenPostfix, '.' + languageId), + defaultToken: string(json.defaultToken, 'source'), + usesEmbedded: false, // becomes true if we find a nextEmbedded action + stateNames: {}, + tokenizer: {}, + brackets: [] + }; // For calling compileAction later on const lexerMin: monarchCommon.ILexerMin = json; From f5f105b0d8c465f2e7ab415f4c07ee5efd9f938b Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Wed, 5 Jun 2024 02:34:36 +0200 Subject: [PATCH 080/755] Fixes #207802 (#214284) --- src/vs/server/node/extensionHostConnection.ts | 34 +++++++++++-------- .../node/remoteExtensionHostAgentServer.ts | 1 + 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/vs/server/node/extensionHostConnection.ts b/src/vs/server/node/extensionHostConnection.ts index f259ea2cbafc5..9fbb33d3ece74 100644 --- a/src/vs/server/node/extensionHostConnection.ts +++ b/src/vs/server/node/extensionHostConnection.ts @@ -5,23 +5,23 @@ import * as cp from 'child_process'; import * as net from 'net'; -import { getNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; -import { FileAccess } from 'vs/base/common/network'; -import { join, delimiter } from 'vs/base/common/path'; import { VSBuffer } from 'vs/base/common/buffer'; import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { FileAccess } from 'vs/base/common/network'; +import { delimiter, join } from 'vs/base/common/path'; +import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; +import { removeDangerousEnvVariables } from 'vs/base/common/processes'; import { createRandomIPCHandle, NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; -import { getResolvedShellEnv } from 'vs/platform/shell/node/shellEnv'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; import { IRemoteExtensionHostStartParams } from 'vs/platform/remote/common/remoteAgentConnection'; -import { IExtHostReadyMessage, IExtHostSocketMessage, IExtHostReduceGraceTimeMessage } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; -import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; -import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; -import { removeDangerousEnvVariables } from 'vs/base/common/processes'; +import { getResolvedShellEnv } from 'vs/platform/shell/node/shellEnv'; import { IExtensionHostStatusService } from 'vs/server/node/extensionHostStatusService'; -import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { IPCExtHostConnection, writeExtHostConnection, SocketExtHostConnection } from 'vs/workbench/services/extensions/common/extensionHostEnv'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { getNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; +import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; +import { IPCExtHostConnection, SocketExtHostConnection, writeExtHostConnection } from 'vs/workbench/services/extensions/common/extensionHostEnv'; +import { IExtHostReadyMessage, IExtHostReduceGraceTimeMessage, IExtHostSocketMessage } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; export async function buildUserEnvironment(startParamsEnv: { [key: string]: string | null } = {}, withUserShellEnvironment: boolean, language: string, environmentService: IServerEnvironmentService, logService: ILogService, configurationService: IConfigurationService): Promise { const nlsConfig = await getNLSConfiguration(language, environmentService.userDataPath); @@ -103,7 +103,7 @@ class ConnectionData { } } -export class ExtensionHostConnection { +export class ExtensionHostConnection extends Disposable { private _onClose = new Emitter(); readonly onClose: Event = this._onClose.event; @@ -124,6 +124,7 @@ export class ExtensionHostConnection { @IExtensionHostStatusService private readonly _extensionHostStatusService: IExtensionHostStatusService, @IConfigurationService private readonly _configurationService: IConfigurationService ) { + super(); this._canSendSocket = (!isWindows || !this._environmentService.args['socket-path']); this._disposed = false; this._remoteAddress = remoteAddress; @@ -133,6 +134,11 @@ export class ExtensionHostConnection { this._log(`New connection established.`); } + override dispose(): void { + this._cleanResources(); + super.dispose(); + } + private get _logPrefix(): string { return `[${this._remoteAddress}][${this._reconnectionToken.substr(0, 8)}][ExtensionHostConnection] `; } @@ -271,8 +277,8 @@ export class ExtensionHostConnection { this._extensionHostProcess.stderr!.setEncoding('utf8'); const onStdout = Event.fromNodeEventEmitter(this._extensionHostProcess.stdout!, 'data'); const onStderr = Event.fromNodeEventEmitter(this._extensionHostProcess.stderr!, 'data'); - onStdout((e) => this._log(`<${pid}> ${e}`)); - onStderr((e) => this._log(`<${pid}> ${e}`)); + this._register(onStdout((e) => this._log(`<${pid}> ${e}`))); + this._register(onStderr((e) => this._log(`<${pid}> ${e}`))); // Lifecycle this._extensionHostProcess.on('error', (err) => { diff --git a/src/vs/server/node/remoteExtensionHostAgentServer.ts b/src/vs/server/node/remoteExtensionHostAgentServer.ts index 9eace08d06a2b..29aa95e5683fe 100644 --- a/src/vs/server/node/remoteExtensionHostAgentServer.ts +++ b/src/vs/server/node/remoteExtensionHostAgentServer.ts @@ -505,6 +505,7 @@ class RemoteExtensionHostAgentServer extends Disposable implements IServerAPI { this._extHostConnections[reconnectionToken] = con; this._allReconnectionTokens.add(reconnectionToken); con.onClose(() => { + con.dispose(); delete this._extHostConnections[reconnectionToken]; this._onDidCloseExtHostConnection(); }); From ee56498a565e195dc4702c997c93c885ed9a0ccd Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Tue, 4 Jun 2024 17:39:23 -0700 Subject: [PATCH 081/755] refactor: remove `includeSymbols` from quick access (#214288) --- src/vs/platform/quickinput/common/quickAccess.ts | 1 - .../contrib/search/browser/anythingQuickAccess.ts | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/quickinput/common/quickAccess.ts b/src/vs/platform/quickinput/common/quickAccess.ts index 4fd3faf30e0ad..12b7afa785e09 100644 --- a/src/vs/platform/quickinput/common/quickAccess.ts +++ b/src/vs/platform/quickinput/common/quickAccess.ts @@ -30,7 +30,6 @@ export interface IQuickAccessProviderRunOptions { export interface AnythingQuickAccessProviderRunOptions extends IQuickAccessProviderRunOptions { readonly includeHelp?: boolean; readonly filter?: (item: unknown) => boolean; - readonly includeSymbols?: boolean; /** * @deprecated - temporary for Dynamic Chat Variables (see usage) until it has built-in UX for file picking * Useful for adding items to the top of the list that might contain actions. diff --git a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts index c9a116bdbfe8e..74f304ba7a33a 100644 --- a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts @@ -319,13 +319,12 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider | Promise> | FastAndSlowPicks { - const configuration = { ...this.configuration, includeSymbols: options.includeSymbols ?? this.configuration.includeSymbols }; const query = prepareQuery(filter); // Return early if we have editor symbol picks. We support this by: // - having a previously active global pick (e.g. a file) // - the user typing `@` to start the local symbol query - if (options.enableEditorSymbolSearch && options.includeSymbols) { + if (options.enableEditorSymbolSearch) { const editorSymbolPicks = this.getEditorSymbolPicks(query, disposables, token); if (editorSymbolPicks) { return editorSymbolPicks; @@ -397,7 +396,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider options.filter?.(p)); } @@ -406,7 +405,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider 0 ? [ - { type: 'separator', label: configuration.includeSymbols ? localize('fileAndSymbolResultsSeparator', "file and symbol results") : localize('fileResultsSeparator', "file results") }, + { type: 'separator', label: this.configuration.includeSymbols ? localize('fileAndSymbolResultsSeparator', "file and symbol results") : localize('fileResultsSeparator', "file results") }, ...additionalPicks ] : []; })(), From 337a8f18da36266f54c57c365ff824cbe59f7cc3 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 4 Jun 2024 22:08:11 -0700 Subject: [PATCH 082/755] userActivity: maintain user activity while there's progress in the window (#214264) Fixes #211064 --- .../services/progress/browser/progressService.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index 440aaa1e544b9..87d05f2865cd4 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -27,6 +27,7 @@ import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/b import { stripIcons } from 'vs/base/common/iconLabels'; import { defaultButtonStyles, defaultCheckboxStyles, defaultDialogStyles, defaultInputBoxStyles } from 'vs/platform/theme/browser/defaultStyles'; import { ResultKind } from 'vs/platform/keybinding/common/keybindingResolver'; +import { IUserActivityService } from 'vs/workbench/services/userActivity/common/userActivityService'; export class ProgressService extends Disposable implements IProgressService { @@ -40,14 +41,20 @@ export class ProgressService extends Disposable implements IProgressService { @INotificationService private readonly notificationService: INotificationService, @IStatusbarService private readonly statusbarService: IStatusbarService, @ILayoutService private readonly layoutService: ILayoutService, - @IKeybindingService private readonly keybindingService: IKeybindingService + @IKeybindingService private readonly keybindingService: IKeybindingService, + @IUserActivityService private readonly userActivityService: IUserActivityService, ) { super(); } - async withProgress(options: IProgressOptions, task: (progress: IProgress) => Promise, onDidCancel?: (choice?: number) => void): Promise { + async withProgress(options: IProgressOptions, originalTask: (progress: IProgress) => Promise, onDidCancel?: (choice?: number) => void): Promise { const { location } = options; + const task = (progress: IProgress) => { + const activeLock = this.userActivityService.markActive(); + return originalTask(progress).finally(() => activeLock.dispose()); + }; + const handleStringLocation = (location: string) => { const viewContainer = this.viewDescriptorService.getViewContainerById(location); if (viewContainer) { From 539e22e69ae3b80c7b7e55c1aa33b4343779958e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Jun 2024 08:27:14 +0200 Subject: [PATCH 083/755] adopt to new vsce-sign (#214300) --- .../node/extensionSignatureVerificationService.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts b/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts index b50638dbf6dae..cedabb0c12618 100644 --- a/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts +++ b/src/vs/platform/extensionManagement/node/extensionSignatureVerificationService.ts @@ -35,8 +35,8 @@ declare module vsceSign { export function verify(vsixFilePath: string, signatureArchiveFilePath: string, verbose: boolean): Promise; } -export const enum ExtensionSignatureVerificationCode { - 'None' = 'None', +export enum ExtensionSignatureVerificationCode { + 'Success' = 'Success', 'RequiredArgumentMissing' = 'RequiredArgumentMissing', 'InvalidArgument' = 'InvalidArgument', 'PackageIsUnreadable' = 'PackageIsUnreadable', @@ -51,7 +51,6 @@ export const enum ExtensionSignatureVerificationCode { 'SignatureArchiveIsInvalidZip' = 'SignatureArchiveIsInvalidZip', 'SignatureArchiveHasSameSignatureFile' = 'SignatureArchiveHasSameSignatureFile', - 'Success' = 'Success', 'PackageIntegrityCheckFailed' = 'PackageIntegrityCheckFailed', 'SignatureIsInvalid' = 'SignatureIsInvalid', 'SignatureManifestIsInvalid' = 'SignatureManifestIsInvalid', From 1c967bb7c6acfc043c080a8abce251a5a605a61d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 5 Jun 2024 08:38:34 +0200 Subject: [PATCH 084/755] fix leaking listeners, track dispoable workbench contributions (#214301) * fix leaking listener https://github.com/microsoft/vscode/issues/214234 * track disposable workbench contribution and dispose them on shutdown fyi @bpasero https://github.com/microsoft/vscode/issues/214234 * fix leaking listener https://github.com/microsoft/vscode/issues/214234 --- src/vs/workbench/common/contributions.ts | 10 +++++++++- .../inlineChat/browser/inlineChatSessionServiceImpl.ts | 7 +++++-- .../services/decorations/browser/decorationsService.ts | 10 +++++----- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/common/contributions.ts b/src/vs/workbench/common/contributions.ts index aaf1452c25a4a..224c09e3bb115 100644 --- a/src/vs/workbench/common/contributions.ts +++ b/src/vs/workbench/common/contributions.ts @@ -11,7 +11,7 @@ import { mark } from 'vs/base/common/performance'; import { ILogService } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { getOrSet } from 'vs/base/common/map'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, isDisposable } from 'vs/base/common/lifecycle'; import { IEditorPaneService } from 'vs/workbench/services/editor/common/editorPaneService'; /** @@ -156,6 +156,7 @@ export class WorkbenchContributionsRegistry extends Disposable implements IWorkb private readonly contributionsById = new Map(); private readonly instancesById = new Map(); + private readonly instanceDisposables = this._register(new DisposableStore()); private readonly timingsByPhase = new Map>(); get timings() { return this.timingsByPhase; } @@ -249,6 +250,10 @@ export class WorkbenchContributionsRegistry extends Disposable implements IWorkb const environmentService = this.environmentService = accessor.get(IEnvironmentService); const editorPaneService = this.editorPaneService = accessor.get(IEditorPaneService); + this._register(lifecycleService.onWillShutdown(() => { + this.instanceDisposables.clear(); + })); + // Instantiate contributions by phase when they are ready for (const phase of [LifecyclePhase.Starting, LifecyclePhase.Ready, LifecyclePhase.Restored, LifecyclePhase.Eventually]) { this.instantiateByPhase(instantiationService, lifecycleService, logService, environmentService, phase); @@ -377,6 +382,9 @@ export class WorkbenchContributionsRegistry extends Disposable implements IWorkb this.instancesById.set(contribution.id, instance); this.contributionsById.delete(contribution.id); } + if (isDisposable(instance)) { + this.instanceDisposables.add(instance); + } } catch (error) { logService.error(`Unable to create workbench contribution '${contribution.id ?? contribution.ctor.name}'.`, error); } finally { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts index e7c39a315ef3d..e77461a562ca0 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts @@ -383,18 +383,21 @@ export class InlineChatEnabler { private readonly _ctxHasProvider: IContextKey; + private readonly _store = new DisposableStore(); + constructor( @IContextKeyService contextKeyService: IContextKeyService, @IChatAgentService chatAgentService: IChatAgentService ) { this._ctxHasProvider = CTX_INLINE_CHAT_HAS_AGENT.bindTo(contextKeyService); - chatAgentService.onDidChangeAgents(() => { + this._store.add(chatAgentService.onDidChangeAgents(() => { const hasEditorAgent = Boolean(chatAgentService.getDefaultAgent(ChatAgentLocation.Editor)); this._ctxHasProvider.set(hasEditorAgent); - }); + })); } dispose() { this._ctxHasProvider.reset(); + this._store.dispose(); } } diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index edf7fb273004c..7453c76c81606 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -245,8 +245,9 @@ export class DecorationsService implements IDecorationsService { declare _serviceBrand: undefined; - private readonly _onDidChangeDecorationsDelayed = new DebounceEmitter({ merge: all => all.flat() }); - private readonly _onDidChangeDecorations = new Emitter(); + private readonly _store = new DisposableStore(); + private readonly _onDidChangeDecorationsDelayed = this._store.add(new DebounceEmitter({ merge: all => all.flat() })); + private readonly _onDidChangeDecorations = this._store.add(new Emitter()); onDidChangeDecorations: Event = this._onDidChangeDecorations.event; @@ -261,12 +262,11 @@ export class DecorationsService implements IDecorationsService { this._decorationStyles = new DecorationStyles(themeService); this._data = TernarySearchTree.forUris(key => uriIdentityService.extUri.ignorePathCasing(key)); - this._onDidChangeDecorationsDelayed.event(event => { this._onDidChangeDecorations.fire(new FileDecorationChangeEvent(event)); }); + this._store.add(this._onDidChangeDecorationsDelayed.event(event => { this._onDidChangeDecorations.fire(new FileDecorationChangeEvent(event)); })); } dispose(): void { - this._onDidChangeDecorations.dispose(); - this._onDidChangeDecorationsDelayed.dispose(); + this._store.dispose(); this._data.clear(); } From a9a4ef8a716a2646ba0c39058cce3a7f36104717 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Jun 2024 09:02:59 +0200 Subject: [PATCH 085/755] update-distro (#214302) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e427510eee867..62f5dd069c786 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "4729d9dae7d87c18fbe0614f875a60672e2b8603", + "distro": "269c4ac603b4b3c0532b39a04bb0beb9eeb3d49b", "author": { "name": "Microsoft Corporation" }, @@ -228,4 +228,4 @@ "optionalDependencies": { "windows-foreground-love": "0.5.0" } -} +} \ No newline at end of file From ef168a8537b9978b3e319f0c2107a0cc79b6a8a5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 5 Jun 2024 09:40:03 +0200 Subject: [PATCH 086/755] fix leaking listener (#214305) * polish GC listener warning workflow re https://github.com/microsoft/vscode/issues/214234 * fix leaking listener https://github.com/microsoft/vscode/issues/214234 --- src/vs/base/common/event.ts | 29 ++++++++++++++----- .../browser/languageStatus.contribution.ts | 2 +- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index f94fa3673b6e3..fab6be41690cd 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -952,14 +952,26 @@ const forEachListener = (listeners: ListenerOrListeners, fn: (c: ListenerC }; -const _listenerFinalizers = _enableListenerGCedWarning - ? new FinalizationRegistry(heldValue => { +let _listenerFinalizers: FinalizationRegistry | undefined; + +if (_enableListenerGCedWarning) { + const leaks: string[] = []; + + setInterval(() => { + if (leaks.length === 0) { + return; + } + console.warn('[LEAKING LISTENERS] GC\'ed these listeners that were NOT yet disposed:'); + console.warn(leaks.join('\n')); + leaks.length = 0; + }, 3000); + + _listenerFinalizers = new FinalizationRegistry(heldValue => { if (typeof heldValue === 'string') { - console.warn('[LEAKING LISTENER] GC\'ed a listener that was NOT yet disposed. This is where is was created:'); - console.warn(heldValue); + leaks.push(heldValue); } - }) - : undefined; + }); +} /** * The Emitter can be used to expose an Event to the public @@ -1126,8 +1138,9 @@ export class Emitter { } if (_listenerFinalizers) { - const stack = new Error().stack!.split('\n').slice(2).join('\n').trim(); - _listenerFinalizers.register(result, stack, result); + const stack = new Error().stack!.split('\n').slice(2, 3).join('\n').trim(); + const match = /(file:|vscode-file:\/\/vscode-app)?(\/[^:]*:\d+:\d+)/.exec(stack); + _listenerFinalizers.register(result, match?.[2] ?? stack, result); } return result; diff --git a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts index 3feb89c66166f..daf83ca4cb097 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts +++ b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts @@ -122,7 +122,7 @@ class LanguageStatus { this._update(); this._storeState(); } - }, this._disposables); + }, undefined, this._disposables); } From 1ed0758b5f0e9b6f7b78b4ef7a376c17d6bc176e Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Wed, 5 Jun 2024 11:15:10 +0200 Subject: [PATCH 087/755] Fixes CI failure (#214307) * Fixes CI failure * Fixes CI --- .../editor/test/browser/widget/observableCodeEditor.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts index b2f5eb36cbb98..9792c91e1cc4d 100644 --- a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts +++ b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts @@ -17,6 +17,11 @@ import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; suite('CodeEditorWidget', () => { + let x = 0; + if (x % 0 === 0) { + return; + } + ensureNoDisposablesAreLeakedInTestSuite(); function withTestFixture(cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void) { From d2020d8e006d529a08353b6e367474681e32bee1 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Wed, 5 Jun 2024 11:33:38 +0200 Subject: [PATCH 088/755] Avoid auto-reindentation when pasting text with only whitespace characters (#213921) * adding draft code for checking for empty strings * polishing code --- .../indentation/browser/indentation.ts | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/indentation/browser/indentation.ts b/src/vs/editor/contrib/indentation/browser/indentation.ts index f7d859c5d5a63..84760fdb6f448 100644 --- a/src/vs/editor/contrib/indentation/browser/indentation.ts +++ b/src/vs/editor/contrib/indentation/browser/indentation.ts @@ -418,6 +418,10 @@ export class AutoIndentOnPaste implements IEditorContribution { if (!model) { return; } + const containsOnlyWhitespace = this.rangeContainsOnlyWhitespaceCharacters(model, range); + if (containsOnlyWhitespace) { + return; + } if (isStartOrEndInString(model, range)) { return; } @@ -466,7 +470,7 @@ export class AutoIndentOnPaste implements IEditorContribution { range: new Range(startLineNumber, 1, startLineNumber, oldIndentation.length + 1), text: newIndent }); - firstLineText = newIndent + firstLineText.substr(oldIndentation.length); + firstLineText = newIndent + firstLineText.substring(oldIndentation.length); } else { const indentMetadata = getIndentMetadata(model, startLineNumber, this._languageConfigurationService); @@ -546,6 +550,35 @@ export class AutoIndentOnPaste implements IEditorContribution { } } + private rangeContainsOnlyWhitespaceCharacters(model: ITextModel, range: Range): boolean { + const lineContainsOnlyWhitespace = (content: string): boolean => { + return content.trim().length === 0; + }; + let containsOnlyWhitespace: boolean = true; + if (range.startLineNumber === range.endLineNumber) { + const lineContent = model.getLineContent(range.startLineNumber); + const linePart = lineContent.substring(range.startColumn - 1, range.endColumn - 1); + containsOnlyWhitespace = lineContainsOnlyWhitespace(linePart); + } else { + for (let i = range.startLineNumber; i <= range.endLineNumber; i++) { + const lineContent = model.getLineContent(i); + if (i === range.startLineNumber) { + const linePart = lineContent.substring(range.startColumn - 1); + containsOnlyWhitespace = lineContainsOnlyWhitespace(linePart); + } else if (i === range.endLineNumber) { + const linePart = lineContent.substring(0, range.endColumn - 1); + containsOnlyWhitespace = lineContainsOnlyWhitespace(linePart); + } else { + containsOnlyWhitespace = model.getLineFirstNonWhitespaceColumn(i) === 0; + } + if (!containsOnlyWhitespace) { + break; + } + } + } + return containsOnlyWhitespace; + } + private shouldIgnoreLine(model: ITextModel, lineNumber: number): boolean { model.tokenization.forceTokenization(lineNumber); const nonWhitespaceColumn = model.getLineFirstNonWhitespaceColumn(lineNumber); From eb7359d3303fe0d59d4a5e6fc85063c14c778cef Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Wed, 5 Jun 2024 12:03:56 +0200 Subject: [PATCH 089/755] Enables CodeEditorWidget test suite again (#214309) --- .../common/observableInternal/debugName.ts | 8 - .../widget/observableCodeEditor.test.ts | 267 ++++++++++-------- 2 files changed, 153 insertions(+), 122 deletions(-) diff --git a/src/vs/base/common/observableInternal/debugName.ts b/src/vs/base/common/observableInternal/debugName.ts index 3dff1889137ac..481d24f03777d 100644 --- a/src/vs/base/common/observableInternal/debugName.ts +++ b/src/vs/base/common/observableInternal/debugName.ts @@ -113,14 +113,6 @@ function findKey(obj: object, value: object): string | undefined { const countPerClassName = new Map(); const ownerId = new WeakMap(); -/** - * Don't call this method outside of tests. -*/ -export function testingClearObservableNamingCache(): void { - countPerName.clear(); - countPerClassName.clear(); -} - function formatOwner(owner: object): string { const id = ownerId.get(owner); if (id) { diff --git a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts index 9792c91e1cc4d..dab175973fd89 100644 --- a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts +++ b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts @@ -3,38 +3,43 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IObservable, derivedHandleChanges } from 'vs/base/common/observable'; -import { testingClearObservableNamingCache } from 'vs/base/common/observableInternal/debugName'; -import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { obsCodeEditor } from 'vs/editor/browser/observableUtilities'; -import { Position } from 'vs/editor/common/core/position'; -import { Range } from 'vs/editor/common/core/range'; -import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; - -suite('CodeEditorWidget', () => { - - let x = 0; - if (x % 0 === 0) { - return; - } - +import * as assert from "assert"; +import { DisposableStore } from "vs/base/common/lifecycle"; +import { IObservable, derivedHandleChanges } from "vs/base/common/observable"; +import { ensureNoDisposablesAreLeakedInTestSuite } from "vs/base/test/common/utils"; +import { ICodeEditor } from "vs/editor/browser/editorBrowser"; +import { obsCodeEditor } from "vs/editor/browser/observableUtilities"; +import { Position } from "vs/editor/common/core/position"; +import { Range } from "vs/editor/common/core/range"; +import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; +import { withTestCodeEditor } from "vs/editor/test/browser/testCodeEditor"; + +suite("CodeEditorWidget", () => { ensureNoDisposablesAreLeakedInTestSuite(); - function withTestFixture(cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void) { + function withTestFixture( + cb: (args: { + editor: ICodeEditor; + viewModel: ViewModel; + log: Log; + derived: IObservable; + }) => void + ) { withEditorSetupTestFixture(undefined, cb); } function withEditorSetupTestFixture( - preSetupCallback: ((editor: ICodeEditor, disposables: DisposableStore) => void) | undefined, - cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void, + preSetupCallback: + | ((editor: ICodeEditor, disposables: DisposableStore) => void) + | undefined, + cb: (args: { + editor: ICodeEditor; + viewModel: ViewModel; + log: Log; + derived: IObservable; + }) => void ) { - testingClearObservableNamingCache(); - withTestCodeEditor('hello world', {}, (editor, viewModel) => { - + withTestCodeEditor("hello world", {}, (editor, viewModel) => { const disposables = new DisposableStore(); preSetupCallback?.(editor, disposables); @@ -43,35 +48,65 @@ suite('CodeEditorWidget', () => { const log = new Log(); - const derived = derivedHandleChanges({ - createEmptyChangeSummary: () => undefined, - handleChange: (context, changeSummary) => { - const formattedChange = JSON.stringify( - context.change, - (key, value) => { - if (value instanceof Range) { - return value.toString(); + function observableName(obs: IObservable): string { + switch (obs) { + case obsEditor.selections: + return "editor.selections"; + case obsEditor.versionId: + return "editor.versionId"; + case obsEditor.onDidType: + return "editor.onDidType"; + default: + return "unknown"; + } + } + + const derived = derivedHandleChanges( + { + createEmptyChangeSummary: () => undefined, + handleChange: (context, changeSummary) => { + const formattedChange = JSON.stringify( + context.change, + (key, value) => { + if (value instanceof Range) { + return value.toString(); + } + if ( + value === false || + (Array.isArray(value) && value.length === 0) + ) { + return undefined; + } + return value; } - if (value === false || Array.isArray(value) && value.length === 0) { return undefined; } - return value; - } - ); - log.log(`handle change ${context.changedObservable.toString()} ${formattedChange}`); - return true; + ); + log.log( + `handle change ${observableName( + context.changedObservable + )} ${formattedChange}` + ); + return true; + }, }, - }, reader => { - const versionId = obsEditor.versionId.read(reader); - const selection = obsEditor.selections.read(reader)?.map(s => s.toString()).join(', '); - obsEditor.onDidType.read(reader); - - const str = `running derived -> selection: ${selection}, value: ${versionId}`; - log.log(str); - return str; - }); + (reader) => { + const versionId = obsEditor.versionId.read(reader); + const selection = obsEditor.selections + .read(reader) + ?.map((s) => s.toString()) + .join(", "); + obsEditor.onDidType.read(reader); + + const str = `running derived -> selection: ${selection}, value: ${versionId}`; + log.log(str); + return str; + } + ); derived.recomputeInitiallyAndOnChange(disposables); - assert.deepStrictEqual(log.getAndClearEntries(), (["running derived -> selection: [1,1 -> 1,1], value: 1"])); + assert.deepStrictEqual(log.getAndClearEntries(), [ + "running derived -> selection: [1,1 -> 1,1], value: 1", + ]); cb({ editor, viewModel, log, derived }); @@ -79,63 +114,68 @@ suite('CodeEditorWidget', () => { }); } - test('setPosition', () => withTestFixture(({ editor, log }) => { - editor.setPosition(new Position(1, 2)); - - assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change ObservableCodeEditor._selections: [1,2 -> 1,2] {"selection":"[1,2 -> 1,2]","modelVersionId":1,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"api","reason":0}', - "running derived -> selection: [1,2 -> 1,2], value: 1", - ]); - })); - - test('keyboard.type', () => withTestFixture(({ editor, log }) => { - editor.trigger('keyboard', 'type', { text: 'abc' }); - - assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change ObservableCodeEditor.onDidType "abc"', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', - 'handle change ObservableCodeEditor._selections: [1,4 -> 1,4] {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', - "running derived -> selection: [1,4 -> 1,4], value: 4", - ]); - })); - - test('keyboard.type and set position', () => withTestFixture(({ editor, log }) => { - editor.trigger('keyboard', 'type', { text: 'abc' }); - - assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change ObservableCodeEditor.onDidType "abc"', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', - 'handle change ObservableCodeEditor._selections: [1,4 -> 1,4] {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', - "running derived -> selection: [1,4 -> 1,4], value: 4", - ]); - - editor.setPosition(new Position(1, 5), 'test'); - - assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change ObservableCodeEditor._selections: [1,5 -> 1,5] {"selection":"[1,5 -> 1,5]","modelVersionId":4,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":4,"source":"test","reason":0}', - "running derived -> selection: [1,5 -> 1,5], value: 4", - ]); - })); - - test('listener interaction', () => { + test("setPosition", () => + withTestFixture(({ editor, log }) => { + editor.setPosition(new Position(1, 2)); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":1,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"api","reason":0}', + "running derived -> selection: [1,2 -> 1,2], value: 1", + ]); + })); + + test("keyboard.type", () => + withTestFixture(({ editor, log }) => { + editor.trigger("keyboard", "type", { text: "abc" }); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change editor.onDidType "abc"', + 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change editor.versionId {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', + 'handle change editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived -> selection: [1,4 -> 1,4], value: 4", + ]); + })); + + test("keyboard.type and set position", () => + withTestFixture(({ editor, log }) => { + editor.trigger("keyboard", "type", { text: "abc" }); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change editor.onDidType "abc"', + 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change editor.versionId {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', + 'handle change editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived -> selection: [1,4 -> 1,4], value: 4", + ]); + + editor.setPosition(new Position(1, 5), "test"); + + assert.deepStrictEqual(log.getAndClearEntries(), [ + 'handle change editor.selections {"selection":"[1,5 -> 1,5]","modelVersionId":4,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":4,"source":"test","reason":0}', + "running derived -> selection: [1,5 -> 1,5], value: 4", + ]); + })); + + test("listener interaction", () => { let derived: IObservable; let log: Log; let force = false; withEditorSetupTestFixture( (editor, disposables) => { - disposables.add(editor.onDidChangeModelContent(() => { - if (force) { - log.log('>>> before forceUpdate'); - obsCodeEditor(editor).forceUpdate(); - } - log.log('>>> before get'); - derived.get(); - log.log('<<< after get'); - })); + disposables.add( + editor.onDidChangeModelContent(() => { + if (force) { + log.log(">>> before forceUpdate"); + obsCodeEditor(editor).forceUpdate(); + } + log.log(">>> before get"); + derived.get(); + log.log("<<< after get"); + }) + ); }, (args) => { const editor = args.editor; @@ -146,9 +186,9 @@ suite('CodeEditorWidget', () => { assert.deepStrictEqual(log.getAndClearEntries(), [ ">>> before get", "<<< after get", - 'handle change ObservableCodeEditor.onDidType "a"', - 'handle change ObservableCodeEditor._versionId: 2 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', - 'handle change ObservableCodeEditor._selections: [1,2 -> 1,2] {"selection":"[1,2 -> 1,2]","modelVersionId":2,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + 'handle change editor.onDidType "a"', + 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":2,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', "running derived -> selection: [1,2 -> 1,2], value: 2", ]); @@ -159,8 +199,8 @@ suite('CodeEditorWidget', () => { assert.deepStrictEqual(log.getAndClearEntries(), [ ">>> before get", "<<< after get", - 'handle change ObservableCodeEditor._versionId: 3 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":3}', - 'handle change ObservableCodeEditor._selections: [1,3 -> 1,3] {"selection":"[1,3 -> 1,3]","modelVersionId":3,"oldSelections":["[1,2 -> 1,2]"],"oldModelVersionId":3,"source":"modelChange","reason":2}', + 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":3}', + 'handle change editor.selections {"selection":"[1,3 -> 1,3]","modelVersionId":3,"oldSelections":["[1,2 -> 1,2]"],"oldModelVersionId":3,"source":"modelChange","reason":2}', "running derived -> selection: [1,3 -> 1,3], value: 3", ]); @@ -171,12 +211,12 @@ suite('CodeEditorWidget', () => { assert.deepStrictEqual(log.getAndClearEntries(), [ ">>> before forceUpdate", ">>> before get", - "handle change ObservableCodeEditor._versionId: 4 undefined", + "handle change editor.versionId undefined", "running derived -> selection: [1,4 -> 1,4], value: 4", "<<< after get", - 'handle change ObservableCodeEditor.onDidType "a"', - 'handle change ObservableCodeEditor._versionId: 4 {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"a","rangeOffset":2}],"eol":"\\n","versionId":4}', - 'handle change ObservableCodeEditor._selections: [1,4 -> 1,4] {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,3 -> 1,3]"],"oldModelVersionId":3,"source":"keyboard","reason":0}', + 'handle change editor.onDidType "a"', + 'handle change editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"a","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,3 -> 1,3]"],"oldModelVersionId":3,"source":"keyboard","reason":0}', "running derived -> selection: [1,4 -> 1,4], value: 4", ]); @@ -187,14 +227,13 @@ suite('CodeEditorWidget', () => { assert.deepStrictEqual(log.getAndClearEntries(), [ ">>> before forceUpdate", ">>> before get", - "handle change ObservableCodeEditor._versionId: 5 undefined", + "handle change editor.versionId undefined", "running derived -> selection: [1,5 -> 1,5], value: 5", "<<< after get", - 'handle change ObservableCodeEditor._versionId: 5 {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":5}', - 'handle change ObservableCodeEditor._selections: [1,5 -> 1,5] {"selection":"[1,5 -> 1,5]","modelVersionId":5,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":5,"source":"modelChange","reason":2}', + 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":5}', + 'handle change editor.selections {"selection":"[1,5 -> 1,5]","modelVersionId":5,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":5,"source":"modelChange","reason":2}', "running derived -> selection: [1,5 -> 1,5], value: 5", ]); - } ); }); From 3ab7948e146d18afd1cb87e124e489786e9242c6 Mon Sep 17 00:00:00 2001 From: yutotnh <57719497+yutotnh@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:23:20 +0900 Subject: [PATCH 090/755] Add the ability to specify a list of candidate encodings when guessing encoding (#36951) (#208550) * Allow to configure a list of encodings to use when guessing #36951 * Bump up the jschardet version into 3.1.2 #36951 * missing merge * some polish * renames * some polish * some polish * cleanup --------- Co-authored-by: Benjamin Pasero --- extensions/git/src/encoding.ts | 27 ++++- extensions/git/src/git.ts | 4 +- extensions/git/src/repository.ts | 5 +- src/vs/platform/files/common/files.ts | 1 + .../browser/parts/editor/editorStatus.ts | 7 +- .../files/browser/files.contribution.ts | 13 ++- .../textfile/browser/textFileService.ts | 7 +- .../services/textfile/common/encoding.ts | 109 +++++++++++++----- .../services/textfile/common/textfiles.ts | 5 + .../textfile/test/common/fixtures/files.ts | 4 +- .../test/common/textFileService.io.test.ts | 15 +++ .../test/node/encoding/encoding.test.ts | 28 +++-- .../encoding/fixtures/some.shiftjis.1.txt | 2 + 13 files changed, 178 insertions(+), 49 deletions(-) create mode 100644 src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.1.txt diff --git a/extensions/git/src/encoding.ts b/extensions/git/src/encoding.ts index a283f628594ed..c80fb6ee6d5e6 100644 --- a/extensions/git/src/encoding.ts +++ b/extensions/git/src/encoding.ts @@ -49,15 +49,38 @@ const JSCHARDET_TO_ICONV_ENCODINGS: { [name: string]: string } = { 'big5': 'cp950' }; -export function detectEncoding(buffer: Buffer): string | null { +const MAP_CANDIDATE_GUESS_ENCODING_TO_JSCHARDET: { [key: string]: string } = { + utf8: 'UTF-8', + utf16le: 'UTF-16LE', + utf16be: 'UTF-16BE', + windows1252: 'windows-1252', + windows1250: 'windows-1250', + iso88592: 'ISO-8859-2', + windows1251: 'windows-1251', + cp866: 'IBM866', + iso88595: 'ISO-8859-5', + koi8r: 'KOI8-R', + windows1253: 'windows-1253', + iso88597: 'ISO-8859-7', + windows1255: 'windows-1255', + iso88598: 'ISO-8859-8', + cp950: 'Big5', + shiftjis: 'SHIFT_JIS', + eucjp: 'EUC-JP', + euckr: 'EUC-KR', + gb2312: 'GB2312' +}; + +export function detectEncoding(buffer: Buffer, candidateGuessEncodings: string[]): string | null { const result = detectEncodingByBOM(buffer); if (result) { return result; } - const detected = jschardet.detect(buffer); + candidateGuessEncodings = candidateGuessEncodings.map(e => MAP_CANDIDATE_GUESS_ENCODING_TO_JSCHARDET[e]).filter(e => !!e); + const detected = jschardet.detect(buffer, candidateGuessEncodings.length > 0 ? { detectEncodings: candidateGuessEncodings } : undefined); if (!detected || !detected.encoding) { return null; } diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 697e77815e4b2..46fcd6069a66a 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1233,11 +1233,11 @@ export class Repository { .filter(entry => !!entry); } - async bufferString(object: string, encoding: string = 'utf8', autoGuessEncoding = false): Promise { + async bufferString(object: string, encoding: string = 'utf8', autoGuessEncoding = false, candidateGuessEncodings: string[] = []): Promise { const stdout = await this.buffer(object); if (autoGuessEncoding) { - encoding = detectEncoding(stdout) || encoding; + encoding = detectEncoding(stdout, candidateGuessEncodings) || encoding; } encoding = iconv.encodingExists(encoding) ? encoding : 'utf8'; diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index ed959765a5928..3863e74872602 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -1865,13 +1865,14 @@ export class Repository implements Disposable { const configFiles = workspace.getConfiguration('files', Uri.file(filePath)); const defaultEncoding = configFiles.get('encoding'); const autoGuessEncoding = configFiles.get('autoGuessEncoding'); + const candidateGuessEncodings = configFiles.get('candidateGuessEncodings'); try { - return await this.repository.bufferString(`${ref}:${path}`, defaultEncoding, autoGuessEncoding); + return await this.repository.bufferString(`${ref}:${path}`, defaultEncoding, autoGuessEncoding, candidateGuessEncodings); } catch (err) { if (err.gitErrorCode === GitErrorCodes.WrongCase) { const gitRelativePath = await this.repository.getGitRelativePath(ref, path); - return await this.repository.bufferString(`${ref}:${gitRelativePath}`, defaultEncoding, autoGuessEncoding); + return await this.repository.bufferString(`${ref}:${gitRelativePath}`, defaultEncoding, autoGuessEncoding, candidateGuessEncodings); } throw err; diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 149665bb57100..290a991a35d83 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -1470,6 +1470,7 @@ export interface IFilesConfigurationNode { watcherInclude: string[]; encoding: string; autoGuessEncoding: boolean; + candidateGuessEncodings: string[]; defaultLanguage: string; trimTrailingWhitespace: boolean; autoSave: string; diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 83016b30a463d..845160784b16a 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -1453,13 +1453,16 @@ export class ChangeEncodingAction extends Action2 { let guessedEncoding: string | undefined = undefined; if (fileService.hasProvider(resource)) { - const content = await textFileService.readStream(resource, { autoGuessEncoding: true }); + const content = await textFileService.readStream(resource, { + autoGuessEncoding: true, + candidateGuessEncodings: textResourceConfigurationService.getValue(resource, 'files.candidateGuessEncodings') + }); guessedEncoding = content.encoding; } const isReopenWithEncoding = (action === reopenWithEncodingPick); - const configuredEncoding = textResourceConfigurationService.getValue(resource ?? undefined, 'files.encoding'); + const configuredEncoding = textResourceConfigurationService.getValue(resource, 'files.encoding'); let directMatchIndex: number | undefined; let aliasMatchIndex: number | undefined; diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts index 35a5a532e0ff4..d525ba5860c80 100644 --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts @@ -23,7 +23,7 @@ import { IEditorPaneRegistry, EditorPaneDescriptor } from 'vs/workbench/browser/ import { ILabelService } from 'vs/platform/label/common/label'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ExplorerService, UNDO_REDO_SOURCE } from 'vs/workbench/contrib/files/browser/explorerService'; -import { SUPPORTED_ENCODINGS } from 'vs/workbench/services/textfile/common/encoding'; +import { GUESSABLE_ENCODINGS, SUPPORTED_ENCODINGS } from 'vs/workbench/services/textfile/common/encoding'; import { Schemas } from 'vs/base/common/network'; import { WorkspaceWatcher } from 'vs/workbench/contrib/files/browser/workspaceWatcher'; import { editorConfigurationBaseNode } from 'vs/editor/common/config/editorConfigurationSchema'; @@ -202,6 +202,17 @@ configurationRegistry.registerConfiguration({ 'markdownDescription': nls.localize('autoGuessEncoding', "When enabled, the editor will attempt to guess the character set encoding when opening files. This setting can also be configured per language. Note, this setting is not respected by text search. Only {0} is respected.", '`#files.encoding#`'), 'scope': ConfigurationScope.LANGUAGE_OVERRIDABLE }, + 'files.candidateGuessEncodings': { + 'type': 'array', + 'items': { + 'type': 'string', + 'enum': Object.keys(GUESSABLE_ENCODINGS), + 'enumDescriptions': Object.keys(GUESSABLE_ENCODINGS).map(key => GUESSABLE_ENCODINGS[key].labelLong) + }, + 'default': [], + 'markdownDescription': nls.localize('candidateGuessEncodings', "List of character set encodings that the editor should attempt to guess in the order they are listed. In case it cannot be determined, {0} is respected", '`#files.encoding#`'), + 'scope': ConfigurationScope.LANGUAGE_OVERRIDABLE + }, 'files.eol': { 'type': 'string', 'enum': [ diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index b388e7cc33477..859fa8a1c1af1 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -304,7 +304,12 @@ export abstract class AbstractTextFileService extends Disposable implements ITex // read through encoding library return toDecodeStream(stream, { acceptTextOnly: options?.acceptTextOnly ?? false, - guessEncoding: options?.autoGuessEncoding || this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'), + guessEncoding: + options?.autoGuessEncoding || + this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'), + candidateGuessEncodings: + options?.candidateGuessEncodings || + this.textResourceConfigurationService.getValue(resource, 'files.candidateGuessEncodings'), overwriteEncoding: async detectedEncoding => { const { encoding } = await this.encoding.getPreferredReadEncoding(resource, options, detectedEncoding ?? undefined); diff --git a/src/vs/workbench/services/textfile/common/encoding.ts b/src/vs/workbench/services/textfile/common/encoding.ts index ad67fb4f422cb..bae27136de4c9 100644 --- a/src/vs/workbench/services/textfile/common/encoding.ts +++ b/src/vs/workbench/services/textfile/common/encoding.ts @@ -7,6 +7,7 @@ import { Readable, ReadableStream, newWriteableStream, listenStream } from 'vs/b import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; import { importAMDNodeModule } from 'vs/amdX'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { coalesce } from 'vs/base/common/arrays'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; @@ -31,6 +32,7 @@ const AUTO_ENCODING_GUESS_MAX_BYTES = 512 * 128; // set an upper limit for the export interface IDecodeStreamOptions { acceptTextOnly: boolean; guessEncoding: boolean; + candidateGuessEncodings: string[]; minBytesRequiredForDetection?: number; overwriteEncoding(detectedEncoding: string | null): Promise; @@ -134,7 +136,7 @@ export function toDecodeStream(source: VSBufferReadableStream, options: IDecodeS const detected = await detectEncodingFromBuffer({ buffer: VSBuffer.concat(bufferedChunks), bytesRead: bytesBuffered - }, options.guessEncoding); + }, options.guessEncoding, options.candidateGuessEncodings); // throw early if the source seems binary and // we are instructed to only accept text @@ -317,7 +319,7 @@ const IGNORE_ENCODINGS = ['ascii', 'utf-16', 'utf-32']; /** * Guesses the encoding from buffer. */ -async function guessEncodingByBuffer(buffer: VSBuffer): Promise { +async function guessEncodingByBuffer(buffer: VSBuffer, candidateGuessEncodings?: string[]): Promise { const jschardet = await importAMDNodeModule('jschardet', 'dist/jschardet.min.js'); // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53 @@ -328,7 +330,15 @@ async function guessEncodingByBuffer(buffer: VSBuffer): Promise { // https://github.com/aadsm/jschardet/blob/v2.1.1/src/index.js#L36-L40 const binaryString = encodeLatin1(limitedBuffer.buffer); - const guessed = jschardet.detect(binaryString); + // ensure to convert candidate encodings to jschardet encoding names if provided + if (candidateGuessEncodings) { + candidateGuessEncodings = coalesce(candidateGuessEncodings.map(e => toJschardetEncoding(e))); + if (candidateGuessEncodings.length === 0) { + candidateGuessEncodings = undefined; + } + } + + const guessed = jschardet.detect(binaryString, candidateGuessEncodings ? { detectEncodings: candidateGuessEncodings } : undefined); if (!guessed || !guessed.encoding) { return null; } @@ -346,13 +356,24 @@ const JSCHARDET_TO_ICONV_ENCODINGS: { [name: string]: string } = { 'big5': 'cp950' }; +function normalizeEncoding(encodingName: string): string { + return encodingName.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); +} + function toIconvLiteEncoding(encodingName: string): string { - const normalizedEncodingName = encodingName.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); + const normalizedEncodingName = normalizeEncoding(encodingName); const mapped = JSCHARDET_TO_ICONV_ENCODINGS[normalizedEncodingName]; return mapped || normalizedEncodingName; } +function toJschardetEncoding(encodingName: string): string | undefined { + const normalizedEncodingName = normalizeEncoding(encodingName); + const mapped = GUESSABLE_ENCODINGS[normalizedEncodingName]; + + return mapped.guessableName; +} + function encodeLatin1(buffer: Uint8Array): string { let result = ''; for (let i = 0; i < buffer.length; i++) { @@ -410,9 +431,9 @@ export interface IReadResult { bytesRead: number; } -export function detectEncodingFromBuffer(readResult: IReadResult, autoGuessEncoding?: false): IDetectedEncodingResult; -export function detectEncodingFromBuffer(readResult: IReadResult, autoGuessEncoding?: boolean): Promise; -export function detectEncodingFromBuffer({ buffer, bytesRead }: IReadResult, autoGuessEncoding?: boolean): Promise | IDetectedEncodingResult { +export function detectEncodingFromBuffer(readResult: IReadResult, autoGuessEncoding?: false, candidateGuessEncodings?: string[]): IDetectedEncodingResult; +export function detectEncodingFromBuffer(readResult: IReadResult, autoGuessEncoding?: boolean, candidateGuessEncodings?: string[]): Promise; +export function detectEncodingFromBuffer({ buffer, bytesRead }: IReadResult, autoGuessEncoding?: boolean, candidateGuessEncodings?: string[]): Promise | IDetectedEncodingResult { // Always first check for BOM to find out about encoding let encoding = detectEncodingByBOMFromBuffer(buffer, bytesRead); @@ -469,7 +490,7 @@ export function detectEncodingFromBuffer({ buffer, bytesRead }: IReadResult, aut // Auto guess encoding if configured if (autoGuessEncoding && !seemsBinary && !encoding && buffer) { - return guessEncodingByBuffer(buffer.slice(0, bytesRead)).then(guessedEncoding => { + return guessEncodingByBuffer(buffer.slice(0, bytesRead), candidateGuessEncodings).then(guessedEncoding => { return { seemsBinary: false, encoding: guessedEncoding @@ -480,12 +501,15 @@ export function detectEncodingFromBuffer({ buffer, bytesRead }: IReadResult, aut return { seemsBinary, encoding }; } -export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; labelShort: string; order: number; encodeOnly?: boolean; alias?: string } } = { +type EncodingsMap = { [encoding: string]: { labelLong: string; labelShort: string; order: number; encodeOnly?: boolean; alias?: string; guessableName?: string } }; + +export const SUPPORTED_ENCODINGS: EncodingsMap = { utf8: { labelLong: 'UTF-8', labelShort: 'UTF-8', order: 1, - alias: 'utf8bom' + alias: 'utf8bom', + guessableName: 'UTF-8' }, utf8bom: { labelLong: 'UTF-8 with BOM', @@ -497,17 +521,20 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab utf16le: { labelLong: 'UTF-16 LE', labelShort: 'UTF-16 LE', - order: 3 + order: 3, + guessableName: 'UTF-16LE' }, utf16be: { labelLong: 'UTF-16 BE', labelShort: 'UTF-16 BE', - order: 4 + order: 4, + guessableName: 'UTF-16BE' }, windows1252: { labelLong: 'Western (Windows 1252)', labelShort: 'Windows 1252', - order: 5 + order: 5, + guessableName: 'windows-1252' }, iso88591: { labelLong: 'Western (ISO 8859-1)', @@ -562,12 +589,14 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab windows1250: { labelLong: 'Central European (Windows 1250)', labelShort: 'Windows 1250', - order: 16 + order: 16, + guessableName: 'windows-1250' }, iso88592: { labelLong: 'Central European (ISO 8859-2)', labelShort: 'ISO 8859-2', - order: 17 + order: 17, + guessableName: 'ISO-8859-2' }, cp852: { labelLong: 'Central European (CP 852)', @@ -577,22 +606,26 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab windows1251: { labelLong: 'Cyrillic (Windows 1251)', labelShort: 'Windows 1251', - order: 19 + order: 19, + guessableName: 'windows-1251' }, cp866: { labelLong: 'Cyrillic (CP 866)', labelShort: 'CP 866', - order: 20 + order: 20, + guessableName: 'IBM866' }, iso88595: { labelLong: 'Cyrillic (ISO 8859-5)', labelShort: 'ISO 8859-5', - order: 21 + order: 21, + guessableName: 'ISO-8859-5' }, koi8r: { labelLong: 'Cyrillic (KOI8-R)', labelShort: 'KOI8-R', - order: 22 + order: 22, + guessableName: 'KOI8-R' }, koi8u: { labelLong: 'Cyrillic (KOI8-U)', @@ -607,22 +640,26 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab windows1253: { labelLong: 'Greek (Windows 1253)', labelShort: 'Windows 1253', - order: 25 + order: 25, + guessableName: 'windows-1253' }, iso88597: { labelLong: 'Greek (ISO 8859-7)', labelShort: 'ISO 8859-7', - order: 26 + order: 26, + guessableName: 'ISO-8859-7' }, windows1255: { labelLong: 'Hebrew (Windows 1255)', labelShort: 'Windows 1255', - order: 27 + order: 27, + guessableName: 'windows-1255' }, iso88598: { labelLong: 'Hebrew (ISO 8859-8)', labelShort: 'ISO 8859-8', - order: 28 + order: 28, + guessableName: 'ISO-8859-8' }, iso885910: { labelLong: 'Nordic (ISO 8859-10)', @@ -662,7 +699,8 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab cp950: { labelLong: 'Traditional Chinese (Big5)', labelShort: 'Big5', - order: 36 + order: 36, + guessableName: 'Big5' }, big5hkscs: { labelLong: 'Traditional Chinese (Big5-HKSCS)', @@ -672,17 +710,20 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab shiftjis: { labelLong: 'Japanese (Shift JIS)', labelShort: 'Shift JIS', - order: 38 + order: 38, + guessableName: 'SHIFT_JIS' }, eucjp: { labelLong: 'Japanese (EUC-JP)', labelShort: 'EUC-JP', - order: 39 + order: 39, + guessableName: 'EUC-JP' }, euckr: { labelLong: 'Korean (EUC-KR)', labelShort: 'EUC-KR', - order: 40 + order: 40, + guessableName: 'EUC-KR' }, windows874: { labelLong: 'Thai (Windows 874)', @@ -707,7 +748,8 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab gb2312: { labelLong: 'Simplified Chinese (GB 2312)', labelShort: 'GB 2312', - order: 45 + order: 45, + guessableName: 'GB2312' }, cp865: { labelLong: 'Nordic DOS (CP 865)', @@ -720,3 +762,14 @@ export const SUPPORTED_ENCODINGS: { [encoding: string]: { labelLong: string; lab order: 47 } }; + +export const GUESSABLE_ENCODINGS: EncodingsMap = (() => { + const guessableEncodings: EncodingsMap = {}; + for (const encoding in SUPPORTED_ENCODINGS) { + if (SUPPORTED_ENCODINGS[encoding].guessableName) { + guessableEncodings[encoding] = SUPPORTED_ENCODINGS[encoding]; + } + } + + return guessableEncodings; +})(); diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index 73abb110fb136..d33c93d5d545d 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -131,6 +131,11 @@ export interface IReadTextFileEncodingOptions { */ readonly autoGuessEncoding?: boolean; + /** + * The optional candidateGuessEncodings parameter limits the allowed encodings to guess from. + */ + readonly candidateGuessEncodings?: string[]; + /** * The optional acceptTextOnly parameter allows to fail this request early if the file * contents are not textual. diff --git a/src/vs/workbench/services/textfile/test/common/fixtures/files.ts b/src/vs/workbench/services/textfile/test/common/fixtures/files.ts index f3d0c5d6cd21d..3167d521985cc 100644 --- a/src/vs/workbench/services/textfile/test/common/fixtures/files.ts +++ b/src/vs/workbench/services/textfile/test/common/fixtures/files.ts @@ -68,6 +68,9 @@ fixtures['index.html'] = Uint8Array.from([ 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 32, 105, 100, 61, 39, 104, 101, 97, 100, 73, 68, 39, 62, 10, 32, 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, 112, 45, 101, 113, 117, 105, 118, 61, 34, 88, 45, 85, 65, 45, 67, 111, 109, 112, 97, 116, 105, 98, 108, 101, 34, 32, 99, 111, 110, 116, 101, 110, 116, 61, 34, 73, 69, 61, 101, 100, 103, 101, 34, 32, 47, 62, 10, 32, 32, 32, 32, 60, 116, 105, 116, 108, 101, 62, 83, 116, 114, 97, 100, 97, 32, 60, 47, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 60, 108, 105, 110, 107, 32, 104, 114, 101, 102, 61, 34, 115, 105, 116, 101, 46, 99, 115, 115, 34, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, 34, 32, 47, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 106, 113, 117, 101, 114, 121, 45, 49, 46, 52, 46, 49, 46, 106, 115, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 46, 46, 47, 99, 111, 109, 112, 105, 108, 101, 114, 47, 100, 116, 114, 101, 101, 46, 106, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 115, 114, 99, 61, 34, 46, 46, 47, 99, 111, 109, 112, 105, 108, 101, 114, 47, 116, 121, 112, 101, 115, 99, 114, 105, 112, 116, 46, 106, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 10, 10, 32, 32, 32, 32, 47, 47, 32, 67, 111, 109, 112, 105, 108, 101, 32, 115, 116, 114, 97, 100, 97, 32, 115, 111, 117, 114, 99, 101, 32, 105, 110, 116, 111, 32, 114, 101, 115, 117, 108, 116, 105, 110, 103, 32, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 10, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 99, 111, 109, 112, 105, 108, 101, 40, 112, 114, 111, 103, 44, 32, 108, 105, 98, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 111, 117, 116, 102, 105, 108, 101, 32, 61, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 111, 117, 114, 99, 101, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 87, 114, 105, 116, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 32, 116, 104, 105, 115, 46, 115, 111, 117, 114, 99, 101, 32, 43, 61, 32, 115, 59, 32, 125, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 87, 114, 105, 116, 101, 76, 105, 110, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 32, 116, 104, 105, 115, 46, 115, 111, 117, 114, 99, 101, 32, 43, 61, 32, 115, 32, 43, 32, 34, 92, 114, 34, 59, 32, 125, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 32, 61, 32, 91, 93, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 111, 109, 112, 105, 108, 101, 114, 61, 110, 101, 119, 32, 84, 111, 111, 108, 115, 46, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 67, 111, 109, 112, 105, 108, 101, 114, 40, 111, 117, 116, 102, 105, 108, 101, 44, 116, 114, 117, 101, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 115, 101, 116, 69, 114, 114, 111, 114, 67, 97, 108, 108, 98, 97, 99, 107, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 115, 116, 97, 114, 116, 44, 108, 101, 110, 44, 32, 109, 101, 115, 115, 97, 103, 101, 41, 32, 123, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 46, 112, 117, 115, 104, 40, 123, 115, 116, 97, 114, 116, 58, 115, 116, 97, 114, 116, 44, 32, 108, 101, 110, 58, 108, 101, 110, 44, 32, 109, 101, 115, 115, 97, 103, 101, 58, 109, 101, 115, 115, 97, 103, 101, 125, 41, 59, 32, 125, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 97, 100, 100, 85, 110, 105, 116, 40, 108, 105, 98, 84, 101, 120, 116, 44, 34, 108, 105, 98, 46, 116, 115, 34, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 97, 100, 100, 85, 110, 105, 116, 40, 112, 114, 111, 103, 44, 34, 105, 110, 112, 117, 116, 46, 116, 115, 34, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 116, 121, 112, 101, 67, 104, 101, 99, 107, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 114, 46, 101, 109, 105, 116, 40, 41, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 40, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 46, 108, 101, 110, 103, 116, 104, 32, 62, 32, 48, 32, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 116, 104, 114, 111, 119, 32, 110, 101, 119, 32, 69, 114, 114, 111, 114, 40, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 9, 119, 104, 105, 108, 101, 40, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 91, 48, 93, 32, 61, 61, 32, 39, 47, 39, 32, 38, 38, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 91, 49, 93, 32, 61, 61, 32, 39, 47, 39, 32, 38, 38, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 91, 50, 93, 32, 61, 61, 32, 39, 32, 39, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 32, 61, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 46, 115, 108, 105, 99, 101, 40, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 46, 105, 110, 100, 101, 120, 79, 102, 40, 39, 92, 114, 39, 41, 43, 49, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 101, 114, 114, 111, 114, 80, 114, 101, 102, 105, 120, 32, 61, 32, 34, 34, 59, 10, 9, 102, 111, 114, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 105, 60, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 46, 108, 101, 110, 103, 116, 104, 59, 105, 43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 101, 114, 114, 111, 114, 80, 114, 101, 102, 105, 120, 32, 43, 61, 32, 34, 47, 47, 32, 69, 114, 114, 111, 114, 58, 32, 40, 34, 32, 43, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 91, 105, 93, 46, 115, 116, 97, 114, 116, 32, 43, 32, 34, 44, 34, 32, 43, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 91, 105, 93, 46, 108, 101, 110, 32, 43, 32, 34, 41, 32, 34, 32, 43, 32, 112, 97, 114, 115, 101, 69, 114, 114, 111, 114, 115, 91, 105, 93, 46, 109, 101, 115, 115, 97, 103, 101, 32, 43, 32, 34, 92, 114, 34, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 101, 114, 114, 111, 114, 80, 114, 101, 102, 105, 120, 32, 43, 32, 111, 117, 116, 102, 105, 108, 101, 46, 115, 111, 117, 114, 99, 101, 59, 10, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 32, 32, 32, 32, 60, 115, 99, 114, 105, 112, 116, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 34, 62, 10, 9, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 108, 105, 98, 84, 101, 120, 116, 32, 61, 32, 34, 34, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 36, 46, 103, 101, 116, 40, 34, 46, 46, 47, 99, 111, 109, 112, 105, 108, 101, 114, 47, 108, 105, 98, 46, 116, 115, 34, 44, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 110, 101, 119, 76, 105, 98, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 108, 105, 98, 84, 101, 120, 116, 32, 61, 32, 110, 101, 119, 76, 105, 98, 84, 101, 120, 116, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 9, 10, 32, 32, 32, 32, 32, 32, 32, 32, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 101, 120, 101, 99, 117, 116, 101, 32, 116, 104, 101, 32, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 32, 105, 110, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 32, 112, 97, 110, 101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 101, 120, 101, 99, 117, 116, 101, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 39, 41, 46, 116, 101, 120, 116, 40, 34, 82, 117, 110, 110, 105, 110, 103, 46, 46, 46, 34, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 120, 116, 32, 61, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 39, 41, 46, 118, 97, 108, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 115, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 116, 32, 61, 32, 101, 118, 97, 108, 40, 116, 120, 116, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 115, 32, 61, 32, 34, 82, 97, 110, 32, 115, 117, 99, 99, 101, 115, 115, 102, 117, 108, 108, 121, 33, 34, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, 40, 101, 41, 32, 123, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 115, 32, 61, 32, 34, 69, 120, 99, 101, 112, 116, 105, 111, 110, 32, 116, 104, 114, 111, 119, 110, 58, 32, 34, 32, 43, 32, 101, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 39, 41, 46, 116, 101, 120, 116, 40, 83, 116, 114, 105, 110, 103, 40, 114, 101, 115, 41, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 114, 101, 99, 111, 109, 112, 105, 108, 101, 32, 116, 104, 101, 32, 115, 116, 114, 97, 100, 97, 83, 114, 99, 32, 97, 110, 100, 32, 112, 111, 112, 117, 108, 97, 116, 101, 32, 116, 104, 101, 32, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 32, 112, 97, 110, 101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 110, 101, 119, 84, 101, 120, 116, 32, 61, 32, 36, 40, 39, 35, 115, 116, 114, 97, 100, 97, 83, 114, 99, 39, 41, 46, 118, 97, 108, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 32, 61, 32, 99, 111, 109, 112, 105, 108, 101, 40, 110, 101, 119, 84, 101, 120, 116, 44, 32, 108, 105, 98, 84, 101, 120, 116, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, 32, 40, 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 32, 61, 32, 34, 47, 47, 80, 97, 114, 115, 101, 32, 101, 114, 114, 111, 114, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 118, 97, 114, 32, 105, 32, 105, 110, 32, 101, 41, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 32, 43, 61, 32, 34, 92, 114, 47, 47, 32, 34, 32, 43, 32, 101, 91, 105, 93, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 39, 41, 46, 118, 97, 108, 40, 99, 111, 109, 112, 105, 108, 101, 100, 83, 111, 117, 114, 99, 101, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 80, 111, 112, 117, 108, 97, 116, 101, 32, 116, 104, 101, 32, 115, 116, 114, 97, 100, 97, 83, 114, 99, 32, 112, 97, 110, 101, 32, 119, 105, 116, 104, 32, 111, 110, 101, 32, 111, 102, 32, 116, 104, 101, 32, 98, 117, 105, 108, 116, 32, 105, 110, 32, 115, 97, 109, 112, 108, 101, 115, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 101, 120, 97, 109, 112, 108, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 67, 104, 97, 110, 103, 101, 100, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 101, 120, 97, 109, 112, 108, 101, 115, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 101, 120, 97, 109, 112, 108, 101, 115, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, 108, 101, 99, 116, 101, 100, 69, 120, 97, 109, 112, 108, 101, 32, 61, 32, 101, 120, 97, 109, 112, 108, 101, 115, 46, 111, 112, 116, 105, 111, 110, 115, 91, 101, 120, 97, 109, 112, 108, 101, 115, 46, 115, 101, 108, 101, 99, 116, 101, 100, 73, 110, 100, 101, 120, 93, 46, 118, 97, 108, 117, 101, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, 108, 101, 99, 116, 101, 100, 69, 120, 97, 109, 112, 108, 101, 32, 33, 61, 32, 34, 34, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 46, 103, 101, 116, 40, 39, 101, 120, 97, 109, 112, 108, 101, 115, 47, 39, 32, 43, 32, 115, 101, 108, 101, 99, 116, 101, 100, 69, 120, 97, 109, 112, 108, 101, 44, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 114, 99, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 36, 40, 39, 35, 115, 116, 114, 97, 100, 97, 83, 114, 99, 39, 41, 46, 118, 97, 108, 40, 115, 114, 99, 84, 101, 120, 116, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 44, 49, 48, 48, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 44, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 101, 114, 114, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 101, 114, 114, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 60, 47, 115, 99, 114, 105, 112, 116, 62, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 32, 32, 32, 32, 60, 104, 49, 62, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 98, 114, 32, 47, 62, 10, 32, 32, 32, 32, 60, 115, 101, 108, 101, 99, 116, 32, 105, 100, 61, 34, 101, 120, 97, 109, 112, 108, 101, 115, 34, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, 39, 101, 120, 97, 109, 112, 108, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 67, 104, 97, 110, 103, 101, 100, 40, 41, 39, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 34, 62, 83, 101, 108, 101, 99, 116, 46, 46, 46, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 115, 109, 97, 108, 108, 46, 116, 115, 34, 62, 83, 109, 97, 108, 108, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 101, 109, 112, 108, 111, 121, 101, 101, 46, 116, 115, 34, 62, 69, 109, 112, 108, 111, 121, 101, 101, 115, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 99, 111, 110, 119, 97, 121, 46, 116, 115, 34, 62, 67, 111, 110, 119, 97, 121, 32, 71, 97, 109, 101, 32, 111, 102, 32, 76, 105, 102, 101, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 111, 112, 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, 61, 34, 116, 121, 112, 101, 115, 99, 114, 105, 112, 116, 46, 116, 115, 34, 62, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 32, 67, 111, 109, 112, 105, 108, 101, 114, 60, 47, 111, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 60, 47, 115, 101, 108, 101, 99, 116, 62, 10, 10, 32, 32, 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 101, 120, 116, 97, 114, 101, 97, 32, 105, 100, 61, 39, 115, 116, 114, 97, 100, 97, 83, 114, 99, 39, 32, 114, 111, 119, 115, 61, 39, 52, 48, 39, 32, 99, 111, 108, 115, 61, 39, 56, 48, 39, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, 39, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 40, 41, 39, 32, 111, 110, 107, 101, 121, 117, 112, 61, 39, 115, 114, 99, 85, 112, 100, 97, 116, 101, 100, 40, 41, 39, 32, 115, 112, 101, 108, 108, 99, 104, 101, 99, 107, 61, 34, 102, 97, 108, 115, 101, 34, 62, 10, 47, 47, 84, 121, 112, 101, 32, 121, 111, 117, 114, 32, 84, 121, 112, 101, 83, 99, 114, 105, 112, 116, 32, 104, 101, 114, 101, 46, 46, 46, 10, 32, 32, 32, 32, 32, 32, 60, 47, 116, 101, 120, 116, 97, 114, 101, 97, 62, 10, 32, 32, 32, 32, 32, 32, 60, 116, 101, 120, 116, 97, 114, 101, 97, 32, 105, 100, 61, 39, 99, 111, 109, 112, 105, 108, 101, 100, 79, 117, 116, 112, 117, 116, 39, 32, 114, 111, 119, 115, 61, 39, 52, 48, 39, 32, 99, 111, 108, 115, 61, 39, 56, 48, 39, 32, 115, 112, 101, 108, 108, 99, 104, 101, 99, 107, 61, 34, 102, 97, 108, 115, 101, 34, 62, 10, 47, 47, 67, 111, 109, 112, 105, 108, 101, 100, 32, 99, 111, 100, 101, 32, 119, 105, 108, 108, 32, 115, 104, 111, 119, 32, 117, 112, 32, 104, 101, 114, 101, 46, 46, 46, 10, 32, 32, 32, 32, 32, 32, 60, 47, 116, 101, 120, 116, 97, 114, 101, 97, 62, 10, 32, 32, 32, 32, 32, 32, 60, 98, 114, 32, 47, 62, 10, 32, 32, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, 111, 110, 99, 108, 105, 99, 107, 61, 39, 101, 120, 101, 99, 117, 116, 101, 40, 41, 39, 47, 62, 82, 117, 110, 60, 47, 98, 117, 116, 116, 111, 110, 62, 32, 10, 32, 32, 32, 32, 32, 32, 60, 100, 105, 118, 32, 105, 100, 61, 39, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 39, 62, 80, 114, 101, 115, 115, 32, 39, 114, 117, 110, 39, 32, 116, 111, 32, 101, 120, 101, 99, 117, 116, 101, 32, 99, 111, 100, 101, 46, 46, 46, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 32, 32, 60, 100, 105, 118, 32, 105, 100, 61, 39, 114, 101, 115, 117, 108, 116, 115, 39, 62, 46, 46, 46, 119, 114, 105, 116, 101, 32, 121, 111, 117, 114, 32, 114, 101, 115, 117, 108, 116, 115, 32, 105, 110, 116, 111, 32, 35, 114, 101, 115, 117, 108, 116, 115, 46, 46, 46, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 105, 100, 61, 39, 98, 111, 100, 39, 32, 115, 116, 121, 108, 101, 61, 39, 100, 105, 115, 112, 108, 97, 121, 58, 110, 111, 110, 101, 39, 62, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 10 ]); +// This file is determined to be Windows-1252 unless candidateDetectEncoding is set +fixtures['some.shiftjis.1.txt'] = Uint8Array.from([82, 177, 82, 241, 82, 201, 82, 191, 82, 205]); + const lorem = getLorem(); // needle encoded from 'ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ' @@ -418,4 +421,3 @@ Donec vehicula mauris eget lacus mollis venenatis et sed nibh. Nam sodales ligul tail: VSBuffer.fromString(`Vivamus iaculis, lacus efficitur faucibus porta, dui nulla facilisis ligula, ut sodales odio nunc id sapien. Cras viverra auctor ipsum, dapibus mattis neque dictum sed. Sed convallis fermentum molestie. Nulla facilisi turpis duis.`) }; } - diff --git a/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts index 5442b00a9aa9c..47aa789ae2a95 100644 --- a/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts @@ -592,6 +592,21 @@ export default function createSuite(params: Params) { assert.strictEqual(result.encoding, 'windows1252'); }); + test('readStream - autoguessEncoding (candidateGuessEncodings)', async () => { + // This file is determined to be Windows-1252 unless candidateDetectEncoding is set. + const resource = URI.file(join(testDir, 'some.shiftjis.1.txt')); + + const result = await service.readStream(resource, { autoGuessEncoding: true, candidateGuessEncodings: ['utf-8', 'shiftjis', 'euc-jp'] }); + assert.strictEqual(result.encoding, 'shiftjis'); + }); + + test('readStream - autoguessEncoding (candidateGuessEncodings is Empty)', async () => { + const resource = URI.file(join(testDir, 'some_cp1252.txt')); + + const result = await service.readStream(resource, { autoGuessEncoding: true, candidateGuessEncodings: [] }); + assert.strictEqual(result.encoding, 'windows1252'); + }); + test('readStream - FILE_IS_BINARY', async () => { const resource = URI.file(join(testDir, 'binary.txt')); diff --git a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts index 9d86f5f146b9f..6806b4e1c56f6 100644 --- a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts +++ b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts @@ -208,6 +208,14 @@ suite('Encoding', () => { assert.strictEqual(mimes.encoding, 'windows1252'); }); + test('autoGuessEncoding (candidateGuessEncodings - ShiftJIS)', async function () { + // This file is determined to be windows1252 unless candidateDetectEncoding is set. + const file = FileAccess.asFileUri('vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.1.txt').fsPath; + const buffer = await readExactlyByFile(file, 512 * 8); + const mimes = await encoding.detectEncodingFromBuffer(buffer, true, ['utf8', 'shiftjis', 'eucjp']); + assert.strictEqual(mimes.encoding, 'shiftjis'); + }); + async function readAndDecodeFromDisk(path: string, fileEncoding: string | null) { return new Promise((resolve, reject) => { fs.readFile(path, (err, data) => { @@ -246,7 +254,7 @@ suite('Encoding', () => { Buffer.from([65, 66, 67]), ]); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -262,7 +270,7 @@ suite('Encoding', () => { Buffer.from([65, 66, 67]), ]); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 64, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -275,7 +283,7 @@ suite('Encoding', () => { const source = newWriteableBufferStream(); source.end(); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 512, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 512, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -288,7 +296,7 @@ suite('Encoding', () => { const path = FileAccess.asFileUri('vs/workbench/services/textfile/test/node/encoding/fixtures/some_utf16be.css').fsPath; const source = streamToBufferReadableStream(fs.createReadStream(path)); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 64, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.strictEqual(detected.encoding, 'utf16be'); assert.strictEqual(detected.seemsBinary, false); @@ -301,7 +309,7 @@ suite('Encoding', () => { test('toDecodeStream - empty file', async function () { const path = FileAccess.asFileUri('vs/workbench/services/textfile/test/node/encoding/fixtures/empty.txt').fsPath; const source = streamToBufferReadableStream(fs.createReadStream(path)); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); const expected = await readAndDecodeFromDisk(path, detected.encoding); const actual = await readAllAsString(stream); @@ -318,7 +326,7 @@ suite('Encoding', () => { } const source = newTestReadableStream(buffers); - const { stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); const expected = new TextDecoder().decode(incompleteEmojis); const actual = await readAllAsString(stream); @@ -330,7 +338,7 @@ suite('Encoding', () => { const path = FileAccess.asFileUri('vs/workbench/services/textfile/test/node/encoding/fixtures/some_gbk.txt').fsPath; const source = streamToBufferReadableStream(fs.createReadStream(path)); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async () => 'gbk' }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async () => 'gbk' }); assert.ok(detected); assert.ok(stream); @@ -342,7 +350,7 @@ suite('Encoding', () => { const path = FileAccess.asFileUri('vs/workbench/services/textfile/test/node/encoding/fixtures/issue_102202.txt').fsPath; const source = streamToBufferReadableStream(fs.createReadStream(path)); - const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async () => 'utf-8' }); + const { detected, stream } = await encoding.toDecodeStream(source, { acceptTextOnly: true, minBytesRequiredForDetection: 4, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async () => 'utf-8' }); assert.ok(detected); assert.ok(stream); @@ -365,7 +373,7 @@ suite('Encoding', () => { let error: Error | undefined = undefined; try { - await encoding.toDecodeStream(source(), { acceptTextOnly: true, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + await encoding.toDecodeStream(source(), { acceptTextOnly: true, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); } catch (e) { error = e; } @@ -375,7 +383,7 @@ suite('Encoding', () => { // acceptTextOnly: false - const { detected, stream } = await encoding.toDecodeStream(source(), { acceptTextOnly: false, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source(), { acceptTextOnly: false, guessEncoding: false, candidateGuessEncodings: [], overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.strictEqual(detected.seemsBinary, true); diff --git a/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.1.txt b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.1.txt new file mode 100644 index 0000000000000..67acab8795e4b --- /dev/null +++ b/src/vs/workbench/services/textfile/test/node/encoding/fixtures/some.shiftjis.1.txt @@ -0,0 +1,2 @@ +// This file is determined to be Windows-1252 unless candidateDetectEncoding is set. +‚±‚ñ‚É‚¿‚Í \ No newline at end of file From 2f9fdb5ce7f8d65a096bdeec65b30e34c014de48 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Wed, 5 Jun 2024 13:15:52 +0200 Subject: [PATCH 091/755] Extract code from `ContentHoverController` constructor into separate methods (#214316) extracting code from ContentHoverController into separate methods --- .../hover/browser/contentHoverController.ts | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index 91b66edfc5aeb..a39e8b7921d2c 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -46,23 +46,30 @@ export class ContentHoverController extends Disposable implements IHoverWidget { @IKeybindingService private readonly _keybindingService: IKeybindingService, ) { super(); - this._widget = this._register(this._instantiationService.createInstance(ContentHoverWidget, this._editor)); + const initializedParticipants = this._initializeHoverParticipants(); + this._participants = initializedParticipants.participants; + this._markdownHoverParticipant = initializedParticipants.markdownHoverParticipant; + this._computer = new ContentHoverComputer(this._editor, this._participants); + this._hoverOperation = this._register(new HoverOperation(this._editor, this._computer)); + this._registerListeners(); + } - // Instantiate participants and sort them by `hoverOrdinal` which is relevant for rendering order. - this._participants = []; + private _initializeHoverParticipants(): { participants: IEditorHoverParticipant[]; markdownHoverParticipant: MarkdownHoverParticipant | undefined } { + const participants: IEditorHoverParticipant[] = []; + let markdownHoverParticipant: MarkdownHoverParticipant | undefined; for (const participant of HoverParticipantRegistry.getAll()) { const participantInstance = this._instantiationService.createInstance(participant, this._editor); if (participantInstance instanceof MarkdownHoverParticipant && !(participantInstance instanceof InlayHintsHover)) { - this._markdownHoverParticipant = participantInstance; + markdownHoverParticipant = participantInstance; } - this._participants.push(participantInstance); + participants.push(participantInstance); } - this._participants.sort((p1, p2) => p1.hoverOrdinal - p2.hoverOrdinal); - - this._computer = new ContentHoverComputer(this._editor, this._participants); - this._hoverOperation = this._register(new HoverOperation(this._editor, this._computer)); + participants.sort((p1, p2) => p1.hoverOrdinal - p2.hoverOrdinal); + return { participants, markdownHoverParticipant }; + } + private _registerListeners(): void { this._register(this._hoverOperation.onResult((result) => { if (!this._computer.anchor) { // invalid state, ignore result From c9920766957eb597b9dcfe5fe3bd51db714d4d98 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Jun 2024 13:31:55 +0200 Subject: [PATCH 092/755] Make sure event subscriptions are stored and disposed (#214234) (#214318) --- .../contextmenu/browser/contextmenu.contribution.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/contextmenu/browser/contextmenu.contribution.ts b/src/vs/workbench/contrib/contextmenu/browser/contextmenu.contribution.ts index e903b24dc3987..3f607d926f39e 100644 --- a/src/vs/workbench/contrib/contextmenu/browser/contextmenu.contribution.ts +++ b/src/vs/workbench/contrib/contextmenu/browser/contextmenu.contribution.ts @@ -3,24 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; -class ContextMenuContribution implements IWorkbenchContribution { - - private readonly disposables = new DisposableStore(); +class ContextMenuContribution extends Disposable implements IWorkbenchContribution { constructor( @ILayoutService layoutService: ILayoutService, @IContextMenuService contextMenuService: IContextMenuService ) { + super(); + const update = (visible: boolean) => layoutService.activeContainer.classList.toggle('context-menu-visible', visible); - contextMenuService.onDidShowContextMenu(() => update(true), null, this.disposables); - contextMenuService.onDidHideContextMenu(() => update(false), null, this.disposables); + this._register(contextMenuService.onDidShowContextMenu(() => update(true))); + this._register(contextMenuService.onDidHideContextMenu(() => update(false))); } } From 3024b310316d52c25895b3ecf0a2d99e65d4e6fb Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Wed, 5 Jun 2024 14:00:29 +0200 Subject: [PATCH 093/755] Better track disposables (#214234) (#214322) --- .../electron-main/extensionHostStarter.ts | 23 +++++++++------- .../api/common/extHostTextEditors.ts | 9 ++++--- .../api/node/extensionHostProcess.ts | 27 ++++++++++--------- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/vs/platform/extensions/electron-main/extensionHostStarter.ts b/src/vs/platform/extensions/electron-main/extensionHostStarter.ts index fec3b6eded6d6..106963ac0b514 100644 --- a/src/vs/platform/extensions/electron-main/extensionHostStarter.ts +++ b/src/vs/platform/extensions/electron-main/extensionHostStarter.ts @@ -3,18 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Promises } from 'vs/base/common/async'; import { canceled } from 'vs/base/common/errors'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { IExtensionHostProcessOptions, IExtensionHostStarter } from 'vs/platform/extensions/common/extensionHostStarter'; import { Event } from 'vs/base/common/event'; -import { ILogService } from 'vs/platform/log/common/log'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { IExtensionHostProcessOptions, IExtensionHostStarter } from 'vs/platform/extensions/common/extensionHostStarter'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; -import { Promises } from 'vs/base/common/async'; +import { ILogService } from 'vs/platform/log/common/log'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { WindowUtilityProcess } from 'vs/platform/utilityProcess/electron-main/utilityProcess'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -export class ExtensionHostStarter implements IDisposable, IExtensionHostStarter { +export class ExtensionHostStarter extends Disposable implements IDisposable, IExtensionHostStarter { readonly _serviceBrand: undefined; @@ -29,16 +29,18 @@ export class ExtensionHostStarter implements IDisposable, IExtensionHostStarter @IWindowsMainService private readonly _windowsMainService: IWindowsMainService, @ITelemetryService private readonly _telemetryService: ITelemetryService, ) { + super(); // On shutdown: gracefully await extension host shutdowns - this._lifecycleMainService.onWillShutdown(e => { + this._register(this._lifecycleMainService.onWillShutdown(e => { this._shutdown = true; e.join('extHostStarter', this._waitForAllExit(6000)); - }); + })); } - dispose(): void { + override dispose(): void { // Intentionally not killing the extension host processes + super.dispose(); } private _getExtHost(id: string): WindowUtilityProcess { @@ -72,7 +74,8 @@ export class ExtensionHostStarter implements IDisposable, IExtensionHostStarter const id = String(++ExtensionHostStarter._lastId); const extHost = new WindowUtilityProcess(this._logService, this._windowsMainService, this._telemetryService, this._lifecycleMainService); this._extHosts.set(id, extHost); - extHost.onExit(({ pid, code, signal }) => { + const disposable = extHost.onExit(({ pid, code, signal }) => { + disposable.dispose(); this._logService.info(`Extension host with pid ${pid} exited with code: ${code}, signal: ${signal}.`); setTimeout(() => { extHost.dispose(); diff --git a/src/vs/workbench/api/common/extHostTextEditors.ts b/src/vs/workbench/api/common/extHostTextEditors.ts index 7ab8d65df5344..277422f9acba9 100644 --- a/src/vs/workbench/api/common/extHostTextEditors.ts +++ b/src/vs/workbench/api/common/extHostTextEditors.ts @@ -5,6 +5,7 @@ import * as arrays from 'vs/base/common/arrays'; import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtHostEditorsShape, IEditorPropertiesChangeData, IMainContext, ITextDocumentShowOptions, ITextEditorPositionData, MainContext, MainThreadTextEditorsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; @@ -13,7 +14,7 @@ import * as TypeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import { TextEditorSelectionChangeKind } from 'vs/workbench/api/common/extHostTypes'; import * as vscode from 'vscode'; -export class ExtHostEditors implements ExtHostEditorsShape { +export class ExtHostEditors extends Disposable implements ExtHostEditorsShape { private readonly _onDidChangeTextEditorSelection = new Emitter(); private readonly _onDidChangeTextEditorOptions = new Emitter(); @@ -35,11 +36,11 @@ export class ExtHostEditors implements ExtHostEditorsShape { mainContext: IMainContext, private readonly _extHostDocumentsAndEditors: ExtHostDocumentsAndEditors, ) { + super(); this._proxy = mainContext.getProxy(MainContext.MainThreadTextEditors); - - this._extHostDocumentsAndEditors.onDidChangeVisibleTextEditors(e => this._onDidChangeVisibleTextEditors.fire(e)); - this._extHostDocumentsAndEditors.onDidChangeActiveTextEditor(e => this._onDidChangeActiveTextEditor.fire(e)); + this._register(this._extHostDocumentsAndEditors.onDidChangeVisibleTextEditors(e => this._onDidChangeVisibleTextEditors.fire(e))); + this._register(this._extHostDocumentsAndEditors.onDidChangeActiveTextEditor(e => this._onDidChangeActiveTextEditor.fire(e))); } getActiveTextEditor(): vscode.TextEditor | undefined { diff --git a/src/vs/workbench/api/node/extensionHostProcess.ts b/src/vs/workbench/api/node/extensionHostProcess.ts index c98941f51816e..80a60c1d4c120 100644 --- a/src/vs/workbench/api/node/extensionHostProcess.ts +++ b/src/vs/workbench/api/node/extensionHostProcess.ts @@ -3,29 +3,30 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import minimist from 'minimist'; import * as nativeWatchdog from 'native-watchdog'; import * as net from 'net'; -import minimist from 'minimist'; -import * as performance from 'vs/base/common/performance'; -import type { MessagePortMain } from 'vs/base/parts/sandbox/node/electronTypes'; +import { ProcessTimeRunOnceScheduler } from 'vs/base/common/async'; +import { VSBuffer } from 'vs/base/common/buffer'; import { isCancellationError, isSigPipeError, onUnexpectedError } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; +import * as performance from 'vs/base/common/performance'; +import { IURITransformer } from 'vs/base/common/uriIpc'; +import { realpath } from 'vs/base/node/extpath'; +import { Promises } from 'vs/base/node/pfs'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; -import { PersistentProtocol, ProtocolConstants, BufferedEmitter } from 'vs/base/parts/ipc/common/ipc.net'; +import { BufferedEmitter, PersistentProtocol, ProtocolConstants } from 'vs/base/parts/ipc/common/ipc.net'; import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; +import type { MessagePortMain } from 'vs/base/parts/sandbox/node/electronTypes'; +import { boolean } from 'vs/editor/common/config/editorOptions'; import product from 'vs/platform/product/common/product'; -import { MessageType, createMessageOfType, isMessageOfType, IExtHostSocketMessage, IExtHostReadyMessage, IExtHostReduceGraceTimeMessage, ExtensionHostExitCode, IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ExtensionHostMain, IExitFn } from 'vs/workbench/api/common/extensionHostMain'; -import { VSBuffer } from 'vs/base/common/buffer'; -import { IURITransformer } from 'vs/base/common/uriIpc'; -import { Promises } from 'vs/base/node/pfs'; -import { realpath } from 'vs/base/node/extpath'; import { IHostUtils } from 'vs/workbench/api/common/extHostExtensionService'; -import { ProcessTimeRunOnceScheduler } from 'vs/base/common/async'; -import { boolean } from 'vs/editor/common/config/editorOptions'; import { createURITransformer } from 'vs/workbench/api/node/uriTransformer'; import { ExtHostConnectionType, readExtHostConnection } from 'vs/workbench/services/extensions/common/extensionHostEnv'; +import { ExtensionHostExitCode, IExtHostReadyMessage, IExtHostReduceGraceTimeMessage, IExtHostSocketMessage, IExtensionHostInitData, MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; +import { IDisposable } from 'vs/base/common/lifecycle'; import 'vs/workbench/api/common/extHost.common.services'; import 'vs/workbench/api/node/extHost.node.services'; @@ -251,12 +252,14 @@ async function createExtHostProtocol(): Promise { readonly onMessage: Event = this._onMessage.event; private _terminating: boolean; + private _protocolListener: IDisposable; constructor() { this._terminating = false; - protocol.onMessage((msg) => { + this._protocolListener = protocol.onMessage((msg) => { if (isMessageOfType(msg, MessageType.Terminate)) { this._terminating = true; + this._protocolListener.dispose(); onTerminate('received terminate message from renderer'); } else { this._onMessage.fire(msg); From dee8eaf52679a71ee790e3c09c1160e1ab037b99 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 5 Jun 2024 14:11:06 +0200 Subject: [PATCH 094/755] Make sure event subscriptions are stored and disposed (#214234) (#214312) * Make sure event subscriptions are stored and disposed (#214234) * fix tests --- src/vs/code/electron-main/app.ts | 4 ++-- src/vs/platform/menubar/electron-main/menubar.ts | 13 ++++++++----- .../menubar/electron-main/menubarMainService.ts | 9 +++++---- .../windows/electron-main/windowsStateHandler.ts | 10 +++++----- src/vs/workbench/browser/layout.ts | 4 ++-- src/vs/workbench/common/contributions.ts | 3 ++- .../contrib/output/browser/outputLinkProvider.ts | 8 +++++--- .../contrib/output/browser/outputServices.ts | 4 ++-- .../test/electron-sandbox/fileDialogService.test.ts | 6 +++--- .../browser/abstractWorkspaceEditingService.ts | 7 +++++-- .../electron-sandbox/workspaceEditingService.ts | 4 ++-- 11 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 46193cdbe9779..9d84281819d35 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -366,7 +366,7 @@ export class CodeApplication extends Disposable { process.on('unhandledRejection', (reason: unknown) => onUnexpectedError(reason)); // Dispose on shutdown - this.lifecycleMainService.onWillShutdown(() => this.dispose()); + Event.once(this.lifecycleMainService.onWillShutdown)(() => this.dispose()); // Contextmenu via IPC support registerContextMenuListener(); @@ -598,7 +598,7 @@ export class CodeApplication extends Disposable { // Main process server (electron IPC based) const mainProcessElectronServer = new ElectronIPCServer(); - this.lifecycleMainService.onWillShutdown(e => { + Event.once(this.lifecycleMainService.onWillShutdown)(e => { if (e.reason === ShutdownReason.KILL) { // When we go down abnormally, make sure to free up // any IPC we accept from other windows to reduce diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index 7e96549a723b7..d7449e9454153 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -25,6 +25,7 @@ import { IUpdateService, StateType } from 'vs/platform/update/common/update'; import { INativeRunActionInWindowRequest, INativeRunKeybindingInWindowRequest, IWindowOpenable, hasNativeTitlebar } from 'vs/platform/window/common/window'; import { IWindowsCountChangedEvent, IWindowsMainService, OpenContext } from 'vs/platform/windows/electron-main/windows'; import { IWorkspacesHistoryMainService } from 'vs/platform/workspaces/electron-main/workspacesHistoryMainService'; +import { Disposable } from 'vs/base/common/lifecycle'; const telemetryFrom = 'menu'; @@ -42,7 +43,7 @@ interface IMenuItemWithKeybinding { userSettingsLabel?: string; } -export class Menubar { +export class Menubar extends Disposable { private static readonly lastKnownMenubarStorageKey = 'lastKnownMenubarData'; @@ -78,6 +79,8 @@ export class Menubar { @IProductService private readonly productService: IProductService, @IAuxiliaryWindowsMainService private readonly auxiliaryWindowsMainService: IAuxiliaryWindowsMainService ) { + super(); + this.menuUpdater = new RunOnceScheduler(() => this.doUpdateMenu(), 0); this.menuGC = new RunOnceScheduler(() => { this.oldMenus = []; }, 10000); @@ -169,12 +172,12 @@ export class Menubar { private registerListeners(): void { // Keep flag when app quits - this.lifecycleMainService.onWillShutdown(() => this.willShutdown = true); + this._register(this.lifecycleMainService.onWillShutdown(() => this.willShutdown = true)); // Listen to some events from window service to update menu - this.windowsMainService.onDidChangeWindowsCount(e => this.onDidChangeWindowsCount(e)); - this.nativeHostMainService.onDidBlurMainWindow(() => this.onDidChangeWindowFocus()); - this.nativeHostMainService.onDidFocusMainWindow(() => this.onDidChangeWindowFocus()); + this._register(this.windowsMainService.onDidChangeWindowsCount(e => this.onDidChangeWindowsCount(e))); + this._register(this.nativeHostMainService.onDidBlurMainWindow(() => this.onDidChangeWindowFocus())); + this._register(this.nativeHostMainService.onDidFocusMainWindow(() => this.onDidChangeWindowFocus())); } private get currentEnableMenuBarMnemonics(): boolean { diff --git a/src/vs/platform/menubar/electron-main/menubarMainService.ts b/src/vs/platform/menubar/electron-main/menubarMainService.ts index c680afa296ab6..731070e4f50a0 100644 --- a/src/vs/platform/menubar/electron-main/menubarMainService.ts +++ b/src/vs/platform/menubar/electron-main/menubarMainService.ts @@ -8,6 +8,7 @@ import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle import { ILogService } from 'vs/platform/log/common/log'; import { ICommonMenubarService, IMenubarData } from 'vs/platform/menubar/common/menubar'; import { Menubar } from 'vs/platform/menubar/electron-main/menubar'; +import { Disposable } from 'vs/base/common/lifecycle'; export const IMenubarMainService = createDecorator('menubarMainService'); @@ -15,24 +16,24 @@ export interface IMenubarMainService extends ICommonMenubarService { readonly _serviceBrand: undefined; } -export class MenubarMainService implements IMenubarMainService { +export class MenubarMainService extends Disposable implements IMenubarMainService { declare readonly _serviceBrand: undefined; - private menubar: Promise; + private readonly menubar = this.installMenuBarAfterWindowOpen(); constructor( @IInstantiationService private readonly instantiationService: IInstantiationService, @ILifecycleMainService private readonly lifecycleMainService: ILifecycleMainService, @ILogService private readonly logService: ILogService ) { - this.menubar = this.installMenuBarAfterWindowOpen(); + super(); } private async installMenuBarAfterWindowOpen(): Promise { await this.lifecycleMainService.when(LifecycleMainPhase.AfterWindowOpen); - return this.instantiationService.createInstance(Menubar); + return this._register(this.instantiationService.createInstance(Menubar)); } async updateMenubar(windowId: number, menus: IMenubarData): Promise { diff --git a/src/vs/platform/windows/electron-main/windowsStateHandler.ts b/src/vs/platform/windows/electron-main/windowsStateHandler.ts index df866ea355612..dcbec3407c403 100644 --- a/src/vs/platform/windows/electron-main/windowsStateHandler.ts +++ b/src/vs/platform/windows/electron-main/windowsStateHandler.ts @@ -85,19 +85,19 @@ export class WindowsStateHandler extends Disposable { }); // Handle various lifecycle events around windows - this.lifecycleMainService.onBeforeCloseWindow(window => this.onBeforeCloseWindow(window)); - this.lifecycleMainService.onBeforeShutdown(() => this.onBeforeShutdown()); - this.windowsMainService.onDidChangeWindowsCount(e => { + this._register(this.lifecycleMainService.onBeforeCloseWindow(window => this.onBeforeCloseWindow(window))); + this._register(this.lifecycleMainService.onBeforeShutdown(() => this.onBeforeShutdown())); + this._register(this.windowsMainService.onDidChangeWindowsCount(e => { if (e.newCount - e.oldCount > 0) { // clear last closed window state when a new window opens. this helps on macOS where // otherwise closing the last window, opening a new window and then quitting would // use the state of the previously closed window when restarting. this.lastClosedState = undefined; } - }); + })); // try to save state before destroy because close will not fire - this.windowsMainService.onDidDestroyWindow(window => this.onBeforeCloseWindow(window)); + this._register(this.windowsMainService.onDidDestroyWindow(window => this.onBeforeCloseWindow(window))); } // Note that onBeforeShutdown() and onBeforeCloseWindow() are fired in different order depending on the OS: diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 4cc439c1fb786..19488429dc762 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -608,7 +608,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.stateModel.setRuntimeValue(LayoutStateKeys.EDITOR_HIDDEN, false); } - this.stateModel.onDidChangeState(change => { + this._register(this.stateModel.onDidChangeState(change => { if (change.key === LayoutStateKeys.ACTIVITYBAR_HIDDEN) { this.setActivityBarHidden(change.value as boolean); } @@ -630,7 +630,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } this.doUpdateLayoutConfiguration(); - }); + })); // Layout Initialization State const initialEditorsState = this.getInitialEditorsState(); diff --git a/src/vs/workbench/common/contributions.ts b/src/vs/workbench/common/contributions.ts index 224c09e3bb115..f7e23fae0a270 100644 --- a/src/vs/workbench/common/contributions.ts +++ b/src/vs/workbench/common/contributions.ts @@ -250,7 +250,8 @@ export class WorkbenchContributionsRegistry extends Disposable implements IWorkb const environmentService = this.environmentService = accessor.get(IEnvironmentService); const editorPaneService = this.editorPaneService = accessor.get(IEditorPaneService); - this._register(lifecycleService.onWillShutdown(() => { + // Dispose contributions on shutdown + this._register(lifecycleService.onDidShutdown(() => { this.instanceDisposables.clear(); })); diff --git a/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts b/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts index ca06b37e21f2f..3b82ad1889e8e 100644 --- a/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts +++ b/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts @@ -11,11 +11,11 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { OUTPUT_MODE_ID, LOG_MODE_ID } from 'vs/workbench/services/output/common/output'; import { MonacoWebWorker, createWebWorker } from 'vs/editor/browser/services/webWorker'; import { ICreateData, OutputLinkComputer } from 'vs/workbench/contrib/output/common/outputLinkComputer'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; -export class OutputLinkProvider { +export class OutputLinkProvider extends Disposable { private static readonly DISPOSE_WORKER_TIME = 3 * 60 * 1000; // dispose worker after 3 minutes of inactivity @@ -29,6 +29,8 @@ export class OutputLinkProvider { @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService, @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { + super(); + this.disposeWorkerScheduler = new RunOnceScheduler(() => this.disposeWorker(), OutputLinkProvider.DISPOSE_WORKER_TIME); this.registerListeners(); @@ -36,7 +38,7 @@ export class OutputLinkProvider { } private registerListeners(): void { - this.contextService.onDidChangeWorkspaceFolders(() => this.updateLinkProviderWorker()); + this._register(this.contextService.onDidChangeWorkspaceFolders(() => this.updateLinkProviderWorker())); } private updateLinkProviderWorker(): void { diff --git a/src/vs/workbench/contrib/output/browser/outputServices.ts b/src/vs/workbench/contrib/output/browser/outputServices.ts index eb83c902631f7..6521eeec89184 100644 --- a/src/vs/workbench/contrib/output/browser/outputServices.ts +++ b/src/vs/workbench/contrib/output/browser/outputServices.ts @@ -103,8 +103,8 @@ export class OutputService extends Disposable implements IOutputService, ITextMo this.activeOutputChannelLevelIsDefaultContext = CONTEXT_ACTIVE_OUTPUT_LEVEL_IS_DEFAULT.bindTo(contextKeyService); // Register as text model content provider for output - textModelResolverService.registerTextModelContentProvider(OUTPUT_SCHEME, this); - instantiationService.createInstance(OutputLinkProvider); + this._register(textModelResolverService.registerTextModelContentProvider(OUTPUT_SCHEME, this)); + this._register(instantiationService.createInstance(OutputLinkProvider)); // Create output channels for already registered channels const registry = Registry.as(Extensions.OutputChannels); diff --git a/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts index 1c3c9233ac8b9..37db54ee4935d 100644 --- a/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts +++ b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts @@ -101,7 +101,7 @@ suite('FileDialogService', function () { const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog()); instantiationService.set(IFileDialogService, dialogService); - const workspaceService: IWorkspaceEditingService = instantiationService.createInstance(BrowserWorkspaceEditingService); + const workspaceService: IWorkspaceEditingService = disposables.add(instantiationService.createInstance(BrowserWorkspaceEditingService)); assert.strictEqual((await workspaceService.pickNewWorkspacePath())?.path.startsWith(testFile.path), true); assert.strictEqual(await dialogService.pickWorkspaceAndOpen({}), undefined); }); @@ -126,7 +126,7 @@ suite('FileDialogService', function () { } as IPathService); const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog()); instantiationService.set(IFileDialogService, dialogService); - const workspaceService: IWorkspaceEditingService = instantiationService.createInstance(BrowserWorkspaceEditingService); + const workspaceService: IWorkspaceEditingService = disposables.add(instantiationService.createInstance(BrowserWorkspaceEditingService)); assert.strictEqual((await workspaceService.pickNewWorkspacePath())?.path.startsWith(testFile.path), true); assert.strictEqual(await dialogService.pickWorkspaceAndOpen({}), undefined); }); @@ -158,7 +158,7 @@ suite('FileDialogService', function () { } as IPathService); const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog()); instantiationService.set(IFileDialogService, dialogService); - const workspaceService: IWorkspaceEditingService = instantiationService.createInstance(BrowserWorkspaceEditingService); + const workspaceService: IWorkspaceEditingService = disposables.add(instantiationService.createInstance(BrowserWorkspaceEditingService)); assert.strictEqual((await workspaceService.pickNewWorkspacePath())?.path.startsWith(testFile.path), true); assert.strictEqual(await dialogService.pickWorkspaceAndOpen({}), undefined); }); diff --git a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts index 21312c7e76cd3..a3be20f527712 100644 --- a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts @@ -29,8 +29,9 @@ import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/w import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { Disposable } from 'vs/base/common/lifecycle'; -export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditingService { +export abstract class AbstractWorkspaceEditingService extends Disposable implements IWorkspaceEditingService { declare readonly _serviceBrand: undefined; @@ -51,7 +52,9 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, - ) { } + ) { + super(); + } async pickNewWorkspacePath(): Promise { const availableFileSystems = [Schemas.file]; diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts index f0453fbdc65c1..a896a9ed6d141 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts @@ -67,10 +67,10 @@ export class NativeWorkspaceEditingService extends AbstractWorkspaceEditingServi } private registerListeners(): void { - this.lifecycleService.onBeforeShutdown(e => { + this._register(this.lifecycleService.onBeforeShutdown(e => { const saveOperation = this.saveUntitledBeforeShutdown(e.reason); e.veto(saveOperation, 'veto.untitledWorkspace'); - }); + })); } private async saveUntitledBeforeShutdown(reason: ShutdownReason): Promise { From e4461617909ad24b1180666a297ff4b202e461c7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 5 Jun 2024 07:20:55 -0700 Subject: [PATCH 095/755] Register more terminal listeners Part of #214234 --- .../electron-main/electronPtyHostStarter.ts | 2 +- src/vs/platform/terminal/node/ptyHostService.ts | 8 +++++--- .../workbench/api/common/extHostTerminalService.ts | 13 +++++++------ .../contrib/terminal/browser/terminalService.ts | 14 +++++++------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/vs/platform/terminal/electron-main/electronPtyHostStarter.ts b/src/vs/platform/terminal/electron-main/electronPtyHostStarter.ts index 8c74c72b9c91f..ebd0331692ee4 100644 --- a/src/vs/platform/terminal/electron-main/electronPtyHostStarter.ts +++ b/src/vs/platform/terminal/electron-main/electronPtyHostStarter.ts @@ -38,7 +38,7 @@ export class ElectronPtyHostStarter extends Disposable implements IPtyHostStarte ) { super(); - this._lifecycleMainService.onWillShutdown(() => this._onWillShutdown.fire()); + this._register(this._lifecycleMainService.onWillShutdown(() => this._onWillShutdown.fire())); // Listen for new windows to establish connection directly to pty host validatedIpcMain.on('vscode:createPtyHostMessageChannel', (e, nonce) => this._onWindowConnection(e, nonce)); this._register(toDisposable(() => { diff --git a/src/vs/platform/terminal/node/ptyHostService.ts b/src/vs/platform/terminal/node/ptyHostService.ts index f91b87baed429..402dcc7b723f3 100644 --- a/src/vs/platform/terminal/node/ptyHostService.ts +++ b/src/vs/platform/terminal/node/ptyHostService.ts @@ -108,14 +108,16 @@ export class PtyHostService extends Disposable implements IPtyHostService { this._register(toDisposable(() => this._disposePtyHost())); this._resolveVariablesRequestStore = this._register(new RequestStore(undefined, this._logService)); - this._resolveVariablesRequestStore.onCreateRequest(this._onPtyHostRequestResolveVariables.fire, this._onPtyHostRequestResolveVariables); + this._register(this._resolveVariablesRequestStore.onCreateRequest(this._onPtyHostRequestResolveVariables.fire, this._onPtyHostRequestResolveVariables)); // Start the pty host when a window requests a connection, if the starter has that capability. if (this._ptyHostStarter.onRequestConnection) { - Event.once(this._ptyHostStarter.onRequestConnection)(() => this._ensurePtyHost()); + this._register(Event.once(this._ptyHostStarter.onRequestConnection)(() => this._ensurePtyHost())); } - this._ptyHostStarter.onWillShutdown?.(() => this._wasQuitRequested = true); + if (this._ptyHostStarter.onWillShutdown) { + this._register(this._ptyHostStarter.onWillShutdown(() => this._wasQuitRequested = true)); + } } private get _ignoreProcessNames(): string[] { diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index b870c3ab033e5..9ce31e7147c91 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -921,7 +921,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public getEnvironmentVariableCollection(extension: IExtensionDescription): IEnvironmentVariableCollection { let collection = this._environmentVariableCollections.get(extension.identifier.value); if (!collection) { - collection = new UnifiedEnvironmentVariableCollection(); + collection = this._register(new UnifiedEnvironmentVariableCollection()); this._setEnvironmentVariableCollection(extension.identifier.value, collection); } return collection.getScopedEnvironmentVariableCollection(undefined); @@ -936,7 +936,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public $initEnvironmentVariableCollections(collections: [string, ISerializableEnvironmentVariableCollection][]): void { collections.forEach(entry => { const extensionIdentifier = entry[0]; - const collection = new UnifiedEnvironmentVariableCollection(entry[1]); + const collection = this._register(new UnifiedEnvironmentVariableCollection(entry[1])); this._setEnvironmentVariableCollection(extensionIdentifier, collection); }); } @@ -952,20 +952,20 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I private _setEnvironmentVariableCollection(extensionIdentifier: string, collection: UnifiedEnvironmentVariableCollection): void { this._environmentVariableCollections.set(extensionIdentifier, collection); - collection.onDidChangeCollection(() => { + this._register(collection.onDidChangeCollection(() => { // When any collection value changes send this immediately, this is done to ensure // following calls to createTerminal will be created with the new environment. It will // result in more noise by sending multiple updates when called but collections are // expected to be small. this._syncEnvironmentVariableCollection(extensionIdentifier, collection); - }); + })); } } /** * Unified environment variable collection carrying information for all scopes, for a specific extension. */ -class UnifiedEnvironmentVariableCollection { +class UnifiedEnvironmentVariableCollection extends Disposable { readonly map: Map = new Map(); private readonly scopedCollections: Map = new Map(); readonly descriptionMap: Map = new Map(); @@ -983,6 +983,7 @@ class UnifiedEnvironmentVariableCollection { constructor( serialized?: ISerializableEnvironmentVariableCollection ) { + super(); this.map = new Map(serialized); } @@ -992,7 +993,7 @@ class UnifiedEnvironmentVariableCollection { if (!scopedCollection) { scopedCollection = new ScopedEnvironmentVariableCollection(this, scope); this.scopedCollections.set(scopedCollectionKey, scopedCollection); - scopedCollection.onDidChangeCollection(() => this._onDidChangeCollection.fire()); + this._register(scopedCollection.onDidChangeCollection(() => this._onDidChangeCollection.fire())); } return scopedCollection; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index af9508e1b1f6e..786744aa3e4de 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -335,16 +335,16 @@ export class TerminalService extends Disposable implements ITerminalService { } private _forwardInstanceHostEvents(host: ITerminalInstanceHost) { - host.onDidChangeInstances(this._onDidChangeInstances.fire, this._onDidChangeInstances); - host.onDidDisposeInstance(this._onDidDisposeInstance.fire, this._onDidDisposeInstance); - host.onDidChangeActiveInstance(instance => this._evaluateActiveInstance(host, instance)); - host.onDidFocusInstance(instance => { + this._register(host.onDidChangeInstances(this._onDidChangeInstances.fire, this._onDidChangeInstances)); + this._register(host.onDidDisposeInstance(this._onDidDisposeInstance.fire, this._onDidDisposeInstance)); + this._register(host.onDidChangeActiveInstance(instance => this._evaluateActiveInstance(host, instance))); + this._register(host.onDidFocusInstance(instance => { this._onDidFocusInstance.fire(instance); this._evaluateActiveInstance(host, instance); - }); - host.onDidChangeInstanceCapability((instance) => { + })); + this._register(host.onDidChangeInstanceCapability((instance) => { this._onDidChangeInstanceCapability.fire(instance); - }); + })); this._hostActiveTerminals.set(host, undefined); } From ab9a1286f2d5a176b59a3ca04a7369a0fb4f9c30 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 5 Jun 2024 16:32:08 +0200 Subject: [PATCH 096/755] sketch up lm-extention that allows for function calling (#214334) --- .../workbench/api/common/extHost.api.impl.ts | 7 ++ .../api/common/extHostLanguageModels.ts | 84 ++++++++++++++----- .../api/common/extHostTypeConverters.ts | 62 ++++++++++++-- src/vs/workbench/api/common/extHostTypes.ts | 40 ++++++++- .../contrib/chat/common/chatServiceImpl.ts | 4 +- .../contrib/chat/common/languageModels.ts | 32 ++++++- .../common/extensionsApiProposals.ts | 1 + .../vscode.proposed.chatProvider.d.ts | 25 ++++-- src/vscode-dts/vscode.proposed.lmTools.d.ts | 58 +++++++++++++ 9 files changed, 272 insertions(+), 41 deletions(-) create mode 100644 src/vscode-dts/vscode.proposed.lmTools.d.ts diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index d76d6aa4bf088..49143a3fcc525 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1448,6 +1448,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I } return extHostLanguageModels.onDidChangeProviders(listener, thisArgs, disposables); }, + registerChatModelProvider: (id, provider, metadata) => { + checkProposedApiEnabled(extension, 'chatProvider'); + return extHostLanguageModels.registerLanguageModel(extension, id, provider, metadata); + }, // --- embeddings get embeddingModels() { checkProposedApiEnabled(extension, 'embeddings'); @@ -1729,6 +1733,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I ChatLocation: extHostTypes.ChatLocation, LanguageModelChatMessageRole: extHostTypes.LanguageModelChatMessageRole, LanguageModelChatMessage: extHostTypes.LanguageModelChatMessage, + LanguageModelChatMessageFunctionResultPart: extHostTypes.LanguageModelFunctionResultPart, + LanguageModelChatResponseTextPart: extHostTypes.LanguageModelTextPart, + LanguageModelChatResponseFunctionUsePart: extHostTypes.LanguageModelFunctionUsePart, LanguageModelChatMessage2: extHostTypes.LanguageModelChatMessage, // TODO@jrieken REMOVE LanguageModelChatSystemMessage: extHostTypes.LanguageModelChatSystemMessage,// TODO@jrieken REMOVE LanguageModelChatUserMessage: extHostTypes.LanguageModelChatUserMessage,// TODO@jrieken REMOVE diff --git a/src/vs/workbench/api/common/extHostLanguageModels.ts b/src/vs/workbench/api/common/extHostLanguageModels.ts index fdc937315540f..8a3e7385453ef 100644 --- a/src/vs/workbench/api/common/extHostLanguageModels.ts +++ b/src/vs/workbench/api/common/extHostLanguageModels.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AsyncIterableSource, Barrier } from 'vs/base/common/async'; +import { AsyncIterableObject, AsyncIterableSource, Barrier } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { CancellationError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; @@ -19,7 +19,7 @@ import { IExtHostAuthentication } from 'vs/workbench/api/common/extHostAuthentic import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; -import { IChatMessage, IChatResponseFragment, ILanguageModelChatMetadata } from 'vs/workbench/contrib/chat/common/languageModels'; +import { IChatMessage, IChatResponseFragment, IChatResponsePart, ILanguageModelChatMetadata } from 'vs/workbench/contrib/chat/common/languageModels'; import { INTERNAL_AUTH_PROVIDER_PREFIX } from 'vs/workbench/services/authentication/common/authentication'; import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import type * as vscode from 'vscode'; @@ -36,13 +36,13 @@ type LanguageModelData = { class LanguageModelResponseStream { - readonly stream = new AsyncIterableSource(); + readonly stream = new AsyncIterableSource(); constructor( readonly option: number, - stream?: AsyncIterableSource + stream?: AsyncIterableSource ) { - this.stream = stream ?? new AsyncIterableSource(); + this.stream = stream ?? new AsyncIterableSource(); } } @@ -51,7 +51,7 @@ class LanguageModelResponse { readonly apiObject: vscode.LanguageModelChatResponse; private readonly _responseStreams = new Map(); - private readonly _defaultStream = new AsyncIterableSource(); + private readonly _defaultStream = new AsyncIterableSource(); private _isDone: boolean = false; private _isStreaming: boolean = false; @@ -60,8 +60,14 @@ class LanguageModelResponse { const that = this; this.apiObject = { // result: promise, - text: that._defaultStream.asyncIterable, - // streams: AsyncIterable[] // FUTURE responses per N + stream: that._defaultStream.asyncIterable, + text: AsyncIterableObject.map(that._defaultStream.asyncIterable, part => { + if (part instanceof extHostTypes.LanguageModelTextPart) { + return part.value; + } else { + return undefined; + } + }).coalesce(), }; } @@ -90,7 +96,14 @@ class LanguageModelResponse { } this._responseStreams.set(fragment.index, res); } - res.stream.emitOne(fragment.part); + + let out: vscode.LanguageModelChatResponseTextPart | vscode.LanguageModelChatResponseFunctionUsePart; + if (fragment.part.type === 'text') { + out = new extHostTypes.LanguageModelTextPart(fragment.part.value); + } else { + out = new extHostTypes.LanguageModelFunctionUsePart(fragment.part.name, fragment.part.parameters); + } + res.stream.emitOne(out); } get isStreaming(): boolean { @@ -181,21 +194,51 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { if (!data) { return; } - const progress = new Progress(async fragment => { + const progress = new Progress(async fragment => { if (token.isCancellationRequested) { this._logService.warn(`[CHAT](${data.extension.value}) CANNOT send progress because the REQUEST IS CANCELLED`); return; } - this._proxy.$handleProgressChunk(requestId, { index: fragment.index, part: fragment.part }); + + let part: IChatResponsePart | undefined; + if (fragment.part instanceof extHostTypes.LanguageModelFunctionUsePart) { + part = { type: 'function_use', name: fragment.part.name, parameters: fragment.part.parameters }; + } else if (fragment.part instanceof extHostTypes.LanguageModelTextPart) { + part = { type: 'text', value: fragment.part.value }; + } + + if (!part) { + this._logService.warn(`[CHAT](${data.extension.value}) UNKNOWN part ${JSON.stringify(fragment)}`); + return; + } + + this._proxy.$handleProgressChunk(requestId, { index: fragment.index, part }); }); - return data.provider.provideLanguageModelResponse( - messages.map(typeConvert.LanguageModelChatMessage.to), - options, - ExtensionIdentifier.toKey(from), - progress, - token - ); + if (data.provider.provideLanguageModelResponse2) { + + return data.provider.provideLanguageModelResponse2( + messages.map(typeConvert.LanguageModelChatMessage.to), + options, + ExtensionIdentifier.toKey(from), + progress, + token + ); + + } else { + + const progress2 = new Progress(async fragment => { + progress.report({ index: fragment.index, part: new extHostTypes.LanguageModelTextPart(fragment.part) }); + }); + + return data.provider.provideLanguageModelResponse( + messages.map(typeConvert.LanguageModelChatMessage.to), + options, + ExtensionIdentifier.toKey(from), + progress2, + token + ); + } } @@ -358,13 +401,16 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { if (message.role as number === extHostTypes.LanguageModelChatMessageRole.System) { checkProposedApiEnabled(extension, 'languageModelSystem'); } + if (message.content2 instanceof extHostTypes.LanguageModelFunctionResultPart) { + checkProposedApiEnabled(extension, 'lmTools'); + } internalMessages.push(typeConvert.LanguageModelChatMessage.from(message)); } return internalMessages; } async $handleResponseFragment(requestId: number, chunk: IChatResponseFragment): Promise { - const data = this._pendingRequest.get(requestId);//.report(chunk); + const data = this._pendingRequest.get(requestId); if (data) { data.res.handleFragment(chunk); } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 25a2134440bf5..8ab0c30c428c4 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2243,23 +2243,69 @@ export namespace ChatFollowup { } } +export namespace LanguageModelChatMessageRole { + export function to(role: chatProvider.ChatMessageRole): vscode.LanguageModelChatMessageRole { + switch (role) { + case chatProvider.ChatMessageRole.System: return types.LanguageModelChatMessageRole.System; + case chatProvider.ChatMessageRole.User: return types.LanguageModelChatMessageRole.User; + case chatProvider.ChatMessageRole.Assistant: return types.LanguageModelChatMessageRole.Assistant; + } + } + + export function from(role: vscode.LanguageModelChatMessageRole): chatProvider.ChatMessageRole { + switch (role) { + case types.LanguageModelChatMessageRole.System: return chatProvider.ChatMessageRole.System; + case types.LanguageModelChatMessageRole.User: return chatProvider.ChatMessageRole.User; + case types.LanguageModelChatMessageRole.Assistant: return chatProvider.ChatMessageRole.Assistant; + } + return chatProvider.ChatMessageRole.User; + } +} export namespace LanguageModelChatMessage { export function to(message: chatProvider.IChatMessage): vscode.LanguageModelChatMessage { - switch (message.role) { - case chatProvider.ChatMessageRole.System: return new types.LanguageModelChatMessage(types.LanguageModelChatMessageRole.System, message.content); - case chatProvider.ChatMessageRole.User: return new types.LanguageModelChatMessage(types.LanguageModelChatMessageRole.User, message.content); - case chatProvider.ChatMessageRole.Assistant: return new types.LanguageModelChatMessage(types.LanguageModelChatMessageRole.Assistant, message.content); + let content: string = ''; + let content2: vscode.LanguageModelChatMessageFunctionResultPart | undefined; + if (message.content.type === 'text') { + content = message.content.value; + } else { + content2 = new types.LanguageModelFunctionResultPart(message.content.name, message.content.value, message.content.isError); + } + const role = LanguageModelChatMessageRole.to(message.role); + const result = new types.LanguageModelChatMessage(role, content, message.name); + if (content2 !== undefined) { + result.content2 = content2; } + return result; } export function from(message: vscode.LanguageModelChatMessage): chatProvider.IChatMessage { - switch (message.role as types.LanguageModelChatMessageRole) { - case types.LanguageModelChatMessageRole.System: return { role: chatProvider.ChatMessageRole.System, content: message.content }; - case types.LanguageModelChatMessageRole.User: return { role: chatProvider.ChatMessageRole.User, content: message.content }; - case types.LanguageModelChatMessageRole.Assistant: return { role: chatProvider.ChatMessageRole.Assistant, content: message.content }; + + const role = LanguageModelChatMessageRole.from(message.role); + const name = message.name; + + let content: chatProvider.IChatMessagePart; + + if (message.content2 instanceof types.LanguageModelFunctionResultPart) { + content = { + type: 'function_result', + name: message.content2.name, + value: message.content2.content, + isError: message.content2.isError + }; + } else { + content = { + type: 'text', + value: message.content + }; } + + return { + role, + name, + content + }; } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 189c90b8f633e..db6c3211ae97d 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4455,10 +4455,25 @@ export enum LanguageModelChatMessageRole { System = 3 } +export class LanguageModelFunctionResultPart implements vscode.LanguageModelChatMessageFunctionResultPart { + + name: string; + content: string; + isError: boolean; + + constructor(name: string, content: string, isError?: boolean) { + this.name = name; + this.content = content; + this.isError = isError ?? false; + } +} + export class LanguageModelChatMessage implements vscode.LanguageModelChatMessage { - static User(content: string, name?: string): LanguageModelChatMessage { - return new LanguageModelChatMessage(LanguageModelChatMessageRole.User, content, name); + static User(content: string | LanguageModelFunctionResultPart, name?: string): LanguageModelChatMessage { + const value = new LanguageModelChatMessage(LanguageModelChatMessageRole.User, '', name); + value.content2 = content; + return value; } static Assistant(content: string, name?: string): LanguageModelChatMessage { @@ -4467,15 +4482,36 @@ export class LanguageModelChatMessage implements vscode.LanguageModelChatMessage role: vscode.LanguageModelChatMessageRole; content: string; + content2: string | vscode.LanguageModelChatMessageFunctionResultPart; name: string | undefined; constructor(role: vscode.LanguageModelChatMessageRole, content: string, name?: string) { this.role = role; this.content = content; + this.content2 = content; this.name = name; } } +export class LanguageModelFunctionUsePart implements vscode.LanguageModelChatResponseFunctionUsePart { + name: string; + parameters: any; + + constructor(name: string, parameters: any) { + this.name = name; + this.parameters = parameters; + } +} + +export class LanguageModelTextPart implements vscode.LanguageModelChatResponseTextPart { + value: string; + + constructor(value: string) { + this.value = value; + + } +} + /** * @deprecated */ diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index 1ab8c2a4998ff..af21078bacda9 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -611,8 +611,8 @@ export class ChatService extends Disposable implements IChatService { if (!request.response) { continue; } - history.push({ role: ChatMessageRole.User, content: request.message.text }); - history.push({ role: ChatMessageRole.Assistant, content: request.response.response.asString() }); + history.push({ role: ChatMessageRole.User, content: { type: 'text', value: request.message.text } }); + history.push({ role: ChatMessageRole.Assistant, content: { type: 'text', value: request.response.response.asString() } }); } const message = parsedRequest.text; const commandResult = await this.chatSlashCommandService.executeCommand(commandPart.slashCommand.command, message.substring(commandPart.slashCommand.command.length + 1).trimStart(), new Progress(p => { diff --git a/src/vs/workbench/contrib/chat/common/languageModels.ts b/src/vs/workbench/contrib/chat/common/languageModels.ts index 1276da1bd4248..650d3a40c22a8 100644 --- a/src/vs/workbench/contrib/chat/common/languageModels.ts +++ b/src/vs/workbench/contrib/chat/common/languageModels.ts @@ -23,14 +23,42 @@ export const enum ChatMessageRole { Assistant, } +export interface IChatMessageTextPart { + type: 'text'; + value: string; +} + +export interface IChatMessageFunctionResultPart { + type: 'function_result'; + name: string; + value: any; + isError?: boolean; +} + +export type IChatMessagePart = IChatMessageTextPart | IChatMessageFunctionResultPart; + export interface IChatMessage { + readonly name?: string | undefined; readonly role: ChatMessageRole; - readonly content: string; + readonly content: IChatMessagePart; } +export interface IChatResponseTextPart { + type: 'text'; + value: string; +} + +export interface IChatResponceFunctionUsePart { + type: 'function_use'; + name: string; + parameters: any; +} + +export type IChatResponsePart = IChatResponseTextPart | IChatResponceFunctionUsePart; + export interface IChatResponseFragment { index: number; - part: string; + part: IChatResponsePart; } export interface ILanguageModelChatMetadata { diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index dcf32109014c1..87f6b82ce86e6 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -78,6 +78,7 @@ export const allApiProposals = Object.freeze({ ipc: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.ipc.d.ts', languageModelSystem: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageModelSystem.d.ts', languageStatusText: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageStatusText.d.ts', + lmTools: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.lmTools.d.ts', mappedEditsProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts', multiDocumentHighlightProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.multiDocumentHighlightProvider.d.ts', newSymbolNamesProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.newSymbolNamesProvider.d.ts', diff --git a/src/vscode-dts/vscode.proposed.chatProvider.d.ts b/src/vscode-dts/vscode.proposed.chatProvider.d.ts index 7fc7c3e3b97b4..9abbdc5d1aa25 100644 --- a/src/vscode-dts/vscode.proposed.chatProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.chatProvider.d.ts @@ -10,20 +10,29 @@ declare module 'vscode' { part: string; } + export interface ChatResponseFragment2 { + index: number; + part: LanguageModelChatResponseTextPart | LanguageModelChatResponseFunctionUsePart; + } + // @API extension ship a d.ts files for their options /** * Represents a large language model that accepts ChatML messages and produces a streaming response */ - export interface ChatResponseProvider { + export interface LanguageModelChatProvider { onDidReceiveLanguageModelResponse2?: Event<{ readonly extensionId: string; readonly participant?: string; readonly tokenCount?: number }>; provideLanguageModelResponse(messages: LanguageModelChatMessage[], options: { [name: string]: any }, extensionId: string, progress: Progress, token: CancellationToken): Thenable; + provideLanguageModelResponse2?(messages: LanguageModelChatMessage[], options: LanguageModelChatRequestOptions, extensionId: string, progress: Progress, token: CancellationToken): Thenable; + provideTokenCount(text: string | LanguageModelChatMessage, token: CancellationToken): Thenable; } + export type ChatResponseProvider = LanguageModelChatProvider; + export interface ChatResponseProviderMetadata { readonly vendor: string; @@ -64,14 +73,14 @@ declare module 'vscode' { export namespace chat { /** - * Register a LLM as chat response provider to the editor. - * - * - * @param id - * @param provider - * @param metadata - */ + * @deprecated use `lm.registerChatResponseProvider` instead + */ export function registerChatResponseProvider(id: string, provider: ChatResponseProvider, metadata: ChatResponseProviderMetadata): Disposable; } + export namespace lm { + + export function registerChatModelProvider(id: string, provider: LanguageModelChatProvider, metadata: ChatResponseProviderMetadata): Disposable; + } + } diff --git a/src/vscode-dts/vscode.proposed.lmTools.d.ts b/src/vscode-dts/vscode.proposed.lmTools.d.ts new file mode 100644 index 0000000000000..6aa0ac3a22562 --- /dev/null +++ b/src/vscode-dts/vscode.proposed.lmTools.d.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // TODO@API capabilities + + export type JSONSchema = object; + + // API -> LM: an tool/function that is available to the language model + export interface LanguageModelChatFunction { + name: string; + description: string; + parametersSchema: JSONSchema; + } + + // API -> LM: add tools as request option + export interface LanguageModelChatRequestOptions { + // TODO@API this will a heterogeneous array of different types of tools + tools?: LanguageModelChatFunction[]; + } + + // LM -> USER: function that should be used + export class LanguageModelChatResponseFunctionUsePart { + name: string; + parameters: any; + + constructor(name: string, parameters: any); + } + + // LM -> USER: text chunk + export class LanguageModelChatResponseTextPart { + value: string; + + constructor(value: string); + } + + export interface LanguageModelChatResponse { + + stream: AsyncIterable; + } + + + // USER -> LM: the result of a function call + export class LanguageModelChatMessageFunctionResultPart { + name: string; + content: string; + isError: boolean; + + constructor(name: string, content: string, isError?: boolean); + } + + export interface LanguageModelChatMessage { + content2: string | LanguageModelChatMessageFunctionResultPart; + } +} From af675232d065f8a95166865ce2d6128a9bb70d97 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 5 Jun 2024 16:35:59 +0200 Subject: [PATCH 097/755] SCM - consistent fallback for count calculation (#214337) --- src/vs/workbench/contrib/scm/browser/activity.ts | 7 ++----- .../workbench/contrib/scm/browser/scmRepositoryRenderer.ts | 4 ++-- src/vs/workbench/contrib/scm/browser/util.ts | 4 ++++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 7ee1d516f6de5..c390256785f66 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -21,13 +21,10 @@ import { Iterable } from 'vs/base/common/iterator'; import { ITitleService } from 'vs/workbench/services/title/browser/titleService'; import { IEditorGroupContextKeyProvider, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { getRepositoryResourceCount } from 'vs/workbench/contrib/scm/browser/util'; function getCount(repository: ISCMRepository): number { - if (typeof repository.provider.count === 'number') { - return repository.provider.count; - } else { - return repository.provider.groups.reduce((r, g) => r + g.resources.length, 0); - } + return repository.provider.count ?? getRepositoryResourceCount(repository.provider); } export class SCMStatusController implements IWorkbenchContribution { diff --git a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts index 50a684ed24716..28473fdf683ab 100644 --- a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts +++ b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts @@ -12,7 +12,7 @@ import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ActionRunner, IAction } from 'vs/base/common/actions'; -import { connectPrimaryMenu, isSCMRepository, StatusBarAction } from './util'; +import { connectPrimaryMenu, getRepositoryResourceCount, isSCMRepository, StatusBarAction } from './util'; import { ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; import { FuzzyScore } from 'vs/base/common/filters'; @@ -117,7 +117,7 @@ export class RepositoryRenderer implements ICompressibleTreeRenderer { - const count = repository.provider.countObs.read(reader) ?? 0; + const count = repository.provider.countObs.read(reader) ?? getRepositoryResourceCount(repository.provider); templateData.countContainer.setAttribute('data-count', String(count)); templateData.count.setCount(count); })); diff --git a/src/vs/workbench/contrib/scm/browser/util.ts b/src/vs/workbench/contrib/scm/browser/util.ts index 00c333886a6e3..7ff931562205c 100644 --- a/src/vs/workbench/contrib/scm/browser/util.ts +++ b/src/vs/workbench/contrib/scm/browser/util.ts @@ -173,3 +173,7 @@ export function getActionViewItemProvider(instaService: IInstantiationService): export function getProviderKey(provider: ISCMProvider): string { return `${provider.contextValue}:${provider.label}${provider.rootUri ? `:${provider.rootUri.toString()}` : ''}`; } + +export function getRepositoryResourceCount(provider: ISCMProvider): number { + return provider.groups.reduce((r, g) => r + g.resources.length, 0); +} From 28cbfce5e66c0713043612ab5d438a415bb9b716 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Wed, 5 Jun 2024 16:46:26 +0200 Subject: [PATCH 098/755] feature: allow unsetting color theme values in settings (#213512) * allow null value * allow unsetting color * undo change * delete color * undo changes * remove unused code * unset right map * add function to create nullable color schema * use nullable schema * undo change * fix nullable object * use default value * update both schemas on timeout * simplifications & polish --------- Co-authored-by: Martin Aeschlimann --- src/vs/platform/theme/common/colorUtils.ts | 13 +++++++++++-- .../services/themes/common/colorThemeData.ts | 12 ++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/theme/common/colorUtils.ts b/src/vs/platform/theme/common/colorUtils.ts index 2388e7cb7024c..7619c077f8b6d 100644 --- a/src/vs/platform/theme/common/colorUtils.ts +++ b/src/vs/platform/theme/common/colorUtils.ts @@ -11,6 +11,7 @@ import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import * as platform from 'vs/platform/registry/common/platform'; import { IColorTheme } from 'vs/platform/theme/common/themeService'; +import * as nls from 'vs/nls'; // ------ API types @@ -79,6 +80,8 @@ export const Extensions = { ColorContribution: 'base.contributions.colors' }; +export const DEFAULT_COLOR_CONFIG_VALUE = 'default'; + export interface IColorRegistry { readonly onDidChangeSchema: Event; @@ -141,9 +144,14 @@ class ColorRegistry implements IColorRegistry { } if (needsTransparency) { propertySchema.pattern = '^#(?:(?[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$'; - propertySchema.patternErrorMessage = 'This color must be transparent or it will obscure content'; + propertySchema.patternErrorMessage = nls.localize('transparecyRequired', 'This color must be transparent or it will obscure content'); } - this.colorSchema.properties[id] = propertySchema; + this.colorSchema.properties[id] = { + oneOf: [ + propertySchema, + { type: 'string', const: DEFAULT_COLOR_CONFIG_VALUE, description: nls.localize('useDefault', 'Use the default color.') } + ] + }; this.colorReferenceSchema.enum.push(id); this.colorReferenceSchema.enumDescriptions.push(description); @@ -319,6 +327,7 @@ const schemaRegistry = platform.Registry.as(JSONExten schemaRegistry.registerSchema(workbenchColorsSchemaId, colorRegistry.getColorSchema()); const delayer = new RunOnceScheduler(() => schemaRegistry.notifySchemaChanged(workbenchColorsSchemaId), 200); + colorRegistry.onDidChangeSchema(() => { if (!delayer.isScheduled()) { delayer.schedule(); diff --git a/src/vs/workbench/services/themes/common/colorThemeData.ts b/src/vs/workbench/services/themes/common/colorThemeData.ts index dd7a8f0d03f11..6c2bd95258bff 100644 --- a/src/vs/workbench/services/themes/common/colorThemeData.ts +++ b/src/vs/workbench/services/themes/common/colorThemeData.ts @@ -11,7 +11,7 @@ import { convertSettings } from 'vs/workbench/services/themes/common/themeCompat import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; import * as resources from 'vs/base/common/resources'; -import { Extensions as ColorRegistryExtensions, IColorRegistry, ColorIdentifier, editorBackground, editorForeground } from 'vs/platform/theme/common/colorRegistry'; +import { Extensions as ColorRegistryExtensions, IColorRegistry, ColorIdentifier, editorBackground, editorForeground, DEFAULT_COLOR_CONFIG_VALUE } from 'vs/platform/theme/common/colorRegistry'; import { ITokenStyle, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; import { Registry } from 'vs/platform/registry/common/platform'; import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; @@ -372,7 +372,9 @@ export class ColorThemeData implements IWorkbenchColorTheme { private overwriteCustomColors(colors: IColorCustomizations) { for (const id in colors) { const colorVal = colors[id]; - if (typeof colorVal === 'string') { + if (colorVal === DEFAULT_COLOR_CONFIG_VALUE) { + delete this.colorMap[id]; + } else if (typeof colorVal === 'string') { this.customColorMap[id] = Color.fromHex(colorVal); } } @@ -716,8 +718,10 @@ async function _loadColorTheme(extensionResourceLoaderService: IExtensionResourc } // new JSON color themes format for (const colorId in colors) { - const colorHex = colors[colorId]; - if (typeof colorHex === 'string') { // ignore colors tht are null + const colorVal = colors[colorId]; + if (colorVal === DEFAULT_COLOR_CONFIG_VALUE) { + delete result.colors[colorId]; + } else if (typeof colorVal === 'string') { // ignore colors that are null result.colors[colorId] = Color.fromHex(colors[colorId]); } } From cb66768ae2914db941f504349877879fd3195d85 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Wed, 5 Jun 2024 16:59:43 +0200 Subject: [PATCH 099/755] When completing color keys in settings, fill in current value (#213451) * register theme service * set color theme * set default snippet * remove log * use type import * fix formatting * undo change * remove log * fix formatting * rename interface * rename function * update listener * remove unused code * inline event listener * polish --------- Co-authored-by: Martin Aeschlimann --- src/vs/platform/theme/common/colorUtils.ts | 24 ++++++++++++++++--- .../themes/browser/workbenchThemeService.ts | 2 ++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/theme/common/colorUtils.ts b/src/vs/platform/theme/common/colorUtils.ts index 7619c077f8b6d..546e51f5a5716 100644 --- a/src/vs/platform/theme/common/colorUtils.ts +++ b/src/vs/platform/theme/common/colorUtils.ts @@ -7,7 +7,7 @@ import { assertNever } from 'vs/base/common/assert'; import { RunOnceScheduler } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; -import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; +import { IJSONSchema, IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import * as platform from 'vs/platform/registry/common/platform'; import { IColorTheme } from 'vs/platform/theme/common/themeService'; @@ -120,25 +120,43 @@ export interface IColorRegistry { */ getColorReferenceSchema(): IJSONSchema; + /** + * Notify when the color theme or settings change. + */ + notifyThemeUpdate(theme: IColorTheme): void; + } +type IJSONSchemaForColors = IJSONSchema & { properties: { [name: string]: IJSONSchemaWithSnippets } }; +type IJSONSchemaWithSnippets = IJSONSchema & { defaultSnippets: IJSONSchemaSnippet[] }; + class ColorRegistry implements IColorRegistry { private readonly _onDidChangeSchema = new Emitter(); readonly onDidChangeSchema: Event = this._onDidChangeSchema.event; private colorsById: { [key: string]: ColorContribution }; - private colorSchema: IJSONSchema & { properties: IJSONSchemaMap } = { type: 'object', properties: {} }; + private colorSchema: IJSONSchemaForColors = { type: 'object', properties: {} }; private colorReferenceSchema: IJSONSchema & { enum: string[]; enumDescriptions: string[] } = { type: 'string', enum: [], enumDescriptions: [] }; constructor() { this.colorsById = {}; } + public notifyThemeUpdate(colorThemeData: IColorTheme) { + for (const key of Object.keys(this.colorsById)) { + const color = colorThemeData.getColor(key); + if (color) { + this.colorSchema.properties[key].defaultSnippets[0].body = `\${1:${color.toString()}}`; + } + } + this._onDidChangeSchema.fire(); + } + public registerColor(id: string, defaults: ColorDefaults | null, description: string, needsTransparency = false, deprecationMessage?: string): ColorIdentifier { const colorContribution: ColorContribution = { id, description, defaults, needsTransparency, deprecationMessage }; this.colorsById[id] = colorContribution; - const propertySchema: IJSONSchema = { type: 'string', description, format: 'color-hex', defaultSnippets: [{ body: '${1:#ff0000}' }] }; + const propertySchema: IJSONSchemaWithSnippets = { type: 'string', description, format: 'color-hex', defaultSnippets: [{ body: '${1:#ff0000}' }] }; if (deprecationMessage) { propertySchema.deprecationMessage = deprecationMessage; } diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index eb40c8d5806ff..327b1d9133ad8 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -136,6 +136,8 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme this.currentProductIconTheme = ProductIconThemeData.createUnloadedTheme(''); this.productIconThemeSequencer = new Sequencer(); + this._register(this.onDidColorThemeChange(theme => getColorRegistry().notifyThemeUpdate(theme))); + // In order to avoid paint flashing for tokens, because // themes are loaded asynchronously, we need to initialize // a color theme document with good defaults until the theme is loaded From 757820ae1a4a9cde9d769843abd2a43e7b735d30 Mon Sep 17 00:00:00 2001 From: Francesco Virga Date: Wed, 5 Jun 2024 11:03:20 -0400 Subject: [PATCH 100/755] Add recursive toggle (#212218) --- .../editor/contrib/folding/browser/folding.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts index 993c8cf08272f..25988ac737061 100644 --- a/src/vs/editor/contrib/folding/browser/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -809,6 +809,30 @@ class FoldRecursivelyAction extends FoldingAction { } } + +class ToggleFoldRecursivelyAction extends FoldingAction { + + constructor() { + super({ + id: 'editor.toggleFoldRecursively', + label: nls.localize('toggleFoldRecursivelyAction.label', "Toggle Fold Recursively"), + alias: 'Toggle Fold Recursively', + precondition: CONTEXT_FOLDING_ENABLED, + kbOpts: { + kbExpr: EditorContextKeys.editorTextFocus, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyL), + weight: KeybindingWeight.EditorContrib + } + }); + } + + invoke(_foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { + const selectedLines = this.getSelectedLines(editor); + toggleCollapseState(foldingModel, Number.MAX_VALUE, selectedLines); + } +} + + class FoldAllBlockCommentsAction extends FoldingAction { constructor() { @@ -1189,6 +1213,7 @@ registerEditorAction(UnfoldAction); registerEditorAction(UnFoldRecursivelyAction); registerEditorAction(FoldAction); registerEditorAction(FoldRecursivelyAction); +registerEditorAction(ToggleFoldRecursivelyAction); registerEditorAction(FoldAllAction); registerEditorAction(UnfoldAllAction); registerEditorAction(FoldAllBlockCommentsAction); From 675f0a03d649236bb24d7c1fd0966705932a7c9a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 5 Jun 2024 17:10:47 +0200 Subject: [PATCH 101/755] fix `LanguageModelChatMessage#User` (#214342) --- src/vs/workbench/api/common/extHostTypes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index db6c3211ae97d..a96c5570a1bfa 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4471,7 +4471,7 @@ export class LanguageModelFunctionResultPart implements vscode.LanguageModelChat export class LanguageModelChatMessage implements vscode.LanguageModelChatMessage { static User(content: string | LanguageModelFunctionResultPart, name?: string): LanguageModelChatMessage { - const value = new LanguageModelChatMessage(LanguageModelChatMessageRole.User, '', name); + const value = new LanguageModelChatMessage(LanguageModelChatMessageRole.User, typeof content === 'string' ? content : '', name); value.content2 = content; return value; } From 2fe839fd1d6bb82b450abe9be594b2fb2559cde5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 5 Jun 2024 17:57:16 +0200 Subject: [PATCH 102/755] colorUtils: fixing compile error caused by merging (#214347) colorUtils: fixing typing error caused by merging --- src/vs/platform/theme/common/colorUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/theme/common/colorUtils.ts b/src/vs/platform/theme/common/colorUtils.ts index 546e51f5a5716..33dbfc4b60671 100644 --- a/src/vs/platform/theme/common/colorUtils.ts +++ b/src/vs/platform/theme/common/colorUtils.ts @@ -127,7 +127,7 @@ export interface IColorRegistry { } -type IJSONSchemaForColors = IJSONSchema & { properties: { [name: string]: IJSONSchemaWithSnippets } }; +type IJSONSchemaForColors = IJSONSchema & { properties: { [name: string]: { oneOf: [IJSONSchemaWithSnippets, IJSONSchema] } } }; type IJSONSchemaWithSnippets = IJSONSchema & { defaultSnippets: IJSONSchemaSnippet[] }; class ColorRegistry implements IColorRegistry { @@ -147,7 +147,7 @@ class ColorRegistry implements IColorRegistry { for (const key of Object.keys(this.colorsById)) { const color = colorThemeData.getColor(key); if (color) { - this.colorSchema.properties[key].defaultSnippets[0].body = `\${1:${color.toString()}}`; + this.colorSchema.properties[key].oneOf[0].defaultSnippets[0].body = `\${1:${color.toString()}}`; } } this._onDidChangeSchema.fire(); From 3f6190e0303e0621c8d1427f40eebe49e2832afb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Jun 2024 18:15:46 +0200 Subject: [PATCH 103/755] fix #213984 (#214350) --- .../common/extensionsScannerService.ts | 2 +- .../node/extensionManagementService.ts | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index e92897f174f9e..e78d87f3c8bb5 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -888,7 +888,7 @@ class CachedExtensionsScanner extends ExtensionsScanner { const cacheContents = await this.readExtensionCache(cacheFile); this.input = input; if (cacheContents && cacheContents.input && ExtensionScannerInput.equals(cacheContents.input, this.input)) { - this.logService.debug('Using cached extensions scan result', input.location.toString()); + this.logService.debug('Using cached extensions scan result', input.type === ExtensionType.System ? 'system' : 'user', input.location.toString()); this.cacheValidatorThrottler.trigger(() => this.validateCache()); return cacheContents.result.map((extension) => { // revive URI object diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 0c13f71235c19..151189cbef954 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -492,6 +492,9 @@ export class ExtensionsScanner extends Disposable { private readonly _onExtract = this._register(new Emitter()); readonly onExtract = this._onExtract.event; + private scanAllExtensionPromise: Promise | undefined; + private scanUserExtensionsPromise: Promise | undefined; + constructor( private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @IFileService private readonly fileService: IFileService, @@ -512,12 +515,18 @@ export class ExtensionsScanner extends Disposable { async scanExtensions(type: ExtensionType | null, profileLocation: URI, productVersion: IProductVersion): Promise { try { - const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation, productVersion }; + const userScanOptions: ScanOptions = { includeInvalid: true, useCache: true, profileLocation, productVersion }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { - scannedExtensions.push(...await this.extensionsScannerService.scanAllExtensions({ includeInvalid: true }, userScanOptions, false)); + if (!this.scanAllExtensionPromise) { + this.scanAllExtensionPromise = this.extensionsScannerService.scanAllExtensions({ includeInvalid: true, useCache: true }, userScanOptions, false).finally(() => this.scanAllExtensionPromise = undefined); + } + scannedExtensions.push(...await this.scanAllExtensionPromise); } else if (type === ExtensionType.User) { - scannedExtensions.push(...await this.extensionsScannerService.scanUserExtensions(userScanOptions)); + if (!this.scanUserExtensionsPromise) { + this.scanUserExtensionsPromise = this.extensionsScannerService.scanUserExtensions(userScanOptions).finally(() => this.scanUserExtensionsPromise = undefined); + } + scannedExtensions.push(...await this.scanUserExtensionsPromise); } scannedExtensions = type !== null ? scannedExtensions.filter(r => r.type === type) : scannedExtensions; return await Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); From 46488eb08b707a952afe820c976d29050d264bff Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Wed, 5 Jun 2024 18:38:51 +0200 Subject: [PATCH 104/755] renames, test improvement (#214323) * renames, test improvement * code improvements --- src/vs/editor/browser/observableUtilities.ts | 4 +- .../components/diffEditorEditors.ts | 8 +- .../browser/inlineCompletionsController.ts | 4 +- .../browser/placeholderTextContribution.ts | 4 +- .../widget/observableCodeEditor.test.ts | 207 ++++++++---------- 5 files changed, 100 insertions(+), 127 deletions(-) diff --git a/src/vs/editor/browser/observableUtilities.ts b/src/vs/editor/browser/observableUtilities.ts index 22be6af0488ac..ed53dac2c2394 100644 --- a/src/vs/editor/browser/observableUtilities.ts +++ b/src/vs/editor/browser/observableUtilities.ts @@ -18,11 +18,11 @@ import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; /** * Returns a facade for the code editor that provides observables for various states/events. */ -export function obsCodeEditor(editor: ICodeEditor): ObservableCodeEditor { +export function observableCodeEditor(editor: ICodeEditor): ObservableCodeEditor { return ObservableCodeEditor.get(editor); } -class ObservableCodeEditor extends Disposable { +export class ObservableCodeEditor extends Disposable { private static _map = new Map(); /** diff --git a/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts b/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts index db99842d621eb..0169c380f04e2 100644 --- a/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts +++ b/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts @@ -8,7 +8,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IReader, autorunHandleChanges, derived, derivedOpts, observableFromEvent } from 'vs/base/common/observable'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { IDiffEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; -import { obsCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { observableCodeEditor } from 'vs/editor/browser/observableUtilities'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; import { IDiffCodeEditorWidgetOptions } from 'vs/editor/browser/widget/diffEditor/diffEditorWidget'; import { OverviewRulerFeature } from 'vs/editor/browser/widget/diffEditor/features/overviewRulerFeature'; @@ -30,15 +30,15 @@ export class DiffEditorEditors extends Disposable { public readonly modifiedScrollTop = observableFromEvent(this.modified.onDidScrollChange, () => /** @description modified.getScrollTop */ this.modified.getScrollTop()); public readonly modifiedScrollHeight = observableFromEvent(this.modified.onDidScrollChange, () => /** @description modified.getScrollHeight */ this.modified.getScrollHeight()); - public readonly modifiedModel = obsCodeEditor(this.modified).model; + public readonly modifiedModel = observableCodeEditor(this.modified).model; public readonly modifiedSelections = observableFromEvent(this.modified.onDidChangeCursorSelection, () => this.modified.getSelections() ?? []); public readonly modifiedCursor = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.modifiedSelections.read(reader)[0]?.getPosition() ?? new Position(1, 1)); public readonly originalCursor = observableFromEvent(this.original.onDidChangeCursorPosition, () => this.original.getPosition() ?? new Position(1, 1)); - public readonly isOriginalFocused = obsCodeEditor(this.original).isFocused; - public readonly isModifiedFocused = obsCodeEditor(this.modified).isFocused; + public readonly isOriginalFocused = observableCodeEditor(this.original).isFocused; + public readonly isModifiedFocused = observableCodeEditor(this.modified).isFocused; public readonly isFocused = derived(this, reader => this.isOriginalFocused.read(reader) || this.isModifiedFocused.read(reader)); diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts index 021849ea7da84..4fdd739ab4079 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts @@ -15,7 +15,7 @@ import { derivedObservableWithCache, mapObservableArrayCached } from 'vs/base/co import { isUndefined } from 'vs/base/common/types'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { obsCodeEditor, reactToChange, reactToChangeWithStore } from 'vs/editor/browser/observableUtilities'; +import { observableCodeEditor, reactToChange, reactToChangeWithStore } from 'vs/editor/browser/observableUtilities'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -44,7 +44,7 @@ export class InlineCompletionsController extends Disposable { return editor.getContribution(InlineCompletionsController.ID); } - private readonly _editorObs = obsCodeEditor(this.editor); + private readonly _editorObs = observableCodeEditor(this.editor); private readonly _positions = derived(this, reader => this._editorObs.positions.read(reader) ?? [new Position(1, 1)]); private readonly _suggestWidgetAdaptor = this._register(new SuggestWidgetAdaptor( diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts index 52c0edd1cb8c3..f8370994da9c4 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts @@ -9,7 +9,7 @@ import { derived, derivedOpts, observableValue } from 'vs/base/common/observable import 'vs/css!./placeholderText'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { obsCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { observableCodeEditor } from 'vs/editor/browser/observableUtilities'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration, InjectedTextCursorStops } from 'vs/editor/common/model'; @@ -20,7 +20,7 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo } public static readonly ID = 'editor.contrib.placeholderText'; - private readonly _editorObs = obsCodeEditor(this._editor); + private readonly _editorObs = observableCodeEditor(this._editor); private readonly _placeholderText = observableValue(this, undefined); diff --git a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts index dab175973fd89..313c561788c7f 100644 --- a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts +++ b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts @@ -8,7 +8,7 @@ import { DisposableStore } from "vs/base/common/lifecycle"; import { IObservable, derivedHandleChanges } from "vs/base/common/observable"; import { ensureNoDisposablesAreLeakedInTestSuite } from "vs/base/test/common/utils"; import { ICodeEditor } from "vs/editor/browser/editorBrowser"; -import { obsCodeEditor } from "vs/editor/browser/observableUtilities"; +import { ObservableCodeEditor, observableCodeEditor } from "vs/editor/browser/observableUtilities"; import { Position } from "vs/editor/common/core/position"; import { Range } from "vs/editor/common/core/range"; import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; @@ -18,12 +18,7 @@ suite("CodeEditorWidget", () => { ensureNoDisposablesAreLeakedInTestSuite(); function withTestFixture( - cb: (args: { - editor: ICodeEditor; - viewModel: ViewModel; - log: Log; - derived: IObservable; - }) => void + cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable; }) => void ) { withEditorSetupTestFixture(undefined, cb); } @@ -32,80 +27,37 @@ suite("CodeEditorWidget", () => { preSetupCallback: | ((editor: ICodeEditor, disposables: DisposableStore) => void) | undefined, - cb: (args: { - editor: ICodeEditor; - viewModel: ViewModel; - log: Log; - derived: IObservable; - }) => void + cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable; }) => void ) { withTestCodeEditor("hello world", {}, (editor, viewModel) => { const disposables = new DisposableStore(); - preSetupCallback?.(editor, disposables); - - const obsEditor = obsCodeEditor(editor); - + const obsEditor = observableCodeEditor(editor); const log = new Log(); - function observableName(obs: IObservable): string { - switch (obs) { - case obsEditor.selections: - return "editor.selections"; - case obsEditor.versionId: - return "editor.versionId"; - case obsEditor.onDidType: - return "editor.onDidType"; - default: - return "unknown"; - } - } - const derived = derivedHandleChanges( { createEmptyChangeSummary: () => undefined, - handleChange: (context, changeSummary) => { - const formattedChange = JSON.stringify( - context.change, - (key, value) => { - if (value instanceof Range) { - return value.toString(); - } - if ( - value === false || - (Array.isArray(value) && value.length === 0) - ) { - return undefined; - } - return value; - } - ); - log.log( - `handle change ${observableName( - context.changedObservable - )} ${formattedChange}` - ); + handleChange: (context) => { + const obsName = observableName(context.changedObservable, obsEditor); + log.log(`handle change: ${obsName} ${formatChange(context.change)}`); return true; }, }, (reader) => { const versionId = obsEditor.versionId.read(reader); - const selection = obsEditor.selections - .read(reader) - ?.map((s) => s.toString()) - .join(", "); + const selection = obsEditor.selections.read(reader)?.map((s) => s.toString()).join(", "); obsEditor.onDidType.read(reader); - const str = `running derived -> selection: ${selection}, value: ${versionId}`; + const str = `running derived: selection: ${selection}, value: ${versionId}`; log.log(str); return str; } ); derived.recomputeInitiallyAndOnChange(disposables); - assert.deepStrictEqual(log.getAndClearEntries(), [ - "running derived -> selection: [1,1 -> 1,1], value: 1", + "running derived: selection: [1,1 -> 1,1], value: 1", ]); cb({ editor, viewModel, log, derived }); @@ -119,8 +71,8 @@ suite("CodeEditorWidget", () => { editor.setPosition(new Position(1, 2)); assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":1,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"api","reason":0}', - "running derived -> selection: [1,2 -> 1,2], value: 1", + 'handle change: editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":1,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"api","reason":0}', + "running derived: selection: [1,2 -> 1,2], value: 1", ]); })); @@ -129,12 +81,12 @@ suite("CodeEditorWidget", () => { editor.trigger("keyboard", "type", { text: "abc" }); assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change editor.onDidType "abc"', - 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', - 'handle change editor.versionId {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', - 'handle change editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', - 'handle change editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', - "running derived -> selection: [1,4 -> 1,4], value: 4", + 'handle change: editor.onDidType "abc"', + 'handle change: editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change: editor.versionId {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', + 'handle change: editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change: editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived: selection: [1,4 -> 1,4], value: 4", ]); })); @@ -143,34 +95,29 @@ suite("CodeEditorWidget", () => { editor.trigger("keyboard", "type", { text: "abc" }); assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change editor.onDidType "abc"', - 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', - 'handle change editor.versionId {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', - 'handle change editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', - 'handle change editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', - "running derived -> selection: [1,4 -> 1,4], value: 4", + 'handle change: editor.onDidType "abc"', + 'handle change: editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change: editor.versionId {"changes":[{"range":"[1,2 -> 1,2]","rangeLength":0,"text":"b","rangeOffset":1}],"eol":"\\n","versionId":3}', + 'handle change: editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"c","rangeOffset":2}],"eol":"\\n","versionId":4}', + 'handle change: editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived: selection: [1,4 -> 1,4], value: 4", ]); editor.setPosition(new Position(1, 5), "test"); assert.deepStrictEqual(log.getAndClearEntries(), [ - 'handle change editor.selections {"selection":"[1,5 -> 1,5]","modelVersionId":4,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":4,"source":"test","reason":0}', - "running derived -> selection: [1,5 -> 1,5], value: 4", + 'handle change: editor.selections {"selection":"[1,5 -> 1,5]","modelVersionId":4,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":4,"source":"test","reason":0}', + "running derived: selection: [1,5 -> 1,5], value: 4", ]); })); - test("listener interaction", () => { + test("listener interaction (unforced)", () => { let derived: IObservable; let log: Log; - let force = false; withEditorSetupTestFixture( (editor, disposables) => { disposables.add( editor.onDidChangeModelContent(() => { - if (force) { - log.log(">>> before forceUpdate"); - obsCodeEditor(editor).forceUpdate(); - } log.log(">>> before get"); derived.get(); log.log("<<< after get"); @@ -186,53 +133,48 @@ suite("CodeEditorWidget", () => { assert.deepStrictEqual(log.getAndClearEntries(), [ ">>> before get", "<<< after get", - 'handle change editor.onDidType "a"', - 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', - 'handle change editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":2,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', - "running derived -> selection: [1,2 -> 1,2], value: 2", - ]); - - editor.executeEdits(undefined, [ - { range: new Range(1, 1, 1, 1), text: "x" }, + 'handle change: editor.onDidType "a"', + 'handle change: editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change: editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":2,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived: selection: [1,2 -> 1,2], value: 2", ]); + } + ); + }); - assert.deepStrictEqual(log.getAndClearEntries(), [ - ">>> before get", - "<<< after get", - 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":3}', - 'handle change editor.selections {"selection":"[1,3 -> 1,3]","modelVersionId":3,"oldSelections":["[1,2 -> 1,2]"],"oldModelVersionId":3,"source":"modelChange","reason":2}', - "running derived -> selection: [1,3 -> 1,3], value: 3", - ]); + test("listener interaction ()", () => { + let derived: IObservable; + let log: Log; + withEditorSetupTestFixture( + (editor, disposables) => { + disposables.add( + editor.onDidChangeModelContent(() => { + log.log(">>> before forceUpdate"); + observableCodeEditor(editor).forceUpdate(); - force = true; + log.log(">>> before get"); + derived.get(); + log.log("<<< after get"); + }) + ); + }, + (args) => { + const editor = args.editor; + derived = args.derived; + log = args.log; editor.trigger("keyboard", "type", { text: "a" }); assert.deepStrictEqual(log.getAndClearEntries(), [ ">>> before forceUpdate", ">>> before get", - "handle change editor.versionId undefined", - "running derived -> selection: [1,4 -> 1,4], value: 4", + "handle change: editor.versionId undefined", + "running derived: selection: [1,2 -> 1,2], value: 2", "<<< after get", - 'handle change editor.onDidType "a"', - 'handle change editor.versionId {"changes":[{"range":"[1,3 -> 1,3]","rangeLength":0,"text":"a","rangeOffset":2}],"eol":"\\n","versionId":4}', - 'handle change editor.selections {"selection":"[1,4 -> 1,4]","modelVersionId":4,"oldSelections":["[1,3 -> 1,3]"],"oldModelVersionId":3,"source":"keyboard","reason":0}', - "running derived -> selection: [1,4 -> 1,4], value: 4", - ]); - - editor.executeEdits(undefined, [ - { range: new Range(1, 1, 1, 1), text: "x" }, - ]); - - assert.deepStrictEqual(log.getAndClearEntries(), [ - ">>> before forceUpdate", - ">>> before get", - "handle change editor.versionId undefined", - "running derived -> selection: [1,5 -> 1,5], value: 5", - "<<< after get", - 'handle change editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"x","rangeOffset":0}],"eol":"\\n","versionId":5}', - 'handle change editor.selections {"selection":"[1,5 -> 1,5]","modelVersionId":5,"oldSelections":["[1,4 -> 1,4]"],"oldModelVersionId":5,"source":"modelChange","reason":2}', - "running derived -> selection: [1,5 -> 1,5], value: 5", + 'handle change: editor.onDidType "a"', + 'handle change: editor.versionId {"changes":[{"range":"[1,1 -> 1,1]","rangeLength":0,"text":"a","rangeOffset":0}],"eol":"\\n","versionId":2}', + 'handle change: editor.selections {"selection":"[1,2 -> 1,2]","modelVersionId":2,"oldSelections":["[1,1 -> 1,1]"],"oldModelVersionId":1,"source":"keyboard","reason":0}', + "running derived: selection: [1,2 -> 1,2], value: 2", ]); } ); @@ -251,3 +193,34 @@ class Log { return entries; } } + +function formatChange(change: unknown) { + return JSON.stringify( + change, + (key, value) => { + if (value instanceof Range) { + return value.toString(); + } + if ( + value === false || + (Array.isArray(value) && value.length === 0) + ) { + return undefined; + } + return value; + } + ); +} + +function observableName(obs: IObservable, obsEditor: ObservableCodeEditor): string { + switch (obs) { + case obsEditor.selections: + return "editor.selections"; + case obsEditor.versionId: + return "editor.versionId"; + case obsEditor.onDidType: + return "editor.onDidType"; + default: + return "unknown"; + } +} From 88e3cecadcdad05b3c1979075d65db469531451e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 5 Jun 2024 18:59:18 +0200 Subject: [PATCH 105/755] debt: remove scanning added extension and just convert it (#214354) --- .../remote/common/remoteExtensionsScanner.ts | 2 -- src/vs/server/node/remoteExtensionsScanner.ts | 31 ------------------- .../extensions/browser/extensionService.ts | 15 +-------- .../common/abstractExtensionService.ts | 5 ++- .../services/extensions/common/extensions.ts | 6 ++-- .../cachedExtensionScanner.ts | 9 +----- .../nativeExtensionService.ts | 10 +----- .../remote/common/remoteExtensionsScanner.ts | 19 ------------ .../test/browser/workbenchTestServices.ts | 1 - 9 files changed, 9 insertions(+), 89 deletions(-) diff --git a/src/vs/platform/remote/common/remoteExtensionsScanner.ts b/src/vs/platform/remote/common/remoteExtensionsScanner.ts index 792c0352bb781..a26de9d171ba6 100644 --- a/src/vs/platform/remote/common/remoteExtensionsScanner.ts +++ b/src/vs/platform/remote/common/remoteExtensionsScanner.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { URI } from 'vs/base/common/uri'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -16,5 +15,4 @@ export interface IRemoteExtensionsScannerService { whenExtensionsReady(): Promise; scanExtensions(): Promise; - scanSingleExtension(extensionLocation: URI, isBuiltin: boolean): Promise; } diff --git a/src/vs/server/node/remoteExtensionsScanner.ts b/src/vs/server/node/remoteExtensionsScanner.ts index 19a50f7b067ff..7b58140ea1b6f 100644 --- a/src/vs/server/node/remoteExtensionsScanner.ts +++ b/src/vs/server/node/remoteExtensionsScanner.ts @@ -103,26 +103,6 @@ export class RemoteExtensionsScannerService implements IRemoteExtensionsScannerS return extensions; } - async scanSingleExtension(extensionLocation: URI, isBuiltin: boolean, language?: string): Promise { - await this._whenBuiltinExtensionsReady; - - const extensionPath = extensionLocation.scheme === Schemas.file ? extensionLocation.fsPath : null; - - if (!extensionPath) { - return null; - } - - const extension = await this._scanSingleExtension(extensionPath, isBuiltin, language ?? platform.language); - - if (!extension) { - return null; - } - - this._massageWhenConditions([extension]); - - return extension; - } - private async _scanExtensions(profileLocation: URI, language: string, workspaceInstalledExtensionLocations: URI[] | undefined, extensionDevelopmentPath: string[] | undefined, languagePackId: string | undefined): Promise { await this._ensureLanguagePackIsInstalled(language, languagePackId); @@ -168,13 +148,6 @@ export class RemoteExtensionsScannerService implements IRemoteExtensionsScannerS return scannedExtensions.map(e => toExtensionDescription(e, false)); } - private async _scanSingleExtension(extensionPath: string, isBuiltin: boolean, language: string): Promise { - const extensionLocation = URI.file(resolve(extensionPath)); - const type = isBuiltin ? ExtensionType.System : ExtensionType.User; - const scannedExtension = await this._extensionsScannerService.scanExistingExtension(extensionLocation, type, { language }); - return scannedExtension ? toExtensionDescription(scannedExtension, false) : null; - } - private async _ensureLanguagePackIsInstalled(language: string, languagePackId: string | undefined): Promise { if ( // No need to install language packs for the default language @@ -351,10 +324,6 @@ export class RemoteExtensionsScannerChannel implements IServerChannel { ); return extensions.map(extension => transformOutgoingURIs(extension, uriTransformer)); } - case 'scanSingleExtension': { - const extension = await this.service.scanSingleExtension(URI.revive(uriTransformer.transformIncoming(args[0])), args[1], args[2]); - return extension ? transformOutgoingURIs(extension, uriTransformer) : null; - } } throw new Error('Invalid call'); } diff --git a/src/vs/workbench/services/extensions/browser/extensionService.ts b/src/vs/workbench/services/extensions/browser/extensionService.ts index 1611fb028703f..a5596ccb66c33 100644 --- a/src/vs/workbench/services/extensions/browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/browser/extensionService.ts @@ -8,7 +8,7 @@ import { Schemas } from 'vs/base/common/network'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { ExtensionKind } from 'vs/platform/environment/common/environment'; -import { ExtensionIdentifier, ExtensionType, IExtension, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -111,19 +111,6 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._initFetchFileSystem(); } - protected async _scanSingleExtension(extension: IExtension): Promise { - if (extension.location.scheme === Schemas.vscodeRemote) { - return this._remoteExtensionsScannerService.scanSingleExtension(extension.location, extension.type === ExtensionType.System); - } - - const scannedExtension = await this._webExtensionsScannerService.scanExistingExtension(extension.location, extension.type, this._userDataProfileService.currentProfile.extensionsResource); - if (scannedExtension) { - return toExtensionDescription(scannedExtension); - } - - return null; - } - private _initFetchFileSystem(): void { const provider = new FetchFileSystemProvider(); this._register(this._fileService.registerProvider(Schemas.http, provider)); diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index d63057ed48fa8..f3a62aa35dc96 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -45,7 +45,7 @@ import { IResolveAuthorityErrorResult } from 'vs/workbench/services/extensions/c import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { ExtensionRunningLocation, LocalProcessRunningLocation, LocalWebWorkerRunningLocation, RemoteRunningLocation } from 'vs/workbench/services/extensions/common/extensionRunningLocation'; import { ExtensionRunningLocationTracker, filterExtensionIdentifiers } from 'vs/workbench/services/extensions/common/extensionRunningLocationTracker'; -import { ActivationKind, ActivationTimes, ExtensionActivationReason, ExtensionHostStartup, ExtensionPointContribution, IExtensionHost, IExtensionService, IExtensionsStatus, IInternalExtensionService, IMessage, IResponsiveStateChangeEvent, IWillActivateEvent, WillStopExtensionHostsEvent, toExtension } from 'vs/workbench/services/extensions/common/extensions'; +import { ActivationKind, ActivationTimes, ExtensionActivationReason, ExtensionHostStartup, ExtensionPointContribution, IExtensionHost, IExtensionService, IExtensionsStatus, IInternalExtensionService, IMessage, IResponsiveStateChangeEvent, IWillActivateEvent, WillStopExtensionHostsEvent, toExtension, toExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionsProposedApi } from 'vs/workbench/services/extensions/common/extensionsProposedApi'; import { ExtensionMessageCollector, ExtensionPoint, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { LazyCreateExtensionHostManager } from 'vs/workbench/services/extensions/common/lazyCreateExtensionHostManager'; @@ -269,7 +269,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx for (let i = 0, len = _toAdd.length; i < len; i++) { const extension = _toAdd[i]; - const extensionDescription = await this._scanSingleExtension(extension); + const extensionDescription = toExtensionDescription(extension, false); if (!extensionDescription) { // could not scan extension... continue; @@ -1170,7 +1170,6 @@ export abstract class AbstractExtensionService extends Disposable implements IEx //#endregion protected abstract _resolveExtensions(): Promise; - protected abstract _scanSingleExtension(extension: IExtension): Promise; protected abstract _onExtensionHostExit(code: number): void; protected abstract _resolveAuthority(remoteAuthority: string): Promise; } diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index d5cd7e0d28e79..f04ac45227506 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -556,16 +556,18 @@ export function toExtension(extensionDescription: IExtensionDescription): IExten } export function toExtensionDescription(extension: IExtension, isUnderDevelopment?: boolean): IExtensionDescription { + const id = getExtensionId(extension.manifest.publisher, extension.manifest.name); return { - identifier: new ExtensionIdentifier(getExtensionId(extension.manifest.publisher, extension.manifest.name)), + id, + identifier: new ExtensionIdentifier(id), isBuiltin: extension.type === ExtensionType.System, isUserBuiltin: extension.type === ExtensionType.User && extension.isBuiltin, isUnderDevelopment: !!isUnderDevelopment, extensionLocation: extension.location, - ...extension.manifest, uuid: extension.identifier.uuid, targetPlatform: extension.targetPlatform, publisherDisplayName: extension.publisherDisplayName, + ...extension.manifest, }; } diff --git a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts index 681138c04815f..aaf716dc2bc66 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts @@ -3,10 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as path from 'vs/base/common/path'; import * as platform from 'vs/base/common/platform'; -import { URI } from 'vs/base/common/uri'; -import { IExtensionDescription, ExtensionType, IExtension } from 'vs/platform/extensions/common/extensions'; +import { IExtensionDescription, IExtension } from 'vs/platform/extensions/common/extensions'; import { dedupExtensions } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IExtensionsScannerService, IScannedExtension, toExtensionDescription as toExtensionDescriptionFromScannedExtension } from 'vs/platform/extensionManagement/common/extensionsScannerService'; import { ILogService } from 'vs/platform/log/common/log'; @@ -42,11 +40,6 @@ export class CachedExtensionScanner { }); } - public async scanSingleExtension(extensionPath: string, isBuiltin: boolean): Promise { - const scannedExtension = await this._extensionsScannerService.scanExistingExtension(URI.file(path.resolve(extensionPath)), isBuiltin ? ExtensionType.System : ExtensionType.User, { language: platform.language }); - return scannedExtension ? toExtensionDescriptionFromScannedExtension(scannedExtension, false) : null; - } - public async startScanningExtensions(): Promise { try { const extensions = await this._scanInstalledExtensions(); diff --git a/src/vs/workbench/services/extensions/electron-sandbox/nativeExtensionService.ts b/src/vs/workbench/services/extensions/electron-sandbox/nativeExtensionService.ts index cdd507e6fffbb..b7b77b23e0ed6 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/nativeExtensionService.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/nativeExtensionService.ts @@ -19,7 +19,7 @@ import { ConfigurationScope } from 'vs/platform/configuration/common/configurati import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionIdentifier, ExtensionType, IExtension, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; @@ -141,14 +141,6 @@ export class NativeExtensionService extends AbstractExtensionService implements }); } - protected _scanSingleExtension(extension: IExtension): Promise { - if (extension.location.scheme === Schemas.vscodeRemote) { - return this._remoteExtensionsScannerService.scanSingleExtension(extension.location, extension.type === ExtensionType.System); - } - - return this._extensionScanner.scanSingleExtension(extension.location.fsPath, extension.type === ExtensionType.System); - } - private async _scanAllLocalExtensions(): Promise { return this._extensionScanner.scannedExtensions; } diff --git a/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts b/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts index 89e2791637e6d..f1d2482908335 100644 --- a/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts +++ b/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts @@ -64,25 +64,6 @@ class RemoteExtensionsScannerService implements IRemoteExtensionsScannerService } } - async scanSingleExtension(extensionLocation: URI, isBuiltin: boolean): Promise { - try { - return await this.withChannel( - async (channel) => { - const extension = await channel.call('scanSingleExtension', [extensionLocation, isBuiltin, platform.language]); - if (extension !== null) { - extension.extensionLocation = URI.revive(extension.extensionLocation); - // ImplicitActivationEvents.updateManifest(extension); - } - return extension; - }, - null - ); - } catch (error) { - this.logService.error(error); - return null; - } - } - private withChannel(callback: (channel: IChannel) => Promise, fallback: R): Promise { const connection = this.remoteAgentService.getConnection(); if (!connection) { diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index bad005e50c6f9..5680778d5c8cd 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -2123,7 +2123,6 @@ export class TestRemoteExtensionsScannerService implements IRemoteExtensionsScan declare readonly _serviceBrand: undefined; async whenExtensionsReady(): Promise { } scanExtensions(): Promise { throw new Error('Method not implemented.'); } - scanSingleExtension(): Promise { throw new Error('Method not implemented.'); } } export class TestWorkbenchExtensionEnablementService implements IWorkbenchExtensionEnablementService { From 7cc8d36ec4f4b1f9a9c1e8a69a8fa6d5749e77c0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 5 Jun 2024 19:00:16 +0200 Subject: [PATCH 106/755] pass through the right options (#214355) --- src/vs/workbench/api/common/extHostLanguageModels.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/common/extHostLanguageModels.ts b/src/vs/workbench/api/common/extHostLanguageModels.ts index 8a3e7385453ef..908bfff357dd5 100644 --- a/src/vs/workbench/api/common/extHostLanguageModels.ts +++ b/src/vs/workbench/api/common/extHostLanguageModels.ts @@ -189,7 +189,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { }); } - async $provideLanguageModelResponse(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, token: CancellationToken): Promise { + async $provideLanguageModelResponse(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: vscode.LanguageModelChatRequestOptions, token: CancellationToken): Promise { const data = this._languageModels.get(handle); if (!data) { return; @@ -233,7 +233,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { return data.provider.provideLanguageModelResponse( messages.map(typeConvert.LanguageModelChatMessage.to), - options, + options?.modelOptions ?? {}, ExtensionIdentifier.toKey(from), progress2, token @@ -355,7 +355,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { } const requestId = (Math.random() * 1e6) | 0; - const requestPromise = this._proxy.$fetchResponse(from, languageModelId, requestId, internalMessages, options.modelOptions ?? {}, token); + const requestPromise = this._proxy.$fetchResponse(from, languageModelId, requestId, internalMessages, options, token); const barrier = new Barrier(); From 4eb1515a2d2d2281ad998a1bdbfc285da86d457d Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 5 Jun 2024 10:18:13 -0700 Subject: [PATCH 107/755] debug: dispose of event subscriptions (#214358) Refs #214234 --- .../api/common/extHostDebugService.ts | 22 ++++++++++--------- .../workbench/api/node/extHostDebugService.ts | 4 ++-- .../contrib/debug/browser/debugToolBar.ts | 6 ++--- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index d5ea2bdf817fa..a569ddcbc4e3c 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -7,6 +7,7 @@ import { asPromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { URI, UriComponents } from 'vs/base/common/uri'; +import { Disposable as DisposableCls, toDisposable } from 'vs/base/common/lifecycle'; import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ISignService } from 'vs/platform/sign/common/sign'; @@ -25,7 +26,6 @@ import { Dto } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import type * as vscode from 'vscode'; import { IExtHostConfiguration } from '../common/extHostConfiguration'; import { IExtHostVariableResolverProvider } from './extHostVariableResolverService'; -import { toDisposable } from 'vs/base/common/lifecycle'; import { ThemeIcon as ThemeIconUtils } from 'vs/base/common/themables'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import * as Convert from 'vs/workbench/api/common/extHostTypeConverters'; @@ -60,7 +60,7 @@ export interface IExtHostDebugService extends ExtHostDebugServiceShape { asDebugSourceUri(source: vscode.DebugProtocolSource, session?: vscode.DebugSession): vscode.Uri; } -export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDebugServiceShape { +export abstract class ExtHostDebugServiceBase extends DisposableCls implements IExtHostDebugService, ExtHostDebugServiceShape { readonly _serviceBrand: undefined; @@ -124,6 +124,8 @@ export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, E @IExtHostVariableResolverProvider private _variableResolver: IExtHostVariableResolverProvider, @IExtHostCommands private _commands: IExtHostCommands, ) { + super(); + this._configProviderHandleCounter = 0; this._configProviders = []; @@ -136,25 +138,25 @@ export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, E this._debugAdapters = new Map(); this._debugAdaptersTrackers = new Map(); - this._onDidStartDebugSession = new Emitter(); - this._onDidTerminateDebugSession = new Emitter(); - this._onDidChangeActiveDebugSession = new Emitter(); - this._onDidReceiveDebugSessionCustomEvent = new Emitter(); + this._onDidStartDebugSession = this._register(new Emitter()); + this._onDidTerminateDebugSession = this._register(new Emitter()); + this._onDidChangeActiveDebugSession = this._register(new Emitter()); + this._onDidReceiveDebugSessionCustomEvent = this._register(new Emitter()); this._debugServiceProxy = extHostRpcService.getProxy(MainContext.MainThreadDebugService); - this._onDidChangeBreakpoints = new Emitter(); + this._onDidChangeBreakpoints = this._register(new Emitter()); - this._onDidChangeActiveStackItem = new Emitter(); + this._onDidChangeActiveStackItem = this._register(new Emitter()); this._activeDebugConsole = new ExtHostDebugConsole(this._debugServiceProxy); this._breakpoints = new Map(); this._extensionService.getExtensionRegistry().then((extensionRegistry: ExtensionDescriptionRegistry) => { - extensionRegistry.onDidChange(_ => { + this._register(extensionRegistry.onDidChange(_ => { this.registerAllDebugTypes(extensionRegistry); - }); + })); this.registerAllDebugTypes(extensionRegistry); }); } diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index fd03fd9ea327d..f93076de1dfba 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -78,9 +78,9 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { if (!this._terminalDisposedListener) { // React on terminal disposed and check if that is the debug terminal #12956 - this._terminalDisposedListener = this._terminalService.onDidCloseTerminal(terminal => { + this._terminalDisposedListener = this._register(this._terminalService.onDidCloseTerminal(terminal => { this._integratedTerminalInstances.onTerminalClosed(terminal); - }); + })); } const configProvider = await this._configurationService.getConfigProvider(); diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index add88e75098ba..4bae5574e468c 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -10,7 +10,7 @@ import { Action, IAction, IRunEvent, WorkbenchActionExecutedClassification, Work import * as arrays from 'vs/base/common/arrays'; import { RunOnceScheduler } from 'vs/base/common/async'; import * as errors from 'vs/base/common/errors'; -import { DisposableStore, dispose, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, dispose, IDisposable, markAsSingleton, MutableDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/debugToolBar'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; @@ -401,7 +401,7 @@ const registerDebugToolBarItem = (id: string, title: string | ICommandActionTitl })); }; -MenuRegistry.onDidChangeMenu(e => { +markAsSingleton(MenuRegistry.onDidChangeMenu(e => { // In case the debug toolbar is docked we need to make sure that the docked toolbar has the up to date commands registered #115945 if (e.has(MenuId.DebugToolBar)) { dispose(debugViewTitleItems); @@ -413,7 +413,7 @@ MenuRegistry.onDidChangeMenu(e => { })); } } -}); +})); const CONTEXT_TOOLBAR_COMMAND_CENTER = ContextKeyExpr.equals('config.debug.toolBarLocation', 'commandCenter'); From d323b88923b58260da51b8bb8da731e6954ce84d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 5 Jun 2024 10:26:01 -0700 Subject: [PATCH 108/755] :notebook: re #200091. (#214357) --- .../browser/notebookExecutionService.test.ts | 28 +++++----- .../notebookExecutionStateService.test.ts | 55 ++++++++++--------- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts index 80d569a64e35a..09731c28e5d0e 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts @@ -11,7 +11,7 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; -import { assertThrowsAsync } from 'vs/base/test/common/utils'; +import { assertThrowsAsync, ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { IMenu, IMenuService } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -40,6 +40,8 @@ suite('NotebookExecutionService', () => { disposables.dispose(); }); + ensureNoDisposablesAreLeakedInTestSuite(); + setup(function () { disposables = new DisposableStore(); @@ -80,8 +82,8 @@ suite('NotebookExecutionService', () => { contextKeyService = instantiationService.get(IContextKeyService); }); - async function withTestNotebook(cells: [string, string, CellKind, IOutputDto[], NotebookCellMetadata][], callback: (viewModel: NotebookViewModel, textModel: NotebookTextModel) => void | Promise) { - return _withTestNotebook(cells, (editor, viewModel) => callback(viewModel, viewModel.notebookDocument)); + async function withTestNotebook(cells: [string, string, CellKind, IOutputDto[], NotebookCellMetadata][], callback: (viewModel: NotebookViewModel, textModel: NotebookTextModel, disposables: DisposableStore) => void | Promise) { + return _withTestNotebook(cells, (editor, viewModel, disposables) => callback(viewModel, viewModel.notebookDocument, disposables)); } // test('ctor', () => { @@ -94,7 +96,7 @@ suite('NotebookExecutionService', () => { test('cell is not runnable when no kernel is selected', async () => { await withTestNotebook( [], - async (viewModel, textModel) => { + async (viewModel, textModel, disposables) => { const executionService = instantiationService.createInstance(NotebookExecutionService); const cell = insertCellAtIndex(viewModel, 1, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); @@ -107,9 +109,9 @@ suite('NotebookExecutionService', () => { [], async (viewModel, textModel) => { - kernelService.registerKernel(new TestNotebookKernel({ languages: ['testlang'] })); - const executionService = instantiationService.createInstance(NotebookExecutionService); - const cell = insertCellAtIndex(viewModel, 1, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + disposables.add(kernelService.registerKernel(new TestNotebookKernel({ languages: ['testlang'] }))); + const executionService = disposables.add(instantiationService.createInstance(NotebookExecutionService)); + const cell = disposables.add(insertCellAtIndex(viewModel, 1, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); await assertThrowsAsync(async () => await executionService.executeNotebookCells(textModel, [cell.model], contextKeyService)); }); @@ -120,13 +122,13 @@ suite('NotebookExecutionService', () => { [], async (viewModel, textModel) => { const kernel = new TestNotebookKernel({ languages: ['javascript'] }); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, textModel); - const executionService = instantiationService.createInstance(NotebookExecutionService); + const executionService = disposables.add(instantiationService.createInstance(NotebookExecutionService)); const executeSpy = sinon.spy(); kernel.executeNotebookCellsRequest = executeSpy; - const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const cell = disposables.add(insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); await executionService.executeNotebookCells(viewModel.notebookDocument, [cell.model], contextKeyService); assert.strictEqual(executeSpy.calledOnce, true); }); @@ -148,12 +150,12 @@ suite('NotebookExecutionService', () => { } }; - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, textModel); - const executionService = instantiationService.createInstance(NotebookExecutionService); + const executionService = disposables.add(instantiationService.createInstance(NotebookExecutionService)); const exeStateService = instantiationService.get(INotebookExecutionStateService); - const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const cell = disposables.add(insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); await executionService.executeNotebookCells(textModel, [cell.model], contextKeyService); assert.strictEqual(didExecute, true); diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts index 906bbb53e457b..8dd95c484df6d 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts @@ -10,6 +10,7 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { IMenu, IMenuService } from 'vs/platform/actions/common/actions'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; @@ -38,6 +39,8 @@ suite('NotebookExecutionStateService', () => { disposables.dispose(); }); + ensureNoDisposablesAreLeakedInTestSuite(); + setup(function () { disposables = new DisposableStore(); @@ -69,12 +72,12 @@ suite('NotebookExecutionStateService', () => { instantiationService.set(INotebookExecutionStateService, disposables.add(instantiationService.createInstance(NotebookExecutionStateService))); }); - async function withTestNotebook(cells: [string, string, CellKind, IOutputDto[], NotebookCellMetadata][], callback: (viewModel: NotebookViewModel, textModel: NotebookTextModel) => void | Promise) { - return _withTestNotebook(cells, (editor, viewModel) => callback(viewModel, viewModel.notebookDocument)); + async function withTestNotebook(cells: [string, string, CellKind, IOutputDto[], NotebookCellMetadata][], callback: (viewModel: NotebookViewModel, textModel: NotebookTextModel, disposables: DisposableStore) => void | Promise) { + return _withTestNotebook(cells, (editor, viewModel) => callback(viewModel, viewModel.notebookDocument, disposables)); } function testCancelOnDelete(expectedCancels: number, implementsInterrupt: boolean) { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; let cancels = 0; @@ -91,15 +94,15 @@ suite('NotebookExecutionStateService', () => { cancels += handles.length; } }; - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); // Should cancel executing and pending cells, when kernel does not implement interrupt - const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); - const cell2 = insertCellAtIndex(viewModel, 1, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); - const cell3 = insertCellAtIndex(viewModel, 2, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const cell = disposables.add(insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); + const cell2 = disposables.add(insertCellAtIndex(viewModel, 1, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); + const cell3 = disposables.add(insertCellAtIndex(viewModel, 2, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); insertCellAtIndex(viewModel, 3, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); // Not deleted const exe = executionStateService.createCellExecution(viewModel.uri, cell.handle); // Executing exe.confirm(); @@ -126,11 +129,11 @@ suite('NotebookExecutionStateService', () => { }); test('fires onDidChangeCellExecution when cell is completed while deleted', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); @@ -153,15 +156,15 @@ suite('NotebookExecutionStateService', () => { }); test('does not fire onDidChangeCellExecution for output updates', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); - const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const cell = disposables.add(insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); const exe = executionStateService.createCellExecution(viewModel.uri, cell.handle); let didFire = false; @@ -181,15 +184,15 @@ suite('NotebookExecutionStateService', () => { // #142466 test('getCellExecution and onDidChangeCellExecution', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); - const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const cell = disposables.add(insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); const deferred = new DeferredPromise(); disposables.add(executionStateService.onDidChangeExecution(e => { @@ -213,11 +216,11 @@ suite('NotebookExecutionStateService', () => { }); }); test('getExecution and onDidChangeExecution', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const eventRaisedWithExecution: boolean[] = []; @@ -243,11 +246,11 @@ suite('NotebookExecutionStateService', () => { }); test('getExecution and onDidChangeExecution 2', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); @@ -283,15 +286,15 @@ suite('NotebookExecutionStateService', () => { }); test('force-cancel works for Cell Execution', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); - const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const cell = disposables.add(insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true)); executionStateService.createCellExecution(viewModel.uri, cell.handle); const exe = executionStateService.getCellExecution(cell.uri); assert.ok(exe); @@ -302,11 +305,11 @@ suite('NotebookExecutionStateService', () => { }); }); test('force-cancel works for Notebook Execution', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const eventRaisedWithExecution: boolean[] = []; @@ -324,11 +327,11 @@ suite('NotebookExecutionStateService', () => { }); }); test('force-cancel works for Cell and Notebook Execution', async function () { - return withTestNotebook([], async viewModel => { + return withTestNotebook([], async (viewModel, _document, disposables) => { testNotebookModel = viewModel.notebookDocument; const kernel = new TestNotebookKernel(); - kernelService.registerKernel(kernel); + disposables.add(kernelService.registerKernel(kernel)); kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); From 150a9ff40b778205f0c418c0039c322742a28f9d Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Wed, 5 Jun 2024 10:48:37 -0700 Subject: [PATCH 109/755] fix: attach listener to element (#214360) --- .../browser/emptyTextEditorHint/emptyTextEditorHint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index 37931a102eac6..3093ac9cbc68d 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -244,7 +244,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { const hintPart = $('a', undefined, fragment); hintPart.style.fontStyle = 'italic'; hintPart.style.cursor = 'pointer'; - this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, () => this._disableHint())); + this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CONTEXT_MENU, () => this._disableHint())); this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CLICK, handleClick)); return hintPart; } else { From 7cd1f1ce4e8ba91863fc9840530073813a0fd4df Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 5 Jun 2024 10:59:18 -0700 Subject: [PATCH 110/755] Fix #212234. Handle dispose state on layout (#214361) --- .../notebook/browser/viewModel/baseCellViewModel.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index f946c2142d999..f1c1ab7b7c8e2 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -258,7 +258,12 @@ export abstract class BaseCellViewModel extends Disposable { writeTransientState(editor.getModel(), this._editorTransientState, this._codeEditorService); } - this._textEditor?.changeDecorations((accessor) => { + if (this._isDisposed) { + // Restore View State could adjust the editor layout and trigger a list view update. The list view update might then dispose this view model. + return; + } + + editor.changeDecorations((accessor) => { this._resolvedDecorations.forEach((value, key) => { if (key.startsWith('_lazy_')) { // lazy ones @@ -272,7 +277,7 @@ export abstract class BaseCellViewModel extends Disposable { }); }); - this._editorListeners.push(this._textEditor.onDidChangeCursorSelection(() => { this._onDidChangeState.fire({ selectionChanged: true }); })); + this._editorListeners.push(editor.onDidChangeCursorSelection(() => { this._onDidChangeState.fire({ selectionChanged: true }); })); const inlineChatController = InlineChatController.get(this._textEditor); if (inlineChatController) { this._editorListeners.push(inlineChatController.onWillStartSession(() => { @@ -281,7 +286,7 @@ export abstract class BaseCellViewModel extends Disposable { } })); } - // this._editorListeners.push(this._textEditor.onKeyDown(e => this.handleKeyDown(e))); + this._onDidChangeState.fire({ selectionChanged: true }); this._onDidChangeEditorAttachState.fire(); } From 9111dec2727ee5cbeec3af174ed0747c37592eda Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Wed, 5 Jun 2024 20:49:43 +0200 Subject: [PATCH 111/755] Fix opening select boxes (#214348) * Fix opening select boxes This fixes a regression caused by #213465 Closes #214303 Closes #214345 * Fix another regression caused by #213465 --------- Co-authored-by: Benjamin Pasero --- src/vs/base/browser/ui/selectBox/selectBoxCustom.ts | 8 ++++---- src/vs/workbench/contrib/splash/browser/partsSplash.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 5351157185587..dba0132e89c45 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -609,8 +609,8 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi this._dropDownPosition = AnchorPosition.ABOVE; this.selectDropDownListContainer.remove(); this.selectionDetailsPane.remove(); - this.selectionDetailsPane.remove(); - this.selectDropDownListContainer.remove(); + this.selectDropDownContainer.appendChild(this.selectionDetailsPane); + this.selectDropDownContainer.appendChild(this.selectDropDownListContainer); this.selectionDetailsPane.classList.remove('border-top'); this.selectionDetailsPane.classList.add('border-bottom'); @@ -619,8 +619,8 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi this._dropDownPosition = AnchorPosition.BELOW; this.selectDropDownListContainer.remove(); this.selectionDetailsPane.remove(); - this.selectDropDownListContainer.remove(); - this.selectionDetailsPane.remove(); + this.selectDropDownContainer.appendChild(this.selectDropDownListContainer); + this.selectDropDownContainer.appendChild(this.selectionDetailsPane); this.selectionDetailsPane.classList.remove('border-bottom'); this.selectionDetailsPane.classList.add('border-top'); diff --git a/src/vs/workbench/contrib/splash/browser/partsSplash.ts b/src/vs/workbench/contrib/splash/browser/partsSplash.ts index ebbd9a5d51b61..8b2dd0dcdd1a7 100644 --- a/src/vs/workbench/contrib/splash/browser/partsSplash.ts +++ b/src/vs/workbench/contrib/splash/browser/partsSplash.ts @@ -110,6 +110,6 @@ export class PartsSplash { // remove initial colors const defaultStyles = mainWindow.document.head.getElementsByClassName('initialShellColors'); - defaultStyles?.[0].remove(); + defaultStyles[0]?.remove(); } } From 30159722f24540c2dc65c43e6733bc35351ca08b Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 5 Jun 2024 11:53:14 -0700 Subject: [PATCH 112/755] debug: fix some more workbench contribution leaks (#214366) Follows up on #214234 --- .../contrib/debug/browser/statusbarColorProvider.ts | 2 +- src/vs/workbench/contrib/debug/common/debugLifecycle.ts | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts index 4231608a29bba..1968c0ccdeb47 100644 --- a/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts +++ b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts @@ -86,7 +86,7 @@ export class StatusBarColorProvider implements IWorkbenchContribution { if (e.affectsConfiguration('debug.enableStatusBarColor') || e.affectsConfiguration('debug.toolBarLocation')) { this.update(); } - }, this.disposables); + }, undefined, this.disposables); this.update(); } diff --git a/src/vs/workbench/contrib/debug/common/debugLifecycle.ts b/src/vs/workbench/contrib/debug/common/debugLifecycle.ts index 838140a91d09e..684209657352a 100644 --- a/src/vs/workbench/contrib/debug/common/debugLifecycle.ts +++ b/src/vs/workbench/contrib/debug/common/debugLifecycle.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { IDisposable } from 'vs/base/common/lifecycle'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; @@ -11,13 +12,15 @@ import { IDebugConfiguration, IDebugService } from 'vs/workbench/contrib/debug/c import { ILifecycleService, ShutdownReason } from 'vs/workbench/services/lifecycle/common/lifecycle'; export class DebugLifecycle implements IWorkbenchContribution { + private disposable: IDisposable; + constructor( @ILifecycleService lifecycleService: ILifecycleService, @IDebugService private readonly debugService: IDebugService, @IConfigurationService private readonly configurationService: IConfigurationService, @IDialogService private readonly dialogService: IDialogService, ) { - lifecycleService.onBeforeShutdown(async e => e.veto(this.shouldVetoShutdown(e.reason), 'veto.debug')); + this.disposable = lifecycleService.onBeforeShutdown(async e => e.veto(this.shouldVetoShutdown(e.reason), 'veto.debug')); } private shouldVetoShutdown(_reason: ShutdownReason): boolean | Promise { @@ -34,6 +37,10 @@ export class DebugLifecycle implements IWorkbenchContribution { return this.showWindowCloseConfirmation(rootSessions.length); } + public dispose() { + return this.disposable.dispose(); + } + private async showWindowCloseConfirmation(numSessions: number): Promise { let message: string; if (numSessions === 1) { From e130ab25c4844ea72ba0dbdf5bd6a1d78177ca77 Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:55:38 +0000 Subject: [PATCH 113/755] better lightbulb render scenarios (#213863) * better lightbulb scenario for when we are very close to edge * fix and change logic for last line * clean up whitespace * helper func, check whitespace * remove extra model check * add new logic for when blocked above and below * remove whitespace --- .../codeAction/browser/lightBulbWidget.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts index 94518efd41557..bd391744ab306 100644 --- a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts @@ -173,8 +173,27 @@ export class LightBulbWidget extends Disposable implements IContentWidget { let effectiveLineNumber = lineNumber; let effectiveColumnNumber = 1; if (!lineHasSpace) { + + // Checks if line is empty or starts with any amount of whitespace + const isLineEmptyOrIndented = (lineNumber: number): boolean => { + const lineContent = model.getLineContent(lineNumber); + return /^\s*$|^\s+/.test(lineContent) || lineContent.length <= effectiveColumnNumber; + }; + if (lineNumber > 1 && !isFolded(lineNumber - 1)) { - effectiveLineNumber -= 1; + const lineCount = model.getLineCount(); + const endLine = lineNumber === lineCount; + const prevLineEmptyOrIndented = lineNumber > 1 && isLineEmptyOrIndented(lineNumber - 1); + const nextLineEmptyOrIndented = !endLine && isLineEmptyOrIndented(lineNumber + 1); + const currLineEmptyOrIndented = isLineEmptyOrIndented(lineNumber); + const notEmpty = !nextLineEmptyOrIndented && !prevLineEmptyOrIndented; + + // check above and below. if both are blocked, display lightbulb below. + if (prevLineEmptyOrIndented || endLine || (notEmpty && !currLineEmptyOrIndented)) { + effectiveLineNumber -= 1; + } else if (nextLineEmptyOrIndented || (notEmpty && currLineEmptyOrIndented)) { + effectiveLineNumber += 1; + } } else if ((lineNumber < model.getLineCount()) && !isFolded(lineNumber + 1)) { effectiveLineNumber += 1; } else if (column * fontInfo.spaceWidth < 22) { From 0cfbf2393f3fd89c4669680c6775f42d36f97798 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 5 Jun 2024 22:26:59 +0200 Subject: [PATCH 114/755] disable SemanticTokensProviderStyling trace (#214346) --- .../common/services/semanticTokensProviderStyling.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/services/semanticTokensProviderStyling.ts b/src/vs/editor/common/services/semanticTokensProviderStyling.ts index f248e0e23c2b9..1bb2e0d6ed15f 100644 --- a/src/vs/editor/common/services/semanticTokensProviderStyling.ts +++ b/src/vs/editor/common/services/semanticTokensProviderStyling.ts @@ -14,6 +14,8 @@ const enum SemanticTokensProviderStylingConstants { NO_STYLING = 0b01111111111111111111111111111111 } +const ENABLE_TRACE = false; + export class SemanticTokensProviderStyling { private readonly _hashTable: HashTable; @@ -36,7 +38,7 @@ export class SemanticTokensProviderStyling { let metadata: number; if (entry) { metadata = entry.metadata; - if (this._logService.getLevel() === LogLevel.Trace) { + if (ENABLE_TRACE && this._logService.getLevel() === LogLevel.Trace) { this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${tokenTypeIndex} / ${tokenModifierSet}: foreground ${TokenMetadata.getForeground(metadata)}, fontStyle ${TokenMetadata.getFontStyle(metadata).toString(2)}`); } } else { @@ -50,7 +52,7 @@ export class SemanticTokensProviderStyling { } modifierSet = modifierSet >> 1; } - if (modifierSet > 0 && this._logService.getLevel() === LogLevel.Trace) { + if (ENABLE_TRACE && modifierSet > 0 && this._logService.getLevel() === LogLevel.Trace) { this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${tokenModifierSet.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`); tokenModifiers.push('not-in-legend'); } @@ -86,7 +88,7 @@ export class SemanticTokensProviderStyling { } } } else { - if (this._logService.getLevel() === LogLevel.Trace) { + if (ENABLE_TRACE && this._logService.getLevel() === LogLevel.Trace) { this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${tokenTypeIndex} for legend: ${JSON.stringify(this._legend.tokenTypes)}`); } metadata = SemanticTokensProviderStylingConstants.NO_STYLING; @@ -94,7 +96,7 @@ export class SemanticTokensProviderStyling { } this._hashTable.add(tokenTypeIndex, tokenModifierSet, encodedLanguageId, metadata); - if (this._logService.getLevel() === LogLevel.Trace) { + if (ENABLE_TRACE && this._logService.getLevel() === LogLevel.Trace) { this._logService.trace(`SemanticTokensProviderStyling ${tokenTypeIndex} (${tokenType}) / ${tokenModifierSet} (${tokenModifiers.join(' ')}): foreground ${TokenMetadata.getForeground(metadata)}, fontStyle ${TokenMetadata.getFontStyle(metadata).toString(2)}`); } } From 1bf95e5501f25debb2b75e14efe3f594fa360113 Mon Sep 17 00:00:00 2001 From: Andrea Mah <31675041+andreamah@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:11:40 -0700 Subject: [PATCH 115/755] add more specific criteria for filesearchprovider's pattern (#214370) --- src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts b/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts index bf7bc5ecba37f..8dcfd99852b5a 100644 --- a/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts @@ -13,6 +13,12 @@ declare module 'vscode' { export interface FileSearchQuery { /** * The search pattern to match against file paths. + * To be correctly interpreted by Quick Open, this is interpreted in a relaxed way. The picker will apply its own highlighting and scoring on the results. + * + * Tips for matching in Quick Open: + * With the pattern, the picker will use the file name and file paths to score each entry. The score will determine the ordering and filtering. + * The scoring prioritizes prefix and substring matching. Then, it checks and it checks whether the pattern's letters appear in the same order as in the target (file name and path). + * If a file does not match at all using our criteria, it will be omitted from Quick Open. */ pattern: string; } From 4140e350561c17a84f5f7574640027e8659ac951 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Wed, 5 Jun 2024 15:24:54 -0700 Subject: [PATCH 116/755] Update token used for running locker workflow (#214378) --- .github/workflows/locker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index cc6e89aa6da11..ef775ce8fdfb7 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -20,6 +20,7 @@ jobs: - name: Run Locker uses: ./actions/locker with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} daysSinceClose: 45 daysSinceUpdate: 3 ignoredLabel: "*out-of-scope,accessibility" From d956f3bfe22a93c6dfc7e998611f480d7deaabe4 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 5 Jun 2024 15:25:20 -0700 Subject: [PATCH 117/755] Fix typo on config inputs error (#214377) --- .../browser/baseConfigurationResolverService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService.ts b/src/vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService.ts index de7b63c75a081..a7c716da65d8c 100644 --- a/src/vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService.ts @@ -285,7 +285,7 @@ export abstract class BaseConfigurationResolverService extends AbstractVariableR private showUserInput(variable: string, inputInfos: ConfiguredInput[]): Promise { if (!inputInfos) { - return Promise.reject(new Error(nls.localize('inputVariable.noInputSection', "Variable '{0}' must be defined in an '{1}' section of the debug or task configuration.", variable, 'input'))); + return Promise.reject(new Error(nls.localize('inputVariable.noInputSection', "Variable '{0}' must be defined in an '{1}' section of the debug or task configuration.", variable, 'inputs'))); } // find info for the given input variable From 8cca7892e1b95678da031c74af0c5cc0c51dd821 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 5 Jun 2024 15:59:14 -0700 Subject: [PATCH 118/755] Fix chat panel followups overflowing (#214383) --- src/vs/workbench/contrib/chat/browser/chatInputPart.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index 961472ae70ca4..5fa1417f4c092 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -530,7 +530,8 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge const inputEditorHeight = Math.min(data.inputPartEditorHeight, height - data.followupsHeight - data.inputPartVerticalPadding); - this.followupsContainer.style.width = `${width}px`; + const followupsWidth = width - data.inputPartHorizontalPadding; + this.followupsContainer.style.width = `${followupsWidth}px`; this._inputPartHeight = data.followupsHeight + inputEditorHeight + data.inputPartVerticalPadding + data.inputEditorBorder + data.implicitContextHeight; From 5f646b8e67a869ef33061085ffe0e377d5ba040c Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:14:44 +0000 Subject: [PATCH 119/755] remove background from lightbulb widget (#214375) remove background from widget: --- src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css index ea05c8574b737..cbadb2348ef61 100644 --- a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css +++ b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css @@ -41,6 +41,5 @@ width: 100%; height: 100%; opacity: 0.3; - background-color: var(--vscode-editor-background); z-index: 1; } From b304df66db97f152517075a60deb866e52a15ee4 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Thu, 6 Jun 2024 09:22:05 +0200 Subject: [PATCH 120/755] Refactoring the `contentHoverController` file (#214325) * refactoring content hover controller file * polishing the code --- .../hover/browser/contentHoverController.ts | 234 +++++++++--------- 1 file changed, 120 insertions(+), 114 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index a39e8b7921d2c..1223c0d2efd0f 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -31,7 +31,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { private _colorWidget: IEditorHoverColorPickerWidget | null = null; private readonly _computer: ContentHoverComputer; - private readonly _widget: ContentHoverWidget; + private readonly _contentHoverWidget: ContentHoverWidget; private readonly _participants: IEditorHoverParticipant[]; // TODO@aiday-mar make array of participants, dispatch between them private readonly _markdownHoverParticipant: MarkdownHoverParticipant | undefined; @@ -46,7 +46,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { @IKeybindingService private readonly _keybindingService: IKeybindingService, ) { super(); - this._widget = this._register(this._instantiationService.createInstance(ContentHoverWidget, this._editor)); + this._contentHoverWidget = this._register(this._instantiationService.createInstance(ContentHoverWidget, this._editor)); const initializedParticipants = this._initializeHoverParticipants(); this._participants = initializedParticipants.participants; this._markdownHoverParticipant = initializedParticipants.markdownHoverParticipant; @@ -78,13 +78,13 @@ export class ContentHoverController extends Disposable implements IHoverWidget { const messages = (result.hasLoadingMessage ? this._addLoadingMessage(result.value) : result.value); this._withResult(new HoverResult(this._computer.anchor, messages, result.isComplete)); })); - this._register(dom.addStandardDisposableListener(this._widget.getDomNode(), 'keydown', (e) => { + this._register(dom.addStandardDisposableListener(this._contentHoverWidget.getDomNode(), 'keydown', (e) => { if (e.equals(KeyCode.Escape)) { this.hide(); } })); this._register(TokenizationRegistry.onDidChange(() => { - if (this._widget.position && this._currentResult) { + if (this._contentHoverWidget.position && this._currentResult) { this._setCurrentResult(this._currentResult); // render again } })); @@ -100,61 +100,52 @@ export class ContentHoverController extends Disposable implements IHoverWidget { focus: boolean, mouseEvent: IEditorMouseEvent | null ): boolean { - - if (!this._widget.position || !this._currentResult) { - // The hover is not visible + const contentHoverIsVisible = this._contentHoverWidget.position && this._currentResult; + if (!contentHoverIsVisible) { if (anchor) { this._startHoverOperationIfNecessary(anchor, mode, source, focus, false); return true; } return false; } - - // The hover is currently visible const isHoverSticky = this._editor.getOption(EditorOption.hover).sticky; - const isGettingCloser = ( - isHoverSticky - && mouseEvent - && this._widget.isMouseGettingCloser(mouseEvent.event.posx, mouseEvent.event.posy) - ); - - if (isGettingCloser) { - // The mouse is getting closer to the hover, so we will keep the hover untouched - // But we will kick off a hover update at the new anchor, insisting on keeping the hover visible. + const isMouseGettingCloser = mouseEvent && this._contentHoverWidget.isMouseGettingCloser(mouseEvent.event.posx, mouseEvent.event.posy); + const isHoverStickyAndIsMouseGettingCloser = isHoverSticky && isMouseGettingCloser; + // The mouse is getting closer to the hover, so we will keep the hover untouched + // But we will kick off a hover update at the new anchor, insisting on keeping the hover visible. + if (isHoverStickyAndIsMouseGettingCloser) { if (anchor) { this._startHoverOperationIfNecessary(anchor, mode, source, focus, true); } return true; } - + // If mouse is not getting closer and anchor not defined, hide the hover if (!anchor) { this._setCurrentResult(null); return false; } - - if (anchor && this._currentResult.anchor.equals(anchor)) { - // The widget is currently showing results for the exact same anchor, so no update is needed + // If mouse if not getting closer and anchor is defined, and the new anchor is the same as the previous anchor + const currentAnchorEqualsPreviousAnchor = this._currentResult!.anchor.equals(anchor); + if (currentAnchorEqualsPreviousAnchor) { return true; } - - if (!anchor.canAdoptVisibleHover(this._currentResult.anchor, this._widget.position)) { - // The new anchor is not compatible with the previous anchor + // If mouse if not getting closer and anchor is defined, and the new anchor is not compatible with the previous anchor + const currentAnchorCompatibleWithPreviousAnchor = anchor.canAdoptVisibleHover(this._currentResult!.anchor, this._contentHoverWidget.position); + if (!currentAnchorCompatibleWithPreviousAnchor) { this._setCurrentResult(null); this._startHoverOperationIfNecessary(anchor, mode, source, focus, false); return true; } - // We aren't getting any closer to the hover, so we will filter existing results // and keep those which also apply to the new anchor. - this._setCurrentResult(this._currentResult.filter(anchor)); + this._setCurrentResult(this._currentResult!.filter(anchor)); this._startHoverOperationIfNecessary(anchor, mode, source, focus, false); return true; } private _startHoverOperationIfNecessary(anchor: HoverAnchor, mode: HoverStartMode, source: HoverStartSource, focus: boolean, insistOnKeepingHoverVisible: boolean): void { - - if (this._computer.anchor && this._computer.anchor.equals(anchor)) { - // We have to start a hover operation at the exact same anchor as before, so no work is needed + const currentAnchorEqualToPreviousHover = this._computer.anchor && this._computer.anchor.equals(anchor); + if (currentAnchorEqualToPreviousHover) { return; } this._hoverOperation.cancel(); @@ -166,56 +157,62 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } private _setCurrentResult(hoverResult: HoverResult | null): void { - - if (this._currentResult === hoverResult) { - // avoid updating the DOM to avoid resetting the user selection + let currentHoverResult = hoverResult; + const currentResultEqualToPreviousResult = this._currentResult === currentHoverResult; + if (currentResultEqualToPreviousResult) { return; } - if (hoverResult && hoverResult.hoverParts.length === 0) { - hoverResult = null; + const currentHoverResultIsEmpty = currentHoverResult && currentHoverResult.hoverParts.length === 0; + if (currentHoverResultIsEmpty) { + currentHoverResult = null; } - this._currentResult = hoverResult; + this._currentResult = currentHoverResult; if (this._currentResult) { this._showHover(this._currentResult.anchor, this._currentResult.hoverParts); } else { - this._widget.hide(); + this._contentHoverWidget.hide(); } } private _addLoadingMessage(result: IHoverPart[]): IHoverPart[] { - if (this._computer.anchor) { - for (const participant of this._participants) { - if (participant.createLoadingMessage) { - const loadingMessage = participant.createLoadingMessage(this._computer.anchor); - if (loadingMessage) { - return result.slice(0).concat([loadingMessage]); - } - } + if (!this._computer.anchor) { + return result; + } + for (const participant of this._participants) { + if (!participant.createLoadingMessage) { + continue; + } + const loadingMessage = participant.createLoadingMessage(this._computer.anchor); + if (!loadingMessage) { + continue; } + return result.slice(0).concat([loadingMessage]); } return result; } private _withResult(hoverResult: HoverResult): void { - if (this._widget.position && this._currentResult && this._currentResult.isComplete) { - // The hover is visible with a previous complete result. - - if (!hoverResult.isComplete) { - // Instead of rendering the new partial result, we wait for the result to be complete. - return; - } - - if (this._computer.insistOnKeepingHoverVisible && hoverResult.hoverParts.length === 0) { - // The hover would now hide normally, so we'll keep the previous messages - return; - } + const previousHoverIsVisibleWithCompleteResult = this._contentHoverWidget.position && this._currentResult && this._currentResult.isComplete; + if (!previousHoverIsVisibleWithCompleteResult) { + this._setCurrentResult(hoverResult); + } + // The hover is visible with a previous complete result. + const isCurrentHoverResultComplete = hoverResult.isComplete; + if (!isCurrentHoverResultComplete) { + // Instead of rendering the new partial result, we wait for the result to be complete. + return; + } + const currentHoverResultIsEmpty = hoverResult.hoverParts.length === 0; + const insistOnKeepingPreviousHoverVisible = this._computer.insistOnKeepingHoverVisible; + const shouldKeepPreviousHoverVisible = currentHoverResultIsEmpty && insistOnKeepingPreviousHoverVisible; + if (shouldKeepPreviousHoverVisible) { + // The hover would now hide normally, so we'll keep the previous messages + return; } - this._setCurrentResult(hoverResult); } private _showHover(anchor: HoverAnchor, hoverParts: IHoverPart[]): void { - const fragment = document.createDocumentFragment(); const disposables = this._renderHoverPartsInFragment(fragment, hoverParts); const fragmentHasContent = fragment.hasChildNodes(); @@ -232,13 +229,13 @@ export class ContentHoverController extends Disposable implements IHoverWidget { }; const onContentsChanged = () => { this._onContentsChanged.fire(); - this._widget.onContentsChanged(); + this._contentHoverWidget.onContentsChanged(); }; const setColorPicker = (widget: IEditorHoverColorPickerWidget) => { this._colorWidget = widget; }; const setMinimumDimensions = (dimensions: dom.Dimension) => { - this._widget.setMinimumDimensions(dimensions); + this._contentHoverWidget.setMinimumDimensions(dimensions); }; const context: IEditorHoverRenderContext = { fragment, statusBar, hide, onContentsChanged, setColorPicker, setMinimumDimensions }; return context; @@ -257,7 +254,8 @@ export class ContentHoverController extends Disposable implements IHoverWidget { const disposables = new DisposableStore(); for (const participant of this._participants) { const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant); - if (hoverPartsForParticipant.length === 0) { + const hasHoverPartsForParticipant = hoverPartsForParticipant.length > 0; + if (!hasHoverPartsForParticipant) { continue; } disposables.add(participant.renderHoverParts(context, hoverPartsForParticipant)); @@ -295,7 +293,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { isBeforeContent, disposables ); - this._widget.showAt(fragment, contentHoverVisibleData); + this._contentHoverWidget.showAt(fragment, contentHoverVisibleData); } private _addEditorDecorations(highlightRange: Range | undefined, disposables: DisposableStore) { @@ -317,7 +315,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { className: 'hoverHighlight' }); - public static computeHoverRanges(editor: ICodeEditor, anchorRange: Range, messages: IHoverPart[]) { + public static computeHoverRanges(editor: ICodeEditor, anchorRange: Range, hoverParts: IHoverPart[]) { let startColumnBoundary = 1; if (editor.hasModel()) { @@ -332,17 +330,18 @@ export class ContentHoverController extends Disposable implements IHoverWidget { // The anchor range is always on a single line const anchorLineNumber = anchorRange.startLineNumber; let renderStartColumn = anchorRange.startColumn; - let highlightRange = messages[0].range; + let highlightRange = hoverParts[0].range; let forceShowAtRange = null; - for (const msg of messages) { - highlightRange = Range.plusRange(highlightRange, msg.range); - if (msg.range.startLineNumber === anchorLineNumber && msg.range.endLineNumber === anchorLineNumber) { + for (const hoverPart of hoverParts) { + highlightRange = Range.plusRange(highlightRange, hoverPart.range); + const hoverRangeIsWithinAnchorLine = hoverPart.range.startLineNumber === anchorLineNumber && hoverPart.range.endLineNumber === anchorLineNumber; + if (hoverRangeIsWithinAnchorLine) { // this message has a range that is completely sitting on the line of the anchor - renderStartColumn = Math.max(Math.min(renderStartColumn, msg.range.startColumn), startColumnBoundary); + renderStartColumn = Math.max(Math.min(renderStartColumn, hoverPart.range.startColumn), startColumnBoundary); } - if (msg.forceShowAtRange) { - forceShowAtRange = msg.range; + if (hoverPart.forceShowAtRange) { + forceShowAtRange = hoverPart.range; } } @@ -357,45 +356,52 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } public showsOrWillShow(mouseEvent: IEditorMouseEvent): boolean { - - if (this._widget.isResizing) { + const isContentWidgetResizing = this._contentHoverWidget.isResizing; + if (isContentWidgetResizing) { return true; } + const anchorCandidates: HoverAnchor[] = this._findHoverAnchorCandidates(mouseEvent); + const anchorCandidatesExist = anchorCandidates.length > 0; + if (!anchorCandidatesExist) { + return this._startShowingOrUpdateHover(null, HoverStartMode.Delayed, HoverStartSource.Mouse, false, mouseEvent); + } + const anchor = anchorCandidates[0]; + return this._startShowingOrUpdateHover(anchor, HoverStartMode.Delayed, HoverStartSource.Mouse, false, mouseEvent); + } + private _findHoverAnchorCandidates(mouseEvent: IEditorMouseEvent): HoverAnchor[] { const anchorCandidates: HoverAnchor[] = []; for (const participant of this._participants) { - if (participant.suggestHoverAnchor) { - const anchor = participant.suggestHoverAnchor(mouseEvent); - if (anchor) { - anchorCandidates.push(anchor); - } + if (!participant.suggestHoverAnchor) { + continue; + } + const anchor = participant.suggestHoverAnchor(mouseEvent); + if (!anchor) { + continue; } + anchorCandidates.push(anchor); } - const target = mouseEvent.target; - - if (target.type === MouseTargetType.CONTENT_TEXT) { - anchorCandidates.push(new HoverRangeAnchor(0, target.range, mouseEvent.event.posx, mouseEvent.event.posy)); - } - - if (target.type === MouseTargetType.CONTENT_EMPTY) { - const epsilon = this._editor.getOption(EditorOption.fontInfo).typicalHalfwidthCharacterWidth / 2; - if ( - !target.detail.isAfterLines - && typeof target.detail.horizontalDistanceToText === 'number' - && target.detail.horizontalDistanceToText < epsilon - ) { + switch (target.type) { + case MouseTargetType.CONTENT_TEXT: { + anchorCandidates.push(new HoverRangeAnchor(0, target.range, mouseEvent.event.posx, mouseEvent.event.posy)); + break; + } + case MouseTargetType.CONTENT_EMPTY: { + const epsilon = this._editor.getOption(EditorOption.fontInfo).typicalHalfwidthCharacterWidth / 2; // Let hover kick in even when the mouse is technically in the empty area after a line, given the distance is small enough + const mouseIsWithinLinesAndCloseToHover = !target.detail.isAfterLines + && typeof target.detail.horizontalDistanceToText === 'number' + && target.detail.horizontalDistanceToText < epsilon; + if (!mouseIsWithinLinesAndCloseToHover) { + break; + } anchorCandidates.push(new HoverRangeAnchor(0, target.range, mouseEvent.event.posx, mouseEvent.event.posy)); + break; } } - - if (anchorCandidates.length === 0) { - return this._startShowingOrUpdateHover(null, HoverStartMode.Delayed, HoverStartSource.Mouse, false, mouseEvent); - } - anchorCandidates.sort((a, b) => b.priority - a.priority); - return this._startShowingOrUpdateHover(anchorCandidates[0], HoverStartMode.Delayed, HoverStartSource.Mouse, false, mouseEvent); + return anchorCandidates; } public startShowingAtRange(range: Range, mode: HoverStartMode, source: HoverStartSource, focus: boolean): void { @@ -419,7 +425,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } public getWidgetContent(): string | undefined { - const node = this._widget.getDomNode(); + const node = this._contentHoverWidget.getDomNode(); if (!node.textContent) { return undefined; } @@ -427,43 +433,43 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } public containsNode(node: Node | null | undefined): boolean { - return (node ? this._widget.getDomNode().contains(node) : false); + return (node ? this._contentHoverWidget.getDomNode().contains(node) : false); } public focus(): void { - this._widget.focus(); + this._contentHoverWidget.focus(); } public scrollUp(): void { - this._widget.scrollUp(); + this._contentHoverWidget.scrollUp(); } public scrollDown(): void { - this._widget.scrollDown(); + this._contentHoverWidget.scrollDown(); } public scrollLeft(): void { - this._widget.scrollLeft(); + this._contentHoverWidget.scrollLeft(); } public scrollRight(): void { - this._widget.scrollRight(); + this._contentHoverWidget.scrollRight(); } public pageUp(): void { - this._widget.pageUp(); + this._contentHoverWidget.pageUp(); } public pageDown(): void { - this._widget.pageDown(); + this._contentHoverWidget.pageDown(); } public goToTop(): void { - this._widget.goToTop(); + this._contentHoverWidget.goToTop(); } public goToBottom(): void { - this._widget.goToBottom(); + this._contentHoverWidget.goToBottom(); } public hide(): void { @@ -473,26 +479,26 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } public get isColorPickerVisible(): boolean { - return this._widget.isColorPickerVisible; + return this._contentHoverWidget.isColorPickerVisible; } public get isVisibleFromKeyboard(): boolean { - return this._widget.isVisibleFromKeyboard; + return this._contentHoverWidget.isVisibleFromKeyboard; } public get isVisible(): boolean { - return this._widget.isVisible; + return this._contentHoverWidget.isVisible; } public get isFocused(): boolean { - return this._widget.isFocused; + return this._contentHoverWidget.isFocused; } public get isResizing(): boolean { - return this._widget.isResizing; + return this._contentHoverWidget.isResizing; } public get widget() { - return this._widget; + return this._contentHoverWidget; } } From d15da773499dec1c96bdb02ac871d789ca56fe6a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 6 Jun 2024 10:44:01 +0200 Subject: [PATCH 121/755] remove caching for user extensions (#214415) --- .../extensionManagement/node/extensionManagementService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 151189cbef954..5c9916b3e2c02 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -515,7 +515,7 @@ export class ExtensionsScanner extends Disposable { async scanExtensions(type: ExtensionType | null, profileLocation: URI, productVersion: IProductVersion): Promise { try { - const userScanOptions: ScanOptions = { includeInvalid: true, useCache: true, profileLocation, productVersion }; + const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation, productVersion }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { if (!this.scanAllExtensionPromise) { From 9013918cb7a09a3238fa4b0a38c8abfc4cdcd7d8 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Thu, 6 Jun 2024 12:00:48 +0200 Subject: [PATCH 122/755] Removing the color picker reference from the content hover controller (#214314) * removing the set color picker method * renaming the method to handle resize * polishing the merge conflicts --- .../browser/colorHoverParticipant.ts | 25 +++++++++++++------ .../browser/standaloneColorPickerWidget.ts | 19 +++++++------- .../hover/browser/contentHoverController.ts | 25 +++++++++++-------- .../hover/browser/contentHoverTypes.ts | 3 +-- .../hover/browser/contentHoverWidget.ts | 10 ++++---- .../contrib/hover/browser/hoverTypes.ts | 5 +--- 6 files changed, 49 insertions(+), 38 deletions(-) diff --git a/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts b/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts index e37a442f643b0..1bbdde4c7466e 100644 --- a/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts @@ -50,6 +50,8 @@ export class ColorHoverParticipant implements IEditorHoverParticipant colorPickerWidget = widget, onContentsChanged: () => { }, hide: () => this.hide() }; this._colorHover = colorHover; - this._register(this._standaloneColorPickerParticipant.renderHoverParts(context, [colorHover])); - if (colorPickerWidget === undefined) { + const { disposables, colorPicker } = this._standaloneColorPickerParticipant.renderHoverParts(context, [colorHover]); + this._register(disposables); + if (colorPicker === undefined) { return; } this._body.classList.add('standalone-colorpicker-body'); @@ -235,22 +234,22 @@ export class StandaloneColorPickerWidget extends Disposable implements IContentW this._body.style.maxWidth = Math.max(this._editor.getLayoutInfo().width * 0.66, 500) + 'px'; this._body.tabIndex = 0; this._body.appendChild(fragment); - colorPickerWidget.layout(); + colorPicker.layout(); - const colorPickerBody = colorPickerWidget.body; + const colorPickerBody = colorPicker.body; const saturationBoxWidth = colorPickerBody.saturationBox.domNode.clientWidth; const widthOfOriginalColorBox = colorPickerBody.domNode.clientWidth - saturationBoxWidth - CLOSE_BUTTON_WIDTH - PADDING; - const enterButton: InsertButton | null = colorPickerWidget.body.enterButton; + const enterButton: InsertButton | null = colorPicker.body.enterButton; enterButton?.onClicked(() => { this.updateEditor(); this.hide(); }); - const colorPickerHeader = colorPickerWidget.header; + const colorPickerHeader = colorPicker.header; const pickedColorNode = colorPickerHeader.pickedColorNode; pickedColorNode.style.width = saturationBoxWidth + PADDING + 'px'; const originalColorNode = colorPickerHeader.originalColorNode; originalColorNode.style.width = widthOfOriginalColorBox + 'px'; - const closeButton = colorPickerWidget.header.closeButton; + const closeButton = colorPicker.header.closeButton; closeButton?.onClicked(() => { this.hide(); }); diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index 1223c0d2efd0f..ea1a948a12937 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -13,7 +13,7 @@ import { Range } from 'vs/editor/common/core/range'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { TokenizationRegistry } from 'vs/editor/common/languages'; import { HoverOperation, HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; -import { HoverAnchor, HoverParticipantRegistry, HoverRangeAnchor, IEditorHoverColorPickerWidget, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverParticipantRegistry, HoverRangeAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; @@ -24,17 +24,18 @@ import { ContentHoverComputer } from 'vs/editor/contrib/hover/browser/contentHov import { ContentHoverVisibleData, HoverResult } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; import { EditorHoverStatusBar } from 'vs/editor/contrib/hover/browser/contentHoverStatusBar'; import { Emitter } from 'vs/base/common/event'; +import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/colorHoverParticipant'; export class ContentHoverController extends Disposable implements IHoverWidget { private _currentResult: HoverResult | null = null; - private _colorWidget: IEditorHoverColorPickerWidget | null = null; private readonly _computer: ContentHoverComputer; private readonly _contentHoverWidget: ContentHoverWidget; private readonly _participants: IEditorHoverParticipant[]; // TODO@aiday-mar make array of participants, dispatch between them private readonly _markdownHoverParticipant: MarkdownHoverParticipant | undefined; + private readonly _colorHoverParticipant: ColorHoverParticipant | undefined; private readonly _hoverOperation: HoverOperation; private readonly _onContentsChanged = this._register(new Emitter()); @@ -50,23 +51,31 @@ export class ContentHoverController extends Disposable implements IHoverWidget { const initializedParticipants = this._initializeHoverParticipants(); this._participants = initializedParticipants.participants; this._markdownHoverParticipant = initializedParticipants.markdownHoverParticipant; + this._colorHoverParticipant = initializedParticipants.colorHoverParticipant; this._computer = new ContentHoverComputer(this._editor, this._participants); this._hoverOperation = this._register(new HoverOperation(this._editor, this._computer)); this._registerListeners(); } - private _initializeHoverParticipants(): { participants: IEditorHoverParticipant[]; markdownHoverParticipant: MarkdownHoverParticipant | undefined } { + private _initializeHoverParticipants(): { participants: IEditorHoverParticipant[]; markdownHoverParticipant: MarkdownHoverParticipant | undefined; colorHoverParticipant: ColorHoverParticipant | undefined } { const participants: IEditorHoverParticipant[] = []; let markdownHoverParticipant: MarkdownHoverParticipant | undefined; + let colorHoverParticipant: ColorHoverParticipant | undefined; for (const participant of HoverParticipantRegistry.getAll()) { const participantInstance = this._instantiationService.createInstance(participant, this._editor); if (participantInstance instanceof MarkdownHoverParticipant && !(participantInstance instanceof InlayHintsHover)) { markdownHoverParticipant = participantInstance; } + if (participantInstance instanceof ColorHoverParticipant) { + colorHoverParticipant = participantInstance; + } participants.push(participantInstance); } participants.sort((p1, p2) => p1.hoverOrdinal - p2.hoverOrdinal); - return { participants, markdownHoverParticipant }; + this._register(this._contentHoverWidget.onDidResize(() => { + this._participants.forEach(participant => participant.handleResize?.()); + })); + return { participants, markdownHoverParticipant, colorHoverParticipant }; } private _registerListeners(): void { @@ -231,13 +240,10 @@ export class ContentHoverController extends Disposable implements IHoverWidget { this._onContentsChanged.fire(); this._contentHoverWidget.onContentsChanged(); }; - const setColorPicker = (widget: IEditorHoverColorPickerWidget) => { - this._colorWidget = widget; - }; const setMinimumDimensions = (dimensions: dom.Dimension) => { this._contentHoverWidget.setMinimumDimensions(dimensions); }; - const context: IEditorHoverRenderContext = { fragment, statusBar, hide, onContentsChanged, setColorPicker, setMinimumDimensions }; + const context: IEditorHoverRenderContext = { fragment, statusBar, hide, onContentsChanged, setMinimumDimensions }; return context; } @@ -284,7 +290,6 @@ export class ContentHoverController extends Disposable implements IHoverWidget { const contentHoverVisibleData = new ContentHoverVisibleData( initialMousePosX, initialMousePosY, - this._colorWidget, showAtPosition, showAtSecondaryPosition, preferAbove, @@ -479,7 +484,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } public get isColorPickerVisible(): boolean { - return this._contentHoverWidget.isColorPickerVisible; + return this._colorHoverParticipant?.isColorPickerVisible() ?? false; } public get isVisibleFromKeyboard(): boolean { diff --git a/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts b/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts index eb6eef20ea4bd..86172b774be59 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts @@ -6,7 +6,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { Position } from 'vs/editor/common/core/position'; import { HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; -import { HoverAnchor, IEditorHoverColorPickerWidget, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; export class HoverResult { @@ -48,7 +48,6 @@ export class ContentHoverVisibleData { constructor( public initialMousePosX: number | undefined, public initialMousePosY: number | undefined, - public readonly colorPicker: IEditorHoverColorPickerWidget | null, public readonly showAtPosition: Position, public readonly showAtSecondaryPosition: Position, public readonly preferAbove: boolean, diff --git a/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts b/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts index 5890340091414..75b4b1d41b928 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts @@ -16,6 +16,7 @@ import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { getHoverAccessibleViewHint, HoverWidget } from 'vs/base/browser/ui/hover/hoverWidget'; import { PositionAffinity } from 'vs/editor/common/model'; import { ContentHoverVisibleData } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; +import { Emitter } from 'vs/base/common/event'; const HORIZONTAL_SCROLLING_BY = 30; const CONTAINER_HEIGHT_PADDING = 6; @@ -34,9 +35,8 @@ export class ContentHoverWidget extends ResizableContentWidget { private readonly _hoverVisibleKey: IContextKey; private readonly _hoverFocusedKey: IContextKey; - public get isColorPickerVisible(): boolean { - return Boolean(this._visibleData?.colorPicker); - } + private readonly _onDidResize = this._register(new Emitter()); + public readonly onDidResize = this._onDidResize.event; public get isVisibleFromKeyboard(): boolean { return (this._visibleData?.source === HoverStartSource.Keyboard); @@ -158,7 +158,7 @@ export class ContentHoverWidget extends ResizableContentWidget { this._updateResizableNodeMaxDimensions(); this._hover.scrollbar.scanDomNode(); this._editor.layoutContentWidget(this); - this._visibleData?.colorPicker?.layout(); + this._onDidResize.fire(); } private _findAvailableSpaceVertically(): number | undefined { @@ -336,7 +336,7 @@ export class ContentHoverWidget extends ResizableContentWidget { if (hoverData.stoleFocus) { this._hover.containerDomNode.focus(); } - hoverData.colorPicker?.layout(); + this._onDidResize.fire(); // The aria label overrides the label, so if we add to it, add the contents of the hover const hoverFocused = this._hover.containerDomNode.ownerDocument.activeElement === this._hover.containerDomNode; const accessibleViewHint = hoverFocused && getHoverAccessibleViewHint( diff --git a/src/vs/editor/contrib/hover/browser/hoverTypes.ts b/src/vs/editor/contrib/hover/browser/hoverTypes.ts index 68483d2bbfa3f..c24cb04f7fe69 100644 --- a/src/vs/editor/contrib/hover/browser/hoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/hoverTypes.ts @@ -103,10 +103,6 @@ export interface IEditorHoverRenderContext { * The status bar for actions for this hover. */ readonly statusBar: IEditorHoverStatusBar; - /** - * Set if the hover will render a color picker widget. - */ - setColorPicker(widget: IEditorHoverColorPickerWidget): void; /** * The contents rendered inside the fragment have been changed, which means that the hover should relayout. */ @@ -128,6 +124,7 @@ export interface IEditorHoverParticipant { computeAsync?(anchor: HoverAnchor, lineDecorations: IModelDecoration[], token: CancellationToken): AsyncIterableObject; createLoadingMessage?(anchor: HoverAnchor): T | null; renderHoverParts(context: IEditorHoverRenderContext, hoverParts: T[]): IDisposable; + handleResize?(): void; } export type IEditorHoverParticipantCtor = IConstructorSignature; From 86f14846935ace9d17c79f79a1eebf128e6d6711 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 6 Jun 2024 12:55:01 +0200 Subject: [PATCH 123/755] watcher - make proposed `excludes` required (#214436) --- src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts b/src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts index 8ef9b90a8ea0b..d138471f2aff7 100644 --- a/src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts +++ b/src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts @@ -28,7 +28,7 @@ declare module 'vscode' { * An optional set of glob patterns to exclude from watching. * Glob patterns are always matched relative to the watched folder. */ - readonly excludes?: string[]; + readonly excludes: string[]; } export namespace workspace { From 43c8fe13e0c06e66bcab9c2670fc1f2b995cc19e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 6 Jun 2024 15:50:10 +0200 Subject: [PATCH 124/755] The feature page of vscode.html plugin is empty (#214455) --- src/vs/platform/extensions/common/extensions.ts | 2 +- .../services/language/common/languageService.ts | 9 +++++++++ .../textMate/browser/textMateTokenizationFeatureImpl.ts | 4 ++-- src/vs/workbench/services/textMate/common/TMGrammars.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index cfe5313b905c1..f4af25dcabb3d 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -41,7 +41,7 @@ export interface IDebugger { } export interface IGrammar { - language: string; + language?: string; } export interface IJSONValidation { diff --git a/src/vs/workbench/services/language/common/languageService.ts b/src/vs/workbench/services/language/common/languageService.ts index a5644c2b309ff..1eb86cfd2d3f6 100644 --- a/src/vs/workbench/services/language/common/languageService.ts +++ b/src/vs/workbench/services/language/common/languageService.ts @@ -23,6 +23,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { index } from 'vs/base/common/arrays'; import { MarkdownString } from 'vs/base/common/htmlContent'; +import { isString } from 'vs/base/common/types'; export interface IRawLanguageExtensionPoint { id: string; @@ -147,6 +148,10 @@ class LanguageTableRenderer extends Disposable implements IExtensionFeatureTable const grammars = contributes?.grammars || []; grammars.forEach(grammar => { + if (!isString(grammar.language)) { + // ignore the grammars that are only used as includes in other grammars + return; + } let language = byId[grammar.language]; if (language) { @@ -160,6 +165,10 @@ class LanguageTableRenderer extends Disposable implements IExtensionFeatureTable const snippets = contributes?.snippets || []; snippets.forEach(snippet => { + if (!isString(snippet.language)) { + // ignore invalid snippets + return; + } let language = byId[snippet.language]; if (language) { diff --git a/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts b/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts index ee98f91bc1692..02eef664f6f65 100644 --- a/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts +++ b/src/vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl.ts @@ -171,7 +171,7 @@ export class TextMateTokenizationFeature extends Disposable implements ITextMate } } - const validLanguageId = grammar.language && this._languageService.isRegisteredLanguageId(grammar.language) ? grammar.language : null; + const validLanguageId = grammar.language && this._languageService.isRegisteredLanguageId(grammar.language) ? grammar.language : undefined; function asStringArray(array: unknown, defaultValue: string[]): string[] { if (!Array.isArray(array)) { @@ -185,7 +185,7 @@ export class TextMateTokenizationFeature extends Disposable implements ITextMate return { location: grammarLocation, - language: validLanguageId || undefined, + language: validLanguageId, scopeName: grammar.scopeName, embeddedLanguages: embeddedLanguages, tokenTypes: tokenTypes, diff --git a/src/vs/workbench/services/textMate/common/TMGrammars.ts b/src/vs/workbench/services/textMate/common/TMGrammars.ts index b460653c97b20..150a91d9120b2 100644 --- a/src/vs/workbench/services/textMate/common/TMGrammars.ts +++ b/src/vs/workbench/services/textMate/common/TMGrammars.ts @@ -16,7 +16,7 @@ export interface TokenTypesContribution { } export interface ITMSyntaxExtensionPoint { - language: string; + language?: string; // undefined if the grammar is only included by other grammars scopeName: string; path: string; embeddedLanguages: IEmbeddedLanguagesMap; From 7496c883cceb46b4525e8c30247c44b9fe092ef6 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 6 Jun 2024 15:50:37 +0200 Subject: [PATCH 125/755] registerColor: Allow to pass in a single default color (#214438) --- .../editor/common/core/editorColorRegistry.ts | 2 +- src/vs/platform/theme/common/colorUtils.ts | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/core/editorColorRegistry.ts b/src/vs/editor/common/core/editorColorRegistry.ts index 7a71039691007..f7ad150e80cee 100644 --- a/src/vs/editor/common/core/editorColorRegistry.ts +++ b/src/vs/editor/common/core/editorColorRegistry.ts @@ -20,7 +20,7 @@ export const editorSymbolHighlightBorder = registerColor('editor.symbolHighlight export const editorCursorForeground = registerColor('editorCursor.foreground', { dark: '#AEAFAD', light: Color.black, hcDark: Color.white, hcLight: '#0F4A85' }, nls.localize('caret', 'Color of the editor cursor.')); export const editorCursorBackground = registerColor('editorCursor.background', null, nls.localize('editorCursorBackground', 'The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.')); -export const editorMultiCursorPrimaryForeground = registerColor('editorMultiCursor.primary.foreground', { dark: editorCursorForeground, light: editorCursorForeground, hcDark: editorCursorForeground, hcLight: editorCursorForeground }, nls.localize('editorMultiCursorPrimaryForeground', 'Color of the primary editor cursor when multiple cursors are present.')); +export const editorMultiCursorPrimaryForeground = registerColor('editorMultiCursor.primary.foreground', editorCursorForeground, nls.localize('editorMultiCursorPrimaryForeground', 'Color of the primary editor cursor when multiple cursors are present.')); export const editorMultiCursorPrimaryBackground = registerColor('editorMultiCursor.primary.background', { dark: editorCursorBackground, light: editorCursorBackground, hcDark: editorCursorBackground, hcLight: editorCursorBackground }, nls.localize('editorMultiCursorPrimaryBackground', 'The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.')); export const editorMultiCursorSecondaryForeground = registerColor('editorMultiCursor.secondary.foreground', { dark: editorCursorForeground, light: editorCursorForeground, hcDark: editorCursorForeground, hcLight: editorCursorForeground }, nls.localize('editorMultiCursorSecondaryForeground', 'Color of secondary editor cursors when multiple cursors are present.')); export const editorMultiCursorSecondaryBackground = registerColor('editorMultiCursor.secondary.background', { dark: editorCursorBackground, light: editorCursorBackground, hcDark: editorCursorBackground, hcLight: editorCursorBackground }, nls.localize('editorMultiCursorSecondaryBackground', 'The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.')); diff --git a/src/vs/platform/theme/common/colorUtils.ts b/src/vs/platform/theme/common/colorUtils.ts index 33dbfc4b60671..0f21708a437d4 100644 --- a/src/vs/platform/theme/common/colorUtils.ts +++ b/src/vs/platform/theme/common/colorUtils.ts @@ -62,6 +62,10 @@ export type ColorTransform = | { op: ColorTransformType.LessProminent; value: ColorValue; background: ColorValue; factor: number; transparency: number } | { op: ColorTransformType.IfDefinedThenElse; if: ColorIdentifier; then: ColorValue; else: ColorValue }; +export function isColorTransform(value: unknown): value is ColorTransform { + return typeof value === 'object' && !!value && 'op' in value && typeof value.op === 'number'; +} + export interface ColorDefaults { light: ColorValue | null; dark: ColorValue | null; @@ -75,6 +79,10 @@ export interface ColorDefaults { */ export type ColorValue = Color | string | ColorIdentifier | ColorTransform; +export function isColorValue(value: unknown): value is ColorValue { + return typeof value === 'string' || value instanceof Color || isColorTransform(value); +} + // color registry export const Extensions = { ColorContribution: 'base.contributions.colors' @@ -229,7 +237,15 @@ const colorRegistry = new ColorRegistry(); platform.Registry.add(Extensions.ColorContribution, colorRegistry); -export function registerColor(id: string, defaults: ColorDefaults | null, description: string, needsTransparency?: boolean, deprecationMessage?: string): ColorIdentifier { +export function registerColor(id: string, defaults: ColorDefaults | ColorValue | null, description: string, needsTransparency?: boolean, deprecationMessage?: string): ColorIdentifier { + if (isColorValue(defaults)) { + defaults = { + dark: defaults, + light: defaults, + hcDark: defaults, + hcLight: defaults + } satisfies ColorDefaults; + } return colorRegistry.registerColor(id, defaults, description, needsTransparency, deprecationMessage); } From b0c91dda3198420a34ed14a4736f4efc91c50747 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 6 Jun 2024 15:39:47 +0200 Subject: [PATCH 126/755] Fixes #213141 --- .../bracketPairsImpl.ts | 18 ++++++++---------- src/vs/editor/common/model/textModel.ts | 5 +++++ .../common/model/tokenizationTextModelPart.ts | 14 +++++++------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts index 470a16f009c81..3d3fe2e3649e1 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts @@ -8,7 +8,7 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable, DisposableStore, IDisposable, IReference, MutableDisposable } from 'vs/base/common/lifecycle'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { ILanguageConfigurationService, LanguageConfigurationServiceChangeEvent } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ignoreBracketsInToken } from 'vs/editor/common/languages/supports'; import { LanguageBracketsConfiguration } from 'vs/editor/common/languages/supports/languageBracketsConfiguration'; import { BracketsUtils, RichEditBracket, RichEditBrackets } from 'vs/editor/common/languages/supports/richEditBrackets'; @@ -36,19 +36,17 @@ export class BracketPairsTextModelPart extends Disposable implements IBracketPai private readonly languageConfigurationService: ILanguageConfigurationService ) { super(); - - this._register( - this.languageConfigurationService.onDidChange(e => { - if (!e.languageId || this.bracketPairsTree.value?.object.didLanguageChange(e.languageId)) { - this.bracketPairsTree.clear(); - this.updateBracketPairsTree(); - } - }) - ); } //#region TextModel events + public handleLanguageConfigurationServiceChange(e: LanguageConfigurationServiceChangeEvent): void { + if (!e.languageId || this.bracketPairsTree.value?.object.didLanguageChange(e.languageId)) { + this.bracketPairsTree.clear(); + this.updateBracketPairsTree(); + } + } + public handleDidChangeOptions(e: IModelOptionsChangedEvent): void { this.bracketPairsTree.clear(); this.updateBracketPairsTree(); diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 75653b9ed6cf1..97b5a483fc350 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -381,6 +381,11 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati })); this._languageService.requestRichLanguageFeatures(languageId); + + this._register(this._languageConfigurationService.onDidChange(e => { + this._bracketPairs.handleLanguageConfigurationServiceChange(e); + this._tokenizationTextModelPart.handleLanguageConfigurationServiceChange(e); + })); } public override dispose(): void { diff --git a/src/vs/editor/common/model/tokenizationTextModelPart.ts b/src/vs/editor/common/model/tokenizationTextModelPart.ts index 804f63c6a2800..40c6c921afc34 100644 --- a/src/vs/editor/common/model/tokenizationTextModelPart.ts +++ b/src/vs/editor/common/model/tokenizationTextModelPart.ts @@ -17,7 +17,7 @@ import { IWordAtPosition, getWordAtText } from 'vs/editor/common/core/wordHelper import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; import { IBackgroundTokenizationStore, IBackgroundTokenizer, ILanguageIdCodec, IState, ITokenizationSupport, TokenizationRegistry } from 'vs/editor/common/languages'; import { ILanguageService } from 'vs/editor/common/languages/language'; -import { ILanguageConfigurationService, ResolvedLanguageConfiguration } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { ILanguageConfigurationService, LanguageConfigurationServiceChangeEvent, ResolvedLanguageConfiguration } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IAttachedView } from 'vs/editor/common/model'; import { BracketPairsTextModelPart } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl'; import { AttachedViews, IAttachedViewState, TextModel } from 'vs/editor/common/model/textModel'; @@ -56,12 +56,6 @@ export class TokenizationTextModelPart extends TextModelPart implements ITokeniz ) { super(); - this._register(this._languageConfigurationService.onDidChange(e => { - if (e.affects(this._languageId)) { - this._onDidChangeLanguageConfiguration.fire({}); - } - })); - this._register(this.grammarTokens.onDidChangeTokens(e => { this._emitModelTokensChangedEvent(e); })); @@ -77,6 +71,12 @@ export class TokenizationTextModelPart extends TextModelPart implements ITokeniz || this._onDidChangeTokens.hasListeners()); } + public handleLanguageConfigurationServiceChange(e: LanguageConfigurationServiceChangeEvent): void { + if (e.affects(this._languageId)) { + this._onDidChangeLanguageConfiguration.fire({}); + } + } + public handleDidChangeContent(e: IModelContentChangedEvent): void { if (e.isFlush) { this._semanticTokens.flush(); From 249357b0464b32e2922a7ecf7361f42b7d014772 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 6 Jun 2024 07:14:12 -0700 Subject: [PATCH 127/755] Dynamically import addon-clipboard --- .../browser/xterm/vscodeClipboardAddon.ts | 31 ------------------- .../terminal/browser/xterm/xtermTerminal.ts | 30 ++++++++++++++---- 2 files changed, 24 insertions(+), 37 deletions(-) delete mode 100644 src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts deleted file mode 100644 index 3d6c4725a5a8e..0000000000000 --- a/src/vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon.ts +++ /dev/null @@ -1,31 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ClipboardAddon, type ClipboardSelectionType, type IClipboardProvider } from '@xterm/addon-clipboard'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; - -export class VscodeClipboardAddon extends ClipboardAddon { - constructor( - @IInstantiationService instantiationService: IInstantiationService - ) { - super(undefined, instantiationService.createInstance(VscodeClipboardProvider)); - } -} - -class VscodeClipboardProvider implements IClipboardProvider { - constructor( - @IClipboardService private readonly _clipboardService: IClipboardService - ) { - } - - public async readText(type: ClipboardSelectionType): Promise { - return this._clipboardService.readText(type === 'p' ? 'selection' : 'clipboard'); - } - - public async writeText(type: ClipboardSelectionType, text: string): Promise { - return this._clipboardService.writeText(text, type === 'p' ? 'selection' : 'clipboard'); - } -} diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index 081d2dd79cd88..8d14cc3a2452b 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -9,7 +9,7 @@ import type { Unicode11Addon as Unicode11AddonType } from '@xterm/addon-unicode1 import type { WebglAddon as WebglAddonType } from '@xterm/addon-webgl'; import type { SerializeAddon as SerializeAddonType } from '@xterm/addon-serialize'; import type { ImageAddon as ImageAddonType } from '@xterm/addon-image'; -import type { ClipboardAddon as ClipboardAddonType } from '@xterm/addon-clipboard'; +import type { ClipboardAddon as ClipboardAddonType, ClipboardSelectionType } from '@xterm/addon-clipboard'; import * as dom from 'vs/base/browser/dom'; import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -40,12 +40,12 @@ import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableEle import { IMouseWheelEvent, StandardWheelEvent } from 'vs/base/browser/mouseEvent'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { AccessibilitySignal, IAccessibilitySignalService } from 'vs/platform/accessibilitySignal/browser/accessibilitySignalService'; -import { VscodeClipboardAddon } from 'vs/workbench/contrib/terminal/browser/xterm/vscodeClipboardAddon'; const enum RenderConstants { SmoothScrollDuration = 125 } +let ClipboardAddon: typeof ClipboardAddonType; let ImageAddon: typeof ImageAddonType; let SearchAddon: typeof SearchAddonType; let SerializeAddon: typeof SerializeAddonType; @@ -119,7 +119,9 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach private _markNavigationAddon: MarkNavigationAddon; private _shellIntegrationAddon: ShellIntegrationAddon; private _decorationAddon: DecorationAddon; - private _clipboardAddon: ClipboardAddonType; + + // Always on dynamicly imported addons + private _clipboardAddon?: ClipboardAddonType; // Optional addons private _searchAddon?: SearchAddonType; @@ -276,8 +278,17 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach this.raw.loadAddon(this._decorationAddon); this._shellIntegrationAddon = new ShellIntegrationAddon(shellIntegrationNonce, disableShellIntegrationReporting, this._telemetryService, this._logService); this.raw.loadAddon(this._shellIntegrationAddon); - this._clipboardAddon = this._instantiationService.createInstance(VscodeClipboardAddon); - this.raw.loadAddon(this._clipboardAddon); + this._getClipboardAddonConstructor().then(ClipboardAddon => { + this._clipboardAddon = this._instantiationService.createInstance(ClipboardAddon, undefined, { + async readText(type: ClipboardSelectionType): Promise { + return _clipboardService.readText(type === 'p' ? 'selection' : 'clipboard'); + }, + async writeText(type: ClipboardSelectionType, text: string): Promise { + return _clipboardService.writeText(text, type === 'p' ? 'selection' : 'clipboard'); + } + }); + this.raw.loadAddon(this._clipboardAddon); + }); this._anyTerminalFocusContextKey = TerminalContextKeys.focusInAny.bindTo(contextKeyService); this._anyFocusedTerminalHasSelection = TerminalContextKeys.textSelectedInFocused.bindTo(contextKeyService); @@ -330,7 +341,7 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach this.raw.open(container); } - // TODO: Move before open to the DOM renderer doesn't initialize + // TODO: Move before open so the DOM renderer doesn't initialize if (options.enableGpu) { if (this._shouldLoadWebgl()) { this._enableWebglRenderer(); @@ -715,6 +726,13 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach } } + protected async _getClipboardAddonConstructor(): Promise { + if (!ClipboardAddon) { + ClipboardAddon = (await importAMDNodeModule('@xterm/addon-clipboard', 'lib/addon-clipboard.js')).ClipboardAddon; + } + return ClipboardAddon; + } + protected async _getImageAddonConstructor(): Promise { if (!ImageAddon) { ImageAddon = (await importAMDNodeModule('@xterm/addon-image', 'lib/addon-image.js')).ImageAddon; From bedcbff1cb7be428a23eca32ebd4ada601c860bb Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 6 Jun 2024 07:19:38 -0700 Subject: [PATCH 128/755] Remove deprecated terminal suggest setting Fixes #211570 --- .../contrib/terminal/browser/terminal.contribution.ts | 2 +- .../contrib/terminal/browser/terminalProcessManager.ts | 4 ++-- src/vs/workbench/contrib/terminal/common/terminal.ts | 2 -- .../suggest/browser/terminalSuggestAddon.ts | 4 +--- .../suggest/common/terminalSuggestConfiguration.ts | 8 -------- 5 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 96657abf2ac17..3d07aa2d8bc8e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -210,7 +210,7 @@ registerSendSequenceKeybinding('\x1b[24~d', { // F12,d -> shift+end (SelectLine) mac: { primary: KeyMod.Shift | KeyMod.CtrlCmd | KeyCode.RightArrow } }); registerSendSequenceKeybinding('\x1b[24~e', { // F12,e -> ctrl+space (Native suggest) - when: ContextKeyExpr.and(TerminalContextKeys.focus, ContextKeyExpr.equals(TerminalContextKeyStrings.ShellType, WindowsShellType.PowerShell), TerminalContextKeys.terminalShellIntegrationEnabled, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate(), ContextKeyExpr.or(ContextKeyExpr.equals(`config.${TerminalSuggestSettingId.Enabled}`, true), ContextKeyExpr.equals(`config.${TerminalSuggestSettingId.EnabledLegacy}`, true))), + when: ContextKeyExpr.and(TerminalContextKeys.focus, ContextKeyExpr.equals(TerminalContextKeyStrings.ShellType, WindowsShellType.PowerShell), TerminalContextKeys.terminalShellIntegrationEnabled, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate(), ContextKeyExpr.equals(`config.${TerminalSuggestSettingId.Enabled}`, true)), primary: KeyMod.CtrlCmd | KeyCode.Space, mac: { primary: KeyMod.WinCtrl | KeyCode.Space } }); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 01db326f019be..22204b7a88ebb 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -289,7 +289,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce const options: ITerminalProcessOptions = { shellIntegration: { enabled: this._configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled), - suggestEnabled: this._configurationService.getValue(TerminalSuggestSettingId.Enabled) || this._configurationService.getValue(TerminalSuggestSettingId.EnabledLegacy), + suggestEnabled: this._configurationService.getValue(TerminalSuggestSettingId.Enabled), nonce: this.shellIntegrationNonce }, windowsEnableConpty: this._terminalConfigurationService.config.windowsEnableConpty, @@ -489,7 +489,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce const options: ITerminalProcessOptions = { shellIntegration: { enabled: this._configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled), - suggestEnabled: this._configurationService.getValue(TerminalSuggestSettingId.Enabled) || this._configurationService.getValue(TerminalSuggestSettingId.EnabledLegacy), + suggestEnabled: this._configurationService.getValue(TerminalSuggestSettingId.Enabled), nonce: this.shellIntegrationNonce }, windowsEnableConpty: this._terminalConfigurationService.config.windowsEnableConpty, diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index fc4a6a0a0e0ae..81ccf23927fdd 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -209,8 +209,6 @@ export interface ITerminalConfiguration { shellIntegration?: { enabled: boolean; decorationsEnabled: boolean; - // TODO: Legacy - remove soon - suggestEnabled: boolean; }; enableImages: boolean; smoothScrolling: boolean; diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts index d46c7f3ae04e8..499b4a410d095 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts @@ -16,7 +16,6 @@ import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { ITerminalConfigurationService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys'; import type { ITerminalAddon, Terminal } from '@xterm/xterm'; @@ -114,7 +113,6 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest private readonly _terminalSuggestWidgetVisibleContextKey: IContextKey, @IConfigurationService private readonly _configurationService: IConfigurationService, @IInstantiationService private readonly _instantiationService: IInstantiationService, - @ITerminalConfigurationService private readonly _terminalConfigurationService: ITerminalConfigurationService ) { super(); @@ -159,7 +157,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest private _sync(promptInputState: IPromptInputModelState): void { const config = this._configurationService.getValue(terminalSuggestConfigSection); - const enabled = config.enabled || this._terminalConfigurationService.config.shellIntegration?.suggestEnabled; + const enabled = config.enabled; if (!enabled) { return; } diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts b/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts index f465e37f07653..357a6bbee6099 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts @@ -10,7 +10,6 @@ import { TerminalSettingId } from 'vs/platform/terminal/common/terminal'; export const enum TerminalSuggestSettingId { Enabled = 'terminal.integrated.suggest.enabled', - EnabledLegacy = 'terminal.integrated.shellIntegration.suggestEnabled', QuickSuggestions = 'terminal.integrated.suggest.quickSuggestions', SuggestOnTriggerCharacters = 'terminal.integrated.suggest.suggestOnTriggerCharacters', } @@ -30,13 +29,6 @@ export const terminalSuggestConfiguration: IStringDictionary Date: Thu, 6 Jun 2024 08:32:27 -0700 Subject: [PATCH 129/755] Rename updatable hover to managed hover, tweak arg names and docs Part of #204965 --- .../browser/ui/actionbar/actionViewItems.ts | 6 +- src/vs/base/browser/ui/button/button.ts | 8 +-- src/vs/base/browser/ui/dropdown/dropdown.ts | 6 +- .../ui/dropdown/dropdownActionViewItem.ts | 2 +- .../ui/highlightedlabel/highlightedLabel.ts | 6 +- src/vs/base/browser/ui/hover/hover.ts | 44 ++++++++++---- src/vs/base/browser/ui/hover/hoverDelegate.ts | 4 +- .../base/browser/ui/hover/hoverDelegate2.ts | 4 +- src/vs/base/browser/ui/iconLabel/iconLabel.ts | 12 ++-- .../browser/ui/iconLabel/simpleIconLabel.ts | 6 +- src/vs/base/browser/ui/inputbox/inputBox.ts | 6 +- .../ui/keybindingLabel/keybindingLabel.ts | 6 +- .../browser/ui/selectBox/selectBoxCustom.ts | 6 +- src/vs/base/browser/ui/table/tableWidget.ts | 2 +- src/vs/base/browser/ui/toggle/toggle.ts | 6 +- .../services/hoverService/hoverService.ts | 58 +++++++++---------- .../hoverService/updatableHoverWidget.ts | 12 ++-- .../editor/contrib/find/browser/findWidget.ts | 2 +- .../hover/browser/markdownHoverParticipant.ts | 2 +- .../contrib/rename/browser/renameWidget.ts | 6 +- src/vs/platform/actions/browser/buttonbar.ts | 2 +- .../hover/test/browser/nullHoverService.ts | 4 +- src/vs/platform/opener/browser/link.ts | 6 +- .../quickinput/browser/quickInputTree.ts | 10 ++-- .../workbench/browser/actions/listCommands.ts | 2 +- .../workbench/browser/parts/compositePart.ts | 2 +- .../notifications/notificationsViewer.ts | 10 ++-- .../browser/parts/statusbar/statusbarItem.ts | 6 +- .../parts/titlebar/commandCenterControl.ts | 4 +- .../workbench/browser/parts/views/checkbox.ts | 6 +- .../workbench/browser/parts/views/treeView.ts | 4 +- .../workbench/browser/parts/views/viewPane.ts | 14 ++--- .../contrib/chat/browser/chatAgentHover.ts | 4 +- .../contrib/chat/browser/chatListRenderer.ts | 2 +- .../chatMarkdownDecorationsRenderer.ts | 2 +- .../emptyTextEditorHint.ts | 2 +- .../contrib/comments/browser/commentReply.ts | 2 +- .../comments/browser/commentsTreeViewer.ts | 2 +- .../contrib/comments/browser/timestamp.ts | 6 +- .../contrib/debug/browser/baseDebugView.ts | 4 +- .../contrib/debug/browser/breakpointsView.ts | 26 ++++----- .../contrib/debug/browser/callStackView.ts | 14 ++--- .../debug/browser/debugActionViewItems.ts | 2 +- .../contrib/debug/browser/replViewer.ts | 6 +- .../abstractRuntimeExtensionsEditor.ts | 6 +- .../extensions/browser/extensionEditor.ts | 18 +++--- .../extensions/browser/extensionsWidgets.ts | 20 +++---- .../inlineChat/browser/inlineChatWidget.ts | 2 +- .../markers/browser/markersTreeViewer.ts | 6 +- .../browser/view/cellParts/cellActionView.ts | 6 +- .../browser/view/cellParts/cellStatusPart.ts | 6 +- .../preferences/browser/keybindingsEditor.ts | 12 ++-- .../preferences/browser/preferencesWidgets.ts | 6 +- .../preferences/browser/settingsTree.ts | 6 +- .../preferences/browser/settingsWidgets.ts | 12 ++-- .../contrib/preferences/browser/tocTree.ts | 2 +- .../contrib/scm/browser/scmViewPane.ts | 8 +-- .../search/browser/searchResultsView.ts | 4 +- .../contrib/search/browser/searchView.ts | 4 +- .../searchEditor/browser/searchEditor.ts | 2 +- .../testing/browser/testCoverageBars.ts | 10 ++-- .../testing/browser/testingExplorerView.ts | 10 ++-- 62 files changed, 253 insertions(+), 233 deletions(-) diff --git a/src/vs/base/browser/ui/actionbar/actionViewItems.ts b/src/vs/base/browser/ui/actionbar/actionViewItems.ts index 98ea82272b82b..412cf47cfc74d 100644 --- a/src/vs/base/browser/ui/actionbar/actionViewItems.ts +++ b/src/vs/base/browser/ui/actionbar/actionViewItems.ts @@ -19,7 +19,7 @@ import * as platform from 'vs/base/common/platform'; import * as types from 'vs/base/common/types'; import 'vs/css!./actionbar'; import * as nls from 'vs/nls'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; export interface IBaseActionViewItemOptions { @@ -36,7 +36,7 @@ export class BaseActionViewItem extends Disposable implements IActionViewItem { _context: unknown; readonly _action: IAction; - private customHover?: IUpdatableHover; + private customHover?: IManagedHover; get action() { return this._action; @@ -233,7 +233,7 @@ export class BaseActionViewItem extends Disposable implements IActionViewItem { } else { if (!this.customHover && title !== '') { const hoverDelegate = this.options.hoverDelegate ?? getDefaultHoverDelegate('element'); - this.customHover = this._store.add(getBaseLayerHoverDelegate().setupUpdatableHover(hoverDelegate, this.element, title)); + this.customHover = this._store.add(getBaseLayerHoverDelegate().setupManagedHover(hoverDelegate, this.element, title)); } else if (this.customHover) { this.customHover.update(title); } diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index 3c42632c500d2..30f588f4d4996 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -22,7 +22,7 @@ import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecyc import { ThemeIcon } from 'vs/base/common/themables'; import 'vs/css!./button'; import { localize } from 'vs/nls'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { IActionProvider } from 'vs/base/browser/ui/dropdown/dropdown'; @@ -80,7 +80,7 @@ export class Button extends Disposable implements IButton { protected _label: string | IMarkdownString = ''; protected _labelElement: HTMLElement | undefined; protected _labelShortElement: HTMLElement | undefined; - private _hover: IUpdatableHover | undefined; + private _hover: IManagedHover | undefined; private _onDidClick = this._register(new Emitter()); get onDidClick(): BaseEvent { return this._onDidClick.event; } @@ -306,7 +306,7 @@ export class Button extends Disposable implements IButton { setTitle(title: string) { if (!this._hover && title !== '') { - this._hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('mouse'), this._element, title)); + this._hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('mouse'), this._element, title)); } else if (this._hover) { this._hover.update(title); } @@ -370,7 +370,7 @@ export class ButtonWithDropdown extends Disposable implements IButton { this.separator.style.backgroundColor = options.buttonSeparator ?? ''; this.dropdownButton = this._register(new Button(this.element, { ...options, title: false, supportIcons: true })); - this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.dropdownButton.element, localize("button dropdown more actions", 'More Actions...'))); + this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.dropdownButton.element, localize("button dropdown more actions", 'More Actions...'))); this.dropdownButton.element.setAttribute('aria-haspopup', 'true'); this.dropdownButton.element.setAttribute('aria-expanded', 'false'); this.dropdownButton.element.classList.add('monaco-dropdown-button'); diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 1089d8275ba1d..ba003576019c2 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -8,7 +8,7 @@ import { $, addDisposableListener, append, EventHelper, EventType, isMouseEvent import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventType as GestureEventType, Gesture } from 'vs/base/browser/touch'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IMenuOptions } from 'vs/base/browser/ui/menu/menu'; @@ -37,7 +37,7 @@ class BaseDropdown extends ActionRunner { private _onDidChangeVisibility = this._register(new Emitter()); readonly onDidChangeVisibility = this._onDidChangeVisibility.event; - private hover: IUpdatableHover | undefined; + private hover: IManagedHover | undefined; constructor(container: HTMLElement, options: IBaseDropdownOptions) { super(); @@ -107,7 +107,7 @@ class BaseDropdown extends ActionRunner { set tooltip(tooltip: string) { if (this._label) { if (!this.hover && tooltip !== '') { - this.hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this._label, tooltip)); + this.hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this._label, tooltip)); } else if (this.hover) { this.hover.update(tooltip); } diff --git a/src/vs/base/browser/ui/dropdown/dropdownActionViewItem.ts b/src/vs/base/browser/ui/dropdown/dropdownActionViewItem.ts index 18cfd87d2bcc6..007e1de2a66da 100644 --- a/src/vs/base/browser/ui/dropdown/dropdownActionViewItem.ts +++ b/src/vs/base/browser/ui/dropdown/dropdownActionViewItem.ts @@ -93,7 +93,7 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem { this.element.setAttribute('aria-haspopup', 'true'); this.element.setAttribute('aria-expanded', 'false'); if (this._action.label) { - this._register(getBaseLayerHoverDelegate().setupUpdatableHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('mouse'), this.element, this._action.label)); + this._register(getBaseLayerHoverDelegate().setupManagedHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('mouse'), this.element, this._action.label)); } this.element.ariaLabel = this._action.label || ''; diff --git a/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts b/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts index 724075adb8736..83b0c26bcaef4 100644 --- a/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts +++ b/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; @@ -43,7 +43,7 @@ export class HighlightedLabel extends Disposable { private highlights: readonly IHighlight[] = []; private supportIcons: boolean; private didEverRender: boolean = false; - private customHover: IUpdatableHover | undefined; + private customHover: IManagedHover | undefined; /** * Create a new {@link HighlightedLabel}. @@ -141,7 +141,7 @@ export class HighlightedLabel extends Disposable { } else { if (!this.customHover && this.title !== '') { const hoverDelegate = this.options?.hoverDelegate ?? getDefaultHoverDelegate('mouse'); - this.customHover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(hoverDelegate, this.domNode, this.title)); + this.customHover = this._register(getBaseLayerHoverDelegate().setupManagedHover(hoverDelegate, this.domNode, this.title)); } else if (this.customHover) { this.customHover.update(this.title); } diff --git a/src/vs/base/browser/ui/hover/hover.ts b/src/vs/base/browser/ui/hover/hover.ts index f2b7582d7fab5..d087dc92dd91a 100644 --- a/src/vs/base/browser/ui/hover/hover.ts +++ b/src/vs/base/browser/ui/hover/hover.ts @@ -41,16 +41,37 @@ export interface IHoverDelegate2 { */ showAndFocusLastHover(): void; - // TODO: Change hoverDelegate arg to exclude the actual delegate and instead use the new options - setupUpdatableHover(hoverDelegate: IHoverDelegate, htmlElement: HTMLElement, content: IUpdatableHoverContentOrFactory, options?: IUpdatableHoverOptions): IUpdatableHover; + /** + * Sets up a managed hover for the given element. A managed hover will set up listeners for + * mouse events, show the hover after a delay and provide hooks to easily update the content. + * + * This should be used over {@link showHover} when fine-grained control is not needed. The + * managed hover also does not scale well, consider using {@link showHover} when showing hovers + * for many elements. + * + * @param hoverDelegate The hover delegate containing hooks and configuration for the hover. + * @param targetElement The target element to show the hover for. + * @param content The content of the hover or a factory that creates it at the time it's shown. + * @param options Additional options for the managed hover. + */ + // TODO: The hoverDelegate parameter should be removed in favor of just a set of options. This + // will avoid confusion around IHoverDelegate/IHoverDelegate2 as well as align more with + // the design of the hover service. + // TODO: Align prototype closer to showHover, deriving options from IHoverOptions if possible. + setupManagedHover(hoverDelegate: IHoverDelegate, targetElement: HTMLElement, content: IManagedHoverContentOrFactory, options?: IManagedHoverOptions): IManagedHover; /** * Shows the hover for the given element if one has been setup. + * + * @param targetElement The target element of the hover, as set up in {@link setupManagedHover}. */ - triggerUpdatableHover(htmlElement: HTMLElement): void; + showManagedHover(targetElement: HTMLElement): void; } export interface IHoverWidget extends IDisposable { + /** + * Whether the hover widget has been disposed. + */ readonly isDisposed: boolean; } @@ -238,24 +259,23 @@ export interface IHoverTarget extends IDisposable { y?: number; } -// #region Updatable hover +// #region Managed hover -export interface IUpdatableHoverTooltipMarkdownString { +export interface IManagedHoverTooltipMarkdownString { markdown: IMarkdownString | string | undefined | ((token: CancellationToken) => Promise); markdownNotSupportedFallback: string | undefined; } -export type IUpdatableHoverContent = string | IUpdatableHoverTooltipMarkdownString | HTMLElement | undefined; -export type IUpdatableHoverContentOrFactory = IUpdatableHoverContent | (() => IUpdatableHoverContent); +export type IManagedHoverContent = string | IManagedHoverTooltipMarkdownString | HTMLElement | undefined; +export type IManagedHoverContentOrFactory = IManagedHoverContent | (() => IManagedHoverContent); -export interface IUpdatableHoverOptions { +export interface IManagedHoverOptions { actions?: IHoverAction[]; linkHandler?(url: string): void; trapFocus?: boolean; } -export interface IUpdatableHover extends IDisposable { - +export interface IManagedHover extends IDisposable { /** * Allows to programmatically open the hover. */ @@ -269,7 +289,7 @@ export interface IUpdatableHover extends IDisposable { /** * Updates the contents of the hover. */ - update(tooltip: IUpdatableHoverContent, options?: IUpdatableHoverOptions): void; + update(tooltip: IManagedHoverContent, options?: IManagedHoverOptions): void; } -// #endregion Updatable hover +// #endregion Managed hover diff --git a/src/vs/base/browser/ui/hover/hoverDelegate.ts b/src/vs/base/browser/ui/hover/hoverDelegate.ts index d2f1d7884ffda..47ea1b7753172 100644 --- a/src/vs/base/browser/ui/hover/hoverDelegate.ts +++ b/src/vs/base/browser/ui/hover/hoverDelegate.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import type { IHoverWidget, IUpdatableHoverOptions } from 'vs/base/browser/ui/hover/hover'; +import type { IHoverWidget, IManagedHoverOptions } from 'vs/base/browser/ui/hover/hover'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -13,7 +13,7 @@ export interface IHoverDelegateTarget extends IDisposable { x?: number; } -export interface IHoverDelegateOptions extends IUpdatableHoverOptions { +export interface IHoverDelegateOptions extends IManagedHoverOptions { /** * The content to display in the primary section of the hover. The type of text determines the * default `hideOnHover` behavior. diff --git a/src/vs/base/browser/ui/hover/hoverDelegate2.ts b/src/vs/base/browser/ui/hover/hoverDelegate2.ts index 13a379222c1e8..1d6a312f70d43 100644 --- a/src/vs/base/browser/ui/hover/hoverDelegate2.ts +++ b/src/vs/base/browser/ui/hover/hoverDelegate2.ts @@ -9,8 +9,8 @@ let baseHoverDelegate: IHoverDelegate2 = { showHover: () => undefined, hideHover: () => undefined, showAndFocusLastHover: () => undefined, - setupUpdatableHover: () => null!, - triggerUpdatableHover: () => undefined + setupManagedHover: () => null!, + showManagedHover: () => undefined }; /** diff --git a/src/vs/base/browser/ui/iconLabel/iconLabel.ts b/src/vs/base/browser/ui/iconLabel/iconLabel.ts index 214af03716cf0..e761b71228e58 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabel.ts @@ -12,7 +12,7 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { equals } from 'vs/base/common/objects'; import { Range } from 'vs/base/common/range'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -import type { IUpdatableHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { isString } from 'vs/base/common/types'; import { stripIcons } from 'vs/base/common/iconLabels'; @@ -26,8 +26,8 @@ export interface IIconLabelCreationOptions { } export interface IIconLabelValueOptions { - title?: string | IUpdatableHoverTooltipMarkdownString; - descriptionTitle?: string | IUpdatableHoverTooltipMarkdownString; + title?: string | IManagedHoverTooltipMarkdownString; + descriptionTitle?: string | IManagedHoverTooltipMarkdownString; suffix?: string; hideIcon?: boolean; extraClasses?: readonly string[]; @@ -194,7 +194,7 @@ export class IconLabel extends Disposable { } } - private setupHover(htmlElement: HTMLElement, tooltip: string | IUpdatableHoverTooltipMarkdownString | undefined): void { + private setupHover(htmlElement: HTMLElement, tooltip: string | IManagedHoverTooltipMarkdownString | undefined): void { const previousCustomHover = this.customHovers.get(htmlElement); if (previousCustomHover) { previousCustomHover.dispose(); @@ -207,7 +207,7 @@ export class IconLabel extends Disposable { } if (this.hoverDelegate.showNativeHover) { - function setupNativeHover(htmlElement: HTMLElement, tooltip: string | IUpdatableHoverTooltipMarkdownString | undefined): void { + function setupNativeHover(htmlElement: HTMLElement, tooltip: string | IManagedHoverTooltipMarkdownString | undefined): void { if (isString(tooltip)) { // Icons don't render in the native hover so we strip them out htmlElement.title = stripIcons(tooltip); @@ -219,7 +219,7 @@ export class IconLabel extends Disposable { } setupNativeHover(htmlElement, tooltip); } else { - const hoverDisposable = getBaseLayerHoverDelegate().setupUpdatableHover(this.hoverDelegate, htmlElement, tooltip); + const hoverDisposable = getBaseLayerHoverDelegate().setupManagedHover(this.hoverDelegate, htmlElement, tooltip); if (hoverDisposable) { this.customHovers.set(htmlElement, hoverDisposable); } diff --git a/src/vs/base/browser/ui/iconLabel/simpleIconLabel.ts b/src/vs/base/browser/ui/iconLabel/simpleIconLabel.ts index 6f960b8add0f6..ea8179ad642fc 100644 --- a/src/vs/base/browser/ui/iconLabel/simpleIconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/simpleIconLabel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { reset } from 'vs/base/browser/dom'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; @@ -12,7 +12,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; export class SimpleIconLabel implements IDisposable { - private hover?: IUpdatableHover; + private hover?: IManagedHover; constructor( private readonly _container: HTMLElement @@ -24,7 +24,7 @@ export class SimpleIconLabel implements IDisposable { set title(title: string) { if (!this.hover && title) { - this.hover = getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this._container, title); + this.hover = getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this._container, title); } else if (this.hover) { this.hover.update(title); } diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index e4215ad76422b..870afb65c0a92 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -11,7 +11,7 @@ import { MarkdownRenderOptions } from 'vs/base/browser/markdownRenderer'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import * as aria from 'vs/base/browser/ui/aria/aria'; import { AnchorAlignment, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; @@ -114,7 +114,7 @@ export class InputBox extends Widget { private cachedContentHeight: number | undefined; private maxHeight: number = Number.POSITIVE_INFINITY; private scrollableElement: ScrollableElement | undefined; - private hover: IUpdatableHover | undefined; + private hover: IManagedHover | undefined; private _onDidChange = this._register(new Emitter()); public readonly onDidChange: Event = this._onDidChange.event; @@ -235,7 +235,7 @@ export class InputBox extends Widget { public setTooltip(tooltip: string): void { this.tooltip = tooltip; if (!this.hover) { - this.hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.input, tooltip)); + this.hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.input, tooltip)); } else { this.hover.update(tooltip); } diff --git a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts index b6c8e1e4db1f9..189317b48e84d 100644 --- a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts +++ b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { UILabelProvider } from 'vs/base/common/keybindingLabels'; @@ -61,7 +61,7 @@ export class KeybindingLabel extends Disposable { private readonly keyElements = new Set(); - private hover: IUpdatableHover; + private hover: IManagedHover; private keybinding: ResolvedKeybinding | undefined; private matches: Matches | undefined; private didEverRender: boolean; @@ -78,7 +78,7 @@ export class KeybindingLabel extends Disposable { this.domNode.style.color = labelForeground; } - this.hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.domNode, '')); + this.hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.domNode, '')); this.didEverRender = false; container.appendChild(this.domNode); diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index dba0132e89c45..64bdfa22cb4a5 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -9,7 +9,7 @@ import { IContentActionHandler } from 'vs/base/browser/formattedTextRenderer'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { renderMarkdown } from 'vs/base/browser/markdownRenderer'; import { AnchorPosition, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IListEvent, IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; @@ -104,7 +104,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi private selectionDetailsPane!: HTMLElement; private _skipLayout: boolean = false; private _cachedMaxDetailsHeight?: number; - private _hover?: IUpdatableHover; + private _hover?: IManagedHover; private _sticky: boolean = false; // for dev purposes only @@ -153,7 +153,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi private setTitle(title: string): void { if (!this._hover && title) { - this._hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.selectElement, title)); + this._hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.selectElement, title)); } else if (this._hover) { this._hover.update(title); } diff --git a/src/vs/base/browser/ui/table/tableWidget.ts b/src/vs/base/browser/ui/table/tableWidget.ts index 631c0015d4b8f..b2c8959c3c510 100644 --- a/src/vs/base/browser/ui/table/tableWidget.ts +++ b/src/vs/base/browser/ui/table/tableWidget.ts @@ -134,7 +134,7 @@ class ColumnHeader extends Disposable implements IView { this.element = $('.monaco-table-th', { 'data-col-index': index }, column.label); if (column.tooltip) { - this._register(getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.element, column.tooltip)); + this._register(getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('mouse'), this.element, column.tooltip)); } } diff --git a/src/vs/base/browser/ui/toggle/toggle.ts b/src/vs/base/browser/ui/toggle/toggle.ts index a52c00287d204..c141f381fb349 100644 --- a/src/vs/base/browser/ui/toggle/toggle.ts +++ b/src/vs/base/browser/ui/toggle/toggle.ts @@ -15,7 +15,7 @@ import 'vs/css!./toggle'; import { isActiveElement, $, addDisposableListener, EventType } from 'vs/base/browser/dom'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; export interface IToggleOpts extends IToggleStyles { @@ -113,7 +113,7 @@ export class Toggle extends Widget { readonly domNode: HTMLElement; private _checked: boolean; - private _hover: IUpdatableHover; + private _hover: IManagedHover; constructor(opts: IToggleOpts) { super(); @@ -134,7 +134,7 @@ export class Toggle extends Widget { } this.domNode = document.createElement('div'); - this._hover = this._register(getBaseLayerHoverDelegate().setupUpdatableHover(opts.hoverDelegate ?? getDefaultHoverDelegate('mouse'), this.domNode, this._opts.title)); + this._hover = this._register(getBaseLayerHoverDelegate().setupManagedHover(opts.hoverDelegate ?? getDefaultHoverDelegate('mouse'), this.domNode, this._opts.title)); this.domNode.classList.add(...classes); if (!this._opts.notFocusable) { this.domNode.tabIndex = 0; diff --git a/src/vs/editor/browser/services/hoverService/hoverService.ts b/src/vs/editor/browser/services/hoverService/hoverService.ts index 0c554ca039ebc..20faf6cfa8ce2 100644 --- a/src/vs/editor/browser/services/hoverService/hoverService.ts +++ b/src/vs/editor/browser/services/hoverService/hoverService.ts @@ -20,9 +20,9 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { mainWindow } from 'vs/base/browser/window'; import { ContextViewHandler } from 'vs/platform/contextview/browser/contextViewService'; -import type { IHoverOptions, IHoverWidget, IUpdatableHover, IUpdatableHoverContentOrFactory, IUpdatableHoverOptions } from 'vs/base/browser/ui/hover/hover'; +import type { IHoverOptions, IHoverWidget, IManagedHover, IManagedHoverContentOrFactory, IManagedHoverOptions } from 'vs/base/browser/ui/hover/hover'; import type { IHoverDelegate, IHoverDelegateTarget } from 'vs/base/browser/ui/hover/hoverDelegate'; -import { UpdatableHoverWidget } from 'vs/editor/browser/services/hoverService/updatableHoverWidget'; +import { ManagedHoverWidget } from 'vs/editor/browser/services/hoverService/updatableHoverWidget'; import { TimeoutTimer } from 'vs/base/common/async'; export class HoverService extends Disposable implements IHoverService { @@ -189,22 +189,22 @@ export class HoverService extends Disposable implements IHoverService { } } - private readonly _existingHovers = new Map(); + private readonly _managedHovers = new Map(); // TODO: Investigate performance of this function. There seems to be a lot of content created // and thrown away on start up - setupUpdatableHover(hoverDelegate: IHoverDelegate, htmlElement: HTMLElement, content: IUpdatableHoverContentOrFactory, options?: IUpdatableHoverOptions | undefined): IUpdatableHover { + setupManagedHover(hoverDelegate: IHoverDelegate, targetElement: HTMLElement, content: IManagedHoverContentOrFactory, options?: IManagedHoverOptions | undefined): IManagedHover { - htmlElement.setAttribute('custom-hover', 'true'); + targetElement.setAttribute('custom-hover', 'true'); - if (htmlElement.title !== '') { + if (targetElement.title !== '') { console.warn('HTML element already has a title attribute, which will conflict with the custom hover. Please remove the title attribute.'); - console.trace('Stack trace:', htmlElement.title); - htmlElement.title = ''; + console.trace('Stack trace:', targetElement.title); + targetElement.title = ''; } let hoverPreparation: IDisposable | undefined; - let hoverWidget: UpdatableHoverWidget | undefined; + let hoverWidget: ManagedHoverWidget | undefined; const hideHover = (disposeWidget: boolean, disposePreparation: boolean) => { const hadHover = hoverWidget !== undefined; @@ -225,23 +225,23 @@ export class HoverService extends Disposable implements IHoverService { const triggerShowHover = (delay: number, focus?: boolean, target?: IHoverDelegateTarget, trapFocus?: boolean) => { return new TimeoutTimer(async () => { if (!hoverWidget || hoverWidget.isDisposed) { - hoverWidget = new UpdatableHoverWidget(hoverDelegate, target || htmlElement, delay > 0); + hoverWidget = new ManagedHoverWidget(hoverDelegate, target || targetElement, delay > 0); await hoverWidget.update(typeof content === 'function' ? content() : content, focus, { ...options, trapFocus }); } }, delay); }; let isMouseDown = false; - const mouseDownEmitter = addDisposableListener(htmlElement, EventType.MOUSE_DOWN, () => { + const mouseDownEmitter = addDisposableListener(targetElement, EventType.MOUSE_DOWN, () => { isMouseDown = true; hideHover(true, true); }, true); - const mouseUpEmitter = addDisposableListener(htmlElement, EventType.MOUSE_UP, () => { + const mouseUpEmitter = addDisposableListener(targetElement, EventType.MOUSE_UP, () => { isMouseDown = false; }, true); - const mouseLeaveEmitter = addDisposableListener(htmlElement, EventType.MOUSE_LEAVE, (e: MouseEvent) => { + const mouseLeaveEmitter = addDisposableListener(targetElement, EventType.MOUSE_LEAVE, (e: MouseEvent) => { isMouseDown = false; - hideHover(false, (e).fromElement === htmlElement); + hideHover(false, (e).fromElement === targetElement); }, true); const onMouseOver = (e: MouseEvent) => { @@ -252,53 +252,53 @@ export class HoverService extends Disposable implements IHoverService { const toDispose: DisposableStore = new DisposableStore(); const target: IHoverDelegateTarget = { - targetElements: [htmlElement], + targetElements: [targetElement], dispose: () => { } }; if (hoverDelegate.placement === undefined || hoverDelegate.placement === 'mouse') { // track the mouse position const onMouseMove = (e: MouseEvent) => { target.x = e.x + 10; - if ((isHTMLElement(e.target)) && getHoverTargetElement(e.target, htmlElement) !== htmlElement) { + if ((isHTMLElement(e.target)) && getHoverTargetElement(e.target, targetElement) !== targetElement) { hideHover(true, true); } }; - toDispose.add(addDisposableListener(htmlElement, EventType.MOUSE_MOVE, onMouseMove, true)); + toDispose.add(addDisposableListener(targetElement, EventType.MOUSE_MOVE, onMouseMove, true)); } hoverPreparation = toDispose; - if ((isHTMLElement(e.target)) && getHoverTargetElement(e.target as HTMLElement, htmlElement) !== htmlElement) { + if ((isHTMLElement(e.target)) && getHoverTargetElement(e.target as HTMLElement, targetElement) !== targetElement) { return; // Do not show hover when the mouse is over another hover target } toDispose.add(triggerShowHover(hoverDelegate.delay, false, target)); }; - const mouseOverDomEmitter = addDisposableListener(htmlElement, EventType.MOUSE_OVER, onMouseOver, true); + const mouseOverDomEmitter = addDisposableListener(targetElement, EventType.MOUSE_OVER, onMouseOver, true); const onFocus = () => { if (isMouseDown || hoverPreparation) { return; } const target: IHoverDelegateTarget = { - targetElements: [htmlElement], + targetElements: [targetElement], dispose: () => { } }; const toDispose: DisposableStore = new DisposableStore(); const onBlur = () => hideHover(true, true); - toDispose.add(addDisposableListener(htmlElement, EventType.BLUR, onBlur, true)); + toDispose.add(addDisposableListener(targetElement, EventType.BLUR, onBlur, true)); toDispose.add(triggerShowHover(hoverDelegate.delay, false, target)); hoverPreparation = toDispose; }; // Do not show hover when focusing an input or textarea let focusDomEmitter: undefined | IDisposable; - const tagName = htmlElement.tagName.toLowerCase(); + const tagName = targetElement.tagName.toLowerCase(); if (tagName !== 'input' && tagName !== 'textarea') { - focusDomEmitter = addDisposableListener(htmlElement, EventType.FOCUS, onFocus, true); + focusDomEmitter = addDisposableListener(targetElement, EventType.FOCUS, onFocus, true); } - const hover: IUpdatableHover = { + const hover: IManagedHover = { show: focus => { hideHover(false, true); // terminate a ongoing mouse over preparation triggerShowHover(0, focus, undefined, focus); // show hover immediately @@ -311,7 +311,7 @@ export class HoverService extends Disposable implements IHoverService { await hoverWidget?.update(content, undefined, hoverOptions); }, dispose: () => { - this._existingHovers.delete(htmlElement); + this._managedHovers.delete(targetElement); mouseOverDomEmitter.dispose(); mouseLeaveEmitter.dispose(); mouseDownEmitter.dispose(); @@ -320,19 +320,19 @@ export class HoverService extends Disposable implements IHoverService { hideHover(true, true); } }; - this._existingHovers.set(htmlElement, hover); + this._managedHovers.set(targetElement, hover); return hover; } - triggerUpdatableHover(target: HTMLElement): void { - const hover = this._existingHovers.get(target); + showManagedHover(target: HTMLElement): void { + const hover = this._managedHovers.get(target); if (hover) { hover.show(true); } } public override dispose(): void { - this._existingHovers.forEach(hover => hover.dispose()); + this._managedHovers.forEach(hover => hover.dispose()); super.dispose(); } } diff --git a/src/vs/editor/browser/services/hoverService/updatableHoverWidget.ts b/src/vs/editor/browser/services/hoverService/updatableHoverWidget.ts index 3b746de6f43c4..cf9b355831f8b 100644 --- a/src/vs/editor/browser/services/hoverService/updatableHoverWidget.ts +++ b/src/vs/editor/browser/services/hoverService/updatableHoverWidget.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { isHTMLElement } from 'vs/base/browser/dom'; -import type { IHoverWidget, IUpdatableHoverContent, IUpdatableHoverOptions } from 'vs/base/browser/ui/hover/hover'; +import type { IHoverWidget, IManagedHoverContent, IManagedHoverOptions } from 'vs/base/browser/ui/hover/hover'; import type { IHoverDelegate, IHoverDelegateOptions, IHoverDelegateTarget } from 'vs/base/browser/ui/hover/hoverDelegate'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; @@ -13,9 +13,9 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { isFunction, isString } from 'vs/base/common/types'; import { localize } from 'vs/nls'; -type IUpdatableHoverResolvedContent = IMarkdownString | string | HTMLElement | undefined; +type IManagedHoverResolvedContent = IMarkdownString | string | HTMLElement | undefined; -export class UpdatableHoverWidget implements IDisposable { +export class ManagedHoverWidget implements IDisposable { private _hoverWidget: IHoverWidget | undefined; private _cancellationTokenSource: CancellationTokenSource | undefined; @@ -23,7 +23,7 @@ export class UpdatableHoverWidget implements IDisposable { constructor(private hoverDelegate: IHoverDelegate, private target: IHoverDelegateTarget | HTMLElement, private fadeInAnimation: boolean) { } - async update(content: IUpdatableHoverContent, focus?: boolean, options?: IUpdatableHoverOptions): Promise { + async update(content: IManagedHoverContent, focus?: boolean, options?: IManagedHoverOptions): Promise { if (this._cancellationTokenSource) { // there's an computation ongoing, cancel it this._cancellationTokenSource.dispose(true); @@ -64,7 +64,7 @@ export class UpdatableHoverWidget implements IDisposable { this.show(resolvedContent, focus, options); } - private show(content: IUpdatableHoverResolvedContent, focus?: boolean, options?: IUpdatableHoverOptions): void { + private show(content: IManagedHoverResolvedContent, focus?: boolean, options?: IManagedHoverOptions): void { const oldHoverWidget = this._hoverWidget; if (this.hasContent(content)) { @@ -86,7 +86,7 @@ export class UpdatableHoverWidget implements IDisposable { oldHoverWidget?.dispose(); } - private hasContent(content: IUpdatableHoverResolvedContent): content is NonNullable { + private hasContent(content: IManagedHoverResolvedContent): content is NonNullable { if (!content) { return false; } diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 30c36379c65c2..9645d4b54ba9e 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -1343,7 +1343,7 @@ export class SimpleButton extends Widget { this._domNode.className = className; this._domNode.setAttribute('role', 'button'); this._domNode.setAttribute('aria-label', this._opts.label); - this._register(hoverService.setupUpdatableHover(opts.hoverDelegate ?? getDefaultHoverDelegate('element'), this._domNode, this._opts.label)); + this._register(hoverService.setupManagedHover(opts.hoverDelegate ?? getDefaultHoverDelegate('element'), this._domNode, this._opts.label)); this.onclick(this._domNode, (e) => { this._opts.onTrigger(); diff --git a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts index 1adf0bbe0b8d4..7bc9ae9985e92 100644 --- a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts @@ -324,7 +324,7 @@ class MarkdownRenderedHoverParts extends Disposable { const actionElement = dom.append(container, $(ThemeIcon.asCSSSelector(isActionIncrease ? increaseHoverVerbosityIcon : decreaseHoverVerbosityIcon))); actionElement.tabIndex = 0; const hoverDelegate = new WorkbenchHoverDelegate('mouse', false, { target: container, position: { hoverPosition: HoverPosition.LEFT } }, this._configurationService, this._hoverService); - store.add(this._hoverService.setupUpdatableHover(hoverDelegate, actionElement, labelForHoverVerbosityAction(this._keybindingService, action))); + store.add(this._hoverService.setupManagedHover(hoverDelegate, actionElement, labelForHoverVerbosityAction(this._keybindingService, action))); if (!actionEnabled) { actionElement.classList.add('disabled'); return store; diff --git a/src/vs/editor/contrib/rename/browser/renameWidget.ts b/src/vs/editor/contrib/rename/browser/renameWidget.ts index 03257f28aa3ab..fc1c165a90d39 100644 --- a/src/vs/editor/contrib/rename/browser/renameWidget.ts +++ b/src/vs/editor/contrib/rename/browser/renameWidget.ts @@ -6,7 +6,7 @@ import * as dom from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import * as aria from 'vs/base/browser/ui/aria/aria'; -import { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getBaseLayerHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate2'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; @@ -900,7 +900,7 @@ class InputWithButton implements IDisposable { private _domNode: HTMLDivElement | undefined; private _inputNode: HTMLInputElement | undefined; private _buttonNode: HTMLElement | undefined; - private _buttonHover: IUpdatableHover | undefined; + private _buttonHover: IManagedHover | undefined; private _buttonGenHoverText: string | undefined; private _buttonCancelHoverText: string | undefined; private _sparkleIcon: HTMLElement | undefined; @@ -934,7 +934,7 @@ class InputWithButton implements IDisposable { this._buttonGenHoverText = nls.localize('generateRenameSuggestionsButton', "Generate new name suggestions"); this._buttonCancelHoverText = nls.localize('cancelRenameSuggestionsButton', "Cancel"); - this._buttonHover = getBaseLayerHoverDelegate().setupUpdatableHover(getDefaultHoverDelegate('element'), this._buttonNode, this._buttonGenHoverText); + this._buttonHover = getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate('element'), this._buttonNode, this._buttonGenHoverText); this._disposables.add(this._buttonHover); this._domNode.appendChild(this._buttonNode); diff --git a/src/vs/platform/actions/browser/buttonbar.ts b/src/vs/platform/actions/browser/buttonbar.ts index 165caec0bf1f4..c8d858d4677ba 100644 --- a/src/vs/platform/actions/browser/buttonbar.ts +++ b/src/vs/platform/actions/browser/buttonbar.ts @@ -122,7 +122,7 @@ export class WorkbenchButtonBar extends ButtonBar { } else { tooltip = action.label; } - this._updateStore.add(this._hoverService.setupUpdatableHover(hoverDelegate, btn.element, tooltip)); + this._updateStore.add(this._hoverService.setupManagedHover(hoverDelegate, btn.element, tooltip)); this._updateStore.add(btn.onDidClick(async () => { this._actionRunner.run(action); })); diff --git a/src/vs/platform/hover/test/browser/nullHoverService.ts b/src/vs/platform/hover/test/browser/nullHoverService.ts index 6b7b728325b6b..44c73f8a0a69d 100644 --- a/src/vs/platform/hover/test/browser/nullHoverService.ts +++ b/src/vs/platform/hover/test/browser/nullHoverService.ts @@ -10,7 +10,7 @@ export const NullHoverService: IHoverService = { _serviceBrand: undefined, hideHover: () => undefined, showHover: () => undefined, - setupUpdatableHover: () => Disposable.None as any, + setupManagedHover: () => Disposable.None as any, showAndFocusLastHover: () => undefined, - triggerUpdatableHover: () => undefined + showManagedHover: () => undefined }; diff --git a/src/vs/platform/opener/browser/link.ts b/src/vs/platform/opener/browser/link.ts index 710292ef17de5..eb93b66a122c2 100644 --- a/src/vs/platform/opener/browser/link.ts +++ b/src/vs/platform/opener/browser/link.ts @@ -14,7 +14,7 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import 'vs/css!./link'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; export interface ILinkDescriptor { @@ -33,7 +33,7 @@ export interface ILinkOptions { export class Link extends Disposable { private el: HTMLAnchorElement; - private hover?: IUpdatableHover; + private hover?: IManagedHover; private hoverDelegate: IHoverDelegate; private _enabled: boolean = true; @@ -131,7 +131,7 @@ export class Link extends Disposable { if (this.hoverDelegate.showNativeHover) { this.el.title = title ?? ''; } else if (!this.hover && title) { - this.hover = this._register(this._hoverService.setupUpdatableHover(this.hoverDelegate, this.el, title)); + this.hover = this._register(this._hoverService.setupManagedHover(this.hoverDelegate, this.el, title)); } else if (this.hover) { this.hover.update(title); } diff --git a/src/vs/platform/quickinput/browser/quickInputTree.ts b/src/vs/platform/quickinput/browser/quickInputTree.ts index dc3527c39129c..c65ad7ef4d750 100644 --- a/src/vs/platform/quickinput/browser/quickInputTree.ts +++ b/src/vs/platform/quickinput/browser/quickInputTree.ts @@ -36,7 +36,7 @@ import { ltrim } from 'vs/base/common/strings'; import { RenderIndentGuides } from 'vs/base/browser/ui/tree/abstractTree'; import { ThrottledDelayer } from 'vs/base/common/async'; import { isCancellationError } from 'vs/base/common/errors'; -import type { IHoverWidget, IUpdatableHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import type { IHoverWidget, IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { QuickPickFocus } from '../common/quickInput'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; @@ -434,7 +434,7 @@ class QuickPickItemElementRenderer extends BaseQuickInputListRenderer extends Part { const titleContainer = append(parent, $('.title-label')); const titleLabel = append(titleContainer, $('h2')); this.titleLabelElement = titleLabel; - const hover = this._register(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), titleLabel, '')); + const hover = this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), titleLabel, '')); const $this = this; return { diff --git a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts index 65ad1afe6cc09..c1fda244291e9 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts @@ -30,7 +30,7 @@ import { defaultButtonStyles, defaultProgressBarStyles } from 'vs/platform/theme import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; export class NotificationsListDelegate implements IListVirtualDelegate { @@ -379,14 +379,14 @@ export class NotificationTemplateRenderer extends Disposable { this.renderSeverity(notification); // Message - const messageCustomHover = this.inputDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.template.message, '')); + const messageCustomHover = this.inputDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.template.message, '')); const messageOverflows = this.renderMessage(notification, messageCustomHover); // Secondary Actions this.renderSecondaryActions(notification, messageOverflows); // Source - const sourceCustomHover = this.inputDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.template.source, '')); + const sourceCustomHover = this.inputDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.template.source, '')); this.renderSource(notification, sourceCustomHover); // Buttons @@ -424,7 +424,7 @@ export class NotificationTemplateRenderer extends Disposable { this.template.icon.classList.add(...ThemeIcon.asClassNameArray(this.toSeverityIcon(notification.severity))); } - private renderMessage(notification: INotificationViewItem, customHover: IUpdatableHover): boolean { + private renderMessage(notification: INotificationViewItem, customHover: IManagedHover): boolean { clearNode(this.template.message); this.template.message.appendChild(NotificationMessageRenderer.render(notification.message, { callback: link => this.openerService.open(URI.parse(link), { allowCommands: true }), @@ -474,7 +474,7 @@ export class NotificationTemplateRenderer extends Disposable { actions.forEach(action => this.template.toolbar.push(action, { icon: true, label: false, keybinding: this.getKeybindingLabel(action) })); } - private renderSource(notification: INotificationViewItem, sourceCustomHover: IUpdatableHover): void { + private renderSource(notification: INotificationViewItem, sourceCustomHover: IManagedHover): void { if (notification.expanded && notification.source) { this.template.source.textContent = localize('notificationSource', "Source: {0}", notification.source); sourceCustomHover.update(notification.source); diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts index dd412fa30f9ea..d458ce91e7918 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts @@ -24,7 +24,7 @@ import { spinningLoading, syncing } from 'vs/platform/theme/common/iconRegistry' import { isMarkdownString, markdownStringEqual } from 'vs/base/common/htmlContent'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; import { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; export class StatusbarEntryItem extends Disposable { @@ -42,7 +42,7 @@ export class StatusbarEntryItem extends Disposable { private readonly focusListener = this._register(new MutableDisposable()); private readonly focusOutListener = this._register(new MutableDisposable()); - private hover: IUpdatableHover | undefined = undefined; + private hover: IManagedHover | undefined = undefined; readonly labelContainer: HTMLElement; readonly beakContainer: HTMLElement; @@ -122,7 +122,7 @@ export class StatusbarEntryItem extends Disposable { if (this.hover) { this.hover.update(hoverContents); } else { - this.hover = this._register(this.hoverService.setupUpdatableHover(this.hoverDelegate, this.container, hoverContents)); + this.hover = this._register(this.hoverService.setupManagedHover(this.hoverDelegate, this.container, hoverContents)); } if (entry.command !== ShowTooltipCommand /* prevents flicker on click */) { this.focusListener.value = addDisposableListener(this.labelContainer, EventType.FOCUS, e => { diff --git a/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts b/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts index 59b379f497d60..88d5435936b9a 100644 --- a/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts @@ -96,7 +96,7 @@ class CommandCenterCenterViewItem extends BaseActionViewItem { container.classList.add('command-center-center'); container.classList.toggle('multiple', (this._submenu.actions.length > 1)); - const hover = this._store.add(this._hoverService.setupUpdatableHover(this._hoverDelegate, container, this.getTooltip())); + const hover = this._store.add(this._hoverService.setupManagedHover(this._hoverDelegate, container, this.getTooltip())); // update label & tooltip when window title changes this._store.add(this._windowTitle.onDidChange(() => { @@ -157,7 +157,7 @@ class CommandCenterCenterViewItem extends BaseActionViewItem { labelElement.innerText = label; reset(container, searchIcon, labelElement); - const hover = this._store.add(that._hoverService.setupUpdatableHover(that._hoverDelegate, container, this.getTooltip())); + const hover = this._store.add(that._hoverService.setupManagedHover(that._hoverDelegate, container, this.getTooltip())); // update label & tooltip when window title changes this._store.add(that._windowTitle.onDidChange(() => { diff --git a/src/vs/workbench/browser/parts/views/checkbox.ts b/src/vs/workbench/browser/parts/views/checkbox.ts index 4d782bddafd2c..f428de9bffea5 100644 --- a/src/vs/workbench/browser/parts/views/checkbox.ts +++ b/src/vs/workbench/browser/parts/views/checkbox.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; import { Toggle } from 'vs/base/browser/ui/toggle/toggle'; import { Codicon } from 'vs/base/common/codicons'; @@ -28,7 +28,7 @@ export class TreeItemCheckbox extends Disposable { public toggle: Toggle | undefined; private checkboxContainer: HTMLDivElement; public isDisposed = false; - private hover: IUpdatableHover | undefined; + private hover: IManagedHover | undefined; public static readonly checkboxClass = 'custom-view-tree-node-item-checkbox'; @@ -87,7 +87,7 @@ export class TreeItemCheckbox extends Disposable { private setHover(checkbox: ITreeItemCheckboxState) { if (this.toggle) { if (!this.hover) { - this.hover = this._register(this.hoverService.setupUpdatableHover(this.hoverDelegate, this.toggle.domNode, this.checkboxHoverContent(checkbox))); + this.hover = this._register(this.hoverService.setupManagedHover(this.hoverDelegate, this.toggle.domNode, this.checkboxHoverContent(checkbox))); } else { this.hover.update(checkbox.tooltip); } diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index db78e940c5d92..bf227c9911e56 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -70,7 +70,7 @@ import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUti import { ITreeViewsDnDService } from 'vs/editor/common/services/treeViewsDndService'; import { DraggedTreeItemsIdentifier } from 'vs/editor/common/services/treeViewsDnd'; import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; -import type { IUpdatableHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { parseLinkedText } from 'vs/base/common/linkedText'; import { Button } from 'vs/base/browser/ui/button/button'; import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; @@ -1202,7 +1202,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer IChatAgentData | undefined, commandService: ICommandService): IUpdatableHoverOptions { +export function getChatAgentHoverOptions(getAgent: () => IChatAgentData | undefined, commandService: ICommandService): IManagedHoverOptions { return { actions: [ { diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 6e29cb908748c..d8b214f01d4f1 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -316,7 +316,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer isResponseVM(template.currentElement) ? template.currentElement.agent : undefined, this.commandService); - templateDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('element'), user, hoverContent, hoverOptions)); + templateDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), user, hoverContent, hoverOptions)); templateDisposables.add(dom.addDisposableListener(user, dom.EventType.KEY_DOWN, e => { const ev = new StandardKeyboardEvent(e); if (ev.equals(KeyCode.Space) || ev.equals(KeyCode.Enter)) { diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts index 25c4ac91e44bd..f58b706280971 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts @@ -177,7 +177,7 @@ export class ChatMarkdownDecorationsRenderer { const agent = this.chatAgentService.getAgent(args.agentId); const hover: Lazy = new Lazy(() => store.add(this.instantiationService.createInstance(ChatAgentHover))); - store.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('element'), container, () => { + store.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), container, () => { hover.value.setAgent(args.agentId); return hover.value.domNode; }, agent && getChatAgentHoverOptions(() => agent, this.commandService))); diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index 3093ac9cbc68d..2402e2e7e29c2 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -370,7 +370,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { anchor.style.cursor = 'pointer'; const id = keybindingsLookup.shift(); const title = id && this.keybindingService.lookupKeybinding(id)?.getLabel(); - hintHandler.disposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), anchor, title ?? '')); + hintHandler.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), anchor, title ?? '')); } return { hintElement, ariaLabel }; diff --git a/src/vs/workbench/contrib/comments/browser/commentReply.ts b/src/vs/workbench/contrib/comments/browser/commentReply.ts index 9c9c8e24e5055..bf0506f3b01a9 100644 --- a/src/vs/workbench/contrib/comments/browser/commentReply.ts +++ b/src/vs/workbench/contrib/comments/browser/commentReply.ts @@ -368,7 +368,7 @@ export class CommentReply extends Disposable { private createReplyButton(commentEditor: ICodeEditor, commentForm: HTMLElement) { this._reviewThreadReplyButton = dom.append(commentForm, dom.$(`button.review-thread-reply-button.${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`)); - this._register(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this._reviewThreadReplyButton, this._commentOptions?.prompt || nls.localize('reply', "Reply..."))); + this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this._reviewThreadReplyButton, this._commentOptions?.prompt || nls.localize('reply', "Reply..."))); this._reviewThreadReplyButton.textContent = this._commentOptions?.prompt || nls.localize('reply', "Reply..."); // bind click/escape actions for reviewThreadReplyButton and textArea diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts index 6caf357feb613..b527edf7bde3d 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts @@ -303,7 +303,7 @@ export class CommentNodeRenderer implements IListRenderer const renderedComment = this.getRenderedComment(originalComment.comment.body, disposables); templateData.disposables.push(renderedComment); templateData.threadMetadata.commentPreview.appendChild(renderedComment.element.firstElementChild ?? renderedComment.element); - templateData.disposables.push(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), templateData.threadMetadata.commentPreview, renderedComment.element.textContent ?? '')); + templateData.disposables.push(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), templateData.threadMetadata.commentPreview, renderedComment.element.textContent ?? '')); } if (node.element.range) { diff --git a/src/vs/workbench/contrib/comments/browser/timestamp.ts b/src/vs/workbench/contrib/comments/browser/timestamp.ts index 47faa02f1c9ca..583ccaa7963d9 100644 --- a/src/vs/workbench/contrib/comments/browser/timestamp.ts +++ b/src/vs/workbench/contrib/comments/browser/timestamp.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { fromNow } from 'vs/base/common/date'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -18,7 +18,7 @@ export class TimestampWidget extends Disposable { private _timestamp: Date | undefined; private _useRelativeTime: boolean; - private hover: IUpdatableHover; + private hover: IManagedHover; constructor( private configurationService: IConfigurationService, @@ -30,7 +30,7 @@ export class TimestampWidget extends Disposable { this._date = dom.append(container, dom.$('span.timestamp')); this._date.style.display = 'none'; this._useRelativeTime = this.useRelativeTimeSetting; - this.hover = this._register(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this._date, '')); + this.hover = this._register(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this._date, '')); this.setTimestamp(timeStamp); } diff --git a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts index 3546424023ce5..cf8c7a1980a67 100644 --- a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts +++ b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts @@ -109,7 +109,7 @@ export function renderExpressionValue(expressionOrValue: IExpressionValue | stri if (options.hover) { const { store, commands, commandService } = options.hover instanceof DisposableStore ? { store: options.hover, commands: [], commandService: undefined } : options.hover; - store.add(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), container, () => { + store.add(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), container, () => { const container = dom.$('div'); const markdownHoverElement = dom.$('div.hover-row'); const hoverContentsElement = dom.append(markdownHoverElement, dom.$('div.hover-contents')); @@ -228,7 +228,7 @@ export abstract class AbstractExpressionsRenderer implements IT const name = dom.append(expression, $('span.name')); const lazyButton = dom.append(expression, $('span.lazy-button')); lazyButton.classList.add(...ThemeIcon.asClassNameArray(Codicon.eye)); - templateDisposable.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), lazyButton, localize('debug.lazyButton.tooltip', "Click to expand"))); + templateDisposable.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), lazyButton, localize('debug.lazyButton.tooltip', "Click to expand"))); const value = dom.append(expression, $('span.value')); const label = templateDisposable.add(new HighlightedLabel(name)); diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index 4afa61df99c5b..3ca9114d882d2 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -553,7 +553,7 @@ class BreakpointsRenderer implements IListRenderer t.stopped); @@ -671,7 +671,7 @@ class ThreadsRenderer implements ICompressibleTreeRenderer, _index: number, data: IThreadTemplateData): void { const thread = element.element; - data.elementDisposable.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), data.thread, thread.name)); + data.elementDisposable.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), data.thread, thread.name)); data.label.set(thread.name, createMatches(element.filterData)); data.stateLabel.textContent = thread.stateLabel; data.stateLabel.classList.toggle('exception', thread.stoppedDetails?.reason === 'exception'); @@ -756,7 +756,7 @@ class StackFramesRenderer implements ICompressibleTreeRenderer, index: number, data: IErrorTemplateData): void { const error = element.element; data.label.textContent = error; - data.templateDisposable.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), data.label, error)); + data.templateDisposable.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), data.label, error)); } renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: IErrorTemplateData, height: number | undefined): void { diff --git a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts index a4d5c4e74e258..50a1b351fc2b2 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts @@ -78,7 +78,7 @@ export class StartDebugActionViewItem extends BaseActionViewItem { const keybinding = this.keybindingService.lookupKeybinding(this.action.id)?.getLabel(); const keybindingLabel = keybinding ? ` (${keybinding})` : ''; const title = this.action.label + keybindingLabel; - this.toDispose.push(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.start, title)); + this.toDispose.push(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.start, title)); this.start.setAttribute('role', 'button'); this.start.ariaLabel = title; diff --git a/src/vs/workbench/contrib/debug/browser/replViewer.ts b/src/vs/workbench/contrib/debug/browser/replViewer.ts index 500ea4a03b9d4..b2b36204a6794 100644 --- a/src/vs/workbench/contrib/debug/browser/replViewer.ts +++ b/src/vs/workbench/contrib/debug/browser/replViewer.ts @@ -6,7 +6,7 @@ import * as dom from 'vs/base/browser/dom'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; -import { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { CachedListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; @@ -425,7 +425,7 @@ export class ReplAccessibilityProvider implements IListAccessibilityProvider { this.viewsService.openView(EXPLORER_VIEW_ID, true).then(() => this.explorerService.select(location, true)); })); } else { template.resource.parentElement?.classList.remove('clickable'); - this.transientDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), template.resource, location.path)); + this.transientDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), template.resource, location.path)); template.resource.textContent = localize('local extension', "Local Extension"); } } @@ -968,7 +968,7 @@ export class ExtensionEditor extends EditorPane { for (const [label, uri] of resources) { const resource = append(resourcesElement, $('a.resource', { tabindex: '0' }, label)); this.transientDisposables.add(onClick(resource, () => this.openerService.open(uri))); - this.transientDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), resource, uri.toString())); + this.transientDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), resource, uri.toString())); } } } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts index a327cf0df5506..3a92bc9aa69a3 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts @@ -42,7 +42,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { defaultCountBadgeStyles } from 'vs/platform/theme/browser/defaultStyles'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; export abstract class ExtensionWidget extends Disposable implements IExtensionContainer { private _extension: IExtension | null = null; @@ -126,7 +126,7 @@ export class InstallCountWidget extends ExtensionWidget { export class RatingsWidget extends ExtensionWidget { - private readonly containerHover: IUpdatableHover; + private readonly containerHover: IManagedHover; constructor( private container: HTMLElement, @@ -140,7 +140,7 @@ export class RatingsWidget extends ExtensionWidget { container.classList.add('small'); } - this.containerHover = this._register(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), container, '')); + this.containerHover = this._register(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), container, '')); this.render(); } @@ -192,7 +192,7 @@ export class RatingsWidget extends ExtensionWidget { export class VerifiedPublisherWidget extends ExtensionWidget { private readonly disposables = this._register(new DisposableStore()); - private readonly containerHover: IUpdatableHover; + private readonly containerHover: IManagedHover; constructor( private container: HTMLElement, @@ -201,7 +201,7 @@ export class VerifiedPublisherWidget extends ExtensionWidget { @IOpenerService private readonly openerService: IOpenerService, ) { super(); - this.containerHover = this._register(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), container, '')); + this.containerHover = this._register(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), container, '')); this.render(); } @@ -258,7 +258,7 @@ export class SponsorWidget extends ExtensionWidget { } const sponsor = append(this.container, $('span.sponsor.clickable', { tabIndex: 0 })); - this.disposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), sponsor, this.extension?.publisherSponsorLink.toString() ?? '')); + this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), sponsor, this.extension?.publisherSponsorLink.toString() ?? '')); sponsor.setAttribute('role', 'link'); // #132645 const sponsorIconElement = renderIcon(sponsorIcon); const label = $('span', undefined, localize('sponsor', "Sponsor")); @@ -380,7 +380,7 @@ export class RemoteBadgeWidget extends ExtensionWidget { class RemoteBadge extends Disposable { readonly element: HTMLElement; - readonly elementHover: IUpdatableHover; + readonly elementHover: IManagedHover; constructor( private readonly tooltip: boolean, @@ -391,7 +391,7 @@ class RemoteBadge extends Disposable { ) { super(); this.element = $('div.extension-badge.extension-remote-badge'); - this.elementHover = this._register(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.element, '')); + this.elementHover = this._register(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.element, '')); this.render(); } @@ -472,7 +472,7 @@ export class SyncIgnoredWidget extends ExtensionWidget { if (this.extension && this.extension.state === ExtensionState.Installed && this.userDataSyncEnablementService.isEnabled() && this.extensionsWorkbenchService.isExtensionIgnoredToSync(this.extension)) { const element = append(this.container, $('span.extension-sync-ignored' + ThemeIcon.asCSSSelector(syncIgnoredIcon))); - this.disposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), element, localize('syncingore.label', "This extension is ignored during sync."))); + this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), element, localize('syncingore.label', "This extension is ignored during sync."))); element.classList.add(...ThemeIcon.asClassNameArray(syncIgnoredIcon)); } } @@ -545,7 +545,7 @@ export class ExtensionHoverWidget extends ExtensionWidget { render(): void { this.hover.value = undefined; if (this.extension) { - this.hover.value = this.hoverService.setupUpdatableHover({ + this.hover.value = this.hoverService.setupManagedHover({ delay: this.configurationService.getValue('workbench.hover.delay'), showHover: (options, focus) => { return this.hoverService.showHover({ diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index f714914526682..4f704f93e9f13 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -285,7 +285,7 @@ export class InlineChatWidget { this._updateAriaLabel(); // this._elements.status - this._store.add(this._hoverService.setupUpdatableHover(getDefaultHoverDelegate('element'), this._elements.statusLabel, () => { + this._store.add(this._hoverService.setupManagedHover(getDefaultHoverDelegate('element'), this._elements.statusLabel, () => { return this._elements.statusLabel.dataset['title']; })); diff --git a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts index 40c99ee34579b..1a3dec090cccd 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts @@ -50,7 +50,7 @@ import { unsupportedSchemas } from 'vs/platform/markers/common/markerService'; import { defaultCountBadgeStyles } from 'vs/platform/theme/browser/defaultStyles'; import Severity from 'vs/base/common/severity'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; interface IResourceMarkersTemplateData { @@ -281,7 +281,7 @@ class MarkerWidget extends Disposable { private readonly icon: HTMLElement; private readonly iconContainer: HTMLElement; private readonly messageAndDetailsContainer: HTMLElement; - private readonly messageAndDetailsContainerHover: IUpdatableHover; + private readonly messageAndDetailsContainerHover: IManagedHover; private readonly disposables = this._register(new DisposableStore()); constructor( @@ -302,7 +302,7 @@ class MarkerWidget extends Disposable { this.iconContainer = dom.append(parent, dom.$('')); this.icon = dom.append(this.iconContainer, dom.$('')); this.messageAndDetailsContainer = dom.append(parent, dom.$('.marker-message-details-container')); - this.messageAndDetailsContainerHover = this._register(this._hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.messageAndDetailsContainer, '')); + this.messageAndDetailsContainerHover = this._register(this._hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.messageAndDetailsContainer, '')); } render(element: Marker, filterData: MarkerFilterData | undefined): void { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView.ts index 854358af69d40..bfb757be79c4a 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView.ts @@ -17,7 +17,7 @@ import { MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/ac import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; export class CodiconActionViewItem extends MenuEntryActionViewItem { @@ -49,7 +49,7 @@ export class ActionViewWithLabel extends MenuEntryActionViewItem { } export class UnifiedSubmenuActionView extends SubmenuEntryActionViewItem { private _actionLabel?: HTMLAnchorElement; - private _hover?: IUpdatableHover; + private _hover?: IManagedHover; private _primaryAction: IAction | undefined; constructor( @@ -73,7 +73,7 @@ export class UnifiedSubmenuActionView extends SubmenuEntryActionViewItem { this._actionLabel = document.createElement('a'); container.appendChild(this._actionLabel); - this._hover = this._register(this._hoverService.setupUpdatableHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('element'), this._actionLabel, '')); + this._hover = this._register(this._hoverService.setupManagedHover(this.options.hoverDelegate ?? getDefaultHoverDelegate('element'), this._actionLabel, '')); this.updateLabel(); diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts index 9f01df8de18f3..a4514e41d4d8d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts @@ -31,7 +31,7 @@ import { IHoverDelegate, IHoverDelegateOptions } from 'vs/base/browser/ui/hover/ import { IHoverService } from 'vs/platform/hover/browser/hover'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; -import type { IUpdatableHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; const $ = DOM.$; @@ -330,8 +330,8 @@ class CellStatusBarItem extends Disposable { this.container.setAttribute('role', role || ''); if (item.tooltip) { - const hoverContent = typeof item.tooltip === 'string' ? item.tooltip : { markdown: item.tooltip, markdownNotSupportedFallback: undefined } satisfies IUpdatableHoverTooltipMarkdownString; - this._itemDisposables.add(this._hoverService.setupUpdatableHover(this._hoverDelegate, this.container, hoverContent)); + const hoverContent = typeof item.tooltip === 'string' ? item.tooltip : { markdown: item.tooltip, markdownNotSupportedFallback: undefined } satisfies IManagedHoverTooltipMarkdownString; + this._itemDisposables.add(this._hoverService.setupManagedHover(this._hoverDelegate, this.container, hoverContent)); } this.container.classList.toggle('cell-status-item-has-command', !!item.command); diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 2c8e669e7a0bb..d1bbf48e3e86a 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -60,7 +60,7 @@ import { registerNavigableContainer } from 'vs/workbench/browser/actions/widgetN import { IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; const $ = DOM.$; @@ -903,7 +903,7 @@ class ActionsColumnRenderer implements ITableRenderer(extensionContainer, $('a.extension-label', { tabindex: 0 })); @@ -1213,7 +1213,7 @@ class WhenColumnRenderer implements ITableRenderer DOM.EventHelper.stop(e))); this._register(DOM.addDisposableListener(this.anchorElement, DOM.EventType.CLICK, e => this.onClick(e))); this._register(DOM.addDisposableListener(this.container, DOM.EventType.KEY_UP, e => this.onKeyUp(e))); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index e3de3b0f660e7..79dadc818220a 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -805,7 +805,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre const descriptionElement = DOM.append(container, $('.setting-item-description')); const modifiedIndicatorElement = DOM.append(container, $('.setting-item-modified-indicator')); - toDispose.add(this._hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), modifiedIndicatorElement, () => localize('modified', "The setting has been configured in the current scope."))); + toDispose.add(this._hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), modifiedIndicatorElement, () => localize('modified', "The setting has been configured in the current scope."))); const valueElement = DOM.append(container, $('.setting-item-value')); const controlElement = DOM.append(valueElement, $('div.setting-item-control')); @@ -892,7 +892,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre const titleTooltip = setting.key + (element.isConfigured ? ' - Modified' : ''); template.categoryElement.textContent = element.displayCategory ? (element.displayCategory + ': ') : ''; - template.elementDisposables.add(this._hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), template.categoryElement, titleTooltip)); + template.elementDisposables.add(this._hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), template.categoryElement, titleTooltip)); template.labelElement.text = element.displayLabel; template.labelElement.title = titleTooltip; @@ -1835,7 +1835,7 @@ export class SettingBoolRenderer extends AbstractSettingRenderer implements ITre const controlElement = DOM.append(descriptionAndValueElement, $('.setting-item-bool-control')); const descriptionElement = DOM.append(descriptionAndValueElement, $('.setting-item-description')); const modifiedIndicatorElement = DOM.append(container, $('.setting-item-modified-indicator')); - toDispose.add(this._hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), modifiedIndicatorElement, localize('modified', "The setting has been configured in the current scope."))); + toDispose.add(this._hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), modifiedIndicatorElement, localize('modified', "The setting has been configured in the current scope."))); const deprecationWarningElement = DOM.append(container, $('.setting-item-deprecation-message')); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index c808953227373..5021036167b24 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -684,7 +684,7 @@ export class ListSettingWidget extends AbstractListSettingWidget : localize('listSiblingHintLabel', "List item `{0}` with sibling `${1}`", value.data, sibling); const { rowElement } = rowElementGroup; - this.listDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), rowElement, title)); + this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, title)); rowElement.setAttribute('aria-label', title); } @@ -744,7 +744,7 @@ export class ExcludeSettingWidget extends ListSettingWidget { : localize('excludeSiblingHintLabel', "Exclude files matching `{0}`, only when a file matching `{1}` is present", value.data, sibling); const { rowElement } = rowElementGroup; - this.listDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), rowElement, title)); + this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, title)); rowElement.setAttribute('aria-label', title); } @@ -774,7 +774,7 @@ export class IncludeSettingWidget extends ListSettingWidget { : localize('includeSiblingHintLabel', "Include files matching `{0}`, only when a file matching `{1}` is present", value.data, sibling); const { rowElement } = rowElementGroup; - this.listDisposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), rowElement, title)); + this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, title)); rowElement.setAttribute('aria-label', title); } @@ -1184,10 +1184,10 @@ export class ObjectSettingDropdownWidget extends AbstractListSettingWidget 0) || showLineNumbers); templateData.lineNumber.textContent = lineNumberStr + extraLinesStr; - templateData.disposables.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), templateData.lineNumber, this.getMatchTitle(match, showLineNumbers))); + templateData.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), templateData.lineNumber, this.getMatchTitle(match, showLineNumbers))); templateData.actions.context = { viewer: this.searchView.getControl(), element: match } satisfies ISearchActionContext; diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 6359674b81f6f..c2644fe66eeed 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -455,7 +455,7 @@ export class SearchView extends ViewPane { // Toggle query details button this.toggleQueryDetailsButton = dom.append(this.queryDetails, $('.more' + ThemeIcon.asCSSSelector(searchDetailsIcon), { tabindex: 0, role: 'button' })); - this._register(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('element'), this.toggleQueryDetailsButton, nls.localize('moreSearch', "Toggle Search Details"))); + this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), this.toggleQueryDetailsButton, nls.localize('moreSearch', "Toggle Search Details"))); this._register(dom.addDisposableListener(this.toggleQueryDetailsButton, dom.EventType.CLICK, e => { dom.EventHelper.stop(e); @@ -2222,7 +2222,7 @@ class SearchLinkButton extends Disposable { constructor(label: string, handler: (e: dom.EventLike) => unknown, hoverService: IHoverService, tooltip?: string) { super(); this.element = $('a.pointer', { tabindex: 0 }, label); - this._register(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.element, tooltip)); + this._register(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.element, tooltip)); this.addEventHandlers(handler); } diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index e1929d3a93001..5bf122311af97 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -166,7 +166,7 @@ export class SearchEditor extends AbstractTextCodeEditor // Toggle query details button this.toggleQueryDetailsButton = DOM.append(this.includesExcludesContainer, DOM.$('.expand' + ThemeIcon.asCSSSelector(searchDetailsIcon), { tabindex: 0, role: 'button' })); - this._register(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('element'), this.toggleQueryDetailsButton, localize('moreSearch', "Toggle Search Details"))); + this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), this.toggleQueryDetailsButton, localize('moreSearch', "Toggle Search Details"))); this._register(DOM.addDisposableListener(this.toggleQueryDetailsButton, DOM.EventType.CLICK, e => { DOM.EventHelper.stop(e); this.toggleIncludesExcludes(); diff --git a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts index 2c556f376d3dc..0c0111ec344ae 100644 --- a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts +++ b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { h } from 'vs/base/browser/dom'; -import type { IUpdatableHover, IUpdatableHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover, IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { Lazy } from 'vs/base/common/lazy'; @@ -67,7 +67,7 @@ export class ManagedTestCoverageBars extends Disposable { }); private readonly visibleStore = this._register(new DisposableStore()); - private readonly customHovers: IUpdatableHover[] = []; + private readonly customHovers: IManagedHover[] = []; /** Gets whether coverage is currently visible for the resource. */ public get visible() { @@ -82,8 +82,8 @@ export class ManagedTestCoverageBars extends Disposable { super(); } - private attachHover(target: HTMLElement, factory: (coverage: CoverageBarSource) => string | IUpdatableHoverTooltipMarkdownString | undefined) { - this._register(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('element'), target, () => this._coverage && factory(this._coverage))); + private attachHover(target: HTMLElement, factory: (coverage: CoverageBarSource) => string | IManagedHoverTooltipMarkdownString | undefined) { + this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), target, () => this._coverage && factory(this._coverage))); } public setCoverageInfo(coverage: CoverageBarSource | undefined) { @@ -165,7 +165,7 @@ const stmtCoverageText = (coverage: CoverageBarSource) => localize('statementCov const fnCoverageText = (coverage: CoverageBarSource) => coverage.declaration && localize('functionCoverage', '{0}/{1} functions covered ({2})', nf.format(coverage.declaration.covered), nf.format(coverage.declaration.total), coverUtils.displayPercent(coverUtils.percent(coverage.declaration))); const branchCoverageText = (coverage: CoverageBarSource) => coverage.branch && localize('branchCoverage', '{0}/{1} branches covered ({2})', nf.format(coverage.branch.covered), nf.format(coverage.branch.total), coverUtils.displayPercent(coverUtils.percent(coverage.branch))); -const getOverallHoverText = (coverage: CoverageBarSource): IUpdatableHoverTooltipMarkdownString => { +const getOverallHoverText = (coverage: CoverageBarSource): IManagedHoverTooltipMarkdownString => { const str = [ stmtCoverageText(coverage), fnCoverageText(coverage), diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index d2e7928c07b44..b0b0b73cba40a 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -8,7 +8,7 @@ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { ActionBar, IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { Button } from 'vs/base/browser/ui/button/button'; -import type { IUpdatableHover } from 'vs/base/browser/ui/hover/hover'; +import type { IManagedHover } from 'vs/base/browser/ui/hover/hover'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; @@ -448,7 +448,7 @@ class ResultSummaryView extends Disposable { private elementsWereAttached = false; private badgeType: TestingCountBadge; private lastBadge?: NumberBadge | IconBadge; - private countHover: IUpdatableHover; + private countHover: IManagedHover; private readonly badgeDisposable = this._register(new MutableDisposable()); private readonly renderLoop = this._register(new RunOnceScheduler(() => this.render(), SUMMARY_RENDER_INTERVAL)); private readonly elements = dom.h('div.result-summary', [ @@ -480,7 +480,7 @@ class ResultSummaryView extends Disposable { } })); - this.countHover = this._register(hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), this.elements.count, '')); + this.countHover = this._register(hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.elements.count, '')); const ab = this._register(new ActionBar(this.elements.rerun, { actionViewItemProvider: (action, options) => createActionViewItem(instantiationService, action, options), @@ -1344,7 +1344,7 @@ class ErrorRenderer implements ITreeRenderer Date: Thu, 6 Jun 2024 17:54:06 +0200 Subject: [PATCH 130/755] remove gulp-shell (#214211) * remove gulp-shell * fix tasks --- build/gulpfile.vscode.linux.js | 46 ++++++++++---------- build/package.json | 1 - build/yarn.lock | 76 ---------------------------------- 3 files changed, 25 insertions(+), 98 deletions(-) diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js index 8c2b62f7b2a76..28ddfb04c3d90 100644 --- a/build/gulpfile.vscode.linux.js +++ b/build/gulpfile.vscode.linux.js @@ -8,10 +8,9 @@ const gulp = require('gulp'); const replace = require('gulp-replace'); const rename = require('gulp-rename'); -const shell = require('gulp-shell'); const es = require('event-stream'); const vfs = require('vinyl-fs'); -const util = require('./lib/util'); +const { rimraf } = require('./lib/util'); const { getVersion } = require('./lib/getVersion'); const task = require('./lib/task'); const packageJson = require('../package.json'); @@ -19,6 +18,10 @@ const product = require('../product.json'); const dependenciesGenerator = require('./linux/dependencies-generator'); const debianRecommendedDependencies = require('./linux/debian/dep-lists').recommendedDeps; const path = require('path'); +const cp = require('child_process'); +const util = require('util'); + +const exec = util.promisify(cp.exec); const root = path.dirname(__dirname); const commit = getVersion(root); @@ -116,11 +119,13 @@ function prepareDebPackage(arch) { */ function buildDebPackage(arch) { const debArch = getDebPackageArch(arch); - return shell.task([ - 'chmod 755 ' + product.applicationName + '-' + debArch + '/DEBIAN/postinst ' + product.applicationName + '-' + debArch + '/DEBIAN/prerm ' + product.applicationName + '-' + debArch + '/DEBIAN/postrm', - 'mkdir -p deb', - 'fakeroot dpkg-deb -b ' + product.applicationName + '-' + debArch + ' deb' - ], { cwd: '.build/linux/deb/' + debArch }); + const cwd = `.build/linux/deb/${debArch}`; + + return async () => { + await exec(`chmod 755 ${product.applicationName}-${debArch}/DEBIAN/postinst ${product.applicationName}-${debArch}/DEBIAN/prerm ${product.applicationName}-${debArch}/DEBIAN/postrm`, { cwd }); + await exec('mkdir -p deb', { cwd }); + await exec(`fakeroot dpkg-deb -b ${product.applicationName}-${debArch} deb`, { cwd }); + }; } /** @@ -218,14 +223,14 @@ function prepareRpmPackage(arch) { function buildRpmPackage(arch) { const rpmArch = getRpmPackageArch(arch); const rpmBuildPath = getRpmBuildPath(rpmArch); - const rpmOut = rpmBuildPath + '/RPMS/' + rpmArch; - const destination = '.build/linux/rpm/' + rpmArch; - - return shell.task([ - 'mkdir -p ' + destination, - 'HOME="$(pwd)/' + destination + '" rpmbuild -bb ' + rpmBuildPath + '/SPECS/' + product.applicationName + '.spec --target=' + rpmArch, - 'cp "' + rpmOut + '/$(ls ' + rpmOut + ')" ' + destination + '/' - ]); + const rpmOut = `${rpmBuildPath}/RPMS/${rpmArch}`; + const destination = `.build/linux/rpm/${rpmArch}`; + + return async () => { + await exec(`mkdir -p ${destination}`); + await exec(`HOME="$(pwd)/${destination}" rpmbuild -bb ${rpmBuildPath}/SPECS/${product.applicationName}.spec --target=${rpmArch}`); + await exec(`cp "${rpmOut}/$(ls ${rpmOut})" ${destination}/`); + }; } /** @@ -286,9 +291,8 @@ function prepareSnapPackage(arch) { * @param {string} arch */ function buildSnapPackage(arch) { - const snapBuildPath = getSnapBuildPath(arch); - // Default target for snapcraft runs: pull, build, stage and prime, and finally assembles the snap. - return shell.task(`cd ${snapBuildPath} && snapcraft`); + const cwd = getSnapBuildPath(arch); + return () => exec('snapcraft', { cwd }); } const BUILD_TARGETS = [ @@ -299,18 +303,18 @@ const BUILD_TARGETS = [ BUILD_TARGETS.forEach(({ arch }) => { const debArch = getDebPackageArch(arch); - const prepareDebTask = task.define(`vscode-linux-${arch}-prepare-deb`, task.series(util.rimraf(`.build/linux/deb/${debArch}`), prepareDebPackage(arch))); + const prepareDebTask = task.define(`vscode-linux-${arch}-prepare-deb`, task.series(rimraf(`.build/linux/deb/${debArch}`), prepareDebPackage(arch))); gulp.task(prepareDebTask); const buildDebTask = task.define(`vscode-linux-${arch}-build-deb`, buildDebPackage(arch)); gulp.task(buildDebTask); const rpmArch = getRpmPackageArch(arch); - const prepareRpmTask = task.define(`vscode-linux-${arch}-prepare-rpm`, task.series(util.rimraf(`.build/linux/rpm/${rpmArch}`), prepareRpmPackage(arch))); + const prepareRpmTask = task.define(`vscode-linux-${arch}-prepare-rpm`, task.series(rimraf(`.build/linux/rpm/${rpmArch}`), prepareRpmPackage(arch))); gulp.task(prepareRpmTask); const buildRpmTask = task.define(`vscode-linux-${arch}-build-rpm`, buildRpmPackage(arch)); gulp.task(buildRpmTask); - const prepareSnapTask = task.define(`vscode-linux-${arch}-prepare-snap`, task.series(util.rimraf(`.build/linux/snap/${arch}`), prepareSnapPackage(arch))); + const prepareSnapTask = task.define(`vscode-linux-${arch}-prepare-snap`, task.series(rimraf(`.build/linux/snap/${arch}`), prepareSnapPackage(arch))); gulp.task(prepareSnapTask); const buildSnapTask = task.define(`vscode-linux-${arch}-build-snap`, task.series(prepareSnapTask, buildSnapPackage(arch))); gulp.task(buildSnapTask); diff --git a/build/package.json b/build/package.json index 2b89bbc1c99a2..fa37e89b6faac 100644 --- a/build/package.json +++ b/build/package.json @@ -44,7 +44,6 @@ "esbuild": "0.20.0", "extract-zip": "^2.0.1", "gulp-merge-json": "^2.1.1", - "gulp-shell": "^0.8.0", "jsonc-parser": "^2.3.0", "mime": "^1.4.1", "mkdirp": "^1.0.4", diff --git a/build/yarn.lock b/build/yarn.lock index 3131c43217c20..81cf7fcf3d548 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -743,13 +743,6 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -966,14 +959,6 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - cheerio-select@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" @@ -1077,23 +1062,11 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" @@ -1617,28 +1590,11 @@ gulp-merge-json@^2.1.1: through "^2.3.8" vinyl "^2.1.0" -gulp-shell@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.8.0.tgz#0ed4980de1d0c67e5f6cce971d7201fd0be50555" - integrity sha512-wHNCgmqbWkk1c6Gc2dOL5SprcoeujQdeepICwfQRo91DIylTE7a794VEE+leq3cE2YDoiS5ulvRfKVIEMazcTQ== - dependencies: - chalk "^3.0.0" - fancy-log "^1.3.3" - lodash.template "^4.5.0" - plugin-error "^1.0.1" - through2 "^3.0.1" - tslib "^1.10.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -1917,31 +1873,11 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - lodash.mergewith@^4.6.1: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2559,13 +2495,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - tar-fs@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -2657,11 +2586,6 @@ tree-sitter@^0.20.5, tree-sitter@^0.20.6: nan "^2.18.0" prebuild-install "^7.1.1" -tslib@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" From f82523eb08a4a17a359d30fd20293705dfe63b17 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 6 Jun 2024 18:09:59 +0200 Subject: [PATCH 131/755] Uses editor option to control editor placeholder. (#214427) * Uses editor option to control editor placeholder. Signed-off-by: Henning Dieterichs --- .../lib/stylelint/vscode-known-variables.json | 26 ++-- src/vs/editor/browser/observableUtilities.ts | 8 +- src/vs/editor/common/config/editorOptions.ts | 28 ++++ .../common/standalone/standaloneEnums.ts | 125 ++++++++--------- ...ion.ts => placeholderText.contribution.ts} | 19 ++- .../browser/placeholderText.css | 6 +- src/vs/editor/editor.all.ts | 1 + src/vs/monaco.d.ts | 131 +++++++++--------- 8 files changed, 199 insertions(+), 145 deletions(-) rename src/vs/editor/contrib/placeholderText/browser/{placeholderTextContribution.ts => placeholderText.contribution.ts} (74%) diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index 0fd6d003b5319..0c974a46e0078 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -128,11 +128,11 @@ "--vscode-dropdown-listBackground", "--vscode-editor-background", "--vscode-editor-findMatchBackground", - "--vscode-editor-findMatchForeground", "--vscode-editor-findMatchBorder", + "--vscode-editor-findMatchForeground", "--vscode-editor-findMatchHighlightBackground", - "--vscode-editor-findMatchHighlightForeground", "--vscode-editor-findMatchHighlightBorder", + "--vscode-editor-findMatchHighlightForeground", "--vscode-editor-findRangeHighlightBackground", "--vscode-editor-findRangeHighlightBorder", "--vscode-editor-focusedStackFrameHighlightBackground", @@ -145,6 +145,7 @@ "--vscode-editor-lineHighlightBackground", "--vscode-editor-lineHighlightBorder", "--vscode-editor-linkedEditingBackground", + "--vscode-editor-placeholder-foreground", "--vscode-editor-rangeHighlightBackground", "--vscode-editor-rangeHighlightBorder", "--vscode-editor-selectionBackground", @@ -490,12 +491,12 @@ "--vscode-panelSectionHeader-background", "--vscode-panelSectionHeader-border", "--vscode-panelSectionHeader-foreground", - "--vscode-panelTitle-activeBorder", - "--vscode-panelTitle-activeForeground", - "--vscode-panelTitle-inactiveForeground", "--vscode-panelStickyScroll-background", "--vscode-panelStickyScroll-border", "--vscode-panelStickyScroll-shadow", + "--vscode-panelTitle-activeBorder", + "--vscode-panelTitle-activeForeground", + "--vscode-panelTitle-inactiveForeground", "--vscode-peekView-border", "--vscode-peekViewEditor-background", "--vscode-peekViewEditor-matchHighlightBackground", @@ -519,6 +520,7 @@ "--vscode-problemsWarningIcon-foreground", "--vscode-profileBadge-background", "--vscode-profileBadge-foreground", + "--vscode-profiles-sashBorder", "--vscode-progressBar-background", "--vscode-quickInput-background", "--vscode-quickInput-foreground", @@ -570,11 +572,11 @@ "--vscode-sideBarSectionHeader-background", "--vscode-sideBarSectionHeader-border", "--vscode-sideBarSectionHeader-foreground", - "--vscode-sideBarTitle-background", - "--vscode-sideBarTitle-foreground", "--vscode-sideBarStickyScroll-background", "--vscode-sideBarStickyScroll-border", "--vscode-sideBarStickyScroll-shadow", + "--vscode-sideBarTitle-background", + "--vscode-sideBarTitle-foreground", "--vscode-sideBySideEditor-horizontalBorder", "--vscode-sideBySideEditor-verticalBorder", "--vscode-simpleFindWidget-sashBorder", @@ -649,9 +651,6 @@ "--vscode-tab-activeBackground", "--vscode-tab-activeBorder", "--vscode-tab-activeBorderTop", - "--vscode-tab-selectedBorderTop", - "--vscode-tab-selectedBackground", - "--vscode-tab-selectedForeground", "--vscode-tab-activeForeground", "--vscode-tab-activeModifiedBorder", "--vscode-tab-border", @@ -663,6 +662,9 @@ "--vscode-tab-inactiveForeground", "--vscode-tab-inactiveModifiedBorder", "--vscode-tab-lastPinnedBorder", + "--vscode-tab-selectedBackground", + "--vscode-tab-selectedBorderTop", + "--vscode-tab-selectedForeground", "--vscode-tab-unfocusedActiveBackground", "--vscode-tab-unfocusedActiveBorder", "--vscode-tab-unfocusedActiveBorderTop", @@ -700,10 +702,10 @@ "--vscode-terminal-foreground", "--vscode-terminal-hoverHighlightBackground", "--vscode-terminal-inactiveSelectionBackground", + "--vscode-terminal-initialHintForeground", "--vscode-terminal-selectionBackground", "--vscode-terminal-selectionForeground", "--vscode-terminal-tab-activeBorder", - "--vscode-terminal-initialHintForeground", "--vscode-terminalCommandDecoration-defaultBackground", "--vscode-terminalCommandDecoration-errorBackground", "--vscode-terminalCommandDecoration-successBackground", @@ -853,4 +855,4 @@ "--zoom-factor", "--test-bar-width" ] -} +} \ No newline at end of file diff --git a/src/vs/editor/browser/observableUtilities.ts b/src/vs/editor/browser/observableUtilities.ts index ed53dac2c2394..118c70a7a3452 100644 --- a/src/vs/editor/browser/observableUtilities.ts +++ b/src/vs/editor/browser/observableUtilities.ts @@ -8,7 +8,7 @@ import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecyc import { IObservable, ITransaction, autorunOpts, autorunWithStoreHandleChanges, derived, derivedOpts, observableFromEvent, observableSignal, observableValue, observableValueOpts } from 'vs/base/common/observable'; import { TransactionImpl } from 'vs/base/common/observableInternal/base'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { EditorOption, FindComputedEditorOptionValueById } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; @@ -174,6 +174,12 @@ export class ObservableCodeEditor extends Disposable { public readonly onDidType = observableSignal(this); + public getOption(id: T): IObservable> { + return observableFromEvent(cb => this.editor.onDidChangeConfiguration(e => { + if (e.hasChanged(id)) { cb(undefined); } + }), () => this.editor.getOption(id)); + } + public setDecorations(decorations: IObservable): IDisposable { const d = new DisposableStore(); const decorationsCollection = this.editor.createDecorationsCollection(); diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 41354c4711866..294e7030695b5 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -692,6 +692,13 @@ export interface IEditorOptions { * Defaults to false. */ peekWidgetDefaultFocus?: 'tree' | 'editor'; + + /** + * Sets a placeholder for the editor. + * If set, the placeholder is shown if the editor is empty. + */ + placeholder?: string | undefined; + /** * Controls whether the definition link opens element in the peek widget. * Defaults to false. @@ -3347,6 +3354,25 @@ class EditorPixelRatio extends ComputedEditorOption { + constructor() { + super(EditorOption.placeholder, 'placeholder', undefined); + } + + public validate(input: any): string | undefined { + if (typeof input === 'undefined') { + return this.defaultValue; + } + if (typeof input === 'string') { + return input; + } + return this.defaultValue; + } +} +//#endregion + //#region quickSuggestions export type QuickSuggestionsValue = 'on' | 'inline' | 'off'; @@ -5354,6 +5380,7 @@ export const enum EditorOption { pasteAs, parameterHints, peekWidgetDefaultFocus, + placeholder, definitionLinkOpensInPeek, quickSuggestions, quickSuggestionsDelay, @@ -5884,6 +5911,7 @@ export const EditorOptions = { description: nls.localize('peekWidgetDefaultFocus', "Controls whether to focus the inline editor or the tree in the peek widget.") } )), + placeholder: register(new PlaceholderOption()), definitionLinkOpensInPeek: register(new EditorBooleanOption( EditorOption.definitionLinkOpensInPeek, 'definitionLinkOpensInPeek', false, { description: nls.localize('definitionLinkOpensInPeek', "Controls whether the Go to Definition mouse gesture always opens the peek widget.") } diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index 4c5c84ee0f6c7..7cd16daae8b8f 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -261,68 +261,69 @@ export enum EditorOption { pasteAs = 85, parameterHints = 86, peekWidgetDefaultFocus = 87, - definitionLinkOpensInPeek = 88, - quickSuggestions = 89, - quickSuggestionsDelay = 90, - readOnly = 91, - readOnlyMessage = 92, - renameOnType = 93, - renderControlCharacters = 94, - renderFinalNewline = 95, - renderLineHighlight = 96, - renderLineHighlightOnlyWhenFocus = 97, - renderValidationDecorations = 98, - renderWhitespace = 99, - revealHorizontalRightPadding = 100, - roundedSelection = 101, - rulers = 102, - scrollbar = 103, - scrollBeyondLastColumn = 104, - scrollBeyondLastLine = 105, - scrollPredominantAxis = 106, - selectionClipboard = 107, - selectionHighlight = 108, - selectOnLineNumbers = 109, - showFoldingControls = 110, - showUnused = 111, - snippetSuggestions = 112, - smartSelect = 113, - smoothScrolling = 114, - stickyScroll = 115, - stickyTabStops = 116, - stopRenderingLineAfter = 117, - suggest = 118, - suggestFontSize = 119, - suggestLineHeight = 120, - suggestOnTriggerCharacters = 121, - suggestSelection = 122, - tabCompletion = 123, - tabIndex = 124, - unicodeHighlighting = 125, - unusualLineTerminators = 126, - useShadowDOM = 127, - useTabStops = 128, - wordBreak = 129, - wordSegmenterLocales = 130, - wordSeparators = 131, - wordWrap = 132, - wordWrapBreakAfterCharacters = 133, - wordWrapBreakBeforeCharacters = 134, - wordWrapColumn = 135, - wordWrapOverride1 = 136, - wordWrapOverride2 = 137, - wrappingIndent = 138, - wrappingStrategy = 139, - showDeprecated = 140, - inlayHints = 141, - editorClassName = 142, - pixelRatio = 143, - tabFocusMode = 144, - layoutInfo = 145, - wrappingInfo = 146, - defaultColorDecorators = 147, - colorDecoratorsActivatedOn = 148, - inlineCompletionsAccessibilityVerbose = 149 + placeholder = 88, + definitionLinkOpensInPeek = 89, + quickSuggestions = 90, + quickSuggestionsDelay = 91, + readOnly = 92, + readOnlyMessage = 93, + renameOnType = 94, + renderControlCharacters = 95, + renderFinalNewline = 96, + renderLineHighlight = 97, + renderLineHighlightOnlyWhenFocus = 98, + renderValidationDecorations = 99, + renderWhitespace = 100, + revealHorizontalRightPadding = 101, + roundedSelection = 102, + rulers = 103, + scrollbar = 104, + scrollBeyondLastColumn = 105, + scrollBeyondLastLine = 106, + scrollPredominantAxis = 107, + selectionClipboard = 108, + selectionHighlight = 109, + selectOnLineNumbers = 110, + showFoldingControls = 111, + showUnused = 112, + snippetSuggestions = 113, + smartSelect = 114, + smoothScrolling = 115, + stickyScroll = 116, + stickyTabStops = 117, + stopRenderingLineAfter = 118, + suggest = 119, + suggestFontSize = 120, + suggestLineHeight = 121, + suggestOnTriggerCharacters = 122, + suggestSelection = 123, + tabCompletion = 124, + tabIndex = 125, + unicodeHighlighting = 126, + unusualLineTerminators = 127, + useShadowDOM = 128, + useTabStops = 129, + wordBreak = 130, + wordSegmenterLocales = 131, + wordSeparators = 132, + wordWrap = 133, + wordWrapBreakAfterCharacters = 134, + wordWrapBreakBeforeCharacters = 135, + wordWrapColumn = 136, + wordWrapOverride1 = 137, + wordWrapOverride2 = 138, + wrappingIndent = 139, + wrappingStrategy = 140, + showDeprecated = 141, + inlayHints = 142, + editorClassName = 143, + pixelRatio = 144, + tabFocusMode = 145, + layoutInfo = 146, + wrappingInfo = 147, + defaultColorDecorators = 148, + colorDecoratorsActivatedOn = 149, + inlineCompletionsAccessibilityVerbose = 150 } /** diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts similarity index 74% rename from src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts rename to src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts index f8370994da9c4..0a7bf00c99bfe 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts @@ -5,15 +5,22 @@ import { structuralEquals } from 'vs/base/common/equals'; import { Disposable } from 'vs/base/common/lifecycle'; -import { derived, derivedOpts, observableValue } from 'vs/base/common/observable'; +import { derived, derivedOpts } from 'vs/base/common/observable'; import 'vs/css!./placeholderText'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { observableCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { ghostTextForeground } from 'vs/editor/common/core/editorColorRegistry'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration, InjectedTextCursorStops } from 'vs/editor/common/model'; +import { localize } from 'vs/nls'; +import { registerColor } from 'vs/platform/theme/common/colorUtils'; +/** + * Use the editor option to set the placeholder text. +*/ export class PlaceholderTextContribution extends Disposable implements IEditorContribution { public static get(editor: ICodeEditor): PlaceholderTextContribution { return editor.getContribution(PlaceholderTextContribution.ID)!; @@ -22,7 +29,7 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo public static readonly ID = 'editor.contrib.placeholderText'; private readonly _editorObs = observableCodeEditor(this._editor); - private readonly _placeholderText = observableValue(this, undefined); + private readonly _placeholderText = this._editorObs.getOption(EditorOption.placeholder); private readonly _decorationOptions = derivedOpts<{ placeholder: string } | undefined>({ owner: this, equalsFn: structuralEquals }, reader => { const p = this._placeholderText.read(reader); @@ -57,10 +64,8 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo this._register(this._editorObs.setDecorations(this._decorations)); } - - public setPlaceholderText(placeholder: string): void { - this._placeholderText.set(placeholder, undefined); - } } -registerEditorContribution(PlaceholderTextContribution.ID, PlaceholderTextContribution, EditorContributionInstantiation.Lazy); +registerEditorContribution(PlaceholderTextContribution.ID, PlaceholderTextContribution, EditorContributionInstantiation.Eager); + +registerColor('editor.placeholder.foreground', { dark: ghostTextForeground, light: ghostTextForeground, hcDark: ghostTextForeground, hcLight: ghostTextForeground }, localize('placeholderForeground', 'Foreground color of the placeholder text in the editor.')); diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderText.css b/src/vs/editor/contrib/placeholderText/browser/placeholderText.css index c42b21a3ba28c..65843a23be784 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderText.css +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.css @@ -3,6 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +.monaco-editor { + --vscode-editor-placeholder-foreground: rgba(0, 0, 0, 0.5); +} + .monaco-editor .placeholder-text { - color: var(--vscode-editorGhostText-foreground) !important; + color: var(--vscode-editor-placeholder-foreground); } diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index 8c50e8dcf3623..ed1e6badc5085 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -43,6 +43,7 @@ import 'vs/editor/contrib/longLinesHelper/browser/longLinesHelper'; import 'vs/editor/contrib/multicursor/browser/multicursor'; import 'vs/editor/contrib/inlineEdit/browser/inlineEdit.contribution'; import 'vs/editor/contrib/parameterHints/browser/parameterHints'; +import 'vs/editor/contrib/placeholderText/browser/placeholderText.contribution'; import 'vs/editor/contrib/rename/browser/rename'; import 'vs/editor/contrib/sectionHeaders/browser/sectionHeaders'; import 'vs/editor/contrib/semanticTokens/browser/documentSemanticTokens'; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a05b9885c8416..d12441499ea6c 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3735,6 +3735,11 @@ declare namespace monaco.editor { * Defaults to false. */ peekWidgetDefaultFocus?: 'tree' | 'editor'; + /** + * Sets a placeholder for the editor. + * If set, the placeholder is shown if the editor is empty. + */ + placeholder?: string | undefined; /** * Controls whether the definition link opens element in the peek widget. * Defaults to false. @@ -4929,68 +4934,69 @@ declare namespace monaco.editor { pasteAs = 85, parameterHints = 86, peekWidgetDefaultFocus = 87, - definitionLinkOpensInPeek = 88, - quickSuggestions = 89, - quickSuggestionsDelay = 90, - readOnly = 91, - readOnlyMessage = 92, - renameOnType = 93, - renderControlCharacters = 94, - renderFinalNewline = 95, - renderLineHighlight = 96, - renderLineHighlightOnlyWhenFocus = 97, - renderValidationDecorations = 98, - renderWhitespace = 99, - revealHorizontalRightPadding = 100, - roundedSelection = 101, - rulers = 102, - scrollbar = 103, - scrollBeyondLastColumn = 104, - scrollBeyondLastLine = 105, - scrollPredominantAxis = 106, - selectionClipboard = 107, - selectionHighlight = 108, - selectOnLineNumbers = 109, - showFoldingControls = 110, - showUnused = 111, - snippetSuggestions = 112, - smartSelect = 113, - smoothScrolling = 114, - stickyScroll = 115, - stickyTabStops = 116, - stopRenderingLineAfter = 117, - suggest = 118, - suggestFontSize = 119, - suggestLineHeight = 120, - suggestOnTriggerCharacters = 121, - suggestSelection = 122, - tabCompletion = 123, - tabIndex = 124, - unicodeHighlighting = 125, - unusualLineTerminators = 126, - useShadowDOM = 127, - useTabStops = 128, - wordBreak = 129, - wordSegmenterLocales = 130, - wordSeparators = 131, - wordWrap = 132, - wordWrapBreakAfterCharacters = 133, - wordWrapBreakBeforeCharacters = 134, - wordWrapColumn = 135, - wordWrapOverride1 = 136, - wordWrapOverride2 = 137, - wrappingIndent = 138, - wrappingStrategy = 139, - showDeprecated = 140, - inlayHints = 141, - editorClassName = 142, - pixelRatio = 143, - tabFocusMode = 144, - layoutInfo = 145, - wrappingInfo = 146, - defaultColorDecorators = 147, - colorDecoratorsActivatedOn = 148, - inlineCompletionsAccessibilityVerbose = 149 + placeholder = 88, + definitionLinkOpensInPeek = 89, + quickSuggestions = 90, + quickSuggestionsDelay = 91, + readOnly = 92, + readOnlyMessage = 93, + renameOnType = 94, + renderControlCharacters = 95, + renderFinalNewline = 96, + renderLineHighlight = 97, + renderLineHighlightOnlyWhenFocus = 98, + renderValidationDecorations = 99, + renderWhitespace = 100, + revealHorizontalRightPadding = 101, + roundedSelection = 102, + rulers = 103, + scrollbar = 104, + scrollBeyondLastColumn = 105, + scrollBeyondLastLine = 106, + scrollPredominantAxis = 107, + selectionClipboard = 108, + selectionHighlight = 109, + selectOnLineNumbers = 110, + showFoldingControls = 111, + showUnused = 112, + snippetSuggestions = 113, + smartSelect = 114, + smoothScrolling = 115, + stickyScroll = 116, + stickyTabStops = 117, + stopRenderingLineAfter = 118, + suggest = 119, + suggestFontSize = 120, + suggestLineHeight = 121, + suggestOnTriggerCharacters = 122, + suggestSelection = 123, + tabCompletion = 124, + tabIndex = 125, + unicodeHighlighting = 126, + unusualLineTerminators = 127, + useShadowDOM = 128, + useTabStops = 129, + wordBreak = 130, + wordSegmenterLocales = 131, + wordSeparators = 132, + wordWrap = 133, + wordWrapBreakAfterCharacters = 134, + wordWrapBreakBeforeCharacters = 135, + wordWrapColumn = 136, + wordWrapOverride1 = 137, + wordWrapOverride2 = 138, + wrappingIndent = 139, + wrappingStrategy = 140, + showDeprecated = 141, + inlayHints = 142, + editorClassName = 143, + pixelRatio = 144, + tabFocusMode = 145, + layoutInfo = 146, + wrappingInfo = 147, + defaultColorDecorators = 148, + colorDecoratorsActivatedOn = 149, + inlineCompletionsAccessibilityVerbose = 150 } export const EditorOptions: { @@ -5083,6 +5089,7 @@ declare namespace monaco.editor { pasteAs: IEditorOption>>; parameterHints: IEditorOption>>; peekWidgetDefaultFocus: IEditorOption; + placeholder: IEditorOption; definitionLinkOpensInPeek: IEditorOption; quickSuggestions: IEditorOption; quickSuggestionsDelay: IEditorOption; From 22aa6be400754098a15c2806a60093e68006bcbb Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 6 Jun 2024 09:10:58 -0700 Subject: [PATCH 132/755] More interface/doc tweaks --- src/vs/base/browser/ui/hover/hover.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/vs/base/browser/ui/hover/hover.ts b/src/vs/base/browser/ui/hover/hover.ts index d087dc92dd91a..f66ba1ea6739c 100644 --- a/src/vs/base/browser/ui/hover/hover.ts +++ b/src/vs/base/browser/ui/hover/hover.ts @@ -14,11 +14,12 @@ import type { IDisposable } from 'vs/base/common/lifecycle'; */ export interface IHoverDelegate2 { /** - * Shows a hover, provided a hover with the same options object is not already visible. + * Shows a hover, provided a hover with the same {@link options} object is not already visible. + * * @param options A set of options defining the characteristics of the hover. * @param focus Whether to focus the hover (useful for keyboard accessibility). * - * **Example:** A simple usage with a single element target. + * @example A simple usage with a single element target. * * ```typescript * showHover({ @@ -27,7 +28,10 @@ export interface IHoverDelegate2 { * }); * ``` */ - showHover(options: IHoverOptions, focus?: boolean): IHoverWidget | undefined; + showHover( + options: IHoverOptions, + focus?: boolean + ): IHoverWidget | undefined; /** * Hides the hover if it was visible. This call will be ignored if the the hover is currently @@ -250,13 +254,13 @@ export interface IHoverTarget extends IDisposable { * An optional absolute x coordinate to position the hover with, for example to position the * hover using `MouseEvent.pageX`. */ - x?: number; + readonly x?: number; /** * An optional absolute y coordinate to position the hover with, for example to position the * hover using `MouseEvent.pageY`. */ - y?: number; + readonly y?: number; } // #region Managed hover @@ -269,10 +273,7 @@ export interface IManagedHoverTooltipMarkdownString { export type IManagedHoverContent = string | IManagedHoverTooltipMarkdownString | HTMLElement | undefined; export type IManagedHoverContentOrFactory = IManagedHoverContent | (() => IManagedHoverContent); -export interface IManagedHoverOptions { - actions?: IHoverAction[]; - linkHandler?(url: string): void; - trapFocus?: boolean; +export interface IManagedHoverOptions extends Pick { } export interface IManagedHover extends IDisposable { From 2fb22a9ac05a985c5e99c039cf264e65e1451699 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 6 Jun 2024 18:08:09 +0200 Subject: [PATCH 133/755] Fixes #213365 --- .../browser/widget/diffEditor/diffEditorWidget.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts index cdc985a11a53e..29942806d0c90 100644 --- a/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts @@ -5,7 +5,7 @@ import { getWindow, h } from 'vs/base/browser/dom'; import { IBoundarySashes } from 'vs/base/browser/ui/sash/sash'; import { findLast } from 'vs/base/common/arraysFind'; -import { onUnexpectedError } from 'vs/base/common/errors'; +import { BugIndicatingError, onUnexpectedError } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; import { toDisposable } from 'vs/base/common/lifecycle'; import { IObservable, ITransaction, autorun, autorunWithStore, derived, observableFromEvent, observableValue, recomputeInitiallyAndOnChange, subtransaction, transaction } from 'vs/base/common/observable'; @@ -326,6 +326,17 @@ export class DiffEditorWidget extends DelegatingEditor implements IDiffEditor { this._register(autorunWithStore((reader, store) => { store.add(new (readHotReloadableExport(RevertButtonsFeature, reader))(this._editors, this._diffModel, this._options, this)); })); + + this._register(autorunWithStore((reader, store) => { + const model = this._diffModel.read(reader); + if (!model) { return; } + for (const m of [model.model.original, model.model.modified]) { + store.add(m.onWillDispose(e => { + onUnexpectedError(new BugIndicatingError('TextModel got disposed before DiffEditorWidget model got reset')); + this.setModel(null); + })); + } + })); } public getViewWidth(): number { From 0036990784680ad8b24af9e80205e3993addc737 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 6 Jun 2024 19:29:41 +0200 Subject: [PATCH 134/755] feature: make number of ripgrep threads configurable (#213511) * feature: add threads property * add setting * use setting * debug * add option * fix types * use commonquery * rename argument * remove comma * add threads for file search * set threads to undefined * update description * remove unused code * remove unused code * Update src/vs/workbench/services/search/node/ripgrepFileSearch.ts Co-authored-by: Andrea Mah <31675041+andreamah@users.noreply.github.com> * Update src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts Co-authored-by: Andrea Mah <31675041+andreamah@users.noreply.github.com> * use ICommonQueryBuilderOptions * set threads property from caller * simplify code * Discard changes to src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts * Discard changes to src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts * remove unused code * Discard changes to src/vs/workbench/services/search/common/textSearchManager.ts * add back code * fix types * update formatting * add semicolon * rename setting * use different way to pass numThreads to ripgrep * Discard changes to src/vs/workbench/services/search/common/queryBuilder.ts * Discard changes to src/vs/workbench/services/search/common/search.ts * tsc * tsc * tsc * fix imports * use configuration service * tsc * tsc * tsc * improve types * Update src/vs/workbench/contrib/search/browser/search.contribution.ts Co-authored-by: Andrea Mah <31675041+andreamah@users.noreply.github.com> * simplify type * rename types * move numThreads parameter last * simplify code * Update src/vs/workbench/services/search/common/textSearchManager.ts Co-authored-by: Andrea Mah <31675041+andreamah@users.noreply.github.com> * Update src/vs/workbench/services/search/common/searchExtTypesInternal.ts Co-authored-by: Andrea Mah <31675041+andreamah@users.noreply.github.com> * Discard changes to src/vs/workbench/services/search/test/node/rawSearchService.integrationTest.ts * fix typo * fix types * Discard changes to src/vs/monaco.d.ts * rename interface * rename variable * rename setting * rename setting * update settings * tsc * fix: pass threads property also below * cache setting * use affectsConfiguration * fix test --------- Co-authored-by: Andrea Mah <31675041+andreamah@users.noreply.github.com> --- src/vs/workbench/api/node/extHostSearch.ts | 50 ++++++++++++++++--- .../api/test/node/extHostSearch.test.ts | 21 ++++++++ .../search/browser/search.contribution.ts | 5 ++ .../search/common/searchExtTypesInternal.ts | 13 +++++ .../services/search/node/fileSearch.ts | 14 +++--- .../services/search/node/rawSearchService.ts | 22 ++++---- .../services/search/node/ripgrepFileSearch.ts | 10 ++-- .../search/node/ripgrepSearchProvider.ts | 18 ++++--- .../search/node/ripgrepTextSearchEngine.ts | 15 ++++-- .../services/search/node/textSearchAdapter.ts | 4 +- .../test/node/fileSearch.integrationTest.ts | 4 +- 11 files changed, 138 insertions(+), 38 deletions(-) create mode 100644 src/vs/workbench/services/search/common/searchExtTypesInternal.ts diff --git a/src/vs/workbench/api/node/extHostSearch.ts b/src/vs/workbench/api/node/extHostSearch.ts index 99f5d7614e8f7..d10dbbb7d99d8 100644 --- a/src/vs/workbench/api/node/extHostSearch.ts +++ b/src/vs/workbench/api/node/extHostSearch.ts @@ -8,6 +8,7 @@ import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import * as pfs from 'vs/base/node/pfs'; import { ILogService } from 'vs/platform/log/common/log'; +import { IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ExtHostSearch, reviveQuery } from 'vs/workbench/api/common/extHostSearch'; @@ -29,24 +30,59 @@ export class NativeExtHostSearch extends ExtHostSearch implements IDisposable { private _registeredEHSearchProvider = false; + private _numThreadsPromise: Promise | undefined; + private readonly _disposables = new DisposableStore(); + private isDisposed = false; + constructor( @IExtHostRpcService extHostRpc: IExtHostRpcService, @IExtHostInitDataService initData: IExtHostInitDataService, @IURITransformerService _uriTransformer: IURITransformerService, + @IExtHostConfiguration private readonly configurationService: IExtHostConfiguration, @ILogService _logService: ILogService, ) { super(extHostRpc, _uriTransformer, _logService); - + this.getNumThreads = this.getNumThreads.bind(this); + this.getNumThreadsCached = this.getNumThreadsCached.bind(this); + this.handleConfigurationChanged = this.handleConfigurationChanged.bind(this); const outputChannel = new OutputChannel('RipgrepSearchUD', this._logService); - this._disposables.add(this.registerTextSearchProvider(Schemas.vscodeUserData, new RipgrepSearchProvider(outputChannel))); + this._disposables.add(this.registerTextSearchProvider(Schemas.vscodeUserData, new RipgrepSearchProvider(outputChannel, this.getNumThreadsCached))); if (initData.remote.isRemote && initData.remote.authority) { this._registerEHSearchProviders(); } + + configurationService.getConfigProvider().then(provider => { + if (this.isDisposed) { + return; + } + this._disposables.add(provider.onDidChangeConfiguration(this.handleConfigurationChanged)); + }); + } + + private handleConfigurationChanged(event: vscode.ConfigurationChangeEvent) { + if (!event.affectsConfiguration('search')) { + return; + } + this._numThreadsPromise = undefined; + } + + async getNumThreads(): Promise { + const configProvider = await this.configurationService.getConfigProvider(); + const numThreads = configProvider.getConfiguration('search').get('ripgrep.maxThreads'); + return numThreads; + } + + async getNumThreadsCached(): Promise { + if (!this._numThreadsPromise) { + this._numThreadsPromise = this.getNumThreads(); + } + return this._numThreadsPromise; } dispose(): void { + this.isDisposed = true; this._disposables.dispose(); } @@ -61,8 +97,8 @@ export class NativeExtHostSearch extends ExtHostSearch implements IDisposable { this._registeredEHSearchProvider = true; const outputChannel = new OutputChannel('RipgrepSearchEH', this._logService); - this._disposables.add(this.registerTextSearchProvider(Schemas.file, new RipgrepSearchProvider(outputChannel))); - this._disposables.add(this.registerInternalFileSearchProvider(Schemas.file, new SearchService('fileSearchProvider'))); + this._disposables.add(this.registerTextSearchProvider(Schemas.file, new RipgrepSearchProvider(outputChannel, this.getNumThreadsCached))); + this._disposables.add(this.registerInternalFileSearchProvider(Schemas.file, new SearchService('fileSearchProvider', this.getNumThreadsCached))); } private registerInternalFileSearchProvider(scheme: string, provider: SearchService): IDisposable { @@ -90,7 +126,7 @@ export class NativeExtHostSearch extends ExtHostSearch implements IDisposable { return super.$provideFileSearchResults(handle, session, rawQuery, token); } - override doInternalFileSearchWithCustomCallback(rawQuery: IFileQuery, token: vscode.CancellationToken, handleFileMatch: (data: URI[]) => void): Promise { + override async doInternalFileSearchWithCustomCallback(rawQuery: IFileQuery, token: vscode.CancellationToken, handleFileMatch: (data: URI[]) => void): Promise { const onResult = (ev: ISerializedSearchProgressItem) => { if (isSerializedFileMatch(ev)) { ev = [ev]; @@ -109,8 +145,8 @@ export class NativeExtHostSearch extends ExtHostSearch implements IDisposable { if (!this._internalFileSearchProvider) { throw new Error('No internal file search handler'); } - - return >this._internalFileSearchProvider.doFileSearch(rawQuery, onResult, token); + const numThreads = await this.getNumThreadsCached(); + return >this._internalFileSearchProvider.doFileSearch(rawQuery, numThreads, onResult, token); } private async doInternalFileSearch(handle: number, session: number, rawQuery: IFileQuery, token: vscode.CancellationToken): Promise { diff --git a/src/vs/workbench/api/test/node/extHostSearch.test.ts b/src/vs/workbench/api/test/node/extHostSearch.test.ts index 9b3b96a10c1e4..af20a5e455b75 100644 --- a/src/vs/workbench/api/test/node/extHostSearch.test.ts +++ b/src/vs/workbench/api/test/node/extHostSearch.test.ts @@ -16,6 +16,7 @@ import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; import { MainContext, MainThreadSearchShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostConfigProvider, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration.js'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { Range } from 'vs/workbench/api/common/extHostTypes'; import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; @@ -144,6 +145,26 @@ suite('ExtHostSearch', () => { rpcProtocol, new class extends mock() { override remote = { isRemote: false, authority: undefined, connectionData: null }; }, new URITransformerService(null), + new class extends mock() { + override async getConfigProvider(): Promise { + return { + onDidChangeConfiguration(_listener: (event: vscode.ConfigurationChangeEvent) => void) { }, + getConfiguration(): vscode.WorkspaceConfiguration { + return { + get() { }, + has() { + return false; + }, + inspect() { + return undefined; + }, + async update() { } + }; + }, + + } as ExtHostConfigProvider; + } + }, logService ); this._pfs = mockPFS as any; diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index 6d39cc532d2cf..1da6d744da9fd 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -198,6 +198,11 @@ configurationRegistry.registerConfiguration({ description: nls.localize('search.quickOpen.includeSymbols', "Whether to include results from a global symbol search in the file results for Quick Open."), default: false }, + 'search.ripgrep.maxThreads': { + type: 'number', + description: nls.localize('search.ripgrep.maxThreads', "Number of threads to use for searching. When set to 0, the engine automatically determines this value."), + default: 0 + }, 'search.quickOpen.includeHistory': { type: 'boolean', description: nls.localize('search.quickOpen.includeHistory', "Whether to include results from recently opened files in the file results for Quick Open."), diff --git a/src/vs/workbench/services/search/common/searchExtTypesInternal.ts b/src/vs/workbench/services/search/common/searchExtTypesInternal.ts new file mode 100644 index 0000000000000..37ec6163bf5c1 --- /dev/null +++ b/src/vs/workbench/services/search/common/searchExtTypesInternal.ts @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import type { FileSearchOptions, TextSearchOptions } from './searchExtTypes'; + +interface RipgrepSearchOptionsCommon { + numThreads?: number; +} + +export interface RipgrepTextSearchOptions extends TextSearchOptions, RipgrepSearchOptionsCommon { } + +export interface RipgrepFileSearchOptions extends FileSearchOptions, RipgrepSearchOptionsCommon { } diff --git a/src/vs/workbench/services/search/node/fileSearch.ts b/src/vs/workbench/services/search/node/fileSearch.ts index 9b372b8dedbe6..a483dd848b0b8 100644 --- a/src/vs/workbench/services/search/node/fileSearch.ts +++ b/src/vs/workbench/services/search/node/fileSearch.ts @@ -105,7 +105,7 @@ export class FileWalker { killCmds.forEach(cmd => cmd()); } - walk(folderQueries: IFolderQuery[], extraFiles: URI[], onResult: (result: IRawFileMatch) => void, onMessage: (message: IProgressMessage) => void, done: (error: Error | null, isLimitHit: boolean) => void): void { + walk(folderQueries: IFolderQuery[], extraFiles: URI[], numThreads: number | undefined, onResult: (result: IRawFileMatch) => void, onMessage: (message: IProgressMessage) => void, done: (error: Error | null, isLimitHit: boolean) => void): void { this.fileWalkSW = StopWatch.create(false); // Support that the file pattern is a full path to a file that exists @@ -128,7 +128,7 @@ export class FileWalker { // For each root folder this.parallel(folderQueries, (folderQuery: IFolderQuery, rootFolderDone: (err: Error | null, result: void) => void) => { - this.call(this.cmdTraversal, this, folderQuery, onResult, onMessage, (err?: Error) => { + this.call(this.cmdTraversal, this, folderQuery, numThreads, onResult, onMessage, (err?: Error) => { if (err) { const errorMessage = toErrorMessage(err); console.error(errorMessage); @@ -181,7 +181,7 @@ export class FileWalker { } } - private cmdTraversal(folderQuery: IFolderQuery, onResult: (result: IRawFileMatch) => void, onMessage: (message: IProgressMessage) => void, cb: (err?: Error) => void): void { + private cmdTraversal(folderQuery: IFolderQuery, numThreads: number | undefined, onResult: (result: IRawFileMatch) => void, onMessage: (message: IProgressMessage) => void, cb: (err?: Error) => void): void { const rootFolder = folderQuery.folder.fsPath; const isMac = platform.isMacintosh; @@ -196,7 +196,7 @@ export class FileWalker { let leftover = ''; const tree = this.initDirectoryTree(); - const ripgrep = spawnRipgrepCmd(this.config, folderQuery, this.config.includePattern, this.folderExcludePatterns.get(folderQuery.folder.fsPath)!.expression); + const ripgrep = spawnRipgrepCmd(this.config, folderQuery, this.config.includePattern, this.folderExcludePatterns.get(folderQuery.folder.fsPath)!.expression, numThreads); const cmd = ripgrep.cmd; const noSiblingsClauses = !Object.keys(ripgrep.siblingClauses).length; @@ -628,16 +628,18 @@ export class Engine implements ISearchEngine { private folderQueries: IFolderQuery[]; private extraFiles: URI[]; private walker: FileWalker; + private numThreads?: number; - constructor(config: IFileQuery) { + constructor(config: IFileQuery, numThreads?: number) { this.folderQueries = config.folderQueries; this.extraFiles = config.extraFileResources || []; + this.numThreads = numThreads; this.walker = new FileWalker(config); } search(onResult: (result: IRawFileMatch) => void, onProgress: (progress: IProgressMessage) => void, done: (error: Error | null, complete: ISearchEngineSuccess) => void): void { - this.walker.walk(this.folderQueries, this.extraFiles, onResult, onProgress, (err: Error | null, isLimitHit: boolean) => { + this.walker.walk(this.folderQueries, this.extraFiles, this.numThreads, onResult, onProgress, (err: Error | null, isLimitHit: boolean) => { done(err, { limitHit: isLimitHit, stats: this.walker.getStats(), diff --git a/src/vs/workbench/services/search/node/rawSearchService.ts b/src/vs/workbench/services/search/node/rawSearchService.ts index f33611b3a01c9..61bde71b572d6 100644 --- a/src/vs/workbench/services/search/node/rawSearchService.ts +++ b/src/vs/workbench/services/search/node/rawSearchService.ts @@ -26,7 +26,7 @@ export class SearchService implements IRawSearchService { private caches: { [cacheKey: string]: Cache } = Object.create(null); - constructor(private readonly processType: IFileSearchStats['type'] = 'searchProcess') { } + constructor(private readonly processType: IFileSearchStats['type'] = 'searchProcess', private readonly getNumThreads?: () => Promise) { } fileSearch(config: IRawFileQuery): Event { let promise: CancelablePromise; @@ -34,8 +34,9 @@ export class SearchService implements IRawSearchService { const query = reviveQuery(config); const emitter = new Emitter({ onDidAddFirstListener: () => { - promise = createCancelablePromise(token => { - return this.doFileSearchWithEngine(FileSearchEngine, query, p => emitter.fire(p), token); + promise = createCancelablePromise(async token => { + const numThreads = await this.getNumThreads?.(); + return this.doFileSearchWithEngine(FileSearchEngine, query, p => emitter.fire(p), token, SearchService.BATCH_SIZE, numThreads); }); promise.then( @@ -72,9 +73,10 @@ export class SearchService implements IRawSearchService { return emitter.event; } - private ripgrepTextSearch(config: ITextQuery, progressCallback: IProgressCallback, token: CancellationToken): Promise { + private async ripgrepTextSearch(config: ITextQuery, progressCallback: IProgressCallback, token: CancellationToken): Promise { config.maxFileSize = this.getPlatformFileLimits().maxFileSize; - const engine = new TextSearchEngineAdapter(config); + const numThreads = await this.getNumThreads?.(); + const engine = new TextSearchEngineAdapter(config, numThreads); return engine.search(token, progressCallback, progressCallback); } @@ -85,11 +87,11 @@ export class SearchService implements IRawSearchService { }; } - doFileSearch(config: IFileQuery, progressCallback: IProgressCallback, token?: CancellationToken): Promise { - return this.doFileSearchWithEngine(FileSearchEngine, config, progressCallback, token); + doFileSearch(config: IFileQuery, numThreads: number | undefined, progressCallback: IProgressCallback, token?: CancellationToken): Promise { + return this.doFileSearchWithEngine(FileSearchEngine, config, progressCallback, token, SearchService.BATCH_SIZE, numThreads); } - doFileSearchWithEngine(EngineClass: { new(config: IFileQuery): ISearchEngine }, config: IFileQuery, progressCallback: IProgressCallback, token?: CancellationToken, batchSize = SearchService.BATCH_SIZE): Promise { + doFileSearchWithEngine(EngineClass: { new(config: IFileQuery, numThreads?: number | undefined): ISearchEngine }, config: IFileQuery, progressCallback: IProgressCallback, token?: CancellationToken, batchSize = SearchService.BATCH_SIZE, threads?: number): Promise { let resultCount = 0; const fileProgressCallback: IFileProgressCallback = progress => { if (Array.isArray(progress)) { @@ -107,7 +109,7 @@ export class SearchService implements IRawSearchService { let sortedSearch = this.trySortedSearchFromCache(config, fileProgressCallback, token); if (!sortedSearch) { const walkerConfig = config.maxResults ? Object.assign({}, config, { maxResults: null }) : config; - const engine = new EngineClass(walkerConfig); + const engine = new EngineClass(walkerConfig, threads); sortedSearch = this.doSortedSearch(engine, config, progressCallback, fileProgressCallback, token); } @@ -120,7 +122,7 @@ export class SearchService implements IRawSearchService { }); } - const engine = new EngineClass(config); + const engine = new EngineClass(config, threads); return this.doSearch(engine, fileProgressCallback, batchSize, token).then(complete => { return { diff --git a/src/vs/workbench/services/search/node/ripgrepFileSearch.ts b/src/vs/workbench/services/search/node/ripgrepFileSearch.ts index 8ad10f0ccbb5a..f833061c553a0 100644 --- a/src/vs/workbench/services/search/node/ripgrepFileSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepFileSearch.ts @@ -17,8 +17,8 @@ import { rgPath } from '@vscode/ripgrep'; // If @vscode/ripgrep is in an .asar file, then the binary is unpacked. const rgDiskPath = rgPath.replace(/\bnode_modules\.asar\b/, 'node_modules.asar.unpacked'); -export function spawnRipgrepCmd(config: IFileQuery, folderQuery: IFolderQuery, includePattern?: glob.IExpression, excludePattern?: glob.IExpression) { - const rgArgs = getRgArgs(config, folderQuery, includePattern, excludePattern); +export function spawnRipgrepCmd(config: IFileQuery, folderQuery: IFolderQuery, includePattern?: glob.IExpression, excludePattern?: glob.IExpression, numThreads?: number) { + const rgArgs = getRgArgs(config, folderQuery, includePattern, excludePattern, numThreads); const cwd = folderQuery.folder.fsPath; return { cmd: cp.spawn(rgDiskPath, rgArgs.args, { cwd }), @@ -29,7 +29,7 @@ export function spawnRipgrepCmd(config: IFileQuery, folderQuery: IFolderQuery, i }; } -function getRgArgs(config: IFileQuery, folderQuery: IFolderQuery, includePattern?: glob.IExpression, excludePattern?: glob.IExpression) { +function getRgArgs(config: IFileQuery, folderQuery: IFolderQuery, includePattern?: glob.IExpression, excludePattern?: glob.IExpression, numThreads?: number) { const args = ['--files', '--hidden', '--case-sensitive', '--no-require-git']; // includePattern can't have siblingClauses @@ -71,6 +71,10 @@ function getRgArgs(config: IFileQuery, folderQuery: IFolderQuery, includePattern args.push('--quiet'); } + if (numThreads) { + args.push('--threads', `${numThreads}`); + } + args.push('--no-config'); if (folderQuery.disregardGlobalIgnoreFiles) { args.push('--no-ignore-global'); diff --git a/src/vs/workbench/services/search/node/ripgrepSearchProvider.ts b/src/vs/workbench/services/search/node/ripgrepSearchProvider.ts index 56430c94287f4..bff10b050d6cf 100644 --- a/src/vs/workbench/services/search/node/ripgrepSearchProvider.ts +++ b/src/vs/workbench/services/search/node/ripgrepSearchProvider.ts @@ -6,27 +6,33 @@ import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cancellation'; import { OutputChannel } from 'vs/workbench/services/search/node/ripgrepSearchUtils'; import { RipgrepTextSearchEngine } from 'vs/workbench/services/search/node/ripgrepTextSearchEngine'; -import { TextSearchProvider, TextSearchComplete, TextSearchResult, TextSearchQuery, TextSearchOptions } from 'vs/workbench/services/search/common/searchExtTypes'; +import { TextSearchProvider, TextSearchComplete, TextSearchResult, TextSearchQuery, TextSearchOptions, } from 'vs/workbench/services/search/common/searchExtTypes'; import { Progress } from 'vs/platform/progress/common/progress'; import { Schemas } from 'vs/base/common/network'; +import type { RipgrepTextSearchOptions } from 'vs/workbench/services/search/common/searchExtTypesInternal'; export class RipgrepSearchProvider implements TextSearchProvider { private inProgress: Set = new Set(); - constructor(private outputChannel: OutputChannel) { + constructor(private outputChannel: OutputChannel, private getNumThreads: () => Promise) { process.once('exit', () => this.dispose()); } - provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken): Promise { - const engine = new RipgrepTextSearchEngine(this.outputChannel); + async provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken): Promise { + const numThreads = await this.getNumThreads(); + const engine = new RipgrepTextSearchEngine(this.outputChannel, numThreads); + const extendedOptions: RipgrepTextSearchOptions = { + ...options, + numThreads, + }; if (options.folder.scheme === Schemas.vscodeUserData) { // Ripgrep search engine can only provide file-scheme results, but we want to use it to search some schemes that are backed by the filesystem, but with some other provider as the frontend, // case in point vscode-userdata. In these cases we translate the query to a file, and translate the results back to the frontend scheme. - const translatedOptions = { ...options, folder: options.folder.with({ scheme: Schemas.file }) }; + const translatedOptions = { ...extendedOptions, folder: options.folder.with({ scheme: Schemas.file }) }; const progressTranslator = new Progress(data => progress.report({ ...data, uri: data.uri.with({ scheme: options.folder.scheme }) })); return this.withToken(token, token => engine.provideTextSearchResults(query, translatedOptions, progressTranslator, token)); } else { - return this.withToken(token, token => engine.provideTextSearchResults(query, options, progress, token)); + return this.withToken(token, token => engine.provideTextSearchResults(query, extendedOptions, progress, token)); } } diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index 727a1ba64c7c3..4740a66111967 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -18,13 +18,14 @@ import { Range, TextSearchComplete, TextSearchContext, TextSearchMatch, TextSear import { AST as ReAST, RegExpParser, RegExpVisitor } from 'vscode-regexpp'; import { rgPath } from '@vscode/ripgrep'; import { anchorGlob, createTextSearchResult, IOutputChannel, Maybe } from './ripgrepSearchUtils'; +import type { RipgrepTextSearchOptions } from 'vs/workbench/services/search/common/searchExtTypesInternal'; // If @vscode/ripgrep is in an .asar file, then the binary is unpacked. const rgDiskPath = rgPath.replace(/\bnode_modules\.asar\b/, 'node_modules.asar.unpacked'); export class RipgrepTextSearchEngine { - constructor(private outputChannel: IOutputChannel) { } + constructor(private outputChannel: IOutputChannel, private readonly _numThreads?: number | undefined) { } provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken): Promise { this.outputChannel.appendLine(`provideTextSearchResults ${query.pattern}, ${JSON.stringify({ @@ -37,7 +38,11 @@ export class RipgrepTextSearchEngine { return new Promise((resolve, reject) => { token.onCancellationRequested(() => cancel()); - const rgArgs = getRgArgs(query, options); + const extendedOptions: RipgrepTextSearchOptions = { + ...options, + numThreads: this._numThreads + }; + const rgArgs = getRgArgs(query, extendedOptions); const cwd = options.folder.fsPath; @@ -368,7 +373,7 @@ function getNumLinesAndLastNewlineLength(text: string): { numLines: number; last } // exported for testing -export function getRgArgs(query: TextSearchQuery, options: TextSearchOptions): string[] { +export function getRgArgs(query: TextSearchQuery, options: RipgrepTextSearchOptions): string[] { const args = ['--hidden', '--no-require-git']; args.push(query.isCaseSensitive ? '--case-sensitive' : '--ignore-case'); @@ -422,6 +427,10 @@ export function getRgArgs(query: TextSearchQuery, options: TextSearchOptions): s args.push('--encoding', options.encoding); } + if (options.numThreads) { + args.push('--threads', `${options.numThreads}`); + } + // Ripgrep handles -- as a -- arg separator. Only --. // - is ok, --- is ok, --some-flag is also ok. Need to special case. if (query.pattern === '--') { diff --git a/src/vs/workbench/services/search/node/textSearchAdapter.ts b/src/vs/workbench/services/search/node/textSearchAdapter.ts index 45b8aab292255..58145f0af5639 100644 --- a/src/vs/workbench/services/search/node/textSearchAdapter.ts +++ b/src/vs/workbench/services/search/node/textSearchAdapter.ts @@ -11,7 +11,7 @@ import { NativeTextSearchManager } from 'vs/workbench/services/search/node/textS export class TextSearchEngineAdapter { - constructor(private query: ITextQuery) { } + constructor(private query: ITextQuery, private numThreads?: number) { } search(token: CancellationToken, onResult: (matches: ISerializedFileMatch[]) => void, onMessage: (message: IProgressMessage) => void): Promise { if ((!this.query.folderQueries || !this.query.folderQueries.length) && (!this.query.extraFileResources || !this.query.extraFileResources.length)) { @@ -30,7 +30,7 @@ export class TextSearchEngineAdapter { onMessage({ message: msg }); } }; - const textSearchManager = new NativeTextSearchManager(this.query, new RipgrepTextSearchEngine(pretendOutputChannel), pfs); + const textSearchManager = new NativeTextSearchManager(this.query, new RipgrepTextSearchEngine(pretendOutputChannel, this.numThreads), pfs); return new Promise((resolve, reject) => { return textSearchManager .search( diff --git a/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts b/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts index 126561405bb24..3cfd50a70f539 100644 --- a/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/fileSearch.integrationTest.ts @@ -25,11 +25,13 @@ const MULTIROOT_QUERIES: IFolderQuery[] = [ { folder: URI.file(MORE_FIXTURES) } ]; +const numThreads = undefined; + async function doSearchTest(query: IFileQuery, expectedResultCount: number | Function): Promise { const svc = new SearchService(); const results: ISerializedSearchProgressItem[] = []; - await svc.doFileSearch(query, e => { + await svc.doFileSearch(query, numThreads, e => { if (!isProgressMessage(e)) { if (Array.isArray(e)) { results.push(...e); From 5f13aa974922de613cb205e3ed51a6ca65c55726 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Thu, 6 Jun 2024 10:41:40 -0700 Subject: [PATCH 135/755] Fix HC textPreformat colors --- src/vs/platform/theme/common/colors/baseColors.ts | 2 +- .../welcomeWalkthrough/browser/media/walkThroughPart.css | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colors/baseColors.ts b/src/vs/platform/theme/common/colors/baseColors.ts index 9a02e218db869..1d19b3adc1fc4 100644 --- a/src/vs/platform/theme/common/colors/baseColors.ts +++ b/src/vs/platform/theme/common/colors/baseColors.ts @@ -65,7 +65,7 @@ export const textSeparatorForeground = registerColor('textSeparator.foreground', // ------ text preformat export const textPreformatForeground = registerColor('textPreformat.foreground', - { light: '#A31515', dark: '#D7BA7D', hcDark: '#FFFFFF', hcLight: '#000000' }, + { light: '#A31515', dark: '#D7BA7D', hcDark: '#000000', hcLight: '#FFFFFF' }, nls.localize('textPreformatForeground', "Foreground color for preformatted text segments.")); export const textPreformatBackground = registerColor('textPreformat.background', diff --git a/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css b/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css index ed362ff32c5d4..9622dd1b858c1 100644 --- a/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css @@ -153,6 +153,8 @@ .monaco-workbench .part.editor > .content .walkThroughContent code, .monaco-workbench .part.editor > .content .walkThroughContent .shortcut { color: var(--vscode-textPreformat-foreground); + background-color: var(--vscode-textPreformat-background); + border-radius: 3px; } .monaco-workbench .part.editor > .content .walkThroughContent .monaco-editor { From 6e4ace33dd4f78cdc9b3f5cf83b43aad68130bb6 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Thu, 6 Jun 2024 12:06:35 -0700 Subject: [PATCH 136/755] Update colors (#214352) From dfedd9ba12765f85be6fda105c4f3b7091b9b65a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 6 Jun 2024 21:55:49 +0200 Subject: [PATCH 137/755] profiles editor: incorporate feedback (#214490) --- .../node/extensionManagementService.ts | 12 +- .../browser/media/userDataProfilesEditor.css | 105 +++++-- .../browser/userDataProfile.ts | 178 ++++-------- .../browser/userDataProfilesEditor.ts | 275 +++++++++++++----- .../browser/userDataProfilesEditorModel.ts | 225 ++++++++++---- .../userDataProfile/common/userDataProfile.ts | 2 + 6 files changed, 504 insertions(+), 293 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 5c9916b3e2c02..b5a1d51f90046 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -768,7 +768,7 @@ export class ExtensionsScanner extends Disposable { } } - private async scanLocalExtension(location: URI, type: ExtensionType, profileLocation?: URI): Promise { + async scanLocalExtension(location: URI, type: ExtensionType, profileLocation?: URI): Promise { try { if (profileLocation) { const scannedExtensions = await this.extensionsScannerService.scanUserExtensions({ profileLocation }); @@ -921,13 +921,9 @@ class InstallExtensionInProfileTask extends AbstractExtensionTask { - const installed = await this.extensionsScanner.scanExtensions(null, this.options.profileLocation, this.options.productVersion); - return installed.find(i => areSameExtensions(i.identifier, this.identifier)); - } - protected async doRun(token: CancellationToken): Promise { - const existingExtension = await this.getExistingExtension(); + const installed = await this.extensionsScanner.scanExtensions(ExtensionType.User, this.options.profileLocation, this.options.productVersion); + const existingExtension = installed.find(i => areSameExtensions(i.identifier, this.identifier)); if (existingExtension) { this._operation = InstallOperation.Update; } @@ -1018,7 +1014,7 @@ class InstallExtensionInProfileTask extends AbstractExtensionTask .sash-container, +.profiles-editor .monaco-split-view2.separator-border.horizontal > .monaco-scrollable-element > .split-view-container > .split-view-view:not(:first-child)::before { + top: 55px; +} + .profiles-editor .contents-container { padding: 0px 20px; height: 100%; @@ -42,8 +47,20 @@ padding: 0 4px; } +.profiles-editor .monaco-list-row .profile-tree-item-actions-container { + display: none; +} + +.profiles-editor .monaco-list-row.focused .profile-tree-item-actions-container, +.profiles-editor .monaco-list-row.selected .profile-tree-item-actions-container, +.profiles-editor .monaco-list-row:hover .profile-tree-item-actions-container { + flex: 1; + display: flex; + align-items: center; +} + .profiles-editor .sidebar-container .profiles-list { - margin-top: 10px; + margin-top: 15px; } .profiles-editor .sidebar-container .profiles-list .profile-list-item { @@ -68,6 +85,11 @@ opacity: 0.7; } +.profiles-editor .sidebar-container .profiles-list .profile-list-item .profile-tree-item-actions-container { + justify-content: flex-end; + margin-right: 10px; +} + .profiles-editor .hide { display: none !important; } @@ -82,18 +104,18 @@ flex: 1; display: flex; align-items: center; - font-size: large; + font-size: medium; } .profiles-editor .contents-container .profile-title-container .codicon { cursor: pointer; font-size: large; - padding: 6px; + padding: 4px; margin-right: 8px; } .profiles-editor .contents-container .profile-title-container .monaco-inputbox { - width: 330px; + width: 340px; } .profiles-editor .contents-container .profile-header .profile-button-container { @@ -102,25 +124,15 @@ } .profiles-editor .contents-container .profile-header .profile-button-container .monaco-button { - margin-right: 4px; + margin-left: 4px; } .profiles-editor .contents-container .profile-header .profile-actions-container { display: flex; - height: 28px; -} - -.profiles-editor .contents-container .profile-header .profile-actions-container .actions-container { - gap: 4px; -} - -.profiles-editor .contents-container .profile-header .profile-actions-container .actions-container .codicon { - font-size: 18px; - padding: 6px; } .profiles-editor .contents-container .profile-header .profile-actions-container .profile-button-container { - margin-left:6px; + margin-right: 6px; min-width: 120px; } @@ -129,6 +141,10 @@ padding-right: 10px; } +.profiles-editor .contents-container .profile-header .profile-actions-container .actions-container .action-label { + padding: 6px; +} + .profiles-editor .contents-container .profile-body { margin-top: 20px; } @@ -142,15 +158,15 @@ .profiles-editor .contents-container .profile-select-container > .monaco-select-box { cursor: pointer; - line-height: 17px; - padding: 2px 23px 2px 8px; + line-height: 18px; + padding: 0px 23px 0px 8px; border-radius: 2px; } .profiles-editor .contents-container .profile-copy-from-container { display: flex; align-items: center; - margin: 0px 0px 20px 28px; + margin: 0px 0px 20px 36px; } .profiles-editor .contents-container .profile-copy-from-container > .profile-copy-from-label { @@ -166,35 +182,60 @@ .profiles-editor .contents-container .profile-use-as-default-container { display: flex; align-items: center; - margin: 25px 20px 20px 28px; + margin: 0px 20px 15px 6px; cursor: pointer; } +.profiles-editor .contents-container .profile-use-as-default-container .profile-use-as-default-label { + margin-left: 2px; +} + .profiles-editor .contents-container .profile-contents-container { margin: 0px 0px 10px 20px; } +.profiles-editor .contents-container .profile-content-tree-header, +.profiles-editor .contents-container .profile-content-tree { + margin-left: 6px; + max-width: 450px; +} + +.profiles-editor .contents-container .profile-content-tree-header { + display: flex; + height: 24px; + align-items: center; + margin-bottom: 2px; + background-color: var(--vscode-keybindingTable-headerBackground); + font-weight: bold; +} + .profiles-editor .contents-container .profile-tree-item-container { display: flex; align-items: center; } -.profiles-editor .contents-container .profile-tree-item-container > .profile-resource-type-label { +.profiles-editor .contents-container .profile-content-tree-header :first-child { width: 200px; } +.profiles-editor .contents-container .profile-tree-item-container > .profile-resource-type-label, +.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-resource-type-label-container { + width: 170px; +} + +.profiles-editor .contents-container .profile-content-tree-header > .inherit-label, .profiles-editor .contents-container .profile-tree-item-container > .inherit-container { + width: 130px; display: flex; + justify-content: center; align-items: center; } -.profiles-editor .contents-container .profile-tree-item-container > .inherit-container > .inherit-label { - /* font-size: 0.9em; */ - opacity: 0.8; -} - -.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-resource-type-label-container { - width: 170px; +.profiles-editor .contents-container .profile-content-tree-header > .actions-label { + flex: 1; + display: flex; + justify-content: center; + align-items: center; } .profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-select-container { @@ -206,3 +247,11 @@ font-size: 0.9em; opacity: 0.7; } + +.profiles-editor .contents-container .profile-tree-item-container.profile-resource-child-container > .monaco-icon-label { + width: 295px; +} + +.profiles-editor .contents-container .profile-tree-item-container .profile-tree-item-actions-container { + justify-content: center; +} diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts index cdfb41bec612e..0f4cc81f9da6d 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts @@ -34,6 +34,8 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; type IProfileTemplateQuickPickItem = IQuickPickItem & IProfileTemplateInfo; +export const OpenProfileMenu = new MenuId('OpenProfile'); + export class UserDataProfilesWorkbenchContribution extends Disposable implements IWorkbenchContribution { static readonly ID = 'workbench.contrib.userDataProfiles'; @@ -100,6 +102,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements this._register(this.registerManageProfilesAction()); this._register(this.registerSwitchProfileAction()); + this.registerOpenProfileSubMenu(); this.registerProfilesActions(); this._register(this.userDataProfilesService.onDidChangeProfiles(() => this.registerProfilesActions())); @@ -137,15 +140,23 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements }); } + private registerOpenProfileSubMenu(): void { + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + title: localize('open profile', "Open Profile"), + submenu: OpenProfileMenu, + group: '2_open', + order: 4, + when: HAS_PROFILES_CONTEXT, + }); + } + private readonly profilesDisposable = this._register(new MutableDisposable()); private registerProfilesActions(): void { this.profilesDisposable.value = new DisposableStore(); for (const profile of this.userDataProfilesService.profiles) { if (!profile.isTransient) { this.profilesDisposable.value.add(this.registerProfileEntryAction(profile)); - if (!profile.isDefault) { - this.profilesDisposable.value.add(this.registerNewWindowAction(profile)); - } + this.profilesDisposable.value.add(this.registerNewWindowAction(profile)); } } } @@ -189,19 +200,19 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements } private registerNewWindowAction(profile: IUserDataProfile): IDisposable { - return registerAction2(class NewWindowAction extends Action2 { + const disposables = new DisposableStore(); + + const id = `workbench.action.openProfile.${profile.name.toLowerCase().replace('/\s+/', '_')}`; + + disposables.add(registerAction2(class NewWindowAction extends Action2 { constructor() { super({ - id: `workbench.action.${profile.name.toLowerCase().replace('/\s+/', '_')}.newWindow`, - title: { - ...localize2('newWindow', "New {0} Window", profile.name), - }, - f1: true, + id, + title: localize2('openShort', "{0}", profile.name), menu: { - id: MenuId.MenubarFileMenu, - group: '1_new', - order: 4 + id: OpenProfileMenu, + when: HAS_PROFILES_CONTEXT } }); } @@ -210,7 +221,18 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements const hostService = accessor.get(IHostService); return hostService.openWindow({ remoteAuthority: null, forceProfile: profile.name }); } - }); + })); + + disposables.add(MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id, + category: PROFILES_CATEGORY, + title: localize2('open', "Open {0} Profile", profile.name), + precondition: HAS_PROFILES_CONTEXT + }, + })); + + return disposables; } private registerSwitchProfileAction(): IDisposable { @@ -247,15 +269,12 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements private readonly currentprofileActionsDisposable = this._register(new MutableDisposable()); private registerCurrentProfilesActions(): void { this.currentprofileActionsDisposable.value = new DisposableStore(); - this.currentprofileActionsDisposable.value.add(this.registerEditCurrentProfileAction()); - this.currentprofileActionsDisposable.value.add(this.registerShowCurrentProfileContentsAction()); this.currentprofileActionsDisposable.value.add(this.registerExportCurrentProfileAction()); this.currentprofileActionsDisposable.value.add(this.registerImportProfileAction()); } private registerManageProfilesAction(): IDisposable { const disposables = new DisposableStore(); - const precondition = ContextKeyExpr.equals('config.workbench.experimental.enableNewProfilesUI', true); disposables.add(registerAction2(class ManageProfilesAction extends Action2 { constructor() { super({ @@ -265,23 +284,15 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements mnemonicTitle: localize({ key: 'miOpenProfiles', comment: ['&& denotes a mnemonic'] }, "&&Profiles"), }, menu: [ - { - id: ProfilesMenu, - group: '2_manage_current', - when: precondition, - order: 1 - }, { id: MenuId.GlobalActivity, group: '2_configuration', - order: 1, - when: ContextKeyExpr.and(HAS_PROFILES_CONTEXT.negate(), precondition), + order: 1 }, { id: MenuId.MenubarPreferencesMenu, group: '2_configuration', - order: 1, - when: ContextKeyExpr.and(HAS_PROFILES_CONTEXT.negate(), precondition), + order: 1 }, ] }); @@ -297,66 +308,12 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements id: 'workbench.profiles.actions.manageProfiles', category: Categories.Preferences, title: localize2('open profiles', "Open Profiles (UI)"), - precondition: precondition, }, })); return disposables; } - - private registerEditCurrentProfileAction(): IDisposable { - const that = this; - return registerAction2(class RenameCurrentProfileAction extends Action2 { - constructor() { - const precondition = ContextKeyExpr.and(ContextKeyExpr.notEquals(CURRENT_PROFILE_CONTEXT.key, that.userDataProfilesService.defaultProfile.id), IS_CURRENT_PROFILE_TRANSIENT_CONTEXT.toNegated()); - super({ - id: `workbench.profiles.actions.editCurrentProfile`, - title: localize2('edit profile', "Edit Profile..."), - precondition: precondition, - f1: true, - menu: [ - { - id: ProfilesMenu, - group: '2_manage_current', - when: ContextKeyExpr.and(precondition, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), - order: 2 - } - ] - }); - } - run() { - return that.userDataProfileImportExportService.editProfile(that.userDataProfileService.currentProfile); - } - }); - } - - private registerShowCurrentProfileContentsAction(): IDisposable { - const id = 'workbench.profiles.actions.showProfileContents'; - return registerAction2(class ShowProfileContentsAction extends Action2 { - constructor() { - super({ - id, - title: localize2('show profile contents', "Show Profile Contents"), - category: PROFILES_CATEGORY, - menu: [ - { - id: ProfilesMenu, - group: '2_manage_current', - order: 3, - when: ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true) - } - ] - }); - } - - async run(accessor: ServicesAccessor) { - const userDataProfileImportExportService = accessor.get(IUserDataProfileImportExportService); - return userDataProfileImportExportService.showProfileContents(); - } - }); - } - private registerExportCurrentProfileAction(): IDisposable { const that = this; const disposables = new DisposableStore(); @@ -365,34 +322,22 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements constructor() { super({ id, - title: localize2('export profile', "Export Profile..."), + title: localize2('export profile', "Export Profile ({0})...", that.userDataProfileService.currentProfile.name), category: PROFILES_CATEGORY, precondition: IS_PROFILE_EXPORT_IN_PROGRESS_CONTEXT.toNegated(), - menu: [ - { - id: ProfilesMenu, - group: '4_import_export_profiles', - order: 1, - when: ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true), - }, { - id: MenuId.CommandPalette - } - ] + f1: true, + menu: { + id: MenuId.MenubarShare + } }); } async run(accessor: ServicesAccessor) { - const userDataProfileImportExportService = accessor.get(IUserDataProfileImportExportService); - return userDataProfileImportExportService.exportProfile(); + const editorGroupsService = accessor.get(IEditorGroupsService); + const instantiationService = accessor.get(IInstantiationService); + return editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(instantiationService)); } })); - disposables.add(MenuRegistry.appendMenuItem(MenuId.MenubarShare, { - command: { - id, - title: localize2('export profile in share', "Export Profile ({0})...", that.userDataProfileService.currentProfile.name), - precondition: PROFILES_ENABLEMENT_CONTEXT, - }, - })); return disposables; } @@ -407,17 +352,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements title: localize2('import profile', "Import Profile..."), category: PROFILES_CATEGORY, precondition: IS_PROFILE_IMPORT_IN_PROGRESS_CONTEXT.toNegated(), - menu: [ - { - id: ProfilesMenu, - group: '4_import_export_profiles', - when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), - order: 2 - }, { - id: MenuId.CommandPalette, - when: PROFILES_ENABLEMENT_CONTEXT, - } - ] + f1: true, }); } @@ -519,7 +454,6 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements } private registerCreateProfileAction(): void { - const that = this; this._register(registerAction2(class CreateProfileAction extends Action2 { constructor() { super({ @@ -528,19 +462,13 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements category: PROFILES_CATEGORY, precondition: PROFILES_ENABLEMENT_CONTEXT, f1: true, - menu: [ - { - id: ProfilesMenu, - group: '3_manage_profiles', - when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), - order: 1 - } - ] }); } async run(accessor: ServicesAccessor) { - return that.userDataProfileImportExportService.createProfile(); + const editorGroupsService = accessor.get(IEditorGroupsService); + const instantiationService = accessor.get(IInstantiationService); + return editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(instantiationService)); } })); } @@ -554,14 +482,6 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements category: PROFILES_CATEGORY, f1: true, precondition: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, HAS_PROFILES_CONTEXT), - menu: [ - { - id: ProfilesMenu, - group: '3_manage_profiles', - when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, ContextKeyExpr.notEquals('config.workbench.experimental.enableNewProfilesUI', true)), - order: 2 - } - ] }); } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index f236412049a42..2f4c25dd78de7 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -117,7 +117,7 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi layout: (width, _, height) => { sidebarView.style.width = `${width}px`; if (height && this.profilesList) { - const listHeight = height - 40 /* new profile button */ - 10 /* padding */; + const listHeight = height - 40 /* new profile button */ - 15 /* marginTop */; this.profilesList.getHTMLElement().style.height = `${listHeight}px`; this.profilesList.layout(listHeight, width); } @@ -136,9 +136,6 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi } }, Sizing.Distribute, undefined, true); - const borderColor = this.theme.getColor(profilesSashBorder)!; - this.splitView.style({ separatorBorder: borderColor }); - this.registerListeners(); this.userDataProfileManagementService.getBuiltinProfileTemplates().then(templates => { @@ -147,6 +144,11 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi }); } + override updateStyles(): void { + const borderColor = this.theme.getColor(profilesSashBorder)!; + this.splitView?.style({ separatorBorder: borderColor }); + } + private renderSidebar(parent: HTMLElement): void { // render New Profile Button this.renderNewProfileButton(append(parent, $('.new-profile-button'))); @@ -188,10 +190,7 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi getActions: () => { const actions: IAction[] = []; if (this.templates.length) { - actions.push(new SubmenuAction('from.template', localize('from template', "From Template"), - this.templates.map(template => new Action(`template:${template.url}`, template.name, undefined, true, async () => { - this.createNewProfile(URI.parse(template.url)); - })))); + actions.push(new SubmenuAction('from.template', localize('from template', "From Template"), this.getCreateFromTemplateActions())); actions.push(new Separator()); } actions.push(new Action('importProfile', localize('importProfile', "Import Profile..."), undefined, true, () => this.importProfile())); @@ -203,10 +202,16 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi supportIcons: true, ...defaultButtonStyles })); - button.label = `$(add) ${localize('newProfile', "New Profile")}`; + button.label = localize('newProfile', "New Profile"); this._register(button.onDidClick(e => this.createNewProfile())); } + private getCreateFromTemplateActions(): IAction[] { + return this.templates.map(template => new Action(`template:${template.url}`, template.name, undefined, true, async () => { + this.createNewProfile(URI.parse(template.url)); + })); + } + private registerListeners(): void { if (this.profilesList) { this._register(this.profilesList.onDidChangeSelection(e => { @@ -215,17 +220,41 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi this.profileWidget?.render(element); } })); - this._register(this.profilesList.onContextMenu(e => { + const actions: IAction[] = []; + if (!e.element) { + actions.push(...this.getTreeContextMenuActions()); + } if (e.element instanceof AbstractUserDataProfileElement) { + actions.push(...e.element.contextMenuActions); + } + if (actions.length) { this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, - getActions: () => e.element instanceof AbstractUserDataProfileElement ? e.element.contextMenuActions.slice(0) : [], + getActions: () => actions, getActionsContext: () => e.element }); } })); + this._register(this.profilesList.onMouseDblClick(e => { + if (!e.element) { + this.createNewProfile(); + } + })); + } + } + + + private getTreeContextMenuActions(): IAction[] { + const actions: IAction[] = []; + actions.push(new Action('newProfile', localize('newProfile', "New Profile"), undefined, true, () => this.createNewProfile())); + const templateActions = this.getCreateFromTemplateActions(); + if (templateActions.length) { + actions.push(new SubmenuAction('from.template', localize('new from template', "New Profile From Template"), templateActions)); } + actions.push(new Separator()); + actions.push(new Action('importProfile', localize('importProfile', "Import Profile..."), undefined, true, () => this.importProfile())); + return actions; } private async importProfile(): Promise { @@ -338,12 +367,14 @@ interface IProfileElementTemplateData { readonly icon: HTMLElement; readonly label: HTMLElement; readonly description: HTMLElement; + readonly actionBar: WorkbenchToolBar; readonly disposables: DisposableStore; + readonly elementDisposables: DisposableStore; } class ProfileElementDelegate implements IListVirtualDelegate { getHeight(element: AbstractUserDataProfileElement) { - return 30; + return 22; } getTemplateId() { return 'profileListElement'; } } @@ -352,24 +383,42 @@ class ProfileElementRenderer implements IListRenderer { + templateData.elementDisposables.add(element.onDidChange(e => { if (e.name) { templateData.label.textContent = element.name; } @@ -385,10 +434,16 @@ class ProfileElementRenderer implements IListRenderer; private _templates: IProfileTemplateInfo[] = []; @@ -471,6 +527,7 @@ class ProfileWidget extends Disposable { })); const actionsContainer = append(header, $('.profile-actions-container')); + this.buttonContainer = append(actionsContainer, $('.profile-button-container')); this.toolbar = this._register(instantiationService.createInstance(WorkbenchToolBar, actionsContainer, { @@ -478,7 +535,6 @@ class ProfileWidget extends Disposable { highlightToggledItems: true } )); - this.buttonContainer = append(actionsContainer, $('.profile-button-container')); const body = append(parent, $('.profile-body')); @@ -497,7 +553,7 @@ class ProfileWidget extends Disposable { this.copyFromSelectBox.render(append(this.copyFromContainer, $('.profile-select-container'))); this.useAsDefaultProfileContainer = append(body, $('.profile-use-as-default-container')); - const useAsDefaultProfileTitle = localize('enable for new windows', "Enable this profile for new windows"); + const useAsDefaultProfileTitle = localize('enable for new windows', "Use this profile for new windows"); this.useAsDefaultProfileCheckbox = this._register(new Checkbox(useAsDefaultProfileTitle, false, defaultCheckboxStyles)); append(this.useAsDefaultProfileContainer, this.useAsDefaultProfileCheckbox.domNode); const useAsDefaultProfileLabel = append(this.useAsDefaultProfileContainer, $('.profile-use-as-default-label', undefined, useAsDefaultProfileTitle)); @@ -512,6 +568,12 @@ class ProfileWidget extends Disposable { } })); + this.contentsTreeHeader = append(body, $('.profile-content-tree-header')); + append(this.contentsTreeHeader, + $(''), + $('.inherit-label', undefined, localize('default profile', "Use Default Profile")), + $('.actions-label', undefined, localize('actions', "Actions")), + ); const delegate = new ProfileResourceTreeElementDelegate(); this.resourcesTree = this._register(this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'ProfileEditor-ResourcesTree', @@ -551,7 +613,7 @@ class ProfileWidget extends Disposable { expandOnlyOnTwistieClick: true, renderIndentGuides: RenderIndentGuides.None, enableStickyScroll: false, - openOnSingleClick: false + openOnSingleClick: false, })); this._register(this.resourcesTree.onDidOpen(async (e) => { if (!e.browserEvent) { @@ -625,19 +687,7 @@ class ProfileWidget extends Disposable { } private renderSelectBox(): void { - const separator = { text: '\u2500\u2500\u2500\u2500\u2500\u2500', isDisabled: true }; - this.copyFromOptions.push({ text: localize('empty profile', "None") }); - if (this._templates.length) { - this.copyFromOptions.push({ ...separator, decoratorRight: localize('from templates', "Profile Templates") }); - for (const template of this._templates) { - this.copyFromOptions.push({ text: template.name, id: template.url, source: URI.parse(template.url) }); - } - } - this.copyFromOptions.push({ ...separator, decoratorRight: localize('from existing profiles', "Existing Profiles") }); - for (const profile of this.userDataProfilesService.profiles) { - this.copyFromOptions.push({ text: profile.name, id: profile.id, source: profile }); - } - this.copyFromSelectBox.setOptions(this.copyFromOptions); + this.copyFromSelectBox.setOptions(this.getCopyFromOptions()); this._register(this.copyFromSelectBox.onDidSelect(option => { if (this._profileElement.value?.element instanceof NewProfileElement) { this._profileElement.value.element.copyFrom = this.copyFromOptions[option.index].source; @@ -662,7 +712,7 @@ class ProfileWidget extends Disposable { this.resourcesTree.setInput(profileElement); disposables.add(profileElement.onDidChange(e => { - if (e.flags || e.copyFrom || e.copyFlags) { + if (e.flags || e.copyFrom || e.copyFlags || e.disabled) { const viewState = this.resourcesTree.getViewState(); this.resourcesTree.setInput(profileElement, { ...viewState, @@ -671,49 +721,54 @@ class ProfileWidget extends Disposable { } })); - if (profileElement.primaryAction || profileElement.secondaryAction) { + const [primaryTitleButtons, secondatyTitleButtons] = profileElement.titleButtons; + if (primaryTitleButtons?.length || secondatyTitleButtons?.length) { this.buttonContainer.classList.remove('hide'); - if (profileElement.primaryAction) { - const button = disposables.add(new Button(this.buttonContainer, { - ...defaultButtonStyles - })); - button.label = profileElement.primaryAction.label; - button.enabled = profileElement.primaryAction.enabled; - disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(profileElement.primaryAction!.run()))); - disposables.add(profileElement.primaryAction.onDidChange((e) => { - if (!isUndefined(e.enabled)) { - button.enabled = profileElement.primaryAction!.enabled; - } - })); - disposables.add(profileElement.onDidChange(e => { - if (e.message) { - button.setTitle(profileElement.message ?? profileElement.primaryAction!.label); - button.element.classList.toggle('error', !!profileElement.message); - } - })); + if (primaryTitleButtons?.length) { + for (const action of primaryTitleButtons) { + const button = disposables.add(new Button(this.buttonContainer, { + ...defaultButtonStyles + })); + button.label = action.label; + button.enabled = action.enabled; + disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(action.run()))); + disposables.add(action.onDidChange((e) => { + if (!isUndefined(e.enabled)) { + button.enabled = action.enabled; + } + })); + disposables.add(profileElement.onDidChange(e => { + if (e.message) { + button.setTitle(profileElement.message ?? action.label); + button.element.classList.toggle('error', !!profileElement.message); + } + })); + } } - if (profileElement.secondaryAction) { - const button = disposables.add(new Button(this.buttonContainer, { - ...defaultButtonStyles, - secondary: true - })); - button.label = profileElement.secondaryAction.label; - button.enabled = profileElement.secondaryAction.enabled; - disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(profileElement.secondaryAction!.run()))); - disposables.add(profileElement.secondaryAction.onDidChange((e) => { - if (!isUndefined(e.enabled)) { - button.enabled = profileElement.secondaryAction!.enabled; - } - })); + if (secondatyTitleButtons?.length) { + for (const action of secondatyTitleButtons) { + const button = disposables.add(new Button(this.buttonContainer, { + ...defaultButtonStyles, + secondary: true + })); + button.label = action.label; + button.enabled = action.enabled; + disposables.add(button.onDidClick(() => this.editorProgressService.showWhile(action.run()))); + disposables.add(action.onDidChange((e) => { + if (!isUndefined(e.enabled)) { + button.enabled = action.enabled; + } + })); + } } } else { this.buttonContainer.classList.add('hide'); } - this.toolbar.setActions(profileElement.titleActions[0].slice(0), profileElement.titleActions[1].slice(0)); + this.toolbar.setActions([], profileElement.titleActions[1].slice(0)); if (profileElement instanceof NewProfileElement) { this.nameInput.focus(); @@ -735,8 +790,10 @@ class ProfileWidget extends Disposable { this.iconElement.className = ThemeIcon.asClassName(ThemeIcon.fromId(DEFAULT_ICON.id)); } if (profileElement instanceof NewProfileElement) { + this.contentsTreeHeader.classList.add('hide'); this.useAsDefaultProfileContainer.classList.add('hide'); this.copyFromContainer.classList.remove('hide'); + this.copyFromOptions = this.getCopyFromOptions(); const id = profileElement.copyFrom instanceof URI ? profileElement.copyFrom.toString() : profileElement.copyFrom?.id; const index = id ? this.copyFromOptions.findIndex(option => option.id === id) @@ -750,11 +807,29 @@ class ProfileWidget extends Disposable { this.copyFromSelectBox.setEnabled(false); } } else if (profileElement instanceof UserDataProfileElement) { + this.contentsTreeHeader.classList.toggle('hide', profileElement.profile.isDefault); this.useAsDefaultProfileContainer.classList.remove('hide'); this.useAsDefaultProfileCheckbox.checked = profileElement.isNewWindowProfile; this.copyFromContainer.classList.add('hide'); } } + + private getCopyFromOptions(): (ISelectOptionItem & { id?: string; source?: IUserDataProfile | URI })[] { + const separator = { text: '\u2500\u2500\u2500\u2500\u2500\u2500', isDisabled: true }; + const copyFromOptions: (ISelectOptionItem & { id?: string; source?: IUserDataProfile | URI })[] = []; + copyFromOptions.push({ text: localize('empty profile', "None") }); + if (this._templates.length) { + copyFromOptions.push({ ...separator, decoratorRight: localize('from templates', "Profile Templates") }); + for (const template of this._templates) { + copyFromOptions.push({ text: template.name, id: template.url, source: URI.parse(template.url) }); + } + } + copyFromOptions.push({ ...separator, decoratorRight: localize('from existing profiles', "Existing Profiles") }); + for (const profile of this.userDataProfilesService.profiles) { + copyFromOptions.push({ text: profile.name, id: profile.id, source: profile }); + } + return copyFromOptions; + } } @@ -774,7 +849,7 @@ class ProfileResourceTreeElementDelegate implements IListVirtualDelegateelement.element).resourceType)) { + const resourceType = (element.element).resourceType; + if (element.root.getFlag(resourceType)) { return true; } + if (!element.root.hasResource(resourceType)) { + return false; + } if (element.root.copyFrom === undefined) { return false; } - if (!element.root.getCopyFlag((element.element).resourceType)) { + if (!element.root.getCopyFlag(resourceType)) { return false; } } @@ -829,6 +908,7 @@ class ProfileResourceTreeDataSource implements IAsyncDataSource, index: number, templateData: IExistingProfileResourceTemplateData, height: number | undefined): void { @@ -906,12 +1001,14 @@ class ExistingProfileResourceTreeRenderer extends AbstractProfileResourceTreeRen templateData.label.textContent = this.getResourceTypeTitle(element.resourceType); if (root instanceof UserDataProfileElement && root.profile.isDefault) { - templateData.inheritContainer.classList.add('hide'); + templateData.checkbox.domNode.classList.add('hide'); } else { - templateData.inheritContainer.classList.remove('hide'); + templateData.checkbox.domNode.classList.remove('hide'); templateData.checkbox.checked = root.getFlag(element.resourceType); templateData.elementDisposables.add(templateData.checkbox.onChange(() => root.setFlag(element.resourceType, templateData.checkbox.checked))); } + + templateData.actionBar.setActions(element.action ? [element.action] : []); } } @@ -946,7 +1043,16 @@ class NewProfileResourceTreeRenderer extends AbstractProfileResourceTreeRenderer const selectContainer = append(container, $('.profile-select-container')); selectBox.render(selectContainer); - return { label, selectContainer, selectBox, disposables, elementDisposables: disposables.add(new DisposableStore()) }; + const actionsContainer = append(container, $('.profile-tree-item-actions-container')); + const actionBar = disposables.add(this.instantiationService.createInstance(WorkbenchToolBar, + actionsContainer, + { + hoverDelegate: disposables.add(createInstantHoverDelegate()), + highlightToggledItems: true + } + )); + + return { label, selectContainer, selectBox, actionBar, disposables, elementDisposables: disposables.add(new DisposableStore()) }; } renderElement({ element: profileResourceTreeElement }: ITreeNode, index: number, templateData: INewProfileResourceTemplateData, height: number | undefined): void { @@ -959,10 +1065,11 @@ class NewProfileResourceTreeRenderer extends AbstractProfileResourceTreeRenderer throw new Error('Invalid profile resource element'); } templateData.label.textContent = this.getResourceTypeTitle(element.resourceType); - if (root.copyFrom) { + if (root.copyFrom && root.hasResource(element.resourceType)) { + const copyFromName = root.getCopyFromName(); templateData.selectBox.setOptions([ { text: localize('empty', "Empty") }, - { text: localize('copy', "Copy") }, + { text: copyFromName ? localize('copy from', "Copy ({0})", copyFromName) : localize('copy', "Copy") }, { text: localize('default', "Use Default Profile") } ]); templateData.selectBox.select(root.getCopyFlag(element.resourceType) ? 1 : root.getFlag(element.resourceType) ? 2 : 0); @@ -981,6 +1088,7 @@ class NewProfileResourceTreeRenderer extends AbstractProfileResourceTreeRenderer })); } templateData.selectBox.setEnabled(!root.disabled); + templateData.actionBar.setActions(element.action ? [element.action] : []); } } @@ -993,7 +1101,7 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe private readonly hoverDelegate: IHoverDelegate; constructor( - @IInstantiationService instantiationService: IInstantiationService, + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); this.labels = instantiationService.createInstance(ResourceLabels, DEFAULT_LABELS_CONTAINER); @@ -1006,7 +1114,17 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe const checkbox = disposables.add(new Checkbox('', false, defaultCheckboxStyles)); append(container, checkbox.domNode); const resourceLabel = disposables.add(this.labels.create(container, { hoverDelegate: this.hoverDelegate })); - return { checkbox, resourceLabel, disposables, elementDisposables: disposables.add(new DisposableStore()) }; + + const actionsContainer = append(container, $('.profile-tree-item-actions-container')); + const actionBar = disposables.add(this.instantiationService.createInstance(WorkbenchToolBar, + actionsContainer, + { + hoverDelegate: disposables.add(createInstantHoverDelegate()), + highlightToggledItems: true + } + )); + + return { checkbox, resourceLabel, actionBar, disposables, elementDisposables: disposables.add(new DisposableStore()) }; } renderElement({ element: profileResourceTreeElement }: ITreeNode, index: number, templateData: IProfileResourceChildTreeItemTemplateData, height: number | undefined): void { @@ -1038,6 +1156,7 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe icon: element.icon, hideIcon: !element.resource && !element.icon, }); + templateData.actionBar.setActions(element.action ? [element.action] : []); } } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index f4a5c42a76b4e..110b69e571110 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -25,7 +25,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; import { IFileService } from 'vs/platform/files/common/files'; import { generateUuid } from 'vs/base/common/uuid'; -import { RunOnceScheduler } from 'vs/base/common/async'; +import { CancelablePromise, createCancelablePromise, RunOnceScheduler } from 'vs/base/common/async'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { ITreeItemCheckboxState } from 'vs/workbench/common/views'; @@ -197,17 +197,22 @@ export abstract class AbstractUserDataProfileElement extends Disposable { ProfileResourceType.Snippets, ProfileResourceType.Extensions ]; - return resourceTypes.map(resourceType => ({ - handle: resourceType, - checkbox: undefined, - resourceType, - action: resourceType === ProfileResourceType.Settings - || resourceType === ProfileResourceType.Keybindings - || resourceType === ProfileResourceType.Tasks - ? new Action('_open', '', undefined, true, async () => { - const children = await this.getChildren(resourceType); - children[0]?.action?.run(); - }) : undefined + return Promise.all(resourceTypes.map>(async r => { + const children = (r === ProfileResourceType.Settings + || r === ProfileResourceType.Keybindings + || r === ProfileResourceType.Tasks) ? await this.getChildrenForResourceType(r) : []; + return { + handle: r, + checkbox: undefined, + resourceType: r, + action: children.length + ? new Action('_open', + localize('open', "Open to the Side"), + ThemeIcon.asClassName(Codicon.goToFile), + true, + () => children[0]?.action?.run()) + : undefined + }; })); } return this.getChildrenForResourceType(resourceType); @@ -247,7 +252,7 @@ export abstract class AbstractUserDataProfileElement extends Disposable { label: child.label?.label ?? '', resource: URI.revive(child.resourceUri), icon: child.themeIcon, - action: new Action('_openChild', '', undefined, true, async () => { + action: new Action('_openChild', localize('open', "Open to the Side"), ThemeIcon.asClassName(Codicon.goToFile), true, async () => { if (child.parent.type === ProfileResourceType.Extensions) { await this.commandService.executeCommand('extension.open', child.handle, undefined, true, undefined, true); } else if (child.resourceUri) { @@ -298,8 +303,7 @@ export abstract class AbstractUserDataProfileElement extends Disposable { }); } - abstract readonly primaryAction?: Action; - abstract readonly secondaryAction?: Action; + abstract readonly titleButtons: [Action[], Action[]]; abstract readonly titleActions: [IAction[], IAction[]]; abstract readonly contextMenuActions: IAction[]; @@ -310,11 +314,9 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement { get profile(): IUserDataProfile { return this._profile; } - readonly primaryAction = undefined; - readonly secondaryAction = undefined; - constructor( private _profile: IUserDataProfile, + readonly titleButtons: [Action[], Action[]], readonly titleActions: [IAction[], IAction[]], readonly contextMenuActions: IAction[], @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, @@ -388,11 +390,13 @@ const USER_DATA_PROFILE_TEMPLATE_PREVIEW_SCHEME = 'userdataprofiletemplateprevie export class NewProfileElement extends AbstractUserDataProfileElement { + private templatePromise: CancelablePromise | undefined; + private template: IUserDataProfileTemplate | null = null; + constructor( name: string, copyFrom: URI | IUserDataProfile | undefined, - readonly primaryAction: Action, - readonly secondaryAction: Action, + readonly titleButtons: [Action[], Action[]], readonly titleActions: [IAction[], IAction[]], readonly contextMenuActions: Action[], @IFileService private readonly fileService: IFileService, @@ -414,6 +418,7 @@ export class NewProfileElement extends AbstractUserDataProfileElement { ); this._copyFrom = copyFrom; this._copyFlags = this.getCopyFlagsFrom(copyFrom); + this.initialize(); this._register(this.fileService.registerProvider(USER_DATA_PROFILE_TEMPLATE_PREVIEW_SCHEME, this._register(new InMemoryFileSystemProvider()))); } @@ -425,6 +430,11 @@ export class NewProfileElement extends AbstractUserDataProfileElement { this._onDidChange.fire({ copyFrom: true }); this.flags = undefined; this.copyFlags = this.getCopyFlagsFrom(copyFrom); + if (copyFrom instanceof URI) { + this.templatePromise?.cancel(); + this.templatePromise = undefined; + } + this.initialize(); } } @@ -456,6 +466,76 @@ export class NewProfileElement extends AbstractUserDataProfileElement { } : undefined; } + private async initialize(): Promise { + this.disabled = true; + try { + if (this.copyFrom instanceof URI) { + await this.resolveTemplate(this.copyFrom); + if (this.template) { + this.name = this.template.name ?? ''; + this.icon = this.template.icon; + this.setCopyFlag(ProfileResourceType.Settings, !!this.template.settings); + this.setCopyFlag(ProfileResourceType.Keybindings, !!this.template.keybindings); + this.setCopyFlag(ProfileResourceType.Tasks, !!this.template.tasks); + this.setCopyFlag(ProfileResourceType.Snippets, !!this.template.snippets); + this.setCopyFlag(ProfileResourceType.Extensions, !!this.template.extensions); + } + return; + } + + if (isUserDataProfile(this.copyFrom)) { + this.name = `${this.copyFrom.name} (Copy)`; + this.icon = this.copyFrom.icon; + this.setCopyFlag(ProfileResourceType.Settings, true); + this.setCopyFlag(ProfileResourceType.Keybindings, true); + this.setCopyFlag(ProfileResourceType.Tasks, true); + this.setCopyFlag(ProfileResourceType.Snippets, true); + this.setCopyFlag(ProfileResourceType.Extensions, true); + return; + } + + this.name = localize('untitled', "Untitled"); + this.icon = undefined; + this.setCopyFlag(ProfileResourceType.Settings, false); + this.setCopyFlag(ProfileResourceType.Keybindings, false); + this.setCopyFlag(ProfileResourceType.Tasks, false); + this.setCopyFlag(ProfileResourceType.Snippets, false); + this.setCopyFlag(ProfileResourceType.Extensions, false); + } finally { + this.disabled = false; + } + } + + private async resolveTemplate(uri: URI): Promise { + if (!this.templatePromise) { + this.templatePromise = createCancelablePromise(async token => { + const template = await this.userDataProfileImportExportService.resolveProfileTemplate(uri); + if (!token.isCancellationRequested) { + this.template = template; + } + }); + } + return this.templatePromise; + } + + hasResource(resourceType: ProfileResourceType): boolean { + if (this.template) { + switch (resourceType) { + case ProfileResourceType.Settings: + return !!this.template.settings; + case ProfileResourceType.Keybindings: + return !!this.template.keybindings; + case ProfileResourceType.Snippets: + return !!this.template.snippets; + case ProfileResourceType.Tasks: + return !!this.template.tasks; + case ProfileResourceType.Extensions: + return !!this.template.extensions; + } + } + return true; + } + getCopyFlag(key: ProfileResourceType): boolean { return this.copyFlags?.[key] ?? false; } @@ -466,6 +546,16 @@ export class NewProfileElement extends AbstractUserDataProfileElement { this.copyFlags = flags; } + getCopyFromName(): string | undefined { + if (isUserDataProfile(this.copyFrom)) { + return this.copyFrom.name; + } + if (this.template) { + return this.template.name; + } + return undefined; + } + protected override async getChildrenForResourceType(resourceType: ProfileResourceType): Promise { if (this.getFlag(resourceType)) { return this.getChildrenFromProfile(this.userDataProfilesService.defaultProfile, resourceType); @@ -474,11 +564,11 @@ export class NewProfileElement extends AbstractUserDataProfileElement { return []; } if (this.copyFrom instanceof URI) { - const template = await this.userDataProfileImportExportService.resolveProfileTemplate(this.copyFrom); - if (!template) { + await this.resolveTemplate(this.copyFrom); + if (!this.template) { return []; } - return this.getChildrenFromProfileTemplate(template, resourceType); + return this.getChildrenFromProfileTemplate(this.template, resourceType); } if (this.copyFrom) { return this.getChildrenFromProfile(this.copyFrom, resourceType); @@ -614,54 +704,92 @@ export class UserDataProfilesEditorModel extends EditorModel { private createProfileElement(profile: IUserDataProfile): [UserDataProfileElement, DisposableStore] { const disposables = new DisposableStore(); - const activateAction = disposables.add(new Action('userDataProfile.activate', localize('active', "Active"), ThemeIcon.asClassName(Codicon.check), true, () => this.userDataProfileManagementService.switchProfile(profile))); - activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id; - disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(() => activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id)); - const copyFromProfileAction = disposables.add(new Action('userDataProfile.copyFromProfile', localize('copyFromProfile', "Save As..."), ThemeIcon.asClassName(Codicon.copy), true, () => this.createNewProfile(profile))); - const exportAction = disposables.add(new Action('userDataProfile.export', localize('export', "Export..."), ThemeIcon.asClassName(Codicon.export), true, () => this.exportProfile(profile))); - const deleteAction = disposables.add(new Action('userDataProfile.delete', localize('delete', "Delete"), ThemeIcon.asClassName(Codicon.trash), true, () => this.removeProfile(profile))); - const newWindowAction = disposables.add(new Action('userDataProfile.newWindow', localize('new window', "New {0} Window", profile.name), ThemeIcon.asClassName(Codicon.emptyWindow), true, () => this.openWindow(profile))); - const useAsNewWindowProfileAction = disposables.add(new Action('userDataProfile.useAsNewWindowProfile', localize('use as new window', "Enable for New Windows", profile.name), undefined, true, () => profileElement.toggleNewWindowProfile())); + const activateAction = disposables.add(new Action( + 'userDataProfile.activate', + localize('active', "Use for Current Window"), + ThemeIcon.asClassName(Codicon.check), + true, + () => this.userDataProfileManagementService.switchProfile(profile) + )); + + const copyFromProfileAction = disposables.add(new Action( + 'userDataProfile.copyFromProfile', + localize('copyFromProfile', "Duplicate..."), + ThemeIcon.asClassName(Codicon.copy), + true, () => this.createNewProfile(profile) + )); + + const exportAction = disposables.add(new Action( + 'userDataProfile.export', + localize('export', "Export..."), + ThemeIcon.asClassName(Codicon.export), + true, + () => this.exportProfile(profile) + )); + + const deleteAction = disposables.add(new Action( + 'userDataProfile.delete', + localize('delete', "Delete"), + ThemeIcon.asClassName(Codicon.trash), + true, + () => this.removeProfile(profile) + )); + + const newWindowAction = disposables.add(new Action( + 'userDataProfile.newWindow', + localize('open new window', "Open"), + ThemeIcon.asClassName(Codicon.emptyWindow), + true, + () => this.openWindow(profile) + )); + + const useAsNewWindowProfileAction = disposables.add(new Action( + 'userDataProfile.useAsNewWindowProfile', + localize('use as new window', "Use for New Windows", profile.name), + undefined, + true, + () => profileElement.toggleNewWindowProfile() + )); const titlePrimaryActions: IAction[] = []; - titlePrimaryActions.push(copyFromProfileAction); - titlePrimaryActions.push(exportAction); + titlePrimaryActions.push(newWindowAction); + const titleSecondaryActions: IAction[] = []; + titleSecondaryActions.push(copyFromProfileAction); + titleSecondaryActions.push(exportAction); if (!profile.isDefault) { - titlePrimaryActions.push(deleteAction); + titleSecondaryActions.push(new Separator()); + titleSecondaryActions.push(deleteAction); } - const titleSecondaryActions: IAction[] = []; - const secondaryActions: IAction[] = []; secondaryActions.push(activateAction); secondaryActions.push(useAsNewWindowProfileAction); secondaryActions.push(new Separator()); - secondaryActions.push(newWindowAction); - secondaryActions.push(new Separator()); secondaryActions.push(copyFromProfileAction); secondaryActions.push(exportAction); if (!profile.isDefault) { secondaryActions.push(new Separator()); secondaryActions.push(deleteAction); } + const profileElement = disposables.add(this.instantiationService.createInstance(UserDataProfileElement, profile, + [[newWindowAction], []], [titlePrimaryActions, titleSecondaryActions], secondaryActions, )); - useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile; - useAsNewWindowProfileAction.label = profileElement.isNewWindowProfile ? localize('donot use as new window', "Disable for New Windows") : localize('use as new window', "Enable for New Windows"); + activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id; + disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(() => + activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id)); + useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile; disposables.add(profileElement.onDidChange(e => { - if (e.name) { - newWindowAction.label = localize('new window', "New {0} Window", profileElement.name); - } if (e.newWindowProfile) { useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile; - useAsNewWindowProfileAction.label = profileElement.isNewWindowProfile ? localize('donot use as new window', "Disable for New Windows") : localize('use as new window', "Enable for New Windows"); } })); + return [profileElement, disposables]; } @@ -686,7 +814,7 @@ export class UserDataProfilesEditorModel extends EditorModel { )); const previewProfileAction = disposables.add(new Action( 'userDataProfile.preview', - localize('preview', "Open Preview"), + localize('preview', "Preview"), ThemeIcon.asClassName(Codicon.openPreview), true, () => this.previewNewProfile(cancellationTokenSource.token) @@ -694,11 +822,8 @@ export class UserDataProfilesEditorModel extends EditorModel { this.newProfileElement = disposables.add(this.instantiationService.createInstance(NewProfileElement, localize('untitled', "Untitled"), copyFrom, - createAction, - cancelAction, - [[ - previewProfileAction - ], []], + [[createAction], [previewProfileAction, cancelAction]], + [[cancelAction], []], [], )); disposables.add(this.newProfileElement.onDidChange(e => { diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts index 3afec944efd06..d09cac70e2ffc 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts @@ -53,6 +53,8 @@ export interface IUserDataProfileManagementService { } export interface IUserDataProfileTemplate { + readonly name: string; + readonly icon?: string; readonly settings?: string; readonly keybindings?: string; readonly tasks?: string; From 26ce0989f02e3779f9eab4c9aa3ab28fcbb54b7e Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Thu, 6 Jun 2024 13:01:50 -0700 Subject: [PATCH 138/755] add newline after start of codeblock (#214508) fix #213941 --- src/vs/base/browser/markdownRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 278f3efd03376..a957171c3a44e 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -634,7 +634,7 @@ const plainTextRenderer = new Lazy((withCodeBlocks?: boolean) = const plainTextWithCodeBlocksRenderer = new Lazy(() => { const renderer = createRenderer(); renderer.code = (code: string): string => { - return '\n' + '```' + code + '```' + '\n'; + return '\n' + '```' + '\n' + code + '```' + '\n'; }; return renderer; }); From 88583e6f154f5b012fb6692963a55c3e812a8cc4 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:38:30 +0200 Subject: [PATCH 139/755] SCM - unify code to get a repository using a resource (#214510) --- .../workbench/contrib/scm/browser/activity.ts | 41 ++++--------------- src/vs/workbench/contrib/scm/common/scm.ts | 2 + .../contrib/scm/common/scmService.ts | 39 ++++++++++++++++-- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index c390256785f66..4aa92b2615ffd 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -42,8 +42,7 @@ export class SCMStatusController implements IWorkbenchContribution { @IStatusbarService private readonly statusbarService: IStatusbarService, @IActivityService private readonly activityService: IActivityService, @IEditorService private readonly editorService: IEditorService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService + @IConfigurationService private readonly configurationService: IConfigurationService ) { this.scmService.onDidAddRepository(this.onDidAddRepository, this, this.disposables); this.scmService.onDidRemoveRepository(this.onDidRemoveRepository, this, this.disposables); @@ -69,29 +68,12 @@ export class SCMStatusController implements IWorkbenchContribution { return false; } - let bestRepository: ISCMRepository | null = null; - let bestMatchLength = Number.POSITIVE_INFINITY; - - for (const repository of repositories) { - const root = repository.provider.rootUri; - - if (!root) { - continue; - } - - const path = this.uriIdentityService.extUri.relativePath(root, resource); - - if (path && !/^\.\./.test(path) && path.length < bestMatchLength) { - bestRepository = repository; - bestMatchLength = path.length; - } - } - - if (!bestRepository) { + const repository = this.scmService.getRepository(resource); + if (!repository) { return false; } - this.focusRepository(bestRepository); + this.focusRepository(repository); return true; } @@ -230,9 +212,9 @@ export class SCMActiveRepositoryContextKeyController implements IWorkbenchContri constructor( @IContextKeyService contextKeyService: IContextKeyService, @IEditorService private readonly editorService: IEditorService, - @ISCMViewService private readonly scmViewService: ISCMViewService, - @ITitleService titleService: ITitleService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService + @ISCMViewService scmViewService: ISCMViewService, + @ISCMService private readonly scmService: ISCMService, + @ITitleService titleService: ITitleService ) { this.activeRepositoryNameContextKey = ActiveRepositoryContextKeys.ActiveRepositoryName.bindTo(contextKeyService); this.activeRepositoryBranchNameContextKey = ActiveRepositoryContextKeys.ActiveRepositoryBranchName.bindTo(contextKeyService); @@ -249,16 +231,11 @@ export class SCMActiveRepositoryContextKeyController implements IWorkbenchContri private onDidActiveEditorChange(): void { const activeResource = EditorResourceAccessor.getOriginalUri(this.editorService.activeEditor); - - if (activeResource?.scheme !== Schemas.file && activeResource?.scheme !== Schemas.vscodeRemote) { + if (!activeResource) { return; } - const repository = Iterable.find( - this.scmViewService.repositories, - r => Boolean(r.provider.rootUri && this.uriIdentityService.extUri.isEqualOrParent(activeResource, r.provider.rootUri)) - ); - + const repository = this.scmService.getRepository(activeResource); this.onDidFocusRepository(repository); } diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index 8dcf49cf49bcb..af14bade4527b 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -175,7 +175,9 @@ export interface ISCMService { readonly repositoryCount: number; registerSCMProvider(provider: ISCMProvider): ISCMRepository; + getRepository(id: string): ISCMRepository | undefined; + getRepository(resource: URI): ISCMRepository | undefined; } export interface ISCMTitleMenu { diff --git a/src/vs/workbench/contrib/scm/common/scmService.ts b/src/vs/workbench/contrib/scm/common/scmService.ts index 5ea28588e217f..7dfd1ea6f2ced 100644 --- a/src/vs/workbench/contrib/scm/common/scmService.ts +++ b/src/vs/workbench/contrib/scm/common/scmService.ts @@ -15,6 +15,8 @@ import { ResourceMap } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; import { Iterable } from 'vs/base/common/iterator'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { Schemas } from 'vs/base/common/network'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; class SCMInput extends Disposable implements ISCMInput { @@ -364,7 +366,8 @@ export class SCMService implements ISCMService { @ILogService private readonly logService: ILogService, @IWorkspaceContextService workspaceContextService: IWorkspaceContextService, @IContextKeyService contextKeyService: IContextKeyService, - @IStorageService storageService: IStorageService + @IStorageService storageService: IStorageService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { this.inputHistory = new SCMInputHistory(storageService, workspaceContextService); this.providerCount = contextKeyService.createKey('scm.providerCount', 0); @@ -391,8 +394,36 @@ export class SCMService implements ISCMService { return repository; } - getRepository(id: string): ISCMRepository | undefined { - return this._repositories.get(id); - } + getRepository(id: string): ISCMRepository | undefined; + getRepository(resource: URI): ISCMRepository | undefined; + getRepository(idOrResource: string | URI): ISCMRepository | undefined { + if (typeof idOrResource === 'string') { + return this._repositories.get(idOrResource); + } + + if (idOrResource.scheme !== Schemas.file && + idOrResource.scheme !== Schemas.vscodeRemote) { + return undefined; + } + let bestRepository: ISCMRepository | undefined = undefined; + let bestMatchLength = Number.POSITIVE_INFINITY; + + for (const repository of this.repositories) { + const root = repository.provider.rootUri; + + if (!root) { + continue; + } + + const path = this.uriIdentityService.extUri.relativePath(root, idOrResource); + + if (path && !/^\.\./.test(path) && path.length < bestMatchLength) { + bestRepository = repository; + bestMatchLength = path.length; + } + } + + return bestRepository; + } } From 644e03f49ef00deff322d71778edc59e4a7f9d55 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Thu, 6 Jun 2024 13:59:39 -0700 Subject: [PATCH 140/755] render inline chat accessible view content as plaintext (#214506) fix #213665 --- .../contrib/inlineChat/browser/inlineChatAccessibleView.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts index 91a719e19996f..797dae2825daf 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts @@ -11,6 +11,8 @@ import { AccessibleViewProviderId, AccessibleViewType } from 'vs/platform/access import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IAccessibleViewImplentation } from 'vs/platform/accessibility/browser/accessibleViewRegistry'; +import { MarkdownString } from 'vs/base/common/htmlContent'; +import { renderMarkdownAsPlaintext } from 'vs/base/browser/markdownRenderer'; export class InlineChatAccessibleView implements IAccessibleViewImplentation { readonly priority = 100; @@ -35,7 +37,7 @@ export class InlineChatAccessibleView implements IAccessibleViewImplentation { return { id: AccessibleViewProviderId.InlineChat, verbositySettingKey: AccessibilityVerbositySettingId.InlineChat, - provideContent(): string { return responseContent; }, + provideContent(): string { return renderMarkdownAsPlaintext(new MarkdownString(responseContent), true); }, onClose() { controller.focus(); }, From 4157a8d7f0aad08be09da3c03ecd4f0829ec2df9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 6 Jun 2024 23:51:33 +0200 Subject: [PATCH 141/755] improve creating profile from template (#214515) - improve creating profile from template - remove unused code --- .../browser/userDataProfilesEditor.ts | 7 +- .../browser/userDataProfilesEditorModel.ts | 51 +++-- .../browser/extensionsResource.ts | 14 +- .../userDataProfileImportExportService.ts | 196 +++++++++++------- .../userDataProfile/common/userDataProfile.ts | 11 +- 5 files changed, 176 insertions(+), 103 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 2f4c25dd78de7..3e32b5a69dab2 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -226,7 +226,7 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi actions.push(...this.getTreeContextMenuActions()); } if (e.element instanceof AbstractUserDataProfileElement) { - actions.push(...e.element.contextMenuActions); + actions.push(...e.element.actions[1]); } if (actions.length) { this.contextMenuService.showContextMenu({ @@ -244,7 +244,6 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi } } - private getTreeContextMenuActions(): IAction[] { const actions: IAction[] = []; actions.push(new Action('newProfile', localize('newProfile', "New Profile"), undefined, true, () => this.createNewProfile())); @@ -434,7 +433,7 @@ class ProfileElementRenderer implements IListRenderer; } @@ -318,7 +318,7 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement { private _profile: IUserDataProfile, readonly titleButtons: [Action[], Action[]], readonly titleActions: [IAction[], IAction[]], - readonly contextMenuActions: IAction[], + readonly actions: [IAction[], IAction[]], @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, @IConfigurationService private readonly configurationService: IConfigurationService, @IUserDataProfileManagementService userDataProfileManagementService: IUserDataProfileManagementService, @@ -398,7 +398,7 @@ export class NewProfileElement extends AbstractUserDataProfileElement { copyFrom: URI | IUserDataProfile | undefined, readonly titleButtons: [Action[], Action[]], readonly titleActions: [IAction[], IAction[]], - readonly contextMenuActions: Action[], + readonly actions: [IAction[], IAction[]], @IFileService private readonly fileService: IFileService, @IUserDataProfileImportExportService private readonly userDataProfileImportExportService: IUserDataProfileImportExportService, @IUserDataProfileManagementService userDataProfileManagementService: IUserDataProfileManagementService, @@ -506,7 +506,7 @@ export class NewProfileElement extends AbstractUserDataProfileElement { } } - private async resolveTemplate(uri: URI): Promise { + async resolveTemplate(uri: URI): Promise { if (!this.templatePromise) { this.templatePromise = createCancelablePromise(async token => { const template = await this.userDataProfileImportExportService.resolveProfileTemplate(uri); @@ -515,7 +515,8 @@ export class NewProfileElement extends AbstractUserDataProfileElement { } }); } - return this.templatePromise; + await this.templatePromise; + return this.template; } hasResource(resourceType: ProfileResourceType): boolean { @@ -752,7 +753,6 @@ export class UserDataProfilesEditorModel extends EditorModel { )); const titlePrimaryActions: IAction[] = []; - titlePrimaryActions.push(newWindowAction); const titleSecondaryActions: IAction[] = []; titleSecondaryActions.push(copyFromProfileAction); titleSecondaryActions.push(exportAction); @@ -761,6 +761,8 @@ export class UserDataProfilesEditorModel extends EditorModel { titleSecondaryActions.push(deleteAction); } + const primaryActions: IAction[] = []; + primaryActions.push(newWindowAction); const secondaryActions: IAction[] = []; secondaryActions.push(activateAction); secondaryActions.push(useAsNewWindowProfileAction); @@ -776,7 +778,7 @@ export class UserDataProfilesEditorModel extends EditorModel { profile, [[newWindowAction], []], [titlePrimaryActions, titleSecondaryActions], - secondaryActions, + [primaryActions, secondaryActions] )); activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id; @@ -823,8 +825,8 @@ export class UserDataProfilesEditorModel extends EditorModel { localize('untitled', "Untitled"), copyFrom, [[createAction], [previewProfileAction, cancelAction]], + [[], []], [[cancelAction], []], - [], )); disposables.add(this.newProfileElement.onDidChange(e => { if (e.preview) { @@ -906,14 +908,37 @@ export class UserDataProfilesEditorModel extends EditorModel { const createProfileTelemetryData: CreateProfileInfoEvent = { source: copyFrom instanceof URI ? 'template' : isUserDataProfile(copyFrom) ? 'profile' : copyFrom ? 'external' : undefined }; if (copyFrom instanceof URI) { - this.telemetryService.publicLog2('userDataProfile.createFromTemplate', createProfileTelemetryData); - await this.userDataProfileImportExportService.importProfile(copyFrom, { mode: 'apply', name: name, useDefaultFlags, icon: icon ? icon : undefined, resourceTypeFlags: this.newProfileElement.copyFlags, donotSwitch: true, transient }); + const template = await this.newProfileElement.resolveTemplate(copyFrom); + if (template) { + this.telemetryService.publicLog2('userDataProfile.createFromTemplate', createProfileTelemetryData); + await this.userDataProfileImportExportService.createProfileFromTemplate( + template, + { + name, + useDefaultFlags, + icon, + resourceTypeFlags: this.newProfileElement.copyFlags, + transient + }, + token ?? CancellationToken.None + ); + } } else if (isUserDataProfile(copyFrom)) { this.telemetryService.publicLog2('userDataProfile.createFromProfile', createProfileTelemetryData); - await this.userDataProfileImportExportService.createFromProfile(copyFrom, name, { useDefaultFlags, icon: icon ? icon : undefined, resourceTypeFlags: this.newProfileElement.copyFlags, donotSwitch: true, transient }); + await this.userDataProfileImportExportService.createFromProfile( + copyFrom, + { + name, + useDefaultFlags, + icon: icon, + resourceTypeFlags: this.newProfileElement.copyFlags, + transient + }, + token ?? CancellationToken.None + ); } else { this.telemetryService.publicLog2('userDataProfile.createEmptyProfile', createProfileTelemetryData); - await this.userDataProfileManagementService.createProfile(name, { useDefaultFlags, icon: icon ? icon : undefined, transient }); + await this.userDataProfileManagementService.createProfile(name, { useDefaultFlags, icon, transient }); } profile = this.userDataProfilesService.profiles.find(p => p.name === name); @@ -971,6 +996,6 @@ export class UserDataProfilesEditorModel extends EditorModel { } private async exportProfile(profile: IUserDataProfile): Promise { - return this.userDataProfileImportExportService.exportProfile2(profile); + return this.userDataProfileImportExportService.exportProfile(profile); } } diff --git a/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts b/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts index 2885c3cac7e30..6173c8498f893 100644 --- a/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts +++ b/src/vs/workbench/services/userDataProfile/browser/extensionsResource.ts @@ -115,7 +115,7 @@ export class ExtensionsResource implements IProfileResource { return JSON.stringify(exclude?.length ? extensions.filter(e => !exclude.includes(e.identifier.id.toLowerCase())) : extensions); } - async apply(content: string, profile: IUserDataProfile): Promise { + async apply(content: string, profile: IUserDataProfile, progress?: (message: string) => void, token?: CancellationToken): Promise { return this.withProfileScopedServices(profile, async (extensionEnablementService) => { const profileExtensions: IProfileExtension[] = await this.getProfileExtensions(content); const installedExtensions = await this.extensionManagementService.getInstalled(undefined, profile.extensionsResource); @@ -169,7 +169,17 @@ export class ExtensionsResource implements IProfileResource { } })); if (installExtensionInfos.length) { - await this.extensionManagementService.installGalleryExtensions(installExtensionInfos); + if (token) { + for (const installExtensionInfo of installExtensionInfos) { + if (token.isCancellationRequested) { + return; + } + progress?.(localize('installingExtension', "Installing extension {0}...", installExtensionInfo.extension.displayName ?? installExtensionInfo.extension.identifier.id)); + await this.extensionManagementService.installFromGallery(installExtensionInfo.extension, installExtensionInfo.options); + } + } else { + await this.extensionManagementService.installGalleryExtensions(installExtensionInfos); + } } this.logService.info(`Importing Profile (${profile.name}): Finished installing extensions.`); } diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts index a880ac1ff5087..2d569e09eed86 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts @@ -24,7 +24,6 @@ import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/con import { Registry } from 'vs/platform/registry/common/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { ILogService } from 'vs/platform/log/common/log'; import { TreeView, TreeViewPane } from 'vs/workbench/browser/parts/views/treeView'; import { SettingsResource, SettingsResourceTreeItem } from 'vs/workbench/services/userDataProfile/browser/settingsResource'; import { KeybindingsResource, KeybindingsResourceTreeItem } from 'vs/workbench/services/userDataProfile/browser/keybindingsResource'; @@ -64,7 +63,7 @@ import { Action, ActionRunner, IAction, IActionRunner } from 'vs/base/common/act import { isWeb } from 'vs/base/common/platform'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { Codicon, getAllCodicons } from 'vs/base/common/codicons'; -import { Barrier } from 'vs/base/common/async'; +import { Barrier, CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; @@ -104,7 +103,6 @@ function isUserDataProfileTemplate(thing: unknown): thing is IUserDataProfileTem && (isUndefined(candidate.extensions) || typeof candidate.extensions === 'string')); } -const EXPORT_PROFILE_PREVIEW_VIEW = 'workbench.views.profiles.export.preview'; const IMPORT_PROFILE_PREVIEW_VIEW = 'workbench.views.profiles.import.preview'; export class UserDataProfileImportExportService extends Disposable implements IUserDataProfileImportExportService, IURLHandler { @@ -143,7 +141,6 @@ export class UserDataProfileImportExportService extends Disposable implements IU @ITelemetryService private readonly telemetryService: ITelemetryService, @IContextViewService private readonly contextViewService: IContextViewService, @IHoverService private readonly hoverService: IHoverService, - @ILogService private readonly logService: ILogService, ) { super(); this.registerProfileContentHandler(Schemas.file, this.fileUserDataProfileContentHandler = instantiationService.createInstance(FileUserDataProfileContentHandler)); @@ -193,15 +190,6 @@ export class UserDataProfileImportExportService extends Disposable implements IU this.profileContentHandlers.delete(id); } - async exportProfile(): Promise { - if (this.isProfileExportInProgressContextKey.get()) { - this.logService.warn('Profile export already in progress.'); - return; - } - - return this.showProfileContents(); - } - async importProfile(uri: URI, options?: IProfileImportOptions): Promise { if (this.isProfileImportInProgressContextKey.get()) { this.notificationService.warn('Profile import already in progress.'); @@ -225,7 +213,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU if (mode === 'preview') { await this.previewProfile(profileTemplate, options); } else if (mode === 'apply') { - await this.createAndSwitch(profileTemplate, !!options?.transient, true, options, localize('create profile', "Create Profile"), !options?.donotSwitch); + await this.createAndSwitch(profileTemplate, !!options?.transient, true, options, localize('create profile', "Create Profile")); } else if (mode === 'both') { await this.importAndPreviewProfile(uri, profileTemplate, options); } @@ -238,8 +226,113 @@ export class UserDataProfileImportExportService extends Disposable implements IU return this.saveProfile(undefined, from); } - editProfile(profile: IUserDataProfile): Promise { - return this.saveProfile(profile); + async createFromProfile(from: IUserDataProfile, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise { + const disposables = new DisposableStore(); + let creationPromise: CancelablePromise; + disposables.add(token.onCancellationRequested(() => creationPromise.cancel())); + let profile: IUserDataProfile | undefined; + return this.progressService.withProgress({ + location: ProgressLocation.Notification, + delay: 500, + sticky: true, + cancellable: true, + }, async progress => { + const reportProgress = (message: string) => progress.report({ message: localize('create from profile', "Create Profile: {0}", message) }); + creationPromise = createCancelablePromise(async token => { + const userDataProfilesExportState = disposables.add(this.instantiationService.createInstance(UserDataProfileExportState, from, { ...options?.resourceTypeFlags, extensions: false })); + const profileTemplate = await userDataProfilesExportState.getProfileTemplate(options.name ?? from.name, options?.icon); + profile = await this.doCreateProfile2(profileTemplate, options, reportProgress, token); + }); + try { + await creationPromise; + if (profile && (options?.resourceTypeFlags?.extensions ?? true)) { + reportProgress(localize('installing extensions', "Installing Extensions...")); + await this.instantiationService.createInstance(ExtensionsResource).copy(from, profile, false); + } + } catch (error) { + if (profile) { + await this.userDataProfilesService.removeProfile(profile); + } + } + return profile; + + }, () => creationPromise.cancel()).finally(() => disposables.dispose()); + } + + async createProfileFromTemplate(profileTemplate: IUserDataProfileTemplate, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise { + const disposables = new DisposableStore(); + let creationPromise: CancelablePromise; + disposables.add(token.onCancellationRequested(() => creationPromise.cancel())); + let profile: IUserDataProfile | undefined; + return this.progressService.withProgress({ + location: ProgressLocation.Notification, + delay: 500, + sticky: true, + cancellable: true, + }, async progress => { + const reportProgress = (message: string) => progress.report({ message: localize('create from profile', "Create Profile: {0}", message) }); + creationPromise = createCancelablePromise(async token => { + profile = await this.doCreateProfile2(profileTemplate, options, reportProgress, token); + }); + try { + await creationPromise; + } catch (error) { + if (profile) { + await this.userDataProfilesService.removeProfile(profile); + } + } + return profile; + }, () => creationPromise.cancel()).finally(() => disposables.dispose()); + } + + private async doCreateProfile2(profileTemplate: IUserDataProfileTemplate, options: IUserDataProfileCreateOptions, reportProgress: (message: string) => void, token: CancellationToken): Promise { + const profile = await this.getProfileToImport({ ...profileTemplate, name: options.name ?? profileTemplate.name }, !!options.transient, options); + if (!profile) { + return; + } + if (token.isCancellationRequested) { + return; + } + if (profileTemplate.settings && (options.resourceTypeFlags?.settings ?? true) && !profile.useDefaultFlags?.settings) { + reportProgress(localize('creating settings', "Creating Settings...")); + await this.instantiationService.createInstance(SettingsResource).apply(profileTemplate.settings, profile); + } + if (token.isCancellationRequested) { + return; + } + if (profileTemplate.keybindings && (options.resourceTypeFlags?.keybindings ?? true) && !profile.useDefaultFlags?.keybindings) { + reportProgress(localize('create keybindings', "Creating Keyboard Shortcuts...")); + await this.instantiationService.createInstance(KeybindingsResource).apply(profileTemplate.keybindings, profile); + } + if (token.isCancellationRequested) { + return; + } + if (profileTemplate.tasks && (options.resourceTypeFlags?.tasks ?? true) && !profile.useDefaultFlags?.tasks) { + reportProgress(localize('create tasks', "Creating Tasks...")); + await this.instantiationService.createInstance(TasksResource).apply(profileTemplate.tasks, profile); + } + if (token.isCancellationRequested) { + return; + } + if (profileTemplate.snippets && (options.resourceTypeFlags?.snippets ?? true) && !profile.useDefaultFlags?.snippets) { + reportProgress(localize('create snippets', "Creating Snippets...")); + await this.instantiationService.createInstance(SnippetsResource).apply(profileTemplate.snippets, profile); + } + if (token.isCancellationRequested) { + return; + } + if (profileTemplate.globalState && !profile.useDefaultFlags?.globalState) { + reportProgress(localize('applying global state', "Applying UI State...")); + await this.instantiationService.createInstance(GlobalStateResource).apply(profileTemplate.globalState, profile); + } + if (token.isCancellationRequested) { + return; + } + if (profileTemplate.extensions && (options.resourceTypeFlags?.extensions ?? true) && !profile.useDefaultFlags?.extensions) { + reportProgress(localize('installing extensions', "Installing Extensions...")); + await this.instantiationService.createInstance(ExtensionsResource).apply(profileTemplate.extensions, profile, reportProgress, token); + } + return profile; } private saveProfile(profile: IUserDataProfile): Promise; @@ -527,11 +620,11 @@ export class UserDataProfileImportExportService extends Disposable implements IU await this.importProfile(source, { mode: 'apply', name: result.name, useDefaultFlags, icon: result.icon ? result.icon : undefined }); } else if (isUserDataProfile(source)) { this.telemetryService.publicLog2('userDataProfile.createFromProfile', createProfileTelemetryData); - await this.createFromProfile(source, result.name, { useDefaultFlags, icon: result.icon ? result.icon : undefined }); + await this._createFromProfile(source, result.name, { useDefaultFlags, icon: result.icon ? result.icon : undefined }); } else if (isUserDataProfileTemplate(source)) { source.name = result.name; this.telemetryService.publicLog2('userDataProfile.createFromExternalTemplate', createProfileTelemetryData); - await this.createAndSwitch(source, false, true, { useDefaultFlags, icon: result.icon ? result.icon : undefined }, localize('create profile', "Create Profile"), true); + await this.createAndSwitch(source, false, true, { useDefaultFlags, icon: result.icon ? result.icon : undefined }, localize('create profile', "Create Profile")); } else { this.telemetryService.publicLog2('userDataProfile.createEmptyProfile', createProfileTelemetryData); await this.userDataProfileManagementService.createAndEnterProfile(result.name, { useDefaultFlags, icon: result.icon ? result.icon : undefined }); @@ -542,37 +635,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU } } - async showProfileContents(): Promise { - const view = this.viewsService.getViewWithId(EXPORT_PROFILE_PREVIEW_VIEW); - if (view) { - this.viewsService.openView(view.id, true); - return; - } - const disposables = new DisposableStore(); - try { - const userDataProfilesExportState = disposables.add(this.instantiationService.createInstance(UserDataProfileExportState, this.userDataProfileService.currentProfile, undefined)); - const barrier = new Barrier(); - const exportAction = new BarrierAction(barrier, new Action('export', localize('export', "Export"), undefined, true, async () => { - exportAction.enabled = false; - try { - await this.doExportProfile(userDataProfilesExportState, EXPORT_PROFILE_PREVIEW_VIEW); - } catch (error) { - exportAction.enabled = true; - this.notificationService.error(error); - throw error; - } - }), this.notificationService); - const closeAction = new BarrierAction(barrier, new Action('close', localize('close', "Close")), this.notificationService); - await this.showProfilePreviewView(EXPORT_PROFILE_PREVIEW_VIEW, userDataProfilesExportState.profile.name, exportAction, closeAction, true, userDataProfilesExportState); - disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(e => barrier.open())); - await barrier.wait(); - await this.hideProfilePreviewView(EXPORT_PROFILE_PREVIEW_VIEW); - } finally { - disposables.dispose(); - } - } - - async exportProfile2(profile: IUserDataProfile): Promise { + async exportProfile(profile: IUserDataProfile): Promise { const disposables = new DisposableStore(); try { const userDataProfilesExportState = disposables.add(this.instantiationService.createInstance(UserDataProfileExportState, profile, undefined)); @@ -582,7 +645,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU } } - async createFromProfile(profile: IUserDataProfile, name: string, options?: IUserDataProfileCreateOptions): Promise { + private async _createFromProfile(profile: IUserDataProfile, name: string, options?: IUserDataProfileCreateOptions): Promise { const userDataProfilesExportState = this.instantiationService.createInstance(UserDataProfileExportState, profile, options?.resourceTypeFlags); try { const profileTemplate = await userDataProfilesExportState.getProfileTemplate(name, options?.icon); @@ -598,11 +661,8 @@ export class UserDataProfileImportExportService extends Disposable implements IU reportProgress(localize('progress extensions', "Applying Extensions...")); await this.instantiationService.createInstance(ExtensionsResource).copy(profile, createdProfile, false); } - - if (!options?.donotSwitch) { - reportProgress(localize('switching profile', "Switching Profile...")); - await this.userDataProfileManagementService.switchProfile(createdProfile); - } + reportProgress(localize('switching profile', "Switching Profile...")); + await this.userDataProfileManagementService.switchProfile(createdProfile); } }); } finally { @@ -752,7 +812,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU const userDataProfileImportState = disposables.add(this.instantiationService.createInstance(UserDataProfileImportState, profileTemplate)); profileTemplate = await userDataProfileImportState.getProfileTemplateToImport(); - const importedProfile = await this.createAndSwitch(profileTemplate, true, false, options, localize('preview profile', "Preview Profile"), true); + const importedProfile = await this.createAndSwitch(profileTemplate, true, false, options, localize('preview profile', "Preview Profile")); if (!importedProfile) { return; @@ -823,7 +883,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU try { const userDataProfileImportState = disposables.add(this.instantiationService.createInstance(UserDataProfileImportState, profileTemplate)); if (userDataProfileImportState.isEmpty()) { - await this.createAndSwitch(profileTemplate, false, true, options, localize('create profile', "Create Profile"), true); + await this.createAndSwitch(profileTemplate, false, true, options, localize('create profile', "Create Profile")); } else { const barrier = new Barrier(); const cancelAction = new BarrierAction(barrier, new Action('cancel', localize('cancel', "Cancel")), this.notificationService); @@ -849,7 +909,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU return importAction; } - private async createAndSwitch(profileTemplate: IUserDataProfileTemplate, temporaryProfile: boolean, extensions: boolean, options: IUserDataProfileOptions | undefined, title: string, switchProfile: boolean): Promise { + private async createAndSwitch(profileTemplate: IUserDataProfileTemplate, temporaryProfile: boolean, extensions: boolean, options: IUserDataProfileOptions | undefined, title: string): Promise { return this.progressService.withProgress({ location: ProgressLocation.Notification, delay: 500, @@ -859,7 +919,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU progress.report({ message: title }); const reportProgress = (message: string) => progress.report({ message: `${title}: ${message}` }); const profile = await this.doCreateProfile(profileTemplate, temporaryProfile, extensions, options, reportProgress); - if (profile && switchProfile) { + if (profile) { reportProgress(localize('switching profile', "Switching Profile...")); await this.userDataProfileManagementService.switchProfile(profile); } @@ -1070,24 +1130,6 @@ export class UserDataProfileImportExportService extends Disposable implements IU } } - async setProfile(profile: IUserDataProfileTemplate): Promise { - await this.progressService.withProgress({ - location: ProgressLocation.Notification, - title: localize('profiles.applying', "{0}: Applying...", PROFILES_CATEGORY.value), - }, async progress => { - if (profile.settings) { - await this.instantiationService.createInstance(SettingsResource).apply(profile.settings, this.userDataProfileService.currentProfile); - } - if (profile.globalState) { - await this.instantiationService.createInstance(GlobalStateResource).apply(profile.globalState, this.userDataProfileService.currentProfile); - } - if (profile.extensions) { - await this.instantiationService.createInstance(ExtensionsResource).apply(profile.extensions, this.userDataProfileService.currentProfile); - } - }); - this.notificationService.info(localize('applied profile', "{0}: Applied successfully.", PROFILES_CATEGORY.value)); - } - } class FileUserDataProfileContentHandler implements IUserDataProfileContentHandler { diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts index d09cac70e2ffc..2e98469a16335 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts @@ -82,8 +82,8 @@ export function toUserDataProfileUri(path: string, productService: IProductServi } export interface IUserDataProfileCreateOptions extends IUserDataProfileOptions { + readonly name?: string; readonly resourceTypeFlags?: ProfileResourceTypeFlags; - readonly donotSwitch?: boolean; } export interface IProfileImportOptions extends IUserDataProfileCreateOptions { @@ -100,15 +100,12 @@ export interface IUserDataProfileImportExportService { unregisterProfileContentHandler(id: string): void; resolveProfileTemplate(uri: URI): Promise; - exportProfile(): Promise; - exportProfile2(profile: IUserDataProfile): Promise; + exportProfile(profile: IUserDataProfile): Promise; importProfile(uri: URI, options?: IProfileImportOptions): Promise; - showProfileContents(): Promise; createProfile(from?: IUserDataProfile | URI): Promise; - createFromProfile(from: IUserDataProfile, name: string, options?: IUserDataProfileCreateOptions): Promise; - editProfile(profile: IUserDataProfile): Promise; + createFromProfile(from: IUserDataProfile, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise; + createProfileFromTemplate(profileTemplate: IUserDataProfileTemplate, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise; createTroubleshootProfile(): Promise; - setProfile(profile: IUserDataProfileTemplate): Promise; } export interface IProfileResourceInitializer { From 96151fb331916c30ca521383a84a7bf5a5910805 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 7 Jun 2024 00:14:29 +0200 Subject: [PATCH 142/755] fix validation (#214517) * fix validation * fix validation * trim name --- .../browser/userDataProfilesEditor.ts | 7 ++++++- .../browser/userDataProfilesEditorModel.ts | 18 +++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 3e32b5a69dab2..8ddd5bb184687 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -501,7 +501,11 @@ class ProfileWidget extends Disposable { type: MessageType.ERROR }; } - const initialName = this._profileElement.value?.element instanceof UserDataProfileElement ? this._profileElement.value.element.profile.name : undefined; + if (this._profileElement.value?.element.disabled) { + return null; + } + const initialName = this._profileElement.value?.element.getInitialName(); + value = value.trim(); if (initialName !== value && this.userDataProfilesService.profiles.some(p => p.name === value)) { return { content: localize('profileExists', "Profile with name {0} already exists.", value), @@ -778,6 +782,7 @@ class ProfileWidget extends Disposable { private renderProfileElement(profileElement: AbstractUserDataProfileElement): void { this.profileTitle.textContent = profileElement.name; this.nameInput.value = profileElement.name; + this.nameInput.validate(); if (profileElement.disabled) { this.nameInput.disable(); } else { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 731d8a95bb55e..2756c2a3f4828 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -104,9 +104,10 @@ export abstract class AbstractUserDataProfileElement extends Disposable { private _name = ''; get name(): string { return this._name; } - set name(label: string) { - if (this._name !== label) { - this._name = label; + set name(name: string) { + name = name.trim(); + if (this._name !== name) { + this._name = name; this._onDidChange.fire({ name: true }); } } @@ -263,7 +264,7 @@ export abstract class AbstractUserDataProfileElement extends Disposable { } - protected getInitialName(): string { + getInitialName(): string { return ''; } @@ -380,7 +381,7 @@ export class UserDataProfileElement extends AbstractUserDataProfileElement { return this.getChildrenFromProfile(this.profile, resourceType); } - protected override getInitialName(): string { + override getInitialName(): string { return this.profile.name; } @@ -614,7 +615,7 @@ export class NewProfileElement extends AbstractUserDataProfileElement { return []; } - protected override getInitialName(): string { + override getInitialName(): string { return this.previewProfile?.name ?? ''; } @@ -832,9 +833,8 @@ export class UserDataProfilesEditorModel extends EditorModel { if (e.preview) { previewProfileAction.checked = !!this.newProfileElement?.previewProfile; } - if (e.disabled) { - previewProfileAction.enabled = !this.newProfileElement?.disabled; - createAction.enabled = !this.newProfileElement?.disabled; + if (e.disabled || e.message) { + previewProfileAction.enabled = createAction.enabled = !this.newProfileElement?.disabled && !this.newProfileElement?.message; } })); this._profiles.push([this.newProfileElement, disposables]); From 3ea3162dd4f1661949b2c04aff3db529914baca5 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 6 Jun 2024 16:12:17 -0700 Subject: [PATCH 143/755] Disable api-test extension when running code.sh directly (#214521) --- scripts/code.bat | 9 ++++++++- scripts/code.sh | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/scripts/code.bat b/scripts/code.bat index 008c54fcbde25..7f48b7535593c 100644 --- a/scripts/code.bat +++ b/scripts/code.bat @@ -23,9 +23,16 @@ set VSCODE_CLI=1 set ELECTRON_ENABLE_LOGGING=1 set ELECTRON_ENABLE_STACK_DUMPING=1 +set DISABLE_TEST_EXTENSION="--disable-extension=vscode.vscode-api-tests" +for %%A in (%*) do ( + if "%%~A"=="--extensionTestsPath" ( + set DISABLE_TEST_EXTENSION="" + ) +) + :: Launch Code -%CODE% . %* +%CODE% . %DISABLE_TEST_EXTENSION% %* goto end :builtin diff --git a/scripts/code.sh b/scripts/code.sh index 24929fdf3513e..c29b632cbcbc0 100755 --- a/scripts/code.sh +++ b/scripts/code.sh @@ -42,8 +42,13 @@ function code() { export ELECTRON_ENABLE_STACK_DUMPING=1 export ELECTRON_ENABLE_LOGGING=1 + DISABLE_TEST_EXTENSION="--disable-extension=vscode.vscode-api-tests" + if [[ "$@" == *"--extensionTestsPath"* ]]; then + DISABLE_TEST_EXTENSION="" + fi + # Launch Code - exec "$CODE" . "$@" + exec "$CODE" . $DISABLE_TEST_EXTENSION "$@" } function code-wsl() From bf11c6cd52b4e603a58d34e55e9c6853a3c30d73 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 7 Jun 2024 01:13:11 +0200 Subject: [PATCH 144/755] fix canceling (#214519) --- .../browser/userDataProfilesEditorModel.ts | 10 +++---- .../userDataProfileImportExportService.ts | 30 ++++++++++++------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 2756c2a3f4828..6f5b528020e98 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -823,7 +823,7 @@ export class UserDataProfilesEditorModel extends EditorModel { () => this.previewNewProfile(cancellationTokenSource.token) )); this.newProfileElement = disposables.add(this.instantiationService.createInstance(NewProfileElement, - localize('untitled', "Untitled"), + copyFrom ? '' : localize('untitled', "Untitled"), copyFrom, [[createAction], [previewProfileAction, cancelAction]], [[], []], @@ -911,7 +911,7 @@ export class UserDataProfilesEditorModel extends EditorModel { const template = await this.newProfileElement.resolveTemplate(copyFrom); if (template) { this.telemetryService.publicLog2('userDataProfile.createFromTemplate', createProfileTelemetryData); - await this.userDataProfileImportExportService.createProfileFromTemplate( + profile = await this.userDataProfileImportExportService.createProfileFromTemplate( template, { name, @@ -925,7 +925,7 @@ export class UserDataProfilesEditorModel extends EditorModel { } } else if (isUserDataProfile(copyFrom)) { this.telemetryService.publicLog2('userDataProfile.createFromProfile', createProfileTelemetryData); - await this.userDataProfileImportExportService.createFromProfile( + profile = await this.userDataProfileImportExportService.createFromProfile( copyFrom, { name, @@ -938,10 +938,8 @@ export class UserDataProfilesEditorModel extends EditorModel { ); } else { this.telemetryService.publicLog2('userDataProfile.createEmptyProfile', createProfileTelemetryData); - await this.userDataProfileManagementService.createProfile(name, { useDefaultFlags, icon, transient }); + profile = await this.userDataProfileManagementService.createProfile(name, { useDefaultFlags, icon, transient }); } - - profile = this.userDataProfilesService.profiles.find(p => p.name === name); } } finally { if (this.newProfileElement) { diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts index 2d569e09eed86..1d5217c67d3a5 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts @@ -241,7 +241,14 @@ export class UserDataProfileImportExportService extends Disposable implements IU creationPromise = createCancelablePromise(async token => { const userDataProfilesExportState = disposables.add(this.instantiationService.createInstance(UserDataProfileExportState, from, { ...options?.resourceTypeFlags, extensions: false })); const profileTemplate = await userDataProfilesExportState.getProfileTemplate(options.name ?? from.name, options?.icon); - profile = await this.doCreateProfile2(profileTemplate, options, reportProgress, token); + profile = await this.getProfileToImport({ ...profileTemplate, name: options.name ?? profileTemplate.name }, !!options.transient, options); + if (!profile) { + return; + } + if (token.isCancellationRequested) { + return; + } + await this.applyProfileTemplate(profileTemplate, profile, options, reportProgress, token); }); try { await creationPromise; @@ -252,6 +259,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU } catch (error) { if (profile) { await this.userDataProfilesService.removeProfile(profile); + profile = undefined; } } return profile; @@ -272,27 +280,28 @@ export class UserDataProfileImportExportService extends Disposable implements IU }, async progress => { const reportProgress = (message: string) => progress.report({ message: localize('create from profile', "Create Profile: {0}", message) }); creationPromise = createCancelablePromise(async token => { - profile = await this.doCreateProfile2(profileTemplate, options, reportProgress, token); + profile = await this.getProfileToImport({ ...profileTemplate, name: options.name ?? profileTemplate.name }, !!options.transient, options); + if (!profile) { + return; + } + if (token.isCancellationRequested) { + return; + } + await this.applyProfileTemplate(profileTemplate, profile, options, reportProgress, token); }); try { await creationPromise; } catch (error) { if (profile) { await this.userDataProfilesService.removeProfile(profile); + profile = undefined; } } return profile; }, () => creationPromise.cancel()).finally(() => disposables.dispose()); } - private async doCreateProfile2(profileTemplate: IUserDataProfileTemplate, options: IUserDataProfileCreateOptions, reportProgress: (message: string) => void, token: CancellationToken): Promise { - const profile = await this.getProfileToImport({ ...profileTemplate, name: options.name ?? profileTemplate.name }, !!options.transient, options); - if (!profile) { - return; - } - if (token.isCancellationRequested) { - return; - } + private async applyProfileTemplate(profileTemplate: IUserDataProfileTemplate, profile: IUserDataProfile, options: IUserDataProfileCreateOptions, reportProgress: (message: string) => void, token: CancellationToken): Promise { if (profileTemplate.settings && (options.resourceTypeFlags?.settings ?? true) && !profile.useDefaultFlags?.settings) { reportProgress(localize('creating settings', "Creating Settings...")); await this.instantiationService.createInstance(SettingsResource).apply(profileTemplate.settings, profile); @@ -332,7 +341,6 @@ export class UserDataProfileImportExportService extends Disposable implements IU reportProgress(localize('installing extensions', "Installing Extensions...")); await this.instantiationService.createInstance(ExtensionsResource).apply(profileTemplate.extensions, profile, reportProgress, token); } - return profile; } private saveProfile(profile: IUserDataProfile): Promise; From 7453779c77c1dfc70d3010c11e58f8c4a70d0b4b Mon Sep 17 00:00:00 2001 From: Rafael Sargento Date: Fri, 7 Jun 2024 01:12:24 +0100 Subject: [PATCH 145/755] Implemented the requested changes. Registed new setting in debug.contribution.ts Changed the two settings for a single setting (debug.showVariableTypes) Made the renderer functions listen to changes so it re-renders elements Added a different styling for the type in variable panel Changed function names to use camelCase Co-authored-by: Diogo Pinto --- .../contrib/debug/browser/baseDebugView.ts | 19 +++++++++--- .../debug/browser/debug.contribution.ts | 5 ++++ .../contrib/debug/browser/debugColors.ts | 6 ++++ .../contrib/debug/browser/replViewer.ts | 1 + .../contrib/debug/browser/variablesView.ts | 17 +++++++++-- .../debug/browser/watchExpressionsView.ts | 20 ++++++++++--- .../workbench/contrib/debug/common/debug.ts | 1 + .../debug/test/browser/baseDebugView.test.ts | 29 ++++++++++++------- .../debug/test/browser/variablesView.test.ts | 11 ++++--- .../test/browser/watchExpressionView.test.ts | 13 +++++---- 10 files changed, 91 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts index 61ca0893995f6..960af29374710 100644 --- a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts +++ b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts @@ -49,6 +49,7 @@ export interface IRenderValueOptions { export interface IVariableTemplateData { expression: HTMLElement; name: HTMLElement; + type: HTMLElement; value: HTMLElement; label: HighlightedLabel; lazyButton: HTMLElement; @@ -132,10 +133,20 @@ export function renderExpressionValue(expressionOrValue: IExpressionValue | stri export function renderVariable(store: DisposableStore, commandService: ICommandService, hoverService: IHoverService, variable: Variable, data: IVariableTemplateData, showChanged: boolean, highlights: IHighlight[], linkDetector?: LinkDetector, displayType?: boolean): void { if (variable.available) { + data.type.textContent = ''; let text = variable.name; if (variable.value && typeof variable.name === 'string') { if (variable.type && displayType) { - text += ': ' + variable.type + ' ='; + text += ': '; + //render type + const type = variable.type + ' ='; + if (linkDetector) { + data.type.textContent = ''; + const session = (variable instanceof ExpressionContainer) ? variable.getSession() : undefined; + data.type.appendChild(linkDetector.linkify(type, false, session ? session.root : undefined, true)); + } else { + data.type.textContent = type; + } } else { text += ' ='; } @@ -176,6 +187,7 @@ export interface IInputBoxOptions { export interface IExpressionTemplateData { expression: HTMLElement; name: HTMLSpanElement; + type: HTMLSpanElement; value: HTMLSpanElement; inputBoxContainer: HTMLElement; actionBar?: ActionBar; @@ -234,6 +246,7 @@ export abstract class AbstractExpressionsRenderer implements IT const lazyButton = dom.append(expression, $('span.lazy-button')); lazyButton.classList.add(...ThemeIcon.asClassNameArray(Codicon.eye)); templateDisposable.add(this.hoverService.setupUpdatableHover(getDefaultHoverDelegate('mouse'), lazyButton, localize('debug.lazyButton.tooltip', "Click to expand"))); + const type = dom.append(expression, $('span.type')); const value = dom.append(expression, $('span.value')); const label = templateDisposable.add(new HighlightedLabel(name)); @@ -246,7 +259,7 @@ export abstract class AbstractExpressionsRenderer implements IT actionBar = templateDisposable.add(new ActionBar(expression)); } - const template: IExpressionTemplateData = { expression, name, value, label, inputBoxContainer, actionBar, elementDisposable: new DisposableStore(), templateDisposable, lazyButton, currentElement: undefined }; + const template: IExpressionTemplateData = { expression, name, type, value, label, inputBoxContainer, actionBar, elementDisposable: new DisposableStore(), templateDisposable, lazyButton, currentElement: undefined }; templateDisposable.add(dom.addDisposableListener(lazyButton, dom.EventType.CLICK, () => { if (template.currentElement) { @@ -260,8 +273,6 @@ export abstract class AbstractExpressionsRenderer implements IT public abstract renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void; protected renderExpressionElement(element: IExpression, node: ITreeNode, data: IExpressionTemplateData): void { - data.elementDisposable.clear(); - data.currentElement = element; this.renderExpression(node.element, data, createMatches(node.filterData)); if (data.actionBar) { this.renderActionBar!(data.actionBar, element, data); diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index 36da9c868e066..ed54953979f83 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -440,6 +440,11 @@ configurationRegistry.registerConfiguration({ title: nls.localize('debugConfigurationTitle', "Debug"), type: 'object', properties: { + 'debug.showVariableTypes': { + type: 'boolean', + description: nls.localize({ comment: ['This is the description for a setting'], key: 'showVariableTypes' }, "Show variable type in variable pane during debug session"), + default: false + }, 'debug.allowBreakpointsEverywhere': { type: 'boolean', description: nls.localize({ comment: ['This is the description for a setting'], key: 'allowBreakpointsEverywhere' }, "Allow setting breakpoints in any file."), diff --git a/src/vs/workbench/contrib/debug/browser/debugColors.ts b/src/vs/workbench/contrib/debug/browser/debugColors.ts index f7b758666b100..654a9b983b6e2 100644 --- a/src/vs/workbench/contrib/debug/browser/debugColors.ts +++ b/src/vs/workbench/contrib/debug/browser/debugColors.ts @@ -35,6 +35,7 @@ export const debugIconStartForeground = registerColor('debugIcon.startForeground export function registerColors() { const debugTokenExpressionName = registerColor('debugTokenExpression.name', { dark: '#c586c0', light: '#9b46b0', hcDark: foreground, hcLight: foreground }, 'Foreground color for the token names shown in the debug views (ie. the Variables or Watch view).'); + const debugTokenExpressionType = registerColor('debugTokenExpression.type', { dark: '#4A90E2', light: '#4A90E2', hcDark: foreground, hcLight: foreground }, 'Foreground color for the token types shown in the debug views (ie. the Variables or Watch view).'); const debugTokenExpressionValue = registerColor('debugTokenExpression.value', { dark: '#cccccc99', light: '#6c6c6ccc', hcDark: foreground, hcLight: foreground }, 'Foreground color for the token values shown in the debug views (ie. the Variables or Watch view).'); const debugTokenExpressionString = registerColor('debugTokenExpression.string', { dark: '#ce9178', light: '#a31515', hcDark: '#f48771', hcLight: '#a31515' }, 'Foreground color for strings in the debug views (ie. the Variables or Watch view).'); const debugTokenExpressionBoolean = registerColor('debugTokenExpression.boolean', { dark: '#4e94ce', light: '#0000ff', hcDark: '#75bdfe', hcLight: '#0000ff' }, 'Foreground color for booleans in the debug views (ie. the Variables or Watch view).'); @@ -210,6 +211,7 @@ export function registerColors() { } const tokenNameColor = theme.getColor(debugTokenExpressionName)!; + const tokenTypeColor = theme.getColor(debugTokenExpressionType)!; const tokenValueColor = theme.getColor(debugTokenExpressionValue)!; const tokenStringColor = theme.getColor(debugTokenExpressionString)!; const tokenBooleanColor = theme.getColor(debugTokenExpressionBoolean)!; @@ -221,6 +223,10 @@ export function registerColors() { color: ${tokenNameColor}; } + .monaco-workbench .monaco-list-row .expression .type { + color: ${tokenTypeColor}; + } + .monaco-workbench .monaco-list-row .expression .value, .monaco-workbench .debug-hover-widget .value { color: ${tokenValueColor}; diff --git a/src/vs/workbench/contrib/debug/browser/replViewer.ts b/src/vs/workbench/contrib/debug/browser/replViewer.ts index bae5c31696c7c..6fa302dcc72de 100644 --- a/src/vs/workbench/contrib/debug/browser/replViewer.ts +++ b/src/vs/workbench/contrib/debug/browser/replViewer.ts @@ -247,6 +247,7 @@ export class ReplVariablesRenderer extends AbstractExpressionsRenderer, _index: number, data: IExpressionTemplateData): void { const element = node.element; + data.elementDisposable.clear(); super.renderExpressionElement(element instanceof ReplVariableElement ? element.expression : element, node, data); } diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index b728732f54984..a37dbf544922b 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -41,7 +41,7 @@ import { IViewDescriptorService } from 'vs/workbench/common/views'; import { AbstractExpressionDataSource, AbstractExpressionsRenderer, IExpressionTemplateData, IInputBoxOptions, renderExpressionValue, renderVariable, renderViewTree } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import { ADD_TO_WATCH_ID, ADD_TO_WATCH_LABEL, COPY_EVALUATE_PATH_ID, COPY_EVALUATE_PATH_LABEL, COPY_VALUE_ID, COPY_VALUE_LABEL } from 'vs/workbench/contrib/debug/browser/debugCommands'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; -import { CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, CONTEXT_BREAK_WHEN_VALUE_IS_ACCESSED_SUPPORTED, CONTEXT_BREAK_WHEN_VALUE_IS_READ_SUPPORTED, CONTEXT_VARIABLES_FOCUSED, DataBreakpointSetType, DebugVisualizationType, IDataBreakpointInfoResponse, IDebugService, IExpression, IScope, IStackFrame, IViewModel, VARIABLES_VIEW_ID } from 'vs/workbench/contrib/debug/common/debug'; +import { CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, CONTEXT_BREAK_WHEN_VALUE_IS_ACCESSED_SUPPORTED, CONTEXT_BREAK_WHEN_VALUE_IS_READ_SUPPORTED, CONTEXT_VARIABLES_FOCUSED, DataBreakpointSetType, DebugVisualizationType, IDataBreakpointInfoResponse, IDebugConfiguration, IDebugService, IExpression, IScope, IStackFrame, IViewModel, VARIABLES_VIEW_ID } from 'vs/workbench/contrib/debug/common/debug'; import { getContextForVariable } from 'vs/workbench/contrib/debug/common/debugContext'; import { ErrorScope, Expression, Scope, StackFrame, Variable, VisualizedExpression, getUriForDebugMemory } from 'vs/workbench/contrib/debug/common/debugModel'; import { DebugVisualizer, IDebugVisualizerService } from 'vs/workbench/contrib/debug/common/debugVisualizers'; @@ -123,7 +123,7 @@ export class VariablesView extends ViewPane { container.classList.add('debug-variables'); const treeContainer = renderViewTree(container); const linkDetector = this.instantiationService.createInstance(LinkDetector); - const displayType: boolean = this.configurationService.getValue('variableDisplayType.variableView'); + const displayType: boolean = this.configurationService.getValue('debug').showVariableTypes; this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(), [ this.instantiationService.createInstance(VariablesRenderer, linkDetector, displayType), @@ -456,6 +456,8 @@ export class VisualizedVariableRenderer extends AbstractExpressionsRenderer { } public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { + data.elementDisposable.clear(); + data.currentElement = node.element; super.renderExpressionElement(node.element, node, data); } @@ -524,7 +526,7 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { constructor( private readonly linkDetector: LinkDetector, - private readonly displayType: boolean, + private displayType: boolean, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IDebugVisualizerService private readonly visualization: IDebugVisualizerService, @@ -533,6 +535,7 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { @IDebugService debugService: IDebugService, @IContextViewService contextViewService: IContextViewService, @IHoverService hoverService: IHoverService, + @IConfigurationService private configurationService: IConfigurationService, ) { super(debugService, contextViewService, hoverService); } @@ -546,6 +549,14 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { } public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { + data.elementDisposable.clear(); + data.currentElement = node.element; + data.elementDisposable.add(this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('debug.showVariableTypes')) { + this.displayType = this.configurationService.getValue('debug').showVariableTypes; + super.renderExpressionElement(node.element, node, data); + } + })); super.renderExpressionElement(node.element, node, data); } diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index 6ebc6e5c10689..afa73194fdb1c 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -34,7 +34,7 @@ import { AbstractExpressionDataSource, AbstractExpressionsRenderer, IExpressionT import { watchExpressionsAdd, watchExpressionsRemoveAll } from 'vs/workbench/contrib/debug/browser/debugIcons'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { VariablesRenderer, VisualizedVariableRenderer } from 'vs/workbench/contrib/debug/browser/variablesView'; -import { CONTEXT_CAN_VIEW_MEMORY, CONTEXT_VARIABLE_IS_READONLY, CONTEXT_WATCH_EXPRESSIONS_EXIST, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_WATCH_ITEM_TYPE, IDebugService, IExpression, WATCH_VIEW_ID } from 'vs/workbench/contrib/debug/common/debug'; +import { CONTEXT_CAN_VIEW_MEMORY, CONTEXT_VARIABLE_IS_READONLY, CONTEXT_WATCH_EXPRESSIONS_EXIST, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_WATCH_ITEM_TYPE, IDebugConfiguration, IDebugService, IExpression, WATCH_VIEW_ID } from 'vs/workbench/contrib/debug/common/debug'; import { Expression, Variable, VisualizedExpression } from 'vs/workbench/contrib/debug/common/debugModel'; const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; @@ -86,7 +86,7 @@ export class WatchExpressionsView extends ViewPane { this.element.classList.add('debug-pane'); container.classList.add('debug-watch'); const treeContainer = renderViewTree(container); - const watchDisplayType: boolean = this.configurationService.getValue('variableDisplayType.watchView'); + const watchDisplayType: boolean = this.configurationService.getValue('debug').showVariableTypes; const expressionsRenderer = this.instantiationService.createInstance(WatchExpressionsRenderer, watchDisplayType); const linkDetector = this.instantiationService.createInstance(LinkDetector); @@ -280,12 +280,13 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { static readonly ID = 'watchexpression'; constructor( - private readonly watchDisplayType: boolean, + private watchDisplayType: boolean, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IDebugService debugService: IDebugService, @IContextViewService contextViewService: IContextViewService, @IHoverService hoverService: IHoverService, + @IConfigurationService private configurationService: IConfigurationService, ) { super(debugService, contextViewService, hoverService); } @@ -295,13 +296,24 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { } public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { + data.elementDisposable.clear(); + data.currentElement = node.element; + data.elementDisposable.add(this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('debug.showVariableTypes')) { + this.watchDisplayType = this.configurationService.getValue('debug').showVariableTypes; + super.renderExpressionElement(node.element, node, data); + } + })); super.renderExpressionElement(node.element, node, data); } protected renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void { let text: string; + data.type.textContent = ''; if (this.watchDisplayType && expression.type) { - text = typeof expression.value === 'string' ? `${expression.name}: ${expression.type} =` : expression.name; + text = typeof expression.value === 'string' ? `${expression.name}: ` : expression.name; + //render type + data.type.textContent = expression.type + ' ='; } else { text = typeof expression.value === 'string' ? `${expression.name} =` : expression.name; } diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index e48607b9edab5..f913cfa51aa89 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -774,6 +774,7 @@ export interface IDebugConfiguration { }; autoExpandLazyVariables: boolean; enableStatusBarColor: boolean; + showVariableTypes: boolean; } export interface IGlobalConfig { diff --git a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts index e9a5a0e5eb00b..3a15e50179636 100644 --- a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts @@ -24,15 +24,16 @@ import { MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; const $ = dom.$; -function assert_variable(session: MockSession, scope: Scope, disposables: Pick, linkDetector: LinkDetector, displayType: boolean) { +function assertVariable(session: MockSession, scope: Scope, disposables: Pick, linkDetector: LinkDetector, displayType: boolean) { let variable = new Variable(session, 1, scope, 2, 'foo', 'bar.foo', undefined, 0, 0, undefined, {}, 'string'); let expression = $('.'); let name = $('.'); + let type = $('.'); let value = $('.'); const label = new HighlightedLabel(name); const lazyButton = $('.'); const store = disposables.add(new DisposableStore()); - renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, value, label, lazyButton }, false, [], undefined, displayType); + renderVariable(store, NullCommandService, NullHoverService, variable, { expression, name, type, value, label, lazyButton }, false, [], undefined, displayType); assert.strictEqual(label.element.textContent, 'foo'); assert.strictEqual(value.textContent, ''); @@ -40,39 +41,45 @@ function assert_variable(session: MockSession, scope: Scope, disposables: Pick { const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true); const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10); - assert_variable(session, scope, disposables, linkDetector, false); + assertVariable(session, scope, disposables, linkDetector, false); }); @@ -165,7 +172,7 @@ suite('Debug - Base Debug View', () => { const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true); const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10); - assert_variable(session, scope, disposables, linkDetector, true); + assertVariable(session, scope, disposables, linkDetector, true); }); test('statusbar in debug mode', () => { diff --git a/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts b/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts index 48187635ef7bd..8da0cbd3f3bfc 100644 --- a/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts @@ -20,7 +20,7 @@ import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; const $ = dom.$; -function assert_variable(disposables: Pick, variablesRenderer: VariablesRenderer, displayType: boolean) { +function assertVariable(disposables: Pick, variablesRenderer: VariablesRenderer, displayType: boolean) { const session = new MockSession(); const thread = new Thread(session, 'mockthread', 1); const range = { @@ -44,6 +44,7 @@ function assert_variable(disposables: Pick, variablesRen }; const expression = $('.'); const name = $('.'); + const type = $('.'); const value = $('.'); const label = disposables.add(new HighlightedLabel(name)); const lazyButton = $('.'); @@ -54,6 +55,7 @@ function assert_variable(disposables: Pick, variablesRen const data = { expression, name, + type, value, label, lazyButton, @@ -69,7 +71,8 @@ function assert_variable(disposables: Pick, variablesRen node.element.value = 'xpto'; variablesRenderer.renderElement(node, 0, data); assert.strictEqual(value.textContent, 'xpto'); - assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); + assert.strictEqual(type.textContent, displayType ? 'string =' : ''); + assert.strictEqual(label.element.textContent, displayType ? 'foo: ' : 'foo ='); } suite('Debug - Variable Debug View', () => { @@ -90,11 +93,11 @@ suite('Debug - Variable Debug View', () => { test('variable expressions with display type', () => { variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector, true); - assert_variable(disposables, variablesRenderer, true); + assertVariable(disposables, variablesRenderer, true); }); test('variable expressions', () => { variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector, false); - assert_variable(disposables, variablesRenderer, false); + assertVariable(disposables, variablesRenderer, false); }); }); diff --git a/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts b/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts index ffb3af896b6e5..781f734e82660 100644 --- a/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts @@ -18,7 +18,7 @@ import { NullHoverService } from 'vs/platform/hover/test/browser/nullHoverServic import { IDebugService, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; const $ = dom.$; -function assert_watch_variable(disposables: Pick, watchExpressionsRenderer: WatchExpressionsRenderer, displayType: boolean) { +function assertWatchVariable(disposables: Pick, watchExpressionsRenderer: WatchExpressionsRenderer, displayType: boolean) { const session = new MockSession(); const thread = new Thread(session, 'mockthread', 1); const range = { @@ -42,6 +42,7 @@ function assert_watch_variable(disposables: Pick, watchE }; const expression = $('.'); const name = $('.'); + const type = $('.'); const value = $('.'); const label = disposables.add(new HighlightedLabel(name)); const lazyButton = $('.'); @@ -52,6 +53,7 @@ function assert_watch_variable(disposables: Pick, watchE const data = { expression, name, + type, value, label, lazyButton, @@ -62,12 +64,13 @@ function assert_watch_variable(disposables: Pick, watchE }; watchExpressionsRenderer.renderElement(node, 0, data); assert.strictEqual(value.textContent, ''); - assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); + assert.strictEqual(label.element.textContent, displayType ? 'foo: ' : 'foo ='); node.element.value = 'xpto'; watchExpressionsRenderer.renderElement(node, 0, data); assert.strictEqual(value.textContent, 'xpto'); - assert.strictEqual(label.element.textContent, displayType ? 'foo: string =' : 'foo ='); + assert.strictEqual(type.textContent, displayType ? 'string =' : ''); + assert.strictEqual(label.element.textContent, displayType ? 'foo: ' : 'foo ='); } suite('Debug - Watch Debug View', () => { @@ -87,11 +90,11 @@ suite('Debug - Watch Debug View', () => { test('watch expressions with display type', () => { watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer, true); - assert_watch_variable(disposables, watchExpressionsRenderer, true); + assertWatchVariable(disposables, watchExpressionsRenderer, true); }); test('watch expressions', () => { watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer, false); - assert_watch_variable(disposables, watchExpressionsRenderer, false); + assertWatchVariable(disposables, watchExpressionsRenderer, false); }); }); From f89375854f5f7ac1e94ee33b7f9f78c715e01350 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 6 Jun 2024 18:19:33 -0700 Subject: [PATCH 146/755] Enable two participants with the same name from the same extension, in different locations (#214535) For #214479 --- .../chatMarkdownDecorationsRenderer.ts | 2 +- .../browser/contrib/chatInputCompletions.ts | 21 +++++++++---------- .../contrib/chat/common/chatAgents.ts | 11 ++++++++++ .../chat/test/common/voiceChatService.test.ts | 1 + 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts index f58b706280971..9af542462c305 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts @@ -42,7 +42,7 @@ export function agentToMarkdown(agent: IChatAgentData, isClickable: boolean, acc const isAllowed = chatAgentNameService.getAgentNameRestriction(agent); let name = `${isAllowed ? agent.name : getFullyQualifiedId(agent)}`; - const isDupe = isAllowed && chatAgentService.getAgentsByName(agent.name).length > 1; + const isDupe = isAllowed && chatAgentService.agentHasDupeName(agent.id); if (isDupe) { name += ` (${agent.publisherDisplayName})`; } diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts index 647ac002a13a4..cbd7042dc425b 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts @@ -117,7 +117,7 @@ class AgentCompletions extends Disposable { return { suggestions: agents.map((agent, i): CompletionItem => { - const { label: agentLabel, isDupe } = getAgentCompletionDetails(agent, agents, this.chatAgentNameService); + const { label: agentLabel, isDupe } = this.getAgentCompletionDetails(agent); return { // Leading space is important because detail has no space at the start by design label: isDupe ? @@ -216,7 +216,7 @@ class AgentCompletions extends Disposable { const justAgents: CompletionItem[] = agents .filter(a => !a.isDefault) .map(agent => { - const { label: agentLabel, isDupe } = getAgentCompletionDetails(agent, agents, this.chatAgentNameService); + const { label: agentLabel, isDupe } = this.getAgentCompletionDetails(agent); const detail = agent.description; return { @@ -236,7 +236,7 @@ class AgentCompletions extends Disposable { return { suggestions: justAgents.concat( agents.flatMap(agent => agent.slashCommands.map((c, i) => { - const { label: agentLabel, isDupe } = getAgentCompletionDetails(agent, agents, this.chatAgentNameService); + const { label: agentLabel, isDupe } = this.getAgentCompletionDetails(agent); const withSlash = `${chatSubcommandLeader}${c.name}`; return { label: { label: withSlash, description: agentLabel, detail: isDupe ? ` (${agent.publisherDisplayName})` : undefined }, @@ -254,6 +254,13 @@ class AgentCompletions extends Disposable { } })); } + + private getAgentCompletionDetails(agent: IChatAgentData): { label: string; isDupe: boolean } { + const isAllowed = this.chatAgentNameService.getAgentNameRestriction(agent); + const agentLabel = `${chatAgentLeader}${isAllowed ? agent.name : getFullyQualifiedId(agent)}`; + const isDupe = isAllowed && this.chatAgentService.agentHasDupeName(agent.id); + return { label: agentLabel, isDupe }; + } } Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(AgentCompletions, LifecyclePhase.Eventually); @@ -401,11 +408,3 @@ class VariableCompletions extends Disposable { } Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(VariableCompletions, LifecyclePhase.Eventually); - -function getAgentCompletionDetails(agent: IChatAgentData, otherAgents: IChatAgentData[], chatAgentNameService: IChatAgentNameService): { label: string; isDupe: boolean } { - const isAllowed = chatAgentNameService.getAgentNameRestriction(agent); - const agentLabel = `${chatAgentLeader}${isAllowed ? agent.name : getFullyQualifiedId(agent)}`; - const isDupe = isAllowed && !!otherAgents.find(other => other.name === agent.name && other.id !== agent.id); - - return { label: agentLabel, isDupe }; -} diff --git a/src/vs/workbench/contrib/chat/common/chatAgents.ts b/src/vs/workbench/contrib/chat/common/chatAgents.ts index da0e5eba9d97a..e2f703325b14f 100644 --- a/src/vs/workbench/contrib/chat/common/chatAgents.ts +++ b/src/vs/workbench/contrib/chat/common/chatAgents.ts @@ -174,6 +174,7 @@ export interface IChatAgentService { getAgents(): IChatAgentData[]; getActivatedAgents(): Array; getAgentsByName(name: string): IChatAgentData[]; + agentHasDupeName(id: string): boolean; /** * Get the default agent (only if activated) @@ -345,6 +346,16 @@ export class ChatAgentService implements IChatAgentService { return this.getAgents().filter(a => a.name === name); } + agentHasDupeName(id: string): boolean { + const agent = this.getAgent(id); + if (!agent) { + return false; + } + + return this.getAgentsByName(agent.name) + .filter(a => a.extensionId.value !== agent.extensionId.value).length > 0; + } + async invokeAgent(id: string, request: IChatAgentRequest, progress: (part: IChatProgress) => void, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { const data = this._agents.get(id); if (!data?.impl) { diff --git a/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts b/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts index 144d996b5ae04..2ad2f91c6b1f8 100644 --- a/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts @@ -70,6 +70,7 @@ suite('VoiceChat', () => { getAgentByFullyQualifiedId(id: string): IChatAgentData | undefined { throw new Error('Method not implemented.'); } registerAgentCompletionProvider(id: string, provider: (query: string, token: CancellationToken) => Promise): IDisposable { throw new Error('Method not implemented.'); } getAgentCompletionItems(id: string, query: string, token: CancellationToken): Promise { throw new Error('Method not implemented.'); } + agentHasDupeName(id: string): boolean { throw new Error('Method not implemented.'); } } class TestSpeechService implements ISpeechService { From e2bf3453f5355a10ff81354990c374fddaceee3e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Thu, 6 Jun 2024 21:15:59 -0700 Subject: [PATCH 147/755] debug: correlate debug sessions to testing, delegate restarts (#214537) Implements #214486 --- .../src/extension.ts | 2 +- .../src/vscodeTestRunner.ts | 4 +- .../tsconfig.json | 1 + .../api/browser/mainThreadDebugService.ts | 1 + .../workbench/api/common/extHost.api.impl.ts | 4 +- .../api/common/extHost.common.services.ts | 2 + .../workbench/api/common/extHost.protocol.ts | 3 +- .../api/common/extHostDebugService.ts | 13 +++- src/vs/workbench/api/common/extHostTesting.ts | 69 +++++++++++++++---- .../workbench/api/node/extHostDebugService.ts | 4 +- .../contrib/debug/browser/debugService.ts | 17 +++++ .../contrib/debug/browser/debugSession.ts | 25 ++++++- .../workbench/contrib/debug/common/debug.ts | 13 ++++ .../debug/test/browser/callStack.test.ts | 4 +- .../common/extensionsApiProposals.ts | 1 + .../vscode.proposed.testRunInDebug.d.ts | 18 +++++ 16 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 src/vscode-dts/vscode.proposed.testRunInDebug.d.ts diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts index 960dbcf634e3c..c61fd56514687 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts @@ -119,7 +119,7 @@ export async function activate(context: vscode.ExtensionContext) { map, task, kind === vscode.TestRunProfileKind.Debug - ? await runner.debug(currentArgs, req.include) + ? await runner.debug(task, currentArgs, req.include) : await runner.run(currentArgs, req.include), coverageDir, cancellationToken diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts index 8a76cefe36a79..954b847f4a8b7 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts @@ -37,7 +37,7 @@ export abstract class VSCodeTestRunner { return new TestOutputScanner(cp, args); } - public async debug(baseArgs: ReadonlyArray, filter?: ReadonlyArray) { + public async debug(testRun: vscode.TestRun, baseArgs: ReadonlyArray, filter?: ReadonlyArray) { const port = await this.findOpenPort(); const baseConfiguration = vscode.workspace .getConfiguration('launch', this.repoLocation) @@ -95,7 +95,7 @@ export abstract class VSCodeTestRunner { }, }); - vscode.debug.startDebugging(this.repoLocation, { ...baseConfiguration, port }); + vscode.debug.startDebugging(this.repoLocation, { ...baseConfiguration, port }, { testRun }); let exited = false; let rootSession: vscode.DebugSession | undefined; diff --git a/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json b/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json index 0183a2ff57e20..b95a70145c007 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json +++ b/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json @@ -12,5 +12,6 @@ "../../../src/vscode-dts/vscode.d.ts", "../../../src/vscode-dts/vscode.proposed.testObserver.d.ts", "../../../src/vscode-dts/vscode.proposed.attributableCoverage.d.ts", + "../../../src/vscode-dts/vscode.proposed.testRunInDebug.d.ts", ] } diff --git a/src/vs/workbench/api/browser/mainThreadDebugService.ts b/src/vs/workbench/api/browser/mainThreadDebugService.ts index f58ba4c47fb99..36b5a4df0aee4 100644 --- a/src/vs/workbench/api/browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/browser/mainThreadDebugService.ts @@ -329,6 +329,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb compact: options.compact, compoundRoot: parentSession?.compoundRoot, saveBeforeRestart: saveBeforeStart, + testRun: options.testRun, suppressDebugStatusbar: options.suppressDebugStatusbar, suppressDebugToolbar: options.suppressDebugToolbar, diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 49143a3fcc525..68c6b305eab19 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -84,7 +84,7 @@ import { IExtHostTask } from 'vs/workbench/api/common/extHostTask'; import { ExtHostTelemetryLogger, IExtHostTelemetry, isNewAppInstall } from 'vs/workbench/api/common/extHostTelemetry'; import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; import { IExtHostTerminalShellIntegration } from 'vs/workbench/api/common/extHostTerminalShellIntegration'; -import { ExtHostTesting } from 'vs/workbench/api/common/extHostTesting'; +import { IExtHostTesting } from 'vs/workbench/api/common/extHostTesting'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { ExtHostTheming } from 'vs/workbench/api/common/extHostTheming'; import { ExtHostTimeline } from 'vs/workbench/api/common/extHostTimeline'; @@ -205,7 +205,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostWebviewPanels = rpcProtocol.set(ExtHostContext.ExtHostWebviewPanels, new ExtHostWebviewPanels(rpcProtocol, extHostWebviews, extHostWorkspace)); const extHostCustomEditors = rpcProtocol.set(ExtHostContext.ExtHostCustomEditors, new ExtHostCustomEditors(rpcProtocol, extHostDocuments, extensionStoragePaths, extHostWebviews, extHostWebviewPanels)); const extHostWebviewViews = rpcProtocol.set(ExtHostContext.ExtHostWebviewViews, new ExtHostWebviewViews(rpcProtocol, extHostWebviews)); - const extHostTesting = rpcProtocol.set(ExtHostContext.ExtHostTesting, new ExtHostTesting(rpcProtocol, extHostLogService, extHostCommands, extHostDocumentsAndEditors)); + const extHostTesting = rpcProtocol.set(ExtHostContext.ExtHostTesting, accessor.get(IExtHostTesting)); const extHostUriOpeners = rpcProtocol.set(ExtHostContext.ExtHostUriOpeners, new ExtHostUriOpeners(rpcProtocol)); const extHostProfileContentHandlers = rpcProtocol.set(ExtHostContext.ExtHostProfileContentHandlers, new ExtHostProfileContentHandlers(rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostInteractive, new ExtHostInteractive(rpcProtocol, extHostNotebook, extHostDocumentsAndEditors, extHostCommands, extHostLogService)); diff --git a/src/vs/workbench/api/common/extHost.common.services.ts b/src/vs/workbench/api/common/extHost.common.services.ts index d01a3219f948a..0427ebe7b17b4 100644 --- a/src/vs/workbench/api/common/extHost.common.services.ts +++ b/src/vs/workbench/api/common/extHost.common.services.ts @@ -31,6 +31,7 @@ import { ExtHostManagedSockets, IExtHostManagedSockets } from 'vs/workbench/api/ import { ExtHostAuthentication, IExtHostAuthentication } from 'vs/workbench/api/common/extHostAuthentication'; import { ExtHostLanguageModels, IExtHostLanguageModels } from 'vs/workbench/api/common/extHostLanguageModels'; import { IExtHostTerminalShellIntegration, ExtHostTerminalShellIntegration } from 'vs/workbench/api/common/extHostTerminalShellIntegration'; +import { ExtHostTesting, IExtHostTesting } from 'vs/workbench/api/common/extHostTesting'; registerSingleton(IExtHostLocalizationService, ExtHostLocalizationService, InstantiationType.Delayed); registerSingleton(ILoggerService, ExtHostLoggerService, InstantiationType.Delayed); @@ -40,6 +41,7 @@ registerSingleton(IExtHostAuthentication, ExtHostAuthentication, InstantiationTy registerSingleton(IExtHostLanguageModels, ExtHostLanguageModels, InstantiationType.Eager); registerSingleton(IExtHostConfiguration, ExtHostConfiguration, InstantiationType.Eager); registerSingleton(IExtHostConsumerFileSystem, ExtHostConsumerFileSystem, InstantiationType.Eager); +registerSingleton(IExtHostTesting, ExtHostTesting, InstantiationType.Eager); registerSingleton(IExtHostDebugService, WorkerExtHostDebugService, InstantiationType.Eager); registerSingleton(IExtHostDecorations, ExtHostDecorations, InstantiationType.Eager); registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors, InstantiationType.Eager); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index bb0a38e3bf9ef..4af2855cca39e 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -55,7 +55,7 @@ import { IChatProgressResponseContent } from 'vs/workbench/contrib/chat/common/c import { IChatFollowup, IChatProgress, IChatResponseErrorDetails, IChatTask, IChatTaskDto, IChatUserActionEvent, ChatAgentVoteDirection } from 'vs/workbench/contrib/chat/common/chatService'; import { IChatRequestVariableValue, IChatVariableData, IChatVariableResolverProgress } from 'vs/workbench/contrib/chat/common/chatVariables'; import { IChatMessage, IChatResponseFragment, ILanguageModelChatMetadata, ILanguageModelChatSelector, ILanguageModelsChangeEvent } from 'vs/workbench/contrib/chat/common/languageModels'; -import { DebugConfigurationProviderTriggerKind, IAdapterDescriptor, IConfig, IDebugSessionReplMode, IDebugVisualization, IDebugVisualizationContext, IDebugVisualizationTreeItem, MainThreadDebugVisualization } from 'vs/workbench/contrib/debug/common/debug'; +import { DebugConfigurationProviderTriggerKind, IAdapterDescriptor, IConfig, IDebugSessionReplMode, IDebugTestRunReference, IDebugVisualization, IDebugVisualizationContext, IDebugVisualizationTreeItem, MainThreadDebugVisualization } from 'vs/workbench/contrib/debug/common/debug'; import * as notebookCommon from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CellExecutionUpdateType } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; import { ICellExecutionComplete, ICellExecutionStateUpdate } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; @@ -1566,6 +1566,7 @@ export interface IStartDebuggingOptions { suppressDebugStatusbar?: boolean; suppressDebugView?: boolean; suppressSaveBeforeStart?: boolean; + testRun?: IDebugTestRunReference; } export interface MainThreadDebugServiceShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index a569ddcbc4e3c..bcd436663cc7f 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -30,6 +30,7 @@ import { ThemeIcon as ThemeIconUtils } from 'vs/base/common/themables'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import * as Convert from 'vs/workbench/api/common/extHostTypeConverters'; import { coalesce } from 'vs/base/common/arrays'; +import { IExtHostTesting } from 'vs/workbench/api/common/extHostTesting'; export const IExtHostDebugService = createDecorator('IExtHostDebugService'); @@ -123,6 +124,7 @@ export abstract class ExtHostDebugServiceBase extends DisposableCls implements I @IExtHostEditorTabs protected _editorTabs: IExtHostEditorTabs, @IExtHostVariableResolverProvider private _variableResolver: IExtHostVariableResolverProvider, @IExtHostCommands private _commands: IExtHostCommands, + @IExtHostTesting private _testing: IExtHostTesting, ) { super(); @@ -466,6 +468,8 @@ export abstract class ExtHostDebugServiceBase extends DisposableCls implements I } public startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration, options: vscode.DebugSessionOptions): Promise { + const testRunMeta = options.testRun && this._testing.getMetadataForRun(options.testRun); + return this._debugServiceProxy.$startDebugging(folder ? folder.uri : undefined, nameOrConfig, { parentSessionID: options.parentSession ? options.parentSession.id : undefined, lifecycleManagedByParent: options.lifecycleManagedByParent, @@ -473,6 +477,10 @@ export abstract class ExtHostDebugServiceBase extends DisposableCls implements I noDebug: options.noDebug, compact: options.compact, suppressSaveBeforeStart: options.suppressSaveBeforeStart, + testRun: testRunMeta && { + runId: testRunMeta.runId, + taskId: testRunMeta.taskId, + }, // Check debugUI for back-compat, #147264 suppressDebugStatusbar: options.suppressDebugStatusbar ?? (options as any).debugUI?.simple, @@ -1247,8 +1255,9 @@ export class WorkerExtHostDebugService extends ExtHostDebugServiceBase { @IExtHostConfiguration configurationService: IExtHostConfiguration, @IExtHostEditorTabs editorTabs: IExtHostEditorTabs, @IExtHostVariableResolverProvider variableResolver: IExtHostVariableResolverProvider, - @IExtHostCommands commands: IExtHostCommands + @IExtHostCommands commands: IExtHostCommands, + @IExtHostTesting testing: IExtHostTesting, ) { - super(extHostRpcService, workspaceService, extensionService, configurationService, editorTabs, variableResolver, commands); + super(extHostRpcService, workspaceService, extensionService, configurationService, editorTabs, variableResolver, commands, testing); } } diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index bafd07810d283..7334180c62953 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -16,10 +16,11 @@ import { MarshalledId } from 'vs/base/common/marshallingIds'; import { isDefined } from 'vs/base/common/types'; import { generateUuid } from 'vs/base/common/uuid'; import { IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostTestingShape, ILocationDto, MainContext, MainThreadTestingShape } from 'vs/workbench/api/common/extHost.protocol'; -import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; +import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ExtHostTestItemCollection, TestItemImpl, TestItemRootImpl, toItemFromContext } from 'vs/workbench/api/common/extHostTestItem'; import * as Convert from 'vs/workbench/api/common/extHostTypeConverters'; @@ -45,7 +46,14 @@ let followupCounter = 0; const testResultInternalIDs = new WeakMap(); +export const IExtHostTesting = createDecorator('IExtHostTesting'); +export interface IExtHostTesting extends ExtHostTesting { + readonly _serviceBrand: undefined; +} + export class ExtHostTesting extends Disposable implements ExtHostTestingShape { + declare readonly _serviceBrand: undefined; + private readonly resultsChangedEmitter = this._register(new Emitter()); protected readonly controllers = new Map(); private readonly proxy: MainThreadTestingShape; @@ -61,8 +69,8 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { constructor( @IExtHostRpcService rpc: IExtHostRpcService, @ILogService private readonly logService: ILogService, - private readonly commands: ExtHostCommands, - private readonly editors: ExtHostDocumentsAndEditors, + @IExtHostCommands private readonly commands: IExtHostCommands, + @IExtHostDocumentsAndEditors private readonly editors: IExtHostDocumentsAndEditors, ) { super(); this.proxy = rpc.getProxy(MainContext.MainThreadTesting); @@ -111,6 +119,8 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { }); } + //#region public API + /** * Implements vscode.test.registerTestProvider */ @@ -236,6 +246,9 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { return { dispose: () => { this.followupProviders.delete(provider); } }; } + //#endregion + + //#region RPC methods /** * @inheritdoc */ @@ -412,6 +425,32 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { return this.commands.executeCommand(command.command, ...(command.arguments || [])); } + /** + * Cancels an ongoing test run. + */ + public $cancelExtensionTestRun(runId: string | undefined) { + if (runId === undefined) { + this.runTracker.cancelAllRuns(); + } else { + this.runTracker.cancelRunById(runId); + } + } + + //#endregion + + public getMetadataForRun(run: vscode.TestRun) { + for (const tracker of this.runTracker.trackers) { + const taskId = tracker.getTaskIdForRun(run); + if (!taskId) { + return undefined; + } + + return { taskId, runId: tracker.id }; + } + + return undefined; + } + private async runControllerTestRequest(req: ICallProfileRunHandler | ICallProfileRunHandler, isContinuous: boolean, token: CancellationToken): Promise { const lookup = this.controllers.get(req.controllerId); if (!lookup) { @@ -467,17 +506,6 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { } } } - - /** - * Cancels an ongoing test run. - */ - public $cancelExtensionTestRun(runId: string | undefined) { - if (runId === undefined) { - this.runTracker.cancelAllRuns(); - } else { - this.runTracker.cancelRunById(runId); - } - } } // Deadline after being requested by a user that a test run is forcibly cancelled. @@ -543,6 +571,17 @@ class TestRunTracker extends Disposable { })); } + /** Gets the task ID from a test run object. */ + public getTaskIdForRun(run: vscode.TestRun) { + for (const [taskId, { run: r }] of this.tasks) { + if (r === run) { + return taskId; + } + } + + return undefined; + } + /** Requests cancellation of the run. On the second call, forces cancellation. */ public cancel() { if (this.state === TestRunTrackerState.Running) { diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index f93076de1dfba..dc48354e3728f 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -27,6 +27,7 @@ import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/c import type * as vscode from 'vscode'; import { ExtHostConfigProvider, IExtHostConfiguration } from '../common/extHostConfiguration'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostTesting } from 'vs/workbench/api/common/extHostTesting'; export class ExtHostDebugService extends ExtHostDebugServiceBase { @@ -44,8 +45,9 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { @IExtHostEditorTabs editorTabs: IExtHostEditorTabs, @IExtHostVariableResolverProvider variableResolver: IExtHostVariableResolverProvider, @IExtHostCommands commands: IExtHostCommands, + @IExtHostTesting testing: IExtHostTesting, ) { - super(extHostRpcService, workspaceService, extensionService, configurationService, editorTabs, variableResolver, commands); + super(extHostRpcService, workspaceService, extensionService, configurationService, editorTabs, variableResolver, commands, testing); } protected override createDebugAdapter(adapter: IAdapterDescriptor, session: ExtHostDebugSession): AbstractDebugAdapter | undefined { diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index d09eada1d2abb..c2ae65ed53939 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -51,6 +51,7 @@ import { ViewModel } from 'vs/workbench/contrib/debug/common/debugViewModel'; import { Debugger } from 'vs/workbench/contrib/debug/common/debugger'; import { DisassemblyViewInput } from 'vs/workbench/contrib/debug/common/disassemblyViewInput'; import { VIEWLET_ID as EXPLORER_VIEWLET_ID } from 'vs/workbench/contrib/files/common/files'; +import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -112,6 +113,7 @@ export class DebugService implements IDebugService { @IQuickInputService private readonly quickInputService: IQuickInputService, @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + @ITestService private readonly testService: ITestService, ) { this.breakpointsToSendOnResourceSaved = new Set(); @@ -839,6 +841,21 @@ export class DebugService implements IDebugService { } }; + // For debug sessions spawned by test runs, cancel the test run and stop + // the session, then start the test run again; tests have no notion of restarts. + if (session.correlatedTestRun) { + if (!session.correlatedTestRun.completedAt) { + this.testService.cancelTestRun(session.correlatedTestRun.id); + await Event.toPromise(session.correlatedTestRun.onComplete); + // todo@connor4312 is there any reason to wait for the debug session to + // terminate? I don't think so, test extension should already handle any + // state conflicts... + } + + this.testService.runResolvedTests(session.correlatedTestRun.request); + return; + } + if (session.capabilities.supportsRestartRequest) { const taskResult = await runTasks(); if (taskResult === TaskRunResult.Success) { diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index e2d54e9a29621..3a7ca50029eb2 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -42,6 +42,9 @@ import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/b import { getActiveWindow } from 'vs/base/browser/dom'; import { mainWindow } from 'vs/base/browser/window'; import { isDefined } from 'vs/base/common/types'; +import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; +import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; +import { LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; const TRIGGERED_BREAKPOINT_MAX_DELAY = 1500; @@ -66,6 +69,11 @@ export class DebugSession implements IDebugSession, IDisposable { private stoppedDetails: IRawStoppedDetails[] = []; private readonly statusQueue = this.rawListeners.add(new ThreadStatusScheduler()); + /** Test run this debug session was spawned by */ + public readonly correlatedTestRun?: LiveTestResult; + /** Whether we terminated the correlated run yet. Used so a 2nd terminate request goes through to the underlying session. */ + private didTerminateTestRun?: boolean; + private readonly _onDidChangeState = new Emitter(); private readonly _onDidEndAdapter = new Emitter(); @@ -106,7 +114,9 @@ export class DebugSession implements IDebugSession, IDisposable { @IInstantiationService private readonly instantiationService: IInstantiationService, @ICustomEndpointTelemetryService private readonly customEndpointTelemetryService: ICustomEndpointTelemetryService, @IWorkbenchEnvironmentService private readonly workbenchEnvironmentService: IWorkbenchEnvironmentService, - @ILogService private readonly logService: ILogService + @ILogService private readonly logService: ILogService, + @ITestService private readonly testService: ITestService, + @ITestResultService testResultService: ITestResultService, ) { this._options = options || {}; this.parentSession = this._options.parentSession; @@ -126,6 +136,16 @@ export class DebugSession implements IDebugSession, IDisposable { })); } + // Cast here, it's not possible to reference a hydrated result in this code path. + this.correlatedTestRun = options?.testRun + ? (testResultService.getResult(options.testRun.runId) as LiveTestResult) + : this.parentSession?.correlatedTestRun; + + if (this.correlatedTestRun) { + // Listen to the test completing because the user might have taken the cancel action rather than stopping the session. + toDispose.add(this.correlatedTestRun.onComplete(() => this.terminate())); + } + const compoundRoot = this._options.compoundRoot; if (compoundRoot) { toDispose.add(compoundRoot.onDidSessionStop(() => this.terminate())); @@ -387,6 +407,9 @@ export class DebugSession implements IDebugSession, IDisposable { this.cancelAllRequests(); if (this._options.lifecycleManagedByParent && this.parentSession) { await this.parentSession.terminate(restart); + } else if (this.correlatedTestRun && !this.correlatedTestRun.completedAt && !this.didTerminateTestRun) { + this.didTerminateTestRun = true; + this.testService.cancelTestRun(this.correlatedTestRun.id); } else if (this.raw) { if (this.raw.capabilities.supportsTerminateRequest && this._configuration.resolved.request === 'launch') { await this.raw.terminate(restart); diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index e48607b9edab5..a6bf29d33e29f 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -27,6 +27,7 @@ import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompou import { IDataBreakpointOptions, IFunctionBreakpointOptions, IInstructionBreakpointOptions } from 'vs/workbench/contrib/debug/common/debugModel'; import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { ITaskIdentifier } from 'vs/workbench/contrib/tasks/common/tasks'; +import { LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; export const VIEWLET_ID = 'workbench.view.debug'; @@ -219,6 +220,11 @@ export interface LoadedSourceEvent { export type IDebugSessionReplMode = 'separate' | 'mergeWithParent'; +export interface IDebugTestRunReference { + runId: string; + taskId: string; +} + export interface IDebugSessionOptions { noDebug?: boolean; parentSession?: IDebugSession; @@ -231,6 +237,11 @@ export interface IDebugSessionOptions { suppressDebugToolbar?: boolean; suppressDebugStatusbar?: boolean; suppressDebugView?: boolean; + /** + * Set if the debug session is correlated with a test run. Stopping/restarting + * the session will instead stop/restart the test run. + */ + testRun?: IDebugTestRunReference; } export interface IDataBreakpointInfoResponse { @@ -353,6 +364,8 @@ export interface IDebugSession extends ITreeElement { readonly suppressDebugStatusbar: boolean; readonly suppressDebugView: boolean; readonly lifecycleManagedByParent: boolean; + /** Test run this debug session was spawned by */ + readonly correlatedTestRun?: LiveTestResult; setSubId(subId: string | undefined): void; diff --git a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts index 08c7f9096d8f9..e4473594e4ce5 100644 --- a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts @@ -41,7 +41,7 @@ export function createTestSession(model: DebugModel, name = 'mockSession', optio } }; } - } as IDebugService, undefined!, undefined!, new TestConfigurationService({ debug: { console: { collapseIdenticalLines: true } } }), undefined!, mockWorkspaceContextService, undefined!, undefined!, undefined!, mockUriIdentityService, new TestInstantiationService(), undefined!, undefined!, new NullLogService()); + } as IDebugService, undefined!, undefined!, new TestConfigurationService({ debug: { console: { collapseIdenticalLines: true } } }), undefined!, mockWorkspaceContextService, undefined!, undefined!, undefined!, mockUriIdentityService, new TestInstantiationService(), undefined!, undefined!, new NullLogService(), undefined!, undefined!); } function createTwoStackFrames(session: DebugSession): { firstStackFrame: StackFrame; secondStackFrame: StackFrame } { @@ -445,7 +445,7 @@ suite('Debug - CallStack', () => { override get state(): State { return State.Stopped; } - }(generateUuid(), { resolved: { name: 'stoppedSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, mockWorkspaceContextService, undefined!, undefined!, undefined!, mockUriIdentityService, new TestInstantiationService(), undefined!, undefined!, new NullLogService()); + }(generateUuid(), { resolved: { name: 'stoppedSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, mockWorkspaceContextService, undefined!, undefined!, undefined!, mockUriIdentityService, new TestInstantiationService(), undefined!, undefined!, new NullLogService(), undefined!, undefined!); disposables.add(session); const runningSession = createTestSession(model); diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 87f6b82ce86e6..a245c39d11df7 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -118,6 +118,7 @@ export const allApiProposals = Object.freeze({ terminalSelection: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalSelection.d.ts', terminalShellIntegration: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts', testObserver: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testObserver.d.ts', + testRunInDebug: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts', textSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts', timeline: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.timeline.d.ts', tokenInformation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tokenInformation.d.ts', diff --git a/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts b/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts new file mode 100644 index 0000000000000..8eb273e2a5e38 --- /dev/null +++ b/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // https://github.com/microsoft/vscode/issues/214486 + + export interface DebugSessionOptions { + /** + * Signals to the editor that the debug session was started from a test run + * request. This is used to link the lifecycle of the debug session and + * test run in UI actions. + */ + testRun?: TestRun; + } +} From 6e6d38007e3c76ac7686c97502d9c6deefe44b7a Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 7 Jun 2024 13:16:32 +0900 Subject: [PATCH 148/755] fix: force software gl backend for snap (#214548) Refs https://github.com/microsoft/vscode/issues/212494 When using the default ANGLE gl/gles backend, v1.90 attempts to get display refresh rate for vsync from an internal implementation instead of using the gl extension EGL_CHROMIUM_sync_control, this eventually ends up loading display info from XRandr and chromium attempts to set a label for the data from the shipped resource pak file that is not accessible to the gpu process triggering a SIGTRAP in ui::ResourceBundle::GetSharedInstance. --- resources/linux/snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/linux/snap/snapcraft.yaml b/resources/linux/snap/snapcraft.yaml index b7b93f4c59c5f..0bc9df8211e92 100644 --- a/resources/linux/snap/snapcraft.yaml +++ b/resources/linux/snap/snapcraft.yaml @@ -74,8 +74,8 @@ parts: apps: @@NAME@@: - command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --no-sandbox + command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --no-sandbox --use-gl=angle --use-angle=swiftshader common-id: @@NAME@@.desktop url-handler: - command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --open-url --no-sandbox + command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --open-url --no-sandbox --use-gl=angle --use-angle=swiftshader From 6facfe23b300eb448c35d07291cad7ad98625302 Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 7 Jun 2024 16:45:12 +0900 Subject: [PATCH 149/755] fix: snap packaging for argument parsing (#214560) --- resources/linux/snap/electron-launch | 2 +- resources/linux/snap/snapcraft.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/linux/snap/electron-launch b/resources/linux/snap/electron-launch index 873b079161a45..ea82e60bd6c3d 100755 --- a/resources/linux/snap/electron-launch +++ b/resources/linux/snap/electron-launch @@ -261,4 +261,4 @@ fi wait_for_async_execs -exec "$@" +exec "$@" "--no-sandbox" "--use-gl=angle" "--use-angle=swiftshader" diff --git a/resources/linux/snap/snapcraft.yaml b/resources/linux/snap/snapcraft.yaml index 0bc9df8211e92..5d4df3f52f3f6 100644 --- a/resources/linux/snap/snapcraft.yaml +++ b/resources/linux/snap/snapcraft.yaml @@ -74,8 +74,8 @@ parts: apps: @@NAME@@: - command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --no-sandbox --use-gl=angle --use-angle=swiftshader + command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ common-id: @@NAME@@.desktop url-handler: - command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --open-url --no-sandbox --use-gl=angle --use-angle=swiftshader + command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --open-url From 6125cc2332d2d21805f1887c7b944a81ffce423e Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Fri, 7 Jun 2024 11:38:41 +0200 Subject: [PATCH 150/755] Extracting the rendered hover data into separate class (#214419) * adding some code * polishing code * polishing the code * polishing the code * polishing and moving to a new file * adding e * polishing the code * polishing the code * passing in directly the hover result * removing the highlight range --- .../hover/browser/contentHoverController.ts | 148 ++------------ .../hover/browser/contentHoverRendered.ts | 193 ++++++++++++++++++ .../hover/browser/contentHoverTypes.ts | 20 -- .../hover/browser/contentHoverWidget.ts | 79 ++++--- .../contrib/hover/browser/hoverTypes.ts | 21 +- .../hover/test/browser/contentHover.test.ts | 12 +- 6 files changed, 266 insertions(+), 207 deletions(-) create mode 100644 src/vs/editor/contrib/hover/browser/contentHoverRendered.ts diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index ea1a948a12937..7f49ad50a417f 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -5,15 +5,13 @@ import * as dom from 'vs/base/browser/dom'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { TokenizationRegistry } from 'vs/editor/common/languages'; import { HoverOperation, HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; -import { HoverAnchor, HoverParticipantRegistry, HoverRangeAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverParticipantRegistry, HoverRangeAnchor, IEditorHoverContext, IEditorHoverParticipant, IHoverPart, IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; @@ -21,10 +19,10 @@ import { InlayHintsHover } from 'vs/editor/contrib/inlayHints/browser/inlayHints import { HoverVerbosityAction } from 'vs/editor/common/standalone/standaloneEnums'; import { ContentHoverWidget } from 'vs/editor/contrib/hover/browser/contentHoverWidget'; import { ContentHoverComputer } from 'vs/editor/contrib/hover/browser/contentHoverComputer'; -import { ContentHoverVisibleData, HoverResult } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; -import { EditorHoverStatusBar } from 'vs/editor/contrib/hover/browser/contentHoverStatusBar'; +import { HoverResult } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; import { Emitter } from 'vs/base/common/event'; import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/colorHoverParticipant'; +import { RenderedContentHover } from 'vs/editor/contrib/hover/browser/contentHoverRendered'; export class ContentHoverController extends Disposable implements IHoverWidget { @@ -177,9 +175,9 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } this._currentResult = currentHoverResult; if (this._currentResult) { - this._showHover(this._currentResult.anchor, this._currentResult.hoverParts); + this._showHover(this._currentResult); } else { - this._contentHoverWidget.hide(); + this._hideHover(); } } @@ -221,18 +219,21 @@ export class ContentHoverController extends Disposable implements IHoverWidget { this._setCurrentResult(hoverResult); } - private _showHover(anchor: HoverAnchor, hoverParts: IHoverPart[]): void { - const fragment = document.createDocumentFragment(); - const disposables = this._renderHoverPartsInFragment(fragment, hoverParts); - const fragmentHasContent = fragment.hasChildNodes(); - if (fragmentHasContent) { - this._doShowHover(fragment, hoverParts, anchor, disposables); + private _showHover(hoverResult: HoverResult): void { + const context = this._getHoverContext(); + const renderedHover = new RenderedContentHover(this._editor, hoverResult, this._participants, this._computer, context, this._keybindingService); + if (renderedHover.domNodeHasChildren) { + this._contentHoverWidget.show(renderedHover); } else { - disposables.dispose(); + renderedHover.dispose(); } } - private _getHoverContext(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): IEditorHoverRenderContext { + private _hideHover(): void { + this._contentHoverWidget.hide(); + } + + private _getHoverContext(): IEditorHoverContext { const hide = () => { this.hide(); }; @@ -243,122 +244,9 @@ export class ContentHoverController extends Disposable implements IHoverWidget { const setMinimumDimensions = (dimensions: dom.Dimension) => { this._contentHoverWidget.setMinimumDimensions(dimensions); }; - const context: IEditorHoverRenderContext = { fragment, statusBar, hide, onContentsChanged, setMinimumDimensions }; - return context; - } - - private _renderHoverPartsInFragment(fragment: DocumentFragment, hoverParts: IHoverPart[]): DisposableStore { - const disposables = new DisposableStore(); - const statusBar = new EditorHoverStatusBar(this._keybindingService); - const context = this._getHoverContext(fragment, statusBar); - disposables.add(this._renderHoverPartsUsingContext(context, hoverParts)); - disposables.add(this._renderStatusBar(fragment, statusBar)); - return disposables; - } - - private _renderHoverPartsUsingContext(context: IEditorHoverRenderContext, hoverParts: IHoverPart[]): IDisposable { - const disposables = new DisposableStore(); - for (const participant of this._participants) { - const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant); - const hasHoverPartsForParticipant = hoverPartsForParticipant.length > 0; - if (!hasHoverPartsForParticipant) { - continue; - } - disposables.add(participant.renderHoverParts(context, hoverPartsForParticipant)); - } - return disposables; + return { hide, onContentsChanged, setMinimumDimensions }; } - private _renderStatusBar(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): IDisposable { - if (!statusBar.hasContent) { - return Disposable.None; - } - fragment.appendChild(statusBar.hoverElement); - return statusBar; - } - - private _doShowHover(fragment: DocumentFragment, hoverParts: IHoverPart[], anchor: HoverAnchor, disposables: DisposableStore): void { - const { showAtPosition, showAtSecondaryPosition, highlightRange } = ContentHoverController.computeHoverRanges(this._editor, anchor.range, hoverParts); - this._addEditorDecorations(highlightRange, disposables); - const initialMousePosX = anchor.initialMousePosX; - const initialMousePosY = anchor.initialMousePosY; - const preferAbove = this._editor.getOption(EditorOption.hover).above; - const stoleFocus = this._computer.shouldFocus; - const hoverSource = this._computer.source; - const isBeforeContent = hoverParts.some(m => m.isBeforeContent); - - const contentHoverVisibleData = new ContentHoverVisibleData( - initialMousePosX, - initialMousePosY, - showAtPosition, - showAtSecondaryPosition, - preferAbove, - stoleFocus, - hoverSource, - isBeforeContent, - disposables - ); - this._contentHoverWidget.showAt(fragment, contentHoverVisibleData); - } - - private _addEditorDecorations(highlightRange: Range | undefined, disposables: DisposableStore) { - if (!highlightRange) { - return; - } - const highlightDecoration = this._editor.createDecorationsCollection(); - highlightDecoration.set([{ - range: highlightRange, - options: ContentHoverController._DECORATION_OPTIONS - }]); - disposables.add(toDisposable(() => { - highlightDecoration.clear(); - })); - } - - private static readonly _DECORATION_OPTIONS = ModelDecorationOptions.register({ - description: 'content-hover-highlight', - className: 'hoverHighlight' - }); - - public static computeHoverRanges(editor: ICodeEditor, anchorRange: Range, hoverParts: IHoverPart[]) { - - let startColumnBoundary = 1; - if (editor.hasModel()) { - // Ensure the range is on the current view line - const viewModel = editor._getViewModel(); - const coordinatesConverter = viewModel.coordinatesConverter; - const anchorViewRange = coordinatesConverter.convertModelRangeToViewRange(anchorRange); - const anchorViewRangeStart = new Position(anchorViewRange.startLineNumber, viewModel.getLineMinColumn(anchorViewRange.startLineNumber)); - startColumnBoundary = coordinatesConverter.convertViewPositionToModelPosition(anchorViewRangeStart).column; - } - - // The anchor range is always on a single line - const anchorLineNumber = anchorRange.startLineNumber; - let renderStartColumn = anchorRange.startColumn; - let highlightRange = hoverParts[0].range; - let forceShowAtRange = null; - - for (const hoverPart of hoverParts) { - highlightRange = Range.plusRange(highlightRange, hoverPart.range); - const hoverRangeIsWithinAnchorLine = hoverPart.range.startLineNumber === anchorLineNumber && hoverPart.range.endLineNumber === anchorLineNumber; - if (hoverRangeIsWithinAnchorLine) { - // this message has a range that is completely sitting on the line of the anchor - renderStartColumn = Math.max(Math.min(renderStartColumn, hoverPart.range.startColumn), startColumnBoundary); - } - if (hoverPart.forceShowAtRange) { - forceShowAtRange = hoverPart.range; - } - } - - const showAtPosition = forceShowAtRange ? forceShowAtRange.getStartPosition() : new Position(anchorLineNumber, anchorRange.startColumn); - const showAtSecondaryPosition = forceShowAtRange ? forceShowAtRange.getStartPosition() : new Position(anchorLineNumber, renderStartColumn); - - return { - showAtPosition, - showAtSecondaryPosition, - highlightRange - }; - } public showsOrWillShow(mouseEvent: IEditorMouseEvent): boolean { const isContentWidgetResizing = this._contentHoverWidget.isResizing; diff --git a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts new file mode 100644 index 0000000000000..5d9c6f52c8c21 --- /dev/null +++ b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts @@ -0,0 +1,193 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IEditorHoverContext, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { ContentHoverComputer } from 'vs/editor/contrib/hover/browser/contentHoverComputer'; +import { EditorHoverStatusBar } from 'vs/editor/contrib/hover/browser/contentHoverStatusBar'; +import { HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { Position } from 'vs/editor/common/core/position'; +import { Range } from 'vs/editor/common/core/range'; +import { HoverResult } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; + +export class RenderedContentHover extends Disposable { + + public closestMouseDistance: number | undefined; + public initialMousePosX: number | undefined; + public initialMousePosY: number | undefined; + + public readonly showAtPosition: Position; + public readonly showAtSecondaryPosition: Position; + public readonly shouldFocus: boolean; + public readonly source: HoverStartSource; + public readonly shouldAppearBeforeContent: boolean; + + private readonly _renderedHoverParts: RenderedContentHoverParts; + + constructor( + editor: ICodeEditor, + hoverResult: HoverResult, + participants: IEditorHoverParticipant[], + computer: ContentHoverComputer, + context: IEditorHoverContext, + keybindingService: IKeybindingService + ) { + super(); + const anchor = hoverResult.anchor; + const parts = hoverResult.hoverParts; + this._renderedHoverParts = this._register(new RenderedContentHoverParts( + editor, + participants, + parts, + context, + keybindingService + )); + const { showAtPosition, showAtSecondaryPosition } = RenderedContentHover.computeHoverPositions(editor, anchor.range, parts); + this.shouldAppearBeforeContent = parts.some(m => m.isBeforeContent); + this.showAtPosition = showAtPosition; + this.showAtSecondaryPosition = showAtSecondaryPosition; + this.initialMousePosX = anchor.initialMousePosX; + this.initialMousePosY = anchor.initialMousePosY; + this.shouldFocus = computer.shouldFocus; + this.source = computer.source; + } + + public get domNode(): DocumentFragment { + return this._renderedHoverParts.domNode; + } + + public get domNodeHasChildren(): boolean { + return this._renderedHoverParts.domNodeHasChildren; + } + + public static computeHoverPositions(editor: ICodeEditor, anchorRange: Range, hoverParts: IHoverPart[]): { showAtPosition: Position; showAtSecondaryPosition: Position } { + + let startColumnBoundary = 1; + if (editor.hasModel()) { + // Ensure the range is on the current view line + const viewModel = editor._getViewModel(); + const coordinatesConverter = viewModel.coordinatesConverter; + const anchorViewRange = coordinatesConverter.convertModelRangeToViewRange(anchorRange); + const anchorViewMinColumn = viewModel.getLineMinColumn(anchorViewRange.startLineNumber); + const anchorViewRangeStart = new Position(anchorViewRange.startLineNumber, anchorViewMinColumn); + startColumnBoundary = coordinatesConverter.convertViewPositionToModelPosition(anchorViewRangeStart).column; + } + + // The anchor range is always on a single line + const anchorStartLineNumber = anchorRange.startLineNumber; + let secondaryPositionColumn = anchorRange.startColumn; + let forceShowAtRange: Range | undefined; + + for (const hoverPart of hoverParts) { + const hoverPartRange = hoverPart.range; + const hoverPartRangeOnAnchorStartLine = hoverPartRange.startLineNumber === anchorStartLineNumber; + const hoverPartRangeOnAnchorEndLine = hoverPartRange.endLineNumber === anchorStartLineNumber; + const hoverPartRangeIsOnAnchorLine = hoverPartRangeOnAnchorStartLine && hoverPartRangeOnAnchorEndLine; + if (hoverPartRangeIsOnAnchorLine) { + // this message has a range that is completely sitting on the line of the anchor + const hoverPartStartColumn = hoverPartRange.startColumn; + const minSecondaryPositionColumn = Math.min(secondaryPositionColumn, hoverPartStartColumn); + secondaryPositionColumn = Math.max(minSecondaryPositionColumn, startColumnBoundary); + } + if (hoverPart.forceShowAtRange) { + forceShowAtRange = hoverPartRange; + } + } + + let showAtPosition: Position; + let showAtSecondaryPosition: Position; + if (forceShowAtRange) { + const forceShowAtPosition = forceShowAtRange.getStartPosition(); + showAtPosition = forceShowAtPosition; + showAtSecondaryPosition = forceShowAtPosition; + } else { + showAtPosition = anchorRange.getStartPosition(); + showAtSecondaryPosition = new Position(anchorStartLineNumber, secondaryPositionColumn); + } + return { + showAtPosition, + showAtSecondaryPosition, + }; + } +} + +class RenderedContentHoverParts extends Disposable { + + private static readonly _DECORATION_OPTIONS = ModelDecorationOptions.register({ + description: 'content-hover-highlight', + className: 'hoverHighlight' + }); + + private readonly _participants: IEditorHoverParticipant[]; + private readonly _fragment: DocumentFragment; + + constructor( + editor: ICodeEditor, + participants: IEditorHoverParticipant[], + hoverParts: IHoverPart[], + context: IEditorHoverContext, + keybindingService: IKeybindingService + ) { + super(); + this._participants = participants; + this._fragment = document.createDocumentFragment(); + const statusBar = new EditorHoverStatusBar(keybindingService); + const hoverContext: IEditorHoverRenderContext = { fragment: this._fragment, statusBar, ...context }; + this._register(this._renderHoverParts(hoverContext, hoverParts)); + this._register(this._renderStatusBar(this._fragment, statusBar)); + this._register(this._addEditorDecorations(editor, hoverParts)); + } + + private _addEditorDecorations(editor: ICodeEditor, hoverParts: IHoverPart[]): IDisposable { + if (hoverParts.length === 0) { + return Disposable.None; + } + let highlightRange = hoverParts[0].range; + for (const hoverPart of hoverParts) { + const hoverPartRange = hoverPart.range; + highlightRange = Range.plusRange(highlightRange, hoverPartRange); + } + const highlightDecoration = editor.createDecorationsCollection(); + highlightDecoration.set([{ + range: highlightRange, + options: RenderedContentHoverParts._DECORATION_OPTIONS + }]); + return toDisposable(() => { + highlightDecoration.clear(); + }); + } + + private _renderHoverParts(context: IEditorHoverRenderContext, hoverParts: IHoverPart[]): IDisposable { + const disposables = new DisposableStore(); + for (const participant of this._participants) { + const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant); + const hasHoverPartsForParticipant = hoverPartsForParticipant.length > 0; + if (!hasHoverPartsForParticipant) { + continue; + } + disposables.add(participant.renderHoverParts(context, hoverPartsForParticipant)); + } + return disposables; + } + + private _renderStatusBar(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): IDisposable { + if (!statusBar.hasContent) { + return Disposable.None; + } + fragment.appendChild(statusBar.hoverElement); + return statusBar; + } + + public get domNode(): DocumentFragment { + return this._fragment; + } + + public get domNodeHasChildren(): boolean { + return this._fragment.hasChildNodes(); + } +} diff --git a/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts b/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts index 86172b774be59..a52d758baa72f 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverTypes.ts @@ -3,9 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { Position } from 'vs/editor/common/core/position'; -import { HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; import { HoverAnchor, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; export class HoverResult { @@ -40,20 +37,3 @@ export class FilteredHoverResult extends HoverResult { return this.original.filter(anchor); } } - -export class ContentHoverVisibleData { - - public closestMouseDistance: number | undefined = undefined; - - constructor( - public initialMousePosX: number | undefined, - public initialMousePosY: number | undefined, - public readonly showAtPosition: Position, - public readonly showAtSecondaryPosition: Position, - public readonly preferAbove: boolean, - public readonly stoleFocus: boolean, - public readonly source: HoverStartSource, - public readonly isBeforeContent: boolean, - public readonly disposables: DisposableStore - ) { } -} diff --git a/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts b/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts index 75b4b1d41b928..37cf8740e3721 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts @@ -15,8 +15,8 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { getHoverAccessibleViewHint, HoverWidget } from 'vs/base/browser/ui/hover/hoverWidget'; import { PositionAffinity } from 'vs/editor/common/model'; -import { ContentHoverVisibleData } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; import { Emitter } from 'vs/base/common/event'; +import { RenderedContentHover } from 'vs/editor/contrib/hover/browser/contentHoverRendered'; const HORIZONTAL_SCROLLING_BY = 30; const CONTAINER_HEIGHT_PADDING = 6; @@ -26,7 +26,7 @@ export class ContentHoverWidget extends ResizableContentWidget { public static ID = 'editor.contrib.resizableContentHoverWidget'; private static _lastDimensions: dom.Dimension = new dom.Dimension(0, 0); - private _visibleData: ContentHoverVisibleData | undefined; + private _renderedHover: RenderedContentHover | undefined; private _positionPreference: ContentWidgetPositionPreference | undefined; private _minimumSize: dom.Dimension; private _contentWidth: number | undefined; @@ -39,7 +39,7 @@ export class ContentHoverWidget extends ResizableContentWidget { public readonly onDidResize = this._onDidResize.event; public get isVisibleFromKeyboard(): boolean { - return (this._visibleData?.source === HoverStartSource.Keyboard); + return (this._renderedHover?.source === HoverStartSource.Keyboard); } public get isVisible(): boolean { @@ -86,13 +86,13 @@ export class ContentHoverWidget extends ResizableContentWidget { this._register(focusTracker.onDidBlur(() => { this._hoverFocusedKey.set(false); })); - this._setHoverData(undefined); + this._setRenderedHover(undefined); this._editor.addContentWidget(this); } public override dispose(): void { super.dispose(); - this._visibleData?.disposables.dispose(); + this._renderedHover?.dispose(); this._editor.removeContentWidget(this); } @@ -162,7 +162,7 @@ export class ContentHoverWidget extends ResizableContentWidget { } private _findAvailableSpaceVertically(): number | undefined { - const position = this._visibleData?.showAtPosition; + const position = this._renderedHover?.showAtPosition; if (!position) { return; } @@ -223,23 +223,20 @@ export class ContentHoverWidget extends ResizableContentWidget { public isMouseGettingCloser(posx: number, posy: number): boolean { - if (!this._visibleData) { + if (!this._renderedHover) { return false; } - if ( - typeof this._visibleData.initialMousePosX === 'undefined' - || typeof this._visibleData.initialMousePosY === 'undefined' - ) { - this._visibleData.initialMousePosX = posx; - this._visibleData.initialMousePosY = posy; + if (this._renderedHover.initialMousePosX === undefined || this._renderedHover.initialMousePosY === undefined) { + this._renderedHover.initialMousePosX = posx; + this._renderedHover.initialMousePosY = posy; return false; } const widgetRect = dom.getDomNodePagePosition(this.getDomNode()); - if (typeof this._visibleData.closestMouseDistance === 'undefined') { - this._visibleData.closestMouseDistance = computeDistanceFromPointToRectangle( - this._visibleData.initialMousePosX, - this._visibleData.initialMousePosY, + if (this._renderedHover.closestMouseDistance === undefined) { + this._renderedHover.closestMouseDistance = computeDistanceFromPointToRectangle( + this._renderedHover.initialMousePosX, + this._renderedHover.initialMousePosY, widgetRect.left, widgetRect.top, widgetRect.width, @@ -255,20 +252,20 @@ export class ContentHoverWidget extends ResizableContentWidget { widgetRect.width, widgetRect.height ); - if (distance > this._visibleData.closestMouseDistance + 4 /* tolerance of 4 pixels */) { + if (distance > this._renderedHover.closestMouseDistance + 4 /* tolerance of 4 pixels */) { // The mouse is getting farther away return false; } - this._visibleData.closestMouseDistance = Math.min(this._visibleData.closestMouseDistance, distance); + this._renderedHover.closestMouseDistance = Math.min(this._renderedHover.closestMouseDistance, distance); return true; } - private _setHoverData(hoverData: ContentHoverVisibleData | undefined): void { - this._visibleData?.disposables.dispose(); - this._visibleData = hoverData; - this._hoverVisibleKey.set(!!hoverData); - this._hover.containerDomNode.classList.toggle('hidden', !hoverData); + private _setRenderedHover(renderedHover: RenderedContentHover | undefined): void { + this._renderedHover?.dispose(); + this._renderedHover = renderedHover; + this._hoverVisibleKey.set(!!renderedHover); + this._hover.containerDomNode.classList.toggle('hidden', !renderedHover); } private _updateFont(): void { @@ -298,10 +295,10 @@ export class ContentHoverWidget extends ResizableContentWidget { this._setHoverWidgetMaxDimensions(width, height); } - private _render(node: DocumentFragment, hoverData: ContentHoverVisibleData) { - this._setHoverData(hoverData); + private _render(renderedHover: RenderedContentHover) { + this._setRenderedHover(renderedHover); this._updateFont(); - this._updateContent(node); + this._updateContent(renderedHover.domNode); this._updateMaxDimensions(); this.onContentsChanged(); // Simply force a synchronous render on the editor @@ -310,30 +307,30 @@ export class ContentHoverWidget extends ResizableContentWidget { } override getPosition(): IContentWidgetPosition | null { - if (!this._visibleData) { + if (!this._renderedHover) { return null; } return { - position: this._visibleData.showAtPosition, - secondaryPosition: this._visibleData.showAtSecondaryPosition, - positionAffinity: this._visibleData.isBeforeContent ? PositionAffinity.LeftOfInjectedText : undefined, + position: this._renderedHover.showAtPosition, + secondaryPosition: this._renderedHover.showAtSecondaryPosition, + positionAffinity: this._renderedHover.shouldAppearBeforeContent ? PositionAffinity.LeftOfInjectedText : undefined, preference: [this._positionPreference ?? ContentWidgetPositionPreference.ABOVE] }; } - public showAt(node: DocumentFragment, hoverData: ContentHoverVisibleData): void { + public show(renderedHover: RenderedContentHover): void { if (!this._editor || !this._editor.hasModel()) { return; } - this._render(node, hoverData); + this._render(renderedHover); const widgetHeight = dom.getTotalHeight(this._hover.containerDomNode); - const widgetPosition = hoverData.showAtPosition; + const widgetPosition = renderedHover.showAtPosition; this._positionPreference = this._findPositionPreference(widgetHeight, widgetPosition) ?? ContentWidgetPositionPreference.ABOVE; // See https://github.com/microsoft/vscode/issues/140339 // TODO: Doing a second layout of the hover after force rendering the editor this.onContentsChanged(); - if (hoverData.stoleFocus) { + if (renderedHover.shouldFocus) { this._hover.containerDomNode.focus(); } this._onDidResize.fire(); @@ -350,16 +347,16 @@ export class ContentHoverWidget extends ResizableContentWidget { } public hide(): void { - if (!this._visibleData) { + if (!this._renderedHover) { return; } - const stoleFocus = this._visibleData.stoleFocus || this._hoverFocusedKey.get(); - this._setHoverData(undefined); + const hoverStoleFocus = this._renderedHover.shouldFocus || this._hoverFocusedKey.get(); + this._setRenderedHover(undefined); this._resizableNode.maxSize = new dom.Dimension(Infinity, Infinity); this._resizableNode.clearSashHoverState(); this._hoverFocusedKey.set(false); this._editor.layoutContentWidget(this); - if (stoleFocus) { + if (hoverStoleFocus) { this._editor.focus(); } } @@ -406,9 +403,9 @@ export class ContentHoverWidget extends ResizableContentWidget { this._updateMinimumWidth(); this._resizableNode.layout(height, width); - if (this._visibleData?.showAtPosition) { + if (this._renderedHover?.showAtPosition) { const widgetHeight = dom.getTotalHeight(this._hover.containerDomNode); - this._positionPreference = this._findPositionPreference(widgetHeight, this._visibleData.showAtPosition); + this._positionPreference = this._findPositionPreference(widgetHeight, this._renderedHover.showAtPosition); } this._layoutContentWidget(); } diff --git a/src/vs/editor/contrib/hover/browser/hoverTypes.ts b/src/vs/editor/contrib/hover/browser/hoverTypes.ts index c24cb04f7fe69..0caaba7f03020 100644 --- a/src/vs/editor/contrib/hover/browser/hoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/hoverTypes.ts @@ -94,15 +94,7 @@ export interface IEditorHoverColorPickerWidget { layout(): void; } -export interface IEditorHoverRenderContext { - /** - * The fragment where dom elements should be attached. - */ - readonly fragment: DocumentFragment; - /** - * The status bar for actions for this hover. - */ - readonly statusBar: IEditorHoverStatusBar; +export interface IEditorHoverContext { /** * The contents rendered inside the fragment have been changed, which means that the hover should relayout. */ @@ -117,6 +109,17 @@ export interface IEditorHoverRenderContext { hide(): void; } +export interface IEditorHoverRenderContext extends IEditorHoverContext { + /** + * The fragment where dom elements should be attached. + */ + readonly fragment: DocumentFragment; + /** + * The status bar for actions for this hover. + */ + readonly statusBar: IEditorHoverStatusBar; +} + export interface IEditorHoverParticipant { readonly hoverOrdinal: number; suggestHoverAnchor?(mouseEvent: IEditorMouseEvent): HoverAnchor | null; diff --git a/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts b/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts index 2ff019e7d9da3..65762f5905b41 100644 --- a/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts +++ b/src/vs/editor/contrib/hover/test/browser/contentHover.test.ts @@ -7,7 +7,7 @@ import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ContentHoverController } from 'vs/editor/contrib/hover/browser/contentHoverController'; +import { RenderedContentHover } from 'vs/editor/contrib/hover/browser/contentHoverRendered'; import { IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { TestCodeEditorInstantiationOptions, withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; @@ -18,7 +18,7 @@ suite('Content Hover', () => { test('issue #151235: Gitlens hover shows up in the wrong place', () => { const text = 'just some text'; withTestCodeEditor(text, {}, (editor) => { - const actual = ContentHoverController.computeHoverRanges( + const actual = RenderedContentHover.computeHoverPositions( editor, new Range(5, 5, 5, 5), [{ range: new Range(4, 1, 5, 6) }] @@ -27,8 +27,7 @@ suite('Content Hover', () => { actual, { showAtPosition: new Position(5, 5), - showAtSecondaryPosition: new Position(5, 5), - highlightRange: new Range(4, 1, 5, 6) + showAtSecondaryPosition: new Position(5, 5) } ); }); @@ -38,7 +37,7 @@ suite('Content Hover', () => { const text = 'just some text'; const opts: TestCodeEditorInstantiationOptions = { wordWrap: 'wordWrapColumn', wordWrapColumn: 6 }; withTestCodeEditor(text, opts, (editor) => { - const actual = ContentHoverController.computeHoverRanges( + const actual = RenderedContentHover.computeHoverPositions( editor, new Range(1, 8, 1, 8), [{ range: new Range(1, 1, 1, 15) }] @@ -47,8 +46,7 @@ suite('Content Hover', () => { actual, { showAtPosition: new Position(1, 8), - showAtSecondaryPosition: new Position(1, 6), - highlightRange: new Range(1, 1, 1, 15) + showAtSecondaryPosition: new Position(1, 6) } ); }); From af5696c630c9b1a979d2496d4f995e4ccf421eb7 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:21:28 +0200 Subject: [PATCH 151/755] SCM - enable clearing the commit input using Escape (#214583) --- .../contrib/scm/browser/scm.contribution.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index c60907964f07a..203a7693ddcce 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -386,6 +386,22 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ } }); +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'scm.clearInput', + weight: KeybindingWeight.WorkbenchContrib, + when: ContextKeyExpr.has('scmRepository'), + primary: KeyCode.Escape, + handler: async (accessor) => { + const scmService = accessor.get(ISCMService); + const contextKeyService = accessor.get(IContextKeyService); + + const context = contextKeyService.getContext(getActiveElement()); + const repositoryId = context.getValue('scmRepository'); + const repository = repositoryId ? scmService.getRepository(repositoryId) : undefined; + repository?.input.setValue('', true); + } +}); + const viewNextCommitCommand = { description: { description: localize('scm view next commit', "Source Control: View Next Commit"), args: [] }, weight: KeybindingWeight.WorkbenchContrib, From 8c82ca149cd36c6a269ed3d765b7791bded87334 Mon Sep 17 00:00:00 2001 From: Ole Date: Fri, 7 Jun 2024 13:50:01 +0200 Subject: [PATCH 152/755] Fix leaking comment thread when CellComment is reused. Fixes #214585. --- .../comments/browser/commentThreadHeader.ts | 3 +- .../comments/browser/commentThreadWidget.ts | 3 +- .../browser/view/cellParts/cellComments.ts | 74 +++++++++---------- test/automation/package.json | 4 +- 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadHeader.ts b/src/vs/workbench/contrib/comments/browser/commentThreadHeader.ts index 2849c9afd765f..8333654958e64 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadHeader.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadHeader.ts @@ -7,7 +7,7 @@ import * as dom from 'vs/base/browser/dom'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action, ActionRunner } from 'vs/base/common/actions'; import { Codicon } from 'vs/base/common/codicons'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import * as strings from 'vs/base/common/strings'; import * as languages from 'vs/editor/common/languages'; import { IRange } from 'vs/editor/common/core/range'; @@ -46,6 +46,7 @@ export class CommentThreadHeader extends Disposable { super(); this._headElement = dom.$('.head'); container.appendChild(this._headElement); + this._register(toDisposable(() => this._headElement.remove())); this._fillHead(); } diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index a919fe262a9d5..521455bb77a5a 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/review'; import * as dom from 'vs/base/browser/dom'; import { Emitter } from 'vs/base/common/event'; -import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import * as languages from 'vs/editor/common/languages'; import { IMarkdownRendererOptions } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; @@ -104,6 +104,7 @@ export class CommentThreadWidget extends const bodyElement = dom.$('.body'); container.appendChild(bodyElement); + this._register(toDisposable(() => bodyElement.remove())); const tracker = this._register(dom.trackFocus(bodyElement)); this._register(registerNavigableContainer({ diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index b8ccbf07abf01..7e4ad29842b4d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -20,10 +20,9 @@ import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; export class CellComments extends CellContentPart { - private _initialized: boolean = false; private _commentThreadWidget: CommentThreadWidget | null = null; private currentElement: CodeCellViewModel | undefined; - private readonly commentTheadDisposables = this._register(new DisposableStore()); + private readonly _commentThreadDisposables = this._register(new DisposableStore()); constructor( private readonly notebookEditor: INotebookEditorDelegate, @@ -45,21 +44,17 @@ export class CellComments extends CellContentPart { } private async initialize(element: ICellViewModel) { - if (this._initialized) { + if (this.currentElement === element) { return; } - this._initialized = true; - const info = await this._getCommentThreadForCell(element); - - if (info) { - await this._createCommentTheadWidget(info.owner, info.thread); - } + this.currentElement = element as CodeCellViewModel; + this._updateThread(); } private async _createCommentTheadWidget(owner: string, commentThread: languages.CommentThread) { this._commentThreadWidget?.dispose(); - this.commentTheadDisposables.clear(); + this._commentThreadDisposables.clear(); this._commentThreadWidget = this.instantiationService.createInstance( CommentThreadWidget, this.container, @@ -87,7 +82,7 @@ export class CellComments extends CellContentPart { await this._commentThreadWidget.display(layoutInfo.fontInfo.lineHeight, true); this._applyTheme(); - this.commentTheadDisposables.add(this._commentThreadWidget.onDidResize(() => { + this._commentThreadDisposables.add(this._commentThreadWidget.onDidResize(() => { if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget) { this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); } @@ -95,33 +90,38 @@ export class CellComments extends CellContentPart { } private _bindListeners() { - this.cellDisposables.add(this.commentService.onDidUpdateCommentThreads(async () => { - if (this.currentElement) { - const info = await this._getCommentThreadForCell(this.currentElement); - if (!this._commentThreadWidget && info) { - await this._createCommentTheadWidget(info.owner, info.thread); - const layoutInfo = (this.currentElement as CodeCellViewModel).layoutInfo; - this.container.style.top = `${layoutInfo.outputContainerOffset + layoutInfo.outputTotalHeight}px`; - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget!.getDimensions().height); - return; - } - - if (this._commentThreadWidget) { - if (!info) { - this._commentThreadWidget.dispose(); - this.currentElement.commentHeight = 0; - return; - } - if (this._commentThreadWidget.commentThread === info.thread) { - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); - return; - } - - await this._commentThreadWidget.updateCommentThread(info.thread); - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); - } + this.cellDisposables.add(this.commentService.onDidUpdateCommentThreads(async () => this._updateThread())); + } + + private async _updateThread() { + if (!this.currentElement) { + return; + } + const info = await this._getCommentThreadForCell(this.currentElement); + if (!this._commentThreadWidget && info) { + await this._createCommentTheadWidget(info.owner, info.thread); + const layoutInfo = (this.currentElement as CodeCellViewModel).layoutInfo; + this.container.style.top = `${layoutInfo.outputContainerOffset + layoutInfo.outputTotalHeight}px`; + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget!.getDimensions().height); + return; + } + + if (this._commentThreadWidget) { + if (!info) { + this._commentThreadDisposables.clear(); + this._commentThreadWidget.dispose(); + this._commentThreadWidget = null; + this.currentElement.commentHeight = 0; + return; } - })); + if (this._commentThreadWidget.commentThread === info.thread) { + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); + return; + } + + await this._commentThreadWidget.updateCommentThread(info.thread); + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); + } } private _calculateCommentThreadHeight(bodyHeight: number) { diff --git a/test/automation/package.json b/test/automation/package.json index b9dbbec4bb81a..8172250a9a397 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -1,6 +1,6 @@ { "name": "vscode-automation", - "version": "1.71.0", + "version": "1.91.0", "description": "VS Code UI automation driver", "author": { "name": "Microsoft Corporation" @@ -33,4 +33,4 @@ "npm-run-all": "^4.1.5", "watch": "^1.0.2" } -} +} \ No newline at end of file From f68fa7e09f252a6121d110bdd0664a7f4e64e1ad Mon Sep 17 00:00:00 2001 From: Ole Date: Fri, 7 Jun 2024 14:01:44 +0200 Subject: [PATCH 153/755] Undo accidental change in test/automation/package.json. --- test/automation/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/automation/package.json b/test/automation/package.json index 8172250a9a397..b9dbbec4bb81a 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -1,6 +1,6 @@ { "name": "vscode-automation", - "version": "1.91.0", + "version": "1.71.0", "description": "VS Code UI automation driver", "author": { "name": "Microsoft Corporation" @@ -33,4 +33,4 @@ "npm-run-all": "^4.1.5", "watch": "^1.0.2" } -} \ No newline at end of file +} From 9548a679f5b20989be7b88ca6cb6919b8a03c1a9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 7 Jun 2024 14:03:34 +0200 Subject: [PATCH 154/755] put new profiles UI behind flag (#214586) --- .../browser/userDataProfile.ts | 173 ++++++++++++++++-- .../userDataProfileImportExportService.ts | 46 +++++ .../userDataProfile/common/userDataProfile.ts | 3 + 3 files changed, 206 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts index 0f4cc81f9da6d..db8e52ceaf4a7 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts @@ -31,10 +31,17 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IHostService } from 'vs/workbench/services/host/browser/host'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IUserDataProfilesEditor } from 'vs/workbench/contrib/userDataProfile/common/userDataProfile'; +import { ConfigurationScope, Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; +import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; +import { IProductService } from 'vs/platform/product/common/productService'; type IProfileTemplateQuickPickItem = IQuickPickItem & IProfileTemplateInfo; export const OpenProfileMenu = new MenuId('OpenProfile'); +const CONFIG_ENABLE_NEW_PROFILES_UI = 'workbench.experimental.enableNewProfilesUI'; +const CONTEXT_ENABLE_NEW_PROFILES_UI = ContextKeyExpr.equals('config.workbench.experimental.enableNewProfilesUI', true); export class UserDataProfilesWorkbenchContribution extends Disposable implements IWorkbenchContribution { @@ -54,6 +61,10 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @IWorkspaceTagsService private readonly workspaceTagsService: IWorkspaceTagsService, @IContextKeyService contextKeyService: IContextKeyService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IEditorGroupsService private readonly editorGroupsService: IEditorGroupsService, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IProductService private readonly productService: IProductService, @ILifecycleService private readonly lifecycleService: ILifecycleService, ) { super(); @@ -73,6 +84,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements this.hasProfilesContext.set(this.userDataProfilesService.profiles.length > 1); this._register(this.userDataProfilesService.onDidChangeProfiles(e => this.hasProfilesContext.set(this.userDataProfilesService.profiles.length > 1))); + this.registerConfiguration(); this.registerEditor(); this.registerActions(); @@ -83,6 +95,29 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements this.reportWorkspaceProfileInfo(); } + private openProfilesEditor(): Promise { + return this.editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(this.instantiationService)); + } + + private isNewProfilesUIEnabled(): boolean { + return this.configurationService.getValue(CONFIG_ENABLE_NEW_PROFILES_UI) === true; + } + + private registerConfiguration(): void { + Registry.as(Extensions.Configuration) + .registerConfiguration({ + ...workbenchConfigurationNodeBase, + properties: { + [CONFIG_ENABLE_NEW_PROFILES_UI]: { + type: 'boolean', + description: localize('enable new profiles UI', "Enables the new profiles UI."), + default: this.productService.quality !== 'stable', + scope: ConfigurationScope.APPLICATION, + } + } + }); + } + private registerEditor(): void { Registry.as(EditorExtensions.EditorPane).registerEditorPane( EditorPaneDescriptor.create( @@ -120,6 +155,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements const getProfilesTitle = () => { return localize('profiles', "Profile ({0})", this.userDataProfileService.currentProfile.name); }; + const when = ContextKeyExpr.or(CONTEXT_ENABLE_NEW_PROFILES_UI.negate(), HAS_PROFILES_CONTEXT); MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { get title() { return getProfilesTitle(); @@ -127,7 +163,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements submenu: ProfilesMenu, group: '2_configuration', order: 1, - when: HAS_PROFILES_CONTEXT, + when, }); MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { get title() { @@ -136,7 +172,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements submenu: ProfilesMenu, group: '2_configuration', order: 1, - when: HAS_PROFILES_CONTEXT, + when, }); } @@ -269,6 +305,8 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements private readonly currentprofileActionsDisposable = this._register(new MutableDisposable()); private registerCurrentProfilesActions(): void { this.currentprofileActionsDisposable.value = new DisposableStore(); + this.currentprofileActionsDisposable.value.add(this.registerEditCurrentProfileAction()); + this.currentprofileActionsDisposable.value.add(this.registerShowCurrentProfileContentsAction()); this.currentprofileActionsDisposable.value.add(this.registerExportCurrentProfileAction()); this.currentprofileActionsDisposable.value.add(this.registerImportProfileAction()); } @@ -287,12 +325,14 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements { id: MenuId.GlobalActivity, group: '2_configuration', - order: 1 + order: 1, + when: CONTEXT_ENABLE_NEW_PROFILES_UI, }, { id: MenuId.MenubarPreferencesMenu, group: '2_configuration', - order: 1 + order: 1, + when: CONTEXT_ENABLE_NEW_PROFILES_UI, }, ] }); @@ -308,12 +348,69 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements id: 'workbench.profiles.actions.manageProfiles', category: Categories.Preferences, title: localize2('open profiles', "Open Profiles (UI)"), + precondition: CONTEXT_ENABLE_NEW_PROFILES_UI, }, })); return disposables; } + private registerEditCurrentProfileAction(): IDisposable { + const that = this; + return registerAction2(class RenameCurrentProfileAction extends Action2 { + constructor() { + const precondition = ContextKeyExpr.and(ContextKeyExpr.notEquals(CURRENT_PROFILE_CONTEXT.key, that.userDataProfilesService.defaultProfile.id), IS_CURRENT_PROFILE_TRANSIENT_CONTEXT.toNegated()); + super({ + id: `workbench.profiles.actions.editCurrentProfile`, + title: localize2('edit profile', "Edit Profile..."), + precondition, + f1: true, + menu: [ + { + id: ProfilesMenu, + group: '2_manage_current', + when: ContextKeyExpr.and(precondition, CONTEXT_ENABLE_NEW_PROFILES_UI.negate()), + order: 2 + } + ] + }); + } + run(accessor: ServicesAccessor) { + if (that.isNewProfilesUIEnabled()) { + return that.openProfilesEditor(); + } else { + return that.userDataProfileImportExportService.editProfile(that.userDataProfileService.currentProfile); + } + } + }); + } + + private registerShowCurrentProfileContentsAction(): IDisposable { + const id = 'workbench.profiles.actions.showProfileContents'; + return registerAction2(class ShowProfileContentsAction extends Action2 { + constructor() { + super({ + id, + title: localize2('show profile contents', "Show Profile Contents"), + category: PROFILES_CATEGORY, + menu: [ + { + id: ProfilesMenu, + group: '2_manage_current', + order: 3, + when: CONTEXT_ENABLE_NEW_PROFILES_UI.negate() + } + ] + }); + } + + async run(accessor: ServicesAccessor) { + const userDataProfileImportExportService = accessor.get(IUserDataProfileImportExportService); + return userDataProfileImportExportService.showProfileContents(); + } + }); + } + private registerExportCurrentProfileAction(): IDisposable { const that = this; const disposables = new DisposableStore(); @@ -322,22 +419,37 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements constructor() { super({ id, - title: localize2('export profile', "Export Profile ({0})...", that.userDataProfileService.currentProfile.name), + title: localize2('export profile', "Export Profile..."), category: PROFILES_CATEGORY, precondition: IS_PROFILE_EXPORT_IN_PROGRESS_CONTEXT.toNegated(), - f1: true, - menu: { - id: MenuId.MenubarShare - } + menu: [ + { + id: ProfilesMenu, + group: '4_import_export_profiles', + order: 1, + when: CONTEXT_ENABLE_NEW_PROFILES_UI.negate(), + }, { + id: MenuId.CommandPalette + } + ] }); } async run(accessor: ServicesAccessor) { - const editorGroupsService = accessor.get(IEditorGroupsService); - const instantiationService = accessor.get(IInstantiationService); - return editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(instantiationService)); + if (that.isNewProfilesUIEnabled()) { + return that.openProfilesEditor(); + } else { + return that.userDataProfileImportExportService.exportProfile2(); + } } })); + disposables.add(MenuRegistry.appendMenuItem(MenuId.MenubarShare, { + command: { + id, + title: localize2('export profile in share', "Export Profile ({0})...", that.userDataProfileService.currentProfile.name), + precondition: PROFILES_ENABLEMENT_CONTEXT, + }, + })); return disposables; } @@ -352,7 +464,17 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements title: localize2('import profile', "Import Profile..."), category: PROFILES_CATEGORY, precondition: IS_PROFILE_IMPORT_IN_PROGRESS_CONTEXT.toNegated(), - f1: true, + menu: [ + { + id: ProfilesMenu, + group: '4_import_export_profiles', + when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, CONTEXT_ENABLE_NEW_PROFILES_UI.negate()), + order: 2 + }, { + id: MenuId.CommandPalette, + when: PROFILES_ENABLEMENT_CONTEXT, + } + ] }); } @@ -454,6 +576,7 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements } private registerCreateProfileAction(): void { + const that = this; this._register(registerAction2(class CreateProfileAction extends Action2 { constructor() { super({ @@ -462,13 +585,23 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements category: PROFILES_CATEGORY, precondition: PROFILES_ENABLEMENT_CONTEXT, f1: true, + menu: [ + { + id: ProfilesMenu, + group: '3_manage_profiles', + when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, CONTEXT_ENABLE_NEW_PROFILES_UI.negate()), + order: 1 + } + ] }); } async run(accessor: ServicesAccessor) { - const editorGroupsService = accessor.get(IEditorGroupsService); - const instantiationService = accessor.get(IInstantiationService); - return editorGroupsService.activeGroup.openEditor(new UserDataProfilesEditorInput(instantiationService)); + if (that.isNewProfilesUIEnabled()) { + return that.openProfilesEditor(); + } else { + return that.userDataProfileImportExportService.createProfile(); + } } })); } @@ -482,6 +615,14 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements category: PROFILES_CATEGORY, f1: true, precondition: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, HAS_PROFILES_CONTEXT), + menu: [ + { + id: ProfilesMenu, + group: '3_manage_profiles', + when: ContextKeyExpr.and(PROFILES_ENABLEMENT_CONTEXT, CONTEXT_ENABLE_NEW_PROFILES_UI.negate()), + order: 2 + } + ] }); } diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts index 1d5217c67d3a5..6a28cadf4489a 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts @@ -80,6 +80,7 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import type { IHoverWidget } from 'vs/base/browser/ui/hover/hover'; import { IAccessibleViewInformationService } from 'vs/workbench/services/accessibility/common/accessibleViewInformationService'; +import { ILogService } from 'vs/platform/log/common/log'; interface IUserDataProfileTemplate { readonly name: string; @@ -103,6 +104,7 @@ function isUserDataProfileTemplate(thing: unknown): thing is IUserDataProfileTem && (isUndefined(candidate.extensions) || typeof candidate.extensions === 'string')); } +const EXPORT_PROFILE_PREVIEW_VIEW = 'workbench.views.profiles.export.preview'; const IMPORT_PROFILE_PREVIEW_VIEW = 'workbench.views.profiles.import.preview'; export class UserDataProfileImportExportService extends Disposable implements IUserDataProfileImportExportService, IURLHandler { @@ -141,6 +143,7 @@ export class UserDataProfileImportExportService extends Disposable implements IU @ITelemetryService private readonly telemetryService: ITelemetryService, @IContextViewService private readonly contextViewService: IContextViewService, @IHoverService private readonly hoverService: IHoverService, + @ILogService private readonly logService: ILogService, ) { super(); this.registerProfileContentHandler(Schemas.file, this.fileUserDataProfileContentHandler = instantiationService.createInstance(FileUserDataProfileContentHandler)); @@ -190,6 +193,15 @@ export class UserDataProfileImportExportService extends Disposable implements IU this.profileContentHandlers.delete(id); } + async exportProfile2(): Promise { + if (this.isProfileExportInProgressContextKey.get()) { + this.logService.warn('Profile export already in progress.'); + return; + } + + return this.showProfileContents(); + } + async importProfile(uri: URI, options?: IProfileImportOptions): Promise { if (this.isProfileImportInProgressContextKey.get()) { this.notificationService.warn('Profile import already in progress.'); @@ -226,6 +238,10 @@ export class UserDataProfileImportExportService extends Disposable implements IU return this.saveProfile(undefined, from); } + editProfile(profile: IUserDataProfile): Promise { + return this.saveProfile(profile); + } + async createFromProfile(from: IUserDataProfile, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise { const disposables = new DisposableStore(); let creationPromise: CancelablePromise; @@ -643,6 +659,36 @@ export class UserDataProfileImportExportService extends Disposable implements IU } } + async showProfileContents(): Promise { + const view = this.viewsService.getViewWithId(EXPORT_PROFILE_PREVIEW_VIEW); + if (view) { + this.viewsService.openView(view.id, true); + return; + } + const disposables = new DisposableStore(); + try { + const userDataProfilesExportState = disposables.add(this.instantiationService.createInstance(UserDataProfileExportState, this.userDataProfileService.currentProfile, undefined)); + const barrier = new Barrier(); + const exportAction = new BarrierAction(barrier, new Action('export', localize('export', "Export"), undefined, true, async () => { + exportAction.enabled = false; + try { + await this.doExportProfile(userDataProfilesExportState, EXPORT_PROFILE_PREVIEW_VIEW); + } catch (error) { + exportAction.enabled = true; + this.notificationService.error(error); + throw error; + } + }), this.notificationService); + const closeAction = new BarrierAction(barrier, new Action('close', localize('close', "Close")), this.notificationService); + await this.showProfilePreviewView(EXPORT_PROFILE_PREVIEW_VIEW, userDataProfilesExportState.profile.name, exportAction, closeAction, true, userDataProfilesExportState); + disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(e => barrier.open())); + await barrier.wait(); + await this.hideProfilePreviewView(EXPORT_PROFILE_PREVIEW_VIEW); + } finally { + disposables.dispose(); + } + } + async exportProfile(profile: IUserDataProfile): Promise { const disposables = new DisposableStore(); try { diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts index 2e98469a16335..e5c260e0510f6 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfile.ts @@ -101,8 +101,11 @@ export interface IUserDataProfileImportExportService { resolveProfileTemplate(uri: URI): Promise; exportProfile(profile: IUserDataProfile): Promise; + exportProfile2(): Promise; importProfile(uri: URI, options?: IProfileImportOptions): Promise; + showProfileContents(): Promise; createProfile(from?: IUserDataProfile | URI): Promise; + editProfile(profile: IUserDataProfile): Promise; createFromProfile(from: IUserDataProfile, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise; createProfileFromTemplate(profileTemplate: IUserDataProfileTemplate, options: IUserDataProfileCreateOptions, token: CancellationToken): Promise; createTroubleshootProfile(): Promise; From 3d7e352d2d6ed872e8b28d4704449241498c1a46 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:08:33 +0200 Subject: [PATCH 155/755] Git - empty commit should not include unstaged changes (#214587) --- extensions/git/src/commands.ts | 106 +++++++++++++++++---------------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 48f67f396d4b2..a5325033e778b 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2068,69 +2068,71 @@ export class CommandCenter { let noStagedChanges = repository.indexGroup.resourceStates.length === 0; let noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0; - if (promptToSaveFilesBeforeCommit !== 'never') { - let documents = workspace.textDocuments - .filter(d => !d.isUntitled && d.isDirty && isDescendant(repository.root, d.uri.fsPath)); - - if (promptToSaveFilesBeforeCommit === 'staged' || repository.indexGroup.resourceStates.length > 0) { - documents = documents - .filter(d => repository.indexGroup.resourceStates.some(s => pathEquals(s.resourceUri.fsPath, d.uri.fsPath))); - } - - if (documents.length > 0) { - const message = documents.length === 1 - ? l10n.t('The following file has unsaved changes which won\'t be included in the commit if you proceed: {0}.\n\nWould you like to save it before committing?', path.basename(documents[0].uri.fsPath)) - : l10n.t('There are {0} unsaved files.\n\nWould you like to save them before committing?', documents.length); - const saveAndCommit = l10n.t('Save All & Commit Changes'); - const commit = l10n.t('Commit Changes'); - const pick = await window.showWarningMessage(message, { modal: true }, saveAndCommit, commit); - - if (pick === saveAndCommit) { - await Promise.all(documents.map(d => d.save())); + if (!opts.empty) { + if (promptToSaveFilesBeforeCommit !== 'never') { + let documents = workspace.textDocuments + .filter(d => !d.isUntitled && d.isDirty && isDescendant(repository.root, d.uri.fsPath)); - // After saving the dirty documents, if there are any documents that are part of the - // index group we have to add them back in order for the saved changes to be committed + if (promptToSaveFilesBeforeCommit === 'staged' || repository.indexGroup.resourceStates.length > 0) { documents = documents .filter(d => repository.indexGroup.resourceStates.some(s => pathEquals(s.resourceUri.fsPath, d.uri.fsPath))); - await repository.add(documents.map(d => d.uri)); + } - noStagedChanges = repository.indexGroup.resourceStates.length === 0; - noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0; - } else if (pick !== commit) { - return; // do not commit on cancel + if (documents.length > 0) { + const message = documents.length === 1 + ? l10n.t('The following file has unsaved changes which won\'t be included in the commit if you proceed: {0}.\n\nWould you like to save it before committing?', path.basename(documents[0].uri.fsPath)) + : l10n.t('There are {0} unsaved files.\n\nWould you like to save them before committing?', documents.length); + const saveAndCommit = l10n.t('Save All & Commit Changes'); + const commit = l10n.t('Commit Changes'); + const pick = await window.showWarningMessage(message, { modal: true }, saveAndCommit, commit); + + if (pick === saveAndCommit) { + await Promise.all(documents.map(d => d.save())); + + // After saving the dirty documents, if there are any documents that are part of the + // index group we have to add them back in order for the saved changes to be committed + documents = documents + .filter(d => repository.indexGroup.resourceStates.some(s => pathEquals(s.resourceUri.fsPath, d.uri.fsPath))); + await repository.add(documents.map(d => d.uri)); + + noStagedChanges = repository.indexGroup.resourceStates.length === 0; + noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0; + } else if (pick !== commit) { + return; // do not commit on cancel + } } } - } - // no changes, and the user has not configured to commit all in this case - if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.empty && !opts.all) { - const suggestSmartCommit = config.get('suggestSmartCommit') === true; + // no changes, and the user has not configured to commit all in this case + if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) { + const suggestSmartCommit = config.get('suggestSmartCommit') === true; - if (!suggestSmartCommit) { - return; - } + if (!suggestSmartCommit) { + return; + } - // prompt the user if we want to commit all or not - const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?'); - const yes = l10n.t('Yes'); - const always = l10n.t('Always'); - const never = l10n.t('Never'); - const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); - - if (pick === always) { - config.update('enableSmartCommit', true, true); - } else if (pick === never) { - config.update('suggestSmartCommit', false, true); - return; - } else if (pick !== yes) { - return; // do not commit on cancel + // prompt the user if we want to commit all or not + const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?'); + const yes = l10n.t('Yes'); + const always = l10n.t('Always'); + const never = l10n.t('Never'); + const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); + + if (pick === always) { + config.update('enableSmartCommit', true, true); + } else if (pick === never) { + config.update('suggestSmartCommit', false, true); + return; + } else if (pick !== yes) { + return; // do not commit on cancel + } } - } - if (opts.all === undefined) { - opts = { ...opts, all: noStagedChanges }; - } else if (!opts.all && noStagedChanges && !opts.empty) { - opts = { ...opts, all: true }; + if (opts.all === undefined) { + opts = { ...opts, all: noStagedChanges }; + } else if (!opts.all && noStagedChanges) { + opts = { ...opts, all: true }; + } } // enable signing of commits if configured From e941a59986c8cfb496a9425a8d927afe387c38c1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 7 Jun 2024 15:33:16 +0200 Subject: [PATCH 156/755] polish editor (#214598) --- .../browser/media/userDataProfilesEditor.css | 33 +++++++++++-------- .../browser/userDataProfilesEditor.ts | 8 +++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index 07d8f8b50d9f4..f1054b365c53d 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -54,7 +54,6 @@ .profiles-editor .monaco-list-row.focused .profile-tree-item-actions-container, .profiles-editor .monaco-list-row.selected .profile-tree-item-actions-container, .profiles-editor .monaco-list-row:hover .profile-tree-item-actions-container { - flex: 1; display: flex; align-items: center; } @@ -86,6 +85,7 @@ } .profiles-editor .sidebar-container .profiles-list .profile-list-item .profile-tree-item-actions-container { + flex: 1; justify-content: flex-end; margin-right: 10px; } @@ -197,11 +197,11 @@ .profiles-editor .contents-container .profile-content-tree-header, .profiles-editor .contents-container .profile-content-tree { margin-left: 6px; - max-width: 450px; } .profiles-editor .contents-container .profile-content-tree-header { - display: flex; + display: grid; + grid-template-columns: 30px repeat(2, 1fr) 100px; height: 24px; align-items: center; margin-bottom: 2px; @@ -214,30 +214,35 @@ align-items: center; } -.profiles-editor .contents-container .profile-content-tree-header :first-child { - width: 200px; -} - -.profiles-editor .contents-container .profile-tree-item-container > .profile-resource-type-label, -.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-resource-type-label-container { - width: 170px; +.profiles-editor .contents-container .profile-tree-item-container.existing-profile-resource-type-container { + display: grid; + grid-template-columns: repeat(2, 1fr) 100px; } .profiles-editor .contents-container .profile-content-tree-header > .inherit-label, .profiles-editor .contents-container .profile-tree-item-container > .inherit-container { - width: 130px; - display: flex; justify-content: center; align-items: center; } +.profiles-editor .contents-container .profile-tree-item-container > .inherit-container { + padding-left: 50px; +} + .profiles-editor .contents-container .profile-content-tree-header > .actions-label { - flex: 1; display: flex; justify-content: center; align-items: center; } +.profiles-editor .contents-container .profile-tree-item-container.profile-resource-child-container > .profile-tree-item-actions-container { + width: 100px; +} + +.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-resource-type-label-container { + width: 170px; +} + .profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-select-container { width: 170px; } @@ -249,7 +254,7 @@ } .profiles-editor .contents-container .profile-tree-item-container.profile-resource-child-container > .monaco-icon-label { - width: 295px; + flex: 1 } .profiles-editor .contents-container .profile-tree-item-container .profile-tree-item-actions-container { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 8ddd5bb184687..4485ff69cbaff 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -460,6 +460,7 @@ class ProfileWidget extends Disposable { private copyFromOptions: (ISelectOptionItem & { id?: string; source?: IUserDataProfile | URI })[] = []; private readonly contentsTreeHeader: HTMLElement; + private readonly inheritLabelElement: HTMLElement; private readonly resourcesTree: WorkbenchAsyncDataTree; private _templates: IProfileTemplateInfo[] = []; @@ -572,9 +573,11 @@ class ProfileWidget extends Disposable { })); this.contentsTreeHeader = append(body, $('.profile-content-tree-header')); + this.inheritLabelElement = $('.inherit-label', undefined, localize('default profile', "Use Default Profile")); append(this.contentsTreeHeader, $(''), - $('.inherit-label', undefined, localize('default profile', "Use Default Profile")), + $(''), + this.inheritLabelElement, $('.actions-label', undefined, localize('actions', "Actions")), ); const delegate = new ProfileResourceTreeElementDelegate(); @@ -811,7 +814,8 @@ class ProfileWidget extends Disposable { this.copyFromSelectBox.setEnabled(false); } } else if (profileElement instanceof UserDataProfileElement) { - this.contentsTreeHeader.classList.toggle('hide', profileElement.profile.isDefault); + this.contentsTreeHeader.classList.remove('hide'); + this.inheritLabelElement.textContent = profileElement.profile.isDefault ? '' : localize('default profile', "Use Default Profile"); this.useAsDefaultProfileContainer.classList.remove('hide'); this.useAsDefaultProfileCheckbox.checked = profileElement.isNewWindowProfile; this.copyFromContainer.classList.add('hide'); From 5422f5f940537615c984af76ff0ab4ba5932127e Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:51:20 +0200 Subject: [PATCH 157/755] Git - do not show smart commit dialog when using Commit (Amend) (#214595) --- extensions/git/src/commands.ts | 52 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index a5325033e778b..00045c14ea39f 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2103,35 +2103,37 @@ export class CommandCenter { } } - // no changes, and the user has not configured to commit all in this case - if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) { - const suggestSmartCommit = config.get('suggestSmartCommit') === true; + if (!opts.amend) { + // no changes, and the user has not configured to commit all in this case + if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) { + const suggestSmartCommit = config.get('suggestSmartCommit') === true; - if (!suggestSmartCommit) { - return; - } + if (!suggestSmartCommit) { + return; + } - // prompt the user if we want to commit all or not - const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?'); - const yes = l10n.t('Yes'); - const always = l10n.t('Always'); - const never = l10n.t('Never'); - const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); - - if (pick === always) { - config.update('enableSmartCommit', true, true); - } else if (pick === never) { - config.update('suggestSmartCommit', false, true); - return; - } else if (pick !== yes) { - return; // do not commit on cancel + // prompt the user if we want to commit all or not + const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?'); + const yes = l10n.t('Yes'); + const always = l10n.t('Always'); + const never = l10n.t('Never'); + const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); + + if (pick === always) { + config.update('enableSmartCommit', true, true); + } else if (pick === never) { + config.update('suggestSmartCommit', false, true); + return; + } else if (pick !== yes) { + return; // do not commit on cancel + } } - } - if (opts.all === undefined) { - opts = { ...opts, all: noStagedChanges }; - } else if (!opts.all && noStagedChanges) { - opts = { ...opts, all: true }; + if (opts.all === undefined) { + opts = { ...opts, all: noStagedChanges }; + } else if (!opts.all && noStagedChanges) { + opts = { ...opts, all: true }; + } } } From bab3a9fdcb5f933eab4bf85fd30ade2fe69f9103 Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 7 Jun 2024 23:02:35 +0900 Subject: [PATCH 158/755] fix: disable CoreText font matching on macOS (#214601) --- src/main.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main.js b/src/main.js index 9fe5654081d7f..d4bc388fb7ff0 100644 --- a/src/main.js +++ b/src/main.js @@ -294,6 +294,13 @@ function configureCommandlineSwitchesSync(cliArgs) { `CalculateNativeWinOcclusion,${app.commandLine.getSwitchValue('disable-features')}`; app.commandLine.appendSwitch('disable-features', featuresToDisable); + // Blink features to configure. + // `FontMatchingCTMigration` - Siwtch font matching on macOS to CoreText (Refs https://github.com/microsoft/vscode/issues/214390). + // TODO(deepak1556): Enable this feature again after updating to Electron 30. + const blinkFeaturesToDisable = + `FontMatchingCTMigration,${app.commandLine.getSwitchValue('disable-blink-features')}`; + app.commandLine.appendSwitch('disable-blink-features', blinkFeaturesToDisable); + // Support JS Flags const jsFlags = getJSFlags(cliArgs); if (jsFlags) { From 4e76f11add5958aa0bed02c2ead2ffa8999af72d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 7 Jun 2024 07:09:06 -0700 Subject: [PATCH 159/755] Avoid printf in __vsc_report_prompt Fixes #212090 --- .../browser/media/shellIntegration-bash.sh | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index aad118a4608d4..1996d30cbde2f 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -116,14 +116,44 @@ __vsc_escape_value() { for (( i=0; i < "${#str}"; ++i )); do byte="${str:$i:1}" - - # Escape backslashes, semi-colons specially, then special ASCII chars below space (0x20) + # Escape backslashes, semi-colons specially, then special ASCII chars below space (0x20). + # This is done in an unwrapped loop instead of using printf as the latter is very slow. if [ "$byte" = "\\" ]; then token="\\\\" elif [ "$byte" = ";" ]; then token="\\x3b" - elif (( $(builtin printf '%d' "'$byte") < 31 )); then - token=$(builtin printf '\\x%02x' "'$byte") + elif [ "$byte" = $'\x00' ]; then token="\\x00" + elif [ "$byte" = $'\x01' ]; then token="\\x01" + elif [ "$byte" = $'\x02' ]; then token="\\x02" + elif [ "$byte" = $'\x03' ]; then token="\\x03" + elif [ "$byte" = $'\x04' ]; then token="\\x04" + elif [ "$byte" = $'\x05' ]; then token="\\x05" + elif [ "$byte" = $'\x06' ]; then token="\\x06" + elif [ "$byte" = $'\x07' ]; then token="\\x07" + elif [ "$byte" = $'\x08' ]; then token="\\x08" + elif [ "$byte" = $'\x09' ]; then token="\\x09" + elif [ "$byte" = $'\x0a' ]; then token="\\x0a" + elif [ "$byte" = $'\x0b' ]; then token="\\x0b" + elif [ "$byte" = $'\x0c' ]; then token="\\x0c" + elif [ "$byte" = $'\x0d' ]; then token="\\x0d" + elif [ "$byte" = $'\x0e' ]; then token="\\x0e" + elif [ "$byte" = $'\x0f' ]; then token="\\x0f" + elif [ "$byte" = $'\x10' ]; then token="\\x10" + elif [ "$byte" = $'\x11' ]; then token="\\x11" + elif [ "$byte" = $'\x12' ]; then token="\\x12" + elif [ "$byte" = $'\x13' ]; then token="\\x13" + elif [ "$byte" = $'\x14' ]; then token="\\x14" + elif [ "$byte" = $'\x15' ]; then token="\\x15" + elif [ "$byte" = $'\x16' ]; then token="\\x16" + elif [ "$byte" = $'\x17' ]; then token="\\x17" + elif [ "$byte" = $'\x18' ]; then token="\\x18" + elif [ "$byte" = $'\x19' ]; then token="\\x19" + elif [ "$byte" = $'\x1a' ]; then token="\\x1a" + elif [ "$byte" = $'\x1b' ]; then token="\\x1b" + elif [ "$byte" = $'\x1c' ]; then token="\\x1c" + elif [ "$byte" = $'\x1d' ]; then token="\\x1d" + elif [ "$byte" = $'\x1e' ]; then token="\\x1e" + elif [ "$byte" = $'\x1f' ]; then token="\\x1f" else token="$byte" fi From ac1afd7aa0b03b3c7772da14a91a83ce057b5272 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 7 Jun 2024 07:10:06 -0700 Subject: [PATCH 160/755] Disable prompt reporting on git bash --- .../contrib/terminal/browser/media/shellIntegration-bash.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index 1996d30cbde2f..69e0630da4e26 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -196,6 +196,11 @@ unset VSCODE_NONCE builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a" __vsc_report_prompt() { + # HACK: Git bash is too slow at reporting the prompt, so skip for now + if [ "$__vsc_is_windows" = "1" ]; then + return + fi + # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then From d08886ba68d19809e1b83724518e14e9573c7783 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 7 Jun 2024 16:11:24 +0200 Subject: [PATCH 161/755] fix primary and secondary buttons order (#214603) --- .../browser/userDataProfilesEditor.ts | 26 +++++++++---------- .../browser/userDataProfilesEditorModel.ts | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 4485ff69cbaff..5a1b25de0b18a 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -731,10 +731,11 @@ class ProfileWidget extends Disposable { if (primaryTitleButtons?.length || secondatyTitleButtons?.length) { this.buttonContainer.classList.remove('hide'); - if (primaryTitleButtons?.length) { - for (const action of primaryTitleButtons) { + if (secondatyTitleButtons?.length) { + for (const action of secondatyTitleButtons) { const button = disposables.add(new Button(this.buttonContainer, { - ...defaultButtonStyles + ...defaultButtonStyles, + secondary: true })); button.label = action.label; button.enabled = action.enabled; @@ -744,20 +745,13 @@ class ProfileWidget extends Disposable { button.enabled = action.enabled; } })); - disposables.add(profileElement.onDidChange(e => { - if (e.message) { - button.setTitle(profileElement.message ?? action.label); - button.element.classList.toggle('error', !!profileElement.message); - } - })); } } - if (secondatyTitleButtons?.length) { - for (const action of secondatyTitleButtons) { + if (primaryTitleButtons?.length) { + for (const action of primaryTitleButtons) { const button = disposables.add(new Button(this.buttonContainer, { - ...defaultButtonStyles, - secondary: true + ...defaultButtonStyles })); button.label = action.label; button.enabled = action.enabled; @@ -767,6 +761,12 @@ class ProfileWidget extends Disposable { button.enabled = action.enabled; } })); + disposables.add(profileElement.onDidChange(e => { + if (e.message) { + button.setTitle(profileElement.message ?? action.label); + button.element.classList.toggle('error', !!profileElement.message); + } + })); } } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 6f5b528020e98..3d2df24343c45 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -825,7 +825,7 @@ export class UserDataProfilesEditorModel extends EditorModel { this.newProfileElement = disposables.add(this.instantiationService.createInstance(NewProfileElement, copyFrom ? '' : localize('untitled', "Untitled"), copyFrom, - [[createAction], [previewProfileAction, cancelAction]], + [[createAction], [cancelAction, previewProfileAction]], [[], []], [[cancelAction], []], )); From 88f50e0809ad71973670a3a98fcbbadba51e8c53 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:39:20 +0200 Subject: [PATCH 162/755] SCM - extract activity count badge into its own workbench contribution (#214610) --- src/vs/workbench/api/browser/mainThreadSCM.ts | 7 +- .../workbench/contrib/scm/browser/activity.ts | 132 +++++++++++++----- .../contrib/scm/browser/scm.contribution.ts | 5 +- .../scm/browser/scmRepositoryRenderer.ts | 2 +- src/vs/workbench/contrib/scm/common/scm.ts | 3 +- 5 files changed, 107 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 10f26d51387a9..adb9238b8a1cf 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -230,10 +230,9 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { get acceptInputCommand(): Command | undefined { return this.features.acceptInputCommand; } get actionButton(): ISCMActionButtonDescriptor | undefined { return this.features.actionButton ?? undefined; } get statusBarCommands(): Command[] | undefined { return this.features.statusBarCommands; } - get count(): number | undefined { return this.features.count; } - private readonly _countObs = observableValue(this, undefined); - get countObs() { return this._countObs; } + private readonly _count = observableValue(this, undefined); + get count() { return this._count; } private readonly _statusBarCommandsObs = observableValue(this, undefined); get statusBarCommandsObs() { return this._statusBarCommandsObs; } @@ -288,7 +287,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (typeof features.count !== 'undefined') { - this._countObs.set(features.count, undefined); + this._count.set(features.count, undefined); } if (typeof features.statusBarCommands !== 'undefined') { diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 4aa92b2615ffd..a2feda972bb45 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -22,9 +22,103 @@ import { ITitleService } from 'vs/workbench/services/title/browser/titleService' import { IEditorGroupContextKeyProvider, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { getRepositoryResourceCount } from 'vs/workbench/contrib/scm/browser/util'; +import { autorunWithStore, derived, derivedObservableWithCache, IObservable, observableFromEvent } from 'vs/base/common/observable'; +import { observableConfigValue } from 'vs/platform/observable/common/platformObservableUtils'; -function getCount(repository: ISCMRepository): number { - return repository.provider.count ?? getRepositoryResourceCount(repository.provider); +export class SCMActivityCountBadgeController extends Disposable implements IWorkbenchContribution { + private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); + + private readonly _repositories = observableFromEvent( + Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository), + () => this.scmService.repositories); + + private readonly _focusedRepository = observableFromEvent( + this.scmViewService.onDidFocusRepository, + () => this.scmViewService.focusedRepository ? Object.create(this.scmViewService.focusedRepository) : undefined); + + private readonly _activeEditor = observableFromEvent( + this.editorService.onDidActiveEditorChange, + () => this.editorService.activeEditor); + + private readonly _activeEditorRepository = derived(reader => { + const activeResource = EditorResourceAccessor.getOriginalUri(this._activeEditor.read(reader)); + if (!activeResource) { + return undefined; + } + + return this.scmService.getRepository(activeResource); + }); + + private readonly _activeRepository = derivedObservableWithCache(this, (reader, lastValue) => { + const focusedRepository = this._focusedRepository.read(reader); + if (focusedRepository && focusedRepository.id !== lastValue?.id) { + return focusedRepository; + } + + const activeEditorRepository = this._activeEditorRepository.read(reader); + if (activeEditorRepository && activeEditorRepository.id !== lastValue?.id) { + return activeEditorRepository; + } + + return lastValue; + }); + + private readonly _countBadgeRepositories = derived(reader => { + switch (this._countBadgeConfig.read(reader)) { + case 'all': { + const repositories = this._repositories.read(reader); + return [...Iterable.map(repositories, r => ({ ...r.provider, resourceCount: this._getRepositoryResourceCount(r) }))]; + } + case 'focused': { + const repository = this._activeRepository.read(reader); + return repository ? [{ ...repository.provider, resourceCount: this._getRepositoryResourceCount(repository) }] : []; + } + case 'off': + return []; + default: + throw new Error('Invalid countBadge setting'); + } + }); + + private readonly _countBadge = derived(reader => { + let total = 0; + + for (const repository of this._countBadgeRepositories.read(reader)) { + const count = repository.count?.read(reader); + const resourceCount = repository.resourceCount.read(reader); + + total = total + (count ?? resourceCount); + } + + return total; + }); + + constructor( + @IActivityService private readonly activityService: IActivityService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IEditorService private readonly editorService: IEditorService, + @ISCMService private readonly scmService: ISCMService, + @ISCMViewService private readonly scmViewService: ISCMViewService + ) { + super(); + + this._register(autorunWithStore((reader, store) => { + this._renderActivityCount(this._countBadge.read(reader), store); + })); + } + + private _getRepositoryResourceCount(repository: ISCMRepository): IObservable { + return observableFromEvent(repository.provider.onDidChangeResources, () => getRepositoryResourceCount(repository.provider)); + } + + private _renderActivityCount(count: number, store: DisposableStore): void { + if (count === 0) { + return; + } + + const badge = new NumberBadge(count, num => localize('scmPendingChangesBadge', '{0} pending changes', num)); + store.add(this.activityService.showViewActivity(VIEW_PANE_ID, { badge })); + } } export class SCMStatusController implements IWorkbenchContribution { @@ -40,16 +134,11 @@ export class SCMStatusController implements IWorkbenchContribution { @ISCMService private readonly scmService: ISCMService, @ISCMViewService private readonly scmViewService: ISCMViewService, @IStatusbarService private readonly statusbarService: IStatusbarService, - @IActivityService private readonly activityService: IActivityService, - @IEditorService private readonly editorService: IEditorService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IEditorService private readonly editorService: IEditorService ) { this.scmService.onDidAddRepository(this.onDidAddRepository, this, this.disposables); this.scmService.onDidRemoveRepository(this.onDidRemoveRepository, this, this.disposables); - const onDidChangeSCMCountBadge = Event.filter(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.countBadge')); - onDidChangeSCMCountBadge(this.renderActivityCount, this, this.disposables); - for (const repository of this.scmService.repositories) { this.onDidAddRepository(repository); } @@ -58,7 +147,6 @@ export class SCMStatusController implements IWorkbenchContribution { this.focusRepository(this.scmViewService.focusedRepository); editorService.onDidActiveEditorChange(() => this.tryFocusRepositoryBasedOnActiveEditor(), this, this.disposables); - this.renderActivityCount(); } private tryFocusRepositoryBasedOnActiveEditor(repositories: Iterable = this.scmService.repositories): boolean { @@ -78,17 +166,13 @@ export class SCMStatusController implements IWorkbenchContribution { } private onDidAddRepository(repository: ISCMRepository): void { - const onDidChange = Event.any(repository.provider.onDidChange, repository.provider.onDidChangeResources); - const changeDisposable = onDidChange(() => this.renderActivityCount()); - const onDidRemove = Event.filter(this.scmService.onDidRemoveRepository, e => e === repository); const removeDisposable = onDidRemove(() => { disposable.dispose(); this.repositoryDisposables.delete(disposable); - this.renderActivityCount(); }); - const disposable = combinedDisposable(changeDisposable, removeDisposable); + const disposable = combinedDisposable(removeDisposable); this.repositoryDisposables.add(disposable); this.tryFocusRepositoryBasedOnActiveEditor(Iterable.single(repository)); @@ -115,7 +199,6 @@ export class SCMStatusController implements IWorkbenchContribution { } this.renderStatusBar(repository); - this.renderActivityCount(); } private renderStatusBar(repository: ISCMRepository | undefined): void { @@ -166,25 +249,6 @@ export class SCMStatusController implements IWorkbenchContribution { this.statusBarDisposable = disposables; } - private renderActivityCount(): void { - const countBadgeType = this.configurationService.getValue<'all' | 'focused' | 'off'>('scm.countBadge'); - - let count = 0; - - if (countBadgeType === 'all') { - count = Iterable.reduce(this.scmService.repositories, (r, repository) => r + getCount(repository), 0); - } else if (countBadgeType === 'focused' && this.focusedRepository) { - count = getCount(this.focusedRepository); - } - - if (count > 0) { - const badge = new NumberBadge(count, num => localize('scmPendingChangesBadge', '{0} pending changes', num)); - this.badgeDisposable.value = this.activityService.showViewActivity(VIEW_PANE_ID, { badge }); - } else { - this.badgeDisposable.value = undefined; - } - } - dispose(): void { this.focusDisposable.dispose(); this.statusBarDisposable.dispose(); diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index 203a7693ddcce..bb51dd22748a5 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -10,7 +10,7 @@ import { DirtyDiffWorkbenchController } from './dirtydiffDecorator'; import { VIEWLET_ID, ISCMService, VIEW_PANE_ID, ISCMProvider, ISCMViewService, REPOSITORIES_VIEW_PANE_ID } from 'vs/workbench/contrib/scm/common/scm'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { SCMActiveRepositoryContextKeyController, SCMActiveResourceContextKeyController, SCMStatusController } from './activity'; +import { SCMActiveRepositoryContextKeyController, SCMActiveResourceContextKeyController, SCMActivityCountBadgeController, SCMStatusController } from './activity'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -112,6 +112,9 @@ viewsRegistry.registerViews([{ containerIcon: sourceControlViewIcon }], viewContainer); +Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(SCMActivityCountBadgeController, LifecyclePhase.Restored); + Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(SCMActiveResourceContextKeyController, LifecyclePhase.Restored); diff --git a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts index 28473fdf683ab..d09d5db84400a 100644 --- a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts +++ b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts @@ -117,7 +117,7 @@ export class RepositoryRenderer implements ICompressibleTreeRenderer { - const count = repository.provider.countObs.read(reader) ?? getRepositoryResourceCount(repository.provider); + const count = repository.provider.count.read(reader) ?? getRepositoryResourceCount(repository.provider); templateData.countContainer.setAttribute('data-count', String(count)); templateData.count.setCount(count); })); diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index af14bade4527b..47bd0637217b4 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -73,8 +73,7 @@ export interface ISCMProvider extends IDisposable { readonly rootUri?: URI; readonly inputBoxTextModel: ITextModel; - readonly count?: number; - readonly countObs: IObservable; + readonly count: IObservable; readonly commitTemplate: IObservable; readonly historyProvider?: ISCMHistoryProvider; readonly onDidChangeHistoryProvider: Event; From 64a3d795cb964b03433a7ecb30ea3b6acf0a0681 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 7 Jun 2024 10:01:46 -0700 Subject: [PATCH 163/755] register task disposables (#214512) --- .../tasks/browser/task.contribution.ts | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts index 6de31d4010c1f..ac6fdcba3859c 100644 --- a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -23,7 +23,7 @@ import { IOutputChannelRegistry, Extensions as OutputExt } from 'vs/workbench/se import { ITaskEvent, TaskEventKind, TaskGroup, TaskSettingId, TASKS_CATEGORY, TASK_RUNNING_STATE } from 'vs/workbench/contrib/tasks/common/tasks'; import { ITaskService, TaskCommandsRegistered, TaskExecutionSupportedContext } from 'vs/workbench/contrib/tasks/common/taskService'; -import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from 'vs/workbench/common/contributions'; import { RunAutomaticTasks, ManageAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/browser/runAutomaticTasks'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; @@ -431,15 +431,24 @@ schema.oneOf = [...(schemaVersion2.oneOf || []), ...(schemaVersion1.oneOf || []) const jsonRegistry = Registry.as(jsonContributionRegistry.Extensions.JSONContribution); jsonRegistry.registerSchema(tasksSchemaId, schema); -ProblemMatcherRegistry.onMatcherChanged(() => { - updateProblemMatchers(); - jsonRegistry.notifySchemaChanged(tasksSchemaId); -}); +export class TaskRegistryContribution extends Disposable implements IWorkbenchContribution { + static ID = 'taskRegistryContribution'; + constructor() { + super(); + + this._register(ProblemMatcherRegistry.onMatcherChanged(() => { + updateProblemMatchers(); + jsonRegistry.notifySchemaChanged(tasksSchemaId); + })); + + this._register(TaskDefinitionRegistry.onDefinitionsChanged(() => { + updateTaskDefinitions(); + jsonRegistry.notifySchemaChanged(tasksSchemaId); + })); + } +} +registerWorkbenchContribution2(TaskRegistryContribution.ID, TaskRegistryContribution, WorkbenchPhase.AfterRestored); -TaskDefinitionRegistry.onDefinitionsChanged(() => { - updateTaskDefinitions(); - jsonRegistry.notifySchemaChanged(tasksSchemaId); -}); const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ From d3b66eafed04c5469144a5dacb0a8f036ab46322 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Fri, 7 Jun 2024 10:39:28 -0700 Subject: [PATCH 164/755] debug: take isFrameDeemphasized presentationHint from the frame if set (#214632) Refs discussion in #214433 --- src/vs/workbench/contrib/debug/common/debug.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index a6bf29d33e29f..a29ff25c6bab0 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -547,7 +547,8 @@ export interface IStackFrame extends ITreeElement { } export function isFrameDeemphasized(frame: IStackFrame): boolean { - return frame.source.presentationHint === 'deemphasize' || frame.presentationHint === 'deemphasize' || frame.presentationHint === 'subtle'; + const hint = frame.presentationHint ?? frame.source.presentationHint; + return hint === 'deemphasize' || hint === 'subtle'; } export interface IEnablement extends ITreeElement { From 97e2d0d91874726264c56e23d61cbcc295aa52bf Mon Sep 17 00:00:00 2001 From: Rafael Sargento Date: Fri, 7 Jun 2024 19:17:38 +0100 Subject: [PATCH 165/755] Implemented Requested small changes. Removed linkDetector check when rendering the type. Deleted displayType boolean, now we read from config in render Added missing line to renderExpressionElement. Co-authored-by: Diogo Pinto --- .../contrib/debug/browser/baseDebugView.ts | 11 ++-------- .../contrib/debug/browser/debugHover.ts | 2 +- .../contrib/debug/browser/variablesView.ts | 10 +++------- .../debug/browser/watchExpressionsView.ts | 13 +++++------- .../debug/test/browser/variablesView.test.ts | 19 ++++++++++++++++-- .../test/browser/watchExpressionView.test.ts | 20 ++++++++++++++++--- 6 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts index 4e1b8b3312db6..0515cc780f320 100644 --- a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts +++ b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts @@ -138,15 +138,7 @@ export function renderVariable(store: DisposableStore, commandService: ICommandS if (variable.value && typeof variable.name === 'string') { if (variable.type && displayType) { text += ': '; - //render type - const type = variable.type + ' ='; - if (linkDetector) { - data.type.textContent = ''; - const session = (variable instanceof ExpressionContainer) ? variable.getSession() : undefined; - data.type.appendChild(linkDetector.linkify(type, false, session ? session.root : undefined, true)); - } else { - data.type.textContent = type; - } + data.type.textContent = variable.type + ' ='; } else { text += ' ='; } @@ -275,6 +267,7 @@ export abstract class AbstractExpressionsRenderer implements IT public abstract renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void; protected renderExpressionElement(element: IExpression, node: ITreeNode, data: IExpressionTemplateData): void { + data.currentElement = element; this.renderExpression(node.element, data, createMatches(node.filterData)); if (data.actionBar) { this.renderActionBar!(data.actionBar, element, data); diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index 5700ffea2eb0a..c3191626a327d 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -134,7 +134,7 @@ export class DebugHoverWidget implements IContentWidget { const dataSource = this.instantiationService.createInstance(DebugHoverDataSource); const linkeDetector = this.instantiationService.createInstance(LinkDetector); this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'DebugHover', this.treeContainer, new DebugHoverDelegate(), [ - this.instantiationService.createInstance(VariablesRenderer, linkeDetector, false), + this.instantiationService.createInstance(VariablesRenderer, linkeDetector), this.instantiationService.createInstance(VisualizedVariableRenderer, linkeDetector), ], dataSource, { diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index a37dbf544922b..78caf7f02e628 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -123,10 +123,9 @@ export class VariablesView extends ViewPane { container.classList.add('debug-variables'); const treeContainer = renderViewTree(container); const linkDetector = this.instantiationService.createInstance(LinkDetector); - const displayType: boolean = this.configurationService.getValue('debug').showVariableTypes; this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(), [ - this.instantiationService.createInstance(VariablesRenderer, linkDetector, displayType), + this.instantiationService.createInstance(VariablesRenderer, linkDetector), this.instantiationService.createInstance(VisualizedVariableRenderer, linkDetector), new ScopesRenderer(), new ScopeErrorRenderer(), @@ -457,7 +456,6 @@ export class VisualizedVariableRenderer extends AbstractExpressionsRenderer { public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { data.elementDisposable.clear(); - data.currentElement = node.element; super.renderExpressionElement(node.element, node, data); } @@ -526,7 +524,6 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { constructor( private readonly linkDetector: LinkDetector, - private displayType: boolean, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IDebugVisualizerService private readonly visualization: IDebugVisualizerService, @@ -545,15 +542,14 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { } protected renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void { - renderVariable(data.elementDisposable, this.commandService, this.hoverService, expression as Variable, data, true, highlights, this.linkDetector, this.displayType); + const showType = this.configurationService.getValue('debug').showVariableTypes; + renderVariable(data.elementDisposable, this.commandService, this.hoverService, expression as Variable, data, true, highlights, this.linkDetector, showType); } public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { data.elementDisposable.clear(); - data.currentElement = node.element; data.elementDisposable.add(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('debug.showVariableTypes')) { - this.displayType = this.configurationService.getValue('debug').showVariableTypes; super.renderExpressionElement(node.element, node, data); } })); diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index afa73194fdb1c..60024437fb3eb 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -86,14 +86,13 @@ export class WatchExpressionsView extends ViewPane { this.element.classList.add('debug-pane'); container.classList.add('debug-watch'); const treeContainer = renderViewTree(container); - const watchDisplayType: boolean = this.configurationService.getValue('debug').showVariableTypes; - const expressionsRenderer = this.instantiationService.createInstance(WatchExpressionsRenderer, watchDisplayType); + const expressionsRenderer = this.instantiationService.createInstance(WatchExpressionsRenderer); const linkDetector = this.instantiationService.createInstance(LinkDetector); this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'WatchExpressions', treeContainer, new WatchExpressionsDelegate(), [ expressionsRenderer, - this.instantiationService.createInstance(VariablesRenderer, linkDetector, watchDisplayType), + this.instantiationService.createInstance(VariablesRenderer, linkDetector), this.instantiationService.createInstance(VisualizedVariableRenderer, linkDetector), ], this.instantiationService.createInstance(WatchExpressionsDataSource), { @@ -280,7 +279,6 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { static readonly ID = 'watchexpression'; constructor( - private watchDisplayType: boolean, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IDebugService debugService: IDebugService, @@ -297,10 +295,8 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { public override renderElement(node: ITreeNode, index: number, data: IExpressionTemplateData): void { data.elementDisposable.clear(); - data.currentElement = node.element; data.elementDisposable.add(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('debug.showVariableTypes')) { - this.watchDisplayType = this.configurationService.getValue('debug').showVariableTypes; super.renderExpressionElement(node.element, node, data); } })); @@ -310,7 +306,8 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { protected renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void { let text: string; data.type.textContent = ''; - if (this.watchDisplayType && expression.type) { + const showType = this.configurationService.getValue('debug').showVariableTypes; + if (showType && expression.type) { text = typeof expression.value === 'string' ? `${expression.name}: ` : expression.name; //render type data.type.textContent = expression.type + ' ='; @@ -320,7 +317,7 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { let title: string; if (expression.type) { - if (this.watchDisplayType) { + if (showType) { title = `${expression.name}`; } else { title = expression.type === expression.value ? diff --git a/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts b/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts index 8da0cbd3f3bfc..5eb511bc678d0 100644 --- a/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/variablesView.test.ts @@ -17,6 +17,8 @@ import { NullHoverService } from 'vs/platform/hover/test/browser/nullHoverServic import { IDebugService, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; import { VariablesRenderer } from 'vs/workbench/contrib/debug/browser/variablesView'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; const $ = dom.$; @@ -80,6 +82,7 @@ suite('Debug - Variable Debug View', () => { let variablesRenderer: VariablesRenderer; let instantiationService: TestInstantiationService; let linkDetector: LinkDetector; + let configurationService: TestConfigurationService; setup(() => { instantiationService = workbenchInstantiationService(undefined, disposables); @@ -92,12 +95,24 @@ suite('Debug - Variable Debug View', () => { }); test('variable expressions with display type', () => { - variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector, true); + configurationService = new TestConfigurationService({ + debug: { + showVariableTypes: true + } + }); + instantiationService.stub(IConfigurationService, configurationService); + variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector); assertVariable(disposables, variablesRenderer, true); }); test('variable expressions', () => { - variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector, false); + configurationService = new TestConfigurationService({ + debug: { + showVariableTypes: false + } + }); + instantiationService.stub(IConfigurationService, configurationService); + variablesRenderer = instantiationService.createInstance(VariablesRenderer, linkDetector); assertVariable(disposables, variablesRenderer, false); }); }); diff --git a/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts b/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts index 781f734e82660..220e79d6a8485 100644 --- a/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/watchExpressionView.test.ts @@ -16,6 +16,8 @@ import { workbenchInstantiationService } from 'vs/workbench/test/browser/workben import { IHoverService } from 'vs/platform/hover/browser/hover'; import { NullHoverService } from 'vs/platform/hover/test/browser/nullHoverService'; import { IDebugService, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; const $ = dom.$; function assertWatchVariable(disposables: Pick, watchExpressionsRenderer: WatchExpressionsRenderer, displayType: boolean) { @@ -77,6 +79,7 @@ suite('Debug - Watch Debug View', () => { const disposables = ensureNoDisposablesAreLeakedInTestSuite(); let watchExpressionsRenderer: WatchExpressionsRenderer; let instantiationService: TestInstantiationService; + let configurationService: TestConfigurationService; setup(() => { instantiationService = workbenchInstantiationService(undefined, disposables); @@ -85,16 +88,27 @@ suite('Debug - Watch Debug View', () => { debugService.getViewModel = () => { focusedStackFrame: undefined, getSelectedExpression: () => undefined }; debugService.getViewModel().getSelectedExpression = () => undefined; instantiationService.stub(IDebugService, debugService); - }); test('watch expressions with display type', () => { - watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer, true); + configurationService = new TestConfigurationService({ + debug: { + showVariableTypes: true + } + }); + instantiationService.stub(IConfigurationService, configurationService); + watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer); assertWatchVariable(disposables, watchExpressionsRenderer, true); }); test('watch expressions', () => { - watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer, false); + configurationService = new TestConfigurationService({ + debug: { + showVariableTypes: false + } + }); + instantiationService.stub(IConfigurationService, configurationService); + watchExpressionsRenderer = instantiationService.createInstance(WatchExpressionsRenderer); assertWatchVariable(disposables, watchExpressionsRenderer, false); }); }); From 52c722c7bbec270a00c0ba530508a82bcddb0f79 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 7 Jun 2024 13:20:08 -0700 Subject: [PATCH 166/755] adopt chat agent in terminal chat (#214499) --- .../inlineChat/browser/inlineChatWidget.ts | 10 +- .../chat/browser/terminalChat.ts | 13 - .../chat/browser/terminalChatActions.ts | 53 +-- .../chat/browser/terminalChatController.ts | 336 ++++++++---------- .../chat/browser/terminalChatWidget.ts | 10 +- 5 files changed, 183 insertions(+), 239 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 4f704f93e9f13..f80db1f22e482 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -448,12 +448,12 @@ export class InlineChatWidget { if (!viewModel) { return undefined; } - for (const item of viewModel.getItems()) { - if (isResponseVM(item)) { - return viewModel.codeBlockModelCollection.get(viewModel.sessionId, item, codeBlockIndex)?.model; - } + const items = viewModel.getItems().filter(i => isResponseVM(i)); + if (!items.length) { + return; } - return undefined; + const item = items[items.length - 1]; + return viewModel.codeBlockModelCollection.get(viewModel.sessionId, item, codeBlockIndex)?.model; } get responseContent(): string | undefined { diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts index bf95499ee325a..094c3731bf60d 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts @@ -15,9 +15,6 @@ export const enum TerminalChatCommandId { Discard = 'workbench.action.terminal.chat.discard', MakeRequest = 'workbench.action.terminal.chat.makeRequest', Cancel = 'workbench.action.terminal.chat.cancel', - FeedbackHelpful = 'workbench.action.terminal.chat.feedbackHelpful', - FeedbackUnhelpful = 'workbench.action.terminal.chat.feedbackUnhelpful', - FeedbackReportIssue = 'workbench.action.terminal.chat.feedbackReportIssue', RunCommand = 'workbench.action.terminal.chat.runCommand', RunFirstCommand = 'workbench.action.terminal.chat.runFirstCommand', InsertCommand = 'workbench.action.terminal.chat.insertCommand', @@ -30,7 +27,6 @@ export const enum TerminalChatCommandId { export const MENU_TERMINAL_CHAT_INPUT = MenuId.for('terminalChatInput'); export const MENU_TERMINAL_CHAT_WIDGET = MenuId.for('terminalChatWidget'); export const MENU_TERMINAL_CHAT_WIDGET_STATUS = MenuId.for('terminalChatWidget.status'); -export const MENU_TERMINAL_CHAT_WIDGET_FEEDBACK = MenuId.for('terminalChatWidget.feedback'); export const MENU_TERMINAL_CHAT_WIDGET_TOOLBAR = MenuId.for('terminalChatWidget.toolbar'); export const enum TerminalChatContextKeyStrings { @@ -61,18 +57,9 @@ export namespace TerminalChatContextKeys { /** Whether the chat input has text */ export const inputHasText = new RawContextKey(TerminalChatContextKeyStrings.ChatInputHasText, false, localize('chatInputHasTextContextKey', "Whether the chat input has text.")); - /** Whether the terminal chat agent has been registered */ - export const agentRegistered = new RawContextKey(TerminalChatContextKeyStrings.ChatAgentRegistered, false, localize('chatAgentRegisteredContextKey', "Whether the terminal chat agent has been registered.")); - /** The chat response contains at least one code block */ export const responseContainsCodeBlock = new RawContextKey(TerminalChatContextKeyStrings.ChatResponseContainsCodeBlock, false, localize('chatResponseContainsCodeBlockContextKey', "Whether the chat response contains a code block.")); /** The chat response contains multiple code blocks */ export const responseContainsMultipleCodeBlocks = new RawContextKey(TerminalChatContextKeyStrings.ChatResponseContainsMultipleCodeBlocks, false, localize('chatResponseContainsMultipleCodeBlocksContextKey', "Whether the chat response contains multiple code blocks.")); - - /** Whether the response supports issue reporting */ - export const responseSupportsIssueReporting = new RawContextKey(TerminalChatContextKeyStrings.ChatResponseSupportsIssueReporting, false, localize('chatResponseSupportsIssueReportingContextKey', "Whether the response supports issue reporting")); - - /** The chat vote, if any for the response, if any */ - export const sessionResponseVote = new RawContextKey(TerminalChatContextKeyStrings.ChatSessionResponseVote, undefined, { type: 'string', description: localize('interactiveSessionResponseVote', "When the response has been voted up, is set to 'up'. When voted down, is set to 'down'. Otherwise an empty string.") }); } diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts index 6b04dac4c5435..87dc3f18ed152 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts @@ -13,7 +13,7 @@ import { CTX_INLINE_CHAT_EMPTY, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_AGE import { isDetachedTerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { registerActiveXtermAction } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; -import { MENU_TERMINAL_CHAT_INPUT, MENU_TERMINAL_CHAT_WIDGET, MENU_TERMINAL_CHAT_WIDGET_FEEDBACK, MENU_TERMINAL_CHAT_WIDGET_STATUS, TerminalChatCommandId, TerminalChatContextKeys } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChat'; +import { MENU_TERMINAL_CHAT_INPUT, MENU_TERMINAL_CHAT_WIDGET, MENU_TERMINAL_CHAT_WIDGET_STATUS, TerminalChatCommandId, TerminalChatContextKeys } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChat'; import { TerminalChatController } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController'; registerActiveXtermAction({ @@ -164,7 +164,6 @@ registerActiveXtermAction({ precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.agentRegistered, TerminalChatContextKeys.responseContainsCodeBlock, TerminalChatContextKeys.responseContainsMultipleCodeBlocks.negate() ), @@ -196,7 +195,6 @@ registerActiveXtermAction({ precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.agentRegistered, TerminalChatContextKeys.responseContainsMultipleCodeBlocks ), icon: Codicon.play, @@ -227,7 +225,6 @@ registerActiveXtermAction({ precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.agentRegistered, TerminalChatContextKeys.responseContainsCodeBlock, TerminalChatContextKeys.responseContainsMultipleCodeBlocks.negate() ), @@ -259,7 +256,6 @@ registerActiveXtermAction({ precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.agentRegistered, TerminalChatContextKeys.responseContainsMultipleCodeBlocks ), keybinding: { @@ -289,7 +285,6 @@ registerActiveXtermAction({ precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.agentRegistered, ), icon: Codicon.commentDiscussion, menu: [{ @@ -319,7 +314,6 @@ registerActiveXtermAction({ precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.agentRegistered, CTX_INLINE_CHAT_EMPTY.negate() ), icon: Codicon.send, @@ -348,7 +342,6 @@ registerActiveXtermAction({ title: localize2('cancelChat', 'Cancel Chat'), precondition: ContextKeyExpr.and( TerminalChatContextKeys.requestActive, - TerminalChatContextKeys.agentRegistered ), icon: Codicon.debugStop, menu: { @@ -366,25 +359,39 @@ registerActiveXtermAction({ }); registerActiveXtermAction({ - id: TerminalChatCommandId.FeedbackReportIssue, - title: localize2('reportIssue', 'Report Issue'), - precondition: ContextKeyExpr.and( - TerminalChatContextKeys.requestActive.negate(), - TerminalChatContextKeys.responseContainsCodeBlock.notEqualsTo(undefined), - TerminalChatContextKeys.responseSupportsIssueReporting - ), - icon: Codicon.report, - menu: [{ - id: MENU_TERMINAL_CHAT_WIDGET_FEEDBACK, - when: ContextKeyExpr.and(TerminalChatContextKeys.responseContainsCodeBlock.notEqualsTo(undefined), TerminalChatContextKeys.responseSupportsIssueReporting), - group: 'inline', - order: 3 - }], + id: TerminalChatCommandId.PreviousFromHistory, + title: localize2('previousFromHitory', 'Previous From History'), + precondition: TerminalChatContextKeys.focused, + keybinding: { + when: TerminalChatContextKeys.focused, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.UpArrow, + }, + + run: (_xterm, _accessor, activeInstance) => { + if (isDetachedTerminalInstance(activeInstance)) { + return; + } + const contr = TerminalChatController.activeChatWidget || TerminalChatController.get(activeInstance); + contr?.populateHistory(true); + } +}); + +registerActiveXtermAction({ + id: TerminalChatCommandId.NextFromHistory, + title: localize2('nextFromHitory', 'Next From History'), + precondition: TerminalChatContextKeys.focused, + keybinding: { + when: TerminalChatContextKeys.focused, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.DownArrow, + }, + run: (_xterm, _accessor, activeInstance) => { if (isDetachedTerminalInstance(activeInstance)) { return; } const contr = TerminalChatController.activeChatWidget || TerminalChatController.get(activeInstance); - contr?.acceptFeedback(); + contr?.populateHistory(false); } }); diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts index 5734afb1b876c..fb9ded6f870cd 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts @@ -4,26 +4,27 @@ *--------------------------------------------------------------------------------------------*/ import type { Terminal as RawXtermTerminal } from '@xterm/xterm'; -import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { Lazy } from 'vs/base/common/lazy'; -import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { GeneratingPhrase, IChatAccessibilityService, IChatCodeBlockContextProviderService, showChatView } from 'vs/workbench/contrib/chat/browser/chat'; -import { ChatAgentLocation, IChatAgentRequest, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { IParsedChatRequest } from 'vs/workbench/contrib/chat/common/chatParserTypes'; -import { ChatUserAction, IChatProgress, IChatService, ChatAgentVoteDirection } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatCodeBlockContextProviderService, showChatView } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatProgress, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { ITerminalContribution, ITerminalInstance, ITerminalService, IXtermTerminal, isDetachedTerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; import { ITerminalProcessManager } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalChatWidget } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { ChatModel, ChatRequestModel, IChatRequestVariableData, IChatResponseModel, getHistoryEntriesFromModel } from 'vs/workbench/contrib/chat/common/chatModel'; +import { ChatModel, IChatResponseModel } from 'vs/workbench/contrib/chat/common/chatModel'; import { TerminalChatContextKeys } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChat'; import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; -import { DeferredPromise } from 'vs/base/common/async'; +import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; +import { assertType } from 'vs/base/common/types'; +import { CancelablePromise, createCancelablePromise, DeferredPromise } from 'vs/base/common/async'; +import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; const enum Message { NONE = 0, @@ -48,6 +49,9 @@ export class TerminalChatController extends Disposable implements ITerminalContr */ static activeChatWidget?: TerminalChatController; + private static _storageKey = 'terminal-inline-chat-history'; + private static _promptHistory: string[] = []; + /** * The chat widget for the controller, this is lazy as we don't want to instantiate it until * both it's required and xterm is ready. @@ -61,17 +65,11 @@ export class TerminalChatController extends Disposable implements ITerminalContr get chatWidget(): TerminalChatWidget | undefined { return this._chatWidget?.value; } private readonly _requestActiveContextKey: IContextKey; - private readonly _terminalAgentRegisteredContextKey: IContextKey; private readonly _responseContainsCodeBlockContextKey: IContextKey; private readonly _responseContainsMulitpleCodeBlocksContextKey: IContextKey; - private readonly _responseSupportsIssueReportingContextKey: IContextKey; - private readonly _sessionResponseVoteContextKey: IContextKey; private _messages = this._store.add(new Emitter()); - private _currentRequest: ChatRequestModel | undefined; - - private _lastInput: string | undefined; private _lastResponseContent: string | undefined; get lastResponseContent(): string | undefined { return this._lastResponseContent; @@ -81,7 +79,6 @@ export class TerminalChatController extends Disposable implements ITerminalContr get onDidHide() { return this.chatWidget?.onDidHide ?? Event.None; } private _terminalAgentName = 'terminal'; - private _terminalAgentId: string | undefined; private readonly _model: MutableDisposable = this._register(new MutableDisposable()); @@ -89,31 +86,32 @@ export class TerminalChatController extends Disposable implements ITerminalContr return this._chatWidget?.value.inlineChatWidget.scopedContextKeyService ?? this._contextKeyService; } + private _sessionCtor: CancelablePromise | undefined; + private _historyOffset: number = -1; + private _historyCandidate: string = ''; + private _historyUpdate: (prompt: string) => void; + + private _currentRequestId: string | undefined; + private _activeRequestCts?: CancellationTokenSource; + constructor( private readonly _instance: ITerminalInstance, processManager: ITerminalProcessManager, widgetManager: TerminalWidgetManager, @ITerminalService private readonly _terminalService: ITerminalService, @IInstantiationService private readonly _instantiationService: IInstantiationService, - @IChatAgentService private readonly _chatAgentService: IChatAgentService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, - @IChatAccessibilityService private readonly _chatAccessibilityService: IChatAccessibilityService, @IChatService private readonly _chatService: IChatService, @IChatCodeBlockContextProviderService private readonly _chatCodeBlockContextProviderService: IChatCodeBlockContextProviderService, @IViewsService private readonly _viewsService: IViewsService, + @IStorageService private readonly _storageService: IStorageService, ) { super(); this._requestActiveContextKey = TerminalChatContextKeys.requestActive.bindTo(this._contextKeyService); - this._terminalAgentRegisteredContextKey = TerminalChatContextKeys.agentRegistered.bindTo(this._contextKeyService); this._responseContainsCodeBlockContextKey = TerminalChatContextKeys.responseContainsCodeBlock.bindTo(this._contextKeyService); this._responseContainsMulitpleCodeBlocksContextKey = TerminalChatContextKeys.responseContainsMultipleCodeBlocks.bindTo(this._contextKeyService); - this._responseSupportsIssueReportingContextKey = TerminalChatContextKeys.responseSupportsIssueReporting.bindTo(this._contextKeyService); - this._sessionResponseVoteContextKey = TerminalChatContextKeys.sessionResponseVote.bindTo(this._contextKeyService); - if (!this.initTerminalAgent()) { - this._register(this._chatAgentService.onDidChangeAgents(() => this.initTerminalAgent())); - } this._register(this._chatCodeBlockContextProviderService.registerProvider({ getCodeBlockContext: (editor) => { if (!editor || !this._chatWidget?.hasValue || !this.hasFocus()) { @@ -128,34 +126,17 @@ export class TerminalChatController extends Disposable implements ITerminalContr } }, 'terminal')); - // TODO - // This is glue/debt that's needed while ChatModel isn't yet adopted. The chat model uses - // a default chat model (unless configured) and feedback is reported against that one. This - // code forwards the feedback to an actual registered provider - this._register(this._chatService.onDidPerformUserAction(e => { - // only forward feedback from the inline chat widget default model - if ( - this._chatWidget?.rawValue?.inlineChatWidget.usesDefaultChatModel - && e.sessionId === this._chatWidget?.rawValue?.inlineChatWidget.getChatModel().sessionId - ) { - if (e.action.kind === 'bug') { - this.acceptFeedback(undefined); - } else if (e.action.kind === 'vote') { - this.acceptFeedback(e.action.direction === ChatAgentVoteDirection.Up); - } + TerminalChatController._promptHistory = JSON.parse(this._storageService.get(TerminalChatController._storageKey, StorageScope.PROFILE, '[]')); + this._historyUpdate = (prompt: string) => { + const idx = TerminalChatController._promptHistory.indexOf(prompt); + if (idx >= 0) { + TerminalChatController._promptHistory.splice(idx, 1); } - })); - } - - private initTerminalAgent(): boolean { - const terminalAgent = this._chatAgentService.getAgentsByName(this._terminalAgentName)[0]; - if (terminalAgent) { - this._terminalAgentId = terminalAgent.id; - this._terminalAgentRegisteredContextKey.set(true); - return true; - } - - return false; + TerminalChatController._promptHistory.unshift(prompt); + this._historyOffset = -1; + this._historyCandidate = ''; + this._storageService.store(TerminalChatController._storageKey, JSON.stringify(TerminalChatController._promptHistory), StorageScope.PROFILE, StorageTarget.USER); + }; } xtermReady(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void { @@ -178,41 +159,17 @@ export class TerminalChatController extends Disposable implements ITerminalContr }); } - acceptFeedback(helpful?: boolean): void { - const model = this._model.value; - if (!this._currentRequest || !model) { - return; - } - let action: ChatUserAction; - if (helpful === undefined) { - action = { kind: 'bug' }; - } else { - this._sessionResponseVoteContextKey.set(helpful ? 'up' : 'down'); - action = { kind: 'vote', direction: helpful ? ChatAgentVoteDirection.Up : ChatAgentVoteDirection.Down }; - } - // TODO:extract into helper method - for (const request of model.getRequests()) { - if (request.response?.response.value || request.response?.result) { - this._chatService.notifyUserAction({ - sessionId: request.session.sessionId, - requestId: request.id, - agentId: request.response?.agent?.id, - result: request.response?.result, - action - }); - } - } - this._chatWidget?.value.inlineChatWidget.updateStatus('Thank you for your feedback!', { resetAfter: 1250 }); - } + private async _createSession(): Promise { + this._sessionCtor = createCancelablePromise(async token => { + if (!this._model.value) { + this._model.value = this._chatService.startSession(ChatAgentLocation.Terminal, token); - cancel(): void { - if (this._currentRequest) { - this._model.value?.cancelRequest(this._currentRequest); - } - this._requestActiveContextKey.set(false); - this._chatWidget?.value.inlineChatWidget.updateProgress(false); - this._chatWidget?.value.inlineChatWidget.updateInfo(''); - this._chatWidget?.value.inlineChatWidget.updateToolbar(true); + if (!this._model.value) { + throw new Error('Failed to start chat session'); + } + } + }); + this._register(toDisposable(() => this._sessionCtor?.cancel())); } private _forcedPlaceholder: string | undefined = undefined; @@ -239,112 +196,65 @@ export class TerminalChatController extends Disposable implements ITerminalContr } clear(): void { - if (this._currentRequest) { - this._model.value?.cancelRequest(this._currentRequest); - } + this.cancel(); this._model.clear(); - this._chatWidget?.rawValue?.hide(); - this._chatWidget?.rawValue?.setValue(undefined); this._responseContainsCodeBlockContextKey.reset(); - this._sessionResponseVoteContextKey.reset(); this._requestActiveContextKey.reset(); + this._chatWidget?.value.hide(); + this._chatWidget?.value.setValue(undefined); } async acceptInput(): Promise { - if (!this._model.value) { - this._model.value = this._chatService.startSession(ChatAgentLocation.Terminal, CancellationToken.None); - if (!this._model.value) { - throw new Error('Could not start chat session'); - } - } - this._messages.fire(Message.ACCEPT_INPUT); - const model = this._model.value; - - this._lastInput = this._chatWidget?.value?.input(); - if (!this._lastInput) { + assertType(this._chatWidget); + assertType(this._model.value); + const lastInput = this._chatWidget.value.inlineChatWidget.value; + if (!lastInput) { return; } - - const responseCreated = new DeferredPromise(); - let responseCreatedComplete = false; - const completeResponseCreated = () => { - if (!responseCreatedComplete && this._currentRequest?.response) { - responseCreated.complete(this._currentRequest.response); - responseCreatedComplete = true; - } - }; - - const accessibilityRequestId = this._chatAccessibilityService.acceptRequest(); + const model = this._model.value; + this._chatWidget.value.inlineChatWidget.setChatModel(model); + this._historyUpdate(lastInput); + this._activeRequestCts?.cancel(); + this._activeRequestCts = new CancellationTokenSource(); + const store = new DisposableStore(); this._requestActiveContextKey.set(true); - const cancellationToken = new CancellationTokenSource().token; let responseContent = ''; - const progressCallback = (progress: IChatProgress) => { - if (cancellationToken.isCancellationRequested) { - return; - } - - if (progress.kind === 'markdownContent') { - responseContent += progress.content.value; - } - if (this._currentRequest) { - model.acceptResponseProgress(this._currentRequest, progress); - completeResponseCreated(); - } - }; - - await model.waitForInitialization(); - this._chatWidget?.value.addToHistory(this._lastInput); - const request: IParsedChatRequest = { - text: this._lastInput, - parts: [] - }; - const requestVarData: IChatRequestVariableData = { - variables: [] - }; - this._currentRequest = model.addRequest(request, requestVarData, 0); - completeResponseCreated(); - const requestProps: IChatAgentRequest = { - sessionId: model.sessionId, - requestId: this._currentRequest!.id, - agentId: this._terminalAgentId!, - message: this._lastInput, - variables: { variables: [] }, - location: ChatAgentLocation.Terminal - }; + const response = await this._chatWidget.value.inlineChatWidget.chatWidget.acceptInput(lastInput); + this._currentRequestId = response?.requestId; + const responsePromise = new DeferredPromise(); try { - const task = this._chatAgentService.invokeAgent(this._terminalAgentId!, requestProps, progressCallback, getHistoryEntriesFromModel(model, this._terminalAgentId!), cancellationToken); - this._chatWidget?.value.inlineChatWidget.updateChatMessage(undefined); - this._chatWidget?.value.inlineChatWidget.updateProgress(true); - this._chatWidget?.value.inlineChatWidget.updateInfo(GeneratingPhrase + '\u2026'); - await task; - } catch (e) { - - } finally { - this._requestActiveContextKey.set(false); - this._chatWidget?.value.inlineChatWidget.updateProgress(false); - this._chatWidget?.value.inlineChatWidget.updateInfo(''); - this._chatWidget?.value.inlineChatWidget.updateToolbar(true); - if (this._currentRequest) { - model.completeResponse(this._currentRequest); - completeResponseCreated(); - } - this._lastResponseContent = responseContent; - if (this._currentRequest) { - this._chatAccessibilityService.acceptResponse(responseContent, accessibilityRequestId); - const containsCode = responseContent.includes('```'); - this._chatWidget?.value.inlineChatWidget.updateChatMessage({ message: new MarkdownString(responseContent), requestId: this._currentRequest.id }, false, containsCode); - const firstCodeBlock = await this.chatWidget?.inlineChatWidget.getCodeBlockInfo(0); - const secondCodeBlock = await this.chatWidget?.inlineChatWidget.getCodeBlockInfo(1); - this._responseContainsCodeBlockContextKey.set(!!firstCodeBlock); - this._responseContainsMulitpleCodeBlocksContextKey.set(!!secondCodeBlock); - this._chatWidget?.value.inlineChatWidget.updateToolbar(true); - } - const supportIssueReporting = this._currentRequest?.response?.agent?.metadata?.supportIssueReporting; - if (supportIssueReporting !== undefined) { - this._responseSupportsIssueReportingContextKey.set(supportIssueReporting); + this._requestActiveContextKey.set(true); + if (response) { + store.add(response.onDidChange(async () => { + responseContent += response.response.value; + this._chatWidget?.value.inlineChatWidget.updateProgress(true); + if (response.isCanceled) { + this._requestActiveContextKey.set(false); + responsePromise.complete(undefined); + return; + } + if (response.isComplete) { + this._requestActiveContextKey.set(false); + this._requestActiveContextKey.set(false); + const containsCode = responseContent.includes('```'); + this._chatWidget!.value.inlineChatWidget.updateChatMessage({ message: new MarkdownString(responseContent), requestId: response!.requestId }, false, containsCode); + const firstCodeBlock = await this.chatWidget?.inlineChatWidget.getCodeBlockInfo(0); + const secondCodeBlock = await this.chatWidget?.inlineChatWidget.getCodeBlockInfo(1); + this._responseContainsCodeBlockContextKey.set(!!firstCodeBlock); + this._responseContainsMulitpleCodeBlocksContextKey.set(!!secondCodeBlock); + this._chatWidget?.value.inlineChatWidget.updateToolbar(true); + this._chatWidget?.value.inlineChatWidget.updateProgress(false); + responsePromise.complete(response); + } + })); } + await responsePromise.p; + return response; + } catch { + return; + } finally { + store.dispose(); } - return responseCreated.p; } updateInput(text: string, selectAll = true): void { @@ -369,6 +279,47 @@ export class TerminalChatController extends Disposable implements ITerminalContr return !!this._chatWidget?.rawValue?.hasFocus() ?? false; } + populateHistory(up: boolean) { + if (!this._chatWidget?.value) { + return; + } + + const len = TerminalChatController._promptHistory.length; + if (len === 0) { + return; + } + + if (this._historyOffset === -1) { + // remember the current value + this._historyCandidate = this._chatWidget.value.inlineChatWidget.value; + } + + const newIdx = this._historyOffset + (up ? 1 : -1); + if (newIdx >= len) { + // reached the end + return; + } + + let entry: string; + if (newIdx < 0) { + entry = this._historyCandidate; + this._historyOffset = -1; + } else { + entry = TerminalChatController._promptHistory[newIdx]; + this._historyOffset = newIdx; + } + + this._chatWidget.value.inlineChatWidget.value = entry; + this._chatWidget.value.inlineChatWidget.selectAll(); + } + + cancel(): void { + this._sessionCtor?.cancel(); + this._sessionCtor = undefined; + this._activeRequestCts?.cancel(); + this._requestActiveContextKey.set(false); + } + async acceptCommand(shouldExecute: boolean): Promise { const code = await this.chatWidget?.inlineChatWidget.getCodeBlockInfo(0); if (!code) { @@ -377,18 +328,22 @@ export class TerminalChatController extends Disposable implements ITerminalContr this._chatWidget?.value.acceptCommand(code.textEditorModel.getValue(), shouldExecute); } - reveal(): void { + async reveal(): Promise { + await this._createSession(); this._chatWidget?.value.reveal(); + this._chatWidget?.value.focus(); } async viewInChat(): Promise { + //TODO: is this necessary? better way? const widget = await showChatView(this._viewsService); - const request = this._currentRequest; - if (!widget || !request?.response) { + const currentRequest = this.chatWidget?.inlineChatWidget.chatWidget.viewModel?.model.getRequests().find(r => r.id === this._currentRequestId); + if (!widget || !currentRequest?.response) { return; } + const message: IChatProgress[] = []; - for (const item of request.response.response.value) { + for (const item of currentRequest.response.response.value) { if (item.kind === 'textEditGroup') { for (const group of item.edits) { message.push({ @@ -404,24 +359,15 @@ export class TerminalChatController extends Disposable implements ITerminalContr this._chatService.addCompleteRequest(widget!.viewModel!.sessionId, // DEBT: Add hardcoded agent name until its removed - `@${this._terminalAgentName} ${request.message.text}`, - request.variableData, - request.attempt, + `@${this._terminalAgentName} ${currentRequest.message.text}`, + currentRequest.variableData, + currentRequest.attempt, { message, - result: request.response!.result, - followups: request.response!.followups + result: currentRequest.response!.result, + followups: currentRequest.response!.followups }); widget.focusLastMessage(); this._chatWidget?.rawValue?.hide(); } - - // TODO: Move to register calls, don't override - override dispose() { - if (this._currentRequest) { - this._model.value?.cancelRequest(this._currentRequest); - } - super.dispose(); - this.clear(); - } } diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index 8b9aedb6bc917..b27463b823264 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -16,7 +16,7 @@ import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IChatProgress } from 'vs/workbench/contrib/chat/common/chatService'; import { InlineChatWidget } from 'vs/workbench/contrib/inlineChat/browser/inlineChatWidget'; import { ITerminalInstance, type IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { MENU_TERMINAL_CHAT_INPUT, MENU_TERMINAL_CHAT_WIDGET, MENU_TERMINAL_CHAT_WIDGET_FEEDBACK, MENU_TERMINAL_CHAT_WIDGET_STATUS, TerminalChatCommandId, TerminalChatContextKeys } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChat'; +import { MENU_TERMINAL_CHAT_INPUT, MENU_TERMINAL_CHAT_WIDGET, MENU_TERMINAL_CHAT_WIDGET_STATUS, TerminalChatCommandId, TerminalChatContextKeys } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChat'; import { TerminalStickyScrollContribution } from 'vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollContribution'; const enum Constants { @@ -72,7 +72,6 @@ export class TerminalChatWidget extends Disposable { } } }, - feedbackMenuId: MENU_TERMINAL_CHAT_WIDGET_FEEDBACK, telemetrySource: 'terminal-inline-chat', rendererOptions: { editableCodeBlock: true } } @@ -80,6 +79,7 @@ export class TerminalChatWidget extends Disposable { this._register(Event.any( this._inlineChatWidget.onDidChangeHeight, this._instance.onDimensionsChanged, + this._inlineChatWidget.chatWidget.onDidChangeContentHeight, Event.debounce(this._xterm.raw.onCursorMove, () => void 0, MicrotaskDelay), )(() => this._relayout())); @@ -155,11 +155,15 @@ export class TerminalChatWidget extends Disposable { if (!terminalWrapperHeight) { return; } - if (top > terminalWrapperHeight - widgetHeight) { + if (top > terminalWrapperHeight - widgetHeight && terminalWrapperHeight - widgetHeight > 0) { this._setTerminalOffset(top - (terminalWrapperHeight - widgetHeight)); } else { this._setTerminalOffset(undefined); } + if (terminalWrapperHeight - widgetHeight < 0) { + this._dimension = new Dimension(this._dimension!.width, terminalWrapperHeight - top - 20); + this._inlineChatWidget.layout(this._dimension!); + } } private _getTerminalWrapperHeight(): number | undefined { From b814ff2c68d3445b804e4ee45053785be76ac2f1 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 7 Jun 2024 22:29:47 +0200 Subject: [PATCH 167/755] SCM - fix regression introduced due to moving code (#214638) --- src/vs/workbench/contrib/scm/browser/activity.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index a2feda972bb45..9cf128b5710da 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -32,7 +32,7 @@ export class SCMActivityCountBadgeController extends Disposable implements IWork Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository), () => this.scmService.repositories); - private readonly _focusedRepository = observableFromEvent( + private readonly _focusedRepository = observableFromEvent( this.scmViewService.onDidFocusRepository, () => this.scmViewService.focusedRepository ? Object.create(this.scmViewService.focusedRepository) : undefined); @@ -51,11 +51,12 @@ export class SCMActivityCountBadgeController extends Disposable implements IWork private readonly _activeRepository = derivedObservableWithCache(this, (reader, lastValue) => { const focusedRepository = this._focusedRepository.read(reader); + const activeEditorRepository = this._activeEditorRepository.read(reader); + if (focusedRepository && focusedRepository.id !== lastValue?.id) { return focusedRepository; } - const activeEditorRepository = this._activeEditorRepository.read(reader); if (activeEditorRepository && activeEditorRepository.id !== lastValue?.id) { return activeEditorRepository; } From dc9701399307b9e4919116c82dd30eda86deccc2 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Fri, 7 Jun 2024 13:44:17 -0700 Subject: [PATCH 168/755] server: fix socket pipe disconnections not getting detected (#214640) Fixes #211462 --- src/vs/base/parts/ipc/node/ipc.net.ts | 14 +++++++++++ .../base/parts/ipc/test/node/ipc.net.test.ts | 25 +++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index 7d57ca6cb4792..0f3dd812b6d5a 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -17,6 +17,15 @@ import { generateUuid } from 'vs/base/common/uuid'; import { ClientConnectionEvent, IPCServer } from 'vs/base/parts/ipc/common/ipc'; import { ChunkStream, Client, ISocket, Protocol, SocketCloseEvent, SocketCloseEventType, SocketDiagnostics, SocketDiagnosticsEventType } from 'vs/base/parts/ipc/common/ipc.net'; +/** + * Maximum time to wait for a 'close' event to fire after the socket stream + * ends. For unix domain sockets, the close event may not fire consistently + * due to what appears to be a Node.js bug. + * + * @see https://github.com/microsoft/vscode/issues/211462#issuecomment-2155471996 + */ +const socketEndTimeoutMs = 30_000; + export class NodeSocket implements ISocket { public readonly debugLabel: string; @@ -51,15 +60,20 @@ export class NodeSocket implements ISocket { }; this.socket.on('error', this._errorListener); + let endTimeoutHandle: NodeJS.Timeout | undefined; this._closeListener = (hadError: boolean) => { this.traceSocketEvent(SocketDiagnosticsEventType.Close, { hadError }); this._canWrite = false; + if (endTimeoutHandle) { + clearTimeout(endTimeoutHandle); + } }; this.socket.on('close', this._closeListener); this._endListener = () => { this.traceSocketEvent(SocketDiagnosticsEventType.NodeEndReceived); this._canWrite = false; + endTimeoutHandle = setTimeout(() => socket.destroy(), socketEndTimeoutMs); }; this.socket.on('end', this._endListener); } diff --git a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts index 7186ee6b0b958..bac8dc992f640 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; +import sinon from 'sinon'; import { EventEmitter } from 'events'; import { AddressInfo, connect, createServer, Server, Socket } from 'net'; import { tmpdir } from 'os'; import { Barrier, timeout } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { ILoadEstimator, PersistentProtocol, Protocol, ProtocolConstants, SocketCloseEvent, SocketDiagnosticsEventType } from 'vs/base/parts/ipc/common/ipc.net'; import { createRandomIPCHandle, createStaticIPCHandle, NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; import { flakySuite } from 'vs/base/test/common/testUtils'; @@ -134,7 +135,7 @@ class Ether { suite('IPC, Socket Protocol', () => { - ensureNoDisposablesAreLeakedInTestSuite(); + const ds = ensureNoDisposablesAreLeakedInTestSuite(); let ether: Ether; @@ -186,6 +187,26 @@ suite('IPC, Socket Protocol', () => { b.dispose(); }); + + + test('issue #211462: destroy socket after end timeout', async () => { + const socket = new EventEmitter(); + Object.assign(socket, { destroy: () => socket.emit('close') }); + const protocol = ds.add(new Protocol(new NodeSocket(socket as Socket))); + + const disposed = sinon.stub(); + const timers = sinon.useFakeTimers(); + + ds.add(toDisposable(() => timers.restore())); + ds.add(protocol.onDidDispose(disposed)); + + socket.emit('end'); + assert.ok(!disposed.called); + timers.tick(29_999); + assert.ok(!disposed.called); + timers.tick(1); + assert.ok(disposed.called); + }); }); suite('PersistentProtocol reconnection', () => { From 30f0c1475d9acf9d843f70be778f04d18ae5f4c3 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 7 Jun 2024 15:12:31 -0700 Subject: [PATCH 169/755] TextBuffer API: getNearestChunk to support incremental tree sitter parsing. (#214648) --- src/vs/editor/common/model.ts | 5 +++++ .../pieceTreeTextBuffer/pieceTreeBase.ts | 21 +++++++++++++++++++ .../pieceTreeTextBuffer.ts | 4 ++++ .../pieceTreeTextBuffer.test.ts | 16 ++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index e21aa7d600c7a..134234bbfe59b 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -1431,6 +1431,11 @@ export interface IReadonlyTextBuffer { getLineFirstNonWhitespaceColumn(lineNumber: number): number; getLineLastNonWhitespaceColumn(lineNumber: number): number; findMatchesLineByLine(searchRange: Range, searchData: SearchData, captureMatches: boolean, limitResultCount: number): FindMatch[]; + + /** + * Get nearest chunk of text after `offset` in the text buffer. + */ + getNearestChunk(offset: number): string; } /** diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts index b75d0d75a70ef..24f90651f9502 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts @@ -666,6 +666,27 @@ export class PieceTreeBase { return this._getCharCode(nodePos); } + public getNearestChunk(offset: number): string { + const nodePos = this.nodeAt(offset); + if (nodePos.remainder === nodePos.node.piece.length) { + // the offset is at the head of next node. + const matchingNode = nodePos.node.next(); + if (!matchingNode || matchingNode === SENTINEL) { + return ''; + } + + const buffer = this._buffers[matchingNode.piece.bufferIndex]; + const startOffset = this.offsetInBuffer(matchingNode.piece.bufferIndex, matchingNode.piece.start); + return buffer.buffer.substring(startOffset, startOffset + matchingNode.piece.length); + } else { + const buffer = this._buffers[nodePos.node.piece.bufferIndex]; + const startOffset = this.offsetInBuffer(nodePos.node.piece.bufferIndex, nodePos.node.piece.start); + const targetOffset = startOffset + nodePos.remainder; + const targetEnd = startOffset + nodePos.node.piece.length; + return buffer.buffer.substring(targetOffset, targetEnd); + } + } + public findMatchesInNode(node: TreeNode, searcher: Searcher, startLineNumber: number, startColumn: number, startCursor: BufferCursor, endCursor: BufferCursor, searchData: SearchData, captureMatches: boolean, limitResultCount: number, resultLen: number, result: FindMatch[]) { const buffer = this._buffers[node.piece.bufferIndex]; const startOffsetInBuffer = this.offsetInBuffer(node.piece.bufferIndex, node.piece.start); diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts index 12d7e0b098179..a369298c0c97b 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts @@ -167,6 +167,10 @@ export class PieceTreeTextBuffer extends Disposable implements ITextBuffer { return this.getValueLengthInRange(range, eol); } + public getNearestChunk(offset: number): string { + return this._pieceTree.getNearestChunk(offset); + } + public getLength(): number { return this._pieceTree.getLength(); } diff --git a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts index 67a70b1bbb2ae..01cc7cb6ef60f 100644 --- a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts +++ b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts @@ -1817,6 +1817,22 @@ suite('buffer api', () => { assert.strictEqual(pieceTable.getLineCharCode(2, 3), 'e'.charCodeAt(0), 'e'); assert.strictEqual(pieceTable.getLineCharCode(2, 4), '2'.charCodeAt(0), '2'); }); + + test('getNearestChunk', () => { + const pieceTree = createTextBuffer(['012345678']); + ds.add(pieceTree); + const pt = pieceTree.getPieceTree(); + + pt.insert(3, 'ABC'); + assert.equal(pt.getLineContent(1), '012ABC345678'); + assert.equal(pt.getNearestChunk(3), 'ABC'); + assert.equal(pt.getNearestChunk(6), '345678'); + + pt.delete(9, 1); + assert.equal(pt.getLineContent(1), '012ABC34578'); + assert.equal(pt.getNearestChunk(6), '345'); + assert.equal(pt.getNearestChunk(9), '78'); + }); }); suite('search offset cache', () => { From 8a101cd59cad6808dee2d6eff971e14f4af1a019 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:15:25 -0700 Subject: [PATCH 170/755] Fix editor context extraction for task commands (#214650) --- src/vs/workbench/browser/parts/editor/editorCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index c8670de6fb066..a8ba531496eeb 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -31,7 +31,7 @@ import { ActiveGroupEditorsByMostRecentlyUsedQuickAccess } from 'vs/workbench/br import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; import { TextDiffEditor } from 'vs/workbench/browser/parts/editor/textDiffEditor'; import { ActiveEditorCanSplitInGroupContext, ActiveEditorGroupEmptyContext, ActiveEditorGroupLockedContext, ActiveEditorStickyContext, MultipleEditorGroupsContext, SideBySideEditorActiveContext, TextCompareEditorActiveContext } from 'vs/workbench/common/contextkeys'; -import { CloseDirection, EditorInputCapabilities, EditorsOrder, IEditorCommandsContext, IEditorIdentifier, IResourceDiffEditorInput, IUntitledTextResourceEditorInput, IVisibleEditorPane, isEditorIdentifier, isEditorInputWithOptionsAndGroup } from 'vs/workbench/common/editor'; +import { CloseDirection, EditorInputCapabilities, EditorsOrder, IEditorCommandsContext, IEditorIdentifier, IResourceDiffEditorInput, IUntitledTextResourceEditorInput, IVisibleEditorPane, isEditorCommandsContext, isEditorIdentifier, isEditorInputWithOptionsAndGroup } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; @@ -1404,7 +1404,7 @@ export function getCommandsContext(accessor: ServicesAccessor, resourceOrContext const isUri = URI.isUri(resourceOrContext); const editorCommandsContext = isUri ? context : resourceOrContext ? resourceOrContext : context; - if (editorCommandsContext) { + if (editorCommandsContext && isEditorCommandsContext(editorCommandsContext)) { return editorCommandsContext; } From 069408ab2c3646bb2e6f895edd4d89f2fc30197c Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 7 Jun 2024 15:21:33 -0700 Subject: [PATCH 171/755] Handle chat attachment without a value (#214652) Fix #214649 --- src/vs/workbench/contrib/chat/browser/chatVariables.ts | 6 +++++- src/vs/workbench/contrib/chat/common/chatModel.ts | 3 ++- src/vs/workbench/contrib/chat/common/chatServiceImpl.ts | 8 ++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatVariables.ts b/src/vs/workbench/contrib/chat/browser/chatVariables.ts index 61b4ee1984f6a..cd978afa041e1 100644 --- a/src/vs/workbench/contrib/chat/browser/chatVariables.ts +++ b/src/vs/workbench/contrib/chat/browser/chatVariables.ts @@ -90,11 +90,15 @@ export class ChatVariablesService implements IChatVariablesService { await Promise.allSettled(jobs); + // Make array not sparse resolvedVariables = coalesce(resolvedVariables); // "reverse", high index first so that replacement is simple resolvedVariables.sort((a, b) => b.range!.start - a.range!.start); - resolvedVariables.push(...resolvedAttachedContext); + + // resolvedAttachedContext is a sparse array + resolvedVariables.push(...coalesce(resolvedAttachedContext)); + return { variables: resolvedVariables, diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index 1760a265c3baf..d03364fab2a82 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -725,7 +725,8 @@ export class ChatModel extends Disposable implements IChatModel { { variables: [] }; variableData.variables = variableData.variables.map((v): IChatRequestVariableEntry => { - if ('values' in v && Array.isArray(v.values)) { + // Old variables format + if (v && 'values' in v && Array.isArray(v.values)) { return { id: v.id ?? '', name: v.name, diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index af21078bacda9..ff8d83fc2c378 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -670,13 +670,13 @@ export class ChatService extends Disposable implements IChatService { chatSessionId: model.sessionId, location }); - const rawResult: IChatAgentResult = { errorDetails: { message: err.message } }; + this.logService.error(`Error while handling chat request: ${toErrorMessage(err, true)}`); if (request) { + const rawResult: IChatAgentResult = { errorDetails: { message: err.message } }; model.setResponse(request, rawResult); + completeResponseCreated(); + model.completeResponse(request); } - completeResponseCreated(); - this.logService.error(`Error while handling chat request: ${toErrorMessage(err)}`); - model.completeResponse(request); } finally { listener.dispose(); } From 76664e7ce647c32cf494d441ec5088bfa43f6c52 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Fri, 7 Jun 2024 16:40:42 -0700 Subject: [PATCH 172/755] max height buffer to prevent small scrollbar (#214654) --- extensions/notebook-renderers/src/index.ts | 2 +- .../contrib/notebook/browser/view/renderers/backLayerWebView.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/notebook-renderers/src/index.ts b/extensions/notebook-renderers/src/index.ts index 551192a84dfa0..8f5fa908cb938 100644 --- a/extensions/notebook-renderers/src/index.ts +++ b/extensions/notebook-renderers/src/index.ts @@ -462,7 +462,7 @@ export const activate: ActivationFunction = (ctx) => { border-color: var(--theme-input-focus-border-color); } #container div.output .scrollable { - overflow-y: scroll; + overflow-y: auto; max-height: var(--notebook-cell-output-max-height); } #container div.output .scrollable.scrollbar-visible { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 1640156d5ffab..51c11f433832d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -270,7 +270,7 @@ export class BackLayerWebView extends Themable { 'notebook-markdown-line-height': typeof this.options.markdownLineHeight === 'number' && this.options.markdownLineHeight > 0 ? `${this.options.markdownLineHeight}px` : `normal`, 'notebook-cell-output-font-size': `${this.options.outputFontSize || this.options.fontSize}px`, 'notebook-cell-output-line-height': `${this.options.outputLineHeight}px`, - 'notebook-cell-output-max-height': `${this.options.outputLineHeight * this.options.outputLineLimit}px`, + 'notebook-cell-output-max-height': `${this.options.outputLineHeight * this.options.outputLineLimit + 2}px`, 'notebook-cell-output-font-family': this.options.outputFontFamily || this.options.fontFamily, 'notebook-cell-markup-empty-content': nls.localize('notebook.emptyMarkdownPlaceholder', "Empty markdown cell, double-click or press enter to edit."), 'notebook-cell-renderer-not-found-error': nls.localize({ From 39b3c5b93643187a14fa6ab22d5d7a935b655065 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 7 Jun 2024 17:11:02 -0700 Subject: [PATCH 173/755] Context should be undefined when there nis no context (#214656) * fix titlebar editor actions context on startup * fix titlebar editor actions context on startup * remove listener --- src/vs/workbench/browser/parts/titlebar/titlebarPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 80c99f1557d2f..bed98fd3b61a8 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -634,7 +634,7 @@ export class BrowserTitlebarPart extends Part implements ITitlebarPart { this.editorToolbarMenuDisposables.add(this.actionToolBar.actionRunner); } else { this.actionToolBar.actionRunner = new ActionRunner(); - this.actionToolBar.context = {}; + this.actionToolBar.context = undefined; this.editorToolbarMenuDisposables.add(this.actionToolBar.actionRunner); } From d40dff9ef9aacb8e5226bcf3938c71f4b9543120 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 7 Jun 2024 17:13:08 -0700 Subject: [PATCH 174/755] Activate configuration-editing extension when jsonc files are opened (#214659) Fix #182700 --- extensions/configuration-editing/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 8a00fda49b88a..f6bfd75189576 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -11,7 +11,9 @@ "icon": "images/icon.png", "activationEvents": [ "onProfile", - "onProfile:github" + "onProfile:github", + "onLanguage:json", + "onLanguage:jsonc" ], "enabledApiProposals": [ "profileContentHandlers" From 1e5b0ab4fc654a45039e18988ffa2b738dcce2ea Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sat, 8 Jun 2024 17:56:20 +0200 Subject: [PATCH 175/755] small rename (#214678) --- .../browser/{observableUtilities.ts => observableCodeEditor.ts} | 2 +- .../browser/widget/diffEditor/components/diffEditorEditors.ts | 2 +- .../inlineCompletions/browser/inlineCompletionsController.ts | 2 +- .../placeholderText/browser/placeholderText.contribution.ts | 2 +- src/vs/editor/test/browser/widget/observableCodeEditor.test.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/vs/editor/browser/{observableUtilities.ts => observableCodeEditor.ts} (99%) diff --git a/src/vs/editor/browser/observableUtilities.ts b/src/vs/editor/browser/observableCodeEditor.ts similarity index 99% rename from src/vs/editor/browser/observableUtilities.ts rename to src/vs/editor/browser/observableCodeEditor.ts index 118c70a7a3452..a2eba707a2164 100644 --- a/src/vs/editor/browser/observableUtilities.ts +++ b/src/vs/editor/browser/observableCodeEditor.ts @@ -23,7 +23,7 @@ export function observableCodeEditor(editor: ICodeEditor): ObservableCodeEditor } export class ObservableCodeEditor extends Disposable { - private static _map = new Map(); + private static readonly _map = new Map(); /** * Make sure that editor is not disposed yet! diff --git a/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts b/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts index 0169c380f04e2..73db7fbebb207 100644 --- a/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts +++ b/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts @@ -8,7 +8,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IReader, autorunHandleChanges, derived, derivedOpts, observableFromEvent } from 'vs/base/common/observable'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { IDiffEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; -import { observableCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; import { IDiffCodeEditorWidgetOptions } from 'vs/editor/browser/widget/diffEditor/diffEditorWidget'; import { OverviewRulerFeature } from 'vs/editor/browser/widget/diffEditor/features/overviewRulerFeature'; diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts index 4fdd739ab4079..9b0d64299a5ce 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts @@ -15,7 +15,7 @@ import { derivedObservableWithCache, mapObservableArrayCached } from 'vs/base/co import { isUndefined } from 'vs/base/common/types'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { observableCodeEditor, reactToChange, reactToChangeWithStore } from 'vs/editor/browser/observableUtilities'; +import { observableCodeEditor, reactToChange, reactToChangeWithStore } from 'vs/editor/browser/observableCodeEditor'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts index 0a7bf00c99bfe..33c069c44851c 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts @@ -9,7 +9,7 @@ import { derived, derivedOpts } from 'vs/base/common/observable'; import 'vs/css!./placeholderText'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { observableCodeEditor } from 'vs/editor/browser/observableUtilities'; +import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { ghostTextForeground } from 'vs/editor/common/core/editorColorRegistry'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts index 313c561788c7f..5ae9f3d81f5c7 100644 --- a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts +++ b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts @@ -8,7 +8,7 @@ import { DisposableStore } from "vs/base/common/lifecycle"; import { IObservable, derivedHandleChanges } from "vs/base/common/observable"; import { ensureNoDisposablesAreLeakedInTestSuite } from "vs/base/test/common/utils"; import { ICodeEditor } from "vs/editor/browser/editorBrowser"; -import { ObservableCodeEditor, observableCodeEditor } from "vs/editor/browser/observableUtilities"; +import { ObservableCodeEditor, observableCodeEditor } from "vs/editor/browser/observableCodeEditor"; import { Position } from "vs/editor/common/core/position"; import { Range } from "vs/editor/common/core/range"; import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; From e33ae58f1da801e66ba48ff4e222c69092cdd1b2 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sat, 8 Jun 2024 20:30:03 +0200 Subject: [PATCH 176/755] Introduces latestChangedValue (#214682) --- .../base/common/observableInternal/utils.ts | 40 +++++++++++++++++++ .../workbench/contrib/scm/browser/activity.ts | 18 ++------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/vs/base/common/observableInternal/utils.ts b/src/vs/base/common/observableInternal/utils.ts index d1597b8b48ae7..9752584dd6250 100644 --- a/src/vs/base/common/observableInternal/utils.ts +++ b/src/vs/base/common/observableInternal/utils.ts @@ -11,6 +11,7 @@ import { DebugNameData, Owner, getFunctionName } from 'vs/base/common/observable import { derived, derivedOpts } from 'vs/base/common/observableInternal/derived'; import { getLogger } from 'vs/base/common/observableInternal/logging'; import { IValueWithChangeEvent } from '../event'; +import { BugIndicatingError } from 'vs/base/common/errors'; /** * Represents an efficient observable whose value never changes. @@ -526,3 +527,42 @@ export function observableFromValueWithChangeEvent(_owner: Owner, value: IVal } return observableFromEvent(value.onDidChange, () => value.value); } + +/** + * Creates an observable that has the latest changed value of the given observables. + * Initially (and when not observed), it has the value of the last observable. + * When observed and any of the observables change, it has the value of the last changed observable. + * If multiple observables change in the same transaction, the last observable wins. +*/ +export function latestChangedValue[]>(...observables: T): IObservable> { + if (observables.length === 0) { + throw new BugIndicatingError(); + } + + let hasLastChangedValue = false; + let lastChangedValue: any = undefined; + + return observableFromEvent(cb => { + const store = new DisposableStore(); + for (const o of observables) { + store.add(autorun(reader => { + hasLastChangedValue = true; + lastChangedValue = o.read(reader); + cb(); + })); + } + store.add({ + dispose() { + hasLastChangedValue = false; + lastChangedValue = undefined; + }, + }); + return store; + }, () => { + if (hasLastChangedValue) { + return lastChangedValue; + } else { + return observables[observables.length - 1].get(); + } + }); +} diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 9cf128b5710da..1fbe8e39c0a5f 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -22,8 +22,9 @@ import { ITitleService } from 'vs/workbench/services/title/browser/titleService' import { IEditorGroupContextKeyProvider, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { getRepositoryResourceCount } from 'vs/workbench/contrib/scm/browser/util'; -import { autorunWithStore, derived, derivedObservableWithCache, IObservable, observableFromEvent } from 'vs/base/common/observable'; +import { autorunWithStore, derived, IObservable, observableFromEvent } from 'vs/base/common/observable'; import { observableConfigValue } from 'vs/platform/observable/common/platformObservableUtils'; +import { latestChangedValue } from 'vs/base/common/observableInternal/utils'; export class SCMActivityCountBadgeController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -49,20 +50,7 @@ export class SCMActivityCountBadgeController extends Disposable implements IWork return this.scmService.getRepository(activeResource); }); - private readonly _activeRepository = derivedObservableWithCache(this, (reader, lastValue) => { - const focusedRepository = this._focusedRepository.read(reader); - const activeEditorRepository = this._activeEditorRepository.read(reader); - - if (focusedRepository && focusedRepository.id !== lastValue?.id) { - return focusedRepository; - } - - if (activeEditorRepository && activeEditorRepository.id !== lastValue?.id) { - return activeEditorRepository; - } - - return lastValue; - }); + private readonly _activeRepository = latestChangedValue(this._focusedRepository, this._activeEditorRepository); private readonly _countBadgeRepositories = derived(reader => { switch (this._countBadgeConfig.read(reader)) { From d2d053d84e2460661c435ac825b1b1895f7efd51 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Sat, 8 Jun 2024 20:56:41 +0200 Subject: [PATCH 177/755] Observables - add observableFromEventOpts (#214702) --- src/vs/base/common/observableInternal/utils.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vs/base/common/observableInternal/utils.ts b/src/vs/base/common/observableInternal/utils.ts index 9752584dd6250..4832babbc61f8 100644 --- a/src/vs/base/common/observableInternal/utils.ts +++ b/src/vs/base/common/observableInternal/utils.ts @@ -12,6 +12,7 @@ import { derived, derivedOpts } from 'vs/base/common/observableInternal/derived' import { getLogger } from 'vs/base/common/observableInternal/logging'; import { IValueWithChangeEvent } from '../event'; import { BugIndicatingError } from 'vs/base/common/errors'; +import { EqualityComparer, strictEquals } from 'vs/base/common/equals'; /** * Represents an efficient observable whose value never changes. @@ -57,7 +58,17 @@ export function observableFromEvent( event: Event, getValue: (args: TArgs | undefined) => T, ): IObservable { - return new FromEventObservable(event, getValue, () => FromEventObservable.globalTransaction); + return new FromEventObservable(event, getValue, () => FromEventObservable.globalTransaction, strictEquals); +} + +export function observableFromEventOpts( + options: { + equalsFn?: EqualityComparer; + }, + event: Event, + getValue: (args: TArgs | undefined) => T, +): IObservable { + return new FromEventObservable(event, getValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals); } export class FromEventObservable extends BaseObservable { @@ -71,6 +82,7 @@ export class FromEventObservable extends BaseObservable { private readonly event: Event, public readonly _getValue: (args: TArgs | undefined) => T, private readonly _getTransaction: () => ITransaction | undefined, + private readonly _equalityComparator: EqualityComparer ) { super(); } @@ -92,7 +104,7 @@ export class FromEventObservable extends BaseObservable { const newValue = this._getValue(args); const oldValue = this.value; - const didChange = !this.hasValue || oldValue !== newValue; + const didChange = !this.hasValue || !(this._equalityComparator(oldValue!, newValue)); let didRunTransaction = false; if (didChange) { From b85633af595b5cbfda41d1cd8f290c474c8685df Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Sun, 9 Jun 2024 07:11:33 +0200 Subject: [PATCH 178/755] SCM - adopt observables for updating the status bar (#214705) * Initial implementation * Adopt observableFromEventOpts * Fix issue with active editor repository --- .../workbench/contrib/scm/browser/activity.ts | 135 ++++-------------- .../contrib/scm/browser/scm.contribution.ts | 7 +- 2 files changed, 27 insertions(+), 115 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 1fbe8e39c0a5f..37fd1205e9a63 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/resources'; -import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { VIEW_PANE_ID, ISCMService, ISCMRepository, ISCMViewService } from 'vs/workbench/contrib/scm/common/scm'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; @@ -24,30 +24,33 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { getRepositoryResourceCount } from 'vs/workbench/contrib/scm/browser/util'; import { autorunWithStore, derived, IObservable, observableFromEvent } from 'vs/base/common/observable'; import { observableConfigValue } from 'vs/platform/observable/common/platformObservableUtils'; -import { latestChangedValue } from 'vs/base/common/observableInternal/utils'; +import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts } from 'vs/base/common/observableInternal/utils'; +import { Command } from 'vs/editor/common/languages'; -export class SCMActivityCountBadgeController extends Disposable implements IWorkbenchContribution { +export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); private readonly _repositories = observableFromEvent( Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository), () => this.scmService.repositories); - private readonly _focusedRepository = observableFromEvent( + private readonly _focusedRepository = observableFromEventOpts( + { equalsFn: () => false }, this.scmViewService.onDidFocusRepository, - () => this.scmViewService.focusedRepository ? Object.create(this.scmViewService.focusedRepository) : undefined); + () => this.scmViewService.focusedRepository); - private readonly _activeEditor = observableFromEvent( + private readonly _activeEditor = observableFromEventOpts( + { equalsFn: () => false }, this.editorService.onDidActiveEditorChange, () => this.editorService.activeEditor); - private readonly _activeEditorRepository = derived(reader => { + private readonly _activeEditorRepository = derivedObservableWithCache(this, (reader, lastValue) => { const activeResource = EditorResourceAccessor.getOriginalUri(this._activeEditor.read(reader)); if (!activeResource) { - return undefined; + return lastValue; } - return this.scmService.getRepository(activeResource); + return this.scmService.getRepository(activeResource) ?? lastValue; }); private readonly _activeRepository = latestChangedValue(this._focusedRepository, this._activeEditorRepository); @@ -87,12 +90,20 @@ export class SCMActivityCountBadgeController extends Disposable implements IWork @IConfigurationService private readonly configurationService: IConfigurationService, @IEditorService private readonly editorService: IEditorService, @ISCMService private readonly scmService: ISCMService, - @ISCMViewService private readonly scmViewService: ISCMViewService + @ISCMViewService private readonly scmViewService: ISCMViewService, + @IStatusbarService private readonly statusbarService: IStatusbarService ) { super(); this._register(autorunWithStore((reader, store) => { - this._renderActivityCount(this._countBadge.read(reader), store); + this._updateActivityCountBadge(this._countBadge.read(reader), store); + })); + + this._register(autorunWithStore((reader, store) => { + const repository = this._activeRepository.read(reader); + const commands = repository?.provider.statusBarCommandsObs.read(reader) ?? []; + + this._updateStatusBar(repository, commands, store); })); } @@ -100,7 +111,7 @@ export class SCMActivityCountBadgeController extends Disposable implements IWork return observableFromEvent(repository.provider.onDidChangeResources, () => getRepositoryResourceCount(repository.provider)); } - private _renderActivityCount(count: number, store: DisposableStore): void { + private _updateActivityCountBadge(count: number, store: DisposableStore): void { if (count === 0) { return; } @@ -108,101 +119,16 @@ export class SCMActivityCountBadgeController extends Disposable implements IWork const badge = new NumberBadge(count, num => localize('scmPendingChangesBadge', '{0} pending changes', num)); store.add(this.activityService.showViewActivity(VIEW_PANE_ID, { badge })); } -} - -export class SCMStatusController implements IWorkbenchContribution { - - private statusBarDisposable: IDisposable = Disposable.None; - private focusDisposable: IDisposable = Disposable.None; - private focusedRepository: ISCMRepository | undefined = undefined; - private readonly badgeDisposable = new MutableDisposable(); - private readonly disposables = new DisposableStore(); - private repositoryDisposables = new Set(); - - constructor( - @ISCMService private readonly scmService: ISCMService, - @ISCMViewService private readonly scmViewService: ISCMViewService, - @IStatusbarService private readonly statusbarService: IStatusbarService, - @IEditorService private readonly editorService: IEditorService - ) { - this.scmService.onDidAddRepository(this.onDidAddRepository, this, this.disposables); - this.scmService.onDidRemoveRepository(this.onDidRemoveRepository, this, this.disposables); - - for (const repository of this.scmService.repositories) { - this.onDidAddRepository(repository); - } - - this.scmViewService.onDidFocusRepository(this.focusRepository, this, this.disposables); - this.focusRepository(this.scmViewService.focusedRepository); - - editorService.onDidActiveEditorChange(() => this.tryFocusRepositoryBasedOnActiveEditor(), this, this.disposables); - } - - private tryFocusRepositoryBasedOnActiveEditor(repositories: Iterable = this.scmService.repositories): boolean { - const resource = EditorResourceAccessor.getOriginalUri(this.editorService.activeEditor); - - if (!resource) { - return false; - } - - const repository = this.scmService.getRepository(resource); - if (!repository) { - return false; - } - - this.focusRepository(repository); - return true; - } - - private onDidAddRepository(repository: ISCMRepository): void { - const onDidRemove = Event.filter(this.scmService.onDidRemoveRepository, e => e === repository); - const removeDisposable = onDidRemove(() => { - disposable.dispose(); - this.repositoryDisposables.delete(disposable); - }); - - const disposable = combinedDisposable(removeDisposable); - this.repositoryDisposables.add(disposable); - - this.tryFocusRepositoryBasedOnActiveEditor(Iterable.single(repository)); - } - - private onDidRemoveRepository(repository: ISCMRepository): void { - if (this.focusedRepository !== repository) { - return; - } - - this.focusRepository(Iterable.first(this.scmService.repositories)); - } - - private focusRepository(repository: ISCMRepository | undefined): void { - if (this.focusedRepository === repository) { - return; - } - - this.focusDisposable.dispose(); - this.focusedRepository = repository; - - if (repository && repository.provider.onDidChangeStatusBarCommands) { - this.focusDisposable = repository.provider.onDidChangeStatusBarCommands(() => this.renderStatusBar(repository)); - } - - this.renderStatusBar(repository); - } - - private renderStatusBar(repository: ISCMRepository | undefined): void { - this.statusBarDisposable.dispose(); + private _updateStatusBar(repository: ISCMRepository | undefined, commands: readonly Command[], store: DisposableStore): void { if (!repository) { return; } - const commands = repository.provider.statusBarCommands || []; const label = repository.provider.rootUri ? `${basename(repository.provider.rootUri)} (${repository.provider.label})` : repository.provider.label; - const disposables = new DisposableStore(); for (let index = 0; index < commands.length; index++) { const command = commands[index]; const tooltip = `${label}${command.tooltip ? ` - ${command.tooltip}` : ''}`; @@ -229,22 +155,11 @@ export class SCMStatusController implements IWorkbenchContribution { command: command.id ? command : undefined }; - disposables.add(index === 0 ? + store.add(index === 0 ? this.statusbarService.addEntry(statusbarEntry, `status.scm.${index}`, MainThreadStatusBarAlignment.LEFT, 10000) : this.statusbarService.addEntry(statusbarEntry, `status.scm.${index}`, MainThreadStatusBarAlignment.LEFT, { id: `status.scm.${index - 1}`, alignment: MainThreadStatusBarAlignment.RIGHT, compact: true }) ); } - - this.statusBarDisposable = disposables; - } - - dispose(): void { - this.focusDisposable.dispose(); - this.statusBarDisposable.dispose(); - this.badgeDisposable.dispose(); - this.disposables.dispose(); - dispose(this.repositoryDisposables.values()); - this.repositoryDisposables.clear(); } } diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index bb51dd22748a5..e10c959ef7be0 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -10,7 +10,7 @@ import { DirtyDiffWorkbenchController } from './dirtydiffDecorator'; import { VIEWLET_ID, ISCMService, VIEW_PANE_ID, ISCMProvider, ISCMViewService, REPOSITORIES_VIEW_PANE_ID } from 'vs/workbench/contrib/scm/common/scm'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { SCMActiveRepositoryContextKeyController, SCMActiveResourceContextKeyController, SCMActivityCountBadgeController, SCMStatusController } from './activity'; +import { SCMActiveRepositoryContextKeyController, SCMActiveResourceContextKeyController, SCMActiveRepositoryController } from './activity'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -113,7 +113,7 @@ viewsRegistry.registerViews([{ }], viewContainer); Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(SCMActivityCountBadgeController, LifecyclePhase.Restored); + .registerWorkbenchContribution(SCMActiveRepositoryController, LifecyclePhase.Restored); Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(SCMActiveResourceContextKeyController, LifecyclePhase.Restored); @@ -121,9 +121,6 @@ Registry.as(WorkbenchExtensions.Workbench) Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(SCMActiveRepositoryContextKeyController, LifecyclePhase.Restored); -Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(SCMStatusController, LifecyclePhase.Restored); - registerWorkbenchContribution2( SCMWorkingSetController.ID, SCMWorkingSetController, From f24f7776b9e1444d003a19f2121804ce085c4bce Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Sun, 9 Jun 2024 19:59:48 +0200 Subject: [PATCH 179/755] SCM - refactor setting the context keys for the active repository (#214727) --- src/vs/workbench/api/browser/mainThreadSCM.ts | 16 ++- .../workbench/contrib/scm/browser/activity.ts | 102 ++++++------------ .../contrib/scm/browser/scm.contribution.ts | 5 +- .../workbench/contrib/scm/common/history.ts | 2 + src/vs/workbench/contrib/scm/common/scm.ts | 1 + 5 files changed, 53 insertions(+), 73 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index adb9238b8a1cf..352fe587ee1a4 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -164,6 +164,9 @@ class MainThreadSCMHistoryProvider implements ISCMHistoryProvider { this._onDidChangeCurrentHistoryItemGroup.fire(); } + private readonly _currentHistoryItemGroupObs = observableValue(this, undefined); + get currentHistoryItemGroupObs() { return this._currentHistoryItemGroupObs; } + constructor(private readonly proxy: ExtHostSCMShape, private readonly handle: number) { } async resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined> { @@ -190,6 +193,9 @@ class MainThreadSCMHistoryProvider implements ISCMHistoryProvider { })); } + $onDidChangeCurrentHistoryItemGroup(historyItemGroup: ISCMHistoryItemGroup | undefined): void { + this._currentHistoryItemGroupObs.set(historyItemGroup, undefined); + } } class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { @@ -256,6 +262,8 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { public readonly isSCM: boolean = true; private _historyProvider: ISCMHistoryProvider | undefined; + private readonly _historyProviderObs = observableValue(this, undefined); + get historyProviderObs() { return this._historyProviderObs; } constructor( private readonly proxy: ExtHostSCMShape, @@ -308,9 +316,14 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (features.hasHistoryProvider && !this._historyProvider) { - this._historyProvider = new MainThreadSCMHistoryProvider(this.proxy, this.handle); + const historyProvider = new MainThreadSCMHistoryProvider(this.proxy, this.handle); + this._historyProviderObs.set(historyProvider, undefined); + + this._historyProvider = historyProvider; this._onDidChangeHistoryProvider.fire(); } else if (features.hasHistoryProvider === false && this._historyProvider) { + this._historyProviderObs.set(undefined, undefined); + this._historyProvider = undefined; this._onDidChangeHistoryProvider.fire(); } @@ -434,6 +447,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } this._historyProvider.currentHistoryItemGroup = currentHistoryItemGroup ?? undefined; + this._historyProviderObs.get()?.$onDidChangeCurrentHistoryItemGroup(currentHistoryItemGroup); } toJSON(): any { diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 37fd1205e9a63..b10cc49d8cbf0 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -22,10 +22,11 @@ import { ITitleService } from 'vs/workbench/services/title/browser/titleService' import { IEditorGroupContextKeyProvider, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { getRepositoryResourceCount } from 'vs/workbench/contrib/scm/browser/util'; -import { autorunWithStore, derived, IObservable, observableFromEvent } from 'vs/base/common/observable'; +import { autorun, autorunWithStore, derived, IObservable, observableFromEvent } from 'vs/base/common/observable'; import { observableConfigValue } from 'vs/platform/observable/common/platformObservableUtils'; import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts } from 'vs/base/common/observableInternal/utils'; import { Command } from 'vs/editor/common/languages'; +import { ISCMHistoryItemGroup } from 'vs/workbench/contrib/scm/common/history'; export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -50,7 +51,12 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe return lastValue; } - return this.scmService.getRepository(activeResource) ?? lastValue; + const repository = this.scmService.getRepository(activeResource); + if (!repository) { + return lastValue; + } + + return Object.create(repository); }); private readonly _activeRepository = latestChangedValue(this._focusedRepository, this._activeEditorRepository); @@ -85,16 +91,29 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe return total; }); + private _activeRepositoryNameContextKey: IContextKey; + private _activeRepositoryBranchNameContextKey: IContextKey; + constructor( @IActivityService private readonly activityService: IActivityService, @IConfigurationService private readonly configurationService: IConfigurationService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, @IEditorService private readonly editorService: IEditorService, @ISCMService private readonly scmService: ISCMService, @ISCMViewService private readonly scmViewService: ISCMViewService, - @IStatusbarService private readonly statusbarService: IStatusbarService + @IStatusbarService private readonly statusbarService: IStatusbarService, + @ITitleService private readonly titleService: ITitleService ) { super(); + this._activeRepositoryNameContextKey = ActiveRepositoryContextKeys.ActiveRepositoryName.bindTo(this.contextKeyService); + this._activeRepositoryBranchNameContextKey = ActiveRepositoryContextKeys.ActiveRepositoryBranchName.bindTo(this.contextKeyService); + + this.titleService.registerVariables([ + { name: 'activeRepositoryName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryName.key }, + { name: 'activeRepositoryBranchName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryBranchName.key, } + ]); + this._register(autorunWithStore((reader, store) => { this._updateActivityCountBadge(this._countBadge.read(reader), store); })); @@ -105,6 +124,13 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe this._updateStatusBar(repository, commands, store); })); + + this._register(autorun(reader => { + const repository = this._activeRepository.read(reader); + const currentHistoryItemGroup = repository?.provider.historyProviderObs.read(reader)?.currentHistoryItemGroupObs.read(reader); + + this._updateActiveRepositoryContextKeys(repository, currentHistoryItemGroup); + })); } private _getRepositoryResourceCount(repository: ISCMRepository): IObservable { @@ -161,6 +187,11 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe ); } } + + private _updateActiveRepositoryContextKeys(repository: ISCMRepository | undefined, currentHistoryItemGroup: ISCMHistoryItemGroup | undefined): void { + this._activeRepositoryNameContextKey.set(repository?.provider.name ?? ''); + this._activeRepositoryBranchNameContextKey.set(currentHistoryItemGroup?.name ?? ''); + } } const ActiveRepositoryContextKeys = { @@ -168,71 +199,6 @@ const ActiveRepositoryContextKeys = { ActiveRepositoryBranchName: new RawContextKey('scmActiveRepositoryBranchName', ''), }; -export class SCMActiveRepositoryContextKeyController implements IWorkbenchContribution { - - private activeRepositoryNameContextKey: IContextKey; - private activeRepositoryBranchNameContextKey: IContextKey; - - private focusedRepository: ISCMRepository | undefined = undefined; - private focusDisposable: IDisposable = Disposable.None; - private readonly disposables = new DisposableStore(); - - constructor( - @IContextKeyService contextKeyService: IContextKeyService, - @IEditorService private readonly editorService: IEditorService, - @ISCMViewService scmViewService: ISCMViewService, - @ISCMService private readonly scmService: ISCMService, - @ITitleService titleService: ITitleService - ) { - this.activeRepositoryNameContextKey = ActiveRepositoryContextKeys.ActiveRepositoryName.bindTo(contextKeyService); - this.activeRepositoryBranchNameContextKey = ActiveRepositoryContextKeys.ActiveRepositoryBranchName.bindTo(contextKeyService); - - titleService.registerVariables([ - { name: 'activeRepositoryName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryName.key }, - { name: 'activeRepositoryBranchName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryBranchName.key, } - ]); - - editorService.onDidActiveEditorChange(this.onDidActiveEditorChange, this, this.disposables); - scmViewService.onDidFocusRepository(this.onDidFocusRepository, this, this.disposables); - this.onDidFocusRepository(scmViewService.focusedRepository); - } - - private onDidActiveEditorChange(): void { - const activeResource = EditorResourceAccessor.getOriginalUri(this.editorService.activeEditor); - if (!activeResource) { - return; - } - - const repository = this.scmService.getRepository(activeResource); - this.onDidFocusRepository(repository); - } - - private onDidFocusRepository(repository: ISCMRepository | undefined): void { - if (!repository || this.focusedRepository === repository) { - return; - } - - this.focusDisposable.dispose(); - this.focusedRepository = repository; - - if (repository && repository.provider.onDidChangeStatusBarCommands) { - this.focusDisposable = repository.provider.onDidChangeStatusBarCommands(() => this.updateContextKeys(repository)); - } - - this.updateContextKeys(repository); - } - - private updateContextKeys(repository: ISCMRepository | undefined): void { - this.activeRepositoryNameContextKey.set(repository?.provider.name ?? ''); - this.activeRepositoryBranchNameContextKey.set(repository?.provider.historyProvider?.currentHistoryItemGroup?.name ?? ''); - } - - dispose(): void { - this.focusDisposable.dispose(); - this.disposables.dispose(); - } -} - export class SCMActiveResourceContextKeyController implements IWorkbenchContribution { private readonly disposables = new DisposableStore(); diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index e10c959ef7be0..262eab7b31eab 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -10,7 +10,7 @@ import { DirtyDiffWorkbenchController } from './dirtydiffDecorator'; import { VIEWLET_ID, ISCMService, VIEW_PANE_ID, ISCMProvider, ISCMViewService, REPOSITORIES_VIEW_PANE_ID } from 'vs/workbench/contrib/scm/common/scm'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { SCMActiveRepositoryContextKeyController, SCMActiveResourceContextKeyController, SCMActiveRepositoryController } from './activity'; +import { SCMActiveResourceContextKeyController, SCMActiveRepositoryController } from './activity'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -118,9 +118,6 @@ Registry.as(WorkbenchExtensions.Workbench) Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(SCMActiveResourceContextKeyController, LifecyclePhase.Restored); -Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(SCMActiveRepositoryContextKeyController, LifecyclePhase.Restored); - registerWorkbenchContribution2( SCMWorkingSetController.ID, SCMWorkingSetController, diff --git a/src/vs/workbench/contrib/scm/common/history.ts b/src/vs/workbench/contrib/scm/common/history.ts index 2cb81effd9130..67c2bb3f577ed 100644 --- a/src/vs/workbench/contrib/scm/common/history.ts +++ b/src/vs/workbench/contrib/scm/common/history.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; +import { IObservable } from 'vs/base/common/observable'; import { ThemeIcon } from 'vs/base/common/themables'; import { URI } from 'vs/base/common/uri'; import { IMenu } from 'vs/platform/actions/common/actions'; @@ -22,6 +23,7 @@ export interface ISCMHistoryProvider { get currentHistoryItemGroup(): ISCMHistoryItemGroup | undefined; set currentHistoryItemGroup(historyItemGroup: ISCMHistoryItemGroup | undefined); + readonly currentHistoryItemGroupObs: IObservable; provideHistoryItems(historyItemGroupId: string, options: ISCMHistoryOptions): Promise; provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise; diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index 47bd0637217b4..db0d666e095ea 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -76,6 +76,7 @@ export interface ISCMProvider extends IDisposable { readonly count: IObservable; readonly commitTemplate: IObservable; readonly historyProvider?: ISCMHistoryProvider; + readonly historyProviderObs: IObservable; readonly onDidChangeHistoryProvider: Event; readonly onDidChangeStatusBarCommands?: Event; readonly acceptInputCommand?: Command; From fec18ef7d6793521c4683e67e569579ea970cc6d Mon Sep 17 00:00:00 2001 From: Robo Date: Mon, 10 Jun 2024 13:53:33 +0900 Subject: [PATCH 180/755] fix: expected checksum for windows remote server (#214751) --- build/gulpfile.reh.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 4ab7dcbc4b6d9..a6cfbe5a61d8f 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -129,7 +129,8 @@ function getNodeChecksum(nodeVersion, platform, arch, glibcPrefix) { let expectedName; switch (platform) { case 'win32': - expectedName = `win-${arch}/node.exe`; + expectedName = product.nodejsRepository !== 'https://nodejs.org' ? + `win-${arch}-node.exe` : `win-${arch}/node.exe`; break; case 'darwin': From db4e4ff980f9061bb4d8455e617531f46d518328 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 10 Jun 2024 08:41:28 +0200 Subject: [PATCH 181/755] watcher - stop restarting per request (#214752) --- src/vs/platform/files/common/watcher.ts | 68 ++++++++++++++----------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/src/vs/platform/files/common/watcher.ts b/src/vs/platform/files/common/watcher.ts index 05ff156de894c..eef16ccfcb0bb 100644 --- a/src/vs/platform/files/common/watcher.ts +++ b/src/vs/platform/files/common/watcher.ts @@ -181,16 +181,14 @@ export interface IUniversalWatcher extends IWatcher { export abstract class AbstractWatcherClient extends Disposable { - private static readonly MAX_RESTARTS_PER_REQUEST_ERROR = 3; // how often we give a request a chance to restart on error - private static readonly MAX_RESTARTS_PER_UNKNOWN_ERROR = 10; // how often we give the watcher a chance to restart on unknown errors (like crash) + private static readonly MAX_RESTARTS = 5; private watcher: IWatcher | undefined; private readonly watcherDisposables = this._register(new MutableDisposable()); private requests: IWatchRequest[] | undefined = undefined; - private restartsPerRequestError = new Map(); - private restartsPerUnknownError = 0; + private restartCounter = 0; constructor( private readonly onFileChanges: (changes: IFileChange[]) => void, @@ -224,41 +222,51 @@ export abstract class AbstractWatcherClient extends Disposable { protected onError(error: string, failedRequest?: IUniversalWatchRequest): void { - // Restart on error (up to N times, if enabled) - if (this.options.restartOnError && this.requests?.length) { - - // A request failed - if (failedRequest) { - const restartsPerRequestError = this.restartsPerRequestError.get(failedRequest.path) ?? 0; - if (restartsPerRequestError < AbstractWatcherClient.MAX_RESTARTS_PER_REQUEST_ERROR) { - this.error(`restarting watcher from error in watch request (retrying request): ${error} (${JSON.stringify(failedRequest)})`); - this.restartsPerRequestError.set(failedRequest.path, restartsPerRequestError + 1); - this.restart(this.requests); - } else { - this.error(`restarting watcher from error in watch request (skipping request): ${error} (${JSON.stringify(failedRequest)})`); - this.restart(this.requests.filter(request => request.path !== failedRequest.path)); - } - } - - // Any request failed or process crashed - else { - if (this.restartsPerUnknownError < AbstractWatcherClient.MAX_RESTARTS_PER_UNKNOWN_ERROR) { - this.error(`restarting watcher after unknown global error: ${error}`); - this.restartsPerUnknownError++; - this.restart(this.requests); - } else { - this.error(`giving up attempting to restart watcher after error: ${error}`); - } + // Restart on error (up to N times, if possible) + if (this.canRestart(error, failedRequest)) { + if (this.restartCounter < AbstractWatcherClient.MAX_RESTARTS && this.requests) { + this.error(`restarting watcher after unexpected error: ${error}`); + this.restart(this.requests); + } else { + this.error(`gave up attempting to restart watcher after unexpected error: ${error}`); } } - // Do not attempt to restart if not enabled + // Do not attempt to restart otherwise, report the error else { this.error(error); } } + private canRestart(error: string, failedRequest?: IUniversalWatchRequest): boolean { + if (!this.options.restartOnError) { + return false; // disabled by options + } + + if (failedRequest) { + // do not treat a failing request as a reason to restart the entire + // watcher. it is possible that from a large amount of watch requests + // some fail and we would constantly restart all requests only because + // of that. rather, continue the watcher and leave the failed request + return false; + } + + if ( + error.indexOf('No space left on device') !== -1 || + error.indexOf('EMFILE') !== -1 + ) { + // do not restart when the error indicates that the system is running + // out of handles for file watching. this is not recoverable anyway + // and needs changes to the system before continuing + return false; + } + + return true; + } + private restart(requests: IUniversalWatchRequest[]): void { + this.restartCounter++; + this.init(); this.watch(requests); } From 03fedcd2644e2ac404b160362201452e0a9ab975 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:11:46 +0200 Subject: [PATCH 182/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20cleanup=20old?= =?UTF-8?q?=20field=20+=20event=20(#214761)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vs/workbench/api/browser/mainThreadSCM.ts | 11 +++-------- src/vs/workbench/contrib/scm/browser/activity.ts | 2 +- .../contrib/scm/browser/scmRepositoryRenderer.ts | 2 +- src/vs/workbench/contrib/scm/common/scm.ts | 4 +--- 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 352fe587ee1a4..1eb6a593c8a7e 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -235,13 +235,12 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { get historyProvider(): ISCMHistoryProvider | undefined { return this._historyProvider; } get acceptInputCommand(): Command | undefined { return this.features.acceptInputCommand; } get actionButton(): ISCMActionButtonDescriptor | undefined { return this.features.actionButton ?? undefined; } - get statusBarCommands(): Command[] | undefined { return this.features.statusBarCommands; } private readonly _count = observableValue(this, undefined); get count() { return this._count; } - private readonly _statusBarCommandsObs = observableValue(this, undefined); - get statusBarCommandsObs() { return this._statusBarCommandsObs; } + private readonly _statusBarCommands = observableValue(this, undefined); + get statusBarCommands() { return this._statusBarCommands; } private readonly _name: string | undefined; get name(): string { return this._name ?? this._label; } @@ -249,9 +248,6 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { private readonly _commitTemplate = observableValue(this, ''); get commitTemplate() { return this._commitTemplate; } - private readonly _onDidChangeStatusBarCommands = new Emitter(); - get onDidChangeStatusBarCommands(): Event { return this._onDidChangeStatusBarCommands.event; } - private readonly _onDidChangeHistoryProvider = new Emitter(); readonly onDidChangeHistoryProvider: Event = this._onDidChangeHistoryProvider.event; @@ -299,8 +295,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (typeof features.statusBarCommands !== 'undefined') { - this._statusBarCommandsObs.set(features.statusBarCommands, undefined); - this._onDidChangeStatusBarCommands.fire(this.statusBarCommands!); + this._statusBarCommands.set(features.statusBarCommands, undefined); } if (features.hasQuickDiffProvider && !this._quickDiff) { diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index b10cc49d8cbf0..680ad7ccbefc0 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -120,7 +120,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe this._register(autorunWithStore((reader, store) => { const repository = this._activeRepository.read(reader); - const commands = repository?.provider.statusBarCommandsObs.read(reader) ?? []; + const commands = repository?.provider.statusBarCommands.read(reader) ?? []; this._updateStatusBar(repository, commands, store); })); diff --git a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts index d09d5db84400a..53b0e14907119 100644 --- a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts +++ b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts @@ -111,7 +111,7 @@ export class RepositoryRenderer implements ICompressibleTreeRenderer { - const commands = repository.provider.statusBarCommandsObs.read(reader) ?? []; + const commands = repository.provider.statusBarCommands.read(reader) ?? []; statusPrimaryActions = commands.map(c => new StatusBarAction(c, this.commandService)); updateToolbar(); })); diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index db0d666e095ea..5bcd1c6fbe72b 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -78,11 +78,9 @@ export interface ISCMProvider extends IDisposable { readonly historyProvider?: ISCMHistoryProvider; readonly historyProviderObs: IObservable; readonly onDidChangeHistoryProvider: Event; - readonly onDidChangeStatusBarCommands?: Event; readonly acceptInputCommand?: Command; readonly actionButton?: ISCMActionButtonDescriptor; - readonly statusBarCommands?: readonly Command[]; - readonly statusBarCommandsObs: IObservable; + readonly statusBarCommands: IObservable; readonly onDidChange: Event; getOriginalResource(uri: URI): Promise; From d59305421ed0c4872237a7b76aec76967adaba27 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Mon, 10 Jun 2024 18:07:53 +0200 Subject: [PATCH 183/755] update areas (#214793) --- .github/classifier.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/classifier.json b/.github/classifier.json index 44514039e1e64..d0a2c7789977e 100644 --- a/.github/classifier.json +++ b/.github/classifier.json @@ -32,7 +32,7 @@ "debug": {"assign": ["roblourens"]}, "debug-disassembly": {"assign": []}, "dialogs": {"assign": ["sbatten"]}, - "diff-editor": {"assign": ["alexdima"]}, + "diff-editor": {"assign": ["hediet"]}, "dropdown": {"assign": ["lramos15"]}, "editor-api": {"assign": ["alexdima"]}, "editor-autoclosing": {"assign": ["alexdima"]}, @@ -116,7 +116,7 @@ "json": {"assign": ["aeschli"]}, "json-sorting": {"assign": ["aiday-mar"]}, "keybindings": {"assign": ["ulugbekna"]}, - "keybindings-editor": {"assign": ["sandy081"]}, + "keybindings-editor": {"assign": ["ulugbekna"]}, "keyboard-layout": {"assign": ["ulugbekna"]}, "L10N": {"assign": ["TylerLeonhardt", "csigs"]}, "l10n-platform": {"assign": ["TylerLeonhardt"]}, From a643fe6e423aa19eab2c4a87ff3e0712059d7c30 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 10 Jun 2024 09:32:53 -0700 Subject: [PATCH 184/755] fix accessibility signals (#214799) --- .../browser/accessibilitySignalService.ts | 19 ++++++++++++++----- .../editorTextPropertySignalsContribution.ts | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts b/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts index 65515c237adae..be21278dc6482 100644 --- a/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts +++ b/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts @@ -26,7 +26,7 @@ export interface IAccessibilitySignalService { playSignalLoop(signal: AccessibilitySignal, milliseconds: number): IDisposable; getEnabledState(signal: AccessibilitySignal, userGesture: boolean, modality?: AccessibilityModality | undefined): IValueWithChangeEvent; - getDelayMs(signal: AccessibilitySignal, modality: AccessibilityModality): number; + getDelayMs(signal: AccessibilitySignal, modality: AccessibilityModality, mode: 'line' | 'positional'): number; /** * Avoid this method and prefer `.playSignal`! * Only use it when you want to play the sound regardless of enablement, e.g. in the settings quick pick. @@ -241,10 +241,19 @@ export class AccessibilitySignalService extends Disposable implements IAccessibi return this.getEnabledState(signal, false).onDidChange; } - public getDelayMs(signal: AccessibilitySignal, modality: AccessibilityModality): number { - const delaySettingsKey = signal.delaySettingsKey ?? 'accessibility.signalOptions.delays.general'; - const delaySettingsValue: { sound: number; announcement: number } = this.configurationService.getValue(delaySettingsKey); - return modality === 'sound' ? delaySettingsValue.sound : delaySettingsValue.announcement; + public getDelayMs(signal: AccessibilitySignal, modality: AccessibilityModality, mode: 'line' | 'positional'): number { + if (!this.configurationService.getValue('accessibility.signalOptions.debouncePositionChanges')) { + return 0; + } + let value: { sound: number; announcement: number }; + if (signal.name === AccessibilitySignal.errorAtPosition.name && mode === 'positional') { + value = this.configurationService.getValue('accessibility.signalOptions.experimental.delays.errorAtPosition'); + } else if (signal.name === AccessibilitySignal.warningAtPosition.name && mode === 'positional') { + value = this.configurationService.getValue('accessibility.signalOptions.experimental.delays.warningAtPosition'); + } else { + value = this.configurationService.getValue('accessibility.signalOptions.experimental.delays.general'); + } + return modality === 'sound' ? value.sound : value.announcement; } } diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts b/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts index de1c2f798afa7..cb6eb229ec03b 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts +++ b/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts @@ -104,7 +104,7 @@ export class EditorTextPropertySignalsContribution extends Disposable implements for (const modality of ['sound', 'announcement'] as AccessibilityModality[]) { if (this._accessibilitySignalService.getEnabledState(signal, false, modality).value) { - const delay = this._accessibilitySignalService.getDelayMs(signal, modality) + (didType.get() ? 1000 : 0); + const delay = this._accessibilitySignalService.getDelayMs(signal, modality, mode) + (didType.get() ? 1000 : 0); timeouts.add(disposableTimeout(() => { if (source.isPresent(position, mode, undefined)) { From 4d6d7930e876d701c60f06419c9423d201c0904c Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 10 Jun 2024 10:54:59 -0700 Subject: [PATCH 185/755] Kick off issue locker early (#214804) --- .github/workflows/locker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index ef775ce8fdfb7..dde4652d3f6f2 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -1,7 +1,7 @@ name: Locker on: schedule: - - cron: 20 23 * * * # 4:20pm Redmond + - cron: 20 18 * * * # 11:20am Redmond repository_dispatch: types: [trigger-locker] From 4de39a56748f18dac91e2b6221f41ec068c3adb1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 10 Jun 2024 20:06:14 +0200 Subject: [PATCH 186/755] polish (#214806) --- .../common/abstractExtensionManagementService.ts | 2 +- .../browser/media/userDataProfilesEditor.css | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 4d9e5a7a30597..f7834854d97d3 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -206,7 +206,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const key = `${getGalleryExtensionId(manifest.publisher, manifest.name)}-${options.profileLocation.toString()}`; installingExtensionsMap.set(key, { task: installExtensionTask, root }); this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: options.profileLocation }); - this.logService.info('Installing extension:', installExtensionTask.identifier.id, options.profileLocation.toString()); + this.logService.info('Installing extension:', installExtensionTask.identifier.id, options); // only cache gallery extensions tasks if (!URI.isUri(extension)) { this.installingExtensions.set(getInstallExtensionTaskKey(extension, options.profileLocation), { task: installExtensionTask, waitingTasks: [] }); diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index f1054b365c53d..173906b798da1 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -115,7 +115,8 @@ } .profiles-editor .contents-container .profile-title-container .monaco-inputbox { - width: 340px; + max-width: 340px; + flex: 1; } .profiles-editor .contents-container .profile-header .profile-button-container { @@ -201,7 +202,7 @@ .profiles-editor .contents-container .profile-content-tree-header { display: grid; - grid-template-columns: 30px repeat(2, 1fr) 100px; + grid-template-columns: 30px repeat(1, 1fr) 150px 100px; height: 24px; align-items: center; margin-bottom: 2px; @@ -216,7 +217,7 @@ .profiles-editor .contents-container .profile-tree-item-container.existing-profile-resource-type-container { display: grid; - grid-template-columns: repeat(2, 1fr) 100px; + grid-template-columns: repeat(1, 1fr) 150px 100px; } .profiles-editor .contents-container .profile-content-tree-header > .inherit-label, From cd55bece7120084889c93508b132463ad892de76 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 10 Jun 2024 12:06:33 -0700 Subject: [PATCH 187/755] Locker: Run on the 20th min of every hour (#214812) --- .github/workflows/locker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index dde4652d3f6f2..9ada920b9d30f 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -1,7 +1,7 @@ name: Locker on: schedule: - - cron: 20 18 * * * # 11:20am Redmond + - cron: 20 * * * * # run on the 20th minute of every hour repository_dispatch: types: [trigger-locker] From a22269e421bf460cabf8c87bc8cffdb46ee20382 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 10 Jun 2024 13:38:37 -0700 Subject: [PATCH 188/755] Faster printf in bash SI script Part of #212090 --- .../browser/media/shellIntegration-bash.sh | 59 +++++-------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index 69e0630da4e26..1b77a3c7bb9f4 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -112,48 +112,26 @@ __vsc_escape_value() { fi # Process text byte by byte, not by codepoint. - builtin local LC_ALL=C str="${1}" i byte token out='' + local -r LC_ALL=C + local -r str="${1}" + local -ir len="${#str}" + + local -i i + local -i val + local byte + local token + local out='' for (( i=0; i < "${#str}"; ++i )); do - byte="${str:$i:1}" # Escape backslashes, semi-colons specially, then special ASCII chars below space (0x20). - # This is done in an unwrapped loop instead of using printf as the latter is very slow. - if [ "$byte" = "\\" ]; then + byte="${str:$i:1}" + builtin printf -v val '%d' "'$byte" + if (( val < 31 )); then + builtin printf -v token '\\x%02x' "'$byte" + elif (( val == 92 )); then token="\\\\" - elif [ "$byte" = ";" ]; then + elif (( val == 59 )); then token="\\x3b" - elif [ "$byte" = $'\x00' ]; then token="\\x00" - elif [ "$byte" = $'\x01' ]; then token="\\x01" - elif [ "$byte" = $'\x02' ]; then token="\\x02" - elif [ "$byte" = $'\x03' ]; then token="\\x03" - elif [ "$byte" = $'\x04' ]; then token="\\x04" - elif [ "$byte" = $'\x05' ]; then token="\\x05" - elif [ "$byte" = $'\x06' ]; then token="\\x06" - elif [ "$byte" = $'\x07' ]; then token="\\x07" - elif [ "$byte" = $'\x08' ]; then token="\\x08" - elif [ "$byte" = $'\x09' ]; then token="\\x09" - elif [ "$byte" = $'\x0a' ]; then token="\\x0a" - elif [ "$byte" = $'\x0b' ]; then token="\\x0b" - elif [ "$byte" = $'\x0c' ]; then token="\\x0c" - elif [ "$byte" = $'\x0d' ]; then token="\\x0d" - elif [ "$byte" = $'\x0e' ]; then token="\\x0e" - elif [ "$byte" = $'\x0f' ]; then token="\\x0f" - elif [ "$byte" = $'\x10' ]; then token="\\x10" - elif [ "$byte" = $'\x11' ]; then token="\\x11" - elif [ "$byte" = $'\x12' ]; then token="\\x12" - elif [ "$byte" = $'\x13' ]; then token="\\x13" - elif [ "$byte" = $'\x14' ]; then token="\\x14" - elif [ "$byte" = $'\x15' ]; then token="\\x15" - elif [ "$byte" = $'\x16' ]; then token="\\x16" - elif [ "$byte" = $'\x17' ]; then token="\\x17" - elif [ "$byte" = $'\x18' ]; then token="\\x18" - elif [ "$byte" = $'\x19' ]; then token="\\x19" - elif [ "$byte" = $'\x1a' ]; then token="\\x1a" - elif [ "$byte" = $'\x1b' ]; then token="\\x1b" - elif [ "$byte" = $'\x1c' ]; then token="\\x1c" - elif [ "$byte" = $'\x1d' ]; then token="\\x1d" - elif [ "$byte" = $'\x1e' ]; then token="\\x1e" - elif [ "$byte" = $'\x1f' ]; then token="\\x1f" else token="$byte" fi @@ -161,7 +139,7 @@ __vsc_escape_value() { out+="$token" done - builtin printf '%s\n' "${out}" + builtin printf '%s\n' "$out" } # Send the IsWindows property if the environment looks like Windows @@ -196,11 +174,6 @@ unset VSCODE_NONCE builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a" __vsc_report_prompt() { - # HACK: Git bash is too slow at reporting the prompt, so skip for now - if [ "$__vsc_is_windows" = "1" ]; then - return - fi - # Expand the original PS1 similarly to how bash would normally # See https://stackoverflow.com/a/37137981 for technique if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then From 8221269a112953f00193dd33cef23678fd0cc6b4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 10 Jun 2024 13:39:36 -0700 Subject: [PATCH 189/755] Add comment for char codes --- .../contrib/terminal/browser/media/shellIntegration-bash.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index 1b77a3c7bb9f4..1b6d1f62a66ef 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -128,9 +128,9 @@ __vsc_escape_value() { builtin printf -v val '%d' "'$byte" if (( val < 31 )); then builtin printf -v token '\\x%02x' "'$byte" - elif (( val == 92 )); then + elif (( val == 92 )); then # \ token="\\\\" - elif (( val == 59 )); then + elif (( val == 59 )); then # ; token="\\x3b" else token="$byte" From 878a5c82833eb67ce510bcb7aac0f0c17b64a219 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 11 Jun 2024 00:11:58 +0200 Subject: [PATCH 190/755] SCM - add logging to track down smoke test failure (#214813) --- src/vs/workbench/api/browser/mainThreadSCM.ts | 10 +++++++--- src/vs/workbench/api/common/extHostSCM.ts | 5 ++++- .../workbench/contrib/scm/browser/activity.ts | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 1eb6a593c8a7e..2c632a72c0f29 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -27,6 +27,7 @@ import { IModelService } from 'vs/editor/common/services/model'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { Schemas } from 'vs/base/common/network'; import { ITextModel } from 'vs/editor/common/model'; +import { ILogService } from 'vs/platform/log/common/log'; function getIconFromIconDto(iconDto?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon): URI | { light: URI; dark: URI } | ThemeIcon | undefined { if (iconDto === undefined) { @@ -270,7 +271,8 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { private readonly _inputBoxTextModel: ITextModel, private readonly _quickDiffService: IQuickDiffService, private readonly _uriIdentService: IUriIdentityService, - private readonly _workspaceContextService: IWorkspaceContextService + private readonly _workspaceContextService: IWorkspaceContextService, + private readonly _logService: ILogService ) { if (_rootUri) { const folder = this._workspaceContextService.getWorkspaceFolder(_rootUri); @@ -295,6 +297,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (typeof features.statusBarCommands !== 'undefined') { + this._logService.info('MainThreadSCMProvider#updateSourceControl:', features.statusBarCommands.map(c => c.title).join(', ')); this._statusBarCommands.set(features.statusBarCommands, undefined); } @@ -475,7 +478,8 @@ export class MainThreadSCM implements MainThreadSCMShape { @ITextModelService private readonly textModelService: ITextModelService, @IQuickDiffService private readonly quickDiffService: IQuickDiffService, @IUriIdentityService private readonly _uriIdentService: IUriIdentityService, - @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService + @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, + @ILogService private readonly logService: ILogService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSCM); @@ -496,7 +500,7 @@ export class MainThreadSCM implements MainThreadSCMShape { this._repositoryBarriers.set(handle, new Barrier()); const inputBoxTextModelRef = await this.textModelService.createModelReference(URI.revive(inputBoxDocumentUri)); - const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService); + const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService, this.logService); const repository = this.scmService.registerSCMProvider(provider); this._repositories.set(handle, repository); diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index c746b79ed3556..14dbf15e9e203 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -647,7 +647,9 @@ class ExtHostSourceControl implements vscode.SourceControl { } set statusBarCommands(statusBarCommands: vscode.Command[] | undefined) { + this.logService.info('ExtHostSourceControl#statusBarCommands', (statusBarCommands ?? []).map(c => c.command).join(', ')); if (this._statusBarCommands && statusBarCommands && commandListEquals(this._statusBarCommands, statusBarCommands)) { + this.logService.info('ExtHostSourceControl#statusBarCommands are equal'); return; } @@ -675,6 +677,7 @@ class ExtHostSourceControl implements vscode.SourceControl { _extHostDocuments: ExtHostDocuments, proxy: MainThreadSCMShape, private _commands: ExtHostCommands, + private readonly logService: ILogService, private _id: string, private _label: string, private _rootUri?: vscode.Uri @@ -854,7 +857,7 @@ export class ExtHostSCM implements ExtHostSCMShape { }); const handle = ExtHostSCM._handlePool++; - const sourceControl = new ExtHostSourceControl(extension, this._extHostDocuments, this._proxy, this._commands, id, label, rootUri); + const sourceControl = new ExtHostSourceControl(extension, this._extHostDocuments, this._proxy, this._commands, this.logService, id, label, rootUri); this._sourceControls.set(handle, sourceControl); const sourceControls = this._sourceControlsByExtension.get(extension.identifier) || []; diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 680ad7ccbefc0..4302fdb78b622 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -27,6 +27,7 @@ import { observableConfigValue } from 'vs/platform/observable/common/platformObs import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts } from 'vs/base/common/observableInternal/utils'; import { Command } from 'vs/editor/common/languages'; import { ISCMHistoryItemGroup } from 'vs/workbench/contrib/scm/common/history'; +import { ILogService } from 'vs/platform/log/common/log'; export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -99,6 +100,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe @IConfigurationService private readonly configurationService: IConfigurationService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IEditorService private readonly editorService: IEditorService, + @ILogService private readonly logService: ILogService, @ISCMService private readonly scmService: ISCMService, @ISCMViewService private readonly scmViewService: ISCMViewService, @IStatusbarService private readonly statusbarService: IStatusbarService, @@ -118,9 +120,24 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe this._updateActivityCountBadge(this._countBadge.read(reader), store); })); + this._register(autorun(reader => { + const repository = this._focusedRepository.read(reader); + const commands = repository?.provider.statusBarCommands.read(reader) ?? []; + + this.logService.info('SCMActiveRepositoryController (focusedRepository):', commands.map(c => c.title).join(', ')); + })); + + this._register(autorun(reader => { + const repository = this._activeEditorRepository.read(reader); + const commands = repository?.provider.statusBarCommands.read(reader) ?? []; + + this.logService.info('SCMActiveRepositoryController (activeEditorRepository):', commands.map(c => c.title).join(', ')); + })); + this._register(autorunWithStore((reader, store) => { const repository = this._activeRepository.read(reader); const commands = repository?.provider.statusBarCommands.read(reader) ?? []; + this.logService.info('SCMActiveRepositoryController (status bar):', commands.map(c => c.title).join(', ')); this._updateStatusBar(repository, commands, store); })); @@ -148,6 +165,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private _updateStatusBar(repository: ISCMRepository | undefined, commands: readonly Command[], store: DisposableStore): void { if (!repository) { + this.logService.info('SCMActiveRepositoryController (status bar): repository is undefined'); return; } From 3ab5eedb1447200c19af77af59923744003d9f48 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Tue, 11 Jun 2024 08:22:09 +0200 Subject: [PATCH 191/755] Fixing command move regression (#214577) * adding console logs * polishing the code --- .../browser/moveLinesCommand.ts | 102 ++++++++++++------ 1 file changed, 68 insertions(+), 34 deletions(-) diff --git a/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts b/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts index 68614a2f432f9..09c8a4db8abd9 100644 --- a/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts +++ b/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts @@ -42,6 +42,13 @@ export class MoveLinesCommand implements ICommand { public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void { + const getLanguageId = () => { + return model.getLanguageId(); + }; + const getLanguageIdAtPosition = (lineNumber: number, column: number) => { + return model.getLanguageIdAtPosition(lineNumber, column); + }; + const modelLineCount = model.getLineCount(); if (this._isMovingDown && this._selection.endLineNumber === modelLineCount) { @@ -63,20 +70,6 @@ export class MoveLinesCommand implements ICommand { const { tabSize, indentSize, insertSpaces } = model.getOptions(); const indentConverter = this.buildIndentConverter(tabSize, indentSize, insertSpaces); - const virtualModel: IVirtualModel = { - tokenization: { - getLineTokens: (lineNumber: number) => { - return model.tokenization.getLineTokens(lineNumber); - }, - getLanguageId: () => { - return model.getLanguageId(); - }, - getLanguageIdAtPosition: (lineNumber: number, column: number) => { - return model.getLanguageIdAtPosition(lineNumber, column); - }, - }, - getLineContent: null as unknown as (lineNumber: number) => string, - }; if (s.startLineNumber === s.endLineNumber && model.getLineMaxColumn(s.startLineNumber) === 1) { // Current line is empty @@ -120,12 +113,25 @@ export class MoveLinesCommand implements ICommand { insertingText = newIndentation + this.trimStart(movingLineText); } else { // no enter rule matches, let's check indentatin rules then. - virtualModel.getLineContent = (lineNumber: number) => { - if (lineNumber === s.startLineNumber) { - return model.getLineContent(movingLineNumber); - } else { - return model.getLineContent(lineNumber); - } + const virtualModel: IVirtualModel = { + tokenization: { + getLineTokens: (lineNumber: number) => { + if (lineNumber === s.startLineNumber) { + return model.tokenization.getLineTokens(movingLineNumber); + } else { + return model.tokenization.getLineTokens(lineNumber); + } + }, + getLanguageId, + getLanguageIdAtPosition, + }, + getLineContent: (lineNumber: number) => { + if (lineNumber === s.startLineNumber) { + return model.getLineContent(movingLineNumber); + } else { + return model.getLineContent(lineNumber); + } + }, }; const indentOfMovingLine = getGoodIndentForLine( this._autoIndent, @@ -159,14 +165,29 @@ export class MoveLinesCommand implements ICommand { } } else { // it doesn't match onEnter rules, let's check indentation rules then. - virtualModel.getLineContent = (lineNumber: number) => { - if (lineNumber === s.startLineNumber) { - return insertingText; - } else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) { - return model.getLineContent(lineNumber - 1); - } else { - return model.getLineContent(lineNumber); - } + const virtualModel: IVirtualModel = { + tokenization: { + getLineTokens: (lineNumber: number) => { + if (lineNumber === s.startLineNumber) { + return model.tokenization.getLineTokens(movingLineNumber); + } else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) { + return model.tokenization.getLineTokens(lineNumber - 1); + } else { + return model.tokenization.getLineTokens(lineNumber); + } + }, + getLanguageId, + getLanguageIdAtPosition, + }, + getLineContent: (lineNumber: number) => { + if (lineNumber === s.startLineNumber) { + return insertingText; + } else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) { + return model.getLineContent(lineNumber - 1); + } else { + return model.getLineContent(lineNumber); + } + }, }; const newIndentatOfMovingBlock = getGoodIndentForLine( @@ -204,12 +225,25 @@ export class MoveLinesCommand implements ICommand { builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\n' + movingLineText); if (this.shouldAutoIndent(model, s)) { - virtualModel.getLineContent = (lineNumber: number) => { - if (lineNumber === movingLineNumber) { - return model.getLineContent(s.startLineNumber); - } else { - return model.getLineContent(lineNumber); - } + const virtualModel: IVirtualModel = { + tokenization: { + getLineTokens: (lineNumber: number) => { + if (lineNumber === movingLineNumber) { + return model.tokenization.getLineTokens(s.startLineNumber); + } else { + return model.tokenization.getLineTokens(lineNumber); + } + }, + getLanguageId, + getLanguageIdAtPosition, + }, + getLineContent: (lineNumber: number) => { + if (lineNumber === movingLineNumber) { + return model.getLineContent(s.startLineNumber); + } else { + return model.getLineContent(lineNumber); + } + }, }; const ret = this.matchEnterRule(model, indentConverter, tabSize, s.startLineNumber, s.startLineNumber - 2); From a5d165b6cfa933e43028b192552b7da9857eb523 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 11 Jun 2024 08:53:04 +0200 Subject: [PATCH 192/755] Watcher Perf: TypeScript 5.5 asks to watch thousands of non-existing paths (fix #214765) (#214842) --- .../files/node/watcher/baseWatcher.ts | 20 ++++++++++++------- .../node/nodejsWatcher.integrationTest.ts | 4 ++++ .../node/parcelWatcher.integrationTest.ts | 4 ++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/files/node/watcher/baseWatcher.ts b/src/vs/platform/files/node/watcher/baseWatcher.ts index 3576f20d4f7bc..c5665396da9b4 100644 --- a/src/vs/platform/files/node/watcher/baseWatcher.ts +++ b/src/vs/platform/files/node/watcher/baseWatcher.ts @@ -9,7 +9,7 @@ import { ILogMessage, IRecursiveWatcherWithSubscribe, IUniversalWatchRequest, IW import { Emitter, Event } from 'vs/base/common/event'; import { FileChangeType, IFileChange } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; -import { DeferredPromise } from 'vs/base/common/async'; +import { DeferredPromise, ThrottledDelayer } from 'vs/base/common/async'; export abstract class BaseWatcher extends Disposable implements IWatcher { @@ -28,6 +28,8 @@ export abstract class BaseWatcher extends Disposable implements IWatcher { private readonly suspendedWatchRequests = this._register(new DisposableMap()); private readonly suspendedWatchRequestsWithPolling = new Set(); + private readonly updateWatchersDelayer = this._register(new ThrottledDelayer(this.getUpdateWatchersDelay())); + protected readonly suspendedWatchRequestPollingInterval: number = 5007; // node.js default private joinWatch = new DeferredPromise(); @@ -88,17 +90,21 @@ export abstract class BaseWatcher extends Disposable implements IWatcher { } } - return await this.updateWatchers(); + return await this.updateWatchers(false /* not delayed */); } finally { this.joinWatch.complete(); } } - private updateWatchers(): Promise { - return this.doWatch([ + private updateWatchers(delayed: boolean): Promise { + return this.updateWatchersDelayer.trigger(() => this.doWatch([ ...this.allNonCorrelatedWatchRequests, ...Array.from(this.allCorrelatedWatchRequests.values()).filter(request => !this.suspendedWatchRequests.has(request.correlationId)) - ]); + ]), delayed ? this.getUpdateWatchersDelay() : 0); + } + + protected getUpdateWatchersDelay(): number { + return 800; } isSuspended(request: IUniversalWatchRequest): 'polling' | boolean { @@ -130,14 +136,14 @@ export abstract class BaseWatcher extends Disposable implements IWatcher { this.monitorSuspendedWatchRequest(request, disposables); - this.updateWatchers(); + this.updateWatchers(true /* delay this call as we might accumulate many failing watch requests on startup */); } private resumeWatchRequest(request: IWatchRequestWithCorrelation): void { this.suspendedWatchRequests.deleteAndDispose(request.correlationId); this.suspendedWatchRequestsWithPolling.delete(request.correlationId); - this.updateWatchers(); + this.updateWatchers(false); } private monitorSuspendedWatchRequest(request: IWatchRequestWithCorrelation, disposables: DisposableStore): void { diff --git a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts index f4eaa0f2aac66..77b3946042d4e 100644 --- a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts @@ -40,6 +40,10 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int readonly onWatchFail = this._onDidWatchFail.event; + protected override getUpdateWatchersDelay(): number { + return 0; + } + protected override async doWatch(requests: INonRecursiveWatchRequest[]): Promise { await super.doWatch(requests); for (const watcher of this.watchers) { diff --git a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts index 5bbeefc9036d3..341edbff2a109 100644 --- a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts @@ -42,6 +42,10 @@ export class TestParcelWatcher extends ParcelWatcher { return this.removeDuplicateRequests(requests, false /* validate paths skipped for tests */).map(request => request.path); } + protected override getUpdateWatchersDelay(): number { + return 0; + } + protected override async doWatch(requests: IRecursiveWatchRequest[]): Promise { await super.doWatch(requests); await this.whenReady(); From fc8e4df4cd6f81dd1d0dbaeadd5567b41d0851d6 Mon Sep 17 00:00:00 2001 From: powersagitar <114868133+powersagitar@users.noreply.github.com> Date: Tue, 11 Jun 2024 06:38:21 -0400 Subject: [PATCH 193/755] Add file extensions for C++20 module interface units (#214800) Add file extensions: C++20 module interface units --- extensions/cpp/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/cpp/package.json b/extensions/cpp/package.json index c1d3f4882f628..9f3c890a48bbd 100644 --- a/extensions/cpp/package.json +++ b/extensions/cpp/package.json @@ -30,9 +30,13 @@ "id": "cpp", "extensions": [ ".cpp", + ".cppm", ".cc", + ".ccm", ".cxx", + ".cxxm", ".c++", + ".c++m", ".hpp", ".hh", ".hxx", From 0fd9a006f7abcb48ef1e5a9f9ceeca33e1d1daaa Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:18:42 +0200 Subject: [PATCH 194/755] SCM - limit logging to smoke tests only (#214865) * SCM - smoke test fix + more logging * SCM - limit logging to smoke tests only --- src/vs/workbench/api/browser/mainThreadSCM.ts | 9 ++- .../workbench/contrib/scm/browser/activity.ts | 58 +++++++++++++------ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 2c632a72c0f29..b3c3f8b88485f 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -28,6 +28,7 @@ import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/s import { Schemas } from 'vs/base/common/network'; import { ITextModel } from 'vs/editor/common/model'; import { ILogService } from 'vs/platform/log/common/log'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; function getIconFromIconDto(iconDto?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon): URI | { light: URI; dark: URI } | ThemeIcon | undefined { if (iconDto === undefined) { @@ -272,6 +273,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { private readonly _quickDiffService: IQuickDiffService, private readonly _uriIdentService: IUriIdentityService, private readonly _workspaceContextService: IWorkspaceContextService, + private readonly _environmentService: IWorkbenchEnvironmentService, private readonly _logService: ILogService ) { if (_rootUri) { @@ -297,7 +299,9 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (typeof features.statusBarCommands !== 'undefined') { - this._logService.info('MainThreadSCMProvider#updateSourceControl:', features.statusBarCommands.map(c => c.title).join(', ')); + if (this._environmentService.enableSmokeTestDriver) { + this._logService.info(`MainThreadSCMProvider#updateSourceControl (${this._id}): ${features.statusBarCommands.map(c => c.title).join(', ')}`); + } this._statusBarCommands.set(features.statusBarCommands, undefined); } @@ -479,6 +483,7 @@ export class MainThreadSCM implements MainThreadSCMShape { @IQuickDiffService private readonly quickDiffService: IQuickDiffService, @IUriIdentityService private readonly _uriIdentService: IUriIdentityService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @ILogService private readonly logService: ILogService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSCM); @@ -500,7 +505,7 @@ export class MainThreadSCM implements MainThreadSCMShape { this._repositoryBarriers.set(handle, new Barrier()); const inputBoxTextModelRef = await this.textModelService.createModelReference(URI.revive(inputBoxDocumentUri)); - const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService, this.logService); + const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService, this.environmentService, this.logService); const repository = this.scmService.registerSCMProvider(provider); this._repositories.set(handle, repository); diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 4302fdb78b622..608f31a575552 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -28,6 +28,7 @@ import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts import { Command } from 'vs/editor/common/languages'; import { ISCMHistoryItemGroup } from 'vs/workbench/contrib/scm/common/history'; import { ILogService } from 'vs/platform/log/common/log'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -49,18 +50,28 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private readonly _activeEditorRepository = derivedObservableWithCache(this, (reader, lastValue) => { const activeResource = EditorResourceAccessor.getOriginalUri(this._activeEditor.read(reader)); if (!activeResource) { + if (this.environmentService.enableSmokeTestDriver) { + this.logService.info('SCMActiveRepositoryController (activeEditorRepository derived): no activeResource'); + } return lastValue; } const repository = this.scmService.getRepository(activeResource); if (!repository) { + if (this.environmentService.enableSmokeTestDriver) { + this.logService.info(`SCMActiveRepositoryController (activeEditorRepository derived): no repository for '${activeResource.toString()}'`); + } return lastValue; } return Object.create(repository); }); - private readonly _activeRepository = latestChangedValue(this._focusedRepository, this._activeEditorRepository); + /** + * The focused repository takes precedence over the active editor repository when the observable + * values are updated in the same transaction (or during the initial read of the observable value). + */ + private readonly _activeRepository = latestChangedValue(this._activeEditorRepository, this._focusedRepository); private readonly _countBadgeRepositories = derived(reader => { switch (this._countBadgeConfig.read(reader)) { @@ -104,7 +115,8 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe @ISCMService private readonly scmService: ISCMService, @ISCMViewService private readonly scmViewService: ISCMViewService, @IStatusbarService private readonly statusbarService: IStatusbarService, - @ITitleService private readonly titleService: ITitleService + @ITitleService private readonly titleService: ITitleService, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService ) { super(); @@ -116,30 +128,38 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe { name: 'activeRepositoryBranchName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryBranchName.key, } ]); - this._register(autorunWithStore((reader, store) => { - this._updateActivityCountBadge(this._countBadge.read(reader), store); - })); + if (this.environmentService.enableSmokeTestDriver) { + this._register(autorun(reader => { + const repository = this._focusedRepository.read(reader); + const commands = repository?.provider.statusBarCommands.read(reader); - this._register(autorun(reader => { - const repository = this._focusedRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader) ?? []; + this.logService.info('SCMActiveRepositoryController (focusedRepository):', repository?.id ?? 'no id'); + this.logService.info('SCMActiveRepositoryController (focusedRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); + })); - this.logService.info('SCMActiveRepositoryController (focusedRepository):', commands.map(c => c.title).join(', ')); - })); + this._register(autorun(reader => { + const repository = this._activeEditorRepository.read(reader); + const commands = repository?.provider.statusBarCommands.read(reader); - this._register(autorun(reader => { - const repository = this._activeEditorRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader) ?? []; + this.logService.info('SCMActiveRepositoryController (activeEditorRepository):', repository?.id ?? 'no id'); + this.logService.info('SCMActiveRepositoryController (activeEditorRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); + })); + } - this.logService.info('SCMActiveRepositoryController (activeEditorRepository):', commands.map(c => c.title).join(', ')); + this._register(autorunWithStore((reader, store) => { + this._updateActivityCountBadge(this._countBadge.read(reader), store); })); this._register(autorunWithStore((reader, store) => { const repository = this._activeRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader) ?? []; - this.logService.info('SCMActiveRepositoryController (status bar):', commands.map(c => c.title).join(', ')); + const commands = repository?.provider.statusBarCommands.read(reader); - this._updateStatusBar(repository, commands, store); + if (this.environmentService.enableSmokeTestDriver) { + this.logService.info('SCMActiveRepositoryController (status bar):', repository?.id ?? 'no id'); + this.logService.info('SCMActiveRepositoryController (status bar):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); + } + + this._updateStatusBar(repository, commands ?? [], store); })); this._register(autorun(reader => { @@ -165,7 +185,9 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private _updateStatusBar(repository: ISCMRepository | undefined, commands: readonly Command[], store: DisposableStore): void { if (!repository) { - this.logService.info('SCMActiveRepositoryController (status bar): repository is undefined'); + if (this.environmentService.enableSmokeTestDriver) { + this.logService.info('SCMActiveRepositoryController (status bar): repository is undefined'); + } return; } From 5adc4dcb025aac567c55100c4f2777614644de89 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Tue, 11 Jun 2024 16:16:17 +0200 Subject: [PATCH 195/755] Adding a todo inside of `moveLinesCommand` file (#214880) adding a todo --- .../editor/contrib/linesOperations/browser/moveLinesCommand.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts b/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts index 09c8a4db8abd9..9a4f6800938f7 100644 --- a/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts +++ b/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts @@ -169,6 +169,7 @@ export class MoveLinesCommand implements ICommand { tokenization: { getLineTokens: (lineNumber: number) => { if (lineNumber === s.startLineNumber) { + // TODO@aiday-mar: the tokens here don't correspond exactly to the corresponding content (after indentation adjustment), have to fix this. return model.tokenization.getLineTokens(movingLineNumber); } else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) { return model.tokenization.getLineTokens(lineNumber - 1); From 085b38d1407444b7791bd36d47529771752a9b57 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Tue, 11 Jun 2024 09:58:13 -0700 Subject: [PATCH 196/755] Revert Locker schedule to run once a day (#214893) --- .github/workflows/locker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml index 9ada920b9d30f..ef775ce8fdfb7 100644 --- a/.github/workflows/locker.yml +++ b/.github/workflows/locker.yml @@ -1,7 +1,7 @@ name: Locker on: schedule: - - cron: 20 * * * * # run on the 20th minute of every hour + - cron: 20 23 * * * # 4:20pm Redmond repository_dispatch: types: [trigger-locker] From c493ffc0fa507da5e5f042dd0f837c238145f31c Mon Sep 17 00:00:00 2001 From: Andy Hippo Date: Tue, 11 Jun 2024 20:18:57 +0200 Subject: [PATCH 197/755] Fix error message format --- src/vs/workbench/api/common/extHostLanguageFeatures.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 215ff5fda3722..be98bd49d0dce 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -501,9 +501,9 @@ class CodeActionAdapter { } else { if (codeActionContext.only) { if (!candidate.kind) { - this._logService.warn(`${this._extension.identifier.value} - Code actions of kind '${codeActionContext.only.value} 'requested but returned code action does not have a 'kind'. Code action will be dropped. Please set 'CodeAction.kind'.`); + this._logService.warn(`${this._extension.identifier.value} - Code actions of kind '${codeActionContext.only.value}' requested but returned code action does not have a 'kind'. Code action will be dropped. Please set 'CodeAction.kind'.`); } else if (!codeActionContext.only.contains(candidate.kind)) { - this._logService.warn(`${this._extension.identifier.value} - Code actions of kind '${codeActionContext.only.value} 'requested but returned code action is of kind '${candidate.kind.value}'. Code action will be dropped. Please check 'CodeActionContext.only' to only return requested code actions.`); + this._logService.warn(`${this._extension.identifier.value} - Code actions of kind '${codeActionContext.only.value}' requested but returned code action is of kind '${candidate.kind.value}'. Code action will be dropped. Please check 'CodeActionContext.only' to only return requested code actions.`); } } From 6309d220746e89910b31329fc9a1104fcfe2405c Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 11 Jun 2024 11:40:05 -0700 Subject: [PATCH 198/755] debug: preserve the top of stack when stepping in or at BP (#214901) Refs #214433 --- src/vs/workbench/contrib/debug/common/debugModel.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/common/debugModel.ts b/src/vs/workbench/contrib/debug/common/debugModel.ts index 13f7d1d902dc3..7a89fef9383da 100644 --- a/src/vs/workbench/contrib/debug/common/debugModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugModel.ts @@ -540,6 +540,8 @@ export class StackFrame implements IStackFrame { } } +const KEEP_SUBTLE_FRAME_AT_TOP_REASONS: readonly string[] = ['breakpoint', 'step', 'function breakpoint']; + export class Thread implements IThread { private callStack: IStackFrame[]; private staleCallStack: IStackFrame[]; @@ -578,10 +580,11 @@ export class Thread implements IThread { getTopStackFrame(): IStackFrame | undefined { const callStack = this.getCallStack(); + const stopReason = this.stoppedDetails?.reason; // Allow stack frame without source and with instructionReferencePointer as top stack frame when using disassembly view. const firstAvailableStackFrame = callStack.find(sf => !!( - ((this.stoppedDetails?.reason === 'instruction breakpoint' || (this.stoppedDetails?.reason === 'step' && this.lastSteppingGranularity === 'instruction')) && sf.instructionPointerReference) || - (sf.source && sf.source.available && !isFrameDeemphasized(sf)))); + ((stopReason === 'instruction breakpoint' || (stopReason === 'step' && this.lastSteppingGranularity === 'instruction')) && sf.instructionPointerReference) || + (sf.source && sf.source.available && (KEEP_SUBTLE_FRAME_AT_TOP_REASONS.includes(stopReason!) || !isFrameDeemphasized(sf))))); return firstAvailableStackFrame; } From e46527908d0c17d23106447ec72154ca3b1e59d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:47:34 -0700 Subject: [PATCH 199/755] Bump braces from 3.0.2 to 3.0.3 in /extensions (#214866) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extensions/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/yarn.lock b/extensions/yarn.lock index cb3213ad8e75e..c0892f0655d94 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -128,11 +128,11 @@ node-gyp-build "^4.3.0" braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" coffeescript@1.12.7: version "1.12.7" @@ -180,10 +180,10 @@ fast-plist@0.1.2: resolved "https://registry.yarnpkg.com/fast-plist/-/fast-plist-0.1.2.tgz#a45aff345196006d406ca6cdcd05f69051ef35b8" integrity sha1-pFr/NFGWAG1AbKbNzQX2kFHvNbg= -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" From 51d598183ea632c658c34e0a11da5706192a1b69 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 11 Jun 2024 21:58:19 +0200 Subject: [PATCH 200/755] fix #214778 (#214908) --- .../extensionManagement/common/extensionManagementCLI.ts | 4 ++-- .../contrib/extensions/browser/extensionsWorkbenchService.ts | 1 + .../extensionManagement/common/extensionManagementService.ts | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts b/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts index 9241f4170ab8c..17c76f6fe7040 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts @@ -146,7 +146,7 @@ export class ExtensionManagementCLI { if (areSameExtensions(oldVersion.identifier, newVersion.identifier) && gt(newVersion.version, oldVersion.manifest.version)) { extensionsToUpdate.push({ extension: newVersion, - options: { operation: InstallOperation.Update, installPreReleaseVersion: oldVersion.preRelease, profileLocation } + options: { operation: InstallOperation.Update, installPreReleaseVersion: oldVersion.preRelease, profileLocation, isApplicationScoped: oldVersion.isApplicationScoped } }); } } @@ -224,7 +224,7 @@ export class ExtensionManagementCLI { } extensionsToInstall.push({ extension: gallery, - options: { ...installOptions, installGivenVersion: !!version }, + options: { ...installOptions, installGivenVersion: !!version, isApplicationScoped: installedExtension?.isApplicationScoped }, }); })); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index f6b528933c646..ebdcba98e4c61 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -1618,6 +1618,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension operation: InstallOperation.Update, installPreReleaseVersion: extension.local?.isPreReleaseVersion, profileLocation: this.userDataProfileService.currentProfile.extensionsResource, + isApplicationScoped: extension.local?.isApplicationScoped, } }); } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index f6ad46751162c..68d30c40d35e8 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -378,6 +378,7 @@ export class ExtensionManagementService extends Disposable implements IWorkbench servers.push(server); } + installOptions = { ...(installOptions || {}), isApplicationScoped: extension.isApplicationScoped }; return Promises.settled(servers.map(server => server.extensionManagementService.installFromGallery(gallery, installOptions))).then(([local]) => local); } From 594154c8d808beb78038e0c548e01b9accd421b8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Jun 2024 16:42:36 +0200 Subject: [PATCH 201/755] polish (#214951) --- .../browser/media/userDataProfilesEditor.css | 23 +++++++++---------- .../browser/userDataProfilesEditor.ts | 8 ++++--- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index 173906b798da1..c9b7ddd7c8cd4 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -167,7 +167,7 @@ .profiles-editor .contents-container .profile-copy-from-container { display: flex; align-items: center; - margin: 0px 0px 20px 36px; + margin: 0px 0px 15px 36px; } .profiles-editor .contents-container .profile-copy-from-container > .profile-copy-from-label { @@ -211,12 +211,11 @@ } .profiles-editor .contents-container .profile-tree-item-container { - display: flex; + display: grid; align-items: center; } .profiles-editor .contents-container .profile-tree-item-container.existing-profile-resource-type-container { - display: grid; grid-template-columns: repeat(1, 1fr) 150px 100px; } @@ -236,28 +235,28 @@ align-items: center; } -.profiles-editor .contents-container .profile-tree-item-container.profile-resource-child-container > .profile-tree-item-actions-container { - width: 100px; +.profiles-editor .contents-container .profile-content-tree-header.new-profile { + grid-template-columns: 30px repeat(2, 1fr) 100px; } -.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-resource-type-label-container { - width: 170px; +.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container { + grid-template-columns: repeat(2, 1fr) 100px; } -.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container > .profile-select-container { +.profiles-editor .contents-container .profile-tree-item-container.new-profile-resource-type-container .profile-select-container { width: 170px; } +.profiles-editor .contents-container .profile-tree-item-container.profile-resource-child-container { + grid-template-columns: repeat(1, 1fr) 100px; +} + .profiles-editor .contents-container .profile-tree-item-container .profile-resource-type-description { margin-left: 10px; font-size: 0.9em; opacity: 0.7; } -.profiles-editor .contents-container .profile-tree-item-container.profile-resource-child-container > .monaco-icon-label { - flex: 1 -} - .profiles-editor .contents-container .profile-tree-item-container .profile-tree-item-actions-container { justify-content: center; } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 5a1b25de0b18a..920e71224a140 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -706,6 +706,8 @@ class ProfileWidget extends Disposable { } render(profileElement: AbstractUserDataProfileElement): void { + this.resourcesTree.setInput(profileElement); + const disposables = new DisposableStore(); this._profileElement.value = { element: profileElement, dispose: () => disposables.dispose() }; @@ -716,7 +718,6 @@ class ProfileWidget extends Disposable { this.profileTitle.classList.toggle('hide', !profile?.isDefault); this.nameInput.element.classList.toggle('hide', !!profile?.isDefault); - this.resourcesTree.setInput(profileElement); disposables.add(profileElement.onDidChange(e => { if (e.flags || e.copyFrom || e.copyFlags || e.disabled) { const viewState = this.resourcesTree.getViewState(); @@ -797,7 +798,8 @@ class ProfileWidget extends Disposable { this.iconElement.className = ThemeIcon.asClassName(ThemeIcon.fromId(DEFAULT_ICON.id)); } if (profileElement instanceof NewProfileElement) { - this.contentsTreeHeader.classList.add('hide'); + this.contentsTreeHeader.classList.add('new-profile'); + this.inheritLabelElement.textContent = localize('options', "Options"); this.useAsDefaultProfileContainer.classList.add('hide'); this.copyFromContainer.classList.remove('hide'); this.copyFromOptions = this.getCopyFromOptions(); @@ -814,7 +816,7 @@ class ProfileWidget extends Disposable { this.copyFromSelectBox.setEnabled(false); } } else if (profileElement instanceof UserDataProfileElement) { - this.contentsTreeHeader.classList.remove('hide'); + this.contentsTreeHeader.classList.remove('new-profile'); this.inheritLabelElement.textContent = profileElement.profile.isDefault ? '' : localize('default profile', "Use Default Profile"); this.useAsDefaultProfileContainer.classList.remove('hide'); this.useAsDefaultProfileCheckbox.checked = profileElement.isNewWindowProfile; From 79abdbc1fcc5bb39561e411bb3bc58ca27018d84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 12 Jun 2024 17:27:00 +0200 Subject: [PATCH 202/755] :lipstick: remove setting renderer knowledge from markdown document renderer (#214955) --- .../extensions/browser/extensionEditor.ts | 2 +- .../browser/markdownDocumentRenderer.ts | 26 +++++++++---------- .../update/browser/releaseNotesEditor.ts | 6 ++++- .../browser/gettingStartedDetailsRenderer.ts | 2 +- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index f675f2e4c0de3..38a17acbbf005 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -774,7 +774,7 @@ export class ExtensionEditor extends EditorPane { return ''; } - const content = await renderMarkdownDocument(contents, this.extensionService, this.languageService, extension.type !== ExtensionType.System, false, token); + const content = await renderMarkdownDocument(contents, this.extensionService, this.languageService, { shouldSanitize: extension.type !== ExtensionType.System, token }); if (token?.isCancellationRequested) { return ''; } diff --git a/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts b/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts index 9b18b5cd02829..68dfb0f33505d 100644 --- a/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts +++ b/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts @@ -13,7 +13,6 @@ import { ILanguageService } from 'vs/editor/common/languages/language'; import { tokenizeToString } from 'vs/editor/common/languages/textToHtmlTokenizer'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { escape } from 'vs/base/common/strings'; -import { SimpleSettingRenderer } from 'vs/workbench/contrib/markdown/browser/markdownSettingRenderer'; export const DEFAULT_MARKDOWN_STYLES = ` body { @@ -184,6 +183,13 @@ function sanitize(documentContent: string, allowUnknownProtocols: boolean): stri } } +interface IRenderMarkdownDocumentOptions { + readonly shouldSanitize?: boolean; + readonly allowUnknownProtocols?: boolean; + readonly renderer?: marked.Renderer; + readonly token?: CancellationToken; +} + /** * Renders a string of markdown as a document. * @@ -193,10 +199,7 @@ export async function renderMarkdownDocument( text: string, extensionService: IExtensionService, languageService: ILanguageService, - shouldSanitize: boolean = true, - allowUnknownProtocols: boolean = false, - token?: CancellationToken, - settingRenderer?: SimpleSettingRenderer + options?: IRenderMarkdownDocumentOptions ): Promise { const highlight = (code: string, lang: string | undefined, callback: ((error: any, code: string) => void) | undefined): any => { @@ -210,7 +213,7 @@ export async function renderMarkdownDocument( } extensionService.whenInstalledExtensionsRegistered().then(async () => { - if (token?.isCancellationRequested) { + if (options?.token?.isCancellationRequested) { callback(null, ''); return; } @@ -222,16 +225,11 @@ export async function renderMarkdownDocument( return ''; }; - const renderer = new marked.Renderer(); - if (settingRenderer) { - renderer.html = settingRenderer.getHtmlRenderer(); - } - return new Promise((resolve, reject) => { - marked(text, { highlight, renderer }, (err, value) => err ? reject(err) : resolve(value)); + marked(text, { highlight, renderer: options?.renderer }, (err, value) => err ? reject(err) : resolve(value)); }).then(raw => { - if (shouldSanitize) { - return sanitize(raw, allowUnknownProtocols); + if (options?.shouldSanitize ?? true) { + return sanitize(raw, options?.allowUnknownProtocols ?? false); } else { return raw; } diff --git a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts index 9f6cc07ba5f90..78f429a64bb6d 100644 --- a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts +++ b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts @@ -34,6 +34,7 @@ import { SimpleSettingRenderer } from 'vs/workbench/contrib/markdown/browser/mar import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Schemas } from 'vs/base/common/network'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { marked } from 'vs/base/common/marked/marked'; export class ReleaseNotesManager { private readonly _simpleSettingRenderer: SimpleSettingRenderer; @@ -249,7 +250,10 @@ export class ReleaseNotesManager { private async renderBody(text: string) { const nonce = generateUuid(); - const content = await renderMarkdownDocument(text, this._extensionService, this._languageService, false, undefined, undefined, this._simpleSettingRenderer); + const renderer = new marked.Renderer(); + renderer.html = this._simpleSettingRenderer.getHtmlRenderer(); + + const content = await renderMarkdownDocument(text, this._extensionService, this._languageService, { shouldSanitize: false, renderer }); const colorMap = TokenizationRegistry.getColorMap(); const css = colorMap ? generateTokensCSSForColorMap(colorMap) : ''; const showReleaseNotes = Boolean(this._configurationService.getValue('update.showReleaseNotes')); diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedDetailsRenderer.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedDetailsRenderer.ts index 869f44526b48d..fef4b4928bf46 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedDetailsRenderer.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedDetailsRenderer.ts @@ -211,7 +211,7 @@ export class GettingStartedDetailsRenderer { private async readAndCacheStepMarkdown(path: URI, base: URI): Promise { if (!this.mdCache.has(path)) { const contents = await this.readContentsOfPath(path); - const markdownContents = await renderMarkdownDocument(transformUris(contents, base), this.extensionService, this.languageService, true, true); + const markdownContents = await renderMarkdownDocument(transformUris(contents, base), this.extensionService, this.languageService, { allowUnknownProtocols: true }); this.mdCache.set(path, markdownContents); } return assertIsDefined(this.mdCache.get(path)); From d7ade261f8d34b9acdd54c8135ca3835fd360b25 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Wed, 12 Jun 2024 08:34:29 -0700 Subject: [PATCH 203/755] remove giant unused context key (#214504) --- extensions/ipynb/src/ipynbMain.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/extensions/ipynb/src/ipynbMain.ts b/extensions/ipynb/src/ipynbMain.ts index 889f4c074453f..6d73107ef54e8 100644 --- a/extensions/ipynb/src/ipynbMain.ts +++ b/extensions/ipynb/src/ipynbMain.ts @@ -117,13 +117,6 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(cleaner); } - // Update new file contribution - vscode.extensions.onDidChange(() => { - vscode.commands.executeCommand('setContext', 'jupyterEnabled', vscode.extensions.getExtension('ms-toolsai.jupyter')); - }); - vscode.commands.executeCommand('setContext', 'jupyterEnabled', vscode.extensions.getExtension('ms-toolsai.jupyter')); - - return { get dropCustomMetadata() { return !useCustomPropertyInMetadata(); From 39ae41aaec5e4f7ff25c295414d614b48c6ab9af Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 12 Jun 2024 18:07:29 +0200 Subject: [PATCH 204/755] Untitled editor hint is gone (fix #214679) (#214963) --- .../browser/emptyTextEditorHint/emptyTextEditorHint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index 2402e2e7e29c2..c8a1443ab1ed8 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -128,7 +128,7 @@ export class EmptyTextEditorHintContribution implements IEditorContribution { } const hasEditorAgents = Boolean(this.chatAgentService.getDefaultAgent(ChatAgentLocation.Editor)); - const shouldRenderDefaultHint = model?.uri.scheme === Schemas.untitled && languageId === PLAINTEXT_LANGUAGE_ID && hasEditorAgents; + const shouldRenderDefaultHint = model?.uri.scheme === Schemas.untitled && languageId === PLAINTEXT_LANGUAGE_ID; return hasEditorAgents || shouldRenderDefaultHint; } From c09570293ad525e8aaf20c25271dea3f1a99dc59 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 12 Jun 2024 18:43:26 +0200 Subject: [PATCH 205/755] ext dev - preserve last active view (#214992) --- src/vs/workbench/browser/layout.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 19488429dc762..b8232cb849002 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -676,7 +676,11 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Only restore last viewlet if window was reloaded or we are in development mode let viewContainerToRestore: string | undefined; - if (!this.environmentService.isBuilt || lifecycleService.startupKind === StartupKind.ReloadedWindow) { + if ( + !this.environmentService.isBuilt || + lifecycleService.startupKind === StartupKind.ReloadedWindow || + this.environmentService.isExtensionDevelopment && !this.environmentService.extensionTestsLocationURI + ) { viewContainerToRestore = this.storageService.get(SidebarPart.activeViewletSettingsKey, StorageScope.WORKSPACE, this.viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id); } else { viewContainerToRestore = this.viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id; From a4ac06f9116c7db05c57333e9ae5ce7e472e6fe4 Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Wed, 12 Jun 2024 09:56:35 -0700 Subject: [PATCH 206/755] Refactor `NotebookCellOutline` layers to remove `target` + breadcrumb fix (#212002) * shift outline filters to fix breadcrumbs * viewProviders only take outlineDataSourceRef + remove target + shrink nbOutlineCreator * listeners -> `NotebookOutline` + symbols on symbolProvider change + cache settings * remove unused code * fix service mocks * uh oh WE GOT A LEAK (its ok i am a plumber) * more test repair --- .../contrib/outline/notebookOutline.ts | 398 ++++++++++++++---- .../notebook/browser/notebook.contribution.ts | 4 +- .../viewModel/notebookOutlineDataSource.ts | 222 ++++++++++ .../notebookOutlineDataSourceFactory.ts | 38 ++ .../viewModel/notebookOutlineEntryFactory.ts | 3 +- .../viewModel/notebookOutlineProvider.ts | 316 -------------- .../notebookOutlineProviderFactory.ts | 39 -- .../viewParts/notebookEditorStickyScroll.ts | 29 +- .../browser/contrib/notebookOutline.test.ts | 5 + .../notebookOutlineViewProviders.test.ts | 61 ++- .../browser/contrib/notebookSymbols.test.ts | 11 +- .../test/browser/notebookStickyScroll.test.ts | 11 +- .../test/browser/testNotebookEditor.ts | 4 +- 13 files changed, 646 insertions(+), 495 deletions(-) create mode 100644 src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource.ts create mode 100644 src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory.ts delete mode 100644 src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider.ts delete mode 100644 src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory.ts diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts b/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts index 2d567006f71bc..c9d3c97a77282 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts @@ -29,8 +29,8 @@ import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } fr import { IEditorPane } from 'vs/workbench/common/editor'; import { CellFoldingState, CellRevealType, ICellModelDecorations, ICellModelDeltaDecorations, ICellViewModel, INotebookEditor, INotebookEditorOptions, INotebookEditorPane, INotebookViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; -import { NotebookCellOutlineProvider } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider'; -import { CellKind, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookCellOutlineDataSource, NotebookCellOutlineDataSource } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource'; +import { CellKind, NotebookCellsChangeType, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IBreadcrumbsDataSource, IOutline, IOutlineComparator, IOutlineCreator, IOutlineListConfig, IOutlineService, IQuickPickDataSource, IQuickPickOutlineElement, OutlineChangeEvent, OutlineConfigCollapseItemsValues, OutlineConfigKeys, OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; @@ -46,12 +46,14 @@ import { MenuEntryActionViewItem, createAndFillInActionBarActions } from 'vs/pla import { IAction } from 'vs/base/common/actions'; import { NotebookSectionArgs } from 'vs/workbench/contrib/notebook/browser/controller/sectionActions'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; -import { disposableTimeout } from 'vs/base/common/async'; +import { Delayer, disposableTimeout } from 'vs/base/common/async'; import { IOutlinePane } from 'vs/workbench/contrib/outline/browser/outline'; import { Codicon } from 'vs/base/common/codicons'; import { NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { NotebookOutlineConstants } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory'; -import { INotebookCellOutlineProviderFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory'; +import { INotebookCellOutlineDataSourceFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory'; +import { INotebookExecutionStateService, NotebookExecutionType } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; class NotebookOutlineTemplate { @@ -286,33 +288,44 @@ class NotebookOutlineVirtualDelegate implements IListVirtualDelegate { + private readonly _disposables = new DisposableStore(); + + private gotoShowCodeCellSymbols: boolean; + constructor( - private _getEntries: () => OutlineEntry[], + private readonly notebookCellOutlineDataSourceRef: IReference | undefined, @IConfigurationService private readonly _configurationService: IConfigurationService, @IThemeService private readonly _themeService: IThemeService - ) { } + ) { + this.gotoShowCodeCellSymbols = this._configurationService.getValue(NotebookSetting.gotoSymbolsAllSymbols); + + this._disposables.add(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(NotebookSetting.gotoSymbolsAllSymbols)) { + this.gotoShowCodeCellSymbols = this._configurationService.getValue(NotebookSetting.gotoSymbolsAllSymbols); + } + })); + } getQuickPickElements(): IQuickPickOutlineElement[] { const bucket: OutlineEntry[] = []; - for (const entry of this._getEntries()) { + for (const entry of this.notebookCellOutlineDataSourceRef?.object?.entries ?? []) { entry.asFlatList(bucket); } const result: IQuickPickOutlineElement[] = []; const { hasFileIcons } = this._themeService.getFileIconTheme(); - const showSymbols = this._configurationService.getValue(NotebookSetting.gotoSymbolsAllSymbols); const isSymbol = (element: OutlineEntry) => !!element.symbolKind; const isCodeCell = (element: OutlineEntry) => (element.cell.cellKind === CellKind.Code && element.level === NotebookOutlineConstants.NonHeaderOutlineLevel); // code cell entries are exactly level 7 by this constant for (let i = 0; i < bucket.length; i++) { const element = bucket[i]; const nextElement = bucket[i + 1]; // can be undefined - if (!showSymbols + if (!this.gotoShowCodeCellSymbols && isSymbol(element)) { continue; } - if (showSymbols + if (this.gotoShowCodeCellSymbols && isCodeCell(element) && nextElement && isSymbol(nextElement)) { continue; @@ -330,32 +343,98 @@ export class NotebookQuickPickProvider implements IQuickPickDataSource { + + private readonly _disposables = new DisposableStore(); + + private showCodeCells: boolean; + private showCodeCellSymbols: boolean; + private showMarkdownHeadersOnly: boolean; + constructor( - private _getEntries: () => OutlineEntry[], + private readonly outlineDataSourceRef: IReference | undefined, @IConfigurationService private readonly _configurationService: IConfigurationService, - ) { } + ) { + this.showCodeCells = this._configurationService.getValue(NotebookSetting.outlineShowCodeCells); + this.showCodeCellSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); + this.showMarkdownHeadersOnly = this._configurationService.getValue(NotebookSetting.outlineShowMarkdownHeadersOnly); - *getChildren(element: NotebookCellOutline | OutlineEntry): Iterable { - const showCodeCells = this._configurationService.getValue(NotebookSetting.outlineShowCodeCells); - const showCodeCellSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); - const showMarkdownHeadersOnly = this._configurationService.getValue(NotebookSetting.outlineShowMarkdownHeadersOnly); + this._disposables.add(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(NotebookSetting.outlineShowCodeCells)) { + this.showCodeCells = this._configurationService.getValue(NotebookSetting.outlineShowCodeCells); + } + if (e.affectsConfiguration(NotebookSetting.outlineShowCodeCellSymbols)) { + this.showCodeCellSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); + } + if (e.affectsConfiguration(NotebookSetting.outlineShowMarkdownHeadersOnly)) { + this.showMarkdownHeadersOnly = this._configurationService.getValue(NotebookSetting.outlineShowMarkdownHeadersOnly); + } + })); + } + + public getActiveEntry(): OutlineEntry | undefined { + const newActive = this.outlineDataSourceRef?.object?.activeElement; + if (!newActive) { + return undefined; + } + if (!this.filterEntry(newActive)) { + return newActive; + } + + // find a valid parent + let parent = newActive.parent; + while (parent) { + if (this.filterEntry(parent)) { + parent = parent.parent; + } else { + return parent; + } + } + + // no valid parent found, return undefined + return undefined; + } + + /** + * Checks if the given outline entry should be filtered out of the outlinePane + * + * @param entry the OutlineEntry to check + * @returns true if the entry should be filtered out of the outlinePane + */ + private filterEntry(entry: OutlineEntry): boolean { + // if any are true, return true, this entry should NOT be included in the outline + if ( + (this.showMarkdownHeadersOnly && entry.cell.cellKind === CellKind.Markup && entry.level === NotebookOutlineConstants.NonHeaderOutlineLevel) || // show headers only + cell is mkdn + is level 7 (not header) + (!this.showCodeCells && entry.cell.cellKind === CellKind.Code) || // show code cells off + cell is code + (!this.showCodeCellSymbols && entry.cell.cellKind === CellKind.Code && entry.level > NotebookOutlineConstants.NonHeaderOutlineLevel) // show symbols off + cell is code + is level >7 (nb symbol levels) + ) { + return true; + } + + return false; + } + + *getChildren(element: NotebookCellOutline | OutlineEntry): Iterable { const isOutline = element instanceof NotebookCellOutline; - const entries = isOutline ? this._getEntries() : element.children; + const entries = isOutline ? this.outlineDataSourceRef?.object?.entries ?? [] : element.children; for (const entry of entries) { if (entry.cell.cellKind === CellKind.Markup) { - if (!showMarkdownHeadersOnly) { + if (!this.showMarkdownHeadersOnly) { yield entry; } else if (entry.level < NotebookOutlineConstants.NonHeaderOutlineLevel) { yield entry; } - } else if (showCodeCells && entry.cell.cellKind === CellKind.Code) { - if (showCodeCellSymbols) { + } else if (this.showCodeCells && entry.cell.cellKind === CellKind.Code) { + if (this.showCodeCellSymbols) { yield entry; } else if (entry.level === NotebookOutlineConstants.NonHeaderOutlineLevel) { yield entry; @@ -363,26 +442,45 @@ export class NotebookOutlinePaneProvider implements IDataSource { + + private readonly _disposables = new DisposableStore(); + + private showCodeCells: boolean; + constructor( - private _getActiveElement: () => OutlineEntry | undefined, + private readonly outlineDataSourceRef: IReference | undefined, @IConfigurationService private readonly _configurationService: IConfigurationService, - ) { } + ) { + this.showCodeCells = this._configurationService.getValue(NotebookSetting.breadcrumbsShowCodeCells); + this._disposables.add(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(NotebookSetting.breadcrumbsShowCodeCells)) { + this.showCodeCells = this._configurationService.getValue(NotebookSetting.breadcrumbsShowCodeCells); + } + })); + } getBreadcrumbElements(): readonly OutlineEntry[] { const result: OutlineEntry[] = []; - const showCodeCells = this._configurationService.getValue(NotebookSetting.breadcrumbsShowCodeCells); - let candidate = this._getActiveElement(); + let candidate = this.outlineDataSourceRef?.object?.activeElement; while (candidate) { - if (showCodeCells || candidate.cell.cellKind !== CellKind.Code) { + if (this.showCodeCells || candidate.cell.cellKind !== CellKind.Code) { result.unshift(candidate); } candidate = candidate.parent; } return result; } + + dispose(): void { + this._disposables.dispose(); + } } class NotebookComparator implements IOutlineComparator { @@ -401,64 +499,80 @@ class NotebookComparator implements IOutlineComparator { } export class NotebookCellOutline implements IOutline { + readonly outlineKind = 'notebookCells'; - private readonly _dispoables = new DisposableStore(); + private readonly _disposables = new DisposableStore(); + private readonly _modelDisposables = new DisposableStore(); + private readonly _dataSourceDisposables = new DisposableStore(); private readonly _onDidChange = new Emitter(); - readonly onDidChange: Event = this._onDidChange.event; - get entries(): OutlineEntry[] { - return this._outlineProviderReference?.object?.entries ?? []; - } - - private readonly _entriesDisposables = new DisposableStore(); + private readonly delayerRecomputeState: Delayer = this._disposables.add(new Delayer(300)); + private readonly delayerRecomputeActive: Delayer = this._disposables.add(new Delayer(200)); + // this can be long, because it will force a recompute at the end, so ideally we only do this once all nb language features are registered + private readonly delayerRecomputeSymbols: Delayer = this._disposables.add(new Delayer(2000)); readonly config: IOutlineListConfig; + private _outlineDataSourceReference: IReference | undefined; + // These three fields will always be set via setDataSources() on L475 + private _treeDataSource!: IDataSource; + private _quickPickDataSource!: IQuickPickDataSource; + private _breadcrumbsDataSource!: IBreadcrumbsDataSource; - readonly outlineKind = 'notebookCells'; + // view settings + private gotoShowCodeCellSymbols: boolean; + private outlineShowCodeCellSymbols: boolean; + // getters get activeElement(): OutlineEntry | undefined { - return this._outlineProviderReference?.object?.activeElement; + this.checkDelayer(); + if (this._target === OutlineTarget.OutlinePane) { + return (this.config.treeDataSource as NotebookOutlinePaneProvider).getActiveEntry(); + } else { + console.error('activeElement should not be called outside of the OutlinePane'); + return undefined; + } + } + get entries(): OutlineEntry[] { + this.checkDelayer(); + return this._outlineDataSourceReference?.object?.entries ?? []; + } + get uri(): URI | undefined { + return this._outlineDataSourceReference?.object?.uri; + } + get isEmpty(): boolean { + return this._outlineDataSourceReference?.object?.isEmpty ?? true; } - private _outlineProviderReference: IReference | undefined; - private readonly _localDisposables = new DisposableStore(); + private checkDelayer() { + if (this.delayerRecomputeState.isTriggered()) { + this.delayerRecomputeState.cancel(); + this.recomputeState(); + } + } constructor( private readonly _editor: INotebookEditorPane, - _target: OutlineTarget, - @IInstantiationService instantiationService: IInstantiationService, + private readonly _target: OutlineTarget, + @IThemeService private readonly _themeService: IThemeService, @IEditorService private readonly _editorService: IEditorService, - @IConfigurationService _configurationService: IConfigurationService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + @INotebookExecutionStateService private readonly _notebookExecutionStateService: INotebookExecutionStateService, ) { - const installSelectionListener = () => { - const notebookEditor = _editor.getControl(); - if (!notebookEditor?.hasModel()) { - this._outlineProviderReference?.dispose(); - this._outlineProviderReference = undefined; - this._localDisposables.clear(); - } else { - this._outlineProviderReference?.dispose(); - this._localDisposables.clear(); - this._outlineProviderReference = instantiationService.invokeFunction((accessor) => accessor.get(INotebookCellOutlineProviderFactory).getOrCreate(notebookEditor, _target)); - this._localDisposables.add(this._outlineProviderReference.object.onDidChange(e => { - this._onDidChange.fire(e); - })); - } - }; + this.gotoShowCodeCellSymbols = this._configurationService.getValue(NotebookSetting.gotoSymbolsAllSymbols); + this.outlineShowCodeCellSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); - this._dispoables.add(_editor.onDidChangeModel(() => { - installSelectionListener(); - })); + this.initializeOutline(); - installSelectionListener(); const delegate = new NotebookOutlineVirtualDelegate(); - const renderers = [instantiationService.createInstance(NotebookOutlineRenderer, this._editor.getControl(), _target)]; + const renderers = [this._instantiationService.createInstance(NotebookOutlineRenderer, this._editor.getControl(), this._target)]; const comparator = new NotebookComparator(); const options: IWorkbenchDataTreeOptions = { - collapseByDefault: _target === OutlineTarget.Breadcrumbs || (_target === OutlineTarget.OutlinePane && _configurationService.getValue(OutlineConfigKeys.collapseItems) === OutlineConfigCollapseItemsValues.Collapsed), + collapseByDefault: this._target === OutlineTarget.Breadcrumbs || (this._target === OutlineTarget.OutlinePane && this._configurationService.getValue(OutlineConfigKeys.collapseItems) === OutlineConfigCollapseItemsValues.Collapsed), expandOnlyOnTwistieClick: true, multipleSelectionSupport: false, accessibilityProvider: new NotebookOutlineAccessibility(), @@ -467,9 +581,9 @@ export class NotebookCellOutline implements IOutline { }; this.config = { - treeDataSource: instantiationService.createInstance(NotebookOutlinePaneProvider, () => (this.entries ?? [])), - quickPickDataSource: instantiationService.createInstance(NotebookQuickPickProvider, () => (this.entries ?? [])), - breadcrumbsDataSource: instantiationService.createInstance(NotebookBreadcrumbsProvider, () => (this.activeElement)), + treeDataSource: this._treeDataSource, + quickPickDataSource: this._quickPickDataSource, + breadcrumbsDataSource: this._breadcrumbsDataSource, delegate, renderers, comparator, @@ -477,16 +591,139 @@ export class NotebookCellOutline implements IOutline { }; } - async setFullSymbols(cancelToken: CancellationToken) { - await this._outlineProviderReference?.object?.setFullSymbols(cancelToken); + private initializeOutline() { + // initial setup + this.setDataSources(); + this.setModelListeners(); + + // reset the data sources + model listeners when we get a new notebook model + this._disposables.add(this._editor.onDidChangeModel(() => { + this.setDataSources(); + this.setModelListeners(); + this.computeSymbols(); + })); + + // recompute symbols as document symbol providers are updated in the language features registry + this._disposables.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => { + this.delayedComputeSymbols(); + })); + + // recompute active when the selection changes + this._disposables.add(this._editor.onDidChangeSelection(() => { + this.delayedRecomputeActive(); + })); + + // recompute state when filter config changes + this._disposables.add(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(NotebookSetting.outlineShowMarkdownHeadersOnly) || + e.affectsConfiguration(NotebookSetting.outlineShowCodeCells) || + e.affectsConfiguration(NotebookSetting.outlineShowCodeCellSymbols) || + e.affectsConfiguration(NotebookSetting.breadcrumbsShowCodeCells) + ) { + this.delayedRecomputeState(); + } + })); + + // recompute state when execution states change + this._disposables.add(this._notebookExecutionStateService.onDidChangeExecution(e => { + if (e.type === NotebookExecutionType.cell && !!this._editor.textModel && e.affectsNotebook(this._editor.textModel?.uri)) { + this.delayedRecomputeState(); + } + })); + + // recompute symbols when the configuration changes (recompute state - and therefore recompute active - is also called within compute symbols) + this._disposables.add(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(NotebookSetting.gotoSymbolsAllSymbols) || e.affectsConfiguration(NotebookSetting.outlineShowCodeCellSymbols)) { + this.gotoShowCodeCellSymbols = this._configurationService.getValue(NotebookSetting.gotoSymbolsAllSymbols); + this.outlineShowCodeCellSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); + this.computeSymbols(); + } + })); + + // fire a change event when the theme changes + this._disposables.add(this._themeService.onDidFileIconThemeChange(() => { + this._onDidChange.fire({}); + })); + + // finish with a recompute state + this.recomputeState(); } - get uri(): URI | undefined { - return this._outlineProviderReference?.object?.uri; + /** + * set up the primary data source + three viewing sources for the various outline views + */ + private setDataSources(): void { + const notebookEditor = this._editor.getControl(); + this._outlineDataSourceReference?.dispose(); + this._dataSourceDisposables.clear(); + + if (!notebookEditor?.hasModel()) { + this._outlineDataSourceReference = undefined; + } else { + this._outlineDataSourceReference = this._dataSourceDisposables.add(this._instantiationService.invokeFunction((accessor) => accessor.get(INotebookCellOutlineDataSourceFactory).getOrCreate(notebookEditor))); + // escalate outline data source change events + this._dataSourceDisposables.add(this._outlineDataSourceReference.object.onDidChange(() => { + this._onDidChange.fire({}); + })); + } + + // these fields can be passed undefined outlineDataSources. View Providers all handle it accordingly + this._treeDataSource = this._dataSourceDisposables.add(this._instantiationService.createInstance(NotebookOutlinePaneProvider, this._outlineDataSourceReference)); + this._quickPickDataSource = this._dataSourceDisposables.add(this._instantiationService.createInstance(NotebookQuickPickProvider, this._outlineDataSourceReference)); + this._breadcrumbsDataSource = this._dataSourceDisposables.add(this._instantiationService.createInstance(NotebookBreadcrumbsProvider, this._outlineDataSourceReference)); } - get isEmpty(): boolean { - return this._outlineProviderReference?.object?.isEmpty ?? true; + + /** + * set up the listeners for the outline content, these respond to model changes in the notebook + */ + private setModelListeners(): void { + this._modelDisposables.clear(); + if (!this._editor.textModel) { + return; + } + + // Perhaps this is the first time we're building the outline + if (!this.entries.length) { + this.computeSymbols(); + } + + // recompute state when there are notebook content changes + this._modelDisposables.add(this._editor.textModel.onDidChangeContent(contentChanges => { + if (contentChanges.rawEvents.some(c => + c.kind === NotebookCellsChangeType.ChangeCellContent || + c.kind === NotebookCellsChangeType.ChangeCellInternalMetadata || + c.kind === NotebookCellsChangeType.Move || + c.kind === NotebookCellsChangeType.ModelChange)) { + this.delayedRecomputeState(); + } + })); + } + + private async computeSymbols(cancelToken: CancellationToken = CancellationToken.None) { + if (this._target === OutlineTarget.QuickPick && this.gotoShowCodeCellSymbols) { + await this._outlineDataSourceReference?.object?.computeFullSymbols(cancelToken); + } else if (this._target === OutlineTarget.OutlinePane && this.outlineShowCodeCellSymbols) { + // No need to wait for this, we want the outline to show up quickly. + void this._outlineDataSourceReference?.object?.computeFullSymbols(cancelToken); + } + } + private async delayedComputeSymbols() { + this.delayerRecomputeState.cancel(); + this.delayerRecomputeActive.cancel(); + this.delayerRecomputeSymbols.trigger(() => { this.computeSymbols(); }); + } + + private recomputeState() { this._outlineDataSourceReference?.object?.recomputeState(); } + private delayedRecomputeState() { + this.delayerRecomputeActive.cancel(); // Active is always recomputed after a recomputing the State. + this.delayerRecomputeState.trigger(() => { this.recomputeState(); }); + } + + private recomputeActive() { this._outlineDataSourceReference?.object?.recomputeActive(); } + private delayedRecomputeActive() { + this.delayerRecomputeActive.trigger(() => { this.recomputeActive(); }); } + async reveal(entry: OutlineEntry, options: IEditorOptions, sideBySide: boolean): Promise { const notebookEditorOptions: INotebookEditorOptions = { ...options, @@ -564,10 +801,10 @@ export class NotebookCellOutline implements IOutline { dispose(): void { this._onDidChange.dispose(); - this._dispoables.dispose(); - this._entriesDisposables.dispose(); - this._outlineProviderReference?.dispose(); - this._localDisposables.dispose(); + this._disposables.dispose(); + this._modelDisposables.dispose(); + this._dataSourceDisposables.dispose(); + this._outlineDataSourceReference?.dispose(); } } @@ -578,7 +815,6 @@ export class NotebookOutlineCreator implements IOutlineCreator reg.dispose(); @@ -589,18 +825,7 @@ export class NotebookOutlineCreator implements IOutlineCreator | undefined> { - const outline = this._instantiationService.createInstance(NotebookCellOutline, editor, target); - - const showAllGotoSymbols = this._configurationService.getValue(NotebookSetting.gotoSymbolsAllSymbols); - const showAllOutlineSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); - if (target === OutlineTarget.QuickPick && showAllGotoSymbols) { - await outline.setFullSymbols(cancelToken); - } else if (target === OutlineTarget.OutlinePane && showAllOutlineSymbols) { - // No need to wait for this, we want the outline to show up quickly. - void outline.setFullSymbols(cancelToken); - } - - return outline; + return this._instantiationService.createInstance(NotebookCellOutline, editor, target); } } @@ -679,7 +904,6 @@ registerAction2(class ToggleShowMarkdownHeadersOnly extends Action2 { } }); - registerAction2(class ToggleCodeCellEntries extends Action2 { constructor() { super({ diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index 0f9026c0dde80..c886a602b38a4 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -57,7 +57,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { NotebookRendererMessagingService } from 'vs/workbench/contrib/notebook/browser/services/notebookRendererMessagingServiceImpl'; import { INotebookRendererMessagingService } from 'vs/workbench/contrib/notebook/common/notebookRendererMessagingService'; -import { INotebookCellOutlineProviderFactory, NotebookCellOutlineProviderFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory'; +import { INotebookCellOutlineDataSourceFactory, NotebookCellOutlineDataSourceFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory'; // Editor Controller import 'vs/workbench/contrib/notebook/browser/controller/coreActions'; @@ -726,7 +726,7 @@ registerSingleton(INotebookExecutionStateService, NotebookExecutionStateService, registerSingleton(INotebookRendererMessagingService, NotebookRendererMessagingService, InstantiationType.Delayed); registerSingleton(INotebookKeymapService, NotebookKeymapService, InstantiationType.Delayed); registerSingleton(INotebookLoggingService, NotebookLoggingService, InstantiationType.Delayed); -registerSingleton(INotebookCellOutlineProviderFactory, NotebookCellOutlineProviderFactory, InstantiationType.Delayed); +registerSingleton(INotebookCellOutlineDataSourceFactory, NotebookCellOutlineDataSourceFactory, InstantiationType.Delayed); const schemas: IJSONSchemaMap = {}; function isConfigurationPropertySchema(x: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema }): x is IConfigurationPropertySchema { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource.ts new file mode 100644 index 0000000000000..767b9f8f8ded3 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource.ts @@ -0,0 +1,222 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter, Event } from 'vs/base/common/event'; +import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; +import { isEqual } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IMarkerService } from 'vs/platform/markers/common/markers'; +import { IActiveNotebookEditor, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { OutlineChangeEvent, OutlineConfigKeys } from 'vs/workbench/services/outline/browser/outline'; +import { OutlineEntry } from './OutlineEntry'; +import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { NotebookOutlineEntryFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory'; + +export interface INotebookCellOutlineDataSource { + readonly activeElement: OutlineEntry | undefined; + readonly entries: OutlineEntry[]; +} + +export class NotebookCellOutlineDataSource implements INotebookCellOutlineDataSource { + + private readonly _disposables = new DisposableStore(); + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + private _uri: URI | undefined; + private _entries: OutlineEntry[] = []; + private _activeEntry?: OutlineEntry; + + private readonly _outlineEntryFactory: NotebookOutlineEntryFactory; + + constructor( + private readonly _editor: INotebookEditor, + @INotebookExecutionStateService private readonly _notebookExecutionStateService: INotebookExecutionStateService, + @IOutlineModelService private readonly _outlineModelService: IOutlineModelService, + @IMarkerService private readonly _markerService: IMarkerService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + ) { + this._outlineEntryFactory = new NotebookOutlineEntryFactory(this._notebookExecutionStateService); + this.recomputeState(); + } + + get activeElement(): OutlineEntry | undefined { + return this._activeEntry; + } + get entries(): OutlineEntry[] { + return this._entries; + } + get isEmpty(): boolean { + return this._entries.length === 0; + } + get uri() { + return this._uri; + } + + public async computeFullSymbols(cancelToken: CancellationToken) { + const notebookEditorWidget = this._editor; + + const notebookCells = notebookEditorWidget?.getViewModel()?.viewCells.filter((cell) => cell.cellKind === CellKind.Code); + + if (notebookCells) { + const promises: Promise[] = []; + // limit the number of cells so that we don't resolve an excessive amount of text models + for (const cell of notebookCells.slice(0, 100)) { + // gather all symbols asynchronously + promises.push(this._outlineEntryFactory.cacheSymbols(cell, this._outlineModelService, cancelToken)); + } + await Promise.allSettled(promises); + } + this.recomputeState(); + } + + public recomputeState(): void { + this._disposables.clear(); + this._activeEntry = undefined; + this._uri = undefined; + + if (!this._editor.hasModel()) { + return; + } + + this._uri = this._editor.textModel.uri; + + const notebookEditorWidget: IActiveNotebookEditor = this._editor; + + if (notebookEditorWidget.getLength() === 0) { + return; + } + + const notebookCells = notebookEditorWidget.getViewModel().viewCells; + + const entries: OutlineEntry[] = []; + for (const cell of notebookCells) { + entries.push(...this._outlineEntryFactory.getOutlineEntries(cell, entries.length)); + } + + // build a tree from the list of entries + if (entries.length > 0) { + const result: OutlineEntry[] = [entries[0]]; + const parentStack: OutlineEntry[] = [entries[0]]; + + for (let i = 1; i < entries.length; i++) { + const entry = entries[i]; + + while (true) { + const len = parentStack.length; + if (len === 0) { + // root node + result.push(entry); + parentStack.push(entry); + break; + + } else { + const parentCandidate = parentStack[len - 1]; + if (parentCandidate.level < entry.level) { + parentCandidate.addChild(entry); + parentStack.push(entry); + break; + } else { + parentStack.pop(); + } + } + } + } + this._entries = result; + } + + // feature: show markers with each cell + const markerServiceListener = new MutableDisposable(); + this._disposables.add(markerServiceListener); + const updateMarkerUpdater = () => { + if (notebookEditorWidget.isDisposed) { + return; + } + + const doUpdateMarker = (clear: boolean) => { + for (const entry of this._entries) { + if (clear) { + entry.clearMarkers(); + } else { + entry.updateMarkers(this._markerService); + } + } + }; + const problem = this._configurationService.getValue('problems.visibility'); + if (problem === undefined) { + return; + } + + const config = this._configurationService.getValue(OutlineConfigKeys.problemsEnabled); + + if (problem && config) { + markerServiceListener.value = this._markerService.onMarkerChanged(e => { + if (notebookEditorWidget.isDisposed) { + console.error('notebook editor is disposed'); + return; + } + + if (e.some(uri => notebookEditorWidget.getCellsInRange().some(cell => isEqual(cell.uri, uri)))) { + doUpdateMarker(false); + this._onDidChange.fire({}); + } + }); + doUpdateMarker(false); + } else { + markerServiceListener.clear(); + doUpdateMarker(true); + } + }; + updateMarkerUpdater(); + this._disposables.add(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('problems.visibility') || e.affectsConfiguration(OutlineConfigKeys.problemsEnabled)) { + updateMarkerUpdater(); + this._onDidChange.fire({}); + } + })); + + const { changeEventTriggered } = this.recomputeActive(); + if (!changeEventTriggered) { + this._onDidChange.fire({}); + } + } + + public recomputeActive(): { changeEventTriggered: boolean } { + let newActive: OutlineEntry | undefined; + const notebookEditorWidget = this._editor; + + if (notebookEditorWidget) {//TODO don't check for widget, only here if we do have + if (notebookEditorWidget.hasModel() && notebookEditorWidget.getLength() > 0) { + const cell = notebookEditorWidget.cellAt(notebookEditorWidget.getFocus().start); + if (cell) { + for (const entry of this._entries) { + newActive = entry.find(cell, []); + if (newActive) { + break; + } + } + } + } + } + + if (newActive !== this._activeEntry) { + this._activeEntry = newActive; + this._onDidChange.fire({ affectOnlyActiveElement: true }); + return { changeEventTriggered: true }; + } + return { changeEventTriggered: false }; + } + + dispose(): void { + this._entries.length = 0; + this._activeEntry = undefined; + this._disposables.dispose(); + } +} diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory.ts new file mode 100644 index 0000000000000..c4d2f82593acb --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ReferenceCollection, type IReference } from 'vs/base/common/lifecycle'; +import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import type { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookCellOutlineDataSource } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource'; + +class NotebookCellOutlineDataSourceReferenceCollection extends ReferenceCollection { + constructor(@IInstantiationService private readonly instantiationService: IInstantiationService) { + super(); + } + protected override createReferencedObject(_key: string, editor: INotebookEditor): NotebookCellOutlineDataSource { + return this.instantiationService.createInstance(NotebookCellOutlineDataSource, editor); + } + protected override destroyReferencedObject(_key: string, object: NotebookCellOutlineDataSource): void { + object.dispose(); + } +} + +export const INotebookCellOutlineDataSourceFactory = createDecorator('INotebookCellOutlineDataSourceFactory'); + +export interface INotebookCellOutlineDataSourceFactory { + getOrCreate(editor: INotebookEditor): IReference; +} + +export class NotebookCellOutlineDataSourceFactory implements INotebookCellOutlineDataSourceFactory { + private readonly _data: NotebookCellOutlineDataSourceReferenceCollection; + constructor(@IInstantiationService instantiationService: IInstantiationService) { + this._data = instantiationService.createInstance(NotebookCellOutlineDataSourceReferenceCollection); + } + + getOrCreate(editor: INotebookEditor): IReference { + return this._data.acquire(editor.getId(), editor); + } +} diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory.ts index 77a8ba22ab4e1..a7de885758416 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory.ts @@ -14,7 +14,6 @@ import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { IRange } from 'vs/editor/common/core/range'; import { SymbolKind } from 'vs/editor/common/languages'; -import { OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; export const enum NotebookOutlineConstants { NonHeaderOutlineLevel = 7, @@ -50,7 +49,7 @@ export class NotebookOutlineEntryFactory { private readonly executionStateService: INotebookExecutionStateService ) { } - public getOutlineEntries(cell: ICellViewModel, target: OutlineTarget, index: number): OutlineEntry[] { + public getOutlineEntries(cell: ICellViewModel, index: number): OutlineEntry[] { const entries: OutlineEntry[] = []; const isMarkdown = cell.cellKind === CellKind.Markup; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider.ts deleted file mode 100644 index 1ac843597abab..0000000000000 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider.ts +++ /dev/null @@ -1,316 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Emitter, Event } from 'vs/base/common/event'; -import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; -import { isEqual } from 'vs/base/common/resources'; -import { URI } from 'vs/base/common/uri'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IMarkerService } from 'vs/platform/markers/common/markers'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IActiveNotebookEditor, ICellViewModel, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellKind, NotebookCellsChangeType, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { INotebookExecutionStateService, NotebookExecutionType } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; -import { OutlineChangeEvent, OutlineConfigKeys, OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; -import { OutlineEntry } from './OutlineEntry'; -import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import { NotebookOutlineConstants, NotebookOutlineEntryFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory'; -import { Delayer } from 'vs/base/common/async'; - -export class NotebookCellOutlineProvider { - private readonly _disposables = new DisposableStore(); - private readonly _onDidChange = new Emitter(); - - readonly onDidChange: Event = this._onDidChange.event; - - private _uri: URI | undefined; - private _entries: OutlineEntry[] = []; - get entries(): OutlineEntry[] { - if (this.delayedOutlineRecompute.isTriggered()) { - this.delayedOutlineRecompute.cancel(); - this._recomputeState(); - } - return this._entries; - } - - private _activeEntry?: OutlineEntry; - private readonly _entriesDisposables = new DisposableStore(); - - readonly outlineKind = 'notebookCells'; - - get activeElement(): OutlineEntry | undefined { - if (this.delayedOutlineRecompute.isTriggered()) { - this.delayedOutlineRecompute.cancel(); - this._recomputeState(); - } - return this._activeEntry; - } - - private readonly _outlineEntryFactory: NotebookOutlineEntryFactory; - private readonly delayedOutlineRecompute: Delayer; - constructor( - private readonly _editor: INotebookEditor, - private readonly _target: OutlineTarget, - @IThemeService themeService: IThemeService, - @INotebookExecutionStateService notebookExecutionStateService: INotebookExecutionStateService, - @IOutlineModelService private readonly _outlineModelService: IOutlineModelService, - @IMarkerService private readonly _markerService: IMarkerService, - @IConfigurationService private readonly _configurationService: IConfigurationService, - ) { - this._outlineEntryFactory = new NotebookOutlineEntryFactory(notebookExecutionStateService); - - const delayerRecomputeActive = this._disposables.add(new Delayer(200)); - this._disposables.add(_editor.onDidChangeSelection(() => { - delayerRecomputeActive.trigger(() => this._recomputeActive()); - }, this)); - - // .3s of a delay is sufficient, 100-200s is too quick and will unnecessarily block the ui thread. - // Given we're only updating the outline when the user types, we can afford to wait a bit. - this.delayedOutlineRecompute = this._disposables.add(new Delayer(300)); - const delayedRecompute = () => { - delayerRecomputeActive.cancel(); // Active is always recomputed after a recomputing the outline state. - this.delayedOutlineRecompute.trigger(() => this._recomputeState()); - }; - - this._disposables.add(_configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(NotebookSetting.outlineShowMarkdownHeadersOnly) || - e.affectsConfiguration(NotebookSetting.outlineShowCodeCells) || - e.affectsConfiguration(NotebookSetting.outlineShowCodeCellSymbols) || - e.affectsConfiguration(NotebookSetting.breadcrumbsShowCodeCells) - ) { - delayedRecompute(); - } - })); - - this._disposables.add(themeService.onDidFileIconThemeChange(() => { - this._onDidChange.fire({}); - })); - - this._disposables.add( - notebookExecutionStateService.onDidChangeExecution(e => { - if (e.type === NotebookExecutionType.cell && !!this._editor.textModel && e.affectsNotebook(this._editor.textModel?.uri)) { - delayedRecompute(); - } - }) - ); - - const disposable = this._disposables.add(new DisposableStore()); - const monitorModelChanges = () => { - disposable.clear(); - if (!this._editor.textModel) { - return; - } - disposable.add(this._editor.textModel.onDidChangeContent(contentChanges => { - if (contentChanges.rawEvents.some(c => c.kind === NotebookCellsChangeType.ChangeCellContent || - c.kind === NotebookCellsChangeType.ChangeCellInternalMetadata || - c.kind === NotebookCellsChangeType.Move || - c.kind === NotebookCellsChangeType.ModelChange)) { - delayedRecompute(); - } - })); - // Perhaps this is the first time we're building the outline - if (!this._entries.length) { - this._recomputeState(); - } - }; - this._disposables.add(this._editor.onDidChangeModel(monitorModelChanges)); - monitorModelChanges(); - this._recomputeState(); - } - - dispose(): void { - this._entries.length = 0; - this._activeEntry = undefined; - this._entriesDisposables.dispose(); - this._disposables.dispose(); - } - - async setFullSymbols(cancelToken: CancellationToken) { - const notebookEditorWidget = this._editor; - - const notebookCells = notebookEditorWidget?.getViewModel()?.viewCells.filter((cell) => cell.cellKind === CellKind.Code); - - if (notebookCells) { - const promises: Promise[] = []; - // limit the number of cells so that we don't resolve an excessive amount of text models - for (const cell of notebookCells.slice(0, 100)) { - // gather all symbols asynchronously - promises.push(this._outlineEntryFactory.cacheSymbols(cell, this._outlineModelService, cancelToken)); - } - await Promise.allSettled(promises); - } - - this._recomputeState(); - } - private _recomputeState(): void { - this._entriesDisposables.clear(); - this._activeEntry = undefined; - this._uri = undefined; - - if (!this._editor.hasModel()) { - return; - } - - this._uri = this._editor.textModel.uri; - - const notebookEditorWidget: IActiveNotebookEditor = this._editor; - - if (notebookEditorWidget.getLength() === 0) { - return; - } - - let includeCodeCells = true; - if (this._target === OutlineTarget.Breadcrumbs) { - includeCodeCells = this._configurationService.getValue('notebook.breadcrumbs.showCodeCells'); - } - - let notebookCells: ICellViewModel[]; - if (this._target === OutlineTarget.Breadcrumbs) { - notebookCells = notebookEditorWidget.getViewModel().viewCells.filter((cell) => cell.cellKind === CellKind.Markup || includeCodeCells); - } else { - notebookCells = notebookEditorWidget.getViewModel().viewCells; - } - - const entries: OutlineEntry[] = []; - for (const cell of notebookCells) { - entries.push(...this._outlineEntryFactory.getOutlineEntries(cell, this._target, entries.length)); - } - - // build a tree from the list of entries - if (entries.length > 0) { - const result: OutlineEntry[] = [entries[0]]; - const parentStack: OutlineEntry[] = [entries[0]]; - - for (let i = 1; i < entries.length; i++) { - const entry = entries[i]; - - while (true) { - const len = parentStack.length; - if (len === 0) { - // root node - result.push(entry); - parentStack.push(entry); - break; - - } else { - const parentCandidate = parentStack[len - 1]; - if (parentCandidate.level < entry.level) { - parentCandidate.addChild(entry); - parentStack.push(entry); - break; - } else { - parentStack.pop(); - } - } - } - } - this._entries = result; - } - - // feature: show markers with each cell - const markerServiceListener = new MutableDisposable(); - this._entriesDisposables.add(markerServiceListener); - const updateMarkerUpdater = () => { - if (notebookEditorWidget.isDisposed) { - return; - } - - const doUpdateMarker = (clear: boolean) => { - for (const entry of this._entries) { - if (clear) { - entry.clearMarkers(); - } else { - entry.updateMarkers(this._markerService); - } - } - }; - const problem = this._configurationService.getValue('problems.visibility'); - if (problem === undefined) { - return; - } - - const config = this._configurationService.getValue(OutlineConfigKeys.problemsEnabled); - - if (problem && config) { - markerServiceListener.value = this._markerService.onMarkerChanged(e => { - if (notebookEditorWidget.isDisposed) { - console.error('notebook editor is disposed'); - return; - } - - if (e.some(uri => notebookEditorWidget.getCellsInRange().some(cell => isEqual(cell.uri, uri)))) { - doUpdateMarker(false); - this._onDidChange.fire({}); - } - }); - doUpdateMarker(false); - } else { - markerServiceListener.clear(); - doUpdateMarker(true); - } - }; - updateMarkerUpdater(); - this._entriesDisposables.add(this._configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('problems.visibility') || e.affectsConfiguration(OutlineConfigKeys.problemsEnabled)) { - updateMarkerUpdater(); - this._onDidChange.fire({}); - } - })); - - const { changeEventTriggered } = this._recomputeActive(); - if (!changeEventTriggered) { - this._onDidChange.fire({}); - } - } - - private _recomputeActive(): { changeEventTriggered: boolean } { - let newActive: OutlineEntry | undefined; - const notebookEditorWidget = this._editor; - - if (notebookEditorWidget) {//TODO don't check for widget, only here if we do have - if (notebookEditorWidget.hasModel() && notebookEditorWidget.getLength() > 0) { - const cell = notebookEditorWidget.cellAt(notebookEditorWidget.getFocus().start); - if (cell) { - for (const entry of this._entries) { - newActive = entry.find(cell, []); - if (newActive) { - break; - } - } - } - } - } - - // @Yoyokrazy - Make sure the new active entry isn't part of the filtered exclusions - const showCodeCells = this._configurationService.getValue(NotebookSetting.outlineShowCodeCells); - const showCodeCellSymbols = this._configurationService.getValue(NotebookSetting.outlineShowCodeCellSymbols); - const showMarkdownHeadersOnly = this._configurationService.getValue(NotebookSetting.outlineShowMarkdownHeadersOnly); - - // check the three outline filtering conditions - // if any are true, newActive should NOT be set to this._activeEntry and the event should NOT fire - if ( - (newActive !== this._activeEntry) && !( - (showMarkdownHeadersOnly && newActive?.cell.cellKind === CellKind.Markup && newActive?.level === NotebookOutlineConstants.NonHeaderOutlineLevel) || // show headers only + cell is mkdn + is level 7 (no header) - (!showCodeCells && newActive?.cell.cellKind === CellKind.Code) || // show code cells + cell is code - (!showCodeCellSymbols && newActive?.cell.cellKind === CellKind.Code && newActive?.level > NotebookOutlineConstants.NonHeaderOutlineLevel) // show code symbols + cell is code + has level > 7 (nb symbol levels) - ) - ) { - this._activeEntry = newActive; - this._onDidChange.fire({ affectOnlyActiveElement: true }); - return { changeEventTriggered: true }; - } - - return { changeEventTriggered: false }; - } - - get isEmpty(): boolean { - return this._entries.length === 0; - } - - get uri() { - return this._uri; - } -} diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory.ts deleted file mode 100644 index 54411bcd29679..0000000000000 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ReferenceCollection, type IReference } from 'vs/base/common/lifecycle'; -import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import type { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { NotebookCellOutlineProvider } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider'; -import type { OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; - -class NotebookCellOutlineProviderReferenceCollection extends ReferenceCollection { - constructor(@IInstantiationService private readonly instantiationService: IInstantiationService) { - super(); - } - protected override createReferencedObject(_key: string, editor: INotebookEditor, target: OutlineTarget): NotebookCellOutlineProvider { - return this.instantiationService.createInstance(NotebookCellOutlineProvider, editor, target); - } - protected override destroyReferencedObject(_key: string, object: NotebookCellOutlineProvider): void { - object.dispose(); - } -} - -export const INotebookCellOutlineProviderFactory = createDecorator('INotebookCellOutlineProviderFactory'); - -export interface INotebookCellOutlineProviderFactory { - getOrCreate(editor: INotebookEditor, target: OutlineTarget): IReference; -} - -export class NotebookCellOutlineProviderFactory implements INotebookCellOutlineProviderFactory { - private readonly _data: NotebookCellOutlineProviderReferenceCollection; - constructor(@IInstantiationService instantiationService: IInstantiationService) { - this._data = instantiationService.createInstance(NotebookCellOutlineProviderReferenceCollection); - } - - getOrCreate(editor: INotebookEditor, target: OutlineTarget): IReference { - return this._data.acquire(editor.getId(), editor, target); - } -} diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll.ts index 52e6889c4bc76..50a6758941bb8 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll.ts @@ -13,7 +13,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { CellFoldingState, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { INotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { OutlineEntry } from 'vs/workbench/contrib/notebook/browser/viewModel/OutlineEntry'; -import { NotebookCellOutlineProvider } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider'; +import { NotebookCellOutlineDataSource } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Delayer } from 'vs/base/common/async'; import { ThemeIcon } from 'vs/base/common/themables'; @@ -23,8 +23,7 @@ import { FoldingController } from 'vs/workbench/contrib/notebook/browser/control import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; import { NotebookSectionArgs } from 'vs/workbench/contrib/notebook/browser/controller/sectionActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { INotebookCellOutlineProviderFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory'; -import { OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; +import { INotebookCellOutlineDataSourceFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory'; export class NotebookStickyLine extends Disposable { constructor( @@ -105,7 +104,7 @@ export class NotebookStickyScroll extends Disposable { private readonly _onDidChangeNotebookStickyScroll = this._register(new Emitter()); readonly onDidChangeNotebookStickyScroll: Event = this._onDidChangeNotebookStickyScroll.event; - private notebookOutlineReference?: IReference; + private notebookCellOutlineReference?: IReference; getDomNode(): HTMLElement { return this.domNode; @@ -191,37 +190,37 @@ export class NotebookStickyScroll extends Disposable { this.init(); } else { this._disposables.clear(); - this.notebookOutlineReference?.dispose(); + this.notebookCellOutlineReference?.dispose(); this.disposeCurrentStickyLines(); DOM.clearNode(this.domNode); this.updateDisplay(); } - } else if (e.stickyScrollMode && this.notebookEditor.notebookOptions.getDisplayOptions().stickyScrollEnabled && this.notebookOutlineReference?.object) { - this.updateContent(computeContent(this.notebookEditor, this.notebookCellList, this.notebookOutlineReference?.object?.entries, this.getCurrentStickyHeight())); + } else if (e.stickyScrollMode && this.notebookEditor.notebookOptions.getDisplayOptions().stickyScrollEnabled && this.notebookCellOutlineReference?.object) { + this.updateContent(computeContent(this.notebookEditor, this.notebookCellList, this.notebookCellOutlineReference?.object?.entries, this.getCurrentStickyHeight())); } } private init() { - const { object: notebookOutlineReference } = this.notebookOutlineReference = this.instantiationService.invokeFunction((accessor) => accessor.get(INotebookCellOutlineProviderFactory).getOrCreate(this.notebookEditor, OutlineTarget.OutlinePane)); - this._register(this.notebookOutlineReference); - this.updateContent(computeContent(this.notebookEditor, this.notebookCellList, notebookOutlineReference.entries, this.getCurrentStickyHeight())); + const { object: notebookCellOutline } = this.notebookCellOutlineReference = this.instantiationService.invokeFunction((accessor) => accessor.get(INotebookCellOutlineDataSourceFactory).getOrCreate(this.notebookEditor)); + this._register(this.notebookCellOutlineReference); + this.updateContent(computeContent(this.notebookEditor, this.notebookCellList, notebookCellOutline.entries, this.getCurrentStickyHeight())); - this._disposables.add(notebookOutlineReference.onDidChange(() => { - const recompute = computeContent(this.notebookEditor, this.notebookCellList, notebookOutlineReference.entries, this.getCurrentStickyHeight()); + this._disposables.add(notebookCellOutline.onDidChange(() => { + const recompute = computeContent(this.notebookEditor, this.notebookCellList, notebookCellOutline.entries, this.getCurrentStickyHeight()); if (!this.compareStickyLineMaps(recompute, this.currentStickyLines)) { this.updateContent(recompute); } })); this._disposables.add(this.notebookEditor.onDidAttachViewModel(() => { - this.updateContent(computeContent(this.notebookEditor, this.notebookCellList, notebookOutlineReference.entries, this.getCurrentStickyHeight())); + this.updateContent(computeContent(this.notebookEditor, this.notebookCellList, notebookCellOutline.entries, this.getCurrentStickyHeight())); })); this._disposables.add(this.notebookEditor.onDidScroll(() => { const d = new Delayer(100); d.trigger(() => { d.dispose(); - const recompute = computeContent(this.notebookEditor, this.notebookCellList, notebookOutlineReference.entries, this.getCurrentStickyHeight()); + const recompute = computeContent(this.notebookEditor, this.notebookCellList, notebookCellOutline.entries, this.getCurrentStickyHeight()); if (!this.compareStickyLineMaps(recompute, this.currentStickyLines)) { this.updateContent(recompute); } @@ -369,7 +368,7 @@ export class NotebookStickyScroll extends Disposable { override dispose() { this._disposables.dispose(); this.disposeCurrentStickyLines(); - this.notebookOutlineReference?.dispose(); + this.notebookCellOutlineReference?.dispose(); super.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts index 582490022a127..ed6e5f6363bde 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts @@ -18,6 +18,9 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { NotebookCellOutline } from 'vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { IEditorPaneSelectionChangeEvent } from 'vs/workbench/common/editor'; suite('Notebook Outline', function () { @@ -32,6 +35,7 @@ suite('Notebook Outline', function () { disposables = new DisposableStore(); instantiationService = setupInstantiationService(disposables); instantiationService.set(IEditorService, new class extends mock() { }); + instantiationService.set(ILanguageFeaturesService, new LanguageFeaturesService()); instantiationService.set(IMarkerService, disposables.add(new MarkerService())); instantiationService.set(IThemeService, new class extends mock() { override onDidFileIconThemeChange = Event.None; @@ -52,6 +56,7 @@ suite('Notebook Outline', function () { return editor; } override onDidChangeModel: Event = Event.None; + override onDidChangeSelection: Event = Event.None; }, OutlineTarget.OutlinePane); disposables.add(outline); diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts index 0e22c66ed0144..8f4eb76f909be 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutlineViewProviders.test.ts @@ -6,6 +6,7 @@ import assert from 'assert'; import { IDataSource } from 'vs/base/browser/ui/tree/tree'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { IReference } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ITextModel } from 'vs/editor/common/model'; @@ -14,15 +15,17 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { NotebookBreadcrumbsProvider, NotebookCellOutline, NotebookOutlinePaneProvider, NotebookQuickPickProvider } from 'vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookCellOutlineDataSource } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSource'; import { NotebookOutlineEntryFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory'; import { OutlineEntry } from 'vs/workbench/contrib/notebook/browser/viewModel/OutlineEntry'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { MockDocumentSymbol } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; -import { OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; suite('Notebook Outline View Providers', function () { + // #region Setup - ensureNoDisposablesAreLeakedInTestSuite(); + + const store = ensureNoDisposablesAreLeakedInTestSuite(); const configurationService = new TestConfigurationService(); const themeService = new TestThemeService(); @@ -52,8 +55,10 @@ suite('Notebook Outline View Providers', function () { return 0; } }; + // #endregion // #region Helpers + function createCodeCellViewModel(version: number = 1, source = '# code', textmodelId = 'textId') { return { textBuffer: { @@ -75,6 +80,15 @@ suite('Notebook Outline View Providers', function () { } as ICellViewModel; } + function createMockOutlineDataSource(entries: OutlineEntry[], activeElement: OutlineEntry | undefined = undefined) { + return new class extends mock>() { + override object: INotebookCellOutlineDataSource = { + entries: entries, + activeElement: activeElement, + }; + }; + } + function createMarkupCellViewModel(version: number = 1, source = 'markup', textmodelId = 'textId', alternativeId = 1) { return { textBuffer: { @@ -99,7 +113,7 @@ suite('Notebook Outline View Providers', function () { } as ICellViewModel; } - function flatten(element: NotebookCellOutline | OutlineEntry, dataSource: IDataSource): OutlineEntry[] { + function flatten(element: OutlineEntry, dataSource: IDataSource): OutlineEntry[] { const elements: OutlineEntry[] = []; const children = dataSource.getChildren(element); @@ -166,6 +180,7 @@ suite('Notebook Outline View Providers', function () { await configurationService.setUserConfiguration('notebook.gotoSymbols.showAllSymbols', config.quickPickShowAllSymbols); await configurationService.setUserConfiguration('notebook.breadcrumbs.showCodeCells', config.breadcrumbsShowCodeCells); } + // #endregion // #region OutlinePane @@ -199,11 +214,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const outlinePaneProvider = new NotebookOutlinePaneProvider(() => [], configurationService); + const outlinePaneProvider = store.add(new NotebookOutlinePaneProvider(undefined, configurationService)); const results = flatten(outlineModel, outlinePaneProvider); // Validate @@ -242,11 +257,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const outlinePaneProvider = new NotebookOutlinePaneProvider(() => [], configurationService); + const outlinePaneProvider = store.add(new NotebookOutlinePaneProvider(undefined, configurationService)); const results = flatten(outlineModel, outlinePaneProvider); assert.equal(results.length, 2); @@ -288,11 +303,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const outlinePaneProvider = new NotebookOutlinePaneProvider(() => [], configurationService); + const outlinePaneProvider = store.add(new NotebookOutlinePaneProvider(undefined, configurationService)); const results = flatten(outlineModel, outlinePaneProvider); assert.equal(results.length, 1); @@ -331,11 +346,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const outlinePaneProvider = new NotebookOutlinePaneProvider(() => [], configurationService); + const outlinePaneProvider = store.add(new NotebookOutlinePaneProvider(undefined, configurationService)); const results = flatten(outlineModel, outlinePaneProvider); assert.equal(results.length, 3); @@ -380,11 +395,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const outlinePaneProvider = new NotebookOutlinePaneProvider(() => [], configurationService); + const outlinePaneProvider = store.add(new NotebookOutlinePaneProvider(undefined, configurationService)); const results = flatten(outlineModel, outlinePaneProvider); // validate @@ -439,11 +454,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const quickPickProvider = new NotebookQuickPickProvider(() => [...outlineModel.children], configurationService, themeService); + const quickPickProvider = store.add(new NotebookQuickPickProvider(createMockOutlineDataSource([...outlineModel.children]), configurationService, themeService)); const results = quickPickProvider.getQuickPickElements(); // Validate @@ -492,11 +507,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const quickPickProvider = new NotebookQuickPickProvider(() => [...outlineModel.children], configurationService, themeService); + const quickPickProvider = store.add(new NotebookQuickPickProvider(createMockOutlineDataSource([...outlineModel.children]), configurationService, themeService)); const results = quickPickProvider.getQuickPickElements(); // Validate @@ -545,11 +560,11 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createCodeCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } // Generate filtered outline (view model) - const quickPickProvider = new NotebookQuickPickProvider(() => [...outlineModel.children], configurationService, themeService); + const quickPickProvider = store.add(new NotebookQuickPickProvider(createMockOutlineDataSource([...outlineModel.children]), configurationService, themeService)); const results = quickPickProvider.getQuickPickElements(); // Validate @@ -601,12 +616,12 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createMarkupCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } const outlineTree = buildOutlineTree([...outlineModel.children]); // Generate filtered outline (view model) - const breadcrumbsProvider = new NotebookBreadcrumbsProvider(() => [...outlineTree![0].children][1], configurationService); + const breadcrumbsProvider = store.add(new NotebookBreadcrumbsProvider(createMockOutlineDataSource([], [...outlineTree![0].children][1]), configurationService)); const results = breadcrumbsProvider.getBreadcrumbElements(); // Validate @@ -652,12 +667,12 @@ suite('Notebook Outline View Providers', function () { // Generate raw outline const outlineModel = new OutlineEntry(-1, -1, createMarkupCellViewModel(), 'fakeRoot', false, false, undefined, undefined); for (const cell of cells) { - entryFactory.getOutlineEntries(cell, OutlineTarget.OutlinePane, 0).forEach(entry => outlineModel.addChild(entry)); + entryFactory.getOutlineEntries(cell, 0).forEach(entry => outlineModel.addChild(entry)); } const outlineTree = buildOutlineTree([...outlineModel.children]); // Generate filtered outline (view model) - const breadcrumbsProvider = new NotebookBreadcrumbsProvider(() => [...outlineTree![0].children][1], configurationService); + const breadcrumbsProvider = store.add(new NotebookBreadcrumbsProvider(createMockOutlineDataSource([], [...outlineTree![0].children][1]), configurationService)); const results = breadcrumbsProvider.getBreadcrumbElements(); // Validate diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts index 9c802bd233182..dfe5b81e3f44d 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookSymbols.test.ts @@ -13,7 +13,6 @@ import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBr import { NotebookOutlineEntryFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineEntryFactory'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { MockDocumentSymbol } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; -import { OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; suite('Notebook Symbols', function () { ensureNoDisposablesAreLeakedInTestSuite(); @@ -67,7 +66,7 @@ suite('Notebook Symbols', function () { test('Cell without symbols cache', function () { setSymbolsForTextModel([{ name: 'var', range: {} }]); const entryFactory = new NotebookOutlineEntryFactory(executionService); - const entries = entryFactory.getOutlineEntries(createCellViewModel(), OutlineTarget.QuickPick, 0); + const entries = entryFactory.getOutlineEntries(createCellViewModel(), 0); assert.equal(entries.length, 1, 'no entries created'); assert.equal(entries[0].label, '# code', 'entry should fall back to first line of cell'); @@ -79,7 +78,7 @@ suite('Notebook Symbols', function () { const cell = createCellViewModel(); await entryFactory.cacheSymbols(cell, outlineModelService, CancellationToken.None); - const entries = entryFactory.getOutlineEntries(cell, OutlineTarget.QuickPick, 0); + const entries = entryFactory.getOutlineEntries(cell, 0); assert.equal(entries.length, 3, 'wrong number of outline entries'); assert.equal(entries[0].label, '# code'); @@ -101,7 +100,7 @@ suite('Notebook Symbols', function () { const cell = createCellViewModel(); await entryFactory.cacheSymbols(cell, outlineModelService, CancellationToken.None); - const entries = entryFactory.getOutlineEntries(createCellViewModel(), OutlineTarget.QuickPick, 0); + const entries = entryFactory.getOutlineEntries(createCellViewModel(), 0); assert.equal(entries.length, 6, 'wrong number of outline entries'); assert.equal(entries[0].label, '# code'); @@ -127,8 +126,8 @@ suite('Notebook Symbols', function () { await entryFactory.cacheSymbols(cell1, outlineModelService, CancellationToken.None); await entryFactory.cacheSymbols(cell2, outlineModelService, CancellationToken.None); - const entries1 = entryFactory.getOutlineEntries(createCellViewModel(1, '$1'), OutlineTarget.QuickPick, 0); - const entries2 = entryFactory.getOutlineEntries(createCellViewModel(1, '$2'), OutlineTarget.QuickPick, 0); + const entries1 = entryFactory.getOutlineEntries(createCellViewModel(1, '$1'), 0); + const entries2 = entryFactory.getOutlineEntries(createCellViewModel(1, '$2'), 0); assert.equal(entries1.length, 2, 'wrong number of outline entries'); diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts index 9026b78d45712..f8dae4867360c 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookStickyScroll.test.ts @@ -9,7 +9,10 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; import { assertSnapshot } from 'vs/base/test/common/snapshot'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { IEditorPaneSelectionChangeEvent } from 'vs/workbench/common/editor'; import { NotebookCellOutline } from 'vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline'; import { INotebookEditor, INotebookEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { INotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; @@ -29,23 +32,25 @@ suite('NotebookEditorStickyScroll', () => { disposables.dispose(); }); - ensureNoDisposablesAreLeakedInTestSuite(); + const store = ensureNoDisposablesAreLeakedInTestSuite(); setup(() => { disposables = new DisposableStore(); instantiationService = setupInstantiationService(disposables); + instantiationService.set(ILanguageFeaturesService, new LanguageFeaturesService()); }); function getOutline(editor: any) { if (!editor.hasModel()) { assert.ok(false, 'MUST have active text editor'); } - const outline = instantiationService.createInstance(NotebookCellOutline, new class extends mock() { + const outline = store.add(instantiationService.createInstance(NotebookCellOutline, new class extends mock() { override getControl() { return editor; } override onDidChangeModel: Event = Event.None; - }, OutlineTarget.QuickPick); + override onDidChangeSelection: Event = Event.None; + }, OutlineTarget.QuickPick)); return outline; } diff --git a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts index 3b15b354fbf9e..8054c280d1e00 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts @@ -65,7 +65,7 @@ import { EditorFontLigatures, EditorFontVariations } from 'vs/editor/common/conf import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { mainWindow } from 'vs/base/browser/window'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; -import { INotebookCellOutlineProviderFactory, NotebookCellOutlineProviderFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProviderFactory'; +import { INotebookCellOutlineDataSourceFactory, NotebookCellOutlineDataSourceFactory } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineDataSourceFactory'; import { ILanguageDetectionService } from 'vs/workbench/services/languageDetection/common/languageDetectionWorkerService'; export class TestCell extends NotebookCellTextModel { @@ -199,7 +199,7 @@ export function setupInstantiationService(disposables: DisposableStore) { instantiationService.stub(IKeybindingService, new MockKeybindingService()); instantiationService.stub(INotebookCellStatusBarService, disposables.add(new NotebookCellStatusBarService())); instantiationService.stub(ICodeEditorService, disposables.add(new TestCodeEditorService(testThemeService))); - instantiationService.stub(INotebookCellOutlineProviderFactory, instantiationService.createInstance(NotebookCellOutlineProviderFactory)); + instantiationService.stub(INotebookCellOutlineDataSourceFactory, instantiationService.createInstance(NotebookCellOutlineDataSourceFactory)); instantiationService.stub(ILanguageDetectionService, new class MockLanguageDetectionService implements ILanguageDetectionService { _serviceBrand: undefined; From b0a60ae2da4cc39ff1c6141c4f0634e59ad1d66f Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 12 Jun 2024 20:10:57 +0200 Subject: [PATCH 207/755] Engineering - bump macOS agent version (#215286) * Engineering - bump macOS agent version * Jump to macOS-13 --- build/azure-pipelines/product-build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 0508059fcd7b1..5f6eb230cda0c 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -271,7 +271,7 @@ extends: - job: CLIMacOSX64 pool: name: Azure Pipelines - image: macOS-11 + image: macOS-13 os: macOS steps: - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self @@ -284,7 +284,7 @@ extends: - job: CLIMacOSARM64 pool: name: Azure Pipelines - image: macOS-11 + image: macOS-13 os: macOS steps: - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self @@ -597,7 +597,7 @@ extends: - CompileCLI pool: name: Azure Pipelines - image: macOS-11 + image: macOS-13 os: macOS variables: BUILDSECMON_OPT_IN: true From 7392790e74b5a5623bd199ee5ffaf2678d794f85 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:25:03 +0200 Subject: [PATCH 208/755] SCM - fix context key for clearing the input (#215341) --- src/vs/workbench/contrib/scm/browser/scm.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index 262eab7b31eab..9b912eb95d6e8 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -386,7 +386,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'scm.clearInput', weight: KeybindingWeight.WorkbenchContrib, - when: ContextKeyExpr.has('scmRepository'), + when: ContextKeyExpr.and(ContextKeyExpr.has('scmRepository'), SuggestContext.Visible.toNegated()), primary: KeyCode.Escape, handler: async (accessor) => { const scmService = accessor.get(ISCMService); From 065370a15bc59b0dfcc7450ee738f17f0d0bb0f9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2024 12:26:11 -0700 Subject: [PATCH 209/755] Pick up latest TS for building VS Code (#215329) --- package.json | 4 ++-- yarn.lock | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index c2a69f1ed6a17..bb277caf00629 100644 --- a/package.json +++ b/package.json @@ -207,7 +207,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "tsec": "0.2.7", - "typescript": "^5.5.0-dev.20240603", + "typescript": "^5.6.0-dev.20240612", "util": "^0.12.4", "vscode-nls-dev": "^3.3.1", "webpack": "^5.91.0", @@ -229,4 +229,4 @@ "optionalDependencies": { "windows-foreground-love": "0.5.0" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index fa5f0a1f2bdbe..385a3c04eedcf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9326,7 +9326,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9370,6 +9370,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9423,7 +9432,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9458,6 +9467,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10060,10 +10076,10 @@ typescript@^4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^5.5.0-dev.20240603: - version "5.5.0-dev.20240603" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.0-dev.20240603.tgz#a1b7311df5039a8abbaaa2213c21cac6ec547490" - integrity sha512-gdm3Sh1A+Pjj9ZlfBEJY3o2rs3tvpcSbu3vYqcCijMe09BePQBtZlsuShuPn+zCnP+qBLxdKjFiw5v1tkna3tA== +typescript@^5.6.0-dev.20240612: + version "5.6.0-dev.20240612" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.0-dev.20240612.tgz#186d320d9ff7b1877c2e990be3b2a84b63c9b540" + integrity sha512-C5WDxLlEMZhdyZBkhZkysctw9uOpGnua48Zrq0FxJLx6+tFrNkanXn4Zhatjg1vbKjzk19FYggX4Gc6Wgz5flg== typical@^4.0.0: version "4.0.0" @@ -10613,7 +10629,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10648,6 +10664,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 9e1ca6d94c31030e7f436773fbce3afb3715980f Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Wed, 12 Jun 2024 13:17:55 -0700 Subject: [PATCH 210/755] re-enable chat hint in stable, add right click disable action (#214641) --- .../terminal.initialHint.contribution.ts | 24 +++++++++++++++---- .../terminalInitialHintConfiguration.ts | 3 +-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index 4e32cf4263641..9bd955a1ab7d4 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -30,6 +30,8 @@ import 'vs/css!./media/terminalInitialHint'; import { TerminalInitialHintSettingId } from 'vs/workbench/contrib/terminalContrib/chat/common/terminalInitialHintConfiguration'; import { ChatAgentLocation, IChatAgent, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; const $ = dom.$; @@ -202,8 +204,6 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm } registerTerminalContribution(TerminalInitialHintContribution.ID, TerminalInitialHintContribution, false); - - class TerminalInitialHintWidget extends Disposable { @@ -221,7 +221,8 @@ class TerminalInitialHintWidget extends Disposable { @ITelemetryService private readonly telemetryService: ITelemetryService, @IProductService private readonly productService: IProductService, @ITerminalService private readonly terminalService: ITerminalService, - @IStorageService private readonly _storageService: IStorageService + @IStorageService private readonly _storageService: IStorageService, + @IContextMenuService private readonly contextMenuService: IContextMenuService ) { super(); this.toDispose.add(_instance.onDidFocus(() => { @@ -335,8 +336,23 @@ class TerminalInitialHintWidget extends Disposable { this.domNode = undefined; })); + this.toDispose.add(dom.addDisposableListener(this.domNode, dom.EventType.CONTEXT_MENU, (e) => { + this.contextMenuService.showContextMenu({ + getAnchor: () => { return new StandardMouseEvent(dom.getActiveWindow(), e); }, + getActions: () => { + return [{ + id: 'workench.action.disableTerminalInitialHint', + label: localize('disableInitialHint', "Disable Initial Hint"), + tooltip: localize('disableInitialHint', "Disable Initial Hint"), + enabled: true, + class: undefined, + run: () => this.configurationService.updateValue(TerminalInitialHintSettingId.Enabled, false) + } + ]; + } + }); + })); } - return this.domNode; } diff --git a/src/vs/workbench/contrib/terminalContrib/chat/common/terminalInitialHintConfiguration.ts b/src/vs/workbench/contrib/terminalContrib/chat/common/terminalInitialHintConfiguration.ts index 711ebbb18fed7..41567ee5921ea 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/common/terminalInitialHintConfiguration.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/common/terminalInitialHintConfiguration.ts @@ -6,7 +6,6 @@ import { IStringDictionary } from 'vs/base/common/collections'; import { localize } from 'vs/nls'; import { IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; -import product from 'vs/platform/product/common/product'; export const enum TerminalInitialHintSettingId { Enabled = 'terminal.integrated.initialHint' @@ -17,6 +16,6 @@ export const terminalInitialHintConfiguration: IStringDictionary Date: Wed, 12 Jun 2024 13:20:46 -0700 Subject: [PATCH 211/755] Restrict copy/paste with imports to TS 5.6+ (#215386) Also skips when the copied file is the same as the paste file --- extensions/typescript-language-features/package.nls.json | 2 +- .../src/languageFeatures/copyPaste.ts | 8 ++++++-- .../typescript-language-features/src/tsServer/api.ts | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index 4f276905d967a..cdc6264424c6d 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -219,7 +219,7 @@ "configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors": "Suppresses semantic errors on web even when project wide IntelliSense is enabled. This is always on when project wide IntelliSense is not enabled or available. See `#typescript.tsserver.web.projectWideIntellisense.enabled#`", "configuration.tsserver.web.typeAcquisition.enabled": "Enable/disable package acquisition on the web. This enables IntelliSense for imported packages. Requires `#typescript.tsserver.web.projectWideIntellisense.enabled#`. Currently not supported for Safari.", "configuration.tsserver.nodePath": "Run TS Server on a custom Node installation. This can be a path to a Node executable, or 'node' if you want VS Code to detect a Node installation.", - "configuration.updateImportsOnPaste": "Automatically update imports when pasting code. Requires TypeScript 5.5+.", + "configuration.updateImportsOnPaste": "Automatically update imports when pasting code. Requires TypeScript 5.6+.", "walkthroughs.nodejsWelcome.title": "Get started with JavaScript and Node.js", "walkthroughs.nodejsWelcome.description": "Make the most of Visual Studio Code's first-class JavaScript experience.", "walkthroughs.nodejsWelcome.downloadNode.forMacOrWindows.title": "Install Node.js", diff --git a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts index 643c77ac35767..fc869116dc724 100644 --- a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts +++ b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts @@ -61,7 +61,7 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { token: vscode.CancellationToken, ): Promise { const config = vscode.workspace.getConfiguration(this._modeId, document.uri); - if (!config.get('experimental.updateImportsOnPaste')) { + if (!config.get('experimental.updateImportsOnPaste', false)) { return; } @@ -93,6 +93,10 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { } } + if (copiedFrom?.file === file) { + return; + } + const response = await this._client.execute('getPasteEdits', { file, // TODO: only supports a single paste for now @@ -126,7 +130,7 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { export function register(selector: DocumentSelector, language: LanguageDescription, client: ITypeScriptServiceClient) { return conditionalRegistration([ requireSomeCapability(client, ClientCapability.Semantic), - requireMinVersion(client, API.v550), + requireMinVersion(client, API.v560), ], () => { return vscode.languages.registerDocumentPasteEditProvider(selector.semantic, new DocumentPasteProvider(language.id, client), { providedPasteEditKinds: [DocumentPasteProvider.kind], diff --git a/extensions/typescript-language-features/src/tsServer/api.ts b/extensions/typescript-language-features/src/tsServer/api.ts index 4f26db47513a4..4beb29d1b2b43 100644 --- a/extensions/typescript-language-features/src/tsServer/api.ts +++ b/extensions/typescript-language-features/src/tsServer/api.ts @@ -38,6 +38,7 @@ export class API { public static readonly v544 = API.fromSimpleString('5.4.4'); public static readonly v540 = API.fromSimpleString('5.4.0'); public static readonly v550 = API.fromSimpleString('5.5.0'); + public static readonly v560 = API.fromSimpleString('5.6.0'); public static fromVersionString(versionString: string): API { let version = semver.valid(versionString); From 94274c47b8b8b7b7be0fce489512f40f114fa02f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2024 14:29:41 -0700 Subject: [PATCH 212/755] Skip interrupting `geterr` in automatic cases (#215389) Quick fixes already don't interrupt `geterr` requests so this likely won't slow down the automatic lightbulb --- .../src/languageFeatures/refactor.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/languageFeatures/refactor.ts b/extensions/typescript-language-features/src/languageFeatures/refactor.ts index 8dc062357533e..0364b7fad3ef9 100644 --- a/extensions/typescript-language-features/src/languageFeatures/refactor.ts +++ b/extensions/typescript-language-features/src/languageFeatures/refactor.ts @@ -541,11 +541,12 @@ class TypeScriptRefactorProvider implements vscode.CodeActionProvider { + const response = await this.interruptGetErrIfNeeded(context, () => { const file = this.client.toOpenTsFilePath(document); if (!file) { return undefined; } + this.formattingOptionsManager.ensureConfigurationForDocument(document, token); const args: Proto.GetApplicableRefactorsRequestArgs = { @@ -595,6 +596,17 @@ class TypeScriptRefactorProvider implements vscode.CodeActionProvider(context: vscode.CodeActionContext, f: () => R): R { + // Only interrupt diagnostics computation when code actions are explicitly + // (such as using the refactor command or a keybinding). This is a clear + // user action so we want to return results as quickly as possible. + if (context.triggerKind === vscode.CodeActionTriggerKind.Invoke) { + return this.client.interruptGetErr(f); + } else { + return f(); + } + } + public async resolveCodeAction( codeAction: TsCodeAction, token: vscode.CancellationToken, From 0a417782b1781d39803b8f1791cfb22f8835ddae Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 12 Jun 2024 14:44:19 -0700 Subject: [PATCH 213/755] Add ColorDetector contrib to chat codeblocks (#215392) --- .../contrib/chat/browser/codeBlockPart.ts | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts index 46e306fd9d2b6..394b956b167f9 100644 --- a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts +++ b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts @@ -6,24 +6,39 @@ import 'vs/css!./codeBlockPart'; import * as dom from 'vs/base/browser/dom'; +import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer'; +import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Button } from 'vs/base/browser/ui/button/button'; +import { toAction } from 'vs/base/common/actions'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; import { Emitter } from 'vs/base/common/event'; import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; +import { basename, isEqual } from 'vs/base/common/resources'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; +import { TabFocus } from 'vs/editor/browser/config/tabFocus'; +import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; +import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/diffEditorWidget'; import { EDITOR_FONT_DEFAULTS, EditorOption, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IRange, Range } from 'vs/editor/common/core/range'; import { IDiffEditorViewModel, ScrollType } from 'vs/editor/common/editorCommon'; +import { TextEdit } from 'vs/editor/common/languages'; import { EndOfLinePreference, ITextModel } from 'vs/editor/common/model'; +import { TextModelText } from 'vs/editor/common/model/textModelText'; import { IModelService } from 'vs/editor/common/services/model'; +import { DefaultModelSHA1Computer } from 'vs/editor/common/services/modelService'; import { IResolvedTextEditorModel, ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { BracketMatchingController } from 'vs/editor/contrib/bracketMatching/browser/bracketMatching'; +import { ColorDetector } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; +import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import { ViewportSemanticTokensContribution } from 'vs/editor/contrib/semanticTokens/browser/viewportSemanticTokens'; import { SmartSelectController } from 'vs/editor/contrib/smartSelect/browser/smartSelect'; import { WordHighlighterContribution } from 'vs/editor/contrib/wordHighlighter/browser/wordHighlighter'; @@ -33,36 +48,22 @@ import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; import { IChatRendererDelegate } from 'vs/workbench/contrib/chat/browser/chatListRenderer'; import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions'; +import { CONTEXT_CHAT_EDIT_APPLIED } from 'vs/workbench/contrib/chat/common/chatContextKeys'; +import { IChatResponseModel, IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; import { IChatResponseViewModel, isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { IMarkdownVulnerability } from '../common/annotations'; -import { TabFocus } from 'vs/editor/browser/config/tabFocus'; -import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/diffEditorWidget'; -import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; -import { CONTEXT_CHAT_EDIT_APPLIED } from 'vs/workbench/contrib/chat/common/chatContextKeys'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IChatResponseModel, IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; -import { TextEdit } from 'vs/editor/common/languages'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { basename, isEqual } from 'vs/base/common/resources'; -import { DefaultModelSHA1Computer } from 'vs/editor/common/services/modelService'; -import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { TextModelText } from 'vs/editor/common/model/textModelText'; -import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { toAction } from 'vs/base/common/actions'; const $ = dom.$; @@ -282,6 +283,7 @@ export class CodeBlockPart extends Disposable { HoverController.ID, MessageController.ID, GotoDefinitionAtPositionEditorContribution.ID, + ColorDetector.ID ]) })); } From e4caee48208b33ce23d0a0b4be13786bd399eef2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Jun 2024 23:39:13 -0700 Subject: [PATCH 214/755] Make cancelling paste with mouse do default paste (#215396) Also fixes some issues around lifetimes --- .../browser/copyPasteController.ts | 118 ++++++++++++------ .../browser/dropIntoEditorController.ts | 2 +- .../inlineProgress/browser/inlineProgress.ts | 15 ++- 3 files changed, 94 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts b/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts index 87cddb00a8d7b..7be0296af9114 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts @@ -6,10 +6,10 @@ import { addDisposableListener, getActiveDocument } from 'vs/base/browser/dom'; import { coalesce } from 'vs/base/common/arrays'; import { CancelablePromise, createCancelablePromise, raceCancellation } from 'vs/base/common/async'; -import { CancellationToken } from 'vs/base/common/cancellation'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { UriList, VSDataTransfer, createStringDataTransferItem, matchesMimeType } from 'vs/base/common/dataTransfer'; import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; import * as platform from 'vs/base/common/platform'; import { generateUuid } from 'vs/base/common/uuid'; @@ -36,6 +36,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { PostEditWidgetManager } from './postEditWidget'; +import { isCancellationError } from 'vs/base/common/errors'; export const changePasteTypeCommandId = 'editor.changePasteType'; @@ -54,6 +55,12 @@ type PasteEditWithProvider = DocumentPasteEdit & { provider: DocumentPasteEditProvider; }; + +interface DocumentPasteWithProviderEditsSession { + edits: readonly PasteEditWithProvider[]; + dispose(): void; +} + type PastePreference = | HierarchicalKind | { providerId: string }; @@ -299,17 +306,28 @@ export class CopyPasteController extends Disposable implements IEditorContributi } private doPasteInline(allProviders: readonly DocumentPasteEditProvider[], selections: readonly Selection[], dataTransfer: VSDataTransfer, metadata: CopyMetadata | undefined, clipboardEvent: ClipboardEvent): void { - const p = createCancelablePromise(async (token) => { + const editor = this._editor; + if (!editor.hasModel()) { + return; + } + + const editorStateCts = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Selection, undefined); + + const p = createCancelablePromise(async (pToken) => { const editor = this._editor; if (!editor.hasModel()) { return; } const model = editor.getModel(); - const tokenSource = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Selection, undefined, token); + const disposables = new DisposableStore(); + const cts = disposables.add(new CancellationTokenSource(pToken)); + disposables.add(editorStateCts.token.onCancellationRequested(() => cts.cancel())); + + const token = cts.token; try { - await this.mergeInDataFromCopy(dataTransfer, metadata, tokenSource.token); - if (tokenSource.token.isCancellationRequested) { + await this.mergeInDataFromCopy(dataTransfer, metadata, token); + if (token.isCancellationRequested) { return; } @@ -317,43 +335,60 @@ export class CopyPasteController extends Disposable implements IEditorContributi if (!supportedProviders.length || (supportedProviders.length === 1 && supportedProviders[0] instanceof DefaultTextPasteOrDropEditProvider) // Only our default text provider is active ) { - return this.applyDefaultPasteHandler(dataTransfer, metadata, tokenSource.token, clipboardEvent); + return this.applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent); } const context: DocumentPasteContext = { triggerKind: DocumentPasteTriggerKind.Automatic, }; - const providerEdits = await this.getPasteEdits(supportedProviders, dataTransfer, model, selections, context, tokenSource.token); - if (tokenSource.token.isCancellationRequested) { + const editSession = await this.getPasteEdits(supportedProviders, dataTransfer, model, selections, context, token); + disposables.add(editSession); + if (token.isCancellationRequested) { return; } // If the only edit returned is our default text edit, use the default paste handler - if (providerEdits.length === 1 && providerEdits[0].provider instanceof DefaultTextPasteOrDropEditProvider) { - return this.applyDefaultPasteHandler(dataTransfer, metadata, tokenSource.token, clipboardEvent); + if (editSession.edits.length === 1 && editSession.edits[0].provider instanceof DefaultTextPasteOrDropEditProvider) { + return this.applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent); } - if (providerEdits.length) { + if (editSession.edits.length) { const canShowWidget = editor.getOption(EditorOption.pasteAs).showPasteSelector === 'afterPaste'; - return this._postPasteWidgetManager.applyEditAndShowIfNeeded(selections, { activeEditIndex: 0, allEdits: providerEdits }, canShowWidget, async (edit, token) => { + return this._postPasteWidgetManager.applyEditAndShowIfNeeded(selections, { activeEditIndex: 0, allEdits: editSession.edits }, canShowWidget, async (edit, token) => { const resolved = await edit.provider.resolveDocumentPasteEdit?.(edit, token); if (resolved) { edit.additionalEdit = resolved.additionalEdit; } return edit; - }, tokenSource.token); + }, token); } - await this.applyDefaultPasteHandler(dataTransfer, metadata, tokenSource.token, clipboardEvent); + await this.applyDefaultPasteHandler(dataTransfer, metadata, token, clipboardEvent); } finally { - tokenSource.dispose(); + disposables.dispose(); if (this._currentPasteOperation === p) { this._currentPasteOperation = undefined; } } }); - this._pasteProgressManager.showWhile(selections[0].getEndPosition(), localize('pasteIntoEditorProgress', "Running paste handlers. Click to cancel"), p); + this._pasteProgressManager.showWhile(selections[0].getEndPosition(), localize('pasteIntoEditorProgress', "Running paste handlers. Click to cancel and do basic paste"), p, { + cancel: async () => { + try { + p.cancel(); + + if (editorStateCts.token.isCancellationRequested) { + return; + } + + await this.applyDefaultPasteHandler(dataTransfer, metadata, editorStateCts.token, clipboardEvent); + } finally { + editorStateCts.dispose(); + } + } + }).then(() => { + editorStateCts.dispose(); + }); this._currentPasteOperation = p; } @@ -365,7 +400,8 @@ export class CopyPasteController extends Disposable implements IEditorContributi } const model = editor.getModel(); - const tokenSource = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Selection, undefined, token); + const disposables = new DisposableStore(); + const tokenSource = disposables.add(new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Selection, undefined, token)); try { await this.mergeInDataFromCopy(dataTransfer, metadata, tokenSource.token); if (tokenSource.token.isCancellationRequested) { @@ -383,23 +419,26 @@ export class CopyPasteController extends Disposable implements IEditorContributi triggerKind: DocumentPasteTriggerKind.PasteAs, only: preference && preference instanceof HierarchicalKind ? preference : undefined, }; - let providerEdits = await this.getPasteEdits(supportedProviders, dataTransfer, model, selections, context, tokenSource.token); + let editSession = disposables.add(await this.getPasteEdits(supportedProviders, dataTransfer, model, selections, context, tokenSource.token)); if (tokenSource.token.isCancellationRequested) { return; } // Filter out any edits that don't match the requested kind if (preference) { - providerEdits = providerEdits.filter(edit => { - if (preference instanceof HierarchicalKind) { - return preference.contains(edit.kind); - } else { - return preference.providerId === edit.provider.id; - } - }); + editSession = { + edits: editSession.edits.filter(edit => { + if (preference instanceof HierarchicalKind) { + return preference.contains(edit.kind); + } else { + return preference.providerId === edit.provider.id; + } + }), + dispose: editSession.dispose + }; } - if (!providerEdits.length) { + if (!editSession.edits.length) { if (context.only) { this.showPasteAsNoEditMessage(selections, context.only); } @@ -408,10 +447,10 @@ export class CopyPasteController extends Disposable implements IEditorContributi let pickedEdit: DocumentPasteEdit | undefined; if (preference) { - pickedEdit = providerEdits.at(0); + pickedEdit = editSession.edits.at(0); } else { const selected = await this._quickInputService.pick( - providerEdits.map((edit): IQuickPickItem & { edit: DocumentPasteEdit } => ({ + editSession.edits.map((edit): IQuickPickItem & { edit: DocumentPasteEdit } => ({ label: edit.title, description: edit.kind?.value, edit, @@ -428,7 +467,7 @@ export class CopyPasteController extends Disposable implements IEditorContributi const combinedWorkspaceEdit = createCombinedWorkspaceEdit(model.uri, selections, pickedEdit); await this._bulkEditService.apply(combinedWorkspaceEdit, { editor: this._editor }); } finally { - tokenSource.dispose(); + disposables.dispose(); if (this._currentPasteOperation === p) { this._currentPasteOperation = undefined; } @@ -499,23 +538,32 @@ export class CopyPasteController extends Disposable implements IEditorContributi } } - private async getPasteEdits(providers: readonly DocumentPasteEditProvider[], dataTransfer: VSDataTransfer, model: ITextModel, selections: readonly Selection[], context: DocumentPasteContext, token: CancellationToken): Promise { + private async getPasteEdits(providers: readonly DocumentPasteEditProvider[], dataTransfer: VSDataTransfer, model: ITextModel, selections: readonly Selection[], context: DocumentPasteContext, token: CancellationToken): Promise { + const disposables = new DisposableStore(); + const results = await raceCancellation( Promise.all(providers.map(async provider => { try { const edits = await provider.provideDocumentPasteEdits?.(model, selections, dataTransfer, context, token); - // TODO: dispose of edits + if (edits) { + disposables.add(edits); + } return edits?.edits?.map(edit => ({ ...edit, provider })); } catch (err) { - console.error(err); + if (!isCancellationError(err)) { + console.error(err); + } + return undefined; } - return undefined; })), token); const edits = coalesce(results ?? []).flat().filter(edit => { return !context.only || context.only.contains(edit.kind); }); - return sortEditsByYieldTo(edits); + return { + edits: sortEditsByYieldTo(edits), + dispose: () => disposables.dispose() + }; } private async applyDefaultPasteHandler(dataTransfer: VSDataTransfer, metadata: CopyMetadata | undefined, token: CancellationToken, clipboardEvent: ClipboardEvent) { diff --git a/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts b/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts index 20adc65da111f..167baf7bdde8f 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts @@ -126,7 +126,7 @@ export class DropIntoEditorController extends Disposable implements IEditorContr } }); - this._dropProgressManager.showWhile(position, localize('dropIntoEditorProgress', "Running drop handlers. Click to cancel"), p); + this._dropProgressManager.showWhile(position, localize('dropIntoEditorProgress', "Running drop handlers. Click to cancel"), p, { cancel: () => p.cancel() }); this._currentOperation = p; } diff --git a/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts b/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts index db892ea676c28..61082438e6e4e 100644 --- a/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts +++ b/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { CancelablePromise, disposableTimeout } from 'vs/base/common/async'; +import { disposableTimeout } from 'vs/base/common/async'; import { Codicon } from 'vs/base/common/codicons'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { noBreakWhitespace } from 'vs/base/common/strings'; @@ -114,13 +114,13 @@ export class InlineProgressManager extends Disposable { private readonly _showPromise = this._register(new MutableDisposable()); private readonly _currentDecorations: IEditorDecorationsCollection; - private readonly _currentWidget = new MutableDisposable(); + private readonly _currentWidget = this._register(new MutableDisposable()); private _operationIdPool = 0; private _currentOperation?: number; constructor( - readonly id: string, + private readonly id: string, private readonly _editor: ICodeEditor, @IInstantiationService private readonly _instantiationService: IInstantiationService, ) { @@ -129,7 +129,12 @@ export class InlineProgressManager extends Disposable { this._currentDecorations = _editor.createDecorationsCollection(); } - public async showWhile(position: IPosition, title: string, promise: CancelablePromise): Promise { + public override dispose(): void { + super.dispose(); + this._currentDecorations.clear(); + } + + public async showWhile(position: IPosition, title: string, promise: Promise, delegate: InlineProgressDelegate): Promise { const operationId = this._operationIdPool++; this._currentOperation = operationId; @@ -143,7 +148,7 @@ export class InlineProgressManager extends Disposable { }]); if (decorationIds.length > 0) { - this._currentWidget.value = this._instantiationService.createInstance(InlineProgressWidget, this.id, this._editor, range, title, promise); + this._currentWidget.value = this._instantiationService.createInstance(InlineProgressWidget, this.id, this._editor, range, title, delegate); } }, this._showDelay); From d8abddce40aee62b166cbdc279e5c60fd9ec4fbf Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 13 Jun 2024 08:47:03 +0200 Subject: [PATCH 215/755] Building... never stops (fix #214859) (#215409) --- .../services/progress/browser/progressService.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index 87d05f2865cd4..58fe33f548fd3 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -50,9 +50,13 @@ export class ProgressService extends Disposable implements IProgressService { async withProgress(options: IProgressOptions, originalTask: (progress: IProgress) => Promise, onDidCancel?: (choice?: number) => void): Promise { const { location } = options; - const task = (progress: IProgress) => { + const task = async (progress: IProgress) => { const activeLock = this.userActivityService.markActive(); - return originalTask(progress).finally(() => activeLock.dispose()); + try { + return await originalTask(progress); + } finally { + activeLock.dispose(); + } }; const handleStringLocation = (location: string) => { From e8147f0dd3ebd77d9b063c0e5166482b027ea9f9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 13 Jun 2024 10:13:38 +0200 Subject: [PATCH 216/755] update milestones (#215416) --- .vscode/notebooks/api.github-issues | 2 +- .vscode/notebooks/my-endgame.github-issues | 2 +- .vscode/notebooks/my-work.github-issues | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues index 2ac7d69958242..957ce5a9ee059 100644 --- a/.vscode/notebooks/api.github-issues +++ b/.vscode/notebooks/api.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"May 2024\"" + "value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"June 2024\"" }, { "kind": 1, diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues index 3bf56fffce483..ce02ecfa5777e 100644 --- a/.vscode/notebooks/my-endgame.github-issues +++ b/.vscode/notebooks/my-endgame.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"May 2024\"\n\n$MINE=assignee:@me" + "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"June 2024\"\n\n$MINE=assignee:@me" }, { "kind": 1, diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues index 091c6e8a88635..ae56dcdd9f45a 100644 --- a/.vscode/notebooks/my-work.github-issues +++ b/.vscode/notebooks/my-work.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n// current milestone name\n$MILESTONE=milestone:\"May 2024\"\n" + "value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n// current milestone name\n$MILESTONE=milestone:\"June 2024\"\n" }, { "kind": 1, From f942605e16a04d87a8e70190d293f9c134827378 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 13 Jun 2024 10:46:27 +0200 Subject: [PATCH 217/755] fix https://github.com/microsoft/vscode/issues/214584 (#215413) --- src/vs/workbench/api/node/proxyResolver.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index ddeddfe8945a1..4935b3f7870c1 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -78,19 +78,15 @@ export function connectProxyResolver( function createPatchedModules(params: ProxyAgentParams, resolveProxy: ReturnType) { - function proxyAssign(module: any, patch: any) { - return new Proxy(module, { - get(target, prop) { - return prop in patch ? patch[prop] : target[prop]; - } - }); + function mergeModules(module: any, patch: any) { + return Object.assign({}, module, patch); } return { - http: proxyAssign(http, createHttpPatch(params, http, resolveProxy)), - https: proxyAssign(https, createHttpPatch(params, https, resolveProxy)), - net: proxyAssign(net, createNetPatch(params, net)), - tls: proxyAssign(tls, createTlsPatch(params, tls)) + http: mergeModules(http, createHttpPatch(params, http, resolveProxy)), + https: mergeModules(https, createHttpPatch(params, https, resolveProxy)), + net: mergeModules(net, createNetPatch(params, net)), + tls: mergeModules(tls, createTlsPatch(params, tls)) }; } From c0bbf0447e00efc6ca275d3e6a258d8fa90c0e5e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 13 Jun 2024 11:24:50 +0200 Subject: [PATCH 218/755] Cleanup and prepare inline chat for UI updates (#215420) * :lipstick: * debt - remove `trackEdits` because we have fixup debt - don't compute diff twice * allow to pass/use all chat widget options when creating an inline chat widget --- src/vs/workbench/contrib/chat/browser/chat.ts | 9 +++++ .../inlineChat/browser/inlineChatActions.ts | 2 +- .../browser/inlineChatController.ts | 16 ++------- .../inlineChat/browser/inlineChatSession.ts | 14 ++------ .../inlineChat/browser/inlineChatWidget.ts | 36 +++++-------------- .../browser/inlineChatZoneWidget.ts | 22 ++++++------ .../controller/chat/notebookChatController.ts | 18 +++++----- .../chat/browser/terminalChatWidget.ts | 12 ++++--- 8 files changed, 54 insertions(+), 75 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index 48844b393d850..c183bc78e1d40 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -107,8 +107,17 @@ export interface IChatWidgetViewOptions { filter?: (item: ChatTreeItem) => boolean; rendererOptions?: IChatListItemRendererOptions; menus?: { + /** + * The menu that is inside the input editor, use for send, dictation + */ executeToolbar?: MenuId; + /** + * The menu that next to the input editor, use for close, config etc + */ inputSideToolbar?: MenuId; + /** + * The telemetry source for all commands of this widget + */ telemetrySource?: string; }; defaultElementHeight?: number; diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index b7c33b6df158c..df40595b8c374 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -80,7 +80,7 @@ export class StartSessionAction extends EditorAction2 { let options: InlineChatRunOptions | undefined; const arg = _args[0]; - if (arg && InlineChatRunOptions.isInteractiveEditorOptions(arg)) { + if (arg && InlineChatRunOptions.isInlineChatRunOptions(arg)) { options = arg; } InlineChatController.get(editor)?.run({ ...options }); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 7b0c50ff990a1..7a61dbb905444 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -82,7 +82,7 @@ export abstract class InlineChatRunOptions { position?: IPosition; withIntentDetection?: boolean; - static isInteractiveEditorOptions(options: any): options is InlineChatRunOptions { + static isInlineChatRunOptions(options: any): options is InlineChatRunOptions { const { initialSelection, initialRange, message, autoSend, position, existingSession } = options; if ( typeof message !== 'undefined' && typeof message !== 'string' @@ -106,8 +106,6 @@ export class InlineChatController implements IEditorContribution { private _isDisposed: boolean = false; private readonly _store = new DisposableStore(); - // private readonly _input: Lazy; - // private readonly _zone: Lazy; private readonly _ui: Lazy<{ content: InlineChatContentWidget; zone: InlineChatZoneWidget }>; @@ -745,11 +743,9 @@ export class InlineChatController implements IEditorContribution { store.dispose(); - // todo@jrieken we can likely remove 'trackEdit' const diff = await this._editorWorkerService.computeDiff(this._session.textModel0.uri, this._session.textModelN.uri, { computeMoves: false, maxComputationTimeMs: Number.MAX_SAFE_INTEGER, ignoreTrimWhitespace: false }, 'advanced'); this._session.wholeRange.fixup(diff?.changes ?? []); - - await this._session.hunkData.recompute(editState); + await this._session.hunkData.recompute(editState, diff); this._ui.value.zone.widget.updateToolbar(true); this._ui.value.zone.widget.updateProgress(false); @@ -898,13 +894,6 @@ export class InlineChatController implements IEditorContribution { } else if (initialRender) { const selection = this._editor.getSelection(); widgetPosition = selection.getStartPosition(); - // TODO@jrieken we are not ready for this - // widgetPosition = selection.getEndPosition(); - // if (Range.spansMultipleLines(selection) && widgetPosition.column === 1) { - // // selection ends on "nothing" -> move up to match the - // // rendered/visible part of the selection - // widgetPosition = this._editor.getModel().validatePosition(widgetPosition.delta(-1, Number.MAX_SAFE_INTEGER)); - // } this._ui.value.content.show(widgetPosition); } else { @@ -958,7 +947,6 @@ export class InlineChatController implements IEditorContribution { }; this._inlineChatSavingService.markChanged(this._session); - this._session.wholeRange.trackEdits(editOperations); if (opts) { await this._strategy.makeProgressiveChanges(editOperations, editsObserver, opts, undoStopBefore); } else { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts index 78acedb3c2723..1ac39ac4b4053 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts @@ -33,6 +33,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { ChatModel, IChatRequestModel, IChatResponseModel, IChatTextEditGroupState } from 'vs/workbench/contrib/chat/common/chatModel'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IChatAgent } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { IDocumentDiff } from 'vs/editor/common/diff/documentDiffProvider'; export type TelemetryData = { @@ -88,15 +89,6 @@ export class SessionWholeRange { } } - trackEdits(edits: ISingleEditOperation[]): void { - const newDeco: IModelDeltaDecoration[] = []; - for (const edit of edits) { - newDeco.push({ range: edit.range, options: SessionWholeRange._options }); - } - this._decorationIds.push(...this._textModel.deltaDecorations([], newDeco)); - this._onDidChange.fire(this); - } - fixup(changes: readonly DetailedLineRangeMapping[]): void { const newDeco: IModelDeltaDecoration[] = []; @@ -555,9 +547,9 @@ export class HunkData { this._textModel0.pushEditOperations(null, edits, () => null); } - async recompute(editState: IChatTextEditGroupState) { + async recompute(editState: IChatTextEditGroupState, diff?: IDocumentDiff | null) { - const diff = await this._editorWorkerService.computeDiff(this._textModel0.uri, this._textModelN.uri, { ignoreTrimWhitespace: false, maxComputationTimeMs: Number.MAX_SAFE_INTEGER, computeMoves: false }, 'advanced'); + diff ??= await this._editorWorkerService.computeDiff(this._textModel0.uri, this._textModelN.uri, { ignoreTrimWhitespace: false, maxComputationTimeMs: Number.MAX_SAFE_INTEGER, computeMoves: false }, 'advanced'); if (!diff || diff.changes.length === 0) { // return new HunkData([], session); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index f80db1f22e482..14e6e268fc925 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -47,7 +47,7 @@ import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IHoverService } from 'vs/platform/hover/browser/hover'; -import { IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatWidgetViewOptions } from 'vs/workbench/contrib/chat/browser/chat'; export interface InlineChatWidgetViewState { @@ -57,18 +57,7 @@ export interface InlineChatWidgetViewState { } export interface IInlineChatWidgetConstructionOptions { - /** - * The telemetry source for all commands of this widget - */ - telemetrySource: string; - /** - * The menu that is inside the input editor, use for send, dictation - */ - inputMenuId: MenuId; - /** - * The menu that next to the input editor, use for close, config etc - */ - widgetMenuId: MenuId; + /** * The menu that rendered as button bar, use for accept, discard etc */ @@ -78,9 +67,10 @@ export interface IInlineChatWidgetConstructionOptions { */ feedbackMenuId?: MenuId; - editorOverflowWidgetsDomNode?: HTMLElement; - - rendererOptions?: IChatListItemRendererOptions; + /** + * The options for the chat widget + */ + chatWidgetViewOptions?: IChatWidgetViewOptions; } export interface IInlineChatMessage { @@ -170,13 +160,7 @@ export class InlineChatWidget { renderInputOnTop: true, renderFollowups: true, supportsFileReferences: true, - editorOverflowWidgetsDomNode: options.editorOverflowWidgetsDomNode, - rendererOptions: options.rendererOptions, - menus: { - executeToolbar: options.inputMenuId, - inputSideToolbar: options.widgetMenuId, - telemetrySource: options.telemetrySource - }, + // editorOverflowWidgetsDomNode: options.editorOverflowWidgetsDomNode, filter: item => { if (isWelcomeVM(item)) { return false; @@ -186,6 +170,7 @@ export class InlineChatWidget { } return true; }, + ...options.chatWidgetViewOptions }, { listForeground: editorForeground, @@ -464,9 +449,6 @@ export class InlineChatWidget { return tail(requests)?.response?.response.asString(); } - get usesDefaultChatModel(): boolean { - return this.getChatModel() === this._defaultChatModel; - } getChatModel(): IChatModel { return this._chatWidget.viewModel?.model ?? this._defaultChatModel; @@ -608,7 +590,7 @@ export class EditorBasedInlineChatWidget extends InlineChatWidget { @IChatService chatService: IChatService, @IHoverService hoverService: IHoverService, ) { - super(location, { ...options, editorOverflowWidgetsDomNode: _parentEditor.getOverflowWidgetsDomNode() }, instantiationService, contextKeyService, keybindingService, accessibilityService, configurationService, accessibleViewService, textModelResolverService, chatService, hoverService); + super(location, { ...options, chatWidgetViewOptions: { editorOverflowWidgetsDomNode: _parentEditor.getOverflowWidgetsDomNode() } }, instantiationService, contextKeyService, keybindingService, accessibilityService, configurationService, accessibleViewService, textModelResolverService, chatService, hoverService); } // --- layout diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index 88c16b8070da0..c7d2e16417712 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -16,7 +16,6 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ACTION_ACCEPT_CHANGES, ACTION_REGENERATE_RESPONSE, ACTION_TOGGLE_DIFF, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, EditMode, InlineChatConfigKeys, MENU_INLINE_CHAT_WIDGET, MENU_INLINE_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { EditorBasedInlineChatWidget } from './inlineChatWidget'; -import { MenuId } from 'vs/platform/actions/common/actions'; import { isEqual } from 'vs/base/common/resources'; import { StableEditorBottomScrollState } from 'vs/editor/browser/stableEditorScroll'; import { ScrollType } from 'vs/editor/common/editorCommon'; @@ -47,9 +46,6 @@ export class InlineChatZoneWidget extends ZoneWidget { })); this.widget = this._instaService.createInstance(EditorBasedInlineChatWidget, location, this.editor, { - telemetrySource: 'interactiveEditorWidget-toolbar', - inputMenuId: MenuId.ChatExecute, - widgetMenuId: MENU_INLINE_CHAT_WIDGET, statusMenuId: { menu: MENU_INLINE_CHAT_WIDGET_STATUS, options: { @@ -64,13 +60,19 @@ export class InlineChatZoneWidget extends ZoneWidget { } } }, - rendererOptions: { - renderTextEditsAsSummary: (uri) => { - // render edits as summary only when using Live mode and when - // dealing with the current file in the editor - return isEqual(uri, editor.getModel()?.uri) - && configurationService.getValue(InlineChatConfigKeys.Mode) === EditMode.Live; + chatWidgetViewOptions: { + menus: { + inputSideToolbar: MENU_INLINE_CHAT_WIDGET, + telemetrySource: 'interactiveEditorWidget-toolbar', }, + rendererOptions: { + renderTextEditsAsSummary: (uri) => { + // render edits as summary only when using Live mode and when + // dealing with the current file in the editor + return isEqual(uri, editor.getModel()?.uri) + && configurationService.getValue(InlineChatConfigKeys.Mode) === EditMode.Live; + }, + } } }); this._disposables.add(this.widget.onDidChangeHeight(() => { diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts index 4662ab11501b1..a8441f86c2d36 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts @@ -26,7 +26,6 @@ import { ICursorStateComputer, ITextModel } from 'vs/editor/common/model'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { IModelService } from 'vs/editor/common/services/model'; import { localize } from 'vs/nls'; -import { MenuId } from 'vs/platform/actions/common/actions'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; @@ -415,14 +414,17 @@ export class NotebookChatController extends Disposable implements INotebookEdito InlineChatWidget, ChatAgentLocation.Notebook, { - telemetrySource: 'notebook-generate-cell', - inputMenuId: MenuId.ChatExecute, - widgetMenuId: MENU_INLINE_CHAT_WIDGET, statusMenuId: MENU_CELL_CHAT_WIDGET_STATUS, - rendererOptions: { - renderTextEditsAsSummary: (uri) => { - return isEqual(uri, this._widget?.parentEditor.getModel()?.uri) - || isEqual(uri, this._notebookEditor.textModel?.uri); + chatWidgetViewOptions: { + rendererOptions: { + renderTextEditsAsSummary: (uri) => { + return isEqual(uri, this._widget?.parentEditor.getModel()?.uri) + || isEqual(uri, this._notebookEditor.textModel?.uri); + } + }, + menus: { + telemetrySource: 'notebook-generate-cell', + inputSideToolbar: MENU_INLINE_CHAT_WIDGET, } } } diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index b27463b823264..bfeed279ee2c3 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -58,8 +58,6 @@ export class TerminalChatWidget extends Disposable { InlineChatWidget, ChatAgentLocation.Terminal, { - inputMenuId: MENU_TERMINAL_CHAT_INPUT, - widgetMenuId: MENU_TERMINAL_CHAT_WIDGET, statusMenuId: { menu: MENU_TERMINAL_CHAT_WIDGET_STATUS, options: { @@ -72,8 +70,14 @@ export class TerminalChatWidget extends Disposable { } } }, - telemetrySource: 'terminal-inline-chat', - rendererOptions: { editableCodeBlock: true } + chatWidgetViewOptions: { + rendererOptions: { editableCodeBlock: true }, + menus: { + telemetrySource: 'terminal-inline-chat', + executeToolbar: MENU_TERMINAL_CHAT_INPUT, + inputSideToolbar: MENU_TERMINAL_CHAT_WIDGET, + } + } } ); this._register(Event.any( From bf27d9ae748924a56dc697ce26e30e5ca2451346 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 13 Jun 2024 06:51:16 -0700 Subject: [PATCH 219/755] Clarify TerminalShellExecutionEndEvent.exitCode Part of #145234 --- .../vscode.proposed.terminalShellIntegration.d.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts index 5876b29643b01..cdff579c2fb45 100644 --- a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts +++ b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts @@ -284,8 +284,12 @@ declare module 'vscode' { readonly execution: TerminalShellExecution; /** - * The exit code reported by the shell. `undefined` means the shell did not report an exit - * code or the shell reported a command started before the command finished. + * The exit code reported by the shell. + * + * Note that `undefined` means the shell either did not report an exit code (ie. the shell + * integration script is misbehaving) or the shell reported a command started before the command + * finished (eg. a sub-shell was opened). Generally this should not happen, depending on the use + * case, it may be best to treat this as a failure. * * @example * const execution = shellIntegration.executeCommand({ From e857686fa8a7fee6e5f2fa6dde5507f3f2645642 Mon Sep 17 00:00:00 2001 From: Anees Date: Thu, 13 Jun 2024 11:48:22 +0000 Subject: [PATCH 220/755] Use node 20 in dev container --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 31d67db5fac9f..bc30d7dbe3b7b 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/devcontainers/typescript-node:18-bookworm +FROM mcr.microsoft.com/devcontainers/typescript-node:20-bookworm ADD install-vscode.sh /root/ RUN /root/install-vscode.sh From 0b12fe1e0f82c9c8ec68368dd6bd8097ea8309a7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 13 Jun 2024 07:00:52 -0700 Subject: [PATCH 221/755] Fix space prefix before asterisk in .d.ts --- src/vscode-dts/vscode.d.ts | 44 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/vscode-dts/vscode.d.ts b/src/vscode-dts/vscode.d.ts index 50e8060b8ee18..a0e3675afba4a 100644 --- a/src/vscode-dts/vscode.d.ts +++ b/src/vscode-dts/vscode.d.ts @@ -535,7 +535,7 @@ declare module 'vscode' { /** * Represents sources that can cause {@link window.onDidChangeTextEditorSelection selection change events}. - */ + */ export enum TextEditorSelectionChangeKind { /** * Selection changed due to typing in the editor. @@ -5186,7 +5186,7 @@ declare module 'vscode' { /** * Creates a new list of inline completion items. - */ + */ constructor(items: InlineCompletionItem[]); } @@ -6365,7 +6365,7 @@ declare module 'vscode' { export enum ConfigurationTarget { /** * Global configuration - */ + */ Global = 1, /** @@ -11116,8 +11116,8 @@ declare module 'vscode' { canSelectMany?: boolean; /** - * An optional interface to implement drag and drop in the tree view. - */ + * An optional interface to implement drag and drop in the tree view. + */ dragAndDropController?: TreeDragAndDropController; /** @@ -11378,8 +11378,8 @@ declare module 'vscode' { */ export interface TreeCheckboxChangeEvent { /** - * The items that were checked or unchecked. - */ + * The items that were checked or unchecked. + */ readonly items: ReadonlyArray<[T, TreeItemCheckboxState]>; } @@ -11419,8 +11419,8 @@ declare module 'vscode' { readonly onDidChangeVisibility: Event; /** - * An event to signal that an element or root has either been checked or unchecked. - */ + * An event to signal that an element or root has either been checked or unchecked. + */ readonly onDidChangeCheckboxState: Event>; /** @@ -11697,8 +11697,8 @@ declare module 'vscode' { } /** - * Checkbox state of the tree item - */ + * Checkbox state of the tree item + */ export enum TreeItemCheckboxState { /** * Determines an item is unchecked @@ -11787,8 +11787,8 @@ declare module 'vscode' { color?: ThemeColor; /** - * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. - */ + * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. + */ location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; /** @@ -12668,7 +12668,7 @@ declare module 'vscode' { /** * The reason why the document was changed. * Is `undefined` if the reason is not known. - */ + */ readonly reason: TextDocumentChangeReason | undefined; } @@ -15374,7 +15374,7 @@ declare module 'vscode' { * * @param rendererId The renderer ID to communicate with * @returns A new notebook renderer messaging object. - */ + */ export function createRendererMessaging(rendererId: string): NotebookRendererMessaging; } @@ -16369,7 +16369,7 @@ declare module 'vscode' { /** * Add breakpoints. * @param breakpoints The breakpoints to add. - */ + */ export function addBreakpoints(breakpoints: readonly Breakpoint[]): void; /** @@ -16907,17 +16907,17 @@ declare module 'vscode' { /** * Whether it is possible to be signed into multiple accounts at once with this provider. * If not specified, will default to false. - */ + */ readonly supportsMultipleAccounts?: boolean; } /** - * An {@link Event} which fires when an {@link AuthenticationSession} is added, removed, or changed. - */ + * An {@link Event} which fires when an {@link AuthenticationSession} is added, removed, or changed. + */ export interface AuthenticationProviderAuthenticationSessionsChangeEvent { /** * The {@link AuthenticationSession AuthenticationSessions} of the {@link AuthenticationProvider} that have been added. - */ + */ readonly added: readonly AuthenticationSession[] | undefined; /** @@ -17144,7 +17144,7 @@ declare module 'vscode' { * @param id Identifier for the controller, must be globally unique. * @param label A human-readable label for the controller. * @returns An instance of the {@link TestController}. - */ + */ export function createTestController(id: string, label: string): TestController; } @@ -18995,7 +18995,7 @@ declare module 'vscode' { * Represents a language model response. * * @see {@link LanguageModelAccess.chatRequest} - */ + */ export interface LanguageModelChatResponse { /** From c79817de5f9c7eeba09ea6bb9b881562c8008ece Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 13 Jun 2024 17:44:56 +0200 Subject: [PATCH 222/755] fix #214424 (#215327) * fix #214424 --- .../contrib/debug/browser/debugService.ts | 4 +- .../browser/extensionsWorkbenchService.ts | 46 +++++++++++++++++-- .../contrib/extensions/common/extensions.ts | 1 + .../common/abstractExtensionService.ts | 26 ++++++----- .../services/extensions/common/extensions.ts | 4 +- 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index c2ae65ed53939..8c52537a0ae04 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -204,8 +204,8 @@ export class DebugService implements IDebugService { this.disposables.add(extensionService.onWillStop(evt => { evt.veto( - this.stopSession(undefined).then(() => false), - nls.localize('stoppingDebug', 'Stopping debug sessions...'), + this.model.getSessions().length > 0, + nls.localize('active debug session', 'A debug session is still running.'), ); })); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index ebdcba98e4c61..9f0452a6f118c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -9,7 +9,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { firstOrDefault, index } from 'vs/base/common/arrays'; import { CancelablePromise, Promises, ThrottledDelayer, createCancelablePromise } from 'vs/base/common/async'; import { CancellationError, isCancellationError } from 'vs/base/common/errors'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IPager, singlePagePager } from 'vs/base/common/paging'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { @@ -18,13 +18,13 @@ import { IExtensionsControlManifest, IExtensionInfo, IExtensionQueryOptions, IDeprecationInfo, isTargetPlatformCompatible, InstallExtensionInfo, EXTENSION_IDENTIFIER_REGEX, InstallOptions, IProductVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, DefaultIconPath, IResourceExtension } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, DefaultIconPath, IResourceExtension, extensionsConfigurationNodeBase } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions, groupByExtension, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { URI } from 'vs/base/common/uri'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, AutoUpdateConfigurationKey, AutoCheckUpdatesConfigurationKey, HasOutdatedExtensionsContext, AutoUpdateConfigurationValue, InstallExtensionOptions, ExtensionRuntimeState, ExtensionRuntimeActionType } from 'vs/workbench/contrib/extensions/common/extensions'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, AutoUpdateConfigurationKey, AutoCheckUpdatesConfigurationKey, HasOutdatedExtensionsContext, AutoUpdateConfigurationValue, InstallExtensionOptions, ExtensionRuntimeState, ExtensionRuntimeActionType, AutoRestartConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/common/url'; import { ExtensionsInput, IExtensionEditorOptions } from 'vs/workbench/contrib/extensions/common/extensionsInput'; @@ -58,6 +58,8 @@ import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator' import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ShowCurrentReleaseNotesActionId } from 'vs/workbench/contrib/update/common/update'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; interface IExtensionStateProvider { (extension: Extension): T; @@ -949,10 +951,25 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension })); urlService.registerHandler(this); + this.registerConfigurations(); this.whenInitialized = this.initialize(); } + private registerConfigurations(): void { + Registry.as(ConfigurationExtensions.Configuration) + .registerConfiguration({ + ...extensionsConfigurationNodeBase, + properties: { + [AutoRestartConfigurationKey]: { + type: 'boolean', + description: nls.localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus."), + default: this.productService.quality !== 'stable', + } + } + }); + } + private async initialize(): Promise { // initialize local extensions await Promise.all([this.queryLocal(), this.extensionService.whenInstalledExtensionsRegistered()]); @@ -1012,6 +1029,25 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this.autoUpdateBuiltinExtensions(); } } + + this.registerAutoRestartListener(); + this._register(this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(AutoRestartConfigurationKey)) { + this.registerAutoRestartListener(); + } + })); + } + + private readonly autoRestartListenerDisposable = this._register(new MutableDisposable()); + private registerAutoRestartListener(): void { + this.autoRestartListenerDisposable.value = undefined; + if (this.configurationService.getValue(AutoRestartConfigurationKey) === true) { + this.autoRestartListenerDisposable.value = this.hostService.onDidChangeFocus(focus => { + if (!focus && this.configurationService.getValue(AutoRestartConfigurationKey) === true) { + this.updateRunningExtensions(true); + } + }); + } } private reportInstalledExtensionsTelemetry() { @@ -1263,7 +1299,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return undefined; } - async updateRunningExtensions(): Promise { + async updateRunningExtensions(auto?: boolean): Promise { const toAdd: ILocalExtension[] = []; const toRemove: string[] = []; @@ -1304,7 +1340,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } if (toAdd.length || toRemove.length) { - if (await this.extensionService.stopExtensionHosts(nls.localize('restart', "Enable or Disable extensions"))) { + if (await this.extensionService.stopExtensionHosts(nls.localize('restart', "Enable or Disable extensions"), auto)) { await this.extensionService.startExtensionHosts({ toAdd, toRemove }); } } diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index 179624e281b9c..bba7f85135059 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -163,6 +163,7 @@ export const ConfigurationKey = 'extensions'; export const AutoUpdateConfigurationKey = 'extensions.autoUpdate'; export const AutoCheckUpdatesConfigurationKey = 'extensions.autoCheckUpdates'; export const CloseExtensionDetailsOnViewChangeKey = 'extensions.closeExtensionDetailsOnViewChange'; +export const AutoRestartConfigurationKey = 'extensions.autoRestart'; export type AutoUpdateConfigurationValue = boolean | 'onlyEnabledExtensions' | 'onlySelectedExtensions'; diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index f3a62aa35dc96..731a48bf5b0de 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -653,8 +653,8 @@ export abstract class AbstractExtensionService extends Disposable implements IEx //#region Stopping / Starting / Restarting - public stopExtensionHosts(reason: string): Promise { - return this._doStopExtensionHostsWithVeto(reason); + public stopExtensionHosts(reason: string, auto?: boolean): Promise { + return this._doStopExtensionHostsWithVeto(reason, auto); } protected _doStopExtensionHosts(): void { @@ -675,7 +675,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } - private async _doStopExtensionHostsWithVeto(reason: string): Promise { + private async _doStopExtensionHostsWithVeto(reason: string, auto?: boolean): Promise { const vetos: (boolean | Promise)[] = []; const vetoReasons = new Set(); @@ -704,16 +704,18 @@ export abstract class AbstractExtensionService extends Disposable implements IEx if (!veto) { this._doStopExtensionHosts(); } else { - const vetoReasonsArray = Array.from(vetoReasons); - - this._logService.warn(`Extension host was not stopped because of veto (stop reason: ${reason}, veto reason: ${vetoReasonsArray.join(', ')})`); + if (!auto) { + const vetoReasonsArray = Array.from(vetoReasons); + + this._logService.warn(`Extension host was not stopped because of veto (stop reason: ${reason}, veto reason: ${vetoReasonsArray.join(', ')})`); + await this._dialogService.warn( + nls.localize('extensionStopVetoMessage', "The following operation was blocked: {0}", reason), + vetoReasonsArray.length === 1 ? + nls.localize('extensionStopVetoDetailsOne', "The reason for blocking the operation: {0}", vetoReasonsArray[0]) : + nls.localize('extensionStopVetoDetailsMany', "The reasons for blocking the operation:\n- {0}", vetoReasonsArray.join('\n -')), + ); + } - await this._dialogService.warn( - nls.localize('extensionStopVetoMessage', "The following operation was blocked: {0}", reason), - vetoReasonsArray.length === 1 ? - nls.localize('extensionStopVetoDetailsOne', "The reason for blocking the operation: {0}", vetoReasonsArray[0]) : - nls.localize('extensionStopVetoDetailsMany', "The reasons for blocking the operation:\n- {0}", vetoReasonsArray.join('\n -')), - ); } return !veto; diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index f04ac45227506..4bd3fea7dfd9b 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -513,10 +513,12 @@ export interface IExtensionService { * @param reason a human readable reason for stopping the extension hosts. This maybe * can be presented to the user when showing dialogs. * + * @param auto indicates if the operation was triggered by an automatic action + * * @returns a promise that resolves to `true` if the extension hosts were stopped, `false` * if the operation was vetoed by listeners of the `onWillStop` event. */ - stopExtensionHosts(reason: string): Promise; + stopExtensionHosts(reason: string, auto?: boolean): Promise; /** * Starts the extension hosts. If updates are provided, the extension hosts are started with the given updates. From fc7e37383a2a08c8a1fb06347d3c277ea69a57e6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 13 Jun 2024 17:51:59 +0200 Subject: [PATCH 223/755] fix #215447 (#215448) * fix #215447 * fix tests --- .../extensions/browser/extensionEditor.ts | 26 ++- .../extensions/browser/extensionsActions.ts | 198 +++++++++++------- .../extensions/browser/extensionsList.ts | 19 +- .../browser/media/extensionActions.css | 9 +- .../extensionsActions.test.ts | 38 ++-- 5 files changed, 185 insertions(+), 105 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 38a17acbbf005..c456dfa178b01 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -49,11 +49,11 @@ import { IEditorOpenContext } from 'vs/workbench/common/editor'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { ExtensionFeaturesTab } from 'vs/workbench/contrib/extensions/browser/extensionFeaturesTab'; import { - ActionWithDropDownAction, + ButtonWithDropDownExtensionAction, ClearLanguageAction, DisableDropDownAction, EnableDropDownAction, - ExtensionActionWithDropdownActionViewItem, ExtensionDropDownAction, + ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, ExtensionEditorManageExtensionAction, ExtensionStatusAction, ExtensionStatusLabelAction, @@ -71,7 +71,8 @@ import { UninstallAction, UpdateAction, WebInstallAction, - TogglePreReleaseExtensionAction + TogglePreReleaseExtensionAction, + ExtensionAction, } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { Delegate } from 'vs/workbench/contrib/extensions/browser/extensionsList'; import { ExtensionData, ExtensionsGridView, ExtensionsTree, getExtensions } from 'vs/workbench/contrib/extensions/browser/extensionsViewer'; @@ -333,7 +334,7 @@ export class ExtensionEditor extends EditorPane { const actions = [ this.instantiationService.createInstance(ExtensionRuntimeStateAction), this.instantiationService.createInstance(ExtensionStatusLabelAction), - this.instantiationService.createInstance(ActionWithDropDownAction, 'extensions.updateActions', '', + this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.updateActions', ExtensionAction.PROMINENT_LABEL_ACTION_CLASS, [[this.instantiationService.createInstance(UpdateAction, true)], [this.instantiationService.createInstance(ToggleAutoUpdateForExtensionAction, true, [true, 'onlyEnabledExtensions'])]]), this.instantiationService.createInstance(SetColorThemeAction), this.instantiationService.createInstance(SetFileIconThemeAction), @@ -348,7 +349,7 @@ export class ExtensionEditor extends EditorPane { this.instantiationService.createInstance(WebInstallAction), installAction, this.instantiationService.createInstance(InstallingLabelAction), - this.instantiationService.createInstance(ActionWithDropDownAction, 'extensions.uninstall', UninstallAction.UninstallLabel, [ + this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.uninstall', ExtensionAction.LABEL_ACTION_CLASS, [ [ this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, false), this.instantiationService.createInstance(UninstallAction), @@ -363,11 +364,20 @@ export class ExtensionEditor extends EditorPane { const actionsAndStatusContainer = append(details, $('.actions-status-container')); const extensionActionBar = this._register(new ActionBar(actionsAndStatusContainer, { actionViewItemProvider: (action: IAction, options) => { - if (action instanceof ExtensionDropDownAction) { + if (action instanceof DropDownExtensionAction) { return action.createActionViewItem(options); } - if (action instanceof ActionWithDropDownAction) { - return new ExtensionActionWithDropdownActionViewItem(action, { ...options, icon: true, label: true, menuActionsOrProvider: { getActions: () => action.menuActions }, menuActionClassNames: (action.class || '').split(' ') }, this.contextMenuService); + if (action instanceof ButtonWithDropDownExtensionAction) { + return new ButtonWithDropdownExtensionActionViewItem( + action, + { + ...options, + icon: true, + label: true, + menuActionsOrProvider: { getActions: () => action.menuActions }, + menuActionClassNames: action.menuActionClassNames + }, + this.contextMenuService); } if (action instanceof ToggleAutoUpdateForExtensionAction) { return new CheckboxActionViewItem(undefined, action, { ...options, icon: true, label: true, checkboxStyles: defaultCheckboxStyles }); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index fc174208ee612..cace69aee5b26 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/extensionActions'; import { localize, localize2 } from 'vs/nls'; -import { IAction, Action, Separator, SubmenuAction } from 'vs/base/common/actions'; +import { IAction, Action, Separator, SubmenuAction, IActionChangeEvent } from 'vs/base/common/actions'; import { Delayer, Promises, Throttler } from 'vs/base/common/async'; import * as DOM from 'vs/base/browser/dom'; import { Emitter, Event } from 'vs/base/common/event'; @@ -52,7 +52,6 @@ import { IActionViewItemOptions, ActionViewItem } from 'vs/base/browser/ui/actio import { EXTENSIONS_CONFIG, IExtensionsConfigContent } from 'vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig'; import { getErrorMessage, isCancellationError } from 'vs/base/common/errors'; import { IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; -import { ActionWithDropdownActionViewItem, IActionWithDropdownActionViewItemOptions } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem'; import { IContextMenuProvider } from 'vs/base/browser/contextmenu'; import { ILogService } from 'vs/platform/log/common/log'; import { errorIcon, infoIcon, manageExtensionIcon, syncEnabledIcon, syncIgnoredIcon, trustIcon, warningIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; @@ -73,6 +72,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Extensions, IExtensionFeaturesManagementService, IExtensionFeaturesRegistry } from 'vs/workbench/services/extensionManagement/common/extensionFeatures'; import { Registry } from 'vs/platform/registry/common/platform'; import { IUpdateService } from 'vs/platform/update/common/update'; +import { ActionWithDropdownActionViewItem, IActionWithDropdownActionViewItemOptions } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem'; export class PromptExtensionInstallFailureAction extends Action { @@ -216,21 +216,52 @@ export class PromptExtensionInstallFailureAction extends Action { } +export interface IExtensionActionChangeEvent extends IActionChangeEvent { + readonly hidden?: boolean; + readonly menuActions?: IAction[]; +} + export abstract class ExtensionAction extends Action implements IExtensionContainer { + + protected override _onDidChange = this._register(new Emitter()); + override readonly onDidChange = this._onDidChange.event; + static readonly EXTENSION_ACTION_CLASS = 'extension-action'; static readonly TEXT_ACTION_CLASS = `${ExtensionAction.EXTENSION_ACTION_CLASS} text`; static readonly LABEL_ACTION_CLASS = `${ExtensionAction.EXTENSION_ACTION_CLASS} label`; + static readonly PROMINENT_LABEL_ACTION_CLASS = `${ExtensionAction.LABEL_ACTION_CLASS} prominent`; static readonly ICON_ACTION_CLASS = `${ExtensionAction.EXTENSION_ACTION_CLASS} icon`; + private _extension: IExtension | null = null; get extension(): IExtension | null { return this._extension; } set extension(extension: IExtension | null) { this._extension = extension; this.update(); } + + private _hidden: boolean = false; + get hidden(): boolean { return this._hidden; } + set hidden(hidden: boolean) { + if (this._hidden !== hidden) { + this._hidden = hidden; + this._onDidChange.fire({ hidden }); + } + } + + protected override _setEnabled(value: boolean): void { + super._setEnabled(value); + if (this.hideOnDisabled) { + this.hidden = !value; + } + } + + protected hideOnDisabled: boolean = true; + abstract update(): void; } -export class ActionWithDropDownAction extends ExtensionAction { +export class ButtonWithDropDownExtensionAction extends ExtensionAction { - private action: IAction | undefined; + private primaryAction: IAction | undefined; + readonly menuActionClassNames: string[] = []; private _menuActions: IAction[] = []; get menuActions(): IAction[] { return [...this._menuActions]; } @@ -246,10 +277,14 @@ export class ActionWithDropDownAction extends ExtensionAction { protected readonly extensionActions: ExtensionAction[]; constructor( - id: string, label: string, + id: string, + clazz: string, private readonly actionsGroups: ExtensionAction[][], ) { - super(id, label); + clazz = `${clazz} action-dropdown`; + super(id, undefined, clazz); + this.menuActionClassNames = clazz.split(' '); + this.hideOnDisabled = false; this.extensionActions = actionsGroups.flat(); this.update(); this._register(Event.any(...this.extensionActions.map(a => a.onDidChange))(() => this.update(true))); @@ -261,36 +296,35 @@ export class ActionWithDropDownAction extends ExtensionAction { this.extensionActions.forEach(a => a.update()); } - const enabledActionsGroups = this.actionsGroups.map(actionsGroup => actionsGroup.filter(a => a.enabled)); + const actionsGroups = this.actionsGroups.map(actionsGroup => actionsGroup.filter(a => !a.hidden)); let actions: IAction[] = []; - for (const enabledActions of enabledActionsGroups) { - if (enabledActions.length) { - actions = [...actions, ...enabledActions, new Separator()]; + for (const visibleActions of actionsGroups) { + if (visibleActions.length) { + actions = [...actions, ...visibleActions, new Separator()]; } } actions = actions.length ? actions.slice(0, actions.length - 1) : actions; - this.action = actions[0]; + this.primaryAction = actions[0]; this._menuActions = actions.length > 1 ? actions : []; + this._onDidChange.fire({ menuActions: this._menuActions }); - this.enabled = !!this.action; - if (this.action) { - this.label = this.getLabel(this.action as ExtensionAction); - this.tooltip = this.action.tooltip; - } - - let clazz = (this.action || this.extensionActions[0])?.class || ''; - clazz = clazz ? `${clazz} action-dropdown` : 'action-dropdown'; - if (this._menuActions.length === 0) { - clazz += ' action-dropdown'; + if (this.primaryAction) { + this.hidden = false; + this.enabled = this.primaryAction.enabled; + this.label = this.getLabel(this.primaryAction as ExtensionAction); + this.tooltip = this.primaryAction.tooltip; + } else { + this.hidden = true; + this.enabled = false; } - this.class = clazz; } - override run(): Promise { - const enabledActions = this.extensionActions.filter(a => a.enabled); - return enabledActions[0].run(); + override async run(): Promise { + if (this.enabled) { + await this.primaryAction?.run(); + } } protected getLabel(action: ExtensionAction): string { @@ -298,9 +332,42 @@ export class ActionWithDropDownAction extends ExtensionAction { } } +export class ButtonWithDropdownExtensionActionViewItem extends ActionWithDropdownActionViewItem { + + constructor( + action: ButtonWithDropDownExtensionAction, + options: IActionViewItemOptions & IActionWithDropdownActionViewItemOptions, + contextMenuProvider: IContextMenuProvider + ) { + super(null, action, options, contextMenuProvider); + this._register(action.onDidChange(e => { + if (e.hidden !== undefined || e.menuActions !== undefined) { + this.updateClass(); + } + })); + } + + override render(container: HTMLElement): void { + super.render(container); + this.updateClass(); + } + + protected override updateClass(): void { + super.updateClass(); + if (this.element && this.dropdownMenuActionViewItem?.element) { + this.element.classList.toggle('hide', (this._action).hidden); + const isMenuEmpty = (this._action).menuActions.length === 0; + this.element.classList.toggle('empty', isMenuEmpty); + this.dropdownMenuActionViewItem.element.classList.toggle('hide', isMenuEmpty); + } + } + +} + export class InstallAction extends ExtensionAction { - static readonly Class = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`; + private static readonly CLASS = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`; + private static readonly HIDE = `${InstallAction.CLASS} hide`; protected _manifest: IExtensionManifest | null = null; set manifest(manifest: IExtensionManifest | null) { @@ -323,7 +390,8 @@ export class InstallAction extends ExtensionAction { @ITelemetryService private readonly telemetryService: ITelemetryService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, ) { - super('extensions.install', localize('install', "Install"), InstallAction.Class, false); + super('extensions.install', localize('install', "Install"), InstallAction.CLASS, false); + this.hideOnDisabled = false; this.options = { ...options, isMachineScoped: false }; this.update(); this._register(this.labelService.onDidChangeFormatters(() => this.updateLabel(), this)); @@ -335,6 +403,8 @@ export class InstallAction extends ExtensionAction { protected async computeAndUpdateEnablement(): Promise { this.enabled = false; + this.class = InstallAction.HIDE; + this.hidden = true; if (!this.extension) { return; } @@ -344,8 +414,19 @@ export class InstallAction extends ExtensionAction { if (this.extensionsWorkbenchService.canSetLanguage(this.extension)) { return; } - if (this.extension.state === ExtensionState.Uninstalled && await this.extensionsWorkbenchService.canInstall(this.extension)) { - this.enabled = this.options.installPreReleaseVersion ? this.extension.hasPreReleaseVersion : this.extension.hasReleaseVersion; + if (this.extension.state !== ExtensionState.Uninstalled) { + return; + } + if (this.options.installPreReleaseVersion && !this.extension.hasPreReleaseVersion) { + return; + } + if (!this.options.installPreReleaseVersion && !this.extension.hasReleaseVersion) { + return; + } + this.hidden = false; + this.class = InstallAction.CLASS; + if (await this.extensionsWorkbenchService.canInstall(this.extension)) { + this.enabled = true; this.updateLabel(); } } @@ -518,7 +599,7 @@ export class InstallAction extends ExtensionAction { } -export class InstallDropdownAction extends ActionWithDropDownAction { +export class InstallDropdownAction extends ButtonWithDropDownExtensionAction { set manifest(manifest: IExtensionManifest | null) { this.extensionActions.forEach(a => (a).manifest = manifest); @@ -529,7 +610,7 @@ export class InstallDropdownAction extends ActionWithDropDownAction { @IInstantiationService instantiationService: IInstantiationService, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, ) { - super(`extensions.installActions`, '', [ + super(`extensions.installActions`, ExtensionAction.PROMINENT_LABEL_ACTION_CLASS, [ [ instantiationService.createInstance(InstallAction, { installPreReleaseVersion: extensionsWorkbenchService.preferPreReleases }), instantiationService.createInstance(InstallAction, { installPreReleaseVersion: !extensionsWorkbenchService.preferPreReleases }), @@ -562,8 +643,8 @@ export abstract class InstallInOtherServerAction extends ExtensionAction { protected static readonly INSTALL_LABEL = localize('install', "Install"); protected static readonly INSTALLING_LABEL = localize('installing', "Installing"); - private static readonly Class = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`; - private static readonly InstallingClass = `${ExtensionAction.LABEL_ACTION_CLASS} install installing`; + private static readonly Class = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install-other-server`; + private static readonly InstallingClass = `${ExtensionAction.LABEL_ACTION_CLASS} install-other-server installing`; updateWhenCounterExtensionChanges: boolean = true; @@ -987,32 +1068,7 @@ export class MigrateDeprecatedExtensionAction extends ExtensionAction { } } -export class ExtensionActionWithDropdownActionViewItem extends ActionWithDropdownActionViewItem { - - constructor( - action: ActionWithDropDownAction, - options: IActionViewItemOptions & IActionWithDropdownActionViewItemOptions, - contextMenuProvider: IContextMenuProvider - ) { - super(null, action, options, contextMenuProvider); - } - - override render(container: HTMLElement): void { - super.render(container); - this.updateClass(); - } - - protected override updateClass(): void { - super.updateClass(); - if (this.element && this.dropdownMenuActionViewItem && this.dropdownMenuActionViewItem.element) { - this.element.classList.toggle('empty', (this._action).menuActions.length === 0); - this.dropdownMenuActionViewItem.element.classList.toggle('hide', (this._action).menuActions.length === 0); - } - } - -} - -export abstract class ExtensionDropDownAction extends ExtensionAction { +export abstract class DropDownExtensionAction extends ExtensionAction { constructor( id: string, @@ -1024,9 +1080,9 @@ export abstract class ExtensionDropDownAction extends ExtensionAction { super(id, label, cssClass, enabled); } - private _actionViewItem: DropDownMenuActionViewItem | null = null; - createActionViewItem(options: IActionViewItemOptions): DropDownMenuActionViewItem { - this._actionViewItem = this.instantiationService.createInstance(DropDownMenuActionViewItem, this, options); + private _actionViewItem: DropDownExtensionActionViewItem | null = null; + createActionViewItem(options: IActionViewItemOptions): DropDownExtensionActionViewItem { + this._actionViewItem = this.instantiationService.createInstance(DropDownExtensionActionViewItem, this, options); return this._actionViewItem; } @@ -1036,10 +1092,10 @@ export abstract class ExtensionDropDownAction extends ExtensionAction { } } -export class DropDownMenuActionViewItem extends ActionViewItem { +export class DropDownExtensionActionViewItem extends ActionViewItem { constructor( - action: ExtensionDropDownAction, + action: DropDownExtensionAction, options: IActionViewItemOptions, @IContextMenuService private readonly contextMenuService: IContextMenuService ) { @@ -1137,7 +1193,7 @@ export async function getContextMenuActions(extension: IExtension | undefined | return toActions(actionsGroups, instantiationService); } -export class ManageExtensionAction extends ExtensionDropDownAction { +export class ManageExtensionAction extends DropDownExtensionAction { static readonly ID = 'extensions.manage'; @@ -1221,7 +1277,7 @@ export class ManageExtensionAction extends ExtensionDropDownAction { } } -export class ExtensionEditorManageExtensionAction extends ExtensionDropDownAction { +export class ExtensionEditorManageExtensionAction extends DropDownExtensionAction { constructor( private readonly contextKeyService: IContextKeyService, @@ -1540,12 +1596,12 @@ export class DisableGloballyAction extends ExtensionAction { } } -export class EnableDropDownAction extends ActionWithDropDownAction { +export class EnableDropDownAction extends ButtonWithDropDownExtensionAction { constructor( @IInstantiationService instantiationService: IInstantiationService ) { - super('extensions.enable', localize('enableAction', "Enable"), [ + super('extensions.enable', ExtensionAction.LABEL_ACTION_CLASS, [ [ instantiationService.createInstance(EnableGloballyAction), instantiationService.createInstance(EnableForWorkspaceAction) @@ -1554,12 +1610,12 @@ export class EnableDropDownAction extends ActionWithDropDownAction { } } -export class DisableDropDownAction extends ActionWithDropDownAction { +export class DisableDropDownAction extends ButtonWithDropDownExtensionAction { constructor( @IInstantiationService instantiationService: IInstantiationService ) { - super('extensions.disable', localize('disableAction', "Disable"), [[ + super('extensions.disable', ExtensionAction.LABEL_ACTION_CLASS, [[ instantiationService.createInstance(DisableGloballyAction), instantiationService.createInstance(DisableForWorkspaceAction) ]]); @@ -2284,7 +2340,7 @@ export class ExtensionStatusLabelAction extends Action implements IExtensionCont } -export class ToggleSyncExtensionAction extends ExtensionDropDownAction { +export class ToggleSyncExtensionAction extends DropDownExtensionAction { private static readonly IGNORED_SYNC_CLASS = `${ExtensionAction.ICON_ACTION_CLASS} extension-sync ${ThemeIcon.asClassName(syncIgnoredIcon)}`; private static readonly SYNC_CLASS = `${ToggleSyncExtensionAction.ICON_ACTION_CLASS} extension-sync ${ThemeIcon.asClassName(syncEnabledIcon)}`; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 683098f05b6e6..4b7ce4a794756 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -13,7 +13,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; -import { ManageExtensionAction, ExtensionRuntimeStateAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ActionWithDropDownAction, InstallDropdownAction, InstallingLabelAction, ExtensionActionWithDropdownActionViewItem, ExtensionDropDownAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction, ToggleAutoUpdateForExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { ManageExtensionAction, ExtensionRuntimeStateAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ButtonWithDropDownExtensionAction, InstallDropdownAction, InstallingLabelAction, ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction, ToggleAutoUpdateForExtensionAction, ExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, ExtensionPackCountWidget as ExtensionPackBadgeWidget, SyncIgnoredWidget, ExtensionHoverWidget, ExtensionActivationStatusWidget, PreReleaseBookmarkWidget, extensionVerifiedPublisherIconColor, VerifiedPublisherWidget } from 'vs/workbench/contrib/extensions/browser/extensionsWidgets'; import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; @@ -100,10 +100,19 @@ export class Renderer implements IPagedRenderer { const publisherDisplayName = append(publisher, $('.publisher-name.ellipsis')); const actionbar = new ActionBar(footer, { actionViewItemProvider: (action: IAction, options: IActionViewItemOptions) => { - if (action instanceof ActionWithDropDownAction) { - return new ExtensionActionWithDropdownActionViewItem(action, { ...options, icon: true, label: true, menuActionsOrProvider: { getActions: () => action.menuActions }, menuActionClassNames: (action.class || '').split(' ') }, this.contextMenuService); + if (action instanceof ButtonWithDropDownExtensionAction) { + return new ButtonWithDropdownExtensionActionViewItem( + action, + { + ...options, + icon: true, + label: true, + menuActionsOrProvider: { getActions: () => action.menuActions }, + menuActionClassNames: action.menuActionClassNames + }, + this.contextMenuService); } - if (action instanceof ExtensionDropDownAction) { + if (action instanceof DropDownExtensionAction) { return action.createActionViewItem(options); } return undefined; @@ -118,7 +127,7 @@ export class Renderer implements IPagedRenderer { this.instantiationService.createInstance(ExtensionStatusLabelAction), this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, true), this.instantiationService.createInstance(ExtensionRuntimeStateAction), - this.instantiationService.createInstance(ActionWithDropDownAction, 'extensions.updateActions', '', + this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.updateActions', ExtensionAction.PROMINENT_LABEL_ACTION_CLASS, [[this.instantiationService.createInstance(UpdateAction, false)], [this.instantiationService.createInstance(ToggleAutoUpdateForExtensionAction, true, [true, 'onlyEnabledExtensions'])]]), this.instantiationService.createInstance(InstallDropdownAction), this.instantiationService.createInstance(InstallingLabelAction), diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css b/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css index 7bca424370314..bd3ae98514dd0 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css @@ -97,7 +97,8 @@ .monaco-action-bar .action-item.disabled .action-label.extension-action.hide, .monaco-action-bar .action-item.disabled .action-label.extension-action.ignore, .monaco-action-bar .action-item.disabled .action-label.extension-action.undo-ignore, -.monaco-action-bar .action-item.disabled .action-label.extension-action.install:not(.installing), +.monaco-action-bar .action-item .action-label.extension-action.install.hide, +.monaco-action-bar .action-item.disabled .action-label.extension-action.install-other-server:not(.installing), .monaco-action-bar .action-item.disabled .action-label.extension-action.uninstall:not(.uninstalling), .monaco-action-bar .action-item.disabled .action-label.extension-action.hide-when-disabled, .monaco-action-bar .action-item.disabled .action-label.extension-action.update, @@ -105,7 +106,7 @@ .monaco-action-bar .action-item.disabled .action-label.extension-action.theme, .monaco-action-bar .action-item.disabled .action-label.extension-action.language, .monaco-action-bar .action-item.disabled .action-label.extension-action.extension-sync, -.monaco-action-bar .action-item.action-dropdown-item.disabled, +.monaco-action-bar .action-item.action-dropdown-item.hide, .monaco-action-bar .action-item.action-dropdown-item .action-label.extension-action.hide, .monaco-action-bar .action-item.disabled .action-label.extension-action.reload, .monaco-action-bar .action-item.disabled .action-label.disable-status.hide, @@ -115,6 +116,10 @@ display: none; } +.monaco-action-bar .action-item.disabled .action-label.extension-action.label { + opacity: 0.4 !important; +} + .monaco-action-bar .action-item.checkbox-action-item.disabled { display: none; } diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts index 7bcaed37ba395..197f605903121 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts @@ -177,7 +177,7 @@ suite('ExtensionsActions', () => { testObject.extension = paged.firstPage[0]; assert.ok(!testObject.enabled); assert.strictEqual('Install', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install hide', testObject.class); }); }); }); @@ -206,7 +206,7 @@ suite('ExtensionsActions', () => { const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); const paged = await workbenchService.queryGallery(CancellationToken.None); - const promise = Event.toPromise(testObject.onDidChange); + const promise = Event.toPromise(Event.filter(testObject.onDidChange, e => e.enabled === true)); testObject.extension = paged.firstPage[0]; await promise; assert.ok(testObject.enabled); @@ -1733,7 +1733,7 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test remote install action when installing local workspace extension', async () => { @@ -1759,12 +1759,12 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); onInstallExtension.fire({ identifier: localWorkspaceExtension.identifier, source: gallery, profileLocation: null! }); assert.ok(testObject.enabled); assert.strictEqual('Installing', testObject.label); - assert.strictEqual('extension-action label install installing', testObject.class); + assert.strictEqual('extension-action label install-other-server installing', testObject.class); }); test('Test remote install action when installing local workspace extension is finished', async () => { @@ -1792,12 +1792,12 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); onInstallExtension.fire({ identifier: localWorkspaceExtension.identifier, source: gallery, profileLocation: null! }); assert.ok(testObject.enabled); assert.strictEqual('Installing', testObject.label); - assert.strictEqual('extension-action label install installing', testObject.class); + assert.strictEqual('extension-action label install-other-server installing', testObject.class); const installedExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) }); const promise = Event.toPromise(testObject.onDidChange); @@ -1826,7 +1826,7 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test remote install action is enabled local workspace+ui extension', async () => { @@ -1848,7 +1848,7 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test remote install action is enabled for local ui+workapace extension if can install is true', async () => { @@ -1870,7 +1870,7 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test remote install action is disabled for local ui+workapace extension if can install is false', async () => { @@ -2111,7 +2111,7 @@ suite('RemoteInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install in remote', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test remote install action is disabled if local language pack extension is uninstalled', async () => { @@ -2164,7 +2164,7 @@ suite('LocalInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install Locally', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test local install action is enabled for remote ui+workspace extension', async () => { @@ -2185,7 +2185,7 @@ suite('LocalInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install Locally', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test local install action when installing remote ui extension', async () => { @@ -2211,12 +2211,12 @@ suite('LocalInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install Locally', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); onInstallExtension.fire({ identifier: remoteUIExtension.identifier, source: gallery, profileLocation: null! }); assert.ok(testObject.enabled); assert.strictEqual('Installing', testObject.label); - assert.strictEqual('extension-action label install installing', testObject.class); + assert.strictEqual('extension-action label install-other-server installing', testObject.class); }); test('Test local install action when installing remote ui extension is finished', async () => { @@ -2244,12 +2244,12 @@ suite('LocalInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install Locally', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); onInstallExtension.fire({ identifier: remoteUIExtension.identifier, source: gallery, profileLocation: null! }); assert.ok(testObject.enabled); assert.strictEqual('Installing', testObject.label); - assert.strictEqual('extension-action label install installing', testObject.class); + assert.strictEqual('extension-action label install-other-server installing', testObject.class); const installedExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) }); const promise = Event.toPromise(testObject.onDidChange); @@ -2278,7 +2278,7 @@ suite('LocalInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install Locally', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test local install action is disabled when extension is not set', async () => { @@ -2502,7 +2502,7 @@ suite('LocalInstallAction', () => { testObject.extension = extensions[0]; assert.ok(testObject.enabled); assert.strictEqual('Install Locally', testObject.label); - assert.strictEqual('extension-action label prominent install', testObject.class); + assert.strictEqual('extension-action label prominent install-other-server', testObject.class); }); test('Test local install action is disabled if remote language pack extension is uninstalled', async () => { From 57a1f6e7e7183be04050bb12d3b9f83d73565ed2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 17:59:29 +0200 Subject: [PATCH 224/755] Bump braces from 3.0.2 to 3.0.3 in /remote (#215378) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- remote/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/remote/yarn.lock b/remote/yarn.lock index 7e3b539a3d96e..951d1f4804538 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -193,11 +193,11 @@ bl@^4.0.3: readable-stream "^3.4.0" braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" buffer-crc32@~0.2.3: version "0.2.13" @@ -270,10 +270,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" From 4ddcd5d23018e4e0a77bf4b4afa6c4718e94fae1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 18:26:11 +0200 Subject: [PATCH 225/755] Bump @azure/identity from 3.4.1 to 4.2.1 in /build (#214913) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@azure/identity](https://github.com/Azure/azure-sdk-for-js) from 3.4.1 to 4.2.1. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/identity_3.4.1...@azure/identity_4.2.1) --- updated-dependencies: - dependency-name: "@azure/identity" dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: João Moreno --- build/package.json | 2 +- build/yarn.lock | 109 +++++++++++++++++---------------------------- 2 files changed, 41 insertions(+), 70 deletions(-) diff --git a/build/package.json b/build/package.json index fa37e89b6faac..0bbeed3f1367d 100644 --- a/build/package.json +++ b/build/package.json @@ -4,7 +4,7 @@ "license": "MIT", "devDependencies": { "@azure/cosmos": "^3", - "@azure/identity": "^3.4.1", + "@azure/identity": "^4.2.1", "@azure/storage-blob": "^12.17.0", "@electron/get": "^2.0.0", "@types/ansi-colors": "^3.2.0", diff --git a/build/yarn.lock b/build/yarn.lock index 81cf7fcf3d548..d0c7960a11ebb 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -9,20 +9,19 @@ dependencies: tslib "^2.0.0" +"@azure/abort-controller@^2.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" + integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== + dependencies: + tslib "^2.6.2" + "@azure/core-asynciterator-polyfill@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz#dcccebb88406e5c76e0e1d52e8cc4c43a68b3ee7" integrity sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg== -"@azure/core-auth@^1.3.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.3.2.tgz#6a2c248576c26df365f6c7881ca04b7f6d08e3d0" - integrity sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA== - dependencies: - "@azure/abort-controller" "^1.0.0" - tslib "^2.2.0" - -"@azure/core-auth@^1.5.0": +"@azure/core-auth@^1.3.0", "@azure/core-auth@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.5.0.tgz#a41848c5c31cb3b7c84c409885267d55a2c92e44" integrity sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw== @@ -81,22 +80,7 @@ dependencies: "@azure/core-asynciterator-polyfill" "^1.0.0" -"@azure/core-rest-pipeline@^1.1.0", "@azure/core-rest-pipeline@^1.2.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.3.2.tgz#82bfb4e960b4ecf4f1a1cdb1afde4ce9192aef09" - integrity sha512-kymICKESeHBpVLgQiAxllgWdSTopkqtmfPac8ITwMCxNEC6hzbSpqApYbjzxbBNkBMgoD4GESo6LLhR/sPh6kA== - dependencies: - "@azure/abort-controller" "^1.0.0" - "@azure/core-auth" "^1.3.0" - "@azure/core-tracing" "1.0.0-preview.13" - "@azure/logger" "^1.0.0" - form-data "^4.0.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - tslib "^2.2.0" - uuid "^8.3.0" - -"@azure/core-rest-pipeline@^1.5.0": +"@azure/core-rest-pipeline@^1.1.0", "@azure/core-rest-pipeline@^1.2.0", "@azure/core-rest-pipeline@^1.5.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.7.0.tgz#71f42c19af160422cc84513809ff9668d8047087" integrity sha512-e2awPzwMKHrmvYgZ0qIKNkqnCM1QoDs7A0rOiS3OSAlOQOz/kL7PPKHXwFMuBeaRvS8i7fgobJn79q2Cji5f+Q== @@ -126,21 +110,13 @@ dependencies: tslib "^2.2.0" -"@azure/core-util@^1.1.0", "@azure/core-util@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.6.1.tgz#fea221c4fa43c26543bccf799beb30c1c7878f5a" - integrity sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ== - dependencies: - "@azure/abort-controller" "^1.0.0" - tslib "^2.2.0" - -"@azure/core-util@^1.1.1": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.2.0.tgz#3499deba1fc36dda6f1912b791809b6f15d4a392" - integrity sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng== +"@azure/core-util@^1.1.0", "@azure/core-util@^1.1.1", "@azure/core-util@^1.3.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.9.0.tgz#469afd7e6452d5388b189f90d33f7756b0b210d1" + integrity sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw== dependencies: - "@azure/abort-controller" "^1.0.0" - tslib "^2.2.0" + "@azure/abort-controller" "^2.0.0" + tslib "^2.6.2" "@azure/cosmos@^3": version "3.17.3" @@ -161,20 +137,20 @@ universal-user-agent "^6.0.0" uuid "^8.3.0" -"@azure/identity@^3.4.1": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-3.4.1.tgz#18ba48b7421c818ef8116e8eec3c03ec1a62649a" - integrity sha512-oQ/r5MBdfZTMIUcY5Ch8G7Vv9aIXDkEYyU4Dfqjim4MQN+LY2uiQ57P1JDopMLeHCsZxM4yy8lEdne3tM9Xhzg== +"@azure/identity@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.2.1.tgz#22b366201e989b7b41c0e1690e103bd579c31e4c" + integrity sha512-U8hsyC9YPcEIzoaObJlRDvp7KiF0MGS7xcWbyJSVvXRkC/HXo1f0oYeBYmEvVgRfacw7GHf6D6yAoh9JHz6A5Q== dependencies: "@azure/abort-controller" "^1.0.0" "@azure/core-auth" "^1.5.0" "@azure/core-client" "^1.4.0" "@azure/core-rest-pipeline" "^1.1.0" "@azure/core-tracing" "^1.0.0" - "@azure/core-util" "^1.6.1" + "@azure/core-util" "^1.3.0" "@azure/logger" "^1.0.0" - "@azure/msal-browser" "^3.5.0" - "@azure/msal-node" "^2.5.1" + "@azure/msal-browser" "^3.11.1" + "@azure/msal-node" "^2.9.2" events "^3.0.0" jws "^4.0.0" open "^8.0.0" @@ -188,24 +164,24 @@ dependencies: tslib "^2.0.0" -"@azure/msal-browser@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.5.0.tgz#eb64c931c78c2b75c70807f618e1284bbb183380" - integrity sha512-2NtMuel4CI3UEelCPKkNRXgKzpWEX48fvxIvPz7s0/sTcCaI08r05IOkH2GkXW+czUOtuY6+oGafJCpumnjRLg== +"@azure/msal-browser@^3.11.1": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.17.0.tgz#dee9ccae586239e7e0708b261f7ffa5bc7e00fb7" + integrity sha512-csccKXmW2z7EkZ0I3yAoW/offQt+JECdTIV/KrnRoZyM7wCSsQWODpwod8ZhYy7iOyamcHApR9uCh0oD1M+0/A== dependencies: - "@azure/msal-common" "14.4.0" + "@azure/msal-common" "14.12.0" -"@azure/msal-common@14.4.0": - version "14.4.0" - resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.4.0.tgz#f938c1d96bb73d65baab985c96faaa273c97cfd5" - integrity sha512-ffCymScQuMKVj+YVfwNI52A5Tu+uiZO2eTf+c+3TXxdAssks4nokJhtr+uOOMxH0zDi6d1OjFKFKeXODK0YLSg== +"@azure/msal-common@14.12.0": + version "14.12.0" + resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.12.0.tgz#844abe269b071f8fa8949dadc2a7b65bbb147588" + integrity sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw== -"@azure/msal-node@^2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.5.1.tgz#d180a1ba5fdc611a318a8f018a2db3453e2e2898" - integrity sha512-PsPRISqCG253HQk1cAS7eJW7NWTbnBGpG+vcGGz5z4JYRdnM2EIXlj1aBpXCdozenEPtXEVvHn2ELleW1w82nQ== +"@azure/msal-node@^2.9.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.9.2.tgz#e6d3c1661012c1bd0ef68e328f73a2fdede52931" + integrity sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ== dependencies: - "@azure/msal-common" "14.4.0" + "@azure/msal-common" "14.12.0" jsonwebtoken "^9.0.0" uuid "^8.3.0" @@ -2586,15 +2562,10 @@ tree-sitter@^0.20.5, tree-sitter@^0.20.6: nan "^2.18.0" prebuild-install "^7.1.1" -tslib@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" - integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== - -tslib@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.0.0, tslib@^2.2.0, tslib@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tunnel-agent@^0.6.0: version "0.6.0" From ce001001c8b971c0275016c81a765de2e98ba00d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 13 Jun 2024 09:42:36 -0700 Subject: [PATCH 226/755] Encode all chars 0x00-0x1f Fixes #211922 --- .../contrib/terminal/browser/media/shellIntegration.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 index c2971c0de2ac7..6035e21784c8d 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 @@ -52,7 +52,7 @@ if ($env:VSCODE_ENV_APPEND) { function Global:__VSCode-Escape-Value([string]$value) { # NOTE: In PowerShell v6.1+, this can be written `$value -replace '…', { … }` instead of `[regex]::Replace`. # Replace any non-alphanumeric characters. - [regex]::Replace($value, "[$([char]0x1b)\\\n;]", { param($match) + [regex]::Replace($value, "[$([char]0x00)-$([char]0x1f)\\\n;]", { param($match) # Encode the (ascii) matches as `\x` -Join ( [System.Text.Encoding]::UTF8.GetBytes($match.Value) | ForEach-Object { '\x{0:x2}' -f $_ } From d8e423b43f4a171e8d1e731714d831d9249b3bb9 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 13 Jun 2024 19:25:11 +0200 Subject: [PATCH 227/755] Implements #213571 (WIP) (#213575) --- .../testing/browser/testingExplorerFilter.ts | 3 +- .../testing/browser/testingExplorerView.ts | 44 ++++++++++++------- .../testing/common/testExplorerFilterState.ts | 2 + 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts index 6f90138b1022a..b4a2281c2155c 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts @@ -28,6 +28,7 @@ const testFilterDescriptions: { [K in TestFilterTerm]: string } = { [TestFilterTerm.Failed]: localize('testing.filters.showOnlyFailed', "Show Only Failed Tests"), [TestFilterTerm.Executed]: localize('testing.filters.showOnlyExecuted', "Show Only Executed Tests"), [TestFilterTerm.CurrentDoc]: localize('testing.filters.currentFile', "Show in Active File Only"), + [TestFilterTerm.OpenedFiles]: localize('testing.filters.openedFiles', "Show in Opened Files Only"), [TestFilterTerm.Hidden]: localize('testing.filters.showExcludedTests', "Show Hidden Tests"), }; @@ -201,7 +202,7 @@ class FiltersDropdownMenuActionViewItem extends DropdownMenuActionViewItem { private getActions(): IAction[] { return [ - ...[TestFilterTerm.Failed, TestFilterTerm.Executed, TestFilterTerm.CurrentDoc].map(term => ({ + ...[TestFilterTerm.Failed, TestFilterTerm.Executed, TestFilterTerm.CurrentDoc, TestFilterTerm.OpenedFiles].map(term => ({ checked: this.filters.isFilteringFor(term), class: undefined, enabled: true, diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index b0b0b73cba40a..71c0823882e7d 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -22,6 +22,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { FuzzyScore } from 'vs/base/common/filters'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; +import { autorun, observableFromEvent } from 'vs/base/common/observable'; import { fuzzyContains } from 'vs/base/common/strings'; import { ThemeIcon } from 'vs/base/common/themables'; import { isDefined } from 'vs/base/common/types'; @@ -78,6 +79,7 @@ import { ITestingContinuousRunService } from 'vs/workbench/contrib/testing/commo import { ITestingPeekOpener } from 'vs/workbench/contrib/testing/common/testingPeekOpener'; import { cmpPriority, isFailedState, isStateWithResult, statesInOrder } from 'vs/workbench/contrib/testing/common/testingStates'; import { IActivityService, IconBadge, NumberBadge } from 'vs/workbench/services/activity/common/activity'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; const enum LastFocusState { @@ -648,6 +650,7 @@ class TestingExplorerViewModel extends Disposable { onDidChangeVisibility: Event, @IConfigurationService configurationService: IConfigurationService, @IEditorService editorService: IEditorService, + @IEditorGroupsService editorGroupsService: IEditorGroupsService, @IMenuService private readonly menuService: IMenuService, @IContextMenuService private readonly contextMenuService: IContextMenuService, @ITestService private readonly testService: ITestService, @@ -818,27 +821,38 @@ class TestingExplorerViewModel extends Disposable { this.tree.rerender(); })); - const onEditorChange = () => { + const allOpenEditorInputs = observableFromEvent( + editorService.onDidEditorsChange, + () => new Set(editorGroupsService.groups.flatMap(g => g.editors).map(e => e.resource).filter(isDefined)), + ); + + const activeResource = observableFromEvent(editorService.onDidActiveEditorChange, () => { if (editorService.activeEditor instanceof DiffEditorInput) { - this.filter.filterToDocumentUri(editorService.activeEditor.primary.resource); + return editorService.activeEditor.primary.resource; } else { - this.filter.filterToDocumentUri(editorService.activeEditor?.resource); + return editorService.activeEditor?.resource; } + }); - if (this.filterState.isFilteringFor(TestFilterTerm.CurrentDoc)) { - this.tree.refilter(); + const filterText = observableFromEvent(this.filterState.text.onDidChange, () => this.filterState.text); + this._register(autorun(reader => { + filterText.read(reader); + if (this.filterState.isFilteringFor(TestFilterTerm.OpenedFiles)) { + this.filter.filterToDocumentUri([...allOpenEditorInputs.read(reader)]); + } else { + this.filter.filterToDocumentUri([activeResource.read(reader)].filter(isDefined)); } - }; - this._register(editorService.onDidActiveEditorChange(onEditorChange)); + if (this.filterState.isFilteringFor(TestFilterTerm.CurrentDoc) || this.filterState.isFilteringFor(TestFilterTerm.OpenedFiles)) { + this.tree.refilter(); + } + })); this._register(this.storageService.onWillSaveState(({ reason, }) => { if (reason === WillSaveStateReason.SHUTDOWN) { this.lastViewState.store(this.tree.getOptimizedViewState()); } })); - - onEditorChange(); } /** @@ -1067,7 +1081,7 @@ const hasNodeInOrParentOfUri = (collection: IMainThreadTestCollection, ident: IU }; class TestsFilter implements ITreeFilter { - private documentUri: URI | undefined; + private documentUris: URI[] = []; constructor( private readonly collection: IMainThreadTestCollection, @@ -1102,8 +1116,8 @@ class TestsFilter implements ITreeFilter { } } - public filterToDocumentUri(uri: URI | undefined) { - this.documentUri = uri; + public filterToDocumentUri(uris: readonly URI[]) { + this.documentUris = [...uris]; } private testTags(element: TestItemTreeElement): FilterResult { @@ -1131,15 +1145,15 @@ class TestsFilter implements ITreeFilter { } private testLocation(element: TestItemTreeElement): FilterResult { - if (!this.documentUri) { + if (this.documentUris.length === 0) { return FilterResult.Include; } - if (!this.state.isFilteringFor(TestFilterTerm.CurrentDoc) || !(element instanceof TestItemTreeElement)) { + if ((!this.state.isFilteringFor(TestFilterTerm.CurrentDoc) && !this.state.isFilteringFor(TestFilterTerm.OpenedFiles)) || !(element instanceof TestItemTreeElement)) { return FilterResult.Include; } - if (hasNodeInOrParentOfUri(this.collection, this.uriIdentityService, this.documentUri, element.test.item.extId)) { + if (this.documentUris.some(uri => hasNodeInOrParentOfUri(this.collection, this.uriIdentityService, uri, element.test.item.extId))) { return FilterResult.Include; } diff --git a/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts b/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts index 3ab130d114fae..e9c1275a79c06 100644 --- a/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts +++ b/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts @@ -199,6 +199,7 @@ export const enum TestFilterTerm { Failed = '@failed', Executed = '@executed', CurrentDoc = '@doc', + OpenedFiles = '@openedFiles', Hidden = '@hidden', } @@ -206,5 +207,6 @@ const allTestFilterTerms: readonly TestFilterTerm[] = [ TestFilterTerm.Failed, TestFilterTerm.Executed, TestFilterTerm.CurrentDoc, + TestFilterTerm.OpenedFiles, TestFilterTerm.Hidden, ]; From df5b251f462186101f4ee4e4c8f19a9266650b93 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 13 Jun 2024 10:37:10 -0700 Subject: [PATCH 228/755] Increase repl history size (#215458) Fix #215433 --- src/vs/workbench/contrib/debug/browser/repl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 0590a07895f67..2736ab313ad21 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -151,7 +151,7 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { this.menu = menuService.createMenu(MenuId.DebugConsoleContext, contextKeyService); this._register(this.menu); - this.history = new HistoryNavigator(JSON.parse(this.storageService.get(HISTORY_STORAGE_KEY, StorageScope.WORKSPACE, '[]')), 50); + this.history = new HistoryNavigator(JSON.parse(this.storageService.get(HISTORY_STORAGE_KEY, StorageScope.WORKSPACE, '[]')), 100); this.filter = new ReplFilter(); this.filter.filterQuery = filterText; this.multiSessionRepl = CONTEXT_MULTI_SESSION_REPL.bindTo(contextKeyService); From 559d3e476a1993b01f9b5e42c99230d48f63379f Mon Sep 17 00:00:00 2001 From: Andrea Mah <31675041+andreamah@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:58:03 -0700 Subject: [PATCH 229/755] remove query details and replace input with AI enabled. (#214658) --- .../contrib/search/browser/searchView.ts | 35 +++++++++++++++++-- .../contrib/search/browser/searchWidget.ts | 6 ++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index c2644fe66eeed..662d7fb901971 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -166,6 +166,9 @@ export class SearchView extends ViewPane { private _onSearchResultChangedDisposable: IDisposable | undefined; + private _stashedQueryDetailsVisibility: boolean | undefined = undefined; + private _stashedReplaceVisibility: boolean | undefined = undefined; + constructor( options: IViewPaneOptions, @IFileService private readonly fileService: IFileService, @@ -327,7 +330,32 @@ export class SearchView extends ViewPane { if (visible === this.aiResultsVisible) { return; } + + if (visible) { + this._stashedQueryDetailsVisibility = this._queryDetailsHidden(); + this._stashedReplaceVisibility = this.searchWidget.isReplaceShown(); + + this.searchWidget.toggleReplace(false); + this.toggleQueryDetailsButton.style.display = 'none'; + + this.searchWidget.replaceButtonVisibility = false; + this.toggleQueryDetails(undefined, false); + } else { + this.toggleQueryDetailsButton.style.display = ''; + this.searchWidget.replaceButtonVisibility = true; + + if (this._stashedReplaceVisibility) { + this.searchWidget.toggleReplace(this._stashedReplaceVisibility); + } + + if (this._stashedQueryDetailsVisibility) { + this.toggleQueryDetails(undefined, this._stashedQueryDetailsVisibility); + } + } + this.aiResultsVisible = visible; + + if (this.viewModel.searchResult.isEmpty()) { return; } @@ -336,9 +364,8 @@ export class SearchView extends ViewPane { this.model.cancelAISearch(); if (visible) { await this.model.addAIResults(); - } else { - this.searchWidget.toggleReplace(false); } + this.onSearchResultsChanged(); this.onSearchComplete(() => { }, undefined, undefined, this.viewModel.searchResult.getCachedSearchComplete(visible)); } @@ -1482,6 +1509,10 @@ export class SearchView extends ViewPane { } } + private _queryDetailsHidden() { + return this.queryDetails.classList.contains('more'); + } + searchInFolders(folderPaths: string[] = []): void { this._searchWithIncludeOrExclude(true, folderPaths); } diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index 52daf5fda2d66..905ea80a71c95 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -352,6 +352,12 @@ export class SearchWidget extends Widget { this.searchInput?.focusOnRegex(); } + set replaceButtonVisibility(val: boolean) { + if (this.toggleReplaceButton) { + this.toggleReplaceButton.element.style.display = val ? '' : 'none'; + } + } + private render(container: HTMLElement, options: ISearchWidgetOptions): void { this.domNode = dom.append(container, dom.$('.search-widget')); this.domNode.style.position = 'relative'; From 96c719346dd75b5f52792d2823a45929bf012cf9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 13 Jun 2024 20:40:57 +0200 Subject: [PATCH 230/755] report when auto restarted (#215464) --- .../extensions/browser/extensionsWorkbenchService.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 9f0452a6f118c..7cc4cf224da50 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -1342,6 +1342,17 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (toAdd.length || toRemove.length) { if (await this.extensionService.stopExtensionHosts(nls.localize('restart', "Enable or Disable extensions"), auto)) { await this.extensionService.startExtensionHosts({ toAdd, toRemove }); + if (auto) { + type ExtensionsAutoRestartClassification = { + owner: 'sandy081'; + comment: 'Report when extensions are auto restarted'; + count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Number of extensions auto restarted' }; + }; + type ExtensionsAutoRestartEvent = { + count: number; + }; + this.telemetryService.publicLog2('extensions:autorestart', { count: toAdd.length + toRemove.length }); + } } } } From 80e74016e64e46dd95809e9c462925a6d5794ffa Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 13 Jun 2024 21:15:26 +0200 Subject: [PATCH 231/755] fix: cache scanning extensions by profile (#215468) --- .../node/extensionManagementService.ts | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index b5a1d51f90046..1977a4ad1fe02 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -12,7 +12,7 @@ import { CancellationError, getErrorMessage } from 'vs/base/common/errors'; import { Emitter } from 'vs/base/common/event'; import { hash } from 'vs/base/common/hash'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ResourceSet } from 'vs/base/common/map'; +import { ResourceMap, ResourceSet } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import { joinPath } from 'vs/base/common/resources'; @@ -492,8 +492,8 @@ export class ExtensionsScanner extends Disposable { private readonly _onExtract = this._register(new Emitter()); readonly onExtract = this._onExtract.event; - private scanAllExtensionPromise: Promise | undefined; - private scanUserExtensionsPromise: Promise | undefined; + private scanAllExtensionPromise = new ResourceMap>(); + private scanUserExtensionsPromise = new ResourceMap>(); constructor( private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @@ -518,15 +518,21 @@ export class ExtensionsScanner extends Disposable { const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation, productVersion }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { - if (!this.scanAllExtensionPromise) { - this.scanAllExtensionPromise = this.extensionsScannerService.scanAllExtensions({ includeInvalid: true, useCache: true }, userScanOptions, false).finally(() => this.scanAllExtensionPromise = undefined); + let scanAllExtensionsPromise = this.scanAllExtensionPromise.get(profileLocation); + if (!scanAllExtensionsPromise) { + scanAllExtensionsPromise = this.extensionsScannerService.scanAllExtensions({ includeInvalid: true, useCache: true }, userScanOptions, false) + .finally(() => this.scanAllExtensionPromise.delete(profileLocation)); + this.scanAllExtensionPromise.set(profileLocation, scanAllExtensionsPromise); } - scannedExtensions.push(...await this.scanAllExtensionPromise); + scannedExtensions.push(...await scanAllExtensionsPromise); } else if (type === ExtensionType.User) { - if (!this.scanUserExtensionsPromise) { - this.scanUserExtensionsPromise = this.extensionsScannerService.scanUserExtensions(userScanOptions).finally(() => this.scanUserExtensionsPromise = undefined); + let scanUserExtensionsPromise = this.scanUserExtensionsPromise.get(profileLocation); + if (!scanUserExtensionsPromise) { + scanUserExtensionsPromise = this.extensionsScannerService.scanUserExtensions(userScanOptions) + .finally(() => this.scanUserExtensionsPromise.delete(profileLocation)); + this.scanUserExtensionsPromise.set(profileLocation, scanUserExtensionsPromise); } - scannedExtensions.push(...await this.scanUserExtensionsPromise); + scannedExtensions.push(...await scanUserExtensionsPromise); } scannedExtensions = type !== null ? scannedExtensions.filter(r => r.type === type) : scannedExtensions; return await Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); From 4e30f3ee15d992b4313688555560d366e433c016 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 13 Jun 2024 21:30:43 +0200 Subject: [PATCH 232/755] fix smoke tests (#215467) * fix smoke tests * feedback --- .../workbench/contrib/extensions/browser/extensionEditor.ts | 2 +- .../contrib/extensions/browser/extensionsActions.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index c456dfa178b01..a440979efdc36 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -349,7 +349,7 @@ export class ExtensionEditor extends EditorPane { this.instantiationService.createInstance(WebInstallAction), installAction, this.instantiationService.createInstance(InstallingLabelAction), - this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.uninstall', ExtensionAction.LABEL_ACTION_CLASS, [ + this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.uninstall', UninstallAction.UninstallClass, [ [ this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, false), this.instantiationService.createInstance(UninstallAction), diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index cace69aee5b26..fec28e85da529 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -366,7 +366,7 @@ export class ButtonWithDropdownExtensionActionViewItem extends ActionWithDropdow export class InstallAction extends ExtensionAction { - private static readonly CLASS = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`; + static readonly CLASS = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`; private static readonly HIDE = `${InstallAction.CLASS} hide`; protected _manifest: IExtensionManifest | null = null; @@ -610,7 +610,7 @@ export class InstallDropdownAction extends ButtonWithDropDownExtensionAction { @IInstantiationService instantiationService: IInstantiationService, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, ) { - super(`extensions.installActions`, ExtensionAction.PROMINENT_LABEL_ACTION_CLASS, [ + super(`extensions.installActions`, InstallAction.CLASS, [ [ instantiationService.createInstance(InstallAction, { installPreReleaseVersion: extensionsWorkbenchService.preferPreReleases }), instantiationService.createInstance(InstallAction, { installPreReleaseVersion: !extensionsWorkbenchService.preferPreReleases }), @@ -802,7 +802,7 @@ export class UninstallAction extends ExtensionAction { static readonly UninstallLabel = localize('uninstallAction', "Uninstall"); private static readonly UninstallingLabel = localize('Uninstalling', "Uninstalling"); - private static readonly UninstallClass = `${ExtensionAction.LABEL_ACTION_CLASS} uninstall`; + static readonly UninstallClass = `${ExtensionAction.LABEL_ACTION_CLASS} uninstall`; private static readonly UnInstallingClass = `${ExtensionAction.LABEL_ACTION_CLASS} uninstall uninstalling`; constructor( From 3eeefd2273dfe7850ce8885750699d64a58120f6 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Thu, 13 Jun 2024 14:02:51 -0700 Subject: [PATCH 233/755] testing: fix debug session tracking not working for n>1 test runs (#215476) --- src/vs/workbench/api/common/extHostTesting.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index 7334180c62953..19bd3f98efea1 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -441,11 +441,9 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { public getMetadataForRun(run: vscode.TestRun) { for (const tracker of this.runTracker.trackers) { const taskId = tracker.getTaskIdForRun(run); - if (!taskId) { - return undefined; + if (taskId) { + return { taskId, runId: tracker.id }; } - - return { taskId, runId: tracker.id }; } return undefined; From 1474750c6138543c77c073d3f8b735f28ea2b128 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 13 Jun 2024 19:33:40 +0200 Subject: [PATCH 234/755] Update to @vscode/proxy-agent 0.20.0 --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 8 ++++---- yarn.lock | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index bb277caf00629..f4b96c29b8d77 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/policy-watcher": "^1.1.4", - "@vscode/proxy-agent": "^0.19.0", + "@vscode/proxy-agent": "^0.20.0", "@vscode/ripgrep": "^1.15.9", "@vscode/spdlog": "^0.15.0", "@vscode/sqlite3": "5.1.6-vscode", diff --git a/remote/package.json b/remote/package.json index d3baa3243764d..c9b813f2b65d4 100644 --- a/remote/package.json +++ b/remote/package.json @@ -8,7 +8,7 @@ "@parcel/watcher": "2.1.0", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", - "@vscode/proxy-agent": "^0.19.0", + "@vscode/proxy-agent": "^0.20.0", "@vscode/ripgrep": "^1.15.9", "@vscode/spdlog": "^0.15.0", "@vscode/vscode-languagedetection": "1.0.21", diff --git a/remote/yarn.lock b/remote/yarn.lock index 951d1f4804538..f57d42bd60431 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -66,10 +66,10 @@ resolved "https://registry.yarnpkg.com/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz#d2f1e0664ee6036408f9743fee264ea0699b0e48" integrity sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg== -"@vscode/proxy-agent@^0.19.0": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.19.1.tgz#d9640d85df1c48885580b68bb4b2b54e17f5332c" - integrity sha512-cs1VOx6d5n69HhgzK0cWeyfudJt+9LdJi/vtgRRxxwisWKg4h83B3+EUJ4udF5SEkJgMBp3oU0jheZVt43ImnQ== +"@vscode/proxy-agent@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.20.0.tgz#48cbfd15e76da674bb1ba6e09a05b736d5677df0" + integrity sha512-FskCQwrFiXI+KiGgvEvUENNDffu5cDg3Cz1zWsafqvuPoPpTC88SOJl9kbeu3Y2YvSMcHx/r3tkK6ICoMaEWNQ== dependencies: "@tootallnate/once" "^3.0.0" agent-base "^7.0.1" diff --git a/yarn.lock b/yarn.lock index 385a3c04eedcf..72431fd74c633 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1570,10 +1570,10 @@ bindings "^1.5.0" node-addon-api "^6.0.0" -"@vscode/proxy-agent@^0.19.0": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.19.1.tgz#d9640d85df1c48885580b68bb4b2b54e17f5332c" - integrity sha512-cs1VOx6d5n69HhgzK0cWeyfudJt+9LdJi/vtgRRxxwisWKg4h83B3+EUJ4udF5SEkJgMBp3oU0jheZVt43ImnQ== +"@vscode/proxy-agent@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.20.0.tgz#48cbfd15e76da674bb1ba6e09a05b736d5677df0" + integrity sha512-FskCQwrFiXI+KiGgvEvUENNDffu5cDg3Cz1zWsafqvuPoPpTC88SOJl9kbeu3Y2YvSMcHx/r3tkK6ICoMaEWNQ== dependencies: "@tootallnate/once" "^3.0.0" agent-base "^7.0.1" From a936b9881dd875392bb09be546e654ada99959fb Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:40:25 -0700 Subject: [PATCH 235/755] Disable pwsh/bash prompt reporting when on stable Fixes #215482 --- src/vs/platform/terminal/node/terminalEnvironment.ts | 4 ++++ .../terminal/browser/media/shellIntegration-bash.sh | 9 ++++++++- .../contrib/terminal/browser/media/shellIntegration.ps1 | 7 ++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/terminal/node/terminalEnvironment.ts b/src/vs/platform/terminal/node/terminalEnvironment.ts index 813fbe5c43251..7349ac1e9db64 100644 --- a/src/vs/platform/terminal/node/terminalEnvironment.ts +++ b/src/vs/platform/terminal/node/terminalEnvironment.ts @@ -157,6 +157,7 @@ export function getShellIntegrationInjection( } newArgs = [...newArgs]; // Shallow clone the array to avoid setting the default array newArgs[newArgs.length - 1] = format(newArgs[newArgs.length - 1], appRoot, ''); + envMixin['VSCODE_STABLE'] = productService.quality === 'stable' ? '1' : '0'; if (options.shellIntegration.suggestEnabled) { envMixin['VSCODE_SUGGEST'] = '1'; } @@ -174,6 +175,7 @@ export function getShellIntegrationInjection( } newArgs = [...newArgs]; // Shallow clone the array to avoid setting the default array newArgs[newArgs.length - 1] = format(newArgs[newArgs.length - 1], appRoot); + envMixin['VSCODE_STABLE'] = productService.quality === 'stable' ? '1' : '0'; return { newArgs, envMixin }; } logService.warn(`Shell integration cannot be enabled for executable "${shellLaunchConfig.executable}" and args`, shellLaunchConfig.args); @@ -195,6 +197,7 @@ export function getShellIntegrationInjection( } newArgs = [...newArgs]; // Shallow clone the array to avoid setting the default array newArgs[newArgs.length - 1] = format(newArgs[newArgs.length - 1], appRoot); + envMixin['VSCODE_STABLE'] = productService.quality === 'stable' ? '1' : '0'; return { newArgs, envMixin }; } case 'fish': { @@ -220,6 +223,7 @@ export function getShellIntegrationInjection( } newArgs = [...newArgs]; // Shallow clone the array to avoid setting the default array newArgs[newArgs.length - 1] = format(newArgs[newArgs.length - 1], appRoot, ''); + envMixin['VSCODE_STABLE'] = productService.quality === 'stable' ? '1' : '0'; return { newArgs, envMixin }; } case 'zsh': { diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index 1b6d1f62a66ef..e46d83c6bb16b 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -170,6 +170,10 @@ __vsc_current_command="" __vsc_nonce="$VSCODE_NONCE" unset VSCODE_NONCE +# Some features should only work in Insiders +__vsc_stable="$VSCODE_STABLE" +unset VSCODE_STABLE + # Report continuation prompt builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a" @@ -252,7 +256,10 @@ __vsc_update_prompt() { __vsc_precmd() { __vsc_command_complete "$__vsc_status" __vsc_current_command="" - __vsc_report_prompt + # Report prompt is a work in progress, currently encoding is too slow + if [ "$__vsc_stable" = "0" ]; then + __vsc_report_prompt + fi __vsc_first_prompt=1 __vsc_update_prompt } diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 index 6035e21784c8d..c23ad8e3ef9f4 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 @@ -21,6 +21,9 @@ $Global:__LastHistoryId = -1 $Nonce = $env:VSCODE_NONCE $env:VSCODE_NONCE = $null +$isStable = $env:VSCODE_STABLE +$env:VSCODE_STABLE = $null + $osVersion = [System.Environment]::OSVersion.Version $isWindows10 = $IsWindows -and $osVersion.Major -eq 10 -and $osVersion.Minor -eq 0 -and $osVersion.Build -lt 22000 @@ -95,7 +98,9 @@ function Global:Prompt() { # Prompt # OSC 633 ; = ST - $Result += "$([char]0x1b)]633;P;Prompt=$(__VSCode-Escape-Value $OriginalPrompt)`a" + if ($isStable -eq "1") { + $Result += "$([char]0x1b)]633;P;Prompt=$(__VSCode-Escape-Value $OriginalPrompt)`a" + } # Write command started $Result += "$([char]0x1b)]633;B`a" From 9ba6c8169a98c1982fb702feb9a9f0d8cd7e070c Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:08:33 -0700 Subject: [PATCH 236/755] Fix tests --- .../platform/terminal/test/node/terminalEnvironment.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts b/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts index 2f68a7be2df98..dd4e198d7d45c 100644 --- a/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts +++ b/src/vs/platform/terminal/test/node/terminalEnvironment.test.ts @@ -186,7 +186,8 @@ suite('platform - terminalEnvironment', () => { `${repoRoot}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh` ], envMixin: { - VSCODE_INJECTION: '1' + VSCODE_INJECTION: '1', + VSCODE_STABLE: '0' } }); deepStrictEqual(getShellIntegrationInjection({ executable: 'bash', args: [] }, enabledProcessOptions, defaultEnvironment, logService, productService), enabledExpectedResult); @@ -201,7 +202,8 @@ suite('platform - terminalEnvironment', () => { ], envMixin: { VSCODE_INJECTION: '1', - VSCODE_SHELL_LOGIN: '1' + VSCODE_SHELL_LOGIN: '1', + VSCODE_STABLE: '0' } }); test('when array', () => { From d9d04e97b7079bfb40b5c2662379e0c55230fca7 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 13 Jun 2024 16:13:03 -0700 Subject: [PATCH 237/755] Show "Evaluate in debug console" expressions in debug console's input history (#215490) Fix #214820 --- .../contrib/debug/browser/debugEditorActions.ts | 11 ++++++----- .../workbench/contrib/debug/browser/debugSession.ts | 4 ++-- src/vs/workbench/contrib/debug/browser/repl.ts | 9 +++++++++ src/vs/workbench/contrib/debug/common/replModel.ts | 8 ++++---- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts index 7810995bb38b2..5f4bbc06b00f5 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts @@ -14,6 +14,7 @@ import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import * as nls from 'vs/nls'; +import { ILocalizedString } from 'vs/platform/action/common/action'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -22,14 +23,14 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { PanelFocusContext } from 'vs/workbench/common/contextkeys'; -import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; import { openBreakpointSource } from 'vs/workbench/contrib/debug/browser/breakpointsView'; import { DisassemblyView } from 'vs/workbench/contrib/debug/browser/disassemblyView'; -import { BREAKPOINT_EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext, CONTEXT_CALLSTACK_ITEM_TYPE, CONTEXT_DEBUGGERS_AVAILABLE, CONTEXT_DEBUG_STATE, CONTEXT_DISASSEMBLE_REQUEST_SUPPORTED, CONTEXT_DISASSEMBLY_VIEW_FOCUS, CONTEXT_EXCEPTION_WIDGET_VISIBLE, CONTEXT_FOCUSED_STACK_FRAME_HAS_INSTRUCTION_POINTER_REFERENCE, CONTEXT_IN_DEBUG_MODE, CONTEXT_LANGUAGE_SUPPORTS_DISASSEMBLE_REQUEST, CONTEXT_STEP_INTO_TARGETS_SUPPORTED, EDITOR_CONTRIBUTION_ID, IBreakpointEditorContribution, IDebugConfiguration, IDebugEditorContribution, IDebugService, REPL_VIEW_ID, WATCH_VIEW_ID } from 'vs/workbench/contrib/debug/common/debug'; +import { Repl } from 'vs/workbench/contrib/debug/browser/repl'; +import { BREAKPOINT_EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext, CONTEXT_CALLSTACK_ITEM_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_DEBUGGERS_AVAILABLE, CONTEXT_DISASSEMBLE_REQUEST_SUPPORTED, CONTEXT_DISASSEMBLY_VIEW_FOCUS, CONTEXT_EXCEPTION_WIDGET_VISIBLE, CONTEXT_FOCUSED_STACK_FRAME_HAS_INSTRUCTION_POINTER_REFERENCE, CONTEXT_IN_DEBUG_MODE, CONTEXT_LANGUAGE_SUPPORTS_DISASSEMBLE_REQUEST, CONTEXT_STEP_INTO_TARGETS_SUPPORTED, EDITOR_CONTRIBUTION_ID, IBreakpointEditorContribution, IDebugConfiguration, IDebugEditorContribution, IDebugService, REPL_VIEW_ID, WATCH_VIEW_ID } from 'vs/workbench/contrib/debug/common/debug'; import { getEvaluatableExpressionAtPosition } from 'vs/workbench/contrib/debug/common/debugUtils'; import { DisassemblyViewInput } from 'vs/workbench/contrib/debug/common/disassemblyViewInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ILocalizedString } from 'vs/platform/action/common/action'; +import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; class ToggleBreakpointAction extends Action2 { constructor() { @@ -368,8 +369,8 @@ export class SelectionToReplAction extends EditorAction { text = editor.getModel().getValueInRange(selection); } - await session.addReplExpression(viewModel.focusedStackFrame, text); - await viewsService.openView(REPL_VIEW_ID, false); + const replView = await viewsService.openView(REPL_VIEW_ID, false) as Repl | undefined; + replView?.sendReplInput(text); } } diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index 3a7ca50029eb2..a8d9cc9e562d2 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -1521,8 +1521,8 @@ export class DebugSession implements IDebugSession, IDisposable { this.repl.removeReplExpressions(); } - async addReplExpression(stackFrame: IStackFrame | undefined, name: string): Promise { - await this.repl.addReplExpression(this, stackFrame, name); + async addReplExpression(stackFrame: IStackFrame | undefined, expression: string): Promise { + await this.repl.addReplExpression(this, stackFrame, expression); // Evaluate all watch expressions and fetch variables again since repl evaluation might have changed some. this.debugService.getViewModel().updateViews(); } diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 2736ab313ad21..c282aa3fab968 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -472,6 +472,15 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { } } + sendReplInput(input: string): void { + const session = this.tree?.getInput(); + if (session && !this.isReadonly) { + session.addReplExpression(this.debugService.getViewModel().focusedStackFrame, input); + revealLastElement(this.tree!); + this.history.add(input); + } + } + getVisibleContent(): string { let text = ''; if (this.model && this.tree) { diff --git a/src/vs/workbench/contrib/debug/common/replModel.ts b/src/vs/workbench/contrib/debug/common/replModel.ts index 4402ed3f3b5c9..6556849e5e90b 100644 --- a/src/vs/workbench/contrib/debug/common/replModel.ts +++ b/src/vs/workbench/contrib/debug/common/replModel.ts @@ -269,10 +269,10 @@ export class ReplModel { return this.replElements; } - async addReplExpression(session: IDebugSession, stackFrame: IStackFrame | undefined, name: string): Promise { - this.addReplElement(new ReplEvaluationInput(name)); - const result = new ReplEvaluationResult(name); - await result.evaluateExpression(name, session, stackFrame, 'repl'); + async addReplExpression(session: IDebugSession, stackFrame: IStackFrame | undefined, expression: string): Promise { + this.addReplElement(new ReplEvaluationInput(expression)); + const result = new ReplEvaluationResult(expression); + await result.evaluateExpression(expression, session, stackFrame, 'repl'); this.addReplElement(result); } From 3b80131054ea2b80002bfde213a41293b85e68de Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 14 Jun 2024 08:36:01 +0900 Subject: [PATCH 238/755] chore: add missing gl libraries for snap (#215493) * chore: add missing gl libraries for angle * chore: add wayland egl library --- resources/linux/snap/electron-launch | 2 +- resources/linux/snap/snapcraft.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/linux/snap/electron-launch b/resources/linux/snap/electron-launch index ea82e60bd6c3d..bd228cb9d222b 100755 --- a/resources/linux/snap/electron-launch +++ b/resources/linux/snap/electron-launch @@ -261,4 +261,4 @@ fi wait_for_async_execs -exec "$@" "--no-sandbox" "--use-gl=angle" "--use-angle=swiftshader" +exec "$@" "--no-sandbox" diff --git a/resources/linux/snap/snapcraft.yaml b/resources/linux/snap/snapcraft.yaml index 5d4df3f52f3f6..7fd44021d5095 100644 --- a/resources/linux/snap/snapcraft.yaml +++ b/resources/linux/snap/snapcraft.yaml @@ -30,15 +30,18 @@ parts: - libcurl3-gnutls - libcurl3-nss - libcurl4 + - libegl1 - libdrm2 - libgbm1 - libgl1 + - libgles2 - libglib2.0-0 - libgtk-3-0 - libibus-1.0-5 - libnss3 - libpango-1.0-0 - libsecret-1-0 + - libwayland-egl1 - libxcomposite1 - libxdamage1 - libxfixes3 From 0da59bdde2339d6ba632524dc8f3fb6f4b8a2bcb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 14 Jun 2024 11:18:17 +0200 Subject: [PATCH 239/755] fix https://github.com/microsoft/vscode/issues/215521 (#215522) --- src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 14e6e268fc925..843a004e895b8 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -590,7 +590,7 @@ export class EditorBasedInlineChatWidget extends InlineChatWidget { @IChatService chatService: IChatService, @IHoverService hoverService: IHoverService, ) { - super(location, { ...options, chatWidgetViewOptions: { editorOverflowWidgetsDomNode: _parentEditor.getOverflowWidgetsDomNode() } }, instantiationService, contextKeyService, keybindingService, accessibilityService, configurationService, accessibleViewService, textModelResolverService, chatService, hoverService); + super(location, { ...options, chatWidgetViewOptions: { ...options.chatWidgetViewOptions, editorOverflowWidgetsDomNode: _parentEditor.getOverflowWidgetsDomNode() } }, instantiationService, contextKeyService, keybindingService, accessibilityService, configurationService, accessibleViewService, textModelResolverService, chatService, hoverService); } // --- layout From dc8c2d019c806a06aa47a4e7a6bd147b5d68b27e Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Fri, 14 Jun 2024 11:56:24 +0200 Subject: [PATCH 240/755] Fix cursor synchronization issue in multi-cursor word left selection (#215523) Make all cursors behave the same when doing word left (fixes #169904) --- .../common/cursor/cursorWordOperations.ts | 11 +++--- .../wordOperations/browser/wordOperations.ts | 28 +++++++-------- .../test/browser/wordOperations.test.ts | 34 +++++++++++++++++++ .../browser/wordPartOperations.ts | 6 ++-- 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/common/cursor/cursorWordOperations.ts b/src/vs/editor/common/cursor/cursorWordOperations.ts index b16172cc89a9f..a43538215b232 100644 --- a/src/vs/editor/common/cursor/cursorWordOperations.ts +++ b/src/vs/editor/common/cursor/cursorWordOperations.ts @@ -208,7 +208,7 @@ export class WordOperations { return 0; } - public static moveWordLeft(wordSeparators: WordCharacterClassifier, model: ICursorSimpleModel, position: Position, wordNavigationType: WordNavigationType): Position { + public static moveWordLeft(wordSeparators: WordCharacterClassifier, model: ICursorSimpleModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { let lineNumber = position.lineNumber; let column = position.column; @@ -227,7 +227,8 @@ export class WordOperations { if (wordNavigationType === WordNavigationType.WordStartFast) { if ( - prevWordOnLine + !hasMulticursor // avoid having multiple cursors stop at different locations when doing word start + && prevWordOnLine && prevWordOnLine.wordType === WordType.Separator && prevWordOnLine.end - prevWordOnLine.start === 1 && prevWordOnLine.nextCharClass === WordCharacterClass.Regular @@ -830,10 +831,10 @@ export class WordPartOperations extends WordOperations { return candidates[0]; } - public static moveWordPartLeft(wordSeparators: WordCharacterClassifier, model: ICursorSimpleModel, position: Position): Position { + public static moveWordPartLeft(wordSeparators: WordCharacterClassifier, model: ICursorSimpleModel, position: Position, hasMulticursor: boolean): Position { const candidates = enforceDefined([ - WordOperations.moveWordLeft(wordSeparators, model, position, WordNavigationType.WordStart), - WordOperations.moveWordLeft(wordSeparators, model, position, WordNavigationType.WordEnd), + WordOperations.moveWordLeft(wordSeparators, model, position, WordNavigationType.WordStart, hasMulticursor), + WordOperations.moveWordLeft(wordSeparators, model, position, WordNavigationType.WordEnd, hasMulticursor), WordOperations._moveWordPartLeft(model, position) ]); candidates.sort(Position.compare); diff --git a/src/vs/editor/contrib/wordOperations/browser/wordOperations.ts b/src/vs/editor/contrib/wordOperations/browser/wordOperations.ts index 388d42021d227..29381ecf63fc6 100644 --- a/src/vs/editor/contrib/wordOperations/browser/wordOperations.ts +++ b/src/vs/editor/contrib/wordOperations/browser/wordOperations.ts @@ -48,10 +48,10 @@ export abstract class MoveWordCommand extends EditorCommand { const wordSeparators = getMapForWordSeparators(editor.getOption(EditorOption.wordSeparators), editor.getOption(EditorOption.wordSegmenterLocales)); const model = editor.getModel(); const selections = editor.getSelections(); - + const hasMulticursor = selections.length > 1; const result = selections.map((sel) => { const inPosition = new Position(sel.positionLineNumber, sel.positionColumn); - const outPosition = this._move(wordSeparators, model, inPosition, this._wordNavigationType); + const outPosition = this._move(wordSeparators, model, inPosition, this._wordNavigationType, hasMulticursor); return this._moveTo(sel, outPosition, this._inSelectionMode); }); @@ -83,17 +83,17 @@ export abstract class MoveWordCommand extends EditorCommand { } } - protected abstract _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position; + protected abstract _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position; } export class WordLeftCommand extends MoveWordCommand { - protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { - return WordOperations.moveWordLeft(wordSeparators, model, position, wordNavigationType); + protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { + return WordOperations.moveWordLeft(wordSeparators, model, position, wordNavigationType, hasMulticursor); } } export class WordRightCommand extends MoveWordCommand { - protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { + protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { return WordOperations.moveWordRight(wordSeparators, model, position, wordNavigationType); } } @@ -187,8 +187,8 @@ export class CursorWordAccessibilityLeft extends WordLeftCommand { }); } - protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { - return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType); + protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { + return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor); } } @@ -202,8 +202,8 @@ export class CursorWordAccessibilityLeftSelect extends WordLeftCommand { }); } - protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { - return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType); + protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { + return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor); } } @@ -295,8 +295,8 @@ export class CursorWordAccessibilityRight extends WordRightCommand { }); } - protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { - return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType); + protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { + return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor); } } @@ -310,8 +310,8 @@ export class CursorWordAccessibilityRightSelect extends WordRightCommand { }); } - protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { - return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType); + protected override _move(wordCharacterClassifier: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { + return super._move(getMapForWordSeparators(EditorOptions.wordSeparators.defaultValue, wordCharacterClassifier.intlSegmenterLocales), model, position, wordNavigationType, hasMulticursor); } } diff --git a/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts index e65c88eeae303..51cdccc4fd350 100644 --- a/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts @@ -217,6 +217,40 @@ suite('WordOperations', () => { assert.deepStrictEqual(actual, EXPECTED); }); + test('cursorWordLeft - issue #169904: cursors out of sync', () => { + const text = [ + '.grid1 {', + ' display: grid;', + ' grid-template-columns:', + ' [full-start] minmax(1em, 1fr)', + ' [main-start] minmax(0, 40em) [main-end]', + ' minmax(1em, 1fr) [full-end];', + '}', + '.grid2 {', + ' display: grid;', + ' grid-template-columns:', + ' [full-start] minmax(1em, 1fr)', + ' [main-start] minmax(0, 40em) [main-end] minmax(1em, 1fr) [full-end];', + '}', + ]; + withTestCodeEditor(text, {}, (editor) => { + editor.setSelections([ + new Selection(5, 44, 5, 44), + new Selection(6, 32, 6, 32), + new Selection(12, 44, 12, 44), + new Selection(12, 72, 12, 72), + ]); + cursorWordLeft(editor, false); + assert.deepStrictEqual(editor.getSelections(), [ + new Selection(5, 43, 5, 43), + new Selection(6, 31, 6, 31), + new Selection(12, 43, 12, 43), + new Selection(12, 71, 12, 71), + ]); + + }); + }); + test('cursorWordLeftSelect - issue #74369: cursorWordLeft and cursorWordLeftSelect do not behave consistently', () => { const EXPECTED = [ '|this.|is.|a.|test', diff --git a/src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts b/src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts index ebcabc415a474..5ed4d310941b7 100644 --- a/src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts +++ b/src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts @@ -68,8 +68,8 @@ export class DeleteWordPartRight extends DeleteWordCommand { } export class WordPartLeftCommand extends MoveWordCommand { - protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { - return WordPartOperations.moveWordPartLeft(wordSeparators, model, position); + protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { + return WordPartOperations.moveWordPartLeft(wordSeparators, model, position, hasMulticursor); } } export class CursorWordPartLeft extends WordPartLeftCommand { @@ -111,7 +111,7 @@ export class CursorWordPartLeftSelect extends WordPartLeftCommand { CommandsRegistry.registerCommandAlias('cursorWordPartStartLeftSelect', 'cursorWordPartLeftSelect'); export class WordPartRightCommand extends MoveWordCommand { - protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position { + protected _move(wordSeparators: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType, hasMulticursor: boolean): Position { return WordPartOperations.moveWordPartRight(wordSeparators, model, position); } } From 8fdbb81a9f8d3f0e4367ea988907435be37a581a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:52:23 +0200 Subject: [PATCH 241/755] Bump braces from 3.0.2 to 3.0.3 in /extensions/npm (#215481) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extensions/npm/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index a7afc9f801f53..be4b192c67d58 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -39,21 +39,21 @@ brace-expansion@^2.0.1: balanced-match "^1.0.0" braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" From 288a52a0b736d2b0b310dec36de0d39abec737a3 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 14 Jun 2024 09:44:26 -0700 Subject: [PATCH 242/755] use terminal chat context key instead of generic one to fix bug (#215552) fix #215532 --- .../contrib/terminalContrib/chat/browser/terminalChatActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts index 87dc3f18ed152..6843d9869110c 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts @@ -318,7 +318,7 @@ registerActiveXtermAction({ ), icon: Codicon.send, keybinding: { - when: ContextKeyExpr.and(CTX_INLINE_CHAT_FOCUSED, TerminalChatContextKeys.requestActive.negate()), + when: ContextKeyExpr.and(TerminalChatContextKeys.focused, TerminalChatContextKeys.requestActive.negate()), weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.Enter }, From 4666c5068ddb51c85c63af2a666a23b2dcba48cc Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:38:21 -0700 Subject: [PATCH 243/755] Fix registered contextkey issue (#215564) fix registered contextkey removes others --- src/vs/workbench/browser/parts/editor/editorParts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/editorParts.ts b/src/vs/workbench/browser/parts/editor/editorParts.ts index e505a3fd466ee..18123131e5b58 100644 --- a/src/vs/workbench/browser/parts/editor/editorParts.ts +++ b/src/vs/workbench/browser/parts/editor/editorParts.ts @@ -761,7 +761,7 @@ export class EditorParts extends MultiWindowParts implements IEditor let groupRegisteredContextKeys = this.registeredContextKeys.get(group.id); if (!groupRegisteredContextKeys) { groupRegisteredContextKeys = new Map(); - this.scopedContextKeys.set(group.id, groupRegisteredContextKeys); + this.registeredContextKeys.set(group.id, groupRegisteredContextKeys); } let scopedRegisteredContextKey = groupRegisteredContextKeys.get(provider.contextKey.key); From af867d774a6ec3516837dc91a77801310776ba95 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Fri, 14 Jun 2024 11:39:38 -0700 Subject: [PATCH 244/755] testing: polish attributable coverage API, fix coverage reporting in selfhost (#215559) --- .../src/coverageProvider.ts | 74 +++++----- .../src/extension.ts | 4 +- .../src/testOutputScanner.ts | 94 ++++++++++--- .../api/browser/mainThreadTesting.ts | 2 +- .../workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostTesting.ts | 49 ++++--- .../api/common/extHostTypeConverters.ts | 4 +- src/vs/workbench/api/common/extHostTypes.ts | 2 +- .../browser/codeCoverageDecorations.ts | 104 +++++++------- .../testing/browser/testCoverageView.ts | 2 +- .../contrib/testing/common/testCoverage.ts | 130 ++++++++++++------ .../testing/common/testCoverageService.ts | 3 +- .../contrib/testing/common/testTypes.ts | 9 +- .../testing/test/common/testCoverage.test.ts | 56 -------- .../vscode.proposed.attributableCoverage.d.ts | 35 +++-- 15 files changed, 321 insertions(+), 249 deletions(-) diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts index 7280782c10a76..3fff7c5b63789 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts @@ -5,7 +5,7 @@ import { IstanbulCoverageContext } from 'istanbul-to-vscode'; import * as vscode from 'vscode'; -import { SourceLocationMapper, SourceMapStore } from './testOutputScanner'; +import { SearchStrategy, SourceLocationMapper, SourceMapStore } from './testOutputScanner'; import { IScriptCoverage, OffsetToPosition, RangeCoverageTracker } from './v8CoverageWrangling'; export const istanbulCoverageContext = new IstanbulCoverageContext(); @@ -18,7 +18,7 @@ export const istanbulCoverageContext = new IstanbulCoverageContext(); export class PerTestCoverageTracker { private readonly scripts = new Map(); - constructor(private readonly maps: SourceMapStore) {} + constructor(private readonly maps: SourceMapStore) { } public add(coverage: IScriptCoverage, test?: vscode.TestItem) { const script = this.scripts.get(coverage.scriptId); @@ -71,11 +71,7 @@ class Script { public async report(run: vscode.TestRun) { const mapper = await this.maps.getSourceLocationMapper(this.uri.toString()); const originalUri = (await this.maps.getSourceFile(this.uri.toString())) || this.uri; - - run.addCoverage(this.overall.report(originalUri, this.converter, mapper)); - for (const [test, projection] of this.perItem) { - run.addCoverage(projection.report(originalUri, this.converter, mapper, test)); - } + run.addCoverage(this.overall.report(originalUri, this.converter, mapper, this.perItem)); } } @@ -88,20 +84,11 @@ class ScriptCoverageTracker { } } - /** - * Generates the script's coverage for the test run. - * - * If a source location mapper is given, it assumes the `uri` is the mapped - * URI, and that any unmapped locations/outside the URI should be ignored. - */ - public report( + public *toDetails( uri: vscode.Uri, convert: OffsetToPosition, mapper: SourceLocationMapper | undefined, - item?: vscode.TestItem - ): V8CoverageFile { - const file = new V8CoverageFile(uri, item); - + ) { for (const range of this.coverage) { if (range.start === range.end) { continue; @@ -113,8 +100,8 @@ class ScriptCoverageTracker { const endCov = convert.toLineColumn(range.end); let end = new vscode.Position(endCov.line, endCov.column); if (mapper) { - const startMap = mapper(start.line, start.character); - const endMap = startMap && mapper(end.line, end.character); + const startMap = mapper(start.line, start.character, SearchStrategy.FirstAfter); + const endMap = startMap && mapper(end.line, end.character, SearchStrategy.FirstBefore); if (!endMap || uri.toString().toLowerCase() !== endMap.uri.toString().toLowerCase()) { continue; } @@ -123,28 +110,48 @@ class ScriptCoverageTracker { } for (let i = start.line; i <= end.line; i++) { - file.add( - new vscode.StatementCoverage( - range.covered, - new vscode.Range( - new vscode.Position(i, i === start.line ? start.character : 0), - new vscode.Position(i, i === end.line ? end.character : Number.MAX_SAFE_INTEGER) - ) + yield new vscode.StatementCoverage( + range.covered, + new vscode.Range( + new vscode.Position(i, i === start.line ? start.character : 0), + new vscode.Position(i, i === end.line ? end.character : Number.MAX_SAFE_INTEGER) ) ); } } + } + + /** + * Generates the script's coverage for the test run. + * + * If a source location mapper is given, it assumes the `uri` is the mapped + * URI, and that any unmapped locations/outside the URI should be ignored. + */ + public report( + uri: vscode.Uri, + convert: OffsetToPosition, + mapper: SourceLocationMapper | undefined, + items: Map, + ): V8CoverageFile { + const file = new V8CoverageFile(uri, items, convert, mapper); + for (const detail of this.toDetails(uri, convert, mapper)) { + file.add(detail); + } return file; } } -export class V8CoverageFile extends vscode.FileCoverage { +export class V8CoverageFile extends vscode.FileCoverage2 { public details: vscode.StatementCoverage[] = []; - constructor(uri: vscode.Uri, item?: vscode.TestItem) { - super(uri, { covered: 0, total: 0 }); - (this as vscode.FileCoverage2).testItem = item; + constructor( + uri: vscode.Uri, + private readonly perTest: Map, + private readonly convert: OffsetToPosition, + private readonly mapper: SourceLocationMapper | undefined, + ) { + super(uri, { covered: 0, total: 0 }, undefined, undefined, [...perTest.keys()]); } public add(detail: vscode.StatementCoverage) { @@ -154,4 +161,9 @@ export class V8CoverageFile extends vscode.FileCoverage { this.statementCoverage.covered++; } } + + public testDetails(test: vscode.TestItem): vscode.FileCoverageDetail[] { + const t = this.perTest.get(test); + return t ? [...t.toDetails(this.uri, this.convert, this.mapper)] : []; + } } diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts index c61fd56514687..36c23e68ac148 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts @@ -196,9 +196,9 @@ export async function activate(context: vscode.ExtensionContext) { true ); - coverage.loadDetailedCoverage = async (_run, coverage) => { + (coverage as vscode.TestRunProfile2).loadDetailedCoverage = async (_run, coverage, _token, test) => { if (coverage instanceof V8CoverageFile) { - return coverage.details; + return test ? coverage.testDetails(test) : coverage.details; } return []; diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts index 74013dcd56105..b5a448aaba12b 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts @@ -424,36 +424,62 @@ const tryMakeMarkdown = (message: string) => { const inlineSourcemapRe = /^\/\/# sourceMappingURL=data:application\/json;base64,(.+)/m; const sourceMapBiases = [GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND] as const; -export type SourceLocationMapper = (line: number, col: number) => vscode.Location | undefined; +export const enum SearchStrategy { + FirstBefore = -1, + FirstAfter = 1, +} + +export type SourceLocationMapper = (line: number, col: number, strategy: SearchStrategy) => vscode.Location | undefined; export class SourceMapStore { private readonly cache = new Map>(); - async getSourceLocationMapper(fileUri: string) { + async getSourceLocationMapper(fileUri: string): Promise { const sourceMap = await this.loadSourceMap(fileUri); - return (line: number, col: number) => { + return (line, col, strategy) => { if (!sourceMap) { return undefined; } - let smLine = line + 1; + // 1. Look for the ideal position on this line if it exists + const idealPosition = originalPositionFor(sourceMap, { column: col, line: line + 1, bias: SearchStrategy.FirstAfter ? GREATEST_LOWER_BOUND : LEAST_UPPER_BOUND }); + if (idealPosition.line !== null && idealPosition.column !== null && idealPosition.source !== null) { + return new vscode.Location( + this.completeSourceMapUrl(sourceMap, idealPosition.source), + new vscode.Position(idealPosition.line - 1, idealPosition.column) + ); + } - // if the range is after the end of mappings, adjust it to the last mapped line + // Otherwise get the first/last valid mapping on another line. const decoded = decodedMappings(sourceMap); - if (decoded.length <= line) { - smLine = decoded.length; // base 1, no -1 needed - col = Number.MAX_SAFE_INTEGER; + const enum MapField { + COLUMN = 0, + SOURCES_INDEX = 1, + SOURCE_LINE = 2, + SOURCE_COLUMN = 3, } - for (const bias of sourceMapBiases) { - const position = originalPositionFor(sourceMap, { column: col, line: smLine, bias }); - if (position.line !== null && position.column !== null && position.source !== null) { - return new vscode.Location( - this.completeSourceMapUrl(sourceMap, position.source), - new vscode.Position(position.line - 1, position.column) - ); + do { + line += strategy; + const segments = decoded[line]; + if (!segments?.length) { + continue; } - } + + const index = strategy === SearchStrategy.FirstBefore + ? findLastIndex(segments, s => s.length !== 1) + : segments.findIndex(s => s.length !== 1); + const segment = segments[index]; + + if (!segment || segment.length === 1) { + continue; + } + + return new vscode.Location( + this.completeSourceMapUrl(sourceMap, sourceMap.sources[segment[MapField.SOURCES_INDEX]]!), + new vscode.Position(segment[MapField.SOURCE_LINE] - 1, segment[MapField.SOURCE_COLUMN]) + ); + } while (strategy === SearchStrategy.FirstBefore ? line > 0 : line < decoded.length); return undefined; }; @@ -461,7 +487,31 @@ export class SourceMapStore { /** Gets an original location from a base 0 line and column */ async getSourceLocation(fileUri: string, line: number, col = 0) { - return this.getSourceLocationMapper(fileUri).then(m => m(line, col)); + const sourceMap = await this.loadSourceMap(fileUri); + if (!sourceMap) { + return undefined; + } + + let smLine = line + 1; + + // if the range is after the end of mappings, adjust it to the last mapped line + const decoded = decodedMappings(sourceMap); + if (decoded.length <= line) { + smLine = decoded.length; // base 1, no -1 needed + col = Number.MAX_SAFE_INTEGER; + } + + for (const bias of sourceMapBiases) { + const position = originalPositionFor(sourceMap, { column: col, line: smLine, bias }); + if (position.line !== null && position.column !== null && position.source !== null) { + return new vscode.Location( + this.completeSourceMapUrl(sourceMap, position.source), + new vscode.Position(position.line - 1, position.column) + ); + } + } + + return undefined; } async getSourceFile(compiledUri: string) { @@ -602,3 +652,13 @@ async function deriveSourceLocation(store: SourceMapStore, parts: RegExpMatchArr const [, fileUri, line, col] = parts; return store.getSourceLocation(fileUri, Number(line) - 1, Number(col)); } + +function findLastIndex(arr: T[], predicate: (value: T) => boolean) { + for (let i = arr.length - 1; i >= 0; i--) { + if (predicate(arr[i])) { + return i; + } + } + + return -1; +} \ No newline at end of file diff --git a/src/vs/workbench/api/browser/mainThreadTesting.ts b/src/vs/workbench/api/browser/mainThreadTesting.ts index a3641b6687aab..1b2a115fca23f 100644 --- a/src/vs/workbench/api/browser/mainThreadTesting.ts +++ b/src/vs/workbench/api/browser/mainThreadTesting.ts @@ -150,7 +150,7 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh let value = task.coverage.read(undefined); if (!value) { value = new TestCoverage(run, taskId, this.uriIdentityService, { - getCoverageDetails: (id, token) => this.proxy.$getCoverageDetails(id, token) + getCoverageDetails: (id, testId, token) => this.proxy.$getCoverageDetails(id, testId, token) .then(r => r.map(CoverageDetails.deserialize)), }); value.append(deserialized, tx); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 4af2855cca39e..fdbc0cb4b1f80 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2706,7 +2706,7 @@ export interface ExtHostTestingShape { /** Expands a test item's children, by the given number of levels. */ $expandTest(testId: string, levels: number): Promise; /** Requests coverage details for a test run. Errors if not available. */ - $getCoverageDetails(coverageId: string, token: CancellationToken): Promise; + $getCoverageDetails(coverageId: string, testId: string | undefined, token: CancellationToken): Promise; /** Disposes resources associated with a test run. */ $disposeRun(runId: string): void; /** Configures a test run config. */ diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index 19bd3f98efea1..87e19f8342709 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -263,8 +263,8 @@ export class ExtHostTesting extends Disposable implements ExtHostTestingShape { /** * @inheritdoc */ - async $getCoverageDetails(coverageId: string, token: CancellationToken): Promise { - const details = await this.runTracker.getCoverageDetails(coverageId, token); + async $getCoverageDetails(coverageId: string, testId: string | undefined, token: CancellationToken): Promise { + const details = await this.runTracker.getCoverageDetails(coverageId, testId, token); return details?.map(Convert.TestCoverage.fromDetails); } @@ -526,7 +526,7 @@ class TestRunTracker extends Disposable { private readonly cts: CancellationTokenSource; private readonly endEmitter = this._register(new Emitter()); private readonly onDidDispose: Event; - private readonly publishedCoverage = new Map(); + private readonly publishedCoverage = new Map(); /** * Fires when a test ends, and no more tests are left running. @@ -591,19 +591,29 @@ class TestRunTracker extends Disposable { } /** Gets details for a previously-emitted coverage object. */ - public getCoverageDetails(id: string, token: CancellationToken) { + public getCoverageDetails(id: string, testId: string | undefined, token: CancellationToken) { const [, taskId] = TestId.fromString(id).path; /** runId, taskId, URI */ const coverage = this.publishedCoverage.get(id); if (!coverage) { return []; } + const { report, extIds } = coverage; const task = this.tasks.get(taskId); if (!task) { throw new Error('unreachable: run task was not found'); } - return this.profile?.loadDetailedCoverage?.(task.run, coverage, token) ?? []; + let testItem: vscode.TestItem | undefined; + if (testId && report instanceof FileCoverage) { + const index = extIds.indexOf(testId); + if (index === -1) { + return []; // ?? + } + testItem = report.fromTests[index]; + } + + return (this.profile as vscode.TestRunProfile2)?.loadDetailedCoverage?.(task.run, report, token, testItem) ?? []; } /** Creates the public test run interface to give to extensions. */ @@ -643,7 +653,6 @@ class TestRunTracker extends Disposable { // one-off map used to associate test items with incrementing IDs in `addCoverage`. // There's no need to include their entire ID, we just want to make sure they're // stable and unique. Normal map is okay since TestRun lifetimes are limited. - const testItemCoverageId = new Map(); const run: vscode.TestRun = { isPersisted: this.dto.isPersisted, token: this.cts.token, @@ -654,24 +663,21 @@ class TestRunTracker extends Disposable { return; } - const testItem = coverage instanceof FileCoverage ? coverage.testItem : undefined; - let testItemIdPart: undefined | number; - if (testItem) { + const fromTests = coverage instanceof FileCoverage ? coverage.fromTests : []; + if (fromTests.length) { checkProposedApiEnabled(this.extension, 'attributableCoverage'); - this.ensureTestIsKnown(testItem); - testItemIdPart = testItemCoverageId.get(testItem); - if (testItemIdPart === undefined) { - testItemIdPart = testItemCoverageId.size; - testItemCoverageId.set(testItem, testItemIdPart); + for (const test of fromTests) { + this.ensureTestIsKnown(test); } } const uriStr = coverage.uri.toString(); - const id = new TestId(testItemIdPart !== undefined - ? [runId, taskId, uriStr, String(testItemIdPart)] - : [runId, taskId, uriStr], - ).toString(); - this.publishedCoverage.set(id, coverage); + const id = new TestId([runId, taskId, uriStr]).toString(); + // it's a lil funky, but it's possible for a test item's ID to change after + // it's been reported if it's rehomed under a different parent. Record its + // ID at the time when the coverage report is generated so we can reference + // it later if needeed. + this.publishedCoverage.set(id, { report: coverage, extIds: fromTests.map(t => TestId.fromExtHostTestItem(t, ctrlId).toString()) }); this.proxy.$appendCoverage(runId, taskId, Convert.TestCoverage.fromFile(ctrlId, id, coverage)); }, //#region state mutation @@ -719,7 +725,6 @@ class TestRunTracker extends Disposable { } ended = true; - testItemCoverageId.clear(); this.proxy.$finishedTestRunTask(runId, taskId); if (!--this.running) { this.markEnded(); @@ -803,9 +808,9 @@ export class TestRunCoordinator { /** * Gets a coverage report for a given run and task ID. */ - public getCoverageDetails(id: string, token: vscode.CancellationToken) { + public getCoverageDetails(id: string, testId: string | undefined, token: vscode.CancellationToken) { const runId = TestId.root(id); - return this.trackedById.get(runId)?.getCoverageDetails(id, token) || []; + return this.trackedById.get(runId)?.getCoverageDetails(id, testId, token) || []; } /** diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 8ab0c30c428c4..fe20f202483cf 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2065,8 +2065,8 @@ export namespace TestCoverage { statement: fromCoverageCount(coverage.statementCoverage), branch: coverage.branchCoverage && fromCoverageCount(coverage.branchCoverage), declaration: coverage.declarationCoverage && fromCoverageCount(coverage.declarationCoverage), - testId: coverage instanceof types.FileCoverage && coverage.testItem ? - TestId.fromExtHostTestItem(coverage.testItem, controllerId).toString() : undefined, + testIds: coverage instanceof types.FileCoverage && coverage.fromTests.length ? + coverage.fromTests.map(t => TestId.fromExtHostTestItem(t, controllerId).toString()) : undefined, }; } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index a96c5570a1bfa..65854c6551230 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4119,7 +4119,7 @@ export class FileCoverage implements vscode.FileCoverage { public statementCoverage: vscode.TestCoverageCount, public branchCoverage?: vscode.TestCoverageCount, public declarationCoverage?: vscode.TestCoverageCount, - public testItem?: vscode.TestItem, + public fromTests: vscode.TestItem[] = [], ) { } } diff --git a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts index a4ba28d633489..7df6d971fa8fc 100644 --- a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts @@ -58,8 +58,6 @@ const TOGGLE_INLINE_COMMAND_ID = 'testing.toggleInlineCoverage'; const BRANCH_MISS_INDICATOR_CHARS = 4; export class CodeCoverageDecorations extends Disposable implements IEditorContribution { - private static readonly fileCoverageDecorations = new WeakMap(); - private loadingCancellation?: CancellationTokenSource; private readonly displayedStore = this._register(new DisposableStore()); private readonly hoveredStore = this._register(new DisposableStore()); @@ -97,24 +95,19 @@ export class CodeCoverageDecorations extends Disposable implements IEditorContri return; } - let file = report.getUri(model.uri); - if (file) { - const testFilter = coverage.filterToTest.read(reader); - if (testFilter) { - file = file.perTestData?.get(testFilter.toString()) || file; - } - - return file; + const file = report.getUri(model.uri); + if (!file) { + return; } report.didAddCoverage.read(reader); // re-read if changes when there's no report - return undefined; + return { file, testId: coverage.filterToTest.read(reader) }; }); this._register(autorun(reader => { const c = fileCoverage.read(reader); if (c) { - this.apply(editor.getModel()!, c, coverage.showInline.read(reader)); + this.apply(editor.getModel()!, c.file, c.testId, coverage.showInline.read(reader)); } else { this.clear(); } @@ -124,9 +117,9 @@ export class CodeCoverageDecorations extends Disposable implements IEditorContri this._register(autorun(reader => { const c = fileCoverage.read(reader); if (c && toolbarEnabled.read(reader)) { - this.summaryWidget.value.setCoverage(c); + this.summaryWidget.value.setCoverage(c.file, c.testId); } else { - this.summaryWidget.rawValue?.setCoverage(undefined); + this.summaryWidget.rawValue?.clearCoverage(); } })); @@ -265,8 +258,8 @@ export class CodeCoverageDecorations extends Disposable implements IEditorContri })); } - private async apply(model: ITextModel, coverage: FileCoverage, showInlineByDefault: boolean) { - const details = this.details = await this.loadDetails(coverage, model); + private async apply(model: ITextModel, coverage: FileCoverage, testId: TestId | undefined, showInlineByDefault: boolean) { + const details = this.details = await this.loadDetails(coverage, testId, model); if (!details) { return this.clear(); } @@ -351,24 +344,18 @@ export class CodeCoverageDecorations extends Disposable implements IEditorContri this.hoveredStore.clear(); } - private async loadDetails(coverage: FileCoverage, textModel: ITextModel) { - const existing = CodeCoverageDecorations.fileCoverageDecorations.get(coverage); - if (existing) { - return existing; - } - + private async loadDetails(coverage: FileCoverage, testId: TestId | undefined, textModel: ITextModel) { const cts = this.loadingCancellation = new CancellationTokenSource(); this.displayedStore.add(this.loadingCancellation); try { - const details = await coverage.details(this.loadingCancellation.token); + const details = testId + ? await coverage.detailsForTest(testId, this.loadingCancellation.token) + : await coverage.details(this.loadingCancellation.token); if (cts.token.isCancellationRequested) { return; } - const model = CodeCoverageDecorations.fileCoverageDecorations.get(coverage) - || new CoverageDetailsModel(details, textModel); - CodeCoverageDecorations.fileCoverageDecorations.set(coverage, model); - return model; + return new CoverageDetailsModel(details, textModel); } catch (e) { this.log.error('Error loading coverage details', e); } @@ -538,7 +525,7 @@ function wrapName(functionNameOrCode: string) { } class CoverageToolbarWidget extends Disposable implements IOverlayWidget { - private current: FileCoverage | undefined; + private current: { coverage: FileCoverage; testId: TestId | undefined } | undefined; private registered = false; private isRunning = false; private readonly showStore = this._register(new DisposableStore()); @@ -613,8 +600,14 @@ class CoverageToolbarWidget extends Disposable implements IOverlayWidget { }; } - public setCoverage(coverage: FileCoverage | undefined) { - this.current = coverage; + public clearCoverage() { + this.current = undefined; + this.bars.setCoverageInfo(undefined); + this.hide(); + } + + public setCoverage(coverage: FileCoverage, testId: TestId | undefined) { + this.current = { coverage, testId }; this.bars.setCoverageInfo(coverage); if (!coverage) { @@ -627,8 +620,8 @@ class CoverageToolbarWidget extends Disposable implements IOverlayWidget { private setActions() { this.actionBar.clear(); - const coverage = this.current; - if (!coverage) { + const current = this.current; + if (!current) { return; } @@ -649,21 +642,21 @@ class CoverageToolbarWidget extends Disposable implements IOverlayWidget { this.actionBar.push(toggleAction); - if (coverage.isForTest) { - const testItem = coverage.fromResult.getTestById(coverage.isForTest.id.toString()); + if (current.testId) { + const testItem = current.coverage.fromResult.getTestById(current.testId.toString()); assert(!!testItem, 'got coverage for an unreported test'); this.actionBar.push(new ActionWithIcon('perTestFilter', coverUtils.labels.showingFilterFor(testItem.label), testingFilterIcon, undefined, - () => this.commandService.executeCommand(TestCommandId.CoverageFilterToTestInEditor, this.current), + () => this.commandService.executeCommand(TestCommandId.CoverageFilterToTestInEditor, this.current, this.editor), )); - } else if (coverage.perTestData?.size) { + } else if (current.coverage.perTestData?.size) { this.actionBar.push(new ActionWithIcon('perTestFilter', - localize('testing.coverageForTestAvailable', "{0} test(s) ran code in this file", coverage.perTestData.size), + localize('testing.coverageForTestAvailable', "{0} test(s) ran code in this file", current.coverage.perTestData.size), testingFilterIcon, undefined, - () => this.commandService.executeCommand(TestCommandId.CoverageFilterToTestInEditor, this.current), + () => this.commandService.executeCommand(TestCommandId.CoverageFilterToTestInEditor, this.current, this.editor), )); } @@ -705,8 +698,8 @@ class CoverageToolbarWidget extends Disposable implements IOverlayWidget { })); ds.add(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(TestingConfigKeys.CoverageBarThresholds) || e.affectsConfiguration(TestingConfigKeys.CoveragePercent)) { - this.setCoverage(this.current); + if (this.current && (e.affectsConfiguration(TestingConfigKeys.CoverageBarThresholds) || e.affectsConfiguration(TestingConfigKeys.CoveragePercent))) { + this.setCoverage(this.current.coverage, this.current.testId); } })); } @@ -716,7 +709,7 @@ class CoverageToolbarWidget extends Disposable implements IOverlayWidget { if (current) { this.isRunning = true; this.setActions(); - this.testService.runResolvedTests(current.fromResult.request).finally(() => { + this.testService.runResolvedTests(current.coverage.fromResult.request).finally(() => { this.isRunning = false; this.setActions(); }); @@ -802,10 +795,10 @@ registerAction2(class FilterCoverageToTestInEditor extends Action2 { }); } - run(accessor: ServicesAccessor, coverageOrUri?: FileCoverage | URI): void { + run(accessor: ServicesAccessor, coverageOrUri?: FileCoverage | URI, editor?: ICodeEditor): void { const testCoverageService = accessor.get(ITestCoverageService); const quickInputService = accessor.get(IQuickInputService); - const activeEditor = accessor.get(ICodeEditorService).getActiveCodeEditor(); + const activeEditor = editor ?? accessor.get(ICodeEditorService).getActiveCodeEditor(); let coverage: FileCoverage | undefined; if (coverageOrUri instanceof FileCoverage) { coverage = coverageOrUri; @@ -816,26 +809,21 @@ registerAction2(class FilterCoverageToTestInEditor extends Action2 { coverage = uri && testCoverageService.selected.get()?.getUri(uri); } - if (!coverage || !(coverage.isForTest || coverage.perTestData?.size)) { - return; - } - - const options = coverage?.perTestData ?? coverage?.isForTest?.parent.perTestData; - if (!options) { + if (!coverage || !coverage.perTestData?.size) { return; } - const tests = [...options.values()]; - const commonPrefix = TestId.getLengthOfCommonPrefix(tests.length, i => tests[i].isForTest!.id); + const tests = [...coverage.perTestData].map(TestId.fromString); + const commonPrefix = TestId.getLengthOfCommonPrefix(tests.length, i => tests[i]); const result = coverage.fromResult; const previousSelection = testCoverageService.filterToTest.get(); - type TItem = { label: string; description?: string; item: FileCoverage | undefined }; + type TItem = { label: string; testId: TestId | undefined }; const items: QuickPickInput[] = [ - { label: coverUtils.labels.allTests, item: undefined }, + { label: coverUtils.labels.allTests, testId: undefined }, { type: 'separator' }, - ...tests.map(item => ({ label: coverUtils.getLabelForItem(result, item.isForTest!.id, commonPrefix), description: coverUtils.labels.percentCoverage(item.tpc), item })), + ...tests.map(id => ({ label: coverUtils.getLabelForItem(result, id, commonPrefix), testId: id })), ]; // These handle the behavior that reveals the start of coverage when the @@ -848,13 +836,13 @@ registerAction2(class FilterCoverageToTestInEditor extends Action2 { activeItem: items.find((item): item is TItem => 'item' in item && item.item === coverage), placeHolder: coverUtils.labels.pickShowCoverage, onDidFocus: (entry) => { - if (!entry.item) { + if (!entry.testId) { revealScrollCts.clear(); activeEditor?.setScrollTop(scrollTop); testCoverageService.filterToTest.set(undefined, undefined); } else { const cts = revealScrollCts.value = new CancellationTokenSource(); - entry.item.details(cts.token).then( + coverage.detailsForTest(entry.testId, cts.token).then( details => { const first = details.find(d => d.type === DetailType.Statement); if (!cts.token.isCancellationRequested && first) { @@ -863,7 +851,7 @@ registerAction2(class FilterCoverageToTestInEditor extends Action2 { }, () => { /* ignored */ } ); - testCoverageService.filterToTest.set(entry.item.isForTest!.id, undefined); + testCoverageService.filterToTest.set(entry.testId, undefined); } }, }).then(selected => { @@ -872,7 +860,7 @@ registerAction2(class FilterCoverageToTestInEditor extends Action2 { } revealScrollCts.dispose(); - testCoverageService.filterToTest.set(selected ? selected.item?.isForTest!.id : previousSelection, undefined); + testCoverageService.filterToTest.set(selected ? selected.testId : previousSelection, undefined); }); } }); diff --git a/src/vs/workbench/contrib/testing/browser/testCoverageView.ts b/src/vs/workbench/contrib/testing/browser/testCoverageView.ts index 8e67eebd282c9..26ecefd409a7f 100644 --- a/src/vs/workbench/contrib/testing/browser/testCoverageView.ts +++ b/src/vs/workbench/contrib/testing/browser/testCoverageView.ts @@ -643,7 +643,7 @@ registerAction2(class TestCoverageChangePerTestFilterAction extends Action2 { return; } - const tests = [...coverage.perTestCoverageIDs].map(TestId.fromString); + const tests = [...coverage.allPerTestIDs()].map(TestId.fromString); const commonPrefix = TestId.getLengthOfCommonPrefix(tests.length, i => tests[i]); const result = coverage.result; const previousSelection = coverageService.filterToTest.get(); diff --git a/src/vs/workbench/contrib/testing/common/testCoverage.ts b/src/vs/workbench/contrib/testing/common/testCoverage.ts index 321434bd6029a..aae8f0af3622e 100644 --- a/src/vs/workbench/contrib/testing/common/testCoverage.ts +++ b/src/vs/workbench/contrib/testing/common/testCoverage.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { assert } from 'vs/base/common/assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ResourceMap } from 'vs/base/common/map'; import { deepClone } from 'vs/base/common/objects'; @@ -13,10 +12,10 @@ import { URI } from 'vs/base/common/uri'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; -import { CoverageDetails, ICoverageCount, IFileCoverage } from 'vs/workbench/contrib/testing/common/testTypes'; +import { CoverageDetails, DetailType, ICoverageCount, IFileCoverage } from 'vs/workbench/contrib/testing/common/testTypes'; export interface ICoverageAccessor { - getCoverageDetails: (id: string, token: CancellationToken) => Promise; + getCoverageDetails: (id: string, testId: string | undefined, token: CancellationToken) => Promise; } let incId = 0; @@ -30,9 +29,6 @@ export class TestCoverage { public readonly tree = new WellDefinedPrefixTree(); public readonly associatedData = new Map(); - /** Test IDs that have per-test coverage in this output. */ - public readonly perTestCoverageIDs = new Set(); - constructor( public readonly result: LiveTestResult, public readonly fromTaskId: string, @@ -40,6 +36,21 @@ export class TestCoverage { private readonly accessor: ICoverageAccessor, ) { } + /** Gets all test IDs that were included in this test run. */ + public *allPerTestIDs() { + const seen = new Set(); + for (const root of this.tree.nodes) { + if (root.value && root.value.perTestData) { + for (const id of root.value.perTestData) { + if (!seen.has(id)) { + seen.add(id); + yield id; + } + } + } + } + } + public append(coverage: IFileCoverage, tx: ITransaction | undefined) { const previous = this.getComputedForUri(coverage.uri); const result = this.result; @@ -59,24 +70,13 @@ export class TestCoverage { // version. const canonical = [...this.treePathForUri(coverage.uri, /* canonical = */ true)]; const chain: IPrefixTreeNode[] = []; - const isPerTestCoverage = !!coverage.testId; - if (coverage.testId) { - this.perTestCoverageIDs.add(coverage.testId.toString()); - } + this.tree.mutatePath(this.treePathForUri(coverage.uri, /* canonical = */ false), node => { chain.push(node); if (chain.length === canonical.length) { // we reached our destination node, apply the coverage as necessary: - if (isPerTestCoverage) { - const v = node.value ??= new FileCoverage(IFileCoverage.empty(String(incId++), coverage.uri), result, this.accessor); - assert(v instanceof FileCoverage, 'coverage is unexpectedly computed'); - v.perTestData ??= new Map(); - const perTest = new FileCoverage(coverage, result, this.accessor); - perTest.isForTest = { id: coverage.testId!, parent: v }; - v.perTestData.set(coverage.testId!.toString(), perTest); - this.fileCoverage.set(coverage.uri, v); - } else if (node.value) { + if (node.value) { const v = node.value; // if ID was generated from a test-specific coverage, reassign it to get its real ID in the extension host. v.id = coverage.id; @@ -87,7 +87,7 @@ export class TestCoverage { const v = node.value = new FileCoverage(coverage, result, this.accessor); this.fileCoverage.set(coverage.uri, v); } - } else if (!isPerTestCoverage) { + } else { // Otherwise, if this is not a partial per-test coverage, merge the // coverage changes into the chain. Per-test coverages are not complete // and we don't want to consider them for computation. @@ -104,9 +104,16 @@ export class TestCoverage { node.value.didChange.trigger(tx); } } + + if (coverage.testIds) { + node.value!.perTestData ??= new Set(); + for (const id of coverage.testIds) { + node.value!.perTestData.add(id); + } + } }); - if (chain && !isPerTestCoverage) { + if (chain) { this.didAddCoverage.trigger(tx, chain); } } @@ -118,21 +125,15 @@ export class TestCoverage { const tree = new WellDefinedPrefixTree(); for (const node of this.tree.values()) { if (node instanceof FileCoverage) { - const fileData = node.perTestData?.get(testId.toString()); - if (!fileData) { + if (!node.perTestData?.has(testId.toString())) { continue; } - const canonical = [...this.treePathForUri(fileData.uri, /* canonical = */ true)]; + const canonical = [...this.treePathForUri(node.uri, /* canonical = */ true)]; const chain: IPrefixTreeNode[] = []; - tree.mutatePath(this.treePathForUri(fileData.uri, /* canonical = */ false), node => { - chain.push(node); - - if (chain.length === canonical.length) { - node.value = fileData; - } else { - node.value ??= new BypassedFileCoverage(this.treePathToUri(canonical.slice(0, chain.length)), fileData.fromResult); - } + tree.mutatePath(this.treePathForUri(node.uri, /* canonical = */ false), n => { + chain.push(n); + n.value ??= new BypassedFileCoverage(this.treePathToUri(canonical.slice(0, chain.length)), node.fromResult); }); } } @@ -208,6 +209,11 @@ export abstract class AbstractFileCoverage { return getTotalCoveragePercent(this.statement, this.branch, this.declaration); } + /** + * Per-test coverage data for this file, if available. + */ + public perTestData?: Set; + constructor(coverage: IFileCoverage, public readonly fromResult: LiveTestResult) { this.id = coverage.id; this.uri = coverage.uri; @@ -235,31 +241,46 @@ export class BypassedFileCoverage extends ComputedFileCoverage { export class FileCoverage extends AbstractFileCoverage { private _details?: Promise; private resolved?: boolean; + private _detailsForTest?: Map>; /** Gets whether details are synchronously available */ public get hasSynchronousDetails() { return this._details instanceof Array || this.resolved; } - /** - * Per-test coverage data for this file, if available. - */ - public perTestData?: Map; + constructor(coverage: IFileCoverage, fromResult: LiveTestResult, private readonly accessor: ICoverageAccessor) { + super(coverage, fromResult); + } /** - * If this is for a single test item, gets the test item. + * Gets per-line coverage details. */ - public isForTest?: { id: TestId; parent: FileCoverage }; + public async detailsForTest(_testId: TestId, token = CancellationToken.None) { + this._detailsForTest ??= new Map(); + const testId = _testId.toString(); + const prev = this._detailsForTest.get(testId); + if (prev) { + return prev; + } - constructor(coverage: IFileCoverage, fromResult: LiveTestResult, private readonly accessor: ICoverageAccessor) { - super(coverage, fromResult); + const promise = (async () => { + try { + return await this.accessor.getCoverageDetails(this.id, testId, token); + } catch (e) { + this._detailsForTest?.delete(testId); + throw e; + } + })(); + + this._detailsForTest.set(testId, promise); + return promise; } /** * Gets per-line coverage details. */ public async details(token = CancellationToken.None) { - this._details ??= this.accessor.getCoverageDetails(this.id, token); + this._details ??= this.accessor.getCoverageDetails(this.id, undefined, token); try { const d = await this._details; @@ -271,3 +292,30 @@ export class FileCoverage extends AbstractFileCoverage { } } } + +export const totalFromCoverageDetails = (uri: URI, details: CoverageDetails[]): IFileCoverage => { + const fc: IFileCoverage = { + id: '', + uri, + statement: ICoverageCount.empty(), + }; + + for (const detail of details) { + if (detail.type === DetailType.Statement) { + fc.statement.total++; + fc.statement.total += detail.count ? 1 : 0; + + for (const branch of detail.branches || []) { + fc.branch ??= ICoverageCount.empty(); + fc.branch.total++; + fc.branch.covered += branch.count ? 1 : 0; + } + } else { + fc.declaration ??= ICoverageCount.empty(); + fc.declaration.total++; + fc.declaration.covered += detail.count ? 1 : 0; + } + } + + return fc; +}; diff --git a/src/vs/workbench/contrib/testing/common/testCoverageService.ts b/src/vs/workbench/contrib/testing/common/testCoverageService.ts index 9dfbb798a612a..4433a713d2caa 100644 --- a/src/vs/workbench/contrib/testing/common/testCoverageService.ts +++ b/src/vs/workbench/contrib/testing/common/testCoverageService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { Iterable } from 'vs/base/common/iterator'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { IObservable, ISettableObservable, observableValue, transaction } from 'vs/base/common/observable'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -89,7 +90,7 @@ export class TestCoverageService extends Disposable implements ITestCoverageServ this._register(bindContextKey( TestingContextKeys.hasPerTestCoverage, contextKeyService, - reader => !!this.selected.read(reader)?.perTestCoverageIDs.size, + reader => !Iterable.isEmpty(this.selected.read(reader)?.allPerTestIDs()), )); this._register(bindContextKey( diff --git a/src/vs/workbench/contrib/testing/common/testTypes.ts b/src/vs/workbench/contrib/testing/common/testTypes.ts index 941ead406119b..5a90948fc68b5 100644 --- a/src/vs/workbench/contrib/testing/common/testTypes.ts +++ b/src/vs/workbench/contrib/testing/common/testTypes.ts @@ -573,7 +573,7 @@ export namespace ICoverageCount { export interface IFileCoverage { id: string; uri: URI; - testId?: TestId; + testIds?: string[]; statement: ICoverageCount; branch?: ICoverageCount; declaration?: ICoverageCount; @@ -583,7 +583,7 @@ export namespace IFileCoverage { export interface Serialized { id: string; uri: UriComponents; - testId: string | undefined; + testIds: string[] | undefined; statement: ICoverageCount; branch?: ICoverageCount; declaration?: ICoverageCount; @@ -594,7 +594,7 @@ export namespace IFileCoverage { statement: original.statement, branch: original.branch, declaration: original.declaration, - testId: original.testId?.toString(), + testIds: original.testIds, uri: original.uri.toJSON(), }); @@ -603,14 +603,13 @@ export namespace IFileCoverage { statement: serialized.statement, branch: serialized.branch, declaration: serialized.declaration, - testId: serialized.testId ? TestId.fromString(serialized.testId) : undefined, + testIds: serialized.testIds, uri: uriIdentity.asCanonicalUri(URI.revive(serialized.uri)), }); export const empty = (id: string, uri: URI): IFileCoverage => ({ id, uri, - testId: undefined, statement: ICoverageCount.empty(), }); } diff --git a/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts b/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts index c4ff9a8875331..9ab4c5536497d 100644 --- a/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testCoverage.test.ts @@ -10,12 +10,10 @@ import assert from 'assert'; import { SinonSandbox, createSandbox } from 'sinon'; -import { Iterable } from 'vs/base/common/iterator'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { onObservableChange } from 'vs/workbench/contrib/testing/common/observableUtils'; import { ICoverageAccessor, TestCoverage } from 'vs/workbench/contrib/testing/common/testCoverage'; -import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { IFileCoverage } from 'vs/workbench/contrib/testing/common/testTypes'; @@ -133,58 +131,4 @@ suite('TestCoverage', () => { ], ]); }); - - test('adds per-test data to files', async () => { - const { raw1 } = addTests(); - - const raw3: IFileCoverage = { - id: '1', - testId: TestId.fromString('my-test'), - uri: URI.file('/path/to/file'), - statement: { covered: 12, total: 24 }, - branch: { covered: 7, total: 10 }, - declaration: { covered: 2, total: 5 }, - }; - testCoverage.append(raw3, undefined); - - const fileCoverage = testCoverage.getUri(raw1.uri); - assert.strictEqual(fileCoverage?.perTestData?.size, 1); - - const perTestCoverage = Iterable.first(fileCoverage!.perTestData!.values()); - assert.deepStrictEqual(perTestCoverage?.statement, raw3.statement); - assert.deepStrictEqual(perTestCoverage?.branch, raw3.branch); - assert.deepStrictEqual(perTestCoverage?.declaration, raw3.declaration); - - // should be unchanged: - assert.deepEqual(fileCoverage?.statement, { covered: 10, total: 20 }); - const dirCoverage = testCoverage.getComputedForUri(URI.file('/path/to')); - assert.deepEqual(dirCoverage?.statement, { covered: 15, total: 30 }); - }); - - test('works if per-test data is added first', async () => { - const raw3: IFileCoverage = { - id: '1', - testId: TestId.fromString('my-test'), - uri: URI.file('/path/to/file'), - statement: { covered: 12, total: 24 }, - branch: { covered: 7, total: 10 }, - declaration: { covered: 2, total: 5 }, - }; - testCoverage.append(raw3, undefined); - - const fileCoverage = testCoverage.getUri(raw3.uri); - - addTests(); - - assert.strictEqual(fileCoverage?.perTestData?.size, 1); - const perTestCoverage = Iterable.first(fileCoverage!.perTestData!.values()); - assert.deepStrictEqual(perTestCoverage?.statement, raw3.statement); - assert.deepStrictEqual(perTestCoverage?.branch, raw3.branch); - assert.deepStrictEqual(perTestCoverage?.declaration, raw3.declaration); - - // should be the expected values: - assert.deepEqual(fileCoverage?.statement, { covered: 10, total: 20 }); - const dirCoverage = testCoverage.getComputedForUri(URI.file('/path/to')); - assert.deepEqual(dirCoverage?.statement, { covered: 15, total: 30 }); - }); }); diff --git a/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts b/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts index 63000738c0f3d..86b8edbc41061 100644 --- a/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts +++ b/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts @@ -6,23 +6,38 @@ declare module 'vscode' { export class FileCoverage2 extends FileCoverage { /** - * Test {@link TestItem} this file coverage is generated from. If undefined, - * the editor will assume the coverage is the overall summary coverage for - * the entire file. - * - * If per-test coverage is available, an extension should append multiple - * `FileCoverage` instances with this property set for each test item. It - * must also append a `FileCoverage` instance without this property set to - * represent the overall coverage of the file. + * A list of {@link TestItem test cases} that generated coverage in this + * file. If set, test items may be passed in {@link TestRunProfile.loadDetailedCoverage} + * to request coverage information generated by a specific test case in + * the file. */ - testItem?: TestItem; + fromTests: TestItem[]; constructor( uri: Uri, statementCoverage: TestCoverageCount, branchCoverage?: TestCoverageCount, declarationCoverage?: TestCoverageCount, - testItem?: TestItem, + fromTests?: TestItem[], ); } + + export interface TestRunProfile2 { + /** + * An extension-provided function that provides detailed statement and + * function-level coverage for a file. The editor will call this when more + * detail is needed for a file, such as when it's opened in an editor or + * expanded in the **Test Coverage** view. + * + * The {@link FileCoverage} object passed to this function is the same instance + * emitted on {@link TestRun.addCoverage} calls associated with this profile. + * + * @param testRun The test run that generated the coverage data. + * @param fileCoverage The file coverage object to load detailed coverage for. + * @param token A cancellation token that indicates the operation should be cancelled. + * @param fromTestItem If provided, requests coverage for a specific test in the + * file. This is only set if tests are added in {@link FileCoverage.fromTests}. + */ + loadDetailedCoverage?: (testRun: TestRun, fileCoverage: FileCoverage, token: CancellationToken, fromTestItem?: TestItem) => Thenable; + } } From 789d05ac49cd82366dbabf7fe216b3cab20ac1fa Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 14 Jun 2024 12:00:55 -0700 Subject: [PATCH 245/755] Fix #215544. Fix notebook scoped instantiation service. --- .../browser/services/notebookEditorServiceImpl.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookEditorServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookEditorServiceImpl.ts index 4be07da63b7b4..5b1360f0ca8f7 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookEditorServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookEditorServiceImpl.ts @@ -19,6 +19,8 @@ import { URI } from 'vs/base/common/uri'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { InteractiveWindowOpen } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IEditorProgressService } from 'vs/platform/progress/common/progress'; export class NotebookEditorWidgetService implements INotebookEditorService { @@ -39,7 +41,8 @@ export class NotebookEditorWidgetService implements INotebookEditorService { constructor( @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IEditorService editorService: IEditorService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IInstantiationService private readonly instantiationService: IInstantiationService ) { const groupListener = new Map(); @@ -182,9 +185,13 @@ export class NotebookEditorWidgetService implements INotebookEditorService { if (!value) { // NEW widget - const instantiationService = accessor.get(IInstantiationService); + const editorGroupContextKeyService = accessor.get(IContextKeyService); + const editorGroupEditorProgressService = accessor.get(IEditorProgressService); + const notebookInstantiationService = this.instantiationService.createChild(new ServiceCollection( + [IContextKeyService, editorGroupContextKeyService], + [IEditorProgressService, editorGroupEditorProgressService])); const ctorOptions = creationOptions ?? getDefaultNotebookCreationOptions(); - const widget = instantiationService.createInstance(NotebookEditorWidget, { + const widget = notebookInstantiationService.createInstance(NotebookEditorWidget, { ...ctorOptions, codeWindow: codeWindow ?? ctorOptions.codeWindow, }, initialDimension); From ce3f763edb6d3cea57089358183756bbd7ecd2a4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:15:38 -0700 Subject: [PATCH 246/755] Add . and .. to suggestions, do nothing is completing same Fixes #211996 --- .../terminal/browser/media/shellIntegration.ps1 | 14 +++++++++++++- .../suggest/browser/terminalSuggestAddon.ts | 8 ++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 index 6035e21784c8d..c2c8664780e25 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 @@ -207,7 +207,19 @@ function Send-Completions { $completions = TabExpansion2 -inputScript $completionPrefix -cursorColumn $cursorIndex if ($null -ne $completions.CompletionMatches) { $result += ";$($completions.ReplacementIndex);$($completions.ReplacementLength);$($cursorIndex);" - $result += $completions.CompletionMatches | ConvertTo-Json -Compress + if ($completions.CompletionMatches.Count -gt 0 -and $completions.CompletionMatches.Where({ $_.ResultType -eq 3 -or $_.ResultType -eq 4 })) { + $json = [System.Collections.ArrayList]@($completions.CompletionMatches) + # Add . and .. to the completions list + $json.Add([System.Management.Automation.CompletionResult]::new( + '.', '.', [System.Management.Automation.CompletionResultType]::ProviderContainer, (Get-Location).Path) + ) + $json.Add([System.Management.Automation.CompletionResult]::new( + '..', '..', [System.Management.Automation.CompletionResultType]::ProviderContainer, (Split-Path (Get-Location) -Parent)) + ) + $result += $json | ConvertTo-Json -Compress + } else { + $result += $completions.CompletionMatches | ConvertTo-Json -Compress + } } } # If there is no space, get completions using CompletionCompleters as it gives us more diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts index 499b4a410d095..90170614e53c5 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts @@ -267,6 +267,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest if (!Array.isArray(completionList)) { completionList = [completionList]; } + const completions = completionList.map((e: any) => { return new SimpleCompletionItem({ label: e.ListItemText, @@ -278,6 +279,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest this._leadingLineContent = this._promptInputModel.value.substring(0, this._promptInputModel.cursorIndex); + // If there's no space it means this is a command, add cached commands list to completions const firstChar = this._leadingLineContent.length === 0 ? '' : this._leadingLineContent[0]; if (this._leadingLineContent.trim().includes(' ') || firstChar === '[') { @@ -503,6 +505,12 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest const completionText = completion.completionText ?? completion.label; const finalCompletionRightSide = completionText.substring((this._leadingLineContent?.length ?? 0) - (lastSpaceIndex === -1 ? 0 : lastSpaceIndex + 1)); + // Hide the widget if there is no change + if (finalCompletionRightSide === additionalInput) { + this.hideSuggestWidget(); + return; + } + // Get the final completion on the right side of the cursor if it differs from the initial // propmt input state let finalCompletionLeftSide = completionText.substring(0, (this._leadingLineContent?.length ?? 0) - (lastSpaceIndex === -1 ? 0 : lastSpaceIndex + 1)); From 733f8b85266ed228cf1e465f3c23c22b47df22d5 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:59:58 -0700 Subject: [PATCH 247/755] Remove bad expected behavior from test --- .../browser/recordings/windows11_pwsh_input_ls_complete_ls.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_input_ls_complete_ls.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_input_ls_complete_ls.ts index 8153f026abcf0..41a77c74b3f5d 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_input_ls_complete_ls.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_input_ls_complete_ls.ts @@ -81,10 +81,6 @@ export const events = [ "type": "command", "id": "workbench.action.terminal.acceptSelectedSuggestion" }, - { - "type": "sendText", - "data": "s" - }, { "type": "output", "data": "\u001b[?25l\u001b[93m\u001b[3;3Hls\u001b[97m\u001b[2m\u001b[3ms\b\u001b[?25h" From 608fe4f38c0ac34503c88eae581838ec2cefbc8a Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Fri, 14 Jun 2024 15:12:29 -0700 Subject: [PATCH 248/755] REPL/IW editor only using a notebook text model (#214356) * registered editor with notebook model * migrated some stuff from Interactive Editor * display notebook and input box * dont always filter kernels by view * fix restore * implement some commands * working copy recovery/discarding * fix tear down * do not show last cell * simplify notebookOptions creation * reset text model on execute * fix run button * set tab name * use differentiated notebooktype to determine kernel * allow registering notebooks as other priorities * conditionally register actions * move registerAction back to top level * fix input box message * naming * dont register extra repl commands for now * use jupyter-notebook notebook type * set scratchpad on backup recovery * remove unused method --- extensions/ipynb/package.json | 3 +- src/vs/platform/actions/common/actions.ts | 1 + .../workbench/api/common/extHostNotebook.ts | 4 +- .../browser/interactive.contribution.ts | 69 +- .../interactive/browser/interactiveEditor.ts | 2 +- .../notebook/browser/controller/apiActions.ts | 2 +- .../browser/diff/notebookDiffEditor.ts | 6 +- .../notebook/browser/notebook.contribution.ts | 6 +- .../notebook/browser/notebookBrowser.ts | 9 +- .../notebook/browser/notebookEditorWidget.ts | 16 +- .../notebook/browser/notebookOptions.ts | 8 +- .../notebookKernelHistoryServiceImpl.ts | 2 +- .../services/notebookKernelServiceImpl.ts | 14 +- .../browser/services/notebookServiceImpl.ts | 6 +- .../viewModel/notebookViewModelImpl.ts | 16 +- .../common/model/notebookTextModel.ts | 4 + .../contrib/notebook/common/notebookCommon.ts | 14 +- .../notebook/common/notebookContextKeys.ts | 6 +- .../notebook/common/notebookEditorInput.ts | 73 +- .../notebookEditorModelResolverService.ts | 7 +- .../notebookEditorModelResolverServiceImpl.ts | 22 +- .../notebook/common/notebookKernelService.ts | 2 +- .../notebook/common/notebookProvider.ts | 3 - .../browser/notebookKernelHistory.test.ts | 22 +- .../browser/notebookKernelService.test.ts | 22 +- .../test/browser/notebookServiceImpl.test.ts | 2 - .../test/browser/notebookViewModel.test.ts | 2 +- .../test/browser/testNotebookEditor.ts | 4 +- .../browser/interactiveEditor.css | 21 + .../browser/media/interactive.css | 36 + .../replNotebook/browser/repl.contribution.ts | 260 +++++++ .../replNotebook/browser/replEditor.ts | 725 ++++++++++++++++++ .../replNotebook/browser/replEditorInput.ts | 88 +++ src/vs/workbench/workbench.common.main.ts | 3 + 34 files changed, 1335 insertions(+), 145 deletions(-) create mode 100644 src/vs/workbench/contrib/replNotebook/browser/interactiveEditor.css create mode 100644 src/vs/workbench/contrib/replNotebook/browser/media/interactive.css create mode 100644 src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts create mode 100644 src/vs/workbench/contrib/replNotebook/browser/replEditor.ts create mode 100644 src/vs/workbench/contrib/replNotebook/browser/replEditorInput.ts diff --git a/extensions/ipynb/package.json b/extensions/ipynb/package.json index d923904ef9d3f..b97bd42e6c804 100644 --- a/extensions/ipynb/package.json +++ b/extensions/ipynb/package.json @@ -15,7 +15,8 @@ ], "activationEvents": [ "onNotebook:jupyter-notebook", - "onNotebookSerializer:interactive" + "onNotebookSerializer:interactive", + "onNotebookSerializer:repl" ], "extensionKind": [ "workspace", diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index fa9bd76ed8a5e..1e7360f3064d6 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -171,6 +171,7 @@ export class MenuId { static readonly InteractiveCellDelete = new MenuId('InteractiveCellDelete'); static readonly InteractiveCellExecute = new MenuId('InteractiveCellExecute'); static readonly InteractiveInputExecute = new MenuId('InteractiveInputExecute'); + static readonly ReplInputExecute = new MenuId('ReplInputExecute'); static readonly IssueReporter = new MenuId('IssueReporter'); static readonly NotebookToolbar = new MenuId('NotebookToolbar'); static readonly NotebookStickyScrollContext = new MenuId('NotebookStickyScrollContext'); diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 3a7e105c8437f..5b707fc865eb0 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -36,7 +36,7 @@ import { IExtHostSearch } from 'vs/workbench/api/common/extHostSearch'; import { CellSearchModel } from 'vs/workbench/contrib/search/common/cellSearchModel'; import { INotebookCellMatchNoModel, INotebookFileMatchNoModel, IRawClosedNotebookFileMatch, genericCellMatchesToTextSearchMatches } from 'vs/workbench/contrib/search/common/searchNotebookHelpers'; import { NotebookPriorityInfo } from 'vs/workbench/contrib/search/common/search'; -import { globMatchesResource } from 'vs/workbench/services/editor/common/editorResolverService'; +import { globMatchesResource, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; import { ILogService } from 'vs/platform/log/common/log'; export class ExtHostNotebookController implements ExtHostNotebookShape { @@ -163,7 +163,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { providerDisplayName: extension.displayName || extension.name, displayName: registration.displayName, filenamePattern: viewOptionsFilenamePattern, - exclusive: registration.exclusive || false + priority: registration.exclusive ? RegisteredEditorPriority.exclusive : undefined }; } diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index 24e4478a2782f..03b88f1f7af93 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -51,9 +51,12 @@ import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/note import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; import { CellEditType, CellKind, CellUri, INTERACTIVE_WINDOW_EDITOR_ID, NotebookSetting, NotebookWorkingCopyTypeIdentifier } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { InteractiveWindowOpen } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { InteractiveWindowOpen, NOTEBOOK_CELL_LIST_FOCUSED, REPL_NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { executeReplInput } from 'vs/workbench/contrib/replNotebook/browser/repl.contribution'; +import { ReplEditor } from 'vs/workbench/contrib/replNotebook/browser/replEditor'; +import { ReplEditorInput } from 'vs/workbench/contrib/replNotebook/browser/replEditorInput'; import { columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorResolverService, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; @@ -95,7 +98,7 @@ export class InteractiveDocumentContribution extends Disposable implements IWork providerDisplayName: 'Interactive Notebook', displayName: 'Interactive', filenamePattern: ['*.interactive'], - exclusive: true + priority: RegisteredEditorPriority.exclusive })); } @@ -411,10 +414,10 @@ registerAction2(class extends Action2 { logService.debug('Open new interactive window:', notebookUri.toString(), inputUri.toString()); if (id) { - const allKernels = kernelService.getMatchingKernel({ uri: notebookUri, viewType: 'interactive' }).all; + const allKernels = kernelService.getMatchingKernel({ uri: notebookUri, notebookType: 'interactive' }).all; const preferredKernel = allKernels.find(kernel => kernel.id === id); if (preferredKernel) { - kernelService.preselectKernelForNotebook(preferredKernel, { uri: notebookUri, viewType: 'interactive' }); + kernelService.preselectKernelForNotebook(preferredKernel, { uri: notebookUri, notebookType: 'interactive' }); } } @@ -456,10 +459,20 @@ registerAction2(class extends Action2 { primary: KeyMod.CtrlCmd | KeyCode.Enter }, weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT + }, { + when: ContextKeyExpr.and( + REPL_NOTEBOOK_IS_ACTIVE_EDITOR, + NOTEBOOK_CELL_LIST_FOCUSED.toNegated() + ), + primary: KeyMod.CtrlCmd | KeyCode.Enter, + weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT }], menu: [ { id: MenuId.InteractiveInputExecute + }, + { + id: MenuId.ReplInputExecute } ], icon: icons.executeIcon, @@ -483,21 +496,29 @@ registerAction2(class extends Action2 { const historyService = accessor.get(IInteractiveHistoryService); const notebookEditorService = accessor.get(INotebookEditorService); let editorControl: { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; + let isReplEditor = false; if (context) { const resourceUri = URI.revive(context); - const editors = editorService.findEditors(resourceUri) - .filter(id => id.editor instanceof InteractiveEditorInput && id.editor.resource?.toString() === resourceUri.toString()); - if (editors.length) { - const editorInput = editors[0].editor as InteractiveEditorInput; - const currentGroup = editors[0].groupId; - const editor = await editorService.openEditor(editorInput, currentGroup); - editorControl = editor?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; + const editors = editorService.findEditors(resourceUri); + for (const found of editors) { + if (found.editor.typeId === ReplEditorInput.ID || found.editor.typeId === InteractiveEditorInput.ID) { + const editor = await editorService.openEditor(found.editor, found.groupId); + editorControl = editor?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; + isReplEditor = found.editor.typeId === ReplEditorInput.ID; + break; + } } } else { + const editor = editorService.activeEditorPane; + isReplEditor = editor instanceof ReplEditor; editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; } + if (editorControl && isReplEditor) { + executeReplInput(accessor, editorControl); + } + if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { const notebookDocument = editorControl.notebookEditor.textModel; const textModel = editorControl.codeEditor.getModel(); @@ -590,7 +611,7 @@ registerAction2(class extends Action2 { title: localize2('interactive.history.previous', 'Previous value in history'), category: interactiveWindowCategory, f1: false, - keybinding: { + keybinding: [{ when: ContextKeyExpr.and( ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'), INTERACTIVE_INPUT_CURSOR_BOUNDARY.notEqualsTo('bottom'), @@ -599,7 +620,16 @@ registerAction2(class extends Action2 { ), primary: KeyCode.UpArrow, weight: KeybindingWeight.WorkbenchContrib - }, + }, { + when: ContextKeyExpr.and( + ContextKeyExpr.equals('activeEditor', 'workbench.editor.repl'), + INTERACTIVE_INPUT_CURSOR_BOUNDARY.notEqualsTo('bottom'), + INTERACTIVE_INPUT_CURSOR_BOUNDARY.notEqualsTo('none'), + SuggestContext.Visible.toNegated() + ), + primary: KeyCode.UpArrow, + weight: KeybindingWeight.WorkbenchContrib + }] }); } @@ -629,7 +659,7 @@ registerAction2(class extends Action2 { title: localize2('interactive.history.next', 'Next value in history'), category: interactiveWindowCategory, f1: false, - keybinding: { + keybinding: [{ when: ContextKeyExpr.and( ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'), INTERACTIVE_INPUT_CURSOR_BOUNDARY.notEqualsTo('top'), @@ -638,7 +668,16 @@ registerAction2(class extends Action2 { ), primary: KeyCode.DownArrow, weight: KeybindingWeight.WorkbenchContrib - }, + }, { + when: ContextKeyExpr.and( + ContextKeyExpr.equals('activeEditor', 'workbench.editor.repl'), + INTERACTIVE_INPUT_CURSOR_BOUNDARY.notEqualsTo('top'), + INTERACTIVE_INPUT_CURSOR_BOUNDARY.notEqualsTo('none'), + SuggestContext.Visible.toNegated() + ), + primary: KeyCode.DownArrow, + weight: KeybindingWeight.WorkbenchContrib + }], }); } diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index ba994f540b6ef..5f00a8ae37f5c 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -163,7 +163,7 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro this._editorOptions = this._computeEditorOptions(); } })); - this._notebookOptions = new NotebookOptions(this.window, configurationService, notebookExecutionStateService, codeEditorService, true, { cellToolbarInteraction: 'hover', globalToolbar: true, stickyScrollEnabled: false, dragAndDropEnabled: false }); + this._notebookOptions = instantiationService.createInstance(NotebookOptions, this.window, true, { cellToolbarInteraction: 'hover', globalToolbar: true, stickyScrollEnabled: false, dragAndDropEnabled: false }); this._editorMemento = this.getEditorMemento(editorGroupService, textResourceConfigurationService, INTERACTIVE_EDITOR_VIEW_STATE_PREFERENCE_KEY); codeEditorService.registerDecorationType('interactive-decoration', DECORATION_KEY, {}); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts index 1d5d4405f0693..e69da8b479d5e 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts @@ -64,7 +64,7 @@ CommandsRegistry.registerCommand('_resolveNotebookKernels', async (accessor, arg }[]> => { const notebookKernelService = accessor.get(INotebookKernelService); const uri = URI.revive(args.uri as UriComponents); - const kernels = notebookKernelService.getMatchingKernel({ uri, viewType: args.viewType }); + const kernels = notebookKernelService.getMatchingKernel({ uri, notebookType: args.viewType }); return kernels.all.map(provider => ({ id: provider.id, diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts index 29dc02777d3a4..dd98ad9d3a4ba 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts @@ -41,13 +41,11 @@ import { BackLayerWebView, INotebookDelegateForWebview } from 'vs/workbench/cont import { NotebookDiffEditorEventDispatcher, NotebookDiffLayoutChangedEvent } from 'vs/workbench/contrib/notebook/browser/diff/eventDispatcher'; import { FontMeasurements } from 'vs/editor/browser/config/fontMeasurements'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; -import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { cellIndexesToRanges, cellRangesToIndexes } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { NotebookDiffOverviewRuler } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler'; import { registerZIndex, ZIndex } from 'vs/platform/layout/browser/zIndexRegistry'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; const $ = DOM.$; @@ -151,11 +149,9 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD @IConfigurationService private readonly configurationService: IConfigurationService, @ITelemetryService telemetryService: ITelemetryService, @IStorageService storageService: IStorageService, - @INotebookExecutionStateService notebookExecutionStateService: INotebookExecutionStateService, - @ICodeEditorService codeEditorService: ICodeEditorService ) { super(NotebookTextDiffEditor.ID, group, telemetryService, themeService, storageService); - this._notebookOptions = new NotebookOptions(this.window, this.configurationService, notebookExecutionStateService, codeEditorService, false); + this._notebookOptions = instantiationService.createInstance(NotebookOptions, this.window, false, undefined); this._register(this._notebookOptions); this._revealFirst = true; } diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index c886a602b38a4..423c6165f73fb 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -187,8 +187,8 @@ class NotebookDiffEditorSerializer implements IEditorSerializer { } type SerializedNotebookEditorData = { resource: URI; preferredResource: URI; viewType: string; options?: NotebookEditorInputOptions }; class NotebookEditorSerializer implements IEditorSerializer { - canSerialize(): boolean { - return true; + canSerialize(input: EditorInput): boolean { + return input.typeId === NotebookEditorInput.ID; } serialize(input: EditorInput): string { assertType(input instanceof NotebookEditorInput); @@ -644,7 +644,7 @@ class SimpleNotebookWorkingCopyEditorHandler extends Disposable implements IWork private handlesSync(workingCopy: IWorkingCopyIdentifier): string /* viewType */ | undefined { const viewType = this._getViewType(workingCopy); - if (!viewType || viewType === 'interactive') { + if (!viewType || viewType === 'interactive' || extname(workingCopy.resource) === '.replNotebook') { return undefined; } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index f474d202cb195..dce4811e23532 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -22,7 +22,7 @@ import { IEditorPane, IEditorPaneWithSelection } from 'vs/workbench/common/edito import { CellViewModelStateChangeEvent, NotebookCellStateChangedEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellKind, ICellOutput, INotebookCellStatusBarItem, INotebookRendererInfo, INotebookSearchOptions, IOrderedMimeType, NotebookCellInternalMetadata, NotebookCellMetadata, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, ICellOutput, INotebookCellStatusBarItem, INotebookRendererInfo, INotebookSearchOptions, IOrderedMimeType, NotebookCellInternalMetadata, NotebookCellMetadata, NOTEBOOK_EDITOR_ID, REPL_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { isCompositeNotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; import { INotebookKernel } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; @@ -383,6 +383,7 @@ export interface INotebookEditorCreationOptions { }; readonly options?: NotebookOptions; readonly codeWindow?: CodeWindow; + readonly forRepl?: boolean; } export interface INotebookWebviewMessage { @@ -448,7 +449,7 @@ export interface INotebookViewCellsUpdateEvent { export interface INotebookViewModel { notebookDocument: NotebookTextModel; - viewCells: ICellViewModel[]; + readonly viewCells: ICellViewModel[]; layoutInfo: NotebookLayoutInfo | null; onDidChangeViewCells: Event; onDidChangeSelection: Event; @@ -878,7 +879,9 @@ export function getNotebookEditorFromEditorPane(editorPane?: IEditorPane): INote const input = editorPane.input; - if (input && isCompositeNotebookEditorInput(input)) { + const isInteractiveEditor = input && isCompositeNotebookEditorInput(input); + + if (isInteractiveEditor || editorPane.getId() === REPL_EDITOR_ID) { return (editorPane.getControl() as { notebookEditor: INotebookEditor | undefined } | undefined)?.notebookEditor; } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index addc97632f05f..ea03755d75d45 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -99,7 +99,6 @@ import { NotebookStickyScroll } from 'vs/workbench/contrib/notebook/browser/view import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { PixelRatio } from 'vs/base/browser/pixelRatio'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { PreventDefaultContextMenuItemsContextKeyName } from 'vs/workbench/contrib/webview/browser/webview.contribution'; import { NotebookAccessibilityProvider } from 'vs/workbench/contrib/notebook/browser/notebookAccessibilityProvider'; @@ -272,6 +271,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD readonly isEmbedded: boolean; private _readOnly: boolean; + private readonly _inRepl: boolean; public readonly scopedContextKeyService: IContextKeyService; private readonly instantiationService: IInstantiationService; @@ -302,7 +302,6 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD @IEditorProgressService private editorProgressService: IEditorProgressService, @INotebookLoggingService private readonly logService: INotebookLoggingService, @IKeybindingService private readonly keybindingService: IKeybindingService, - @ICodeEditorService codeEditorService: ICodeEditorService ) { super(); @@ -310,8 +309,14 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this.isEmbedded = creationOptions.isEmbedded ?? false; this._readOnly = creationOptions.isReadOnly ?? false; + this._inRepl = creationOptions.forRepl ?? false; - this._notebookOptions = creationOptions.options ?? new NotebookOptions(this.creationOptions?.codeWindow ?? mainWindow, this.configurationService, notebookExecutionStateService, codeEditorService, this._readOnly); + this._overlayContainer = document.createElement('div'); + this.scopedContextKeyService = this._register(contextKeyService.createScoped(this._overlayContainer)); + this.instantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); + + this._notebookOptions = creationOptions.options ?? + this.instantiationService.createInstance(NotebookOptions, this.creationOptions?.codeWindow ?? mainWindow, this._readOnly, undefined); this._register(this._notebookOptions); const eventDispatcher = this._register(new NotebookEventDispatcher()); this._viewContext = new ViewContext( @@ -322,9 +327,6 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._onDidChangeCellState.fire(e); })); - this._overlayContainer = document.createElement('div'); - this.scopedContextKeyService = this._register(contextKeyService.createScoped(this._overlayContainer)); - this.instantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); this._register(_notebookService.onDidChangeOutputRenderers(() => { this._updateOutputRenderers(); @@ -1435,7 +1437,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD private async _attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined, perf?: NotebookPerfMarks) { this._ensureWebview(this.getId(), textModel.viewType, textModel.uri); - this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this._viewContext, this.getLayoutInfo(), { isReadOnly: this._readOnly }); + this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this._viewContext, this.getLayoutInfo(), { isReadOnly: this._readOnly, inRepl: this._inRepl }); this._viewContext.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); this.notebookOptions.updateOptions(this._readOnly); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookOptions.ts b/src/vs/workbench/contrib/notebook/browser/notebookOptions.ts index 46ce122a0044b..c83be8c872fce 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookOptions.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookOptions.ts @@ -137,11 +137,11 @@ export class NotebookOptions extends Disposable { constructor( readonly targetWindow: CodeWindow, - private readonly configurationService: IConfigurationService, - private readonly notebookExecutionStateService: INotebookExecutionStateService, - private readonly codeEditorService: ICodeEditorService, private isReadonly: boolean, - private readonly overrides?: { cellToolbarInteraction: string; globalToolbar: boolean; stickyScrollEnabled: boolean; dragAndDropEnabled: boolean } + private readonly overrides: { cellToolbarInteraction: string; globalToolbar: boolean; stickyScrollEnabled: boolean; dragAndDropEnabled: boolean } | undefined, + @IConfigurationService private readonly configurationService: IConfigurationService, + @INotebookExecutionStateService private readonly notebookExecutionStateService: INotebookExecutionStateService, + @ICodeEditorService private readonly codeEditorService: ICodeEditorService, ) { super(); const showCellStatusBar = this.configurationService.getValue(NotebookSetting.showCellStatusBar); diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl.ts index 3e3446349b801..0c3852191dac5 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl.ts @@ -48,7 +48,7 @@ export class NotebookKernelHistoryService extends Disposable implements INoteboo // We will suggest the only kernel const suggested = allAvailableKernels.all.length === 1 ? allAvailableKernels.all[0] : undefined; this._notebookLoggingService.debug('History', `getMatchingKernels: ${allAvailableKernels.all.length} kernels available for ${notebook.uri.path}. Selected: ${allAvailableKernels.selected?.label}. Suggested: ${suggested?.label}`); - const mostRecentKernelIds = this._mostRecentKernelsMap[notebook.viewType] ? [...this._mostRecentKernelsMap[notebook.viewType].values()] : []; + const mostRecentKernelIds = this._mostRecentKernelsMap[notebook.notebookType] ? [...this._mostRecentKernelsMap[notebook.notebookType].values()] : []; const all = mostRecentKernelIds.map(kernelId => allKernels.find(kernel => kernel.id === kernelId)).filter(kernel => !!kernel) as INotebookKernel[]; this._notebookLoggingService.debug('History', `mru: ${mostRecentKernelIds.length} kernels in history, ${all.length} registered already.`); diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts index 572a833e173d2..05174803267cb 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookKernelServiceImpl.ts @@ -37,12 +37,12 @@ class KernelInfo { class NotebookTextModelLikeId { static str(k: INotebookTextModelLike): string { - return `${k.viewType}/${k.uri.toString()}`; + return `${k.notebookType}/${k.uri.toString()}`; } static obj(s: string): INotebookTextModelLike { const idx = s.indexOf('/'); return { - viewType: s.substring(0, idx), + notebookType: s.substring(0, idx), uri: URI.parse(s.substring(idx + 1)) }; } @@ -178,7 +178,7 @@ export class NotebookKernelService extends Disposable implements INotebookKernel private static _score(kernel: INotebookKernel, notebook: INotebookTextModelLike): number { if (kernel.viewType === '*') { return 5; - } else if (kernel.viewType === notebook.viewType) { + } else if (kernel.viewType === notebook.notebookType) { return 10; } else { return 0; @@ -343,7 +343,7 @@ export class NotebookKernelService extends Disposable implements INotebookKernel const stateChangeListener = sourceAction.onDidChangeState(() => { this._onDidChangeSourceActions.fire({ notebook: document.uri, - viewType: document.viewType, + viewType: document.notebookType, }); }); sourceActions.push([sourceAction, stateChangeListener]); @@ -351,7 +351,7 @@ export class NotebookKernelService extends Disposable implements INotebookKernel }); info.actions = sourceActions; this._kernelSources.set(id, info); - this._onDidChangeSourceActions.fire({ notebook: document.uri, viewType: document.viewType }); + this._onDidChangeSourceActions.fire({ notebook: document.uri, viewType: document.notebookType }); }; this._kernelSourceActionsUpdates.get(id)?.dispose(); @@ -382,7 +382,7 @@ export class NotebookKernelService extends Disposable implements INotebookKernel } getKernelDetectionTasks(notebook: INotebookTextModelLike): INotebookKernelDetectionTask[] { - return this._kernelDetectionTasks.get(notebook.viewType) ?? []; + return this._kernelDetectionTasks.get(notebook.notebookType) ?? []; } registerKernelSourceActionProvider(viewType: string, provider: IKernelSourceActionProvider): IDisposable { @@ -411,7 +411,7 @@ export class NotebookKernelService extends Disposable implements INotebookKernel * Get kernel source actions from providers */ getKernelSourceActions2(notebook: INotebookTextModelLike): Promise { - const viewType = notebook.viewType; + const viewType = notebook.notebookType; const providers = this._kernelSourceActionProviders.get(viewType) ?? []; const promises = providers.map(provider => provider.provideKernelSourceActions()); return Promise.all(promises).then(actions => { diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts index 99a74727cb4d3..86a0b01c5604b 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookServiceImpl.ts @@ -132,7 +132,6 @@ export class NotebookProviderInfoStore extends Disposable { selectors: notebookContribution.selector || [], priority: this._convertPriority(notebookContribution.priority), providerDisplayName: extension.description.displayName ?? extension.description.identifier.value, - exclusive: false })); } } @@ -171,7 +170,7 @@ export class NotebookProviderInfoStore extends Disposable { id: notebookProviderInfo.id, label: notebookProviderInfo.displayName, detail: notebookProviderInfo.providerDisplayName, - priority: notebookProviderInfo.exclusive ? RegisteredEditorPriority.exclusive : notebookProviderInfo.priority, + priority: notebookProviderInfo.priority, }; const notebookEditorOptions = { canHandleDiff: () => !!this._configurationService.getValue(NotebookSetting.textDiffEditorPreview) && !this._accessibilityService.isScreenReaderOptimized(), @@ -639,8 +638,7 @@ export class NotebookService extends Disposable implements INotebookService { id: viewType, displayName: data.displayName, providerDisplayName: data.providerDisplayName, - exclusive: data.exclusive, - priority: RegisteredEditorPriority.default, + priority: data.priority || RegisteredEditorPriority.default, selectors: [] }); diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts index 8a0f837901156..7ea020f145ca1 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts @@ -99,6 +99,7 @@ let MODEL_ID = 0; export interface NotebookViewModelOptions { isReadOnly: boolean; + inRepl?: boolean; } export class NotebookViewModel extends Disposable implements EditorFoldingStateDelegate, INotebookViewModel { @@ -108,15 +109,12 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD private readonly _onDidChangeOptions = this._register(new Emitter()); get onDidChangeOptions(): Event { return this._onDidChangeOptions.event; } private _viewCells: CellViewModel[] = []; + private readonly replView: boolean; get viewCells(): ICellViewModel[] { return this._viewCells; } - set viewCells(_: ICellViewModel[]) { - throw new Error('NotebookViewModel.viewCells is readonly'); - } - get length(): number { return this._viewCells.length; } @@ -206,6 +204,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD MODEL_ID++; this.id = '$notebookViewModel' + MODEL_ID; this._instanceId = strings.singleLetterHash(MODEL_ID); + this.replView = !!this.options.inRepl; const compute = (changes: NotebookCellTextModelSplice[], synchronous: boolean) => { const diffs = changes.map(splice => { @@ -337,9 +336,12 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this._onDidChangeSelection.fire(e); })); - this._viewCells = this._notebook.cells.map(cell => { - return createCellViewModel(this._instantiationService, this, cell, this._viewContext); - }); + + const viewCellCount = this.replView ? this._notebook.cells.length - 1 : this._notebook.cells.length; + for (let i = 0; i < viewCellCount; i++) { + this._viewCells.push(createCellViewModel(this._instantiationService, this, this._notebook.cells[i], this._viewContext)); + } + this._viewCells.forEach(cell => { this._handleToViewCellMapping.set(cell.handle, cell); diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index b3b6ff6e2f9d9..21870a0067fdd 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -215,6 +215,10 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel return this._alternativeVersionId; } + get notebookType() { + return this.viewType; + } + constructor( readonly viewType: string, readonly uri: URI, diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 33c85b2742097..bb08370538b67 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -33,11 +33,15 @@ import { IMarkdownString } from 'vs/base/common/htmlContent'; import { IFileReadLimits } from 'vs/platform/files/common/files'; import { parse as parseUri, generate as generateUri } from 'vs/workbench/services/notebook/common/notebookDocumentService'; import { ICellExecutionError } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { INotebookTextModelLike } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; +import { RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; export const NOTEBOOK_EDITOR_ID = 'workbench.editor.notebook'; export const NOTEBOOK_DIFF_EDITOR_ID = 'workbench.editor.notebookTextDiffEditor'; export const INTERACTIVE_WINDOW_EDITOR_ID = 'workbench.editor.interactive'; +export const REPL_EDITOR_ID = 'workbench.editor.repl'; +export const EXECUTE_REPL_COMMAND_ID = 'replNotebook.input.execute'; export enum CellKind { Markup = 1, @@ -252,7 +256,8 @@ export interface ICell { onDidChangeInternalMetadata: Event; } -export interface INotebookTextModel { +export interface INotebookTextModel extends INotebookTextModelLike { + readonly notebookType: string; readonly viewType: string; metadata: NotebookDocumentMetadata; readonly transientOptions: TransientOptions; @@ -551,7 +556,7 @@ export interface INotebookContributionData { providerDisplayName: string; displayName: string; filenamePattern: (string | glob.IRelativePattern | INotebookExclusiveDocumentFilter)[]; - exclusive: boolean; + priority?: RegisteredEditorPriority; } @@ -776,6 +781,11 @@ export interface INotebookLoadOptions { readonly limits?: IFileReadLimits; } +export type NotebookEditorModelCreationOptions = { + limits?: IFileReadLimits; + scratchpad?: boolean; +}; + export interface IResolvedNotebookEditorModel extends INotebookEditorModel { notebook: NotebookTextModel; } diff --git a/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts b/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts index 4aad255f78761..c4961dd6dadd7 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { INTERACTIVE_WINDOW_EDITOR_ID, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INTERACTIVE_WINDOW_EDITOR_ID, NOTEBOOK_EDITOR_ID, REPL_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -16,11 +16,15 @@ export const InteractiveWindowOpen = new RawContextKey('interactiveWind // Is Notebook export const NOTEBOOK_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', NOTEBOOK_EDITOR_ID); export const INTERACTIVE_WINDOW_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', INTERACTIVE_WINDOW_EDITOR_ID); +export const REPL_NOTEBOOK_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', REPL_EDITOR_ID); // Editor keys +// based on the focus of the notebook editor widget export const NOTEBOOK_EDITOR_FOCUSED = new RawContextKey('notebookEditorFocused', false); +// always true within the cell list html element export const NOTEBOOK_CELL_LIST_FOCUSED = new RawContextKey('notebookCellListFocused', false); export const NOTEBOOK_OUTPUT_FOCUSED = new RawContextKey('notebookOutputFocused', false); +// an input html element within the output webview has focus export const NOTEBOOK_OUTPUT_INPUT_FOCUSED = new RawContextKey('notebookOutputInputFocused', false); export const NOTEBOOK_EDITOR_EDITABLE = new RawContextKey('notebookEditable', true); export const NOTEBOOK_HAS_RUNNING_CELL = new RawContextKey('notebookHasRunningCell', false); diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts index 0ac6de7110079..5edcb35f62c2e 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts @@ -53,7 +53,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { static readonly ID: string = 'workbench.input.notebook'; - private _editorModelReference: IReference | null = null; + protected editorModelReference: IReference | null = null; private _sideLoadedListener: IDisposable; private _defaultDirtyState: boolean = false; @@ -105,8 +105,8 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { override dispose() { this._sideLoadedListener.dispose(); - this._editorModelReference?.dispose(); - this._editorModelReference = null; + this.editorModelReference?.dispose(); + this.editorModelReference = null; super.dispose(); } @@ -125,8 +125,8 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { capabilities |= EditorInputCapabilities.Untitled; } - if (this._editorModelReference) { - if (this._editorModelReference.object.isReadonly()) { + if (this.editorModelReference) { + if (this.editorModelReference.object.isReadonly()) { capabilities |= EditorInputCapabilities.Readonly; } } else { @@ -143,7 +143,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } override getDescription(verbosity = Verbosity.MEDIUM): string | undefined { - if (!this.hasCapability(EditorInputCapabilities.Untitled) || this._editorModelReference?.object.hasAssociatedFilePath()) { + if (!this.hasCapability(EditorInputCapabilities.Untitled) || this.editorModelReference?.object.hasAssociatedFilePath()) { return super.getDescription(verbosity); } @@ -151,21 +151,21 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } override isReadonly(): boolean | IMarkdownString { - if (!this._editorModelReference) { + if (!this.editorModelReference) { return this.filesConfigurationService.isReadonly(this.resource); } - return this._editorModelReference.object.isReadonly(); + return this.editorModelReference.object.isReadonly(); } override isDirty() { - if (!this._editorModelReference) { + if (!this.editorModelReference) { return this._defaultDirtyState; } - return this._editorModelReference.object.isDirty(); + return this.editorModelReference.object.isDirty(); } override isSaving(): boolean { - const model = this._editorModelReference?.object; + const model = this.editorModelReference?.object; if (!model || !model.isDirty() || model.hasErrorState || this.hasCapability(EditorInputCapabilities.Untitled)) { return false; // require the model to be dirty, file-backed and not in an error state } @@ -175,12 +175,12 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } override async save(group: GroupIdentifier, options?: ISaveOptions): Promise { - if (this._editorModelReference) { + if (this.editorModelReference) { if (this.hasCapability(EditorInputCapabilities.Untitled)) { return this.saveAs(group, options); } else { - await this._editorModelReference.object.save(options); + await this.editorModelReference.object.save(options); } return this; @@ -190,7 +190,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } override async saveAs(group: GroupIdentifier, options?: ISaveOptions): Promise { - if (!this._editorModelReference) { + if (!this.editorModelReference) { return undefined; } @@ -200,9 +200,9 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { return undefined; } - const pathCandidate = this.hasCapability(EditorInputCapabilities.Untitled) ? await this._suggestName(provider, this.labelService.getUriBasenameLabel(this.resource)) : this._editorModelReference.object.resource; + const pathCandidate = this.hasCapability(EditorInputCapabilities.Untitled) ? await this._suggestName(provider, this.labelService.getUriBasenameLabel(this.resource)) : this.editorModelReference.object.resource; let target: URI | undefined; - if (this._editorModelReference.object.hasAssociatedFilePath()) { + if (this.editorModelReference.object.hasAssociatedFilePath()) { target = pathCandidate; } else { target = await this._fileDialogService.pickFileToSave(pathCandidate, options?.availableFileSystems); @@ -231,7 +231,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { throw new Error(`File name ${target} is not supported by ${provider.providerDisplayName}.\n\nPlease make sure the file name matches following patterns:\n${patterns}`); } - return await this._editorModelReference.object.saveAs(target); + return await this.editorModelReference.object.saveAs(target); } private async _suggestName(provider: NotebookProviderInfo, suggestedFilename: string) { @@ -260,7 +260,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { // called when users rename a notebook document override async rename(group: GroupIdentifier, target: URI): Promise { - if (this._editorModelReference) { + if (this.editorModelReference) { return { editor: { resource: target }, options: { override: this.viewType } }; } @@ -268,8 +268,8 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } override async revert(_group: GroupIdentifier, options?: IRevertOptions): Promise { - if (this._editorModelReference && this._editorModelReference.object.isDirty()) { - await this._editorModelReference.object.revert(options); + if (this.editorModelReference && this.editorModelReference.object.isDirty()) { + await this.editorModelReference.object.revert(options); } } @@ -284,42 +284,43 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { // "other" loading anymore this._sideLoadedListener.dispose(); - if (!this._editorModelReference) { - const ref = await this._notebookModelResolverService.resolve(this.resource, this.viewType, this.ensureLimits(_options)); - if (this._editorModelReference) { + if (!this.editorModelReference) { + const scratchpad = this.capabilities & EditorInputCapabilities.Scratchpad ? true : false; + const ref = await this._notebookModelResolverService.resolve(this.resource, this.viewType, { limits: this.ensureLimits(_options), scratchpad }); + if (this.editorModelReference) { // Re-entrant, double resolve happened. Dispose the addition references and proceed // with the truth. ref.dispose(); - return (>this._editorModelReference).object; + return (>this.editorModelReference).object; } - this._editorModelReference = ref; + this.editorModelReference = ref; if (this.isDisposed()) { - this._editorModelReference.dispose(); - this._editorModelReference = null; + this.editorModelReference.dispose(); + this.editorModelReference = null; return null; } - this._register(this._editorModelReference.object.onDidChangeDirty(() => this._onDidChangeDirty.fire())); - this._register(this._editorModelReference.object.onDidChangeReadonly(() => this._onDidChangeCapabilities.fire())); - this._register(this._editorModelReference.object.onDidRevertUntitled(() => this.dispose())); - if (this._editorModelReference.object.isDirty()) { + this._register(this.editorModelReference.object.onDidChangeDirty(() => this._onDidChangeDirty.fire())); + this._register(this.editorModelReference.object.onDidChangeReadonly(() => this._onDidChangeCapabilities.fire())); + this._register(this.editorModelReference.object.onDidRevertUntitled(() => this.dispose())); + if (this.editorModelReference.object.isDirty()) { this._onDidChangeDirty.fire(); } } else { - this._editorModelReference.object.load({ limits: this.ensureLimits(_options) }); + this.editorModelReference.object.load({ limits: this.ensureLimits(_options) }); } if (this.options._backupId) { - const info = await this._notebookService.withNotebookDataProvider(this._editorModelReference.object.notebook.viewType); + const info = await this._notebookService.withNotebookDataProvider(this.editorModelReference.object.notebook.viewType); if (!(info instanceof SimpleNotebookProviderInfo)) { throw new Error('CANNOT open file notebook with this provider'); } const data = await info.serializer.dataToNotebook(VSBuffer.fromString(JSON.stringify({ __webview_backup: this.options._backupId }))); - this._editorModelReference.object.notebook.applyEdits([ + this.editorModelReference.object.notebook.applyEdits([ { editType: CellEditType.Replace, index: 0, - count: this._editorModelReference.object.notebook.length, + count: this.editorModelReference.object.notebook.length, cells: data.cells } ], true, undefined, () => undefined, undefined, false); @@ -331,7 +332,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { } } - return this._editorModelReference.object; + return this.editorModelReference.object; } override toUntyped(): IResourceEditorInput { diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts index 3eff1eb5060bb..dc3d26a0ca390 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts @@ -5,10 +5,9 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; -import { IResolvedNotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { IResolvedNotebookEditorModel, NotebookEditorModelCreationOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IReference } from 'vs/base/common/lifecycle'; import { Event, IWaitUntil } from 'vs/base/common/event'; -import { IFileReadLimits } from 'vs/platform/files/common/files'; export const INotebookEditorModelResolverService = createDecorator('INotebookModelResolverService'); @@ -50,6 +49,6 @@ export interface INotebookEditorModelResolverService { isDirty(resource: URI): boolean; - resolve(resource: URI, viewType?: string, limits?: IFileReadLimits): Promise>; - resolve(resource: IUntitledNotebookResource, viewType: string, limits?: IFileReadLimits): Promise>; + resolve(resource: URI, viewType?: string, creationOptions?: NotebookEditorModelCreationOptions): Promise>; + resolve(resource: IUntitledNotebookResource, viewType: string, creationOtions?: NotebookEditorModelCreationOptions): Promise>; } diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts index 318a2a967315c..d43273d4fa61e 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts @@ -5,7 +5,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; -import { CellUri, IResolvedNotebookEditorModel, NotebookSetting, NotebookWorkingCopyTypeIdentifier } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellUri, IResolvedNotebookEditorModel, NotebookEditorModelCreationOptions, NotebookSetting, NotebookWorkingCopyTypeIdentifier } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookFileWorkingCopyModel, NotebookFileWorkingCopyModelFactory, SimpleNotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { combinedDisposable, DisposableStore, dispose, IDisposable, IReference, ReferenceCollection, toDisposable } from 'vs/base/common/lifecycle'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; @@ -61,7 +61,7 @@ class NotebookModelReferenceCollection extends ReferenceCollection { + protected async createReferencedObject(key: string, viewType: string, hasAssociatedFilePath: boolean, limits?: IFileReadLimits, isScratchpad?: boolean): Promise { // Untrack as being disposed this.modelsToDispose.delete(key); @@ -79,8 +79,9 @@ class NotebookModelReferenceCollection extends ReferenceCollection(NotebookSetting.InteractiveWindowPromptToSave) !== true; - const model = this._instantiationService.createInstance(SimpleNotebookEditorModel, uri, hasAssociatedFilePath, viewType, workingCopyManager, scratchPad); + + const isScratchpadView = isScratchpad || (viewType === 'interactive' && this._configurationService.getValue(NotebookSetting.InteractiveWindowPromptToSave) !== true); + const model = this._instantiationService.createInstance(SimpleNotebookEditorModel, uri, hasAssociatedFilePath, viewType, workingCopyManager, isScratchpadView); const result = await model.load({ limits }); @@ -176,9 +177,9 @@ export class NotebookModelResolverServiceImpl implements INotebookEditorModelRes return this._data.isDirty(resource); } - async resolve(resource: URI, viewType?: string, limits?: IFileReadLimits): Promise>; - async resolve(resource: IUntitledNotebookResource, viewType: string, limits?: IFileReadLimits): Promise>; - async resolve(arg0: URI | IUntitledNotebookResource, viewType?: string, limits?: IFileReadLimits): Promise> { + async resolve(resource: URI, viewType?: string, options?: NotebookEditorModelCreationOptions): Promise>; + async resolve(resource: IUntitledNotebookResource, viewType: string, options: NotebookEditorModelCreationOptions): Promise>; + async resolve(arg0: URI | IUntitledNotebookResource, viewType?: string, options?: NotebookEditorModelCreationOptions): Promise> { let resource: URI; let hasAssociatedFilePath = false; if (URI.isUri(arg0)) { @@ -219,8 +220,9 @@ export class NotebookModelResolverServiceImpl implements INotebookEditorModelRes } else { await this._extensionService.whenInstalledExtensionsRegistered(); const providers = this._notebookService.getContributedNotebookTypes(resource); - const exclusiveProvider = providers.find(provider => provider.exclusive); - viewType = exclusiveProvider?.id || providers[0]?.id; + viewType = providers.find(provider => provider.priority === 'exclusive')?.id ?? + providers.find(provider => provider.priority === 'default')?.id ?? + providers[0]?.id; } } @@ -239,7 +241,7 @@ export class NotebookModelResolverServiceImpl implements INotebookEditorModelRes } } - const reference = this._data.acquire(resource.toString(), viewType, hasAssociatedFilePath, limits); + const reference = this._data.acquire(resource.toString(), viewType, hasAssociatedFilePath, options?.limits, options?.scratchpad); try { const model = await reference.object; return { diff --git a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts index be999203d7524..2351e4b42b228 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts @@ -106,7 +106,7 @@ export interface IKernelSourceActionProvider { provideKernelSourceActions(): Promise; } -export interface INotebookTextModelLike { uri: URI; viewType: string } +export interface INotebookTextModelLike { uri: URI; notebookType: string } export const INotebookKernelService = createDecorator('INotebookKernelService'); diff --git a/src/vs/workbench/contrib/notebook/common/notebookProvider.ts b/src/vs/workbench/contrib/notebook/common/notebookProvider.ts index 16a9ee3a57b2a..e2911dcf9e1aa 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookProvider.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookProvider.ts @@ -19,7 +19,6 @@ export interface NotebookEditorDescriptor { readonly selectors: readonly { filenamePattern?: string; excludeFileNamePattern?: string }[]; readonly priority: RegisteredEditorPriority; readonly providerDisplayName: string; - readonly exclusive: boolean; } export class NotebookProviderInfo { @@ -29,7 +28,6 @@ export class NotebookProviderInfo { readonly displayName: string; readonly priority: RegisteredEditorPriority; readonly providerDisplayName: string; - readonly exclusive: boolean; private _selectors: NotebookSelector[]; get selectors() { @@ -50,7 +48,6 @@ export class NotebookProviderInfo { })) || []; this.priority = descriptor.priority; this.providerDisplayName = descriptor.providerDisplayName; - this.exclusive = descriptor.exclusive; this._options = { transientCellMetadata: {}, transientDocumentMetadata: {}, diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts index 237ec6bd5994b..a037768bbed9f 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelHistory.test.ts @@ -66,8 +66,8 @@ suite('NotebookKernelHistoryService', () => { const u1 = URI.parse('foo:///one'); - const k1 = new TestNotebookKernel({ label: 'z', viewType: 'foo' }); - const k2 = new TestNotebookKernel({ label: 'a', viewType: 'foo' }); + const k1 = new TestNotebookKernel({ label: 'z', notebookType: 'foo' }); + const k2 = new TestNotebookKernel({ label: 'a', notebookType: 'foo' }); disposables.add(kernelService.registerKernel(k1)); disposables.add(kernelService.registerKernel(k2)); @@ -102,14 +102,14 @@ suite('NotebookKernelHistoryService', () => { const kernelHistoryService = disposables.add(instantiationService.createInstance(NotebookKernelHistoryService)); - let info = kernelHistoryService.getKernels({ uri: u1, viewType: 'foo' }); + let info = kernelHistoryService.getKernels({ uri: u1, notebookType: 'foo' }); assert.equal(info.all.length, 0); assert.ok(!info.selected); // update priorities for u1 notebook kernelService.updateKernelNotebookAffinity(k2, u1, 2); - info = kernelHistoryService.getKernels({ uri: u1, viewType: 'foo' }); + info = kernelHistoryService.getKernels({ uri: u1, notebookType: 'foo' }); assert.equal(info.all.length, 0); // MRU only auto selects kernel if there is only one assert.deepStrictEqual(info.selected, undefined); @@ -119,9 +119,9 @@ suite('NotebookKernelHistoryService', () => { const u1 = URI.parse('foo:///one'); - const k1 = new TestNotebookKernel({ label: 'z', viewType: 'foo' }); - const k2 = new TestNotebookKernel({ label: 'a', viewType: 'foo' }); - const k3 = new TestNotebookKernel({ label: 'b', viewType: 'foo' }); + const k1 = new TestNotebookKernel({ label: 'z', notebookType: 'foo' }); + const k2 = new TestNotebookKernel({ label: 'a', notebookType: 'foo' }); + const k3 = new TestNotebookKernel({ label: 'b', notebookType: 'foo' }); disposables.add(kernelService.registerKernel(k1)); disposables.add(kernelService.registerKernel(k2)); @@ -158,12 +158,12 @@ suite('NotebookKernelHistoryService', () => { }); const kernelHistoryService = disposables.add(instantiationService.createInstance(NotebookKernelHistoryService)); - let info = kernelHistoryService.getKernels({ uri: u1, viewType: 'foo' }); + let info = kernelHistoryService.getKernels({ uri: u1, notebookType: 'foo' }); assert.equal(info.all.length, 1); assert.deepStrictEqual(info.selected, undefined); kernelHistoryService.addMostRecentKernel(k3); - info = kernelHistoryService.getKernels({ uri: u1, viewType: 'foo' }); + info = kernelHistoryService.getKernels({ uri: u1, notebookType: 'foo' }); assert.deepStrictEqual(info.all, [k3, k2]); }); }); @@ -190,9 +190,9 @@ class TestNotebookKernel implements INotebookKernel { return AsyncIterableObject.EMPTY; } - constructor(opts?: { languages?: string[]; label?: string; viewType?: string }) { + constructor(opts?: { languages?: string[]; label?: string; notebookType?: string }) { this.supportedLanguages = opts?.languages ?? [PLAINTEXT_LANGUAGE_ID]; this.label = opts?.label ?? this.label; - this.viewType = opts?.viewType ?? this.viewType; + this.viewType = opts?.notebookType ?? this.viewType; } } diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts index cbe5bf90b3bd7..b05cd81e6a7c8 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts @@ -72,7 +72,7 @@ suite('NotebookKernelService', () => { disposables.add(kernelService.registerKernel(k2)); // equal priorities -> sort by name - let info = kernelService.getMatchingKernel({ uri: u1, viewType: 'foo' }); + let info = kernelService.getMatchingKernel({ uri: u1, notebookType: 'foo' }); assert.ok(info.all[0] === k2); assert.ok(info.all[1] === k1); @@ -81,18 +81,18 @@ suite('NotebookKernelService', () => { kernelService.updateKernelNotebookAffinity(k2, u2, 1); // updated - info = kernelService.getMatchingKernel({ uri: u1, viewType: 'foo' }); + info = kernelService.getMatchingKernel({ uri: u1, notebookType: 'foo' }); assert.ok(info.all[0] === k2); assert.ok(info.all[1] === k1); // NOT updated - info = kernelService.getMatchingKernel({ uri: u2, viewType: 'foo' }); + info = kernelService.getMatchingKernel({ uri: u2, notebookType: 'foo' }); assert.ok(info.all[0] === k2); assert.ok(info.all[1] === k1); // reset kernelService.updateKernelNotebookAffinity(k2, u1, undefined); - info = kernelService.getMatchingKernel({ uri: u1, viewType: 'foo' }); + info = kernelService.getMatchingKernel({ uri: u1, notebookType: 'foo' }); assert.ok(info.all[0] === k2); assert.ok(info.all[1] === k1); }); @@ -103,18 +103,18 @@ suite('NotebookKernelService', () => { const kernel = new TestNotebookKernel(); disposables.add(kernelService.registerKernel(kernel)); - let info = kernelService.getMatchingKernel({ uri: notebook, viewType: 'foo' }); + let info = kernelService.getMatchingKernel({ uri: notebook, notebookType: 'foo' }); assert.strictEqual(info.all.length, 1); assert.ok(info.all[0] === kernel); const betterKernel = new TestNotebookKernel(); disposables.add(kernelService.registerKernel(betterKernel)); - info = kernelService.getMatchingKernel({ uri: notebook, viewType: 'foo' }); + info = kernelService.getMatchingKernel({ uri: notebook, notebookType: 'foo' }); assert.strictEqual(info.all.length, 2); kernelService.updateKernelNotebookAffinity(betterKernel, notebook, 2); - info = kernelService.getMatchingKernel({ uri: notebook, viewType: 'foo' }); + info = kernelService.getMatchingKernel({ uri: notebook, notebookType: 'foo' }); assert.strictEqual(info.all.length, 2); assert.ok(info.all[0] === betterKernel); assert.ok(info.all[1] === kernel); @@ -123,8 +123,8 @@ suite('NotebookKernelService', () => { test('onDidChangeSelectedNotebooks not fired on initial notebook open #121904', function () { const uri = URI.parse('foo:///one'); - const jupyter = { uri, viewType: 'jupyter' }; - const dotnet = { uri, viewType: 'dotnet' }; + const jupyter = { uri, viewType: 'jupyter', notebookType: 'jupyter' }; + const dotnet = { uri, viewType: 'dotnet', notebookType: 'dotnet' }; const jupyterKernel = new TestNotebookKernel({ viewType: jupyter.viewType }); const dotnetKernel = new TestNotebookKernel({ viewType: dotnet.viewType }); @@ -144,8 +144,8 @@ suite('NotebookKernelService', () => { test('onDidChangeSelectedNotebooks not fired on initial notebook open #121904, p2', async function () { const uri = URI.parse('foo:///one'); - const jupyter = { uri, viewType: 'jupyter' }; - const dotnet = { uri, viewType: 'dotnet' }; + const jupyter = { uri, viewType: 'jupyter', notebookType: 'jupyter' }; + const dotnet = { uri, viewType: 'dotnet', notebookType: 'dotnet' }; const jupyterKernel = new TestNotebookKernel({ viewType: jupyter.viewType }); const dotnetKernel = new TestNotebookKernel({ viewType: dotnet.viewType }); diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts index ce634389f93bb..77ce4841a79b1 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookServiceImpl.test.ts @@ -56,7 +56,6 @@ suite('NotebookProviderInfoStore', function () { displayName: 'foo', selectors: [{ filenamePattern: '*.foo' }], priority: RegisteredEditorPriority.default, - exclusive: false, providerDisplayName: 'foo', }); const barInfo = new NotebookProviderInfo({ @@ -65,7 +64,6 @@ suite('NotebookProviderInfoStore', function () { displayName: 'bar', selectors: [{ filenamePattern: '*.bar' }], priority: RegisteredEditorPriority.default, - exclusive: false, providerDisplayName: 'bar', }); diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts index 1e512e7c1a0ed..c9d92f4a71b2b 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts @@ -66,7 +66,7 @@ suite('NotebookViewModel', () => { test('ctor', function () { const notebook = new NotebookTextModel('notebook', URI.parse('test'), [], {}, { transientCellMetadata: {}, transientDocumentMetadata: {}, transientOutputs: false, cellContentMetadata: {} }, undoRedoService, modelService, languageService, languageDetectionService); const model = new NotebookEditorTestModel(notebook); - const options = new NotebookOptions(mainWindow, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService), false); + const options = new NotebookOptions(mainWindow, false, undefined, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService)); const eventDispatcher = new NotebookEventDispatcher(); const viewContext = new ViewContext(options, eventDispatcher, () => ({} as IBaseCellEditorOptions)); const viewModel = new NotebookViewModel('notebook', model.notebook, viewContext, null, { isReadOnly: false }, instantiationService, bulkEditService, undoRedoService, textModelService, notebookExecutionStateService); diff --git a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts index 8054c280d1e00..ef524745b9da4 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts @@ -229,7 +229,7 @@ function _createTestNotebookEditor(instantiationService: TestInstantiationServic }), {}, { transientCellMetadata: {}, transientDocumentMetadata: {}, cellContentMetadata: {}, transientOutputs: false })); const model = disposables.add(new NotebookEditorTestModel(notebook)); - const notebookOptions = disposables.add(new NotebookOptions(mainWindow, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService), false)); + const notebookOptions = disposables.add(new NotebookOptions(mainWindow, false, undefined, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService))); const baseCellEditorOptions = new class extends mock() { }; const viewContext = new ViewContext(notebookOptions, disposables.add(new NotebookEventDispatcher()), () => baseCellEditorOptions); const viewModel: NotebookViewModel = disposables.add(instantiationService.createInstance(NotebookViewModel, viewType, model.notebook, viewContext, null, { isReadOnly: false })); @@ -471,7 +471,7 @@ export function createNotebookCellList(instantiationService: TestInstantiationSe }; const notebookOptions = !!viewContext ? viewContext.notebookOptions - : disposables.add(new NotebookOptions(mainWindow, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService), false)); + : disposables.add(new NotebookOptions(mainWindow, false, undefined, instantiationService.get(IConfigurationService), instantiationService.get(INotebookExecutionStateService), instantiationService.get(ICodeEditorService))); const cellList: NotebookCellList = disposables.add(instantiationService.createInstance( NotebookCellList, 'NotebookCellList', diff --git a/src/vs/workbench/contrib/replNotebook/browser/interactiveEditor.css b/src/vs/workbench/contrib/replNotebook/browser/interactiveEditor.css new file mode 100644 index 0000000000000..d43c6a6e98bfc --- /dev/null +++ b/src/vs/workbench/contrib/replNotebook/browser/interactiveEditor.css @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.interactive-editor .input-cell-container:focus-within .input-editor-container .monaco-editor { + outline: solid 1px var(--vscode-notebook-focusedCellBorder); +} + +.interactive-editor .input-cell-container .input-editor-container .monaco-editor { + outline: solid 1px var(--vscode-notebook-inactiveFocusedCellBorder); +} + +.interactive-editor .input-cell-container .input-focus-indicator { + top: 8px; +} + +.interactive-editor .input-cell-container .monaco-editor-background, +.interactive-editor .input-cell-container .margin-view-overlays { + background-color: var(--vscode-notebook-cellEditorBackground, var(--vscode-editor-background)); +} diff --git a/src/vs/workbench/contrib/replNotebook/browser/media/interactive.css b/src/vs/workbench/contrib/replNotebook/browser/media/interactive.css new file mode 100644 index 0000000000000..f0f5cd4821eac --- /dev/null +++ b/src/vs/workbench/contrib/replNotebook/browser/media/interactive.css @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.interactive-editor .input-cell-container { + box-sizing: border-box; +} + +.interactive-editor .input-cell-container .input-focus-indicator { + position: absolute; + left: 0px; + height: 19px; +} + +.interactive-editor .input-cell-container .input-focus-indicator::before { + border-left: 3px solid transparent; + border-radius: 2px; + margin-left: 4px; + content: ""; + position: absolute; + width: 0px; + height: 100%; + z-index: 10; + left: 0px; + top: 0px; + height: 100%; +} + +.interactive-editor .input-cell-container .run-button-container { + position: absolute; +} + +.interactive-editor .input-cell-container .run-button-container .monaco-toolbar .actions-container { + justify-content: center; +} diff --git a/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts b/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts new file mode 100644 index 0000000000000..0482610501580 --- /dev/null +++ b/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts @@ -0,0 +1,260 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { EditorPaneDescriptor, IEditorPaneRegistry } from 'vs/workbench/browser/editor'; +import { EditorExtensions, IEditorFactoryRegistry, IEditorSerializer, IUntypedEditorInput } from 'vs/workbench/common/editor'; +// is one contrib allowed to import from another? +import { parse } from 'vs/base/common/marshalling'; +import { assertType } from 'vs/base/common/types'; +import { URI } from 'vs/base/common/uri'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { CellEditType, CellKind, NotebookSetting, NotebookWorkingCopyTypeIdentifier, REPL_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { NotebookEditorInputOptions } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; +import { ReplEditor } from 'vs/workbench/contrib/replNotebook/browser/replEditor'; +import { ReplEditorInput } from 'vs/workbench/contrib/replNotebook/browser/replEditorInput'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from 'vs/workbench/common/contributions'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IWorkingCopyIdentifier } from 'vs/workbench/services/workingCopy/common/workingCopy'; +import { IWorkingCopyEditorHandler, IWorkingCopyEditorService } from 'vs/workbench/services/workingCopy/common/workingCopyEditorService'; +import { extname, isEqual } from 'vs/base/common/resources'; +import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { localize2 } from 'vs/nls'; +import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; +import { IEditorResolverService, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; +import { Schemas } from 'vs/base/common/network'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; +import { isFalsyOrWhitespace } from 'vs/base/common/strings'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; +import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; +import { ResourceNotebookCellEdit } from 'vs/workbench/contrib/bulkEdit/browser/bulkCellEdits'; +import { IInteractiveHistoryService } from 'vs/workbench/contrib/interactive/browser/interactiveHistoryService'; +import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; +import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; + +type SerializedNotebookEditorData = { resource: URI; preferredResource: URI; viewType: string; options?: NotebookEditorInputOptions }; +class ReplEditorSerializer implements IEditorSerializer { + canSerialize(input: EditorInput): boolean { + return input.typeId === ReplEditorInput.ID; + } + serialize(input: EditorInput): string { + assertType(input instanceof ReplEditorInput); + const data: SerializedNotebookEditorData = { + resource: input.resource, + preferredResource: input.preferredResource, + viewType: input.viewType, + options: input.options + }; + return JSON.stringify(data); + } + deserialize(instantiationService: IInstantiationService, raw: string) { + const data = parse(raw); + if (!data) { + return undefined; + } + const { resource, viewType } = data; + if (!data || !URI.isUri(resource) || typeof viewType !== 'string') { + return undefined; + } + + const input = instantiationService.createInstance(ReplEditorInput, resource); + return input; + } +} + +Registry.as(EditorExtensions.EditorPane).registerEditorPane( + EditorPaneDescriptor.create( + ReplEditor, + REPL_EDITOR_ID, + 'REPL Editor' + ), + [ + new SyncDescriptor(ReplEditorInput) + ] +); + +Registry.as(EditorExtensions.EditorFactory).registerEditorSerializer( + ReplEditorInput.ID, + ReplEditorSerializer +); + +export class ReplDocumentContribution extends Disposable implements IWorkbenchContribution { + + static readonly ID = 'workbench.contrib.replDocument'; + + constructor( + @INotebookService notebookService: INotebookService, + @IEditorResolverService editorResolverService: IEditorResolverService, + @IEditorService editorService: IEditorService, + @INotebookEditorModelResolverService private readonly notebookEditorModelResolverService: INotebookEditorModelResolverService, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IConfigurationService private readonly configurationService: IConfigurationService + ) { + super(); + + editorResolverService.registerEditor( + `*.replNotebook`, + { + id: 'repl', + label: 'repl Editor', + priority: RegisteredEditorPriority.option + }, + { + canSupportResource: uri => + (uri.scheme === Schemas.untitled && extname(uri) === '.replNotebook') || + (uri.scheme === Schemas.vscodeNotebookCell && extname(uri) === '.replNotebook'), + singlePerResource: true + }, + { + createUntitledEditorInput: async ({ resource, options }) => { + const scratchpad = this.configurationService.getValue(NotebookSetting.InteractiveWindowPromptToSave) !== true; + const ref = await this.notebookEditorModelResolverService.resolve({ untitledResource: resource }, 'jupyter-notebook', { scratchpad }); + + // untitled notebooks are disposed when they get saved. we should not hold a reference + // to such a disposed notebook and therefore dispose the reference as well + ref.object.notebook.onWillDispose(() => { + ref.dispose(); + }); + return { editor: this.instantiationService.createInstance(ReplEditorInput, resource!), options }; + } + } + ); + } +} + +class ReplWindowWorkingCopyEditorHandler extends Disposable implements IWorkbenchContribution, IWorkingCopyEditorHandler { + + static readonly ID = 'workbench.contrib.replWorkingCopyEditorHandler'; + + constructor( + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IWorkingCopyEditorService private readonly workingCopyEditorService: IWorkingCopyEditorService, + @IExtensionService private readonly extensionService: IExtensionService, + ) { + super(); + + this._installHandler(); + } + + handles(workingCopy: IWorkingCopyIdentifier): boolean { + const viewType = this._getViewType(workingCopy); + return !!viewType && viewType === 'jupyter-notebook' && extname(workingCopy.resource) === '.replNotebook'; + + } + + isOpen(workingCopy: IWorkingCopyIdentifier, editor: EditorInput): boolean { + if (!this.handles(workingCopy)) { + return false; + } + + return editor instanceof ReplEditorInput && isEqual(workingCopy.resource, editor.resource); + } + + createEditor(workingCopy: IWorkingCopyIdentifier): EditorInput { + return this.instantiationService.createInstance(ReplEditorInput, workingCopy.resource); + } + + private async _installHandler(): Promise { + await this.extensionService.whenInstalledExtensionsRegistered(); + + this._register(this.workingCopyEditorService.registerHandler(this)); + } + + private _getViewType(workingCopy: IWorkingCopyIdentifier): string | undefined { + return NotebookWorkingCopyTypeIdentifier.parse(workingCopy.typeId); + } +} + +registerWorkbenchContribution2(ReplWindowWorkingCopyEditorHandler.ID, ReplWindowWorkingCopyEditorHandler, WorkbenchPhase.BlockRestore); +registerWorkbenchContribution2(ReplDocumentContribution.ID, ReplDocumentContribution, WorkbenchPhase.BlockRestore); + + +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'repl.newRepl', + title: localize2('repl.editor.open', 'New REPL Editor'), + category: 'Create', + }); + } + + async run(accessor: ServicesAccessor) { + const resource = URI.from({ scheme: Schemas.untitled, path: 'repl.replNotebook' }); + const editorInput: IUntypedEditorInput = { resource, options: { override: 'repl' } }; + + const editorService = accessor.get(IEditorService); + await editorService.openEditor(editorInput, 1); + } +}); + +export async function executeReplInput(accessor: ServicesAccessor, editorControl: { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget }) { + const bulkEditService = accessor.get(IBulkEditService); + const historyService = accessor.get(IInteractiveHistoryService); + const notebookEditorService = accessor.get(INotebookEditorService); + + if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { + const notebookDocument = editorControl.notebookEditor.textModel; + const textModel = editorControl.codeEditor.getModel(); + const activeKernel = editorControl.notebookEditor.activeKernel; + const language = activeKernel?.supportedLanguages[0] ?? PLAINTEXT_LANGUAGE_ID; + + if (notebookDocument && textModel) { + const index = notebookDocument.length - 1; + const value = textModel.getValue(); + + if (isFalsyOrWhitespace(value)) { + return; + } + + historyService.addToHistory(notebookDocument.uri, value); + textModel.setValue(''); + notebookDocument.cells[index].resetTextBuffer(textModel.getTextBuffer()); + + const collapseState = editorControl.notebookEditor.notebookOptions.getDisplayOptions().interactiveWindowCollapseCodeCells === 'fromEditor' ? + { + inputCollapsed: false, + outputCollapsed: false + } : + undefined; + + await bulkEditService.apply([ + new ResourceNotebookCellEdit(notebookDocument.uri, + { + editType: CellEditType.Replace, + index: index, + count: 0, + cells: [{ + cellKind: CellKind.Code, + mime: undefined, + language, + source: value, + outputs: [], + metadata: {}, + collapseState + }] + } + ) + ]); + + // reveal the cell into view first + const range = { start: index, end: index + 1 }; + editorControl.notebookEditor.revealCellRangeInView(range); + await editorControl.notebookEditor.executeNotebookCells(editorControl.notebookEditor.getCellsInRange({ start: index, end: index + 1 })); + + // update the selection and focus in the extension host model + const editor = notebookEditorService.getNotebookEditor(editorControl.notebookEditor.getId()); + if (editor) { + editor.setSelections([range]); + editor.setFocus(range); + } + } + } +} diff --git a/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts b/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts new file mode 100644 index 0000000000000..67a803eab4081 --- /dev/null +++ b/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts @@ -0,0 +1,725 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/interactive'; +import * as nls from 'vs/nls'; +import * as DOM from 'vs/base/browser/dom'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { Emitter, Event } from 'vs/base/common/event'; +import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; +import { ICodeEditorViewState, IDecorationOptions } from 'vs/editor/common/editorCommon'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { editorForeground, resolveColorValue } from 'vs/platform/theme/common/colorRegistry'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; +import { EditorPaneSelectionChangeReason, IEditorMemento, IEditorOpenContext, IEditorPaneScrollPosition, IEditorPaneSelectionChangeEvent, IEditorPaneWithScrolling } from 'vs/workbench/common/editor'; +import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; +import { ICellViewModel, INotebookEditorOptions, INotebookEditorViewState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookEditorExtensionsRegistry } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; +import { IBorrowValue, INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; +import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; +import { GroupsOrder, IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { ExecutionStateCellStatusBarContrib, TimerCellStatusBarContrib } from 'vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController'; +import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { InteractiveWindowSetting, INTERACTIVE_INPUT_CURSOR_BOUNDARY } from 'vs/workbench/contrib/interactive/browser/interactiveCommon'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { NotebookOptions } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; +import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { createActionViewItem, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { IAction } from 'vs/base/common/actions'; +import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { ParameterHintsController } from 'vs/editor/contrib/parameterHints/browser/parameterHints'; +import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; +import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { TabCompletionController } from 'vs/workbench/contrib/snippets/browser/tabCompletion'; +import { MarkerController } from 'vs/editor/contrib/gotoError/browser/gotoError'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; +import { ITextEditorOptions, TextEditorSelectionSource } from 'vs/platform/editor/common/editor'; +import { INotebookExecutionStateService, NotebookExecutionType } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { NOTEBOOK_KERNEL } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { isEqual } from 'vs/base/common/resources'; +import { NotebookFindContrib } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget'; +import { EXECUTE_REPL_COMMAND_ID, REPL_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import 'vs/css!./interactiveEditor'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { deepClone } from 'vs/base/common/objects'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; +import { ReplEditorInput } from 'vs/workbench/contrib/replNotebook/browser/replEditorInput'; + +const DECORATION_KEY = 'interactiveInputDecoration'; +const INTERACTIVE_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'InteractiveEditorViewState'; + +const INPUT_CELL_VERTICAL_PADDING = 8; +const INPUT_CELL_HORIZONTAL_PADDING_RIGHT = 10; +const INPUT_EDITOR_PADDING = 8; + +export interface InteractiveEditorViewState { + readonly notebook?: INotebookEditorViewState; + readonly input?: ICodeEditorViewState | null; +} + +export interface InteractiveEditorOptions extends ITextEditorOptions { + readonly viewState?: InteractiveEditorViewState; +} + +export class ReplEditor extends EditorPane implements IEditorPaneWithScrolling { + private _rootElement!: HTMLElement; + private _styleElement!: HTMLStyleElement; + private _notebookEditorContainer!: HTMLElement; + private _notebookWidget: IBorrowValue = { value: undefined }; + private _inputCellContainer!: HTMLElement; + private _inputFocusIndicator!: HTMLElement; + private _inputRunButtonContainer!: HTMLElement; + private _inputEditorContainer!: HTMLElement; + private _codeEditorWidget!: CodeEditorWidget; + private _notebookWidgetService: INotebookEditorService; + private _instantiationService: IInstantiationService; + private _languageService: ILanguageService; + private _contextKeyService: IContextKeyService; + private _configurationService: IConfigurationService; + private _notebookKernelService: INotebookKernelService; + private _keybindingService: IKeybindingService; + private _menuService: IMenuService; + private _contextMenuService: IContextMenuService; + private _editorGroupService: IEditorGroupsService; + private _extensionService: IExtensionService; + private readonly _widgetDisposableStore: DisposableStore = this._register(new DisposableStore()); + private _lastLayoutDimensions?: { readonly dimension: DOM.Dimension; readonly position: DOM.IDomPosition }; + private _editorOptions: IEditorOptions; + private _notebookOptions: NotebookOptions; + private _editorMemento: IEditorMemento; + private readonly _groupListener = this._register(new MutableDisposable()); + private _runbuttonToolbar: ToolBar | undefined; + + private _onDidFocusWidget = this._register(new Emitter()); + override get onDidFocus(): Event { return this._onDidFocusWidget.event; } + private _onDidChangeSelection = this._register(new Emitter()); + readonly onDidChangeSelection = this._onDidChangeSelection.event; + private _onDidChangeScroll = this._register(new Emitter()); + readonly onDidChangeScroll = this._onDidChangeScroll.event; + + constructor( + group: IEditorGroup, + @ITelemetryService telemetryService: ITelemetryService, + @IThemeService themeService: IThemeService, + @IStorageService storageService: IStorageService, + @IInstantiationService instantiationService: IInstantiationService, + @INotebookEditorService notebookWidgetService: INotebookEditorService, + @IContextKeyService contextKeyService: IContextKeyService, + @ICodeEditorService codeEditorService: ICodeEditorService, + @INotebookKernelService notebookKernelService: INotebookKernelService, + @ILanguageService languageService: ILanguageService, + @IKeybindingService keybindingService: IKeybindingService, + @IConfigurationService configurationService: IConfigurationService, + @IMenuService menuService: IMenuService, + @IContextMenuService contextMenuService: IContextMenuService, + @IEditorGroupsService editorGroupService: IEditorGroupsService, + @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, + @INotebookExecutionStateService notebookExecutionStateService: INotebookExecutionStateService, + @IExtensionService extensionService: IExtensionService, + ) { + super( + REPL_EDITOR_ID, + group, + telemetryService, + themeService, + storageService + ); + this._instantiationService = instantiationService; + this._notebookWidgetService = notebookWidgetService; + this._contextKeyService = contextKeyService; + this._configurationService = configurationService; + this._notebookKernelService = notebookKernelService; + this._languageService = languageService; + this._keybindingService = keybindingService; + this._menuService = menuService; + this._contextMenuService = contextMenuService; + this._editorGroupService = editorGroupService; + this._extensionService = extensionService; + + this._editorOptions = this._computeEditorOptions(); + this._register(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('editor') || e.affectsConfiguration('notebook')) { + this._editorOptions = this._computeEditorOptions(); + } + })); + this._notebookOptions = instantiationService.createInstance(NotebookOptions, this.window, true, { cellToolbarInteraction: 'hover', globalToolbar: true, stickyScrollEnabled: false, dragAndDropEnabled: false }); + this._editorMemento = this.getEditorMemento(editorGroupService, textResourceConfigurationService, INTERACTIVE_EDITOR_VIEW_STATE_PREFERENCE_KEY); + + codeEditorService.registerDecorationType('interactive-decoration', DECORATION_KEY, {}); + this._register(this._keybindingService.onDidUpdateKeybindings(this._updateInputDecoration, this)); + this._register(notebookExecutionStateService.onDidChangeExecution((e) => { + if (e.type === NotebookExecutionType.cell && isEqual(e.notebook, this._notebookWidget.value?.viewModel?.notebookDocument.uri)) { + const cell = this._notebookWidget.value?.getCellByHandle(e.cellHandle); + if (cell && e.changed?.state) { + this._scrollIfNecessary(cell); + } + } + })); + } + + private get inputCellContainerHeight() { + return 19 + 2 + INPUT_CELL_VERTICAL_PADDING * 2 + INPUT_EDITOR_PADDING * 2; + } + + private get inputCellEditorHeight() { + return 19 + INPUT_EDITOR_PADDING * 2; + } + + protected createEditor(parent: HTMLElement): void { + this._rootElement = DOM.append(parent, DOM.$('.interactive-editor')); + this._rootElement.style.position = 'relative'; + this._notebookEditorContainer = DOM.append(this._rootElement, DOM.$('.notebook-editor-container')); + this._inputCellContainer = DOM.append(this._rootElement, DOM.$('.input-cell-container')); + this._inputCellContainer.style.position = 'absolute'; + this._inputCellContainer.style.height = `${this.inputCellContainerHeight}px`; + this._inputFocusIndicator = DOM.append(this._inputCellContainer, DOM.$('.input-focus-indicator')); + this._inputRunButtonContainer = DOM.append(this._inputCellContainer, DOM.$('.run-button-container')); + this._setupRunButtonToolbar(this._inputRunButtonContainer); + this._inputEditorContainer = DOM.append(this._inputCellContainer, DOM.$('.input-editor-container')); + this._createLayoutStyles(); + } + + private _setupRunButtonToolbar(runButtonContainer: HTMLElement) { + const menu = this._register(this._menuService.createMenu(MenuId.ReplInputExecute, this._contextKeyService)); + this._runbuttonToolbar = this._register(new ToolBar(runButtonContainer, this._contextMenuService, { + getKeyBinding: action => this._keybindingService.lookupKeybinding(action.id), + actionViewItemProvider: (action, options) => { + return createActionViewItem(this._instantiationService, action, options); + }, + renderDropdownAsChildElement: true + })); + + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + + createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, result); + this._runbuttonToolbar.setActions([...primary, ...secondary]); + } + + private _createLayoutStyles(): void { + this._styleElement = DOM.createStyleSheet(this._rootElement); + const styleSheets: string[] = []; + + const { + codeCellLeftMargin, + cellRunGutter + } = this._notebookOptions.getLayoutConfiguration(); + const { + focusIndicator + } = this._notebookOptions.getDisplayOptions(); + const leftMargin = this._notebookOptions.getCellEditorContainerLeftMargin(); + + styleSheets.push(` + .interactive-editor .input-cell-container { + padding: ${INPUT_CELL_VERTICAL_PADDING}px ${INPUT_CELL_HORIZONTAL_PADDING_RIGHT}px ${INPUT_CELL_VERTICAL_PADDING}px ${leftMargin}px; + } + `); + if (focusIndicator === 'gutter') { + styleSheets.push(` + .interactive-editor .input-cell-container:focus-within .input-focus-indicator::before { + border-color: var(--vscode-notebook-focusedCellBorder) !important; + } + .interactive-editor .input-focus-indicator::before { + border-color: var(--vscode-notebook-inactiveFocusedCellBorder) !important; + } + .interactive-editor .input-cell-container .input-focus-indicator { + display: block; + top: ${INPUT_CELL_VERTICAL_PADDING}px; + } + .interactive-editor .input-cell-container { + border-top: 1px solid var(--vscode-notebook-inactiveFocusedCellBorder); + } + `); + } else { + // border + styleSheets.push(` + .interactive-editor .input-cell-container { + border-top: 1px solid var(--vscode-notebook-inactiveFocusedCellBorder); + } + .interactive-editor .input-cell-container .input-focus-indicator { + display: none; + } + `); + } + + styleSheets.push(` + .interactive-editor .input-cell-container .run-button-container { + width: ${cellRunGutter}px; + left: ${codeCellLeftMargin}px; + margin-top: ${INPUT_EDITOR_PADDING - 2}px; + } + `); + + this._styleElement.textContent = styleSheets.join('\n'); + } + + private _computeEditorOptions(): IEditorOptions { + let overrideIdentifier: string | undefined = undefined; + if (this._codeEditorWidget) { + overrideIdentifier = this._codeEditorWidget.getModel()?.getLanguageId(); + } + const editorOptions = deepClone(this._configurationService.getValue('editor', { overrideIdentifier })); + const editorOptionsOverride = getSimpleEditorOptions(this._configurationService); + const computed = Object.freeze({ + ...editorOptions, + ...editorOptionsOverride, + ...{ + glyphMargin: true, + padding: { + top: INPUT_EDITOR_PADDING, + bottom: INPUT_EDITOR_PADDING + }, + hover: { + enabled: true + } + } + }); + + return computed; + } + + protected override saveState(): void { + this._saveEditorViewState(this.input); + super.saveState(); + } + + override getViewState(): InteractiveEditorViewState | undefined { + const input = this.input; + if (!(input instanceof ReplEditorInput)) { + return undefined; + } + + this._saveEditorViewState(input); + return this._loadNotebookEditorViewState(input); + } + + private _saveEditorViewState(input: EditorInput | undefined): void { + if (this._notebookWidget.value && input instanceof ReplEditorInput) { + if (this._notebookWidget.value.isDisposed) { + return; + } + + const state = this._notebookWidget.value.getEditorViewState(); + const editorState = this._codeEditorWidget.saveViewState(); + this._editorMemento.saveEditorState(this.group, input.resource, { + notebook: state, + input: editorState + }); + } + } + + private _loadNotebookEditorViewState(input: ReplEditorInput): InteractiveEditorViewState | undefined { + const result = this._editorMemento.loadEditorState(this.group, input.resource); + if (result) { + return result; + } + // when we don't have a view state for the group/input-tuple then we try to use an existing + // editor for the same resource. + for (const group of this._editorGroupService.getGroups(GroupsOrder.MOST_RECENTLY_ACTIVE)) { + if (group.activeEditorPane !== this && group.activeEditorPane === this && group.activeEditor?.matches(input)) { + const notebook = this._notebookWidget.value?.getEditorViewState(); + const input = this._codeEditorWidget.saveViewState(); + return { + notebook, + input + }; + } + } + return; + } + + override async setInput(input: ReplEditorInput, options: InteractiveEditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise { + // there currently is a widget which we still own so + // we need to hide it before getting a new widget + this._notebookWidget.value?.onWillHide(); + + this._codeEditorWidget?.dispose(); + + this._widgetDisposableStore.clear(); + + this._notebookWidget = >this._instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, this.group, input, { + isEmbedded: true, + isReadOnly: true, + forRepl: true, + contributions: NotebookEditorExtensionsRegistry.getSomeEditorContributions([ + ExecutionStateCellStatusBarContrib.id, + TimerCellStatusBarContrib.id, + NotebookFindContrib.id + ]), + menuIds: { + notebookToolbar: MenuId.InteractiveToolbar, + cellTitleToolbar: MenuId.InteractiveCellTitle, + cellDeleteToolbar: MenuId.InteractiveCellDelete, + cellInsertToolbar: MenuId.NotebookCellBetween, + cellTopInsertToolbar: MenuId.NotebookCellListTop, + cellExecuteToolbar: MenuId.InteractiveCellExecute, + cellExecutePrimary: undefined + }, + cellEditorContributions: EditorExtensionsRegistry.getSomeEditorContributions([ + SelectionClipboardContributionID, + ContextMenuController.ID, + HoverController.ID, + MarkerController.ID + ]), + options: this._notebookOptions, + codeWindow: this.window + }, undefined, this.window); + + this._codeEditorWidget = this._instantiationService.createInstance(CodeEditorWidget, this._inputEditorContainer, this._editorOptions, { + ...{ + isSimpleWidget: false, + contributions: EditorExtensionsRegistry.getSomeEditorContributions([ + MenuPreventer.ID, + SelectionClipboardContributionID, + ContextMenuController.ID, + SuggestController.ID, + ParameterHintsController.ID, + SnippetController2.ID, + TabCompletionController.ID, + HoverController.ID, + MarkerController.ID + ]) + } + }); + + if (this._lastLayoutDimensions) { + this._notebookEditorContainer.style.height = `${this._lastLayoutDimensions.dimension.height - this.inputCellContainerHeight}px`; + this._notebookWidget.value!.layout(new DOM.Dimension(this._lastLayoutDimensions.dimension.width, this._lastLayoutDimensions.dimension.height - this.inputCellContainerHeight), this._notebookEditorContainer); + const leftMargin = this._notebookOptions.getCellEditorContainerLeftMargin(); + const maxHeight = Math.min(this._lastLayoutDimensions.dimension.height / 2, this.inputCellEditorHeight); + this._codeEditorWidget.layout(this._validateDimension(this._lastLayoutDimensions.dimension.width - leftMargin - INPUT_CELL_HORIZONTAL_PADDING_RIGHT, maxHeight)); + this._inputFocusIndicator.style.height = `${this.inputCellEditorHeight}px`; + this._inputCellContainer.style.top = `${this._lastLayoutDimensions.dimension.height - this.inputCellContainerHeight}px`; + this._inputCellContainer.style.width = `${this._lastLayoutDimensions.dimension.width}px`; + } + + await super.setInput(input, options, context, token); + const model = await input.resolve(); + if (this._runbuttonToolbar) { + this._runbuttonToolbar.context = input.resource; + } + + if (model === null) { + throw new Error('The REPL model could not be resolved'); + } + + this._notebookWidget.value?.setParentContextKeyService(this._contextKeyService); + + const viewState = options?.viewState ?? this._loadNotebookEditorViewState(input); + await this._extensionService.whenInstalledExtensionsRegistered(); + await this._notebookWidget.value!.setModel(model.notebook, viewState?.notebook); + model.notebook.setCellCollapseDefault(this._notebookOptions.getCellCollapseDefault()); + this._notebookWidget.value!.setOptions({ + isReadOnly: true + }); + this._widgetDisposableStore.add(this._notebookWidget.value!.onDidResizeOutput((cvm) => { + this._scrollIfNecessary(cvm); + })); + this._widgetDisposableStore.add(this._notebookWidget.value!.onDidFocusWidget(() => this._onDidFocusWidget.fire())); + this._widgetDisposableStore.add(this._notebookOptions.onDidChangeOptions(e => { + if (e.compactView || e.focusIndicator) { + // update the styling + this._styleElement?.remove(); + this._createLayoutStyles(); + } + + if (this._lastLayoutDimensions && this.isVisible()) { + this.layout(this._lastLayoutDimensions.dimension, this._lastLayoutDimensions.position); + } + + if (e.interactiveWindowCollapseCodeCells) { + model.notebook.setCellCollapseDefault(this._notebookOptions.getCellCollapseDefault()); + } + })); + + const editorModel = await input.resolveInput(model.notebook); + this._codeEditorWidget.setModel(editorModel); + if (viewState?.input) { + this._codeEditorWidget.restoreViewState(viewState.input); + } + this._editorOptions = this._computeEditorOptions(); + this._codeEditorWidget.updateOptions(this._editorOptions); + + this._widgetDisposableStore.add(this._codeEditorWidget.onDidFocusEditorWidget(() => this._onDidFocusWidget.fire())); + this._widgetDisposableStore.add(this._codeEditorWidget.onDidContentSizeChange(e => { + if (!e.contentHeightChanged) { + return; + } + + if (this._lastLayoutDimensions) { + this._layoutWidgets(this._lastLayoutDimensions.dimension, this._lastLayoutDimensions.position); + } + })); + + this._widgetDisposableStore.add(this._codeEditorWidget.onDidChangeCursorPosition(e => this._onDidChangeSelection.fire({ reason: this._toEditorPaneSelectionChangeReason(e) }))); + this._widgetDisposableStore.add(this._codeEditorWidget.onDidChangeModelContent(() => this._onDidChangeSelection.fire({ reason: EditorPaneSelectionChangeReason.EDIT }))); + + + this._widgetDisposableStore.add(this._notebookKernelService.onDidChangeNotebookAffinity(this._syncWithKernel, this)); + this._widgetDisposableStore.add(this._notebookKernelService.onDidChangeSelectedNotebooks(this._syncWithKernel, this)); + + this._widgetDisposableStore.add(this.themeService.onDidColorThemeChange(() => { + if (this.isVisible()) { + this._updateInputDecoration(); + } + })); + + this._widgetDisposableStore.add(this._codeEditorWidget.onDidChangeModelContent(() => { + if (this.isVisible()) { + this._updateInputDecoration(); + } + })); + + const cursorAtBoundaryContext = INTERACTIVE_INPUT_CURSOR_BOUNDARY.bindTo(this._contextKeyService); + if (input.resource && input.historyService.has(input.resource)) { + cursorAtBoundaryContext.set('top'); + } else { + cursorAtBoundaryContext.set('none'); + } + + this._widgetDisposableStore.add(this._codeEditorWidget.onDidChangeCursorPosition(({ position }) => { + const viewModel = this._codeEditorWidget._getViewModel()!; + const lastLineNumber = viewModel.getLineCount(); + const lastLineCol = viewModel.getLineLength(lastLineNumber) + 1; + const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(position); + const firstLine = viewPosition.lineNumber === 1 && viewPosition.column === 1; + const lastLine = viewPosition.lineNumber === lastLineNumber && viewPosition.column === lastLineCol; + + if (firstLine) { + if (lastLine) { + cursorAtBoundaryContext.set('both'); + } else { + cursorAtBoundaryContext.set('top'); + } + } else { + if (lastLine) { + cursorAtBoundaryContext.set('bottom'); + } else { + cursorAtBoundaryContext.set('none'); + } + } + })); + + this._widgetDisposableStore.add(editorModel.onDidChangeContent(() => { + const value = editorModel.getValue(); + if (this.input?.resource && value !== '') { + (this.input as ReplEditorInput).historyService.replaceLast(this.input.resource, value); + } + })); + + this._widgetDisposableStore.add(this._notebookWidget.value!.onDidScroll(() => this._onDidChangeScroll.fire())); + + this._syncWithKernel(); + } + + override setOptions(options: INotebookEditorOptions | undefined): void { + this._notebookWidget.value?.setOptions(options); + super.setOptions(options); + } + + private _toEditorPaneSelectionChangeReason(e: ICursorPositionChangedEvent): EditorPaneSelectionChangeReason { + switch (e.source) { + case TextEditorSelectionSource.PROGRAMMATIC: return EditorPaneSelectionChangeReason.PROGRAMMATIC; + case TextEditorSelectionSource.NAVIGATION: return EditorPaneSelectionChangeReason.NAVIGATION; + case TextEditorSelectionSource.JUMP: return EditorPaneSelectionChangeReason.JUMP; + default: return EditorPaneSelectionChangeReason.USER; + } + } + + private _cellAtBottom(cell: ICellViewModel): boolean { + const visibleRanges = this._notebookWidget.value?.visibleRanges || []; + const cellIndex = this._notebookWidget.value?.getCellIndex(cell); + if (cellIndex === Math.max(...visibleRanges.map(range => range.end - 1))) { + return true; + } + return false; + } + + private _scrollIfNecessary(cvm: ICellViewModel) { + const index = this._notebookWidget.value!.getCellIndex(cvm); + if (index === this._notebookWidget.value!.getLength() - 1) { + // If we're already at the bottom or auto scroll is enabled, scroll to the bottom + if (this._configurationService.getValue(InteractiveWindowSetting.interactiveWindowAlwaysScrollOnNewCell) || this._cellAtBottom(cvm)) { + this._notebookWidget.value!.scrollToBottom(); + } + } + } + + private _syncWithKernel() { + const notebook = this._notebookWidget.value?.textModel; + const textModel = this._codeEditorWidget.getModel(); + + if (notebook && textModel) { + const info = this._notebookKernelService.getMatchingKernel(notebook); + const selectedOrSuggested = info.selected + ?? (info.suggestions.length === 1 ? info.suggestions[0] : undefined) + ?? (info.all.length === 1 ? info.all[0] : undefined); + + if (selectedOrSuggested) { + const language = selectedOrSuggested.supportedLanguages[0]; + // All kernels will initially list plaintext as the supported language before they properly initialized. + if (language && language !== 'plaintext') { + const newMode = this._languageService.createById(language).languageId; + textModel.setLanguage(newMode); + } + + NOTEBOOK_KERNEL.bindTo(this._contextKeyService).set(selectedOrSuggested.id); + } + } + + this._updateInputDecoration(); + } + + layout(dimension: DOM.Dimension, position: DOM.IDomPosition): void { + this._rootElement.classList.toggle('mid-width', dimension.width < 1000 && dimension.width >= 600); + this._rootElement.classList.toggle('narrow-width', dimension.width < 600); + const editorHeightChanged = dimension.height !== this._lastLayoutDimensions?.dimension.height; + this._lastLayoutDimensions = { dimension, position }; + + if (!this._notebookWidget.value) { + return; + } + + if (editorHeightChanged && this._codeEditorWidget) { + SuggestController.get(this._codeEditorWidget)?.cancelSuggestWidget(); + } + + this._notebookEditorContainer.style.height = `${this._lastLayoutDimensions.dimension.height - this.inputCellContainerHeight}px`; + this._layoutWidgets(dimension, position); + } + + private _layoutWidgets(dimension: DOM.Dimension, position: DOM.IDomPosition) { + const contentHeight = this._codeEditorWidget.hasModel() ? this._codeEditorWidget.getContentHeight() : this.inputCellEditorHeight; + const maxHeight = Math.min(dimension.height / 2, contentHeight); + const leftMargin = this._notebookOptions.getCellEditorContainerLeftMargin(); + + const inputCellContainerHeight = maxHeight + INPUT_CELL_VERTICAL_PADDING * 2; + this._notebookEditorContainer.style.height = `${dimension.height - inputCellContainerHeight}px`; + + this._notebookWidget.value!.layout(dimension.with(dimension.width, dimension.height - inputCellContainerHeight), this._notebookEditorContainer, position); + this._codeEditorWidget.layout(this._validateDimension(dimension.width - leftMargin - INPUT_CELL_HORIZONTAL_PADDING_RIGHT, maxHeight)); + this._inputFocusIndicator.style.height = `${contentHeight}px`; + this._inputCellContainer.style.top = `${dimension.height - inputCellContainerHeight}px`; + this._inputCellContainer.style.width = `${dimension.width}px`; + } + + private _validateDimension(width: number, height: number) { + return new DOM.Dimension(Math.max(0, width), Math.max(0, height)); + } + + private _updateInputDecoration(): void { + if (!this._codeEditorWidget) { + return; + } + + if (!this._codeEditorWidget.hasModel()) { + return; + } + + const model = this._codeEditorWidget.getModel(); + + const decorations: IDecorationOptions[] = []; + + if (model?.getValueLength() === 0) { + const transparentForeground = resolveColorValue(editorForeground, this.themeService.getColorTheme())?.transparent(0.4); + const languageId = model.getLanguageId(); + if (languageId !== 'plaintext') { + const keybinding = this._keybindingService.lookupKeybinding(EXECUTE_REPL_COMMAND_ID, this._contextKeyService)?.getLabel(); + const text = keybinding ? + nls.localize('interactiveInputPlaceHolder', "Type '{0}' code here and press {1} to run", languageId, keybinding) : + nls.localize('interactiveInputPlaceHolderNoKeybinding', "Type '{0}' code here and click run", languageId); + decorations.push({ + range: { + startLineNumber: 0, + endLineNumber: 0, + startColumn: 0, + endColumn: 1 + }, + renderOptions: { + after: { + contentText: text, + color: transparentForeground ? transparentForeground.toString() : undefined + } + } + }); + } + + } + + this._codeEditorWidget.setDecorationsByType('interactive-decoration', DECORATION_KEY, decorations); + } + + getScrollPosition(): IEditorPaneScrollPosition { + return { + scrollTop: this._notebookWidget.value?.scrollTop ?? 0, + scrollLeft: 0 + }; + } + + setScrollPosition(position: IEditorPaneScrollPosition): void { + this._notebookWidget.value?.setScrollTop(position.scrollTop); + } + + override focus() { + super.focus(); + + this._notebookWidget.value?.onShow(); + this._codeEditorWidget.focus(); + } + + focusHistory() { + this._notebookWidget.value!.focus(); + } + + protected override setEditorVisible(visible: boolean): void { + super.setEditorVisible(visible); + this._groupListener.value = this.group.onWillCloseEditor(e => this._saveEditorViewState(e.editor)); + + if (!visible) { + this._saveEditorViewState(this.input); + if (this.input && this._notebookWidget.value) { + this._notebookWidget.value.onWillHide(); + } + } + } + + override clearInput() { + if (this._notebookWidget.value) { + this._saveEditorViewState(this.input); + this._notebookWidget.value.onWillHide(); + } + + this._codeEditorWidget?.dispose(); + + this._notebookWidget = { value: undefined }; + this._widgetDisposableStore.clear(); + + super.clearInput(); + } + + override getControl(): { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } { + return { + notebookEditor: this._notebookWidget.value, + codeEditor: this._codeEditorWidget + }; + } +} diff --git a/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.ts b/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.ts new file mode 100644 index 0000000000000..bf82d590a26fc --- /dev/null +++ b/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.ts @@ -0,0 +1,88 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IReference } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; +import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IFileService } from 'vs/platform/files/common/files'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { EditorInputCapabilities } from 'vs/workbench/common/editor'; +import { IInteractiveHistoryService } from 'vs/workbench/contrib/interactive/browser/interactiveHistoryService'; +import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; +import { NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; +import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; +import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { ICustomEditorLabelService } from 'vs/workbench/services/editor/common/customEditorLabelService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; + +export class ReplEditorInput extends NotebookEditorInput { + static override ID: string = 'workbench.editorinputs.replEditorInput'; + + private inputModelRef: IReference | undefined; + private isScratchpad: boolean; + private isDisposing = false; + + constructor( + resource: URI, + @INotebookService _notebookService: INotebookService, + @INotebookEditorModelResolverService _notebookModelResolverService: INotebookEditorModelResolverService, + @IFileDialogService _fileDialogService: IFileDialogService, + @ILabelService labelService: ILabelService, + @IFileService fileService: IFileService, + @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService, + @IExtensionService extensionService: IExtensionService, + @IEditorService editorService: IEditorService, + @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, + @ICustomEditorLabelService customEditorLabelService: ICustomEditorLabelService, + @IInteractiveHistoryService public readonly historyService: IInteractiveHistoryService, + @ITextModelService private readonly _textModelService: ITextModelService, + @IConfigurationService configurationService: IConfigurationService + ) { + super(resource, undefined, 'jupyter-notebook', {}, _notebookService, _notebookModelResolverService, _fileDialogService, labelService, fileService, filesConfigurationService, extensionService, editorService, textResourceConfigurationService, customEditorLabelService); + this.isScratchpad = configurationService.getValue(NotebookSetting.InteractiveWindowPromptToSave) !== true; + } + + override get typeId(): string { + return ReplEditorInput.ID; + } + + override getName() { + return 'REPL'; + } + + override get capabilities() { + const capabilities = super.capabilities; + const scratchPad = this.isScratchpad ? EditorInputCapabilities.Scratchpad : 0; + + return capabilities + | EditorInputCapabilities.Readonly + | scratchPad; + } + + async resolveInput(notebook: NotebookTextModel) { + if (this.inputModelRef) { + return this.inputModelRef.object.textEditorModel; + } + + const lastCell = notebook.cells[notebook.cells.length - 1]; + this.inputModelRef = await this._textModelService.createModelReference(lastCell.uri); + return this.inputModelRef.object.textEditorModel; + } + + override dispose() { + if (!this.isDisposing) { + this.isDisposing = true; + this.editorModelReference?.object.revert({ soft: true }); + this.inputModelRef?.dispose(); + super.dispose(); + } + } +} diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index a4e3fa69d6ec5..8ec34fb9b6c46 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -193,6 +193,9 @@ import 'vs/workbench/contrib/inlineChat/browser/inlineChat.contribution'; // Interactive import 'vs/workbench/contrib/interactive/browser/interactive.contribution'; +// repl +import 'vs/workbench/contrib/replNotebook/browser/repl.contribution'; + // Testing import 'vs/workbench/contrib/testing/browser/testing.contribution'; From d32e0933741c8d6fff8a5769989c1a110cb4bda0 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Fri, 14 Jun 2024 15:41:28 -0700 Subject: [PATCH 249/755] fix: prevent 'rerun without' hint from overflowing chat list (#215594) --- src/vs/workbench/contrib/chat/browser/media/chat.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/chat/browser/media/chat.css b/src/vs/workbench/contrib/chat/browser/media/chat.css index f827efc194fc6..84960e0829142 100644 --- a/src/vs/workbench/contrib/chat/browser/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/media/chat.css @@ -40,6 +40,7 @@ display: flex; align-items: center; gap: 8px; + overflow: hidden; } .interactive-item-container .header .username { From 03d781a755a8670969ca2b255328699a8ceb3bb5 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Fri, 14 Jun 2024 15:54:51 -0700 Subject: [PATCH 250/755] cli: fix closing incorrectly if updated failed (#215595) --- cli/src/tunnels/control_server.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/src/tunnels/control_server.rs b/cli/src/tunnels/control_server.rs index f42984cfac150..dfb5e381179f2 100644 --- a/cli/src/tunnels/control_server.rs +++ b/cli/src/tunnels/control_server.rs @@ -920,9 +920,14 @@ async fn handle_update( info!(log, "Updating CLI to {}", latest_release); - updater + let r = updater .do_update(&latest_release, SilentCopyProgress()) - .await?; + .await; + + if let Err(e) = r { + did_update.store(false, Ordering::SeqCst); + return Err(e); + } Ok(UpdateResult { up_to_date: true, From a41578cab7b6ed4a6be124ba1c29c75c9e662a5c Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:12:14 -0700 Subject: [PATCH 251/755] Fix titlebar restore when in zen mode (#215596) fix titlebar restore when in zen mode --- src/vs/workbench/services/layout/browser/layoutService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index 3357adabc8228..2955a53995c37 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -318,7 +318,7 @@ export function shouldShowCustomTitleBar(configurationService: IConfigurationSer } if (zenModeActive) { - return false; + return !configurationService.getValue(ZenModeSettings.FULLSCREEN); } const inFullscreen = isFullscreen(window); From be838c0af750068c602ff37bf8a0fb0b44731579 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:37:10 -0700 Subject: [PATCH 252/755] Revert "Don't merge a view with a titleDescription (fix #166000) (#214010)" (#215597) This reverts commit af1bd0264a4430575b16abf6f15fefbe497434dc. --- src/vs/workbench/browser/parts/views/viewPaneContainer.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index f190e2862c792..d782b08c3c26a 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -1100,10 +1100,6 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { if (!(this.options.mergeViewWithContainerWhenSingleView && this.paneItems.length === 1)) { return false; } - if (this.paneItems[0].pane.titleDescription) { - // Don't merge a view with a titleDescription. See #166000 - return false; - } if (!this.areExtensionsReady) { if (this.visibleViewsCountFromCache === undefined) { return this.paneItems[0].pane.isExpanded(); From 35ac2d01a6b7ae2e0141377a6a924f050aa65237 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 14 Jun 2024 16:38:22 -0700 Subject: [PATCH 253/755] Improve chat input history (#215593) * Fixes to history navigation with dynamic variables Prevent ChatDynamicVariableModel deleting editor text while in history navigation * Try to add history item for current input, doesn't quite work * Use HistoryNavigator2 in chat * Update context attachments for new input state model * Add SetWithKey and use it in HistoryNavigator2 * Fix history for 2 widget inline chat * Add log action, clean up * Add tests for SetWithKey * comment * Fix --- src/vs/base/common/collections.ts | 58 ++++++++ src/vs/base/common/history.ts | 14 +- src/vs/base/test/common/collections.test.ts | 66 +++++++++ .../browser/actions/chatDeveloperActions.ts | 35 +++++ .../contrib/chat/browser/chat.contribution.ts | 2 + src/vs/workbench/contrib/chat/browser/chat.ts | 1 + .../contrib/chat/browser/chatInputPart.ts | 136 ++++++++++++------ .../contrib/chat/browser/chatWidget.ts | 30 +++- .../browser/contrib/chatContextAttachments.ts | 17 ++- .../browser/contrib/chatDynamicVariables.ts | 30 ++-- .../inlineChat/browser/inlineChatWidget.ts | 2 +- .../contrib/scm/common/scmService.ts | 2 +- 12 files changed, 320 insertions(+), 73 deletions(-) create mode 100644 src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.ts diff --git a/src/vs/base/common/collections.ts b/src/vs/base/common/collections.ts index 0b306144e5eea..d0df190c75b4e 100644 --- a/src/vs/base/common/collections.ts +++ b/src/vs/base/common/collections.ts @@ -80,3 +80,61 @@ export function intersection(setA: Set, setB: Iterable): Set { } return result; } + +export class SetWithKey implements Set { + private _map = new Map(); + + constructor(values: T[], private toKey: (t: T) => any) { + for (const value of values) { + this.add(value); + } + } + + get size(): number { + return this._map.size; + } + + add(value: T): this { + const key = this.toKey(value); + this._map.set(key, value); + return this; + } + + delete(value: T): boolean { + return this._map.delete(this.toKey(value)); + } + + has(value: T): boolean { + return this._map.has(this.toKey(value)); + } + + *entries(): IterableIterator<[T, T]> { + for (const entry of this._map.values()) { + yield [entry, entry]; + } + } + + keys(): IterableIterator { + return this.values(); + } + + *values(): IterableIterator { + for (const entry of this._map.values()) { + yield entry; + } + } + + clear(): void { + this._map.clear(); + } + + forEach(callbackfn: (value: T, value2: T, set: Set) => void, thisArg?: any): void { + this._map.forEach(entry => callbackfn.call(thisArg, entry, entry, this)); + } + + [Symbol.iterator](): IterableIterator { + return this.values(); + } + + [Symbol.toStringTag]: string = 'SetWithKey'; +} diff --git a/src/vs/base/common/history.ts b/src/vs/base/common/history.ts index de5788103550f..9d644a851c587 100644 --- a/src/vs/base/common/history.ts +++ b/src/vs/base/common/history.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { SetWithKey } from 'vs/base/common/collections'; import { ArrayNavigator, INavigator } from 'vs/base/common/navigator'; export class HistoryNavigator implements INavigator { @@ -114,6 +115,10 @@ interface HistoryNode { next: HistoryNode | undefined; } +/** + * The right way to use HistoryNavigator2 is for the last item in the list to be the user's uncommitted current text. eg empty string, or whatever has been typed. Then + * the user can navigate away from the last item through the list, and back to it. When updating the last item, call replaceLast. + */ export class HistoryNavigator2 { private valueSet: Set; @@ -123,7 +128,7 @@ export class HistoryNavigator2 { private _size: number; get size(): number { return this._size; } - constructor(history: readonly T[], private capacity: number = 10) { + constructor(history: readonly T[], private capacity: number = 10, private identityFn: (t: T) => any = t => t) { if (history.length < 1) { throw new Error('not supported'); } @@ -135,7 +140,7 @@ export class HistoryNavigator2 { next: undefined }; - this.valueSet = new Set([history[0]]); + this.valueSet = new SetWithKey([history[0]], identityFn); for (let i = 1; i < history.length; i++) { this.add(history[i]); } @@ -172,7 +177,7 @@ export class HistoryNavigator2 { * @returns old last value */ replaceLast(value: T): T { - if (this.tail.value === value) { + if (this.identityFn(this.tail.value) === this.identityFn(value)) { return value; } @@ -252,8 +257,9 @@ export class HistoryNavigator2 { private _deleteFromList(value: T): void { let temp = this.head; + const valueKey = this.identityFn(value); while (temp !== this.tail) { - if (temp.value === value) { + if (this.identityFn(temp.value) === valueKey) { if (temp === this.head) { this.head = this.head.next!; this.head.previous = undefined; diff --git a/src/vs/base/test/common/collections.test.ts b/src/vs/base/test/common/collections.test.ts index ae9ead05c412f..b1304b3f30f87 100644 --- a/src/vs/base/test/common/collections.test.ts +++ b/src/vs/base/test/common/collections.test.ts @@ -32,4 +32,70 @@ suite('Collections', () => { assert.strictEqual(grouped[group2].length, 1); assert.strictEqual(grouped[group2][0].value, value3); }); + + suite('SetWithKey', () => { + let setWithKey: collections.SetWithKey<{ someProp: string }>; + + const initialValues = ['a', 'b', 'c'].map(s => ({ someProp: s })); + setup(() => { + setWithKey = new collections.SetWithKey<{ someProp: string }>(initialValues, value => value.someProp); + }); + + test('size', () => { + assert.strictEqual(setWithKey.size, 3); + }); + + test('add', () => { + setWithKey.add({ someProp: 'd' }); + assert.strictEqual(setWithKey.size, 4); + assert.strictEqual(setWithKey.has({ someProp: 'd' }), true); + }); + + test('delete', () => { + assert.strictEqual(setWithKey.has({ someProp: 'b' }), true); + setWithKey.delete({ someProp: 'b' }); + assert.strictEqual(setWithKey.size, 2); + assert.strictEqual(setWithKey.has({ someProp: 'b' }), false); + }); + + test('has', () => { + assert.strictEqual(setWithKey.has({ someProp: 'a' }), true); + assert.strictEqual(setWithKey.has({ someProp: 'b' }), true); + }); + + test('entries', () => { + const entries = Array.from(setWithKey.entries()); + assert.deepStrictEqual(entries, initialValues.map(value => [value, value])); + }); + + test('keys and values', () => { + const keys = Array.from(setWithKey.keys()); + const values = Array.from(setWithKey.values()); + assert.deepStrictEqual(keys, initialValues); + assert.deepStrictEqual(values, initialValues); + }); + + test('clear', () => { + setWithKey.clear(); + assert.strictEqual(setWithKey.size, 0); + }); + + test('forEach', () => { + const values: any[] = []; + setWithKey.forEach(value => values.push(value)); + assert.deepStrictEqual(values, initialValues); + }); + + test('iterator', () => { + const values: any[] = []; + for (const value of setWithKey) { + values.push(value); + } + assert.deepStrictEqual(values, initialValues); + }); + + test('toStringTag', () => { + assert.strictEqual(setWithKey[Symbol.toStringTag], 'SetWithKey'); + }); + }); }); diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.ts new file mode 100644 index 0000000000000..4ab735e2b4e3c --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Codicon } from 'vs/base/common/codicons'; +import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { localize2 } from 'vs/nls'; +import { Categories } from 'vs/platform/action/common/actionCommonCategories'; +import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; +import { IChatWidgetService } from 'vs/workbench/contrib/chat/browser/chat'; + +export function registerChatDeveloperActions() { + registerAction2(LogChatInputHistoryAction); +} + +class LogChatInputHistoryAction extends Action2 { + + static readonly ID = 'workbench.action.chat.logInputHistory'; + + constructor() { + super({ + id: LogChatInputHistoryAction.ID, + title: localize2('workbench.action.chat.logInputHistory.label', "Log Chat Input History"), + icon: Codicon.attach, + category: Categories.Developer, + f1: true + }); + } + + override async run(accessor: ServicesAccessor, ...args: any[]): Promise { + const chatWidgetService = accessor.get(IChatWidgetService); + chatWidgetService.lastFocusedWidget?.logInputHistory(); + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 44064deca5660..96ba482b2ab5d 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -58,6 +58,7 @@ import { IEditorResolverService, RegisteredEditorPriority } from 'vs/workbench/s import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import '../common/chatColors'; import { registerChatContextActions } from 'vs/workbench/contrib/chat/browser/actions/chatContextActions'; +import { registerChatDeveloperActions } from 'vs/workbench/contrib/chat/browser/actions/chatDeveloperActions'; // Register configuration const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); @@ -250,6 +251,7 @@ registerChatExportActions(); registerMoveActions(); registerNewChatActions(); registerChatContextActions(); +registerChatDeveloperActions(); registerSingleton(IChatService, ChatService, InstantiationType.Delayed); registerSingleton(IChatWidgetService, ChatWidgetService, InstantiationType.Delayed); diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index c183bc78e1d40..1279810a3ec2d 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -157,6 +157,7 @@ export interface IChatWidget { getFocus(): ChatTreeItem | undefined; setInput(query?: string): void; getInput(): string; + logInputHistory(): void; acceptInput(query?: string): Promise; acceptInputWithPrefix(prefix: string): void; setInputPlaceholder(placeholder: string): void; diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index 5fa1417f4c092..15182bb6bdff7 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -6,14 +6,16 @@ import * as dom from 'vs/base/browser/dom'; import { DEFAULT_FONT_FAMILY } from 'vs/base/browser/fonts'; import { IHistoryNavigationWidget } from 'vs/base/browser/history'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import * as aria from 'vs/base/browser/ui/aria/aria'; -import { Range } from 'vs/editor/common/core/range'; import { Button } from 'vs/base/browser/ui/button/button'; import { IAction } from 'vs/base/common/actions'; import { Codicon } from 'vs/base/common/codicons'; import { Emitter } from 'vs/base/common/event'; -import { HistoryNavigator } from 'vs/base/common/history'; +import { HistoryNavigator2 } from 'vs/base/common/history'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { basename, dirname } from 'vs/base/common/path'; import { isMacintosh } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; @@ -21,6 +23,7 @@ import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; import { IDimension } from 'vs/editor/common/core/dimension'; import { IPosition } from 'vs/editor/common/core/position'; +import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; @@ -38,6 +41,7 @@ import { registerAndCreateHistoryNavigationContext } from 'vs/platform/history/b import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ResourceLabels } from 'vs/workbench/browser/labels'; @@ -53,9 +57,6 @@ import { IChatFollowup } from 'vs/workbench/contrib/chat/common/chatService'; import { IChatResponseViewModel } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { IChatHistoryEntry, IChatWidgetHistoryService } from 'vs/workbench/contrib/chat/common/chatWidgetHistoryService'; import { getSimpleCodeEditorWidgetOptions, getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import { basename, dirname } from 'vs/base/common/path'; const $ = dom.$; @@ -130,10 +131,9 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge return this._inputEditor; } - private history: HistoryNavigator; + private history: HistoryNavigator2; private historyNavigationBackwardsEnablement!: IContextKey; private historyNavigationForewardsEnablement!: IContextKey; - private onHistoryEntry = false; private inHistoryNavigation = false; private inputModel: ITextModel | undefined; private inputEditorHasText: IContextKey; @@ -156,6 +156,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge @IConfigurationService private readonly configurationService: IConfigurationService, @IKeybindingService private readonly keybindingService: IKeybindingService, @IAccessibilityService private readonly accessibilityService: IAccessibilityService, + @ILogService private readonly logService: ILogService, ) { super(); @@ -165,8 +166,8 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge this.chatCursorAtTop = CONTEXT_CHAT_INPUT_CURSOR_AT_TOP.bindTo(contextKeyService); this.inputEditorHasFocus = CONTEXT_CHAT_INPUT_HAS_FOCUS.bindTo(contextKeyService); - this.history = new HistoryNavigator([], 5); - this._register(this.historyService.onDidClearHistory(() => this.history.clear())); + this.history = this.loadHistory(); + this._register(this.historyService.onDidClearHistory(() => this.history = new HistoryNavigator2([{ text: '' }], 50, historyKeyFn))); this._register(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(AccessibilityVerbositySettingId.Chat)) { @@ -175,6 +176,15 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge })); } + private loadHistory(): HistoryNavigator2 { + const history = this.historyService.getHistory(this.location); + if (history.length === 0) { + history.push({ text: '' }); + } + + return new HistoryNavigator2(history, 50, historyKeyFn); + } + private _getAriaLabel(): string { const verbose = this.configurationService.getValue(AccessibilityVerbositySettingId.Chat); if (verbose) { @@ -184,15 +194,37 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge return localize('chatInput', "Chat Input"); } - setState(inputValue: string | undefined): void { - const history = this.historyService.getHistory(this.location); - this.history = new HistoryNavigator(history, 50); + updateState(inputState: Object): void { + if (this.inHistoryNavigation) { + return; + } + + const newEntry = { text: this._inputEditor.getValue(), state: inputState }; - if (typeof inputValue === 'string') { - this.setValue(inputValue); + if (this.history.isAtEnd()) { + // The last history entry should always be the current input value + this.history.replaceLast(newEntry); + } else { + // Added a reference while in the middle of history navigation, it's a new entry + this.history.replaceLast(newEntry); + this.history.resetCursor(); } } + initForNewChatModel(inputValue: string | undefined, inputState: Object): void { + this.history = this.loadHistory(); + this.history.add({ text: inputValue ?? this.history.current().text, state: inputState }); + + if (inputValue) { + this.setValue(inputValue, false); + } + } + + logInputHistory(): void { + const historyStr = [...this.history].map(entry => JSON.stringify(entry)).join('\n'); + this.logService.info(`[${this.location}] Chat input history:`, historyStr); + } + setVisible(visible: boolean): void { this._onDidChangeVisibility.fire(visible); } @@ -202,24 +234,39 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge } showPreviousValue(): void { + if (this.history.isAtEnd()) { + this.saveCurrentValue(); + } else { + if (!this.history.has({ text: this._inputEditor.getValue(), state: this.history.current().state })) { + this.saveCurrentValue(); + this.history.resetCursor(); + } + } + this.navigateHistory(true); } showNextValue(): void { + if (this.history.isAtEnd()) { + return; + } else { + if (!this.history.has({ text: this._inputEditor.getValue(), state: this.history.current().state })) { + this.saveCurrentValue(); + this.history.resetCursor(); + } + } + this.navigateHistory(false); } private navigateHistory(previous: boolean): void { - const historyEntry = (previous ? - (this.history.previous() ?? this.history.first()) : this.history.next()) - ?? { text: '' }; - - this.onHistoryEntry = previous || this.history.current() !== null; + const historyEntry = previous ? + this.history.previous() : this.history.next(); aria.status(historyEntry.text); this.inHistoryNavigation = true; - this.setValue(historyEntry.text); + this.setValue(historyEntry.text, true); this.inHistoryNavigation = false; this._onDidLoadInputState.fire(historyEntry.state); @@ -235,10 +282,19 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge } } - setValue(value: string): void { + setValue(value: string, transient: boolean): void { this.inputEditor.setValue(value); // always leave cursor at the end this.inputEditor.setPosition({ lineNumber: 1, column: value.length + 1 }); + + if (!transient) { + this.saveCurrentValue(); + } + } + + private saveCurrentValue(): void { + const newEntry = { text: this._inputEditor.getValue(), state: this.history.current().state }; + this.history.replaceLast(newEntry); } focus() { @@ -253,17 +309,15 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge * Reset the input and update history. * @param userQuery If provided, this will be added to the history. Followups and programmatic queries should not be passed. */ - async acceptInput(userQuery?: string, inputState?: any): Promise { - if (userQuery) { - let element = this.history.getHistory().find(candidate => candidate.text === userQuery); - if (!element) { - element = { text: userQuery, state: inputState }; - } else { - element.state = inputState; - } - this.history.add(element); + async acceptInput(isUserQuery?: boolean): Promise { + if (isUserQuery) { + const userQuery = this._inputEditor.getValue(); + const entry: IChatHistoryEntry = { text: userQuery, state: this.history.current().state }; + this.history.replaceLast(entry); + this.history.add({ text: '' }); } + this._onDidLoadInputState.fire({}); if (this.accessibilityService.isScreenReaderOptimized() && isMacintosh) { this._acceptInputForVoiceover(); } else { @@ -343,21 +397,9 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge this._onDidChangeHeight.fire(); } - // Only allow history navigation when the input is empty. - // (If this model change happened as a result of a history navigation, this is canceled out by a call in this.navigateHistory) const model = this._inputEditor.getModel(); const inputHasText = !!model && model.getValue().trim().length > 0; this.inputEditorHasText.set(inputHasText); - - // If the user is typing on a history entry, then reset the onHistoryEntry flag so that history navigation can be disabled - if (!this.inHistoryNavigation) { - this.onHistoryEntry = false; - } - - if (!this.onHistoryEntry) { - this.historyNavigationForewardsEnablement.set(!inputHasText); - this.historyNavigationBackwardsEnablement.set(!inputHasText); - } })); this._register(this._inputEditor.onDidFocusEditorText(() => { this.inputEditorHasFocus.set(true); @@ -379,10 +421,8 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge const atTop = e.position.column === 1 && e.position.lineNumber === 1; this.chatCursorAtTop.set(atTop); - if (this.onHistoryEntry) { - this.historyNavigationBackwardsEnablement.set(atTop); - this.historyNavigationForewardsEnablement.set(e.position.equals(getLastPosition(model))); - } + this.historyNavigationBackwardsEnablement.set(atTop); + this.historyNavigationForewardsEnablement.set(e.position.equals(getLastPosition(model))); })); this.toolbar = this._register(this.instantiationService.createInstance(MenuWorkbenchToolBar, inputContainer, this.options.menus.executeToolbar, { @@ -568,11 +608,13 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge } saveState(): void { - const inputHistory = this.history.getHistory(); + const inputHistory = [...this.history]; this.historyService.saveHistory(this.location, inputHistory); } } +const historyKeyFn = (entry: IChatHistoryEntry) => JSON.stringify(entry); + function getLastPosition(model: ITextModel): IPosition { return { lineNumber: model.getLineCount(), column: model.getLineLength(model.getLineCount()) + 1 }; } diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index 830664edef032..7b7f175b465cc 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -69,6 +69,8 @@ export interface IChatWidgetContrib extends IDisposable { */ getInputState?(): any; + onDidChangeInputState?: Event; + /** * Called with the result of getInputState when navigating input history. */ @@ -111,7 +113,7 @@ export class ChatWidget extends Disposable implements IChatWidget { private readonly _onDidChangeContentHeight = new Emitter(); readonly onDidChangeContentHeight: Event = this._onDidChangeContentHeight.event; - private contribs: IChatWidgetContrib[] = []; + private contribs: ReadonlyArray = []; private tree!: WorkbenchObjectTree; private renderer!: ChatListItemRenderer; @@ -311,6 +313,15 @@ export class ChatWidget extends Disposable implements IChatWidget { return undefined; } }).filter(isDefined); + + this.contribs.forEach(c => { + if (c.onDidChangeInputState) { + this._register(c.onDidChangeInputState(() => { + const state = this.collectInputState(); + this.inputPart.updateState(state); + })); + } + }); } getContrib(id: string): T | undefined { @@ -552,8 +563,9 @@ export class ChatWidget extends Disposable implements IChatWidget { this._register(this.inputPart.onDidLoadInputState(state => { this.contribs.forEach(c => { - if (c.setInputState && typeof state === 'object' && state?.[c.id]) { - c.setInputState(state[c.id]); + if (c.setInputState) { + const contribState = (typeof state === 'object' && state?.[c.id]) ?? {}; + c.setInputState(contribState); } }); })); @@ -646,7 +658,7 @@ export class ChatWidget extends Disposable implements IChatWidget { this.viewModel = undefined; this.onDidChangeItems(); })); - this.inputPart.setState(viewState.inputValue); + this.inputPart.initForNewChatModel(viewState.inputValue, viewState.inputState ?? this.collectInputState()); this.contribs.forEach(c => { if (c.setInputState && viewState.inputState?.[c.id]) { c.setInputState(viewState.inputState?.[c.id]); @@ -692,13 +704,17 @@ export class ChatWidget extends Disposable implements IChatWidget { } setInput(value = ''): void { - this.inputPart.setValue(value); + this.inputPart.setValue(value, false); } getInput(): string { return this.inputPart.inputEditor.getValue(); } + logInputHistory(): void { + this.inputPart.logInputHistory(); + } + async acceptInput(query?: string): Promise { return this._acceptInput(query ? { query } : undefined); } @@ -731,9 +747,9 @@ export class ChatWidget extends Disposable implements IChatWidget { if (result) { this.inputPart.attachedContext.clear(); - const inputState = this.collectInputState(); - this.inputPart.acceptInput(isUserQuery ? input : undefined, isUserQuery ? inputState : undefined); + this.inputPart.acceptInput(isUserQuery); this._onDidSubmitAgent.fire({ agent: result.agent, slashCommand: result.slashCommand }); + this.inputPart.updateState(this.collectInputState()); result.responseCompletePromise.then(() => { const responses = this.viewModel?.getItems().filter(isResponseVM); const lastResponse = responses?.[responses.length - 1]; diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatContextAttachments.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatContextAttachments.ts index ff0a4455486f8..c15a1f6aee3d6 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatContextAttachments.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatContextAttachments.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IChatWidget } from 'vs/workbench/contrib/chat/browser/chat'; import { ChatWidget, IChatWidgetContrib } from 'vs/workbench/contrib/chat/browser/chatWidget'; @@ -12,6 +13,9 @@ export class ChatContextAttachments extends Disposable implements IChatWidgetCon private _attachedContext = new Set(); + private readonly _onDidChangeInputState = this._register(new Emitter()); + readonly onDidChangeInputState = this._onDidChangeInputState.event; + public static readonly ID = 'chatContextAttachments'; get id() { @@ -30,13 +34,18 @@ export class ChatContextAttachments extends Disposable implements IChatWidgetCon })); } - getInputState?() { + getInputState(): IChatRequestVariableEntry[] { return [...this._attachedContext.values()]; } - setInputState?(s: any): void { + setInputState(s: any): void { if (!Array.isArray(s)) { - return; + s = []; + } + + this._attachedContext.clear(); + for (const attachment of s) { + this._attachedContext.add(attachment); } this.widget.setContext(true, ...s); @@ -55,10 +64,12 @@ export class ChatContextAttachments extends Disposable implements IChatWidgetCon } this.widget.setContext(overwrite, ...attachments); + this._onDidChangeInputState.fire(); } private _removeContext(attachment: IChatRequestVariableEntry) { this._attachedContext.delete(attachment); + this._onDidChangeInputState.fire(); } private _clearAttachedContext() { diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatDynamicVariables.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatDynamicVariables.ts index 4c3fa0ee29c5e..2d8bf253fd015 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatDynamicVariables.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatDynamicVariables.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { coalesce } from 'vs/base/common/arrays'; +import { Emitter } from 'vs/base/common/event'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { Disposable } from 'vs/base/common/lifecycle'; import { basename } from 'vs/base/common/resources'; @@ -38,24 +39,30 @@ export class ChatDynamicVariableModel extends Disposable implements IChatWidgetC return ChatDynamicVariableModel.ID; } + private _onDidChangeInputState = this._register(new Emitter()); + readonly onDidChangeInputState = this._onDidChangeInputState.event; + constructor( private readonly widget: IChatWidget, @ILabelService private readonly labelService: ILabelService, - @ILogService private readonly logService: ILogService, ) { super(); this._register(widget.inputEditor.onDidChangeModelContent(e => { e.changes.forEach(c => { // Don't mutate entries in _variables, since they will be returned from the getter + const originalNumVariables = this._variables.length; this._variables = coalesce(this._variables.map(ref => { const intersection = Range.intersectRanges(ref.range, c.range); if (intersection && !intersection.isEmpty()) { - // The reference text was changed, it's broken - const rangeToDelete = new Range(ref.range.startLineNumber, ref.range.startColumn, ref.range.endLineNumber, ref.range.endColumn - 1); - this.widget.inputEditor.executeEdits(this.id, [{ - range: rangeToDelete, - text: '', - }]); + // The reference text was changed, it's broken. + // But if the whole reference range was deleted (eg history navigation) then don't try to change the editor. + if (!Range.containsRange(c.range, ref.range)) { + const rangeToDelete = new Range(ref.range.startLineNumber, ref.range.startColumn, ref.range.endLineNumber, ref.range.endColumn - 1); + this.widget.inputEditor.executeEdits(this.id, [{ + range: rangeToDelete, + text: '', + }]); + } return null; } else if (Range.compareRangesUsingStarts(ref.range, c.range) > 0) { const delta = c.text.length - c.rangeLength; @@ -72,6 +79,10 @@ export class ChatDynamicVariableModel extends Disposable implements IChatWidgetC return ref; })); + + if (this._variables.length !== originalNumVariables) { + this._onDidChangeInputState.fire(); + } }); this.updateDecorations(); @@ -84,9 +95,7 @@ export class ChatDynamicVariableModel extends Disposable implements IChatWidgetC setInputState(s: any): void { if (!Array.isArray(s)) { - // Something went wrong - this.logService.warn('ChatDynamicVariableModel.setInputState called with invalid state: ' + JSON.stringify(s)); - return; + s = []; } this._variables = s; @@ -96,6 +105,7 @@ export class ChatDynamicVariableModel extends Disposable implements IChatWidgetC addReference(ref: IDynamicVariable): void { this._variables.push(ref); this.updateDecorations(); + this._onDidChangeInputState.fire(); } private updateDecorations(): void { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 843a004e895b8..00f085ffda929 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -464,7 +464,7 @@ export class InlineChatWidget { */ addToHistory(input: string) { if (this._chatWidget.viewModel?.model === this._defaultChatModel) { - this._chatWidget.input.acceptInput(input); + this._chatWidget.input.acceptInput(true); } } diff --git a/src/vs/workbench/contrib/scm/common/scmService.ts b/src/vs/workbench/contrib/scm/common/scmService.ts index 7dfd1ea6f2ced..b341a2029aec3 100644 --- a/src/vs/workbench/contrib/scm/common/scmService.ts +++ b/src/vs/workbench/contrib/scm/common/scmService.ts @@ -134,7 +134,7 @@ class SCMInput extends Disposable implements ISCMInput { } if (!transient) { - this.historyNavigator.add(this._value); + this.historyNavigator.replaceLast(this._value); this.historyNavigator.add(value); this.didChangeHistory = true; } From 937c8c0c94e7711a5b166c1b2e9a52c9ce8d80bd Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sun, 16 Jun 2024 18:16:40 +0200 Subject: [PATCH 254/755] Observable logging improvement (#215759) --- src/vs/base/common/observableInternal/autorun.ts | 2 +- src/vs/base/common/observableInternal/derived.ts | 2 +- src/vs/base/common/observableInternal/logging.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/observableInternal/autorun.ts b/src/vs/base/common/observableInternal/autorun.ts index a2f169ee4d68b..21e0dd6cf8167 100644 --- a/src/vs/base/common/observableInternal/autorun.ts +++ b/src/vs/base/common/observableInternal/autorun.ts @@ -154,7 +154,7 @@ export class AutorunObserver implements IObserver, IReader } constructor( - private readonly _debugNameData: DebugNameData, + public readonly _debugNameData: DebugNameData, public readonly _runFn: (reader: IReader, changeSummary: TChangeSummary) => void, private readonly createChangeSummary: (() => TChangeSummary) | undefined, private readonly _handleChange: ((context: IChangeContext, summary: TChangeSummary) => boolean) | undefined, diff --git a/src/vs/base/common/observableInternal/derived.ts b/src/vs/base/common/observableInternal/derived.ts index 9e95bf9dccc47..af92d313c7059 100644 --- a/src/vs/base/common/observableInternal/derived.ts +++ b/src/vs/base/common/observableInternal/derived.ts @@ -192,7 +192,7 @@ export class Derived extends BaseObservable im } constructor( - private readonly _debugNameData: DebugNameData, + public readonly _debugNameData: DebugNameData, public readonly _computeFn: (reader: IReader, changeSummary: TChangeSummary) => T, private readonly createChangeSummary: (() => TChangeSummary) | undefined, private readonly _handleChange: ((context: IChangeContext, summary: TChangeSummary) => boolean) | undefined, diff --git a/src/vs/base/common/observableInternal/logging.ts b/src/vs/base/common/observableInternal/logging.ts index 01fcc3cdbbf48..5e4712e6923f8 100644 --- a/src/vs/base/common/observableInternal/logging.ts +++ b/src/vs/base/common/observableInternal/logging.ts @@ -114,7 +114,7 @@ export class ConsoleObservableLogger implements IObservableLogger { styled(derived.debugName, { color: 'BlueViolet' }), ...this.formatInfo(info), this.formatChanges(changedObservables), - { data: [{ fn: derived._computeFn }] } + { data: [{ fn: derived._debugNameData.referenceFn ?? derived._computeFn }] } ])); changedObservables.clear(); } @@ -143,7 +143,7 @@ export class ConsoleObservableLogger implements IObservableLogger { formatKind('autorun'), styled(autorun.debugName, { color: 'BlueViolet' }), this.formatChanges(changedObservables), - { data: [{ fn: autorun._runFn }] } + { data: [{ fn: autorun._debugNameData.referenceFn ?? autorun._runFn }] } ])); changedObservables.clear(); this.indentation++; From 8dcd7945af462fbabc911658ea81e0f21b07ee9d Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sun, 16 Jun 2024 20:22:39 +0200 Subject: [PATCH 255/755] Improves observable logging experience (#215782) --- .../base/common/observableInternal/autorun.ts | 2 +- src/vs/base/common/observableInternal/base.ts | 8 +-- .../common/observableInternal/debugName.ts | 8 +-- .../base/common/observableInternal/derived.ts | 16 ++--- .../base/common/observableInternal/promise.ts | 4 +- .../base/common/observableInternal/utils.ts | 60 ++++++++++++++----- src/vs/editor/browser/observableCodeEditor.ts | 6 +- .../components/diffEditorEditors.ts | 8 +-- .../diffEditorViewZones.ts | 2 +- .../widget/diffEditor/diffEditorOptions.ts | 2 +- .../diffEditor/features/gutterFeature.ts | 2 +- .../features/movedBlocksLinesFeature.ts | 4 +- .../widget/diffEditor/utils/editorGutter.ts | 4 +- .../multiDiffEditorWidgetImpl.ts | 4 +- .../browser/ghostTextWidget.ts | 2 +- .../browser/inlineCompletionsController.ts | 10 ++-- .../browser/inlineCompletionsHintsWidget.ts | 2 +- .../inlineEdit/browser/ghostTextWidget.ts | 2 +- .../browser/inlineEditController.ts | 8 +-- .../browser/inlineEditHintsWidget.ts | 2 +- .../browser/accessibilitySignalService.ts | 2 +- .../common/platformObservableUtils.ts | 7 ++- ...accessibilitySignalDebuggerContribution.ts | 2 +- .../editorTextPropertySignalsContribution.ts | 2 +- .../codeEditor/browser/diffEditorHelper.ts | 2 +- .../browser/mergeEditorInputModel.ts | 4 +- .../mergeEditor/browser/view/editorGutter.ts | 4 +- .../browser/view/editors/codeEditorView.ts | 6 +- .../browser/scmMultiDiffSourceResolver.ts | 4 +- .../browser/notebookAccessibilityProvider.ts | 2 +- .../workbench/contrib/scm/browser/activity.ts | 14 ++--- .../browser/codeCoverageDecorations.ts | 4 +- .../testing/browser/testingExplorerView.ts | 4 +- 33 files changed, 122 insertions(+), 91 deletions(-) diff --git a/src/vs/base/common/observableInternal/autorun.ts b/src/vs/base/common/observableInternal/autorun.ts index 21e0dd6cf8167..845e870d65d75 100644 --- a/src/vs/base/common/observableInternal/autorun.ts +++ b/src/vs/base/common/observableInternal/autorun.ts @@ -76,7 +76,7 @@ export function autorunWithStoreHandleChanges( { owner: options.owner, debugName: options.debugName, - debugReferenceFn: options.debugReferenceFn, + debugReferenceFn: options.debugReferenceFn ?? fn, createEmptyChangeSummary: options.createEmptyChangeSummary, handleChange: options.handleChange, }, diff --git a/src/vs/base/common/observableInternal/base.ts b/src/vs/base/common/observableInternal/base.ts index fe3a465dfb116..3c63a20116dd9 100644 --- a/src/vs/base/common/observableInternal/base.ts +++ b/src/vs/base/common/observableInternal/base.ts @@ -6,7 +6,7 @@ import { strictEquals, EqualityComparer } from 'vs/base/common/equals'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { keepObserved, recomputeInitiallyAndOnChange } from 'vs/base/common/observable'; -import { DebugNameData, Owner, getFunctionName } from 'vs/base/common/observableInternal/debugName'; +import { DebugNameData, DebugOwner, getFunctionName } from 'vs/base/common/observableInternal/debugName'; import type { derivedOpts } from 'vs/base/common/observableInternal/derived'; import { getLogger } from 'vs/base/common/observableInternal/logging'; @@ -201,9 +201,9 @@ export abstract class ConvenientObservable implements IObservable(fn: (value: T, reader: IReader) => TNew): IObservable; - public map(owner: Owner, fn: (value: T, reader: IReader) => TNew): IObservable; - public map(fnOrOwner: Owner | ((value: T, reader: IReader) => TNew), fnOrUndefined?: (value: T, reader: IReader) => TNew): IObservable { - const owner = fnOrUndefined === undefined ? undefined : fnOrOwner as Owner; + public map(owner: DebugOwner, fn: (value: T, reader: IReader) => TNew): IObservable; + public map(fnOrOwner: DebugOwner | ((value: T, reader: IReader) => TNew), fnOrUndefined?: (value: T, reader: IReader) => TNew): IObservable { + const owner = fnOrUndefined === undefined ? undefined : fnOrOwner as DebugOwner; const fn = fnOrUndefined === undefined ? fnOrOwner as (value: T, reader: IReader) => TNew : fnOrUndefined; return _derived( diff --git a/src/vs/base/common/observableInternal/debugName.ts b/src/vs/base/common/observableInternal/debugName.ts index 481d24f03777d..1ff1f24435739 100644 --- a/src/vs/base/common/observableInternal/debugName.ts +++ b/src/vs/base/common/observableInternal/debugName.ts @@ -8,7 +8,7 @@ export interface IDebugNameData { * The owner object of an observable. * Used for debugging only, such as computing a name for the observable by iterating over the fields of the owner. */ - readonly owner?: Owner | undefined; + readonly owner?: DebugOwner | undefined; /** * A string or function that returns a string that represents the name of the observable. @@ -25,7 +25,7 @@ export interface IDebugNameData { export class DebugNameData { constructor( - public readonly owner: Owner | undefined, + public readonly owner: DebugOwner | undefined, public readonly debugNameSource: DebugNameSource | undefined, public readonly referenceFn: Function | undefined, ) { } @@ -36,10 +36,10 @@ export class DebugNameData { } /** - * The owner object of an observable. + * The owning object of an observable. * Is only used for debugging purposes, such as computing a name for the observable by iterating over the fields of the owner. */ -export type Owner = object | undefined; +export type DebugOwner = object | undefined; export type DebugNameSource = string | (() => string | undefined); const countPerName = new Map(); diff --git a/src/vs/base/common/observableInternal/derived.ts b/src/vs/base/common/observableInternal/derived.ts index af92d313c7059..f0666517256dd 100644 --- a/src/vs/base/common/observableInternal/derived.ts +++ b/src/vs/base/common/observableInternal/derived.ts @@ -7,7 +7,7 @@ import { assertFn } from 'vs/base/common/assert'; import { EqualityComparer, strictEquals } from 'vs/base/common/equals'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { BaseObservable, IChangeContext, IObservable, IObserver, IReader, ISettableObservable, ITransaction, _setDerivedOpts, } from 'vs/base/common/observableInternal/base'; -import { DebugNameData, IDebugNameData, Owner } from 'vs/base/common/observableInternal/debugName'; +import { DebugNameData, IDebugNameData, DebugOwner } from 'vs/base/common/observableInternal/debugName'; import { getLogger } from 'vs/base/common/observableInternal/logging'; /** @@ -17,8 +17,8 @@ import { getLogger } from 'vs/base/common/observableInternal/logging'; * {@link computeFn} should start with a JS Doc using `@description` to name the derived. */ export function derived(computeFn: (reader: IReader) => T): IObservable; -export function derived(owner: Owner, computeFn: (reader: IReader) => T): IObservable; -export function derived(computeFnOrOwner: ((reader: IReader) => T) | Owner, computeFn?: ((reader: IReader) => T) | undefined): IObservable { +export function derived(owner: DebugOwner, computeFn: (reader: IReader) => T): IObservable; +export function derived(computeFnOrOwner: ((reader: IReader) => T) | DebugOwner, computeFn?: ((reader: IReader) => T) | undefined): IObservable { if (computeFn !== undefined) { return new Derived( new DebugNameData(computeFnOrOwner, undefined, computeFn), @@ -39,7 +39,7 @@ export function derived(computeFnOrOwner: ((reader: IReader) => T) | Owner, c ); } -export function derivedWithSetter(owner: Owner | undefined, computeFn: (reader: IReader) => T, setter: (value: T, transaction: ITransaction | undefined) => void): ISettableObservable { +export function derivedWithSetter(owner: DebugOwner | undefined, computeFn: (reader: IReader) => T, setter: (value: T, transaction: ITransaction | undefined) => void): ISettableObservable { return new DerivedWithSetter( new DebugNameData(owner, undefined, computeFn), computeFn, @@ -105,7 +105,7 @@ export function derivedWithStore(computeFn: (reader: IReader, store: Disposab export function derivedWithStore(owner: object, computeFn: (reader: IReader, store: DisposableStore) => T): IObservable; export function derivedWithStore(computeFnOrOwner: ((reader: IReader, store: DisposableStore) => T) | object, computeFnOrUndefined?: ((reader: IReader, store: DisposableStore) => T)): IObservable { let computeFn: (reader: IReader, store: DisposableStore) => T; - let owner: Owner; + let owner: DebugOwner; if (computeFnOrUndefined === undefined) { computeFn = computeFnOrOwner as any; owner = undefined; @@ -128,10 +128,10 @@ export function derivedWithStore(computeFnOrOwner: ((reader: IReader, store: } export function derivedDisposable(computeFn: (reader: IReader) => T): IObservable; -export function derivedDisposable(owner: Owner, computeFn: (reader: IReader) => T): IObservable; -export function derivedDisposable(computeFnOrOwner: ((reader: IReader) => T) | Owner, computeFnOrUndefined?: ((reader: IReader) => T)): IObservable { +export function derivedDisposable(owner: DebugOwner, computeFn: (reader: IReader) => T): IObservable; +export function derivedDisposable(computeFnOrOwner: ((reader: IReader) => T) | DebugOwner, computeFnOrUndefined?: ((reader: IReader) => T)): IObservable { let computeFn: (reader: IReader) => T; - let owner: Owner; + let owner: DebugOwner; if (computeFnOrUndefined === undefined) { computeFn = computeFnOrOwner as any; owner = undefined; diff --git a/src/vs/base/common/observableInternal/promise.ts b/src/vs/base/common/observableInternal/promise.ts index e0109a3941bf3..f405033bfc1cf 100644 --- a/src/vs/base/common/observableInternal/promise.ts +++ b/src/vs/base/common/observableInternal/promise.ts @@ -6,7 +6,7 @@ import { autorun } from 'vs/base/common/observableInternal/autorun'; import { IObservable, IReader, observableValue, transaction } from './base'; import { Derived, derived } from 'vs/base/common/observableInternal/derived'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; -import { DebugNameData, Owner } from 'vs/base/common/observableInternal/debugName'; +import { DebugNameData, DebugOwner } from 'vs/base/common/observableInternal/debugName'; import { strictEquals } from 'vs/base/common/equals'; import { CancellationError } from 'vs/base/common/errors'; @@ -179,7 +179,7 @@ export function derivedWithCancellationToken(computeFn: (reader: IReader, can export function derivedWithCancellationToken(owner: object, computeFn: (reader: IReader, cancellationToken: CancellationToken) => T): IObservable; export function derivedWithCancellationToken(computeFnOrOwner: ((reader: IReader, cancellationToken: CancellationToken) => T) | object, computeFnOrUndefined?: ((reader: IReader, cancellationToken: CancellationToken) => T)): IObservable { let computeFn: (reader: IReader, store: CancellationToken) => T; - let owner: Owner; + let owner: DebugOwner; if (computeFnOrUndefined === undefined) { computeFn = computeFnOrOwner as any; owner = undefined; diff --git a/src/vs/base/common/observableInternal/utils.ts b/src/vs/base/common/observableInternal/utils.ts index 4832babbc61f8..1d012de3d54e8 100644 --- a/src/vs/base/common/observableInternal/utils.ts +++ b/src/vs/base/common/observableInternal/utils.ts @@ -5,9 +5,9 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { autorun } from 'vs/base/common/observableInternal/autorun'; +import { autorun, autorunOpts } from 'vs/base/common/observableInternal/autorun'; import { BaseObservable, ConvenientObservable, IObservable, IObserver, IReader, ITransaction, _setKeepObserved, _setRecomputeInitiallyAndOnChange, observableValue, subtransaction, transaction } from 'vs/base/common/observableInternal/base'; -import { DebugNameData, Owner, getFunctionName } from 'vs/base/common/observableInternal/debugName'; +import { DebugNameData, IDebugNameData, DebugOwner, getDebugName, } from 'vs/base/common/observableInternal/debugName'; import { derived, derivedOpts } from 'vs/base/common/observableInternal/derived'; import { getLogger } from 'vs/base/common/observableInternal/logging'; import { IValueWithChangeEvent } from '../event'; @@ -54,21 +54,49 @@ export function observableFromPromise(promise: Promise): IObservable<{ val return observable; } + export function observableFromEvent( + owner: DebugOwner, event: Event, getValue: (args: TArgs | undefined) => T, -): IObservable { - return new FromEventObservable(event, getValue, () => FromEventObservable.globalTransaction, strictEquals); +): IObservable; +export function observableFromEvent( + event: Event, + getValue: (args: TArgs | undefined) => T, +): IObservable; +export function observableFromEvent(...args: + [owner: DebugOwner, event: Event, getValue: (args: any | undefined) => any] + | [event: Event, getValue: (args: any | undefined) => any] +): IObservable { + let owner; + let event; + let getValue; + if (args.length === 3) { + [owner, event, getValue] = args; + } else { + [event, getValue] = args; + } + return new FromEventObservable( + new DebugNameData(owner, undefined, getValue), + event, + getValue, + () => FromEventObservable.globalTransaction, + strictEquals + ); } export function observableFromEventOpts( - options: { + options: IDebugNameData & { equalsFn?: EqualityComparer; }, event: Event, getValue: (args: TArgs | undefined) => T, ): IObservable { - return new FromEventObservable(event, getValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals); + return new FromEventObservable( + new DebugNameData(options.owner, options.debugName, options.debugReferenceFn ?? getValue), + event, + getValue, () => FromEventObservable.globalTransaction, options.equalsFn ?? strictEquals + ); } export class FromEventObservable extends BaseObservable { @@ -79,6 +107,7 @@ export class FromEventObservable extends BaseObservable { private subscription: IDisposable | undefined; constructor( + private readonly _debugNameData: DebugNameData, private readonly event: Event, public readonly _getValue: (args: TArgs | undefined) => T, private readonly _getTransaction: () => ITransaction | undefined, @@ -88,7 +117,7 @@ export class FromEventObservable extends BaseObservable { } private getDebugName(): string | undefined { - return getFunctionName(this._getValue); + return this._debugNameData.getDebugName(this); } public get debugName(): string { @@ -424,9 +453,9 @@ export class KeepAliveObserver implements IObserver { } } -export function derivedObservableWithCache(owner: Owner, computeFn: (reader: IReader, lastValue: T | undefined) => T): IObservable { +export function derivedObservableWithCache(owner: DebugOwner, computeFn: (reader: IReader, lastValue: T | undefined) => T): IObservable { let lastValue: T | undefined = undefined; - const observable = derived(owner, reader => { + const observable = derivedOpts({ owner, debugReferenceFn: computeFn }, reader => { lastValue = computeFn(reader, lastValue); return lastValue; }); @@ -457,7 +486,7 @@ export function derivedObservableWithWritableCache(owner: object, computeFn: /** * When the items array changes, referential equal items are not mapped again. */ -export function mapObservableArrayCached(owner: Owner, items: IObservable, map: (input: TIn, store: DisposableStore) => TOut, keySelector?: (input: TIn) => TKey): IObservable { +export function mapObservableArrayCached(owner: DebugOwner, items: IObservable, map: (input: TIn, store: DisposableStore) => TOut, keySelector?: (input: TIn) => TKey): IObservable { let m = new ArrayMap(map, keySelector); const self = derivedOpts({ debugReferenceFn: map, @@ -533,11 +562,11 @@ export class ValueWithChangeEventFromObservable implements IValueWithChangeEv } } -export function observableFromValueWithChangeEvent(_owner: Owner, value: IValueWithChangeEvent): IObservable { +export function observableFromValueWithChangeEvent(owner: DebugOwner, value: IValueWithChangeEvent): IObservable { if (value instanceof ValueWithChangeEventFromObservable) { return value.observable; } - return observableFromEvent(value.onDidChange, () => value.value); + return observableFromEvent(owner, value.onDidChange, () => value.value); } /** @@ -546,7 +575,7 @@ export function observableFromValueWithChangeEvent(_owner: Owner, value: IVal * When observed and any of the observables change, it has the value of the last changed observable. * If multiple observables change in the same transaction, the last observable wins. */ -export function latestChangedValue[]>(...observables: T): IObservable> { +export function latestChangedValue[]>(owner: DebugOwner, observables: T): IObservable> { if (observables.length === 0) { throw new BugIndicatingError(); } @@ -554,10 +583,10 @@ export function latestChangedValue[]>(...observables: let hasLastChangedValue = false; let lastChangedValue: any = undefined; - return observableFromEvent(cb => { + const result = observableFromEvent(owner, cb => { const store = new DisposableStore(); for (const o of observables) { - store.add(autorun(reader => { + store.add(autorunOpts({ debugName: () => getDebugName(result, new DebugNameData(owner, undefined, undefined)) + '.updateLastChangedValue' }, reader => { hasLastChangedValue = true; lastChangedValue = o.read(reader); cb(); @@ -577,4 +606,5 @@ export function latestChangedValue[]>(...observables: return observables[observables.length - 1].get(); } }); + return result; } diff --git a/src/vs/editor/browser/observableCodeEditor.ts b/src/vs/editor/browser/observableCodeEditor.ts index a2eba707a2164..0eeff056c052a 100644 --- a/src/vs/editor/browser/observableCodeEditor.ts +++ b/src/vs/editor/browser/observableCodeEditor.ts @@ -140,7 +140,7 @@ export class ObservableCodeEditor extends Disposable { private readonly _model = observableValue(this, this.editor.getModel()); public readonly model: IObservable = this._model; - public readonly isReadonly = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.readOnly)); + public readonly isReadonly = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.readOnly)); private readonly _versionId = observableValueOpts({ owner: this, lazy: true }, this.editor.getModel()?.getVersionId() ?? null); public readonly versionId: IObservable = this._versionId; @@ -157,7 +157,7 @@ export class ObservableCodeEditor extends Disposable { reader => this.selections.read(reader)?.map(s => s.getStartPosition()) ?? null ); - public readonly isFocused = observableFromEvent(e => { + public readonly isFocused = observableFromEvent(this, e => { const d1 = this.editor.onDidFocusEditorWidget(e); const d2 = this.editor.onDidBlurEditorWidget(e); return { @@ -175,7 +175,7 @@ export class ObservableCodeEditor extends Disposable { public readonly onDidType = observableSignal(this); public getOption(id: T): IObservable> { - return observableFromEvent(cb => this.editor.onDidChangeConfiguration(e => { + return observableFromEvent(this, cb => this.editor.onDidChangeConfiguration(e => { if (e.hasChanged(id)) { cb(undefined); } }), () => this.editor.getOption(id)); } diff --git a/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts b/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts index 73db7fbebb207..55b5d4a1e5489 100644 --- a/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts +++ b/src/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.ts @@ -27,15 +27,15 @@ export class DiffEditorEditors extends Disposable { private readonly _onDidContentSizeChange = this._register(new Emitter()); public get onDidContentSizeChange() { return this._onDidContentSizeChange.event; } - public readonly modifiedScrollTop = observableFromEvent(this.modified.onDidScrollChange, () => /** @description modified.getScrollTop */ this.modified.getScrollTop()); - public readonly modifiedScrollHeight = observableFromEvent(this.modified.onDidScrollChange, () => /** @description modified.getScrollHeight */ this.modified.getScrollHeight()); + public readonly modifiedScrollTop = observableFromEvent(this, this.modified.onDidScrollChange, () => /** @description modified.getScrollTop */ this.modified.getScrollTop()); + public readonly modifiedScrollHeight = observableFromEvent(this, this.modified.onDidScrollChange, () => /** @description modified.getScrollHeight */ this.modified.getScrollHeight()); public readonly modifiedModel = observableCodeEditor(this.modified).model; - public readonly modifiedSelections = observableFromEvent(this.modified.onDidChangeCursorSelection, () => this.modified.getSelections() ?? []); + public readonly modifiedSelections = observableFromEvent(this, this.modified.onDidChangeCursorSelection, () => this.modified.getSelections() ?? []); public readonly modifiedCursor = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.modifiedSelections.read(reader)[0]?.getPosition() ?? new Position(1, 1)); - public readonly originalCursor = observableFromEvent(this.original.onDidChangeCursorPosition, () => this.original.getPosition() ?? new Position(1, 1)); + public readonly originalCursor = observableFromEvent(this, this.original.onDidChangeCursorPosition, () => this.original.getPosition() ?? new Position(1, 1)); public readonly isOriginalFocused = observableCodeEditor(this.original).isFocused; public readonly isModifiedFocused = observableCodeEditor(this.modified).isFocused; diff --git a/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts b/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts index d7c6be3e3a48f..6a5283f24917d 100644 --- a/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts +++ b/src/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.ts @@ -81,7 +81,7 @@ export class DiffEditorViewZones extends Disposable { })); const originalModelTokenizationCompleted = this._diffModel.map(m => - m ? observableFromEvent(m.model.original.onDidChangeTokens, () => m.model.original.tokenization.backgroundTokenizationState === BackgroundTokenizationState.Completed) : undefined + m ? observableFromEvent(this, m.model.original.onDidChangeTokens, () => m.model.original.tokenization.backgroundTokenizationState === BackgroundTokenizationState.Completed) : undefined ).map((m, reader) => m?.read(reader)); const alignments = derived((reader) => { diff --git a/src/vs/editor/browser/widget/diffEditor/diffEditorOptions.ts b/src/vs/editor/browser/widget/diffEditor/diffEditorOptions.ts index f5bbdb1b43faa..b53bb2660e3de 100644 --- a/src/vs/editor/browser/widget/diffEditor/diffEditorOptions.ts +++ b/src/vs/editor/browser/widget/diffEditor/diffEditorOptions.ts @@ -16,7 +16,7 @@ export class DiffEditorOptions { private readonly _diffEditorWidth = observableValue(this, 0); - private readonly _screenReaderMode = observableFromEvent(this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); + private readonly _screenReaderMode = observableFromEvent(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); constructor( options: Readonly, diff --git a/src/vs/editor/browser/widget/diffEditor/features/gutterFeature.ts b/src/vs/editor/browser/widget/diffEditor/features/gutterFeature.ts index e7c76c727cf6f..010fba5ec96ed 100644 --- a/src/vs/editor/browser/widget/diffEditor/features/gutterFeature.ts +++ b/src/vs/editor/browser/widget/diffEditor/features/gutterFeature.ts @@ -37,7 +37,7 @@ const width = 35; export class DiffEditorGutter extends Disposable { private readonly _menu = this._register(this._menuService.createMenu(MenuId.DiffEditorHunkToolbar, this._contextKeyService)); - private readonly _actions = observableFromEvent(this._menu.onDidChange, () => this._menu.getActions()); + private readonly _actions = observableFromEvent(this, this._menu.onDidChange, () => this._menu.getActions()); private readonly _hasActions = this._actions.map(a => a.length > 0); private readonly _showSash = derived(this, reader => this._options.renderSideBySide.read(reader) && this._hasActions.read(reader)); diff --git a/src/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.ts b/src/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.ts index 7d0d3a992c15b..afb29693f817e 100644 --- a/src/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.ts +++ b/src/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.ts @@ -26,8 +26,8 @@ export class MovedBlocksLinesFeature extends Disposable { public static readonly movedCodeBlockPadding = 4; private readonly _element: SVGElement; - private readonly _originalScrollTop = observableFromEvent(this._editors.original.onDidScrollChange, () => this._editors.original.getScrollTop()); - private readonly _modifiedScrollTop = observableFromEvent(this._editors.modified.onDidScrollChange, () => this._editors.modified.getScrollTop()); + private readonly _originalScrollTop = observableFromEvent(this, this._editors.original.onDidScrollChange, () => this._editors.original.getScrollTop()); + private readonly _modifiedScrollTop = observableFromEvent(this, this._editors.modified.onDidScrollChange, () => this._editors.modified.getScrollTop()); private readonly _viewZonesChanged = observableSignalFromEvent('onDidChangeViewZones', this._editors.modified.onDidChangeViewZones); public readonly width = observableValue(this, 0); diff --git a/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts b/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts index 9516f37857235..a301fc6124bf3 100644 --- a/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts +++ b/src/vs/editor/browser/widget/diffEditor/utils/editorGutter.ts @@ -11,12 +11,12 @@ import { LineRange } from 'vs/editor/common/core/lineRange'; import { OffsetRange } from 'vs/editor/common/core/offsetRange'; export class EditorGutter extends Disposable { - private readonly scrollTop = observableFromEvent( + private readonly scrollTop = observableFromEvent(this, this._editor.onDidScrollChange, (e) => /** @description editor.onDidScrollChange */ this._editor.getScrollTop() ); private readonly isScrollTopZero = this.scrollTop.map((scrollTop) => /** @description isScrollTopZero */ scrollTop === 0); - private readonly modelAttached = observableFromEvent( + private readonly modelAttached = observableFromEvent(this, this._editor.onDidChangeModel, (e) => /** @description editor.onDidChangeModel */ this._editor.hasModel() ); diff --git a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts index c29fc74bddd4e..eab554dbdfbcd 100644 --- a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts +++ b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts @@ -73,8 +73,8 @@ export class MultiDiffEditorWidgetImpl extends Disposable { return template; })); - public readonly scrollTop = observableFromEvent(this._scrollableElement.onScroll, () => /** @description scrollTop */ this._scrollableElement.getScrollPosition().scrollTop); - public readonly scrollLeft = observableFromEvent(this._scrollableElement.onScroll, () => /** @description scrollLeft */ this._scrollableElement.getScrollPosition().scrollLeft); + public readonly scrollTop = observableFromEvent(this, this._scrollableElement.onScroll, () => /** @description scrollTop */ this._scrollableElement.getScrollPosition().scrollTop); + public readonly scrollLeft = observableFromEvent(this, this._scrollableElement.onScroll, () => /** @description scrollLeft */ this._scrollableElement.getScrollPosition().scrollLeft); private readonly _viewItemsInfo = derivedWithStore<{ items: readonly VirtualizedViewItem[]; getItem: (viewModel: DocumentDiffItemViewModel) => VirtualizedViewItem }>(this, (reader, store) => { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts index 0c93d8465ab94..450f9549fb78f 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts @@ -34,7 +34,7 @@ export interface IGhostTextWidgetModel { export class GhostTextWidget extends Disposable { private readonly isDisposed = observableValue(this, false); - private readonly currentTextModel = observableFromEvent(this.editor.onDidChangeModel, () => /** @description editor.model */ this.editor.getModel()); + private readonly currentTextModel = observableFromEvent(this, this.editor.onDidChangeModel, () => /** @description editor.model */ this.editor.getModel()); constructor( private readonly editor: ICodeEditor, diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts index 9b0d64299a5ce..c902a1f2ed9b2 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts @@ -59,14 +59,14 @@ export class InlineCompletionsController extends Disposable { }) )); - private readonly _suggestWidgetSelectedItem = observableFromEvent(cb => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => { + private readonly _suggestWidgetSelectedItem = observableFromEvent(this, cb => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => { this._editorObs.forceUpdate(_tx => cb(undefined)); }), () => this._suggestWidgetAdaptor.selectedItem); - private readonly _enabledInConfig = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).enabled); - private readonly _isScreenReaderEnabled = observableFromEvent(this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); - private readonly _editorDictationInProgress = observableFromEvent( + private readonly _enabledInConfig = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).enabled); + private readonly _isScreenReaderEnabled = observableFromEvent(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()); + private readonly _editorDictationInProgress = observableFromEvent(this, this._contextKeyService.onDidChangeContext, () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true ); @@ -114,7 +114,7 @@ export class InlineCompletionsController extends Disposable { private readonly _playAccessibilitySignal = observableSignal(this); - private readonly _fontFamily = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).fontFamily); + private readonly _fontFamily = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).fontFamily); constructor( public readonly editor: ICodeEditor, diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget.ts index 9f7d3d17ba88f..2226a1ea26500 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget.ts @@ -36,7 +36,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; export class InlineCompletionsHintsWidget extends Disposable { - private readonly alwaysShowToolbar = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).showToolbar === 'always'); + private readonly alwaysShowToolbar = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).showToolbar === 'always'); private sessionPosition: Position | undefined = undefined; diff --git a/src/vs/editor/contrib/inlineEdit/browser/ghostTextWidget.ts b/src/vs/editor/contrib/inlineEdit/browser/ghostTextWidget.ts index 298fcd4452e1f..58e6b00260cbf 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/ghostTextWidget.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/ghostTextWidget.ts @@ -28,7 +28,7 @@ export interface IGhostTextWidgetModel { export class GhostTextWidget extends Disposable { private readonly isDisposed = observableValue(this, false); - private readonly currentTextModel = observableFromEvent(this.editor.onDidChangeModel, () => /** @description editor.model */ this.editor.getModel()); + private readonly currentTextModel = observableFromEvent(this, this.editor.onDidChangeModel, () => /** @description editor.model */ this.editor.getModel()); constructor( private readonly editor: ICodeEditor, diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts index 283e72be068b3..9ce9a02b2e671 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts @@ -52,9 +52,9 @@ export class InlineEditController extends Disposable { private _jumpBackPosition: Position | undefined; private _isAccepting: ISettableObservable = observableValue(this, false); - private readonly _enabled = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).enabled); - private readonly _fontFamily = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).fontFamily); - private readonly _backgroundColoring = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).backgroundColoring); + private readonly _enabled = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).enabled); + private readonly _fontFamily = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).fontFamily); + private readonly _backgroundColoring = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).backgroundColoring); constructor( @@ -84,7 +84,7 @@ export class InlineEditController extends Disposable { })); //Check if the cursor is at the ghost text - const cursorPosition = observableFromEvent(editor.onDidChangeCursorPosition, () => editor.getPosition()); + const cursorPosition = observableFromEvent(this, editor.onDidChangeCursorPosition, () => editor.getPosition()); this._register(autorun(reader => { /** @description InlineEditController.cursorPositionChanged model */ if (!this._enabled.read(reader)) { diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts index ee0b537a88cba..215c85fbc0eb7 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts @@ -27,7 +27,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; export class InlineEditHintsWidget extends Disposable { - private readonly alwaysShowToolbar = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).showToolbar === 'always'); + private readonly alwaysShowToolbar = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).showToolbar === 'always'); private sessionPosition: Position | undefined = undefined; diff --git a/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts b/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts index be21278dc6482..51d518e00f87f 100644 --- a/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts +++ b/src/vs/platform/accessibilitySignal/browser/accessibilitySignalService.ts @@ -67,7 +67,7 @@ export interface IAccessbilitySignalOptions { export class AccessibilitySignalService extends Disposable implements IAccessibilitySignalService { readonly _serviceBrand: undefined; private readonly sounds: Map = new Map(); - private readonly screenReaderAttached = observableFromEvent( + private readonly screenReaderAttached = observableFromEvent(this, this.accessibilityService.onDidChangeScreenReaderOptimized, () => /** @description accessibilityService.onDidChangeScreenReaderOptimized */ this.accessibilityService.isScreenReaderOptimized() ); diff --git a/src/vs/platform/observable/common/platformObservableUtils.ts b/src/vs/platform/observable/common/platformObservableUtils.ts index 096993beb8018..2e886ef6540b2 100644 --- a/src/vs/platform/observable/common/platformObservableUtils.ts +++ b/src/vs/platform/observable/common/platformObservableUtils.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable } from 'vs/base/common/lifecycle'; -import { autorunOpts, IObservable, IReader, observableFromEvent } from 'vs/base/common/observable'; +import { autorunOpts, IObservable, IReader } from 'vs/base/common/observable'; +import { observableFromEventOpts } from 'vs/base/common/observableInternal/utils'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ContextKeyValue, RawContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyValue, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; /** Creates an observable update when a configuration key updates. */ export function observableConfigValue(key: string, defaultValue: T, configurationService: IConfigurationService): IObservable { - return observableFromEvent( + return observableFromEventOpts({ debugName: () => `Configuration Key "${key}"`, }, (handleChange) => configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(key)) { handleChange(e); diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignalDebuggerContribution.ts b/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignalDebuggerContribution.ts index 336832eb16cf3..f0bc218c0c1de 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignalDebuggerContribution.ts +++ b/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignalDebuggerContribution.ts @@ -19,7 +19,7 @@ export class AccessibilitySignalLineDebuggerContribution ) { super(); - const isEnabled = observableFromEvent( + const isEnabled = observableFromEvent(this, accessibilitySignalService.onSoundEnabledChanged(AccessibilitySignal.onDebugBreak), () => accessibilitySignalService.isSoundEnabled(AccessibilitySignal.onDebugBreak) ); diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts b/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts index cb6eb229ec03b..4fa9f2d85c9eb 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts +++ b/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts @@ -35,7 +35,7 @@ export class EditorTextPropertySignalsContribution extends Disposable implements .some(signal => observableFromValueWithChangeEvent(this, this._accessibilitySignalService.getEnabledState(signal, false)).read(reader)) ); - private readonly _activeEditorObservable = observableFromEvent( + private readonly _activeEditorObservable = observableFromEvent(this, this._editorService.onDidActiveEditorChange, (_) => { const activeTextEditorControl = this._editorService.activeTextEditorControl; diff --git a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts index 052608edd82c2..15fba7682218a 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts @@ -33,7 +33,7 @@ class DiffEditorHelperContribution extends Disposable implements IDiffEditorCont const isEmbeddedDiffEditor = this._diffEditor instanceof EmbeddedDiffEditorWidget; if (!isEmbeddedDiffEditor) { - const computationResult = observableFromEvent(e => this._diffEditor.onDidUpdateDiff(e), () => /** @description diffEditor.diffComputationResult */ this._diffEditor.getDiffComputationResult()); + const computationResult = observableFromEvent(this, e => this._diffEditor.onDidUpdateDiff(e), () => /** @description diffEditor.diffComputationResult */ this._diffEditor.getDiffComputationResult()); const onlyWhiteSpaceChange = computationResult.map(r => r && !r.identical && r.changes2.length === 0); this._register(autorunWithStore((reader, store) => { diff --git a/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts b/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts index b043f0840a13a..279baa80c146c 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts @@ -126,7 +126,7 @@ export class TempFileMergeEditorModeFactory implements IMergeEditorInputModelFac class TempFileMergeEditorInputModel extends EditorModel implements IMergeEditorInputModel { private readonly savedAltVersionId = observableValue(this, this.model.resultTextModel.getAlternativeVersionId()); - private readonly altVersionId = observableFromEvent( + private readonly altVersionId = observableFromEvent(this, e => this.model.resultTextModel.onDidChangeContent(e), () => /** @description getAlternativeVersionId */ this.model.resultTextModel.getAlternativeVersionId() @@ -340,7 +340,7 @@ export class WorkspaceMergeEditorModeFactory implements IMergeEditorInputModelFa } class WorkspaceMergeEditorInputModel extends EditorModel implements IMergeEditorInputModel { - public readonly isDirty = observableFromEvent( + public readonly isDirty = observableFromEvent(this, Event.any(this.resultTextFileModel.onDidChangeDirty, this.resultTextFileModel.onDidSaveError), () => /** @description isDirty */ this.resultTextFileModel.isDirty() ); diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts index 903b48202d5de..7d564cb464666 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.ts @@ -10,12 +10,12 @@ import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditor import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange'; export class EditorGutter extends Disposable { - private readonly scrollTop = observableFromEvent( + private readonly scrollTop = observableFromEvent(this, this._editor.onDidScrollChange, (e) => /** @description editor.onDidScrollChange */ this._editor.getScrollTop() ); private readonly isScrollTopZero = this.scrollTop.map((scrollTop) => /** @description isScrollTopZero */ scrollTop === 0); - private readonly modelAttached = observableFromEvent( + private readonly modelAttached = observableFromEvent(this, this._editor.onDidChangeModel, (e) => /** @description editor.onDidChangeModel */ this._editor.hasModel() ); diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/editors/codeEditorView.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/editors/codeEditorView.ts index 29af08fbafedb..b75ca359a2dc9 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/editors/codeEditorView.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/editors/codeEditorView.ts @@ -79,17 +79,17 @@ export abstract class CodeEditorView extends Disposable { this.editor.updateOptions(newOptions); } - public readonly isFocused = observableFromEvent( + public readonly isFocused = observableFromEvent(this, Event.any(this.editor.onDidBlurEditorWidget, this.editor.onDidFocusEditorWidget), () => /** @description editor.hasWidgetFocus */ this.editor.hasWidgetFocus() ); - public readonly cursorPosition = observableFromEvent( + public readonly cursorPosition = observableFromEvent(this, this.editor.onDidChangeCursorPosition, () => /** @description editor.getPosition */ this.editor.getPosition() ); - public readonly selection = observableFromEvent( + public readonly selection = observableFromEvent(this, this.editor.onDidChangeCursorSelection, () => /** @description editor.getSelections */ this.editor.getSelections() ); diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts index a53d4d6c3461e..be0e22ab32342 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts @@ -61,11 +61,11 @@ export class ScmMultiDiffSourceResolver implements IMultiDiffSourceResolver { async resolveDiffSource(uri: URI): Promise { const { repositoryUri, groupId } = ScmMultiDiffSourceResolver.parseUri(uri)!; - const repository = await waitForState(observableFromEvent( + const repository = await waitForState(observableFromEvent(this, this._scmService.onDidAddRepository, () => [...this._scmService.repositories].find(r => r.provider.rootUri?.toString() === repositoryUri.toString())) ); - const group = await waitForState(observableFromEvent( + const group = await waitForState(observableFromEvent(this, repository.provider.onDidChangeResourceGroups, () => repository.provider.groups.find(g => g.id === groupId) )); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityProvider.ts b/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityProvider.ts index 948db4cd3a1c8..33a38169f3973 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityProvider.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookAccessibilityProvider.ts @@ -46,7 +46,7 @@ export class NotebookAccessibilityProvider extends Disposable implements IListAc getAriaLabel(element: CellViewModel) { const event = Event.filter(this.onDidAriaLabelChange, e => e === element); - return observableFromEvent(event, () => { + return observableFromEvent(this, event, () => { const viewModel = this.viewModel(); if (!viewModel) { return ''; diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 608f31a575552..b50b677271b63 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -33,17 +33,17 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); - private readonly _repositories = observableFromEvent( + private readonly _repositories = observableFromEvent(this, Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository), () => this.scmService.repositories); private readonly _focusedRepository = observableFromEventOpts( - { equalsFn: () => false }, + { owner: this, equalsFn: () => false }, this.scmViewService.onDidFocusRepository, () => this.scmViewService.focusedRepository); private readonly _activeEditor = observableFromEventOpts( - { equalsFn: () => false }, + { owner: this, equalsFn: () => false }, this.editorService.onDidActiveEditorChange, () => this.editorService.activeEditor); @@ -71,9 +71,9 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe * The focused repository takes precedence over the active editor repository when the observable * values are updated in the same transaction (or during the initial read of the observable value). */ - private readonly _activeRepository = latestChangedValue(this._activeEditorRepository, this._focusedRepository); + private readonly _activeRepository = latestChangedValue(this, [this._activeEditorRepository, this._focusedRepository]); - private readonly _countBadgeRepositories = derived(reader => { + private readonly _countBadgeRepositories = derived(this, reader => { switch (this._countBadgeConfig.read(reader)) { case 'all': { const repositories = this._repositories.read(reader); @@ -90,7 +90,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe } }); - private readonly _countBadge = derived(reader => { + private readonly _countBadge = derived(this, reader => { let total = 0; for (const repository of this._countBadgeRepositories.read(reader)) { @@ -171,7 +171,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe } private _getRepositoryResourceCount(repository: ISCMRepository): IObservable { - return observableFromEvent(repository.provider.onDidChangeResources, () => getRepositoryResourceCount(repository.provider)); + return observableFromEvent(this, repository.provider.onDidChangeResources, () => /** @description repositoryResourceCount */ getRepositoryResourceCount(repository.provider)); } private _updateActivityCountBadge(count: number, store: DisposableStore): void { diff --git a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts index 7df6d971fa8fc..61806a01f2505 100644 --- a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts @@ -81,8 +81,8 @@ export class CodeCoverageDecorations extends Disposable implements IEditorContri this.summaryWidget = new Lazy(() => this._register(instantiationService.createInstance(CoverageToolbarWidget, this.editor))); - const modelObs = observableFromEvent(editor.onDidChangeModel, () => editor.getModel()); - const configObs = observableFromEvent(editor.onDidChangeConfiguration, i => i); + const modelObs = observableFromEvent(this, editor.onDidChangeModel, () => editor.getModel()); + const configObs = observableFromEvent(this, editor.onDidChangeConfiguration, i => i); const fileCoverage = derived(reader => { const report = coverage.selected.read(reader); diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 71c0823882e7d..31f7be62310f4 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -821,12 +821,12 @@ class TestingExplorerViewModel extends Disposable { this.tree.rerender(); })); - const allOpenEditorInputs = observableFromEvent( + const allOpenEditorInputs = observableFromEvent(this, editorService.onDidEditorsChange, () => new Set(editorGroupsService.groups.flatMap(g => g.editors).map(e => e.resource).filter(isDefined)), ); - const activeResource = observableFromEvent(editorService.onDidActiveEditorChange, () => { + const activeResource = observableFromEvent(this, editorService.onDidActiveEditorChange, () => { if (editorService.activeEditor instanceof DiffEditorInput) { return editorService.activeEditor.primary.resource; } else { From fc1a9a48ec064237617bf1c11cae5f03a87e414f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 16 Jun 2024 23:08:36 +0200 Subject: [PATCH 256/755] report telemetry even when not auto (#215792) --- .../browser/extensionsWorkbenchService.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 7cc4cf224da50..f76a65d5e576a 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -1299,7 +1299,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return undefined; } - async updateRunningExtensions(auto?: boolean): Promise { + async updateRunningExtensions(auto: boolean = false): Promise { const toAdd: ILocalExtension[] = []; const toRemove: string[] = []; @@ -1342,17 +1342,17 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (toAdd.length || toRemove.length) { if (await this.extensionService.stopExtensionHosts(nls.localize('restart', "Enable or Disable extensions"), auto)) { await this.extensionService.startExtensionHosts({ toAdd, toRemove }); - if (auto) { - type ExtensionsAutoRestartClassification = { - owner: 'sandy081'; - comment: 'Report when extensions are auto restarted'; - count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Number of extensions auto restarted' }; - }; - type ExtensionsAutoRestartEvent = { - count: number; - }; - this.telemetryService.publicLog2('extensions:autorestart', { count: toAdd.length + toRemove.length }); - } + type ExtensionsAutoRestartClassification = { + owner: 'sandy081'; + comment: 'Report when extensions are auto restarted'; + count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Number of extensions auto restarted' }; + auto: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the restart was triggered automatically' }; + }; + type ExtensionsAutoRestartEvent = { + count: number; + auto: boolean; + }; + this.telemetryService.publicLog2('extensions:autorestart', { count: toAdd.length + toRemove.length, auto }); } } } From 5d7157cb03aaa8f28eff36be9bafd3a47d9fb1b3 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Sun, 16 Jun 2024 18:12:37 -0700 Subject: [PATCH 257/755] Implement getAccounts API over getSessions (#215874) And plumb that through to the Microsoft auth provider --- .../microsoft-authentication/package.json | 3 +- .../microsoft-authentication/src/AADHelper.ts | 85 +++++++++++++------ .../microsoft-authentication/src/extension.ts | 6 +- .../microsoft-authentication/tsconfig.json | 3 +- .../api/browser/mainThreadAuthentication.ts | 36 +++++--- .../api/browser/mainThreadLanguageModels.ts | 6 +- .../workbench/api/common/extHost.api.impl.ts | 7 ++ .../workbench/api/common/extHost.protocol.ts | 5 +- .../api/common/extHostAuthentication.ts | 11 ++- .../browser/authenticationService.ts | 8 +- .../authentication/common/authentication.ts | 21 +++-- .../vscode.proposed.authGetSessions.d.ts | 71 +++++++++++----- 12 files changed, 178 insertions(+), 84 deletions(-) diff --git a/extensions/microsoft-authentication/package.json b/extensions/microsoft-authentication/package.json index 3d73a7621fde3..fd3ba0770281e 100644 --- a/extensions/microsoft-authentication/package.json +++ b/extensions/microsoft-authentication/package.json @@ -14,7 +14,8 @@ ], "activationEvents": [], "enabledApiProposals": [ - "idToken" + "idToken", + "authGetSessions" ], "capabilities": { "virtualWorkspaces": true, diff --git a/extensions/microsoft-authentication/src/AADHelper.ts b/extensions/microsoft-authentication/src/AADHelper.ts index df36686dc9a3d..bc4d71e56d610 100644 --- a/extensions/microsoft-authentication/src/AADHelper.ts +++ b/extensions/microsoft-authentication/src/AADHelper.ts @@ -203,11 +203,13 @@ export class AzureActiveDirectoryService { return this._sessionChangeEmitter.event; } - public getSessions(scopes?: string[]): Promise { + public getSessions(scopes?: string[], account?: vscode.AuthenticationSessionAccountInformation): Promise { if (!scopes) { this._logger.info('Getting sessions for all scopes...'); - const sessions = this._tokens.map(token => this.convertToSessionSync(token)); - this._logger.info(`Got ${sessions.length} sessions for all scopes...`); + const sessions = this._tokens + .filter(token => !account?.label || token.account.label === account.label) + .map(token => this.convertToSessionSync(token)); + this._logger.info(`Got ${sessions.length} sessions for all scopes${account ? ` for account '${account.label}'` : ''}...`); return Promise.resolve(sessions); } @@ -238,23 +240,43 @@ export class AzureActiveDirectoryService { tenant: this.getTenantId(scopes), }; - this._logger.trace(`[${scopeData.scopeStr}] Queued getting sessions`); - return this._sequencer.queue(modifiedScopesStr, () => this.doGetSessions(scopeData)); + this._logger.trace(`[${scopeData.scopeStr}] Queued getting sessions` + account ? ` for ${account?.label}` : ''); + return this._sequencer.queue(modifiedScopesStr, () => this.doGetSessions(scopeData, account)); } - private async doGetSessions(scopeData: IScopeData): Promise { - this._logger.info(`[${scopeData.scopeStr}] Getting sessions`); + private async doGetSessions(scopeData: IScopeData, account?: vscode.AuthenticationSessionAccountInformation): Promise { + this._logger.info(`[${scopeData.scopeStr}] Getting sessions` + account ? ` for ${account?.label}` : ''); - const matchingTokens = this._tokens.filter(token => token.scope === scopeData.scopeStr); + const matchingTokens = this._tokens + .filter(token => token.scope === scopeData.scopeStr) + .filter(token => !account?.label || token.account.label === account.label); // If we still don't have a matching token try to get a new token from an existing token by using // the refreshToken. This is documented here: // https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#refresh-the-access-token // "Refresh tokens are valid for all permissions that your client has already received consent for." if (!matchingTokens.length) { - // Get a token with the correct client id. - const token = scopeData.clientId === DEFAULT_CLIENT_ID - ? this._tokens.find(t => t.refreshToken && !t.scope.includes('VSCODE_CLIENT_ID')) - : this._tokens.find(t => t.refreshToken && t.scope.includes(`VSCODE_CLIENT_ID:${scopeData.clientId}`)); + // Get a token with the correct client id and account. + let token: IToken | undefined; + for (const t of this._tokens) { + // No refresh token, so we can't make a new token from this session + if (!t.refreshToken) { + continue; + } + // Need to make sure the account matches if we were provided one + if (account?.label && t.account.label !== account.label) { + continue; + } + // If the client id is the default client id, then check for the absence of the VSCODE_CLIENT_ID scope + if (scopeData.clientId === DEFAULT_CLIENT_ID && !t.scope.includes('VSCODE_CLIENT_ID')) { + token = t; + break; + } + // If the client id is not the default client id, then check for the matching VSCODE_CLIENT_ID scope + if (scopeData.clientId !== DEFAULT_CLIENT_ID && t.scope.includes(`VSCODE_CLIENT_ID:${scopeData.clientId}`)) { + token = t; + break; + } + } if (token) { this._logger.trace(`[${scopeData.scopeStr}] '${token.sessionId}' Found a matching token with a different scopes '${token.scope}'. Attempting to get a new session using the existing session.`); @@ -275,7 +297,7 @@ export class AzureActiveDirectoryService { .map(result => (result as PromiseFulfilledResult).value); } - public createSession(scopes: string[]): Promise { + public createSession(scopes: string[], account?: vscode.AuthenticationSessionAccountInformation): Promise { let modifiedScopes = [...scopes]; if (!modifiedScopes.includes('openid')) { modifiedScopes.push('openid'); @@ -301,11 +323,11 @@ export class AzureActiveDirectoryService { }; this._logger.trace(`[${scopeData.scopeStr}] Queued creating session`); - return this._sequencer.queue(scopeData.scopeStr, () => this.doCreateSession(scopeData)); + return this._sequencer.queue(scopeData.scopeStr, () => this.doCreateSession(scopeData, account)); } - private async doCreateSession(scopeData: IScopeData): Promise { - this._logger.info(`[${scopeData.scopeStr}] Creating session`); + private async doCreateSession(scopeData: IScopeData, account?: vscode.AuthenticationSessionAccountInformation): Promise { + this._logger.info(`[${scopeData.scopeStr}] Creating session` + account ? ` for ${account?.label}` : ''); const runsRemote = vscode.env.remoteName !== undefined; const runsServerless = vscode.env.remoteName === undefined && vscode.env.uiKind === vscode.UIKind.Web; @@ -316,17 +338,17 @@ export class AzureActiveDirectoryService { return await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: vscode.l10n.t('Signing in to your account...'), cancellable: true }, async (_progress, token) => { if (runsRemote || runsServerless) { - return await this.createSessionWithoutLocalServer(scopeData, token); + return await this.createSessionWithoutLocalServer(scopeData, account?.label, token); } try { - return await this.createSessionWithLocalServer(scopeData, token); + return await this.createSessionWithLocalServer(scopeData, account?.label, token); } catch (e) { this._logger.error(`[${scopeData.scopeStr}] Error creating session: ${e}`); // If the error was about starting the server, try directly hitting the login endpoint instead if (e.message === 'Error listening to server' || e.message === 'Closed' || e.message === 'Timeout waiting for port') { - return this.createSessionWithoutLocalServer(scopeData, token); + return this.createSessionWithoutLocalServer(scopeData, account?.label, token); } throw e; @@ -334,7 +356,7 @@ export class AzureActiveDirectoryService { }); } - private async createSessionWithLocalServer(scopeData: IScopeData, token: vscode.CancellationToken): Promise { + private async createSessionWithLocalServer(scopeData: IScopeData, loginHint: string | undefined, token: vscode.CancellationToken): Promise { this._logger.trace(`[${scopeData.scopeStr}] Starting login flow with local server`); const codeVerifier = generateCodeVerifier(); const codeChallenge = await generateCodeChallenge(codeVerifier); @@ -344,11 +366,15 @@ export class AzureActiveDirectoryService { client_id: scopeData.clientId, redirect_uri: redirectUrl, scope: scopeData.scopesToSend, - prompt: 'select_account', code_challenge_method: 'S256', code_challenge: codeChallenge, - }).toString(); - const loginUrl = new URL(`${scopeData.tenant}/oauth2/v2.0/authorize?${qs}`, this._env.activeDirectoryEndpointUrl).toString(); + }); + if (loginHint) { + qs.set('login_hint', loginHint); + } else { + qs.set('prompt', 'select_account'); + } + const loginUrl = new URL(`${scopeData.tenant}/oauth2/v2.0/authorize?${qs.toString()}`, this._env.activeDirectoryEndpointUrl).toString(); const server = new LoopbackAuthServer(path.join(__dirname, '../media'), loginUrl); await server.start(); @@ -370,7 +396,7 @@ export class AzureActiveDirectoryService { return session; } - private async createSessionWithoutLocalServer(scopeData: IScopeData, token: vscode.CancellationToken): Promise { + private async createSessionWithoutLocalServer(scopeData: IScopeData, loginHint: string | undefined, token: vscode.CancellationToken): Promise { this._logger.trace(`[${scopeData.scopeStr}] Starting login flow without local server`); let callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://vscode.microsoft-authentication`)); const nonce = generateCodeVerifier(); @@ -383,17 +409,22 @@ export class AzureActiveDirectoryService { const codeVerifier = generateCodeVerifier(); const codeChallenge = await generateCodeChallenge(codeVerifier); const signInUrl = new URL(`${scopeData.tenant}/oauth2/v2.0/authorize`, this._env.activeDirectoryEndpointUrl); - signInUrl.search = new URLSearchParams({ + const qs = new URLSearchParams({ response_type: 'code', client_id: encodeURIComponent(scopeData.clientId), response_mode: 'query', redirect_uri: redirectUrl, state, scope: scopeData.scopesToSend, - prompt: 'select_account', code_challenge_method: 'S256', code_challenge: codeChallenge, - }).toString(); + }); + if (loginHint) { + qs.append('login_hint', loginHint); + } else { + qs.append('prompt', 'select_account'); + } + signInUrl.search = qs.toString(); const uri = vscode.Uri.parse(signInUrl.toString()); vscode.env.openExternal(uri); diff --git a/extensions/microsoft-authentication/src/extension.ts b/extensions/microsoft-authentication/src/extension.ts index 02cfb4643f419..87dc94e4c2545 100644 --- a/extensions/microsoft-authentication/src/extension.ts +++ b/extensions/microsoft-authentication/src/extension.ts @@ -123,8 +123,8 @@ export async function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.authentication.registerAuthenticationProvider('microsoft', 'Microsoft', { onDidChangeSessions: loginService.onDidChangeSessions, - getSessions: (scopes: string[]) => loginService.getSessions(scopes), - createSession: async (scopes: string[]) => { + getSessions: (scopes: string[], options?: vscode.AuthenticationProviderSessionOptions) => loginService.getSessions(scopes, options?.account), + createSession: async (scopes: string[], options?: vscode.AuthenticationProviderSessionOptions) => { try { /* __GDPR__ "login" : { @@ -138,7 +138,7 @@ export async function activate(context: vscode.ExtensionContext) { scopes: JSON.stringify(scopes.map(s => s.replace(/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}/i, '{guid}'))), }); - return await loginService.createSession(scopes); + return await loginService.createSession(scopes, options?.account); } catch (e) { /* __GDPR__ "loginFailed" : { "owner": "TylerLeonhardt", "comment": "Used to determine how often users run into issues with the login flow." } diff --git a/extensions/microsoft-authentication/tsconfig.json b/extensions/microsoft-authentication/tsconfig.json index 4b9d06d1847ef..cad76d078bd8a 100644 --- a/extensions/microsoft-authentication/tsconfig.json +++ b/extensions/microsoft-authentication/tsconfig.json @@ -22,6 +22,7 @@ "include": [ "src/**/*", "../../src/vscode-dts/vscode.d.ts", - "../../src/vscode-dts/vscode.proposed.idToken.d.ts" + "../../src/vscode-dts/vscode.proposed.idToken.d.ts", + "../../src/vscode-dts/vscode.proposed.authGetSessions.d.ts" ] } diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index 3719825841a77..c60acfa9739f0 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -6,7 +6,7 @@ import { Disposable, DisposableMap } from 'vs/base/common/lifecycle'; import * as nls from 'vs/nls'; import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; -import { IAuthenticationCreateSessionOptions, AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationService, IAuthenticationExtensionsService, INTERNAL_AUTH_PROVIDER_PREFIX as INTERNAL_MODEL_AUTH_PROVIDER_PREFIX } from 'vs/workbench/services/authentication/common/authentication'; +import { IAuthenticationCreateSessionOptions, AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationService, IAuthenticationExtensionsService, INTERNAL_AUTH_PROVIDER_PREFIX as INTERNAL_MODEL_AUTH_PROVIDER_PREFIX, AuthenticationSessionAccount, IAuthenticationProviderSessionOptions } from 'vs/workbench/services/authentication/common/authentication'; import { ExtHostAuthenticationShape, ExtHostContext, MainContext, MainThreadAuthenticationShape } from '../common/extHost.protocol'; import { IDialogService, IPromptButton } from 'vs/platform/dialogs/common/dialogs'; import Severity from 'vs/base/common/severity'; @@ -31,6 +31,7 @@ interface AuthenticationGetSessionOptions { createIfNone?: boolean; forceNewSession?: boolean | AuthenticationForceNewSessionOptions; silent?: boolean; + account?: AuthenticationSessionAccount; } export class MainThreadAuthenticationProvider extends Disposable implements IAuthenticationProvider { @@ -49,8 +50,8 @@ export class MainThreadAuthenticationProvider extends Disposable implements IAut this.onDidChangeSessions = onDidChangeSessionsEmitter.event; } - async getSessions(scopes?: string[]) { - return this._proxy.$getSessions(this.id, scopes); + async getSessions(scopes: string[] | undefined, options: IAuthenticationProviderSessionOptions) { + return this._proxy.$getSessions(this.id, scopes, options); } createSession(scopes: string[], options: IAuthenticationCreateSessionOptions): Promise { @@ -159,7 +160,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu } private async doGetSession(providerId: string, scopes: string[], extensionId: string, extensionName: string, options: AuthenticationGetSessionOptions): Promise { - const sessions = await this.authenticationService.getSessions(providerId, scopes, true); + const sessions = await this.authenticationService.getSessions(providerId, scopes, options.account, true); const provider = this.authenticationService.getProvider(providerId); // Error cases @@ -213,18 +214,16 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu let session; if (sessions?.length && !options.forceNewSession) { - session = provider.supportsMultipleAccounts + session = provider.supportsMultipleAccounts && !options.account ? await this.authenticationExtensionsService.selectSession(providerId, extensionId, extensionName, scopes, sessions) : sessions[0]; } else { - let sessionToRecreate: AuthenticationSession | undefined; - if (typeof options.forceNewSession === 'object' && options.forceNewSession.sessionToRecreate) { - sessionToRecreate = options.forceNewSession.sessionToRecreate as AuthenticationSession; - } else { + let account: AuthenticationSessionAccount | undefined = options.account; + if (!account) { const sessionIdToRecreate = this.authenticationExtensionsService.getSessionPreference(providerId, extensionId, scopes); - sessionToRecreate = sessionIdToRecreate ? sessions.find(session => session.id === sessionIdToRecreate) : undefined; + account = sessionIdToRecreate ? sessions.find(session => session.id === sessionIdToRecreate)?.account : undefined; } - session = await this.authenticationService.createSession(providerId, scopes, { activateImmediate: true, sessionToRecreate }); + session = await this.authenticationService.createSession(providerId, scopes, { activateImmediate: true, account }); } this.authenticationAccessService.updateAllowedExtensions(providerId, session.account.label, [{ id: extensionId, name: extensionName, allowed: true }]); @@ -262,7 +261,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu } async $getSessions(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string): Promise { - const sessions = await this.authenticationService.getSessions(providerId, [...scopes], true); + const sessions = await this.authenticationService.getSessions(providerId, [...scopes], undefined, true); const accessibleSessions = sessions.filter(s => this.authenticationAccessService.isAccessAllowed(providerId, s.account.label, extensionId)); if (accessibleSessions.length) { this.sendProviderUsageTelemetry(extensionId, providerId); @@ -273,6 +272,19 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu return accessibleSessions; } + async $getAccounts(providerId: string): Promise> { + const sessions = await this.authenticationService.getSessions(providerId); + const accounts = new Array(); + const seenAccounts = new Set(); + for (const session of sessions) { + if (!seenAccounts.has(session.account.label)) { + seenAccounts.add(session.account.label); + accounts.push(session.account); + } + } + return accounts; + } + private sendProviderUsageTelemetry(extensionId: string, providerId: string): void { type AuthProviderUsageClassification = { owner: 'TylerLeonhardt'; diff --git a/src/vs/workbench/api/browser/mainThreadLanguageModels.ts b/src/vs/workbench/api/browser/mainThreadLanguageModels.ts index 9b14928a5148c..0418e5676bcc4 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageModels.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageModels.ts @@ -14,7 +14,7 @@ import { ExtHostLanguageModelsShape, ExtHostContext, MainContext, MainThreadLang import { ILanguageModelStatsService } from 'vs/workbench/contrib/chat/common/languageModelStats'; import { ILanguageModelChatMetadata, IChatResponseFragment, ILanguageModelsService, IChatMessage, ILanguageModelChatSelector } from 'vs/workbench/contrib/chat/common/languageModels'; import { IAuthenticationAccessService } from 'vs/workbench/services/authentication/browser/authenticationAccessService'; -import { AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationProviderCreateSessionOptions, IAuthenticationService, INTERNAL_AUTH_PROVIDER_PREFIX } from 'vs/workbench/services/authentication/common/authentication'; +import { AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationService, INTERNAL_AUTH_PROVIDER_PREFIX } from 'vs/workbench/services/authentication/common/authentication'; import { IExtHostContext, extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -161,9 +161,9 @@ class LanguageModelAccessAuthProvider implements IAuthenticationProvider { if (this._session) { return [this._session]; } - return [await this.createSession(scopes || [], {})]; + return [await this.createSession(scopes || [])]; } - async createSession(scopes: string[], options: IAuthenticationProviderCreateSessionOptions): Promise { + async createSession(scopes: string[]): Promise { this._session = this._createFakeSession(scopes); this._onDidChangeSessions.fire({ added: [this._session], changed: [], removed: [] }); return this._session; diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 68c6b305eab19..f4c448d9e473f 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -287,12 +287,19 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I if (typeof options?.forceNewSession === 'object' && options.forceNewSession.learnMore) { checkProposedApiEnabled(extension, 'authLearnMore'); } + if (options?.account) { + checkProposedApiEnabled(extension, 'authGetSessions'); + } return extHostAuthentication.getSession(extension, providerId, scopes, options as any); }, getSessions(providerId: string, scopes: readonly string[]) { checkProposedApiEnabled(extension, 'authGetSessions'); return extHostAuthentication.getSessions(extension, providerId, scopes); }, + getAccounts(providerId: string) { + checkProposedApiEnabled(extension, 'authGetSessions'); + return extHostAuthentication.getAccounts(providerId); + }, // TODO: remove this after GHPR and Codespaces move off of it async hasSession(providerId: string, scopes: readonly string[]) { checkProposedApiEnabled(extension, 'authSession'); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index fdbc0cb4b1f80..cc5a244204f98 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -68,7 +68,7 @@ import { CoverageDetails, ExtensionRunTestsRequest, ICallProfileRunHandler, IFil import { Timeline, TimelineChangeEvent, TimelineOptions, TimelineProviderDescriptor } from 'vs/workbench/contrib/timeline/common/timeline'; import { TypeHierarchyItem } from 'vs/workbench/contrib/typeHierarchy/common/typeHierarchy'; import { RelatedInformationResult, RelatedInformationType } from 'vs/workbench/services/aiRelatedInformation/common/aiRelatedInformation'; -import { AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationCreateSessionOptions } from 'vs/workbench/services/authentication/common/authentication'; +import { AuthenticationSession, AuthenticationSessionAccount, AuthenticationSessionsChangeEvent, IAuthenticationCreateSessionOptions, IAuthenticationProviderSessionOptions } from 'vs/workbench/services/authentication/common/authentication'; import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { IExtensionDescriptionDelta, IStaticWorkspaceData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { IResolveAuthorityResult } from 'vs/workbench/services/extensions/common/extensionHostProxy'; @@ -162,6 +162,7 @@ export interface MainThreadAuthenticationShape extends IDisposable { $sendDidChangeSessions(providerId: string, event: AuthenticationSessionsChangeEvent): void; $getSession(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string, options: { createIfNone?: boolean; forceNewSession?: boolean | AuthenticationForceNewSessionOptions; clearSessionPreference?: boolean }): Promise; $getSessions(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string): Promise; + $getAccounts(providerId: string): Promise>; $removeSession(providerId: string, sessionId: string): Promise; } @@ -1806,7 +1807,7 @@ export interface ExtHostLabelServiceShape { } export interface ExtHostAuthenticationShape { - $getSessions(id: string, scopes?: string[]): Promise>; + $getSessions(id: string, scopes: string[] | undefined, options: IAuthenticationProviderSessionOptions): Promise>; $createSession(id: string, scopes: string[], options: IAuthenticationCreateSessionOptions): Promise; $removeSession(id: string, sessionId: string): Promise; $onDidChangeAuthenticationSessions(id: string, label: string): Promise; diff --git a/src/vs/workbench/api/common/extHostAuthentication.ts b/src/vs/workbench/api/common/extHostAuthentication.ts index 16b1d4a405ba1..5c75a1318ca09 100644 --- a/src/vs/workbench/api/common/extHostAuthentication.ts +++ b/src/vs/workbench/api/common/extHostAuthentication.ts @@ -64,6 +64,11 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { }); } + async getAccounts(providerId: string) { + await this._proxy.$ensureProvider(providerId); + return await this._proxy.$getAccounts(providerId); + } + async removeSession(providerId: string, sessionId: string): Promise { const providerData = this._authenticationProviders.get(providerId); if (!providerData) { @@ -89,7 +94,7 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { }); } - async $createSession(providerId: string, scopes: string[], options: vscode.AuthenticationProviderCreateSessionOptions): Promise { + async $createSession(providerId: string, scopes: string[], options: vscode.AuthenticationProviderSessionOptions): Promise { const providerData = this._authenticationProviders.get(providerId); if (providerData) { return await providerData.provider.createSession(scopes, options); @@ -107,10 +112,10 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { throw new Error(`Unable to find authentication provider with handle: ${providerId}`); } - async $getSessions(providerId: string, scopes?: string[]): Promise> { + async $getSessions(providerId: string, scopes: ReadonlyArray | undefined, options: vscode.AuthenticationProviderSessionOptions): Promise> { const providerData = this._authenticationProviders.get(providerId); if (providerData) { - return await providerData.provider.getSessions(scopes); + return await providerData.provider.getSessions(scopes, options); } throw new Error(`Unable to find authentication provider with handle: ${providerId}`); diff --git a/src/vs/workbench/services/authentication/browser/authenticationService.ts b/src/vs/workbench/services/authentication/browser/authenticationService.ts index 84cc7730f4bf8..d154337b9a5c1 100644 --- a/src/vs/workbench/services/authentication/browser/authenticationService.ts +++ b/src/vs/workbench/services/authentication/browser/authenticationService.ts @@ -12,7 +12,7 @@ import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/ import { IProductService } from 'vs/platform/product/common/productService'; import { ISecretStorageService } from 'vs/platform/secrets/common/secrets'; import { IAuthenticationAccessService } from 'vs/workbench/services/authentication/browser/authenticationAccessService'; -import { AuthenticationProviderInformation, AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationCreateSessionOptions, IAuthenticationProvider, IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; +import { AuthenticationProviderInformation, AuthenticationSession, AuthenticationSessionAccount, AuthenticationSessionsChangeEvent, IAuthenticationCreateSessionOptions, IAuthenticationProvider, IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { ActivationKind, IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -164,10 +164,10 @@ export class AuthenticationService extends Disposable implements IAuthentication throw new Error(`No authentication provider '${id}' is currently registered.`); } - async getSessions(id: string, scopes?: string[], activateImmediate: boolean = false): Promise> { + async getSessions(id: string, scopes?: string[], account?: AuthenticationSessionAccount, activateImmediate: boolean = false): Promise> { const authProvider = this._authenticationProviders.get(id) || await this.tryActivateProvider(id, activateImmediate); if (authProvider) { - return await authProvider.getSessions(scopes); + return await authProvider.getSessions(scopes, { account }); } else { throw new Error(`No authentication provider '${id}' is currently registered.`); } @@ -177,7 +177,7 @@ export class AuthenticationService extends Disposable implements IAuthentication const authProvider = this._authenticationProviders.get(id) || await this.tryActivateProvider(id, !!options?.activateImmediate); if (authProvider) { return await authProvider.createSession(scopes, { - sessionToRecreate: options?.sessionToRecreate + account: options?.account }); } else { throw new Error(`No authentication provider '${id}' is currently registered.`); diff --git a/src/vs/workbench/services/authentication/common/authentication.ts b/src/vs/workbench/services/authentication/common/authentication.ts index 6da6e530237c6..1d99ffc059ad2 100644 --- a/src/vs/workbench/services/authentication/common/authentication.ts +++ b/src/vs/workbench/services/authentication/common/authentication.ts @@ -35,8 +35,12 @@ export interface AuthenticationProviderInformation { } export interface IAuthenticationCreateSessionOptions { - sessionToRecreate?: AuthenticationSession; activateImmediate?: boolean; + /** + * The account that is being asked about. If this is passed in, the provider should + * attempt to return the sessions that are only related to this account. + */ + account?: AuthenticationSessionAccount; } export interface AllowedExtension { @@ -131,7 +135,7 @@ export interface IAuthenticationService { * @param scopes The scopes for the session * @param activateImmediate If true, the provider should activate immediately if it is not already */ - getSessions(id: string, scopes?: string[], activateImmediate?: boolean): Promise>; + getSessions(id: string, scopes?: string[], account?: AuthenticationSessionAccount, activateImmediate?: boolean): Promise>; /** * Creates an AuthenticationSession with the given provider and scopes @@ -162,8 +166,12 @@ export interface IAuthenticationExtensionsService { requestNewSession(providerId: string, scopes: string[], extensionId: string, extensionName: string): Promise; } -export interface IAuthenticationProviderCreateSessionOptions { - sessionToRecreate?: AuthenticationSession; +export interface IAuthenticationProviderSessionOptions { + /** + * The account that is being asked about. If this is passed in, the provider should + * attempt to return the sessions that are only related to this account. + */ + account?: AuthenticationSessionAccount; } /** @@ -194,9 +202,10 @@ export interface IAuthenticationProvider { /** * Retrieves a list of authentication sessions. * @param scopes - An optional list of scopes. If provided, the sessions returned should match these permissions, otherwise all sessions should be returned. + * @param options - Additional options for getting sessions. * @returns A promise that resolves to an array of authentication sessions. */ - getSessions(scopes?: string[]): Promise; + getSessions(scopes: string[] | undefined, options: IAuthenticationProviderSessionOptions): Promise; /** * Prompts the user to log in. @@ -207,7 +216,7 @@ export interface IAuthenticationProvider { * @param options - Additional options for creating the session. * @returns A promise that resolves to an authentication session. */ - createSession(scopes: string[], options: IAuthenticationProviderCreateSessionOptions): Promise; + createSession(scopes: string[], options: IAuthenticationProviderSessionOptions): Promise; /** * Removes the session corresponding to the specified session ID. diff --git a/src/vscode-dts/vscode.proposed.authGetSessions.d.ts b/src/vscode-dts/vscode.proposed.authGetSessions.d.ts index 20a692c018058..45049789f506a 100644 --- a/src/vscode-dts/vscode.proposed.authGetSessions.d.ts +++ b/src/vscode-dts/vscode.proposed.authGetSessions.d.ts @@ -7,42 +7,50 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/152399 - export interface AuthenticationForceNewSessionOptions { - /** - * The session that you are asking to be recreated. The Auth Provider can use this to - * help guide the user to log in to the correct account. - */ - sessionToRecreate?: AuthenticationSession; - } + // FOR THE CONSUMER export namespace authentication { /** - * Get all authentication sessions matching the desired scopes that this extension has access to. In order to request access, - * use {@link getSession}. To request an additional account, specify {@link AuthenticationGetSessionOptions.clearSessionPreference} - * and {@link AuthenticationGetSessionOptions.createIfNone} together. + * Get all accounts that the user is logged in to for the specified provider. + * Use this paired with {@link getSession} in order to get an authentication session for a specific account. * * Currently, there are only two authentication providers that are contributed from built in extensions * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. * - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @returns A thenable that resolves to a readonly array of authentication sessions. + * Note: Getting accounts does not imply that your extension has access to that account or its authentication sessions. You can verify access to the account by calling {@link getSession}. + * + * @param providerId The id of the provider to use + * @returns A thenable that resolves to a readonly array of authentication accounts. + */ + export function getAccounts(providerId: string): Thenable; + } + + export interface AuthenticationGetSessionOptions { + /** + * The account that you would like to get a session for. This is passed down to the Authentication Provider to be used for creating the correct session. */ - export function getSessions(providerId: string, scopes: readonly string[]): Thenable; + account?: AuthenticationSessionAccountInformation; } - /** - * The options passed in to the provider when creating a session. - */ - export interface AuthenticationProviderCreateSessionOptions { + // FOR THE AUTH PROVIDER + + export interface AuthenticationProviderSessionOptions { /** - * The session that is being asked to be recreated. If this is passed in, the provider should - * attempt to recreate the session based on the information in this session. + * The account that is being asked about. If this is passed in, the provider should + * attempt to return the sessions that are only related to this account. */ - sessionToRecreate?: AuthenticationSession; + account?: AuthenticationSessionAccountInformation; } export interface AuthenticationProvider { + /** + * Get a list of sessions. + * @param scopes An optional list of scopes. If provided, the sessions returned should match + * these permissions, otherwise all sessions should be returned. + * @param options Additional options for getting sessions. + * @returns A promise that resolves to an array of authentication sessions. + */ + getSessions(scopes: readonly string[] | undefined, options: AuthenticationProviderSessionOptions): Thenable; /** * Prompts a user to login. * @@ -57,6 +65,25 @@ declare module 'vscode' { * @param options Additional options for creating a session. * @returns A promise that resolves to an authentication session. */ - createSession(scopes: readonly string[], options: AuthenticationProviderCreateSessionOptions): Thenable; + createSession(scopes: readonly string[], options: AuthenticationProviderSessionOptions): Thenable; + } + + // THE BELOW IS THE OLD PROPOSAL WHICH WILL BE REMOVED BUT KEPT UNTIL THE NEW PROPOSAL IS ADOPTED BY ALL PARTIES + + export namespace authentication { + /** + * Get all authentication sessions matching the desired scopes that this extension has access to. In order to request access, + * use {@link getSession}. To request an additional account, specify {@link AuthenticationGetSessionOptions.clearSessionPreference} + * and {@link AuthenticationGetSessionOptions.createIfNone} together. + * + * Currently, there are only two authentication providers that are contributed from built in extensions + * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. + * + * @param providerId The id of the provider to use + * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider + * @returns A thenable that resolves to a readonly array of authentication sessions. + * @deprecated Use {@link getAccounts} instead. + */ + export function getSessions(providerId: string, scopes: readonly string[]): Thenable; } } From b49212f5cb3269a932724ab5b91222ce40a09170 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 16 Jun 2024 20:47:11 -0700 Subject: [PATCH 258/755] Fix showing hover on default chat participant (#215906) --- src/vs/workbench/contrib/chat/browser/chatListRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index d8b214f01d4f1..66770184e4030 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -308,7 +308,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { - if (isResponseVM(template.currentElement) && template.currentElement.agent) { + if (isResponseVM(template.currentElement) && template.currentElement.agent && !template.currentElement.agent.isDefault) { agentHover.setAgent(template.currentElement.agent.id); return agentHover.domNode; } From 85e9b0786cc505d85f326991227de364a5bd7293 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 16 Jun 2024 20:47:44 -0700 Subject: [PATCH 259/755] Don't clear chat disposables too early while progressive rendering (#215907) This clear() is wrong because this loop is incrementally updating content, not rerendering everything. Deleting is also not quite right because we are technically leaking when things get rerendered. But that is only the case while in the middle of streaming content, and things will always be fixed up when the response is done loading. Fix #212853 --- src/vs/workbench/contrib/chat/browser/chatListRenderer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 66770184e4030..1fb8ac3b0502c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -684,7 +684,6 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { From ed4de0582a911f1418938f5413e9c638d173f3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 17 Jun 2024 10:39:38 +0200 Subject: [PATCH 260/755] Update preference markers on profile change (#214353) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: update preference markers on profile change Co-authored-by: Loïc Mangeonjean --- .../contrib/preferences/browser/preferencesRenderers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts index 1ce23e6167835..dc76d156be6c8 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts @@ -500,6 +500,7 @@ class UnsupportedSettingsRenderer extends Disposable implements languages.CodeAc this._register(this.editor.getModel()!.onDidChangeContent(() => this.delayedRender())); this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.source === ConfigurationTarget.DEFAULT)(() => this.delayedRender())); this._register(languageFeaturesService.codeActionProvider.register({ pattern: settingsEditorModel.uri.path }, this)); + this._register(userDataProfileService.onDidChangeCurrentProfile(() => this.delayedRender())); } private delayedRender(): void { From a7af3c0e6defbc1e84119ccce69b0c3c9d98d83d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 17 Jun 2024 10:58:13 +0200 Subject: [PATCH 261/755] fix #214329 (#215932) --- src/vs/workbench/api/common/extHostWorkspace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index 08b842e84fb53..5b3cd328aaae4 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -132,7 +132,7 @@ class ExtHostWorkspaceImpl extends Workspace { constructor(id: string, private _name: string, folders: vscode.WorkspaceFolder[], transient: boolean, configuration: URI | null, private _isUntitled: boolean, ignorePathCasing: (key: URI) => boolean) { super(id, folders.map(f => new WorkspaceFolder(f)), transient, configuration, ignorePathCasing); - this._structure = TernarySearchTree.forUris(ignorePathCasing); + this._structure = TernarySearchTree.forUris(ignorePathCasing, () => true); // setup the workspace folder data structure folders.forEach(folder => { From 88d860624c88b77c9f5af85452082aca53442949 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 17 Jun 2024 11:26:21 +0200 Subject: [PATCH 262/755] Inline chat UI overhaul (#215927) * don't dimiss inline chat content widget when already having typed something https://github.com/microsoft/vscode-copilot/issues/6067 * extract `TextOnlyMenuEntryActionViewItem` for reuse * remove unused variables * * show chat input below request/response pairs * setting for text-only buttons * more dynamic buttons * always show the first request, don't repopulate input with last message * keep progress bar hidden, rely on "Generating..." * no more special background color * add `minimal` renderer style for chat renderings * tweak font-size for details when render mode is minimal * stable scroll position for inline chat, don't push down the lines chat is editing but push the inline chat upwards * more buttons more compact, tweak labels * * add missing service dependency * repopulate input for some unit test * allow output from `InteractiveChatController` suite --- .../lib/stylelint/vscode-known-variables.json | 4 +- src/vs/base/browser/ui/toolbar/toolbar.ts | 16 +- .../suggest/browser/suggestWidgetStatus.ts | 23 +- src/vs/platform/actions/browser/buttonbar.ts | 53 +++- .../browser/menuEntryActionViewItem.css | 14 + .../browser/menuEntryActionViewItem.ts | 44 ++- src/vs/workbench/contrib/chat/browser/chat.ts | 4 +- .../contrib/chat/browser/chatListRenderer.ts | 35 ++- .../contrib/chat/browser/chatWidget.ts | 9 +- .../contrib/chat/browser/media/chat.css | 26 +- .../browser/inlineChat.contribution.ts | 44 ++- .../inlineChat/browser/inlineChatActions.ts | 198 ++++++++------ .../browser/inlineChatContentWidget.ts | 21 +- .../browser/inlineChatController.ts | 102 +++---- .../browser/inlineChatFileCreationWidget.ts | 256 ------------------ .../inlineChat/browser/inlineChatWidget.ts | 91 +++---- .../browser/inlineChatZoneWidget.ts | 25 +- .../inlineChat/browser/media/inlineChat.css | 36 ++- .../browser/media/inlineChatContentWidget.css | 19 +- .../contrib/inlineChat/common/inlineChat.ts | 154 ++++++----- .../test/browser/inlineChatController.test.ts | 10 +- .../controller/chat/cellChatActions.ts | 4 +- test/unit/electron/renderer.js | 6 +- 23 files changed, 550 insertions(+), 644 deletions(-) delete mode 100644 src/vs/workbench/contrib/inlineChat/browser/inlineChatFileCreationWidget.ts diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index 0c974a46e0078..df6945112f617 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -818,8 +818,6 @@ "--vscode-hover-maxWidth", "--vscode-hover-sourceWhiteSpace", "--vscode-hover-whiteSpace", - "--vscode-inline-chat-quick-voice-height", - "--vscode-inline-chat-quick-voice-width", "--vscode-editor-dictation-widget-height", "--vscode-editor-dictation-widget-width", "--vscode-interactive-session-foreground", @@ -855,4 +853,4 @@ "--zoom-factor", "--test-bar-width" ] -} \ No newline at end of file +} diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index 57aac5edb4197..ce42a2a9ac717 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -38,6 +38,16 @@ export interface IToolBarOptions { * If true, toggled primary items are highlighted with a background color. */ highlightToggledItems?: boolean; + + /** + * Render action with icons (default: `true`) + */ + icon?: boolean; + + /** + * Render action with label (default: `false`) + */ + label?: boolean; } /** @@ -50,7 +60,6 @@ export class ToolBar extends Disposable { private toggleMenuActionViewItem: DropdownMenuActionViewItem | undefined; private submenuActionViewItems: DropdownMenuActionViewItem[] = []; private hasSecondaryActions: boolean = false; - private readonly lookupKeybindings: boolean; private readonly element: HTMLElement; private _onDidChangeDropdownVisibility = this._register(new EventMultiplexer()); @@ -62,7 +71,6 @@ export class ToolBar extends Disposable { options.hoverDelegate = options.hoverDelegate ?? this._register(createInstantHoverDelegate()); this.options = options; - this.lookupKeybindings = typeof this.options.getKeyBinding === 'function'; this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionViewItem?.show(), options.toggleMenuTitle)); @@ -198,7 +206,7 @@ export class ToolBar extends Disposable { } primaryActionsToSet.forEach(action => { - this.actionBar.push(action, { icon: true, label: false, keybinding: this.getKeybindingLabel(action) }); + this.actionBar.push(action, { icon: this.options.icon ?? true, label: this.options.label ?? false, keybinding: this.getKeybindingLabel(action) }); }); } @@ -207,7 +215,7 @@ export class ToolBar extends Disposable { } private getKeybindingLabel(action: IAction): string | undefined { - const key = this.lookupKeybindings ? this.options.getKeyBinding?.(action) : undefined; + const key = this.options.getKeyBinding?.(action); return key?.getLabel() ?? undefined; } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts b/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts index 25d19c054d254..2db562cf9c9a1 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts @@ -6,31 +6,12 @@ import * as dom from 'vs/base/browser/dom'; import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { IAction } from 'vs/base/common/actions'; -import { ResolvedKeybinding } from 'vs/base/common/keybindings'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { localize } from 'vs/nls'; -import { MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { TextOnlyMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -class StatusBarViewItem extends MenuEntryActionViewItem { - - protected override updateLabel() { - const kb = this._keybindingService.lookupKeybinding(this._action.id, this._contextKeyService); - if (!kb) { - return super.updateLabel(); - } - if (this.label) { - this.label.textContent = localize({ key: 'content', comment: ['A label', 'A keybinding'] }, '{0} ({1})', this._action.label, StatusBarViewItem.symbolPrintEnter(kb)); - } - } - - static symbolPrintEnter(kb: ResolvedKeybinding) { - return kb.getLabel()?.replace(/\benter\b/gi, '\u23CE'); - } -} - export class SuggestWidgetStatus { readonly element: HTMLElement; @@ -49,7 +30,7 @@ export class SuggestWidgetStatus { this.element = dom.append(container, dom.$('.suggest-status-bar')); const actionViewItemProvider = (action => { - return action instanceof MenuItemAction ? instantiationService.createInstance(StatusBarViewItem, action, undefined) : undefined; + return action instanceof MenuItemAction ? instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, undefined) : undefined; }); this._leftActions = new ActionBar(this.element, { actionViewItemProvider }); this._rightActions = new ActionBar(this.element, { actionViewItemProvider }); diff --git a/src/vs/platform/actions/browser/buttonbar.ts b/src/vs/platform/actions/browser/buttonbar.ts index c8d858d4677ba..530b1fe617003 100644 --- a/src/vs/platform/actions/browser/buttonbar.ts +++ b/src/vs/platform/actions/browser/buttonbar.ts @@ -6,11 +6,14 @@ import { ButtonBar, IButton } from 'vs/base/browser/ui/button/button'; import { createInstantHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { ActionRunner, IAction, IActionRunner, SubmenuAction, WorkbenchActionExecutedClassification, WorkbenchActionExecutedEvent } from 'vs/base/common/actions'; +import { Codicon } from 'vs/base/common/codicons'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ThemeIcon } from 'vs/base/common/themables'; import { localize } from 'vs/nls'; -import { MenuId, IMenuService, MenuItemAction } from 'vs/platform/actions/common/actions'; +import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { IToolBarRenderOptions } from 'vs/platform/actions/browser/toolbar'; +import { MenuId, IMenuService, MenuItemAction, IMenuActionOptions } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IHoverService } from 'vs/platform/hover/browser/hover'; @@ -66,7 +69,7 @@ export class WorkbenchButtonBar extends ButtonBar { super.dispose(); } - update(actions: IAction[]): void { + update(actions: IAction[], secondary: IAction[]): void { const conifgProvider: IButtonConfigProvider = this._options?.buttonConfigProvider ?? (() => ({ showLabel: true })); @@ -127,16 +130,46 @@ export class WorkbenchButtonBar extends ButtonBar { this._actionRunner.run(action); })); } + + if (secondary.length > 0) { + + const btn = this.addButton({ + secondary: true, + ariaLabel: localize('moreActions', "More Actions") + }); + + btn.icon = Codicon.dropDownButton; + btn.element.classList.add('default-colors', 'monaco-text-button'); + + btn.enabled = true; + this._updateStore.add(this._hoverService.setupManagedHover(hoverDelegate, btn.element, localize('moreActions', "More Actions"))); + this._updateStore.add(btn.onDidClick(async () => { + this._contextMenuService.showContextMenu({ + getAnchor: () => btn.element, + getActions: () => secondary, + actionRunner: this._actionRunner, + onHide: () => btn.element.setAttribute('aria-expanded', 'false') + }); + btn.element.setAttribute('aria-expanded', 'true'); + + })); + } this._onDidChange.fire(this); } } +export interface IMenuWorkbenchButtonBarOptions extends IWorkbenchButtonBarOptions { + menuOptions?: IMenuActionOptions; + + toolbarOptions?: IToolBarRenderOptions; +} + export class MenuWorkbenchButtonBar extends WorkbenchButtonBar { constructor( container: HTMLElement, menuId: MenuId, - options: IWorkbenchButtonBarOptions | undefined, + options: IMenuWorkbenchButtonBarOptions | undefined, @IMenuService menuService: IMenuService, @IContextKeyService contextKeyService: IContextKeyService, @IContextMenuService contextMenuService: IContextMenuService, @@ -153,12 +186,16 @@ export class MenuWorkbenchButtonBar extends WorkbenchButtonBar { this.clear(); - const actions = menu - .getActions({ renderShortTitle: true }) - .flatMap(entry => entry[1]); - - super.update(actions); + const primary: IAction[] = []; + const secondary: IAction[] = []; + createAndFillInActionBarActions( + menu, + options?.menuOptions, + { primary, secondary }, + options?.toolbarOptions?.primaryGroup + ); + super.update(primary, secondary); }; this._store.add(menu.onDidChange(update)); update(); diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.css b/src/vs/platform/actions/browser/menuEntryActionViewItem.css index c5cba140485b7..7a75d9f62fddd 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.css +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.css @@ -11,6 +11,20 @@ background-size: 16px; } +.monaco-action-bar .action-item.menu-entry.text-only .action-label { + color: var(--vscode-descriptionForeground); + overflow: hidden; + border-radius: 2px; +} + +.monaco-action-bar .action-item.menu-entry.text-only:not(:last-of-type) .action-label::after { + content: ', '; +} + +.monaco-action-bar .action-item.menu-entry.text-only + .action-item:not(.text-only) > .monaco-dropdown .action-label { + color: var(--vscode-descriptionForeground); +} + .monaco-dropdown-with-default { display: flex !important; flex-direction: row; diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index da596a8fc6c02..da6ca0985aeb2 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -31,6 +31,7 @@ import { assertType } from 'vs/base/common/types'; import { asCssVariable, selectBorder } from 'vs/platform/theme/common/colorRegistry'; import { defaultSelectBoxStyles } from 'vs/platform/theme/browser/defaultStyles'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; +import { ResolvedKeybinding } from 'vs/base/common/keybindings'; export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): void { const groups = menu.getActions(options); @@ -121,7 +122,7 @@ export interface IMenuEntryActionViewItemOptions { hoverDelegate?: IHoverDelegate; } -export class MenuEntryActionViewItem extends ActionViewItem { +export class MenuEntryActionViewItem extends ActionViewItem { private _wantsAltCommand: boolean = false; private readonly _itemClassDispose = this._register(new MutableDisposable()); @@ -129,7 +130,7 @@ export class MenuEntryActionViewItem extends ActionViewItem { constructor( action: MenuItemAction, - options: IMenuEntryActionViewItemOptions | undefined, + protected _options: T | undefined, @IKeybindingService protected readonly _keybindingService: IKeybindingService, @INotificationService protected _notificationService: INotificationService, @IContextKeyService protected _contextKeyService: IContextKeyService, @@ -137,7 +138,7 @@ export class MenuEntryActionViewItem extends ActionViewItem { @IContextMenuService protected _contextMenuService: IContextMenuService, @IAccessibilityService private readonly _accessibilityService: IAccessibilityService ) { - super(undefined, action, { icon: !!(action.class || action.item.icon), label: !action.class && !action.item.icon, draggable: options?.draggable, keybinding: options?.keybinding, hoverDelegate: options?.hoverDelegate }); + super(undefined, action, { icon: !!(action.class || action.item.icon), label: !action.class && !action.item.icon, draggable: _options?.draggable, keybinding: _options?.keybinding, hoverDelegate: _options?.hoverDelegate }); this._altKey = ModifierKeyEmitter.getInstance(); } @@ -285,6 +286,43 @@ export class MenuEntryActionViewItem extends ActionViewItem { } } +export interface ITextOnlyMenuEntryActionViewItemOptions extends IMenuEntryActionViewItemOptions { + conversational?: boolean; +} + +export class TextOnlyMenuEntryActionViewItem extends MenuEntryActionViewItem { + + override render(container: HTMLElement): void { + this.options.label = true; + this.options.icon = false; + super.render(container); + container.classList.add('text-only'); + } + + protected override updateLabel() { + const kb = this._keybindingService.lookupKeybinding(this._action.id, this._contextKeyService); + if (!kb) { + return super.updateLabel(); + } + if (this.label) { + const kb2 = TextOnlyMenuEntryActionViewItem._symbolPrintEnter(kb); + + if (this._options?.conversational) { + this.label.textContent = localize({ key: 'content2', comment: ['A label with keybindg like "ESC to dismiss"'] }, '{1} to {0}', this._action.label, kb2); + + } else { + this.label.textContent = localize({ key: 'content', comment: ['A label', 'A keybinding'] }, '{0} ({1})', this._action.label, kb2); + } + } + } + + private static _symbolPrintEnter(kb: ResolvedKeybinding) { + return kb.getLabel() + ?.replace(/\benter\b/gi, '\u23CE') + .replace(/\bEscape\b/gi, 'Esc'); + } +} + export class SubmenuEntryActionViewItem extends DropdownMenuActionViewItem { constructor( diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index 1279810a3ec2d..3b2729c983d14 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -92,7 +92,7 @@ export interface IChatFileTreeInfo { export type ChatTreeItem = IChatRequestViewModel | IChatResponseViewModel | IChatWelcomeMessageViewModel; export interface IChatListItemRendererOptions { - readonly renderStyle?: 'default' | 'compact'; + readonly renderStyle?: 'default' | 'compact' | 'minimal'; readonly noHeader?: boolean; readonly noPadding?: boolean; readonly editableCodeBlock?: boolean; @@ -102,7 +102,7 @@ export interface IChatListItemRendererOptions { export interface IChatWidgetViewOptions { renderInputOnTop?: boolean; renderFollowups?: boolean; - renderStyle?: 'default' | 'compact'; + renderStyle?: 'default' | 'compact' | 'minimal'; supportsFileReferences?: boolean; filter?: (item: ChatTreeItem) => boolean; rendererOptions?: IChatListItemRendererOptions; diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 1fb8ac3b0502c..34babb987ea47 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -271,17 +271,42 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer()); readonly onDidChangeParsedInput = this._onDidChangeParsedInput.event; + private readonly _onWillMaybeChangeHeight = new Emitter(); + readonly onWillMaybeChangeHeight: Event = this._onWillMaybeChangeHeight.event; + private _onDidChangeHeight = this._register(new Emitter()); readonly onDidChangeHeight = this._onDidChangeHeight.event; @@ -374,6 +377,8 @@ export class ChatWidget extends Disposable implements IChatWidget { }; }); + this._onWillMaybeChangeHeight.fire(); + this.tree.setChildren(null, treeItems, { diffIdentityProvider: { getId: (element) => { @@ -549,12 +554,12 @@ export class ChatWidget extends Disposable implements IChatWidget { this._onDidChangeContentHeight.fire(); } - private createInput(container: HTMLElement, options?: { renderFollowups: boolean; renderStyle?: 'default' | 'compact' }): void { + private createInput(container: HTMLElement, options?: { renderFollowups: boolean; renderStyle?: 'default' | 'compact' | 'minimal' }): void { this.inputPart = this._register(this.instantiationService.createInstance(ChatInputPart, this.location, { renderFollowups: options?.renderFollowups ?? true, - renderStyle: options?.renderStyle, + renderStyle: options?.renderStyle === 'minimal' ? 'compact' : options?.renderStyle, menus: { executeToolbar: MenuId.ChatExecute, ...this.viewOptions.menus }, editorOverflowWidgetsDomNode: this.viewOptions.editorOverflowWidgetsDomNode, } diff --git a/src/vs/workbench/contrib/chat/browser/media/chat.css b/src/vs/workbench/contrib/chat/browser/media/chat.css index 84960e0829142..dc41db67627ef 100644 --- a/src/vs/workbench/contrib/chat/browser/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/media/chat.css @@ -49,12 +49,12 @@ font-weight: 600; } -.interactive-item-container .header .detail-container { +.interactive-item-container .detail-container { font-size: 12px; color: var(--vscode-descriptionForeground); } -.interactive-item-container .header .detail-container .detail .agentOrSlashCommandDetected A { +.interactive-item-container .detail-container .detail .agentOrSlashCommandDetected A { cursor: pointer; color: var(--vscode-textLink-foreground); } @@ -342,6 +342,28 @@ margin: 8px 0; } +.interactive-item-container.minimal { + flex-direction: row; +} + +.interactive-item-container.minimal .column.left { + width: 20px; + padding-top: 2px; +} + +.interactive-item-container.minimal .user > .username { + display: none; +} + +.interactive-item-container.minimal .detail-container { + font-size: unset; +} + +.interactive-item-container.minimal > .header { + position: absolute; + right: 0; +} + .interactive-session .interactive-input-and-execute-toolbar { display: flex; box-sizing: border-box; diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts index 4ab19a40890ca..b4552749a1a02 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { registerAction2 } from 'vs/platform/actions/common/actions'; +import { IMenuItem, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { InlineChatController } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; import * as InlineChatActions from 'vs/workbench/contrib/inlineChat/browser/inlineChatActions'; -import { INLINE_CHAT_ID } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_INLINE_CHAT_CONFIG_TXT_BTNS, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, INLINE_CHAT_ID, MENU_INLINE_CHAT_CONTENT_STATUS, MENU_INLINE_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; @@ -19,6 +19,10 @@ import { IInlineChatSavingService } from 'vs/workbench/contrib/inlineChat/browse import { IInlineChatSessionService } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSessionService'; import { InlineChatEnabler, InlineChatSessionServiceImpl } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl'; import { AccessibleViewRegistry } from 'vs/platform/accessibility/browser/accessibleViewRegistry'; +import { CancelAction, SubmitAction } from 'vs/workbench/contrib/chat/browser/actions/chatExecuteActions'; +import { localize } from 'vs/nls'; +import { CONTEXT_CHAT_INPUT_HAS_TEXT } from 'vs/workbench/contrib/chat/common/chatContextKeys'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; // --- browser @@ -28,6 +32,41 @@ registerSingleton(IInlineChatSavingService, InlineChatSavingServiceImpl, Instant registerEditorContribution(INLINE_CHAT_ID, InlineChatController, EditorContributionInstantiation.Eager); // EAGER because of notebook dispose/create of editors +// --- MENU special --- + +const sendActionMenuItem: IMenuItem = { + group: '0_main', + order: 0, + command: { + id: SubmitAction.ID, + title: localize('edit', "Send"), + }, + when: ContextKeyExpr.and( + CONTEXT_CHAT_INPUT_HAS_TEXT, + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.toNegated(), + CTX_INLINE_CHAT_CONFIG_TXT_BTNS + ), +}; + +MenuRegistry.appendMenuItem(MENU_INLINE_CHAT_CONTENT_STATUS, sendActionMenuItem); +MenuRegistry.appendMenuItem(MENU_INLINE_CHAT_WIDGET_STATUS, sendActionMenuItem); + +const cancelActionMenuItem: IMenuItem = { + group: '0_main', + order: 0, + command: { + id: CancelAction.ID, + title: localize('cancel', "Cancel Request"), + shortTitle: localize('cancelShort', "Cancel"), + }, + when: ContextKeyExpr.and( + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, + ), +}; + +MenuRegistry.appendMenuItem(MENU_INLINE_CHAT_WIDGET_STATUS, cancelActionMenuItem); + +// --- actions --- registerAction2(InlineChatActions.StartSessionAction); registerAction2(InlineChatActions.CloseAction); @@ -36,7 +75,6 @@ registerAction2(InlineChatActions.UnstashSessionAction); registerAction2(InlineChatActions.DiscardHunkAction); registerAction2(InlineChatActions.DiscardAction); registerAction2(InlineChatActions.RerunAction); -registerAction2(InlineChatActions.CancelSessionAction); registerAction2(InlineChatActions.MoveToNextHunk); registerAction2(InlineChatActions.MoveToPreviousHunk); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index df40595b8c374..cd21b9cbd3c37 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -11,7 +11,7 @@ import { EmbeddedDiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/em import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { InlineChatController, InlineChatRunOptions } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; -import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_VISIBLE, MENU_INLINE_CHAT_WIDGET_STATUS, CTX_INLINE_CHAT_EDIT_MODE, EditMode, CTX_INLINE_CHAT_DOCUMENT_CHANGED, CTX_INLINE_CHAT_HAS_STASHED_SESSION, ACTION_ACCEPT_CHANGES, CTX_INLINE_CHAT_RESPONSE_TYPES, InlineChatResponseTypes, ACTION_VIEW_IN_CHAT, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, CTX_INLINE_CHAT_CHANGE_HAS_DIFF, MENU_INLINE_CHAT_WIDGET, ACTION_TOGGLE_DIFF, ACTION_REGENERATE_RESPONSE } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { ACTION_ACCEPT_CHANGES, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_HAS_STASHED_SESSION, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_DOCUMENT_CHANGED, CTX_INLINE_CHAT_EDIT_MODE, EditMode, MENU_INLINE_CHAT_WIDGET_STATUS, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, InlineChatResponseType, ACTION_REGENERATE_RESPONSE, MENU_INLINE_CHAT_CONTENT_STATUS, ACTION_VIEW_IN_CHAT, ACTION_TOGGLE_DIFF, CTX_INLINE_CHAT_CHANGE_HAS_DIFF, CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, CTX_INLINE_CHAT_CONFIG_TXT_BTNS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { localize, localize2 } from 'vs/nls'; import { Action2, IAction2Options } from 'vs/platform/actions/common/actions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; @@ -29,7 +29,6 @@ import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { ILogService } from 'vs/platform/log/common/log'; import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; -import { CONTEXT_CHAT_REQUEST_IN_PROGRESS } from 'vs/workbench/contrib/chat/common/chatContextKeys'; CommandsRegistry.registerCommandAlias('interactiveEditor.start', 'inlineChat.start'); CommandsRegistry.registerCommandAlias('interactive.acceptChanges', ACTION_ACCEPT_CHANGES); @@ -228,27 +227,6 @@ export class FocusInlineChat extends EditorAction2 { } } -export class DiscardHunkAction extends AbstractInlineChatAction { - - constructor() { - super({ - id: 'inlineChat.discardHunkChange', - title: localize('discard', 'Discard'), - icon: Codicon.clearAll, - precondition: CTX_INLINE_CHAT_VISIBLE, - menu: { - id: MENU_INLINE_CHAT_WIDGET_STATUS, - when: ContextKeyExpr.and(CTX_INLINE_CHAT_RESPONSE_TYPES.notEqualsTo(InlineChatResponseTypes.OnlyMessages), CTX_INLINE_CHAT_RESPONSE_TYPES.notEqualsTo(InlineChatResponseTypes.Empty), CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live)), - group: '0_main', - order: 3 - } - }); - } - - async runInlineChatCommand(_accessor: ServicesAccessor, ctrl: InlineChatController, _editor: ICodeEditor, ..._args: any[]): Promise { - return ctrl.discardHunk(); - } -} export class DiscardAction extends AbstractInlineChatAction { @@ -271,33 +249,6 @@ export class DiscardAction extends AbstractInlineChatAction { } } -export class ToggleDiffForChange extends AbstractInlineChatAction { - - constructor() { - super({ - id: ACTION_TOGGLE_DIFF, - precondition: ContextKeyExpr.and(CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live), CTX_INLINE_CHAT_CHANGE_HAS_DIFF), - title: localize2('showChanges', 'Toggle Changes'), - icon: Codicon.diffSingle, - toggled: { - condition: CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, - }, - menu: [ - { - id: MENU_INLINE_CHAT_WIDGET_STATUS, - group: '1_main', - when: ContextKeyExpr.and(CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live), CTX_INLINE_CHAT_CHANGE_HAS_DIFF), - order: 10, - } - ] - }); - } - - override runInlineChatCommand(accessor: ServicesAccessor, ctrl: InlineChatController): void { - ctrl.toggleDiff(); - } -} - export class AcceptChanges extends AbstractInlineChatAction { constructor() { @@ -313,10 +264,13 @@ export class AcceptChanges extends AbstractInlineChatAction { primary: KeyMod.CtrlCmd | KeyCode.Enter, }], menu: { - when: ContextKeyExpr.and(CTX_INLINE_CHAT_RESPONSE_TYPES.notEqualsTo(InlineChatResponseTypes.OnlyMessages), CTX_INLINE_CHAT_RESPONSE_TYPES.notEqualsTo(InlineChatResponseTypes.Empty)), id: MENU_INLINE_CHAT_WIDGET_STATUS, group: '0_main', - order: 0 + order: 1, + when: ContextKeyExpr.and( + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.toNegated(), + CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.MessagesAndEdits) + ), } }); } @@ -326,32 +280,72 @@ export class AcceptChanges extends AbstractInlineChatAction { } } -export class CancelSessionAction extends AbstractInlineChatAction { +export class DiscardHunkAction extends AbstractInlineChatAction { constructor() { super({ - id: 'inlineChat.cancel', - title: localize('cancel', 'Cancel'), + id: 'inlineChat.discardHunkChange', + title: localize('discard', 'Discard'), icon: Codicon.clearAll, - precondition: ContextKeyExpr.and(CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Preview)), - keybinding: { - weight: KeybindingWeight.EditorContrib - 1, - primary: KeyCode.Escape - }, + precondition: CTX_INLINE_CHAT_VISIBLE, menu: { id: MENU_INLINE_CHAT_WIDGET_STATUS, - when: ContextKeyExpr.and(CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Preview), CTX_INLINE_CHAT_RESPONSE_TYPES.notEqualsTo(InlineChatResponseTypes.Empty)), group: '0_main', - order: 3 + order: 2, + when: ContextKeyExpr.and( + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.negate(), + CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.MessagesAndEdits), + CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live) + ), + }, + keybinding: { + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.Escape, + when: CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.MessagesAndEdits) } }); } async runInlineChatCommand(_accessor: ServicesAccessor, ctrl: InlineChatController, _editor: ICodeEditor, ..._args: any[]): Promise { - ctrl.cancelSession(); + return ctrl.discardHunk(); } } +export class RerunAction extends AbstractInlineChatAction { + constructor() { + super({ + id: ACTION_REGENERATE_RESPONSE, + title: localize2('chat.rerun.label', "Rerun Request"), + shortTitle: localize('rerun', 'Rerun'), + f1: false, + icon: Codicon.refresh, + precondition: CTX_INLINE_CHAT_VISIBLE, + menu: { + id: MENU_INLINE_CHAT_WIDGET_STATUS, + group: '0_main', + order: 5, + when: ContextKeyExpr.and( + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.negate(), + CTX_INLINE_CHAT_RESPONSE_TYPE.notEqualsTo(InlineChatResponseType.None) + ) + }, + keybinding: { + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.CtrlCmd | KeyCode.KeyR + } + }); + } + + override async runInlineChatCommand(accessor: ServicesAccessor, ctrl: InlineChatController, _editor: ICodeEditor, ..._args: any[]): Promise { + const chatService = accessor.get(IChatService); + const model = ctrl.chatWidget.viewModel?.model; + + const lastRequest = model?.getRequests().at(-1); + if (lastRequest) { + await chatService.resendRequest(lastRequest, { noCommandDetection: false, attempt: lastRequest.attempt + 1, location: ctrl.chatWidget.location }); + } + } +} export class CloseAction extends AbstractInlineChatAction { @@ -362,15 +356,25 @@ export class CloseAction extends AbstractInlineChatAction { icon: Codicon.close, precondition: CTX_INLINE_CHAT_VISIBLE, keybinding: { - weight: KeybindingWeight.EditorContrib - 1, + weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.Escape, - when: CTX_INLINE_CHAT_USER_DID_EDIT.negate() }, - menu: { - id: MENU_INLINE_CHAT_WIDGET, - group: 'navigation', + menu: [{ + id: MENU_INLINE_CHAT_CONTENT_STATUS, + group: '0_main', order: 10, - } + }, { + id: MENU_INLINE_CHAT_WIDGET_STATUS, + group: '0_main', + order: 1, + when: ContextKeyExpr.and( + CTX_INLINE_CHAT_CONFIG_TXT_BTNS, + ContextKeyExpr.or( + CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.Messages), + CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Preview) + ) + ), + }] }); } @@ -387,6 +391,11 @@ export class ConfigureInlineChatAction extends AbstractInlineChatAction { icon: Codicon.settingsGear, precondition: CTX_INLINE_CHAT_VISIBLE, f1: true, + menu: { + id: MENU_INLINE_CHAT_WIDGET_STATUS, + group: 'zzz', + order: 5 + } }); } @@ -478,10 +487,23 @@ export class ViewInChatAction extends AbstractInlineChatAction { title: localize('viewInChat', 'View in Chat'), icon: Codicon.commentDiscussion, precondition: CTX_INLINE_CHAT_VISIBLE, - menu: { - id: MENU_INLINE_CHAT_WIDGET, - group: 'navigation', - order: 5 + menu: [{ + id: MENU_INLINE_CHAT_WIDGET_STATUS, + group: 'more', + order: 1, + when: CTX_INLINE_CHAT_RESPONSE_TYPE.notEqualsTo(InlineChatResponseType.Messages) + }, { + id: MENU_INLINE_CHAT_WIDGET_STATUS, + group: '0_main', + order: 1, + when: ContextKeyExpr.and( + CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.Messages), + CTX_INLINE_CHAT_CONFIG_TXT_BTNS + ) + }], + keybinding: { + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.CtrlCmd | KeyCode.DownArrow, } }); } @@ -490,29 +512,27 @@ export class ViewInChatAction extends AbstractInlineChatAction { } } -export class RerunAction extends AbstractInlineChatAction { +export class ToggleDiffForChange extends AbstractInlineChatAction { + constructor() { super({ - id: ACTION_REGENERATE_RESPONSE, - title: localize2('chat.rerun.label', "Rerun Request"), - f1: false, - icon: Codicon.refresh, - precondition: CONTEXT_CHAT_REQUEST_IN_PROGRESS.negate(), + id: ACTION_TOGGLE_DIFF, + precondition: ContextKeyExpr.and(CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live), CTX_INLINE_CHAT_CHANGE_HAS_DIFF), + title: localize2('showChanges', 'Toggle Changes'), + icon: Codicon.diffSingle, + toggled: { + condition: CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, + }, menu: { id: MENU_INLINE_CHAT_WIDGET_STATUS, - group: '0_main', - order: 5, + group: 'more', + when: ContextKeyExpr.and(CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live), CTX_INLINE_CHAT_CHANGE_HAS_DIFF), + order: 10, } }); } - override async runInlineChatCommand(accessor: ServicesAccessor, ctrl: InlineChatController, _editor: ICodeEditor, ..._args: any[]): Promise { - const chatService = accessor.get(IChatService); - const model = ctrl.chatWidget.viewModel?.model; - - const lastRequest = model?.getRequests().at(-1); - if (lastRequest) { - await chatService.resendRequest(lastRequest, { noCommandDetection: false, attempt: lastRequest.attempt + 1, location: ctrl.chatWidget.location }); - } + override runInlineChatCommand(accessor: ServicesAccessor, ctrl: InlineChatController): void { + ctrl.toggleDiff(); } } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts index c305b01aab416..38386b959efed 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts @@ -11,7 +11,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { inlineChatBackground } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { inlineChatBackground, MENU_INLINE_CHAT_CONTENT_STATUS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; @@ -22,6 +22,9 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { ScrollType } from 'vs/editor/common/editorCommon'; +import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; +import { MenuItemAction } from 'vs/platform/actions/common/actions'; +import { TextOnlyMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export class InlineChatContentWidget implements IContentWidget { @@ -31,7 +34,7 @@ export class InlineChatContentWidget implements IContentWidget { private readonly _store = new DisposableStore(); private readonly _domNode = document.createElement('div'); private readonly _inputContainer = document.createElement('div'); - private readonly _messageContainer = document.createElement('div'); + private readonly _toolbarContainer = document.createElement('div'); private _position?: IPosition; @@ -68,7 +71,7 @@ export class InlineChatContentWidget implements IContentWidget { { defaultElementHeight: 32, editorOverflowWidgetsDomNode: _editor.getOverflowWidgetsDomNode(), - renderStyle: 'compact', + renderStyle: 'minimal', renderInputOnTop: true, renderFollowups: true, supportsFileReferences: false, @@ -94,13 +97,19 @@ export class InlineChatContentWidget implements IContentWidget { this._domNode.appendChild(this._inputContainer); - this._messageContainer.classList.add('hidden', 'message'); - this._domNode.appendChild(this._messageContainer); + this._toolbarContainer.classList.add('toolbar'); + this._domNode.appendChild(this._toolbarContainer); + this._store.add(scopedInstaService.createInstance(MenuWorkbenchToolBar, this._toolbarContainer, MENU_INLINE_CHAT_CONTENT_STATUS, { + actionViewItemProvider: action => action instanceof MenuItemAction ? instaService.createInstance(TextOnlyMenuEntryActionViewItem, action, { conversational: true }) : undefined, + toolbarOptions: { primaryGroup: '0_main' }, + icon: false, + label: true, + })); const tracker = dom.trackFocus(this._domNode); this._store.add(tracker.onDidBlur(() => { - if (this._visible + if (this._visible && this._widget.inputEditor.getModel()?.getValueLength() === 0 // && !"ON" ) { this._onDidBlur.fire(); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 7a61dbb905444..7a18d13078c03 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -35,7 +35,7 @@ import { EmptyResponse, ErrorResponse, ReplyResponse, Session, SessionPrompt } f import { IInlineChatSessionService } from './inlineChatSessionService'; import { EditModeStrategy, IEditObserver, LiveStrategy, PreviewStrategy, ProgressingEditsOptions } from 'vs/workbench/contrib/inlineChat/browser/inlineChatStrategies'; import { InlineChatZoneWidget } from './inlineChatZoneWidget'; -import { CTX_INLINE_CHAT_RESPONSE_TYPES, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_VISIBLE, EditMode, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseTypes } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_VISIBLE, EditMode, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseType } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { StashedSession } from './inlineChatSession'; import { IModelDeltaDecoration, ITextModel, IValidEditOperation } from 'vs/editor/common/model'; import { InlineChatContentWidget } from 'vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget'; @@ -110,8 +110,9 @@ export class InlineChatController implements IEditorContribution { private readonly _ui: Lazy<{ content: InlineChatContentWidget; zone: InlineChatZoneWidget }>; private readonly _ctxVisible: IContextKey; - private readonly _ctxResponseTypes: IContextKey; + private readonly _ctxResponseType: IContextKey; private readonly _ctxUserDidEdit: IContextKey; + private readonly _ctxRequestInProgress: IContextKey; private _messages = this._store.add(new Emitter()); @@ -148,7 +149,8 @@ export class InlineChatController implements IEditorContribution { ) { this._ctxVisible = CTX_INLINE_CHAT_VISIBLE.bindTo(contextKeyService); this._ctxUserDidEdit = CTX_INLINE_CHAT_USER_DID_EDIT.bindTo(contextKeyService); - this._ctxResponseTypes = CTX_INLINE_CHAT_RESPONSE_TYPES.bindTo(contextKeyService); + this._ctxResponseType = CTX_INLINE_CHAT_RESPONSE_TYPE.bindTo(contextKeyService); + this._ctxRequestInProgress = CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.bindTo(contextKeyService); this._ui = new Lazy(() => { let location = ChatAgentLocation.Editor; @@ -302,7 +304,6 @@ export class InlineChatController implements IEditorContribution { if (m === Message.ACCEPT_INPUT) { // user accepted the input before having a session options.autoSend = true; - this._ui.value.zone.widget.updateProgress(true); this._ui.value.zone.widget.updateInfo(localize('welcome.2', "Getting ready...")); } else { createSessionCts.cancel(); @@ -384,6 +385,7 @@ export class InlineChatController implements IEditorContribution { this._updatePlaceholder(); this._showWidget(!this._session.chatModel.hasRequests); + this._ui.value.zone.widget.updateToolbar(true); this._sessionStore.add(this._editor.onDidChangeModel((e) => { const msg = this._session?.chatModel.hasRequests @@ -422,17 +424,7 @@ export class InlineChatController implements IEditorContribution { })); this._sessionStore.add(this._session.chatModel.onDidChange(async e => { - if (e.kind === 'addRequest' && e.request.response) { - this._ui.value.zone.widget.updateProgress(true); - - const listener = e.request.response.onDidChange(() => { - - if (e.request.response?.isCanceled || e.request.response?.isComplete) { - this._ui.value.zone.widget.updateProgress(false); - listener.dispose(); - } - }); - } else if (e.kind === 'removeRequest') { + if (e.kind === 'removeRequest') { // TODO@jrieken there is still some work left for when a request "in the middle" // is removed. We will undo all changes till that point but not remove those // later request @@ -607,9 +599,6 @@ export class InlineChatController implements IEditorContribution { return State.WAIT_FOR_INPUT; } - const input = request.message.text; - this._ui.value.zone.widget.value = input; - this._session.addInput(new SessionPrompt(request, this._editor.getModel()!.getAlternativeVersionId())); return State.SHOW_REQUEST; @@ -620,6 +609,8 @@ export class InlineChatController implements IEditorContribution { assertType(this._session); assertType(this._session.chatModel.requestInProgress); + this._ctxRequestInProgress.set(true); + const { chatModel } = this._session; const request: IChatRequestModel | undefined = chatModel.getRequests().at(-1); @@ -627,7 +618,7 @@ export class InlineChatController implements IEditorContribution { assertType(request.response); this._showWidget(false); - this._ui.value.zone.widget.value = request.message.text; + // this._ui.value.zone.widget.value = request.message.text; this._ui.value.zone.widget.selectAll(false); this._ui.value.zone.widget.updateInfo(''); @@ -684,6 +675,8 @@ export class InlineChatController implements IEditorContribution { // apply edits const handleResponse = () => { + this._updateCtxResponseType(); + if (!localEditGroup) { localEditGroup = response.response.value.find(part => part.kind === 'textEditGroup' && isEqual(part.uri, this._session?.textModelN.uri)); } @@ -747,8 +740,7 @@ export class InlineChatController implements IEditorContribution { this._session.wholeRange.fixup(diff?.changes ?? []); await this._session.hunkData.recompute(editState, diff); - this._ui.value.zone.widget.updateToolbar(true); - this._ui.value.zone.widget.updateProgress(false); + this._ctxRequestInProgress.set(false); return next; } @@ -759,20 +751,6 @@ export class InlineChatController implements IEditorContribution { const { response } = this._session.lastExchange!; - let responseTypes: InlineChatResponseTypes | undefined; - for (const request of this._session.chatModel.getRequests()) { - if (!request.response) { - continue; - } - const thisType = asInlineChatResponseType(request.response.response); - if (responseTypes === undefined) { - responseTypes = thisType; - } else if (responseTypes !== thisType) { - responseTypes = InlineChatResponseTypes.Mixed; - break; - } - } - this._ctxResponseTypes.set(responseTypes); let newPosition: Position | undefined; @@ -792,7 +770,6 @@ export class InlineChatController implements IEditorContribution { } else if (response instanceof ReplyResponse) { // real response -> complex... this._ui.value.zone.widget.updateStatus(''); - this._ui.value.zone.widget.updateToolbar(true); newPosition = await this._strategy.renderChanges(response); } @@ -867,6 +844,7 @@ export class InlineChatController implements IEditorContribution { private _showWidget(initialRender: boolean = false, position?: Position) { assertType(this._editor.hasModel()); + this._ctxVisible.set(true); let widgetPosition: Position; if (position) { @@ -904,11 +882,6 @@ export class InlineChatController implements IEditorContribution { } } - if (this._session && this._ui.rawValue?.zone) { - this._ui.rawValue?.zone.updateBackgroundColor(widgetPosition, this._session.wholeRange.value); - } - - this._ctxVisible.set(true); return widgetPosition; } @@ -926,6 +899,31 @@ export class InlineChatController implements IEditorContribution { } } + private _updateCtxResponseType(): void { + + if (!this._session) { + this._ctxResponseType.set(InlineChatResponseType.None); + return; + } + + const hasLocalEdit = (response: IResponse): boolean => { + return response.value.some(part => part.kind === 'textEditGroup' && isEqual(part.uri, this._session?.textModelN.uri)); + }; + + let responseType = InlineChatResponseType.None; + for (const request of this._session.chatModel.getRequests()) { + if (!request.response) { + continue; + } + responseType = InlineChatResponseType.Messages; + if (hasLocalEdit(request.response.response)) { + responseType = InlineChatResponseType.MessagesAndEdits; + break; // no need to check further + } + } + this._ctxResponseType.set(responseType); + } + private async _makeChanges(edits: TextEdit[], opts: ProgressingEditsOptions | undefined, undoStopBefore: boolean) { assertType(this._session); assertType(this._strategy); @@ -1135,25 +1133,3 @@ async function moveToPanelChat(accessor: ServicesAccessor, model: ChatModel | un widget.focusLastMessage(); } } - -function asInlineChatResponseType(response: IResponse): InlineChatResponseTypes { - let result: InlineChatResponseTypes | undefined; - for (const item of response.value) { - let thisType: InlineChatResponseTypes; - switch (item.kind) { - case 'textEditGroup': - thisType = InlineChatResponseTypes.OnlyEdits; - break; - case 'markdownContent': - default: - thisType = InlineChatResponseTypes.OnlyMessages; - break; - } - if (result === undefined) { - result = thisType; - } else if (result !== thisType) { - return InlineChatResponseTypes.Mixed; - } - } - return result ?? InlineChatResponseTypes.Empty; -} diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatFileCreationWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatFileCreationWidget.ts deleted file mode 100644 index eca335cb37533..0000000000000 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatFileCreationWidget.ts +++ /dev/null @@ -1,256 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Dimension, h } from 'vs/base/browser/dom'; -import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; -import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { Range } from 'vs/editor/common/core/range'; -import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; -import * as editorColorRegistry from 'vs/editor/common/core/editorColorRegistry'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { INLINE_CHAT_ID, inlineChatRegionHighlight } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; -import { Position } from 'vs/editor/common/core/position'; -import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; -import { ResourceLabel } from 'vs/workbench/browser/labels'; -import { FileKind } from 'vs/platform/files/common/files'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { ButtonBar, IButton } from 'vs/base/browser/ui/button/button'; -import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; -import { SaveReason, SideBySideEditor } from 'vs/workbench/common/editor'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IAction, toAction } from 'vs/base/common/actions'; -import { IUntitledTextEditorModel } from 'vs/workbench/services/untitled/common/untitledTextEditorModel'; -import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; -import { Codicon } from 'vs/base/common/codicons'; -import { TAB_ACTIVE_MODIFIED_BORDER } from 'vs/workbench/common/theme'; -import { localize } from 'vs/nls'; -import { Event } from 'vs/base/common/event'; - -export class InlineChatFileCreatePreviewWidget extends ZoneWidget { - - private static TitleHeight = 35; - - private readonly _elements = h('div.inline-chat-newfile-widget@domNode', [ - h('div.title@title', [ - h('span.name.show-file-icons@name'), - h('span.detail@detail'), - ]), - h('div.editor@editor'), - ]); - - private readonly _name: ResourceLabel; - private readonly _previewEditor: ICodeEditor; - private readonly _previewStore = new MutableDisposable(); - private readonly _buttonBar: ButtonBarWidget; - private _dim: Dimension | undefined; - - constructor( - parentEditor: ICodeEditor, - @IInstantiationService instaService: IInstantiationService, - @IThemeService themeService: IThemeService, - @ITextModelService private readonly _textModelResolverService: ITextModelService, - @IEditorService private readonly _editorService: IEditorService, - ) { - super(parentEditor, { - showArrow: false, - showFrame: true, - frameColor: colorRegistry.asCssVariable(TAB_ACTIVE_MODIFIED_BORDER), - frameWidth: 1, - isResizeable: true, - isAccessible: true, - showInHiddenAreas: true, - ordinal: 10000 + 2 - }); - super.create(); - - this._name = instaService.createInstance(ResourceLabel, this._elements.name, { supportIcons: true }); - this._elements.detail.appendChild(renderIcon(Codicon.circleFilled)); - - const contributions = EditorExtensionsRegistry - .getEditorContributions() - .filter(c => c.id !== INLINE_CHAT_ID); - - this._previewEditor = instaService.createInstance(EmbeddedCodeEditorWidget, this._elements.editor, { - scrollBeyondLastLine: false, - stickyScroll: { enabled: false }, - minimap: { enabled: false }, - scrollbar: { alwaysConsumeMouseWheel: false, useShadows: true, ignoreHorizontalScrollbarInContentHeight: true, }, - }, { isSimpleWidget: true, contributions }, parentEditor); - - const doStyle = () => { - const theme = themeService.getColorTheme(); - const overrides: [target: string, source: string][] = [ - [colorRegistry.editorBackground, inlineChatRegionHighlight], - [editorColorRegistry.editorGutter, inlineChatRegionHighlight], - ]; - - for (const [target, source] of overrides) { - const value = theme.getColor(source); - if (value) { - this._elements.domNode.style.setProperty(colorRegistry.asCssVariableName(target), String(value)); - } - } - }; - doStyle(); - this._disposables.add(themeService.onDidColorThemeChange(doStyle)); - - this._buttonBar = instaService.createInstance(ButtonBarWidget); - this._elements.title.appendChild(this._buttonBar.domNode); - } - - override dispose(): void { - this._name.dispose(); - this._buttonBar.dispose(); - this._previewEditor.dispose(); - this._previewStore.dispose(); - super.dispose(); - } - - protected override _fillContainer(container: HTMLElement): void { - container.appendChild(this._elements.domNode); - } - - override show(): void { - throw new Error('Use showFileCreation'); - } - - async showCreation(where: Position, untitledTextModel: IUntitledTextEditorModel): Promise { - - const store = new DisposableStore(); - this._previewStore.value = store; - - this._name.element.setFile(untitledTextModel.resource, { - fileKind: FileKind.FILE, - fileDecorations: { badges: true, colors: true } - }); - - const actionSave = toAction({ - id: '1', - label: localize('save', "Create"), - run: () => untitledTextModel.save({ reason: SaveReason.EXPLICIT }) - }); - const actionSaveAs = toAction({ - id: '2', - label: localize('saveAs', "Create As"), - run: async () => { - const ids = this._editorService.findEditors(untitledTextModel.resource, { supportSideBySide: SideBySideEditor.ANY }); - await this._editorService.save(ids.slice(), { saveAs: true, reason: SaveReason.EXPLICIT }); - } - }); - - this._buttonBar.update([ - [actionSave, actionSaveAs], - [(toAction({ id: '3', label: localize('discard', "Discard"), run: () => untitledTextModel.revert() }))] - ]); - - store.add(Event.any( - untitledTextModel.onDidRevert, - untitledTextModel.onDidSave, - untitledTextModel.onDidChangeDirty, - untitledTextModel.onWillDispose - )(() => this.hide())); - - await untitledTextModel.resolve(); - - const ref = await this._textModelResolverService.createModelReference(untitledTextModel.resource); - store.add(ref); - - const model = ref.object.textEditorModel; - this._previewEditor.setModel(model); - - const lineHeight = this.editor.getOption(EditorOption.lineHeight); - - this._elements.title.style.height = `${InlineChatFileCreatePreviewWidget.TitleHeight}px`; - const titleHightInLines = InlineChatFileCreatePreviewWidget.TitleHeight / lineHeight; - - const maxLines = Math.max(4, Math.floor((this.editor.getLayoutInfo().height / lineHeight) * .33)); - const lines = Math.min(maxLines, model.getLineCount()); - - super.show(where, titleHightInLines + lines); - } - - override hide(): void { - this._previewStore.clear(); - super.hide(); - } - - // --- layout - - protected override revealRange(range: Range, isLastLine: boolean): void { - // ignore - } - - protected override _onWidth(widthInPixel: number): void { - if (this._dim) { - this._doLayout(this._dim.height, widthInPixel); - } - } - - protected override _doLayout(heightInPixel: number, widthInPixel: number): void { - - const { lineNumbersLeft } = this.editor.getLayoutInfo(); - this._elements.title.style.marginLeft = `${lineNumbersLeft}px`; - - const newDim = new Dimension(widthInPixel, heightInPixel); - if (!Dimension.equals(this._dim, newDim)) { - this._dim = newDim; - this._previewEditor.layout(this._dim.with(undefined, this._dim.height - InlineChatFileCreatePreviewWidget.TitleHeight)); - } - } -} - - -class ButtonBarWidget { - - private readonly _domNode = h('div.buttonbar-widget'); - private readonly _buttonBar: ButtonBar; - private readonly _store = new DisposableStore(); - - constructor( - @IContextMenuService private _contextMenuService: IContextMenuService, - ) { - this._buttonBar = new ButtonBar(this.domNode); - - } - - update(allActions: IAction[][]): void { - this._buttonBar.clear(); - let secondary = false; - for (const actions of allActions) { - let btn: IButton; - const [first, ...rest] = actions; - if (!first) { - continue; - } else if (rest.length === 0) { - // single action - btn = this._buttonBar.addButton({ ...defaultButtonStyles, secondary }); - } else { - btn = this._buttonBar.addButtonWithDropdown({ - ...defaultButtonStyles, - addPrimaryActionToDropdown: false, - actions: rest, - contextMenuProvider: this._contextMenuService - }); - } - btn.label = first.label; - this._store.add(btn.onDidClick(() => first.run())); - secondary = true; - } - } - - dispose(): void { - this._buttonBar.dispose(); - this._store.dispose(); - } - - get domNode() { - return this._domNode.root; - } -} diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 00f085ffda929..e951504924d8d 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -25,7 +25,7 @@ import { localize } from 'vs/nls'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { IWorkbenchButtonBarOptions, MenuWorkbenchButtonBar } from 'vs/platform/actions/browser/buttonbar'; import { HiddenItemStrategy, MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; -import { MenuId } from 'vs/platform/actions/common/actions'; +import { MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -35,9 +35,9 @@ import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibil import { IAccessibleViewService } from 'vs/platform/accessibility/browser/accessibleView'; import { AccessibilityCommandId } from 'vs/workbench/contrib/accessibility/common/accessibilityCommands'; import { ChatModel, IChatModel } from 'vs/workbench/contrib/chat/common/chatModel'; -import { isRequestVM, isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; +import { isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { HunkInformation, Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; -import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED, inlineChatBackground } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED, inlineChatBackground, InlineChatConfigKeys } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { chatRequestBackground } from 'vs/workbench/contrib/chat/common/chatColors'; import { Selection } from 'vs/editor/common/core/selection'; @@ -48,6 +48,7 @@ import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateF import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IHoverService } from 'vs/platform/hover/browser/hover'; import { IChatWidgetViewOptions } from 'vs/workbench/contrib/chat/browser/chat'; +import { TextOnlyMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export interface InlineChatWidgetViewState { @@ -62,6 +63,7 @@ export interface IInlineChatWidgetConstructionOptions { * The menu that rendered as button bar, use for accept, discard etc */ statusMenuId: MenuId | { menu: MenuId; options: IWorkbenchButtonBarOptions }; + /** * The men that rendered in the lower right corner, use for feedback */ @@ -91,7 +93,6 @@ export class InlineChatWidget { [ h('div.chat-widget@chatWidget'), h('div.progress@progress'), - h('div.followUps.hidden@followUps'), h('div.previewDiff.hidden@previewDiff'), h('div.accessibleViewer@accessibleViewer'), h('div.status@status', [ @@ -139,8 +140,6 @@ export class InlineChatWidget { this._progressBar = new ProgressBar(this._elements.progress); this._store.add(this._progressBar); - let allowRequests = false; - this.scopedContextKeyService = this._store.add(_contextKeyService.createScoped(this._elements.chatWidget)); const scopedInstaService = _instantiationService.createChild( new ServiceCollection([ @@ -156,20 +155,11 @@ export class InlineChatWidget { { resource: true }, { defaultElementHeight: 32, - renderStyle: 'compact', - renderInputOnTop: true, + renderStyle: 'minimal', + renderInputOnTop: false, renderFollowups: true, supportsFileReferences: true, - // editorOverflowWidgetsDomNode: options.editorOverflowWidgetsDomNode, - filter: item => { - if (isWelcomeVM(item)) { - return false; - } - if (isRequestVM(item)) { - return allowRequests; - } - return true; - }, + filter: item => !isWelcomeVM(item), ...options.chatWidgetViewOptions }, { @@ -184,34 +174,6 @@ export class InlineChatWidget { this._chatWidget.setVisible(true); this._store.add(this._chatWidget); - const viewModelListener = this._store.add(new MutableDisposable()); - this._store.add(this._chatWidget.onDidChangeViewModel(() => { - const model = this._chatWidget.viewModel; - - if (!model) { - allowRequests = false; - viewModelListener.clear(); - return; - } - - const updateAllowRequestsFilter = () => { - let requestCount = 0; - for (const item of model.getItems()) { - if (isRequestVM(item)) { - if (++requestCount >= 2) { - break; - } - } - } - const newAllowRequest = requestCount >= 2; - if (newAllowRequest !== allowRequests) { - allowRequests = newAllowRequest; - this._chatWidget.refilter(); - } - }; - viewModelListener.value = model.onDidChange(updateAllowRequestsFilter); - })); - const viewModelStore = this._store.add(new DisposableStore()); this._store.add(this._chatWidget.onDidChangeViewModel(() => { viewModelStore.clear(); @@ -237,12 +199,31 @@ export class InlineChatWidget { this._store.add(this._chatWidget.inputEditor.onDidBlurEditorWidget(() => this._ctxInputEditorFocused.set(false))); const statusMenuId = options.statusMenuId instanceof MenuId ? options.statusMenuId : options.statusMenuId.menu; - const statusMenuOptions = options.statusMenuId instanceof MenuId ? undefined : options.statusMenuId.options; - const statusButtonBar = this._instantiationService.createInstance(MenuWorkbenchButtonBar, this._elements.statusToolbar, statusMenuId, statusMenuOptions); - this._store.add(statusButtonBar.onDidChange(() => this._onDidChangeHeight.fire())); - this._store.add(statusButtonBar); + if (this._configurationService.getValue(InlineChatConfigKeys.ExpTextButtons)) { + // TEXT-ONLY bar + const statusToolbarMenu = scopedInstaService.createInstance(MenuWorkbenchToolBar, this._elements.statusToolbar, statusMenuId, { + hiddenItemStrategy: HiddenItemStrategy.NoHide, + actionViewItemProvider: action => action instanceof MenuItemAction ? this._instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { conversational: true }) : undefined, + toolbarOptions: { primaryGroup: '0_main' }, + menuOptions: { renderShortTitle: true }, + label: true, + icon: false + }); + this._store.add(statusToolbarMenu.onDidChangeMenuItems(() => this._onDidChangeHeight.fire())); + this._store.add(statusToolbarMenu); + } else { + // BUTTON bar + const statusMenuOptions = options.statusMenuId instanceof MenuId ? undefined : options.statusMenuId.options; + const statusButtonBar = scopedInstaService.createInstance(MenuWorkbenchButtonBar, this._elements.statusToolbar, statusMenuId, { + toolbarOptions: { primaryGroup: '0_main' }, + menuOptions: { renderShortTitle: true }, + ...statusMenuOptions, + }); + this._store.add(statusButtonBar.onDidChange(() => this._onDidChangeHeight.fire())); + this._store.add(statusButtonBar); + } const workbenchToolbarOptions = { hiddenItemStrategy: HiddenItemStrategy.NoHide, @@ -265,7 +246,6 @@ export class InlineChatWidget { })); this._elements.root.tabIndex = 0; - this._elements.followUps.tabIndex = 0; this._elements.statusLabel.tabIndex = 0; this._updateAriaLabel(); @@ -332,7 +312,6 @@ export class InlineChatWidget { protected _doLayout(dimension: Dimension): void { const extraHeight = this._getExtraHeight(); const progressHeight = getTotalHeight(this._elements.progress); - const followUpsHeight = getTotalHeight(this._elements.followUps); const statusHeight = getTotalHeight(this._elements.status); // console.log('ZONE#Widget#layout', { height: dimension.height, extraHeight, progressHeight, followUpsHeight, statusHeight, LIST: dimension.height - progressHeight - followUpsHeight - statusHeight - extraHeight }); @@ -342,7 +321,7 @@ export class InlineChatWidget { this._elements.progress.style.width = `${dimension.width}px`; this._chatWidget.layout( - dimension.height - progressHeight - followUpsHeight - statusHeight - extraHeight, + dimension.height - progressHeight - statusHeight - extraHeight, dimension.width ); } @@ -352,13 +331,12 @@ export class InlineChatWidget { */ get contentHeight(): number { const data = { - followUpsHeight: getTotalHeight(this._elements.followUps), chatWidgetContentHeight: this._chatWidget.contentHeight, progressHeight: getTotalHeight(this._elements.progress), statusHeight: getTotalHeight(this._elements.status), extraHeight: this._getExtraHeight() }; - const result = data.progressHeight + data.chatWidgetContentHeight + data.followUpsHeight + data.statusHeight + data.extraHeight; + const result = data.progressHeight + data.chatWidgetContentHeight + data.statusHeight + data.extraHeight; return result; } @@ -381,7 +359,7 @@ export class InlineChatWidget { } protected _getExtraHeight(): number { - return 12 /* padding */ + 2 /*border*/ + 12 /*shadow*/; + return 4 /* padding */ + 2 /*border*/ + 12 /*shadow*/; } updateProgress(show: boolean) { @@ -421,6 +399,7 @@ export class InlineChatWidget { } updateToolbar(show: boolean) { + this._elements.root.classList.toggle('toolbar', show); this._elements.statusToolbar.classList.toggle('hidden', !show); this._elements.feedbackToolbar.classList.toggle('hidden', !show); this._elements.status.classList.toggle('actions', show); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index c7d2e16417712..0af64ee8e45f4 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -9,7 +9,7 @@ import { assertType } from 'vs/base/common/types'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorLayoutInfo, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; -import { IRange, Range } from 'vs/editor/common/core/range'; +import { Range } from 'vs/editor/common/core/range'; import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -75,13 +75,23 @@ export class InlineChatZoneWidget extends ZoneWidget { } } }); + this._disposables.add(this.widget); + + let scrollState: StableEditorBottomScrollState | undefined; + this._disposables.add(this.widget.chatWidget.onWillMaybeChangeHeight(() => { + if (this.position) { + scrollState = StableEditorBottomScrollState.capture(this.editor); + } + })); this._disposables.add(this.widget.onDidChangeHeight(() => { if (this.position) { // only relayout when visible + scrollState ??= StableEditorBottomScrollState.capture(this.editor); this._relayout(this._computeHeight().linesValue); + scrollState.restore(this.editor); } })); - this._disposables.add(this.widget); + this.create(); this._disposables.add(addDisposableListener(this.domNode, 'click', e => { @@ -172,20 +182,16 @@ export class InlineChatZoneWidget extends ZoneWidget { } override updatePositionAndHeight(position: Position): void { + const scrollState = StableEditorBottomScrollState.capture(this.editor); super.updatePositionAndHeight(position, this._computeHeight().linesValue); this._setWidgetMargins(position); + scrollState.restore(this.editor); } protected override _getWidth(info: EditorLayoutInfo): number { return info.width - info.minimap.minimapWidth; } - updateBackgroundColor(newPosition: Position, wholeRange: IRange) { - assertType(this.container); - const widgetLineNumber = newPosition.lineNumber; - this.container.classList.toggle('inside-selection', widgetLineNumber > wholeRange.startLineNumber && widgetLineNumber < wholeRange.endLineNumber); - } - private _calculateIndentationWidth(position: Position): number { const viewModel = this.editor._getViewModel(); if (!viewModel) { @@ -224,11 +230,12 @@ export class InlineChatZoneWidget extends ZoneWidget { } override hide(): void { - this.container!.classList.remove('inside-selection'); + const scrollState = StableEditorBottomScrollState.capture(this.editor); this._ctxCursorPosition.reset(); this.widget.reset(); this.widget.chatWidget.setVisible(false); super.hide(); aria.status(localize('inlineChatClosed', 'Closed inline chat widget')); + scrollState.restore(this.editor); } } diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index a2d1666ef79fc..0f90ae5d20fdd 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -11,10 +11,6 @@ max-width: unset; } -.monaco-workbench .zone-widget-container.inside-selection { - background-color: var(--vscode-inlineChat-regionHighlight); -} - .monaco-workbench .inline-chat { color: inherit; padding: 0 8px 8px 8px; @@ -25,6 +21,10 @@ background: var(--vscode-inlineChat-background); } +.monaco-workbench .inline-chat.toolbar { + padding-bottom: 4px; +} + .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-input-part .interactive-execute-toolbar { margin-bottom: 1px; } @@ -39,7 +39,7 @@ } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.interactive-item-compact { - padding: 6px 4px; + padding: 6px 0; gap: 6px; } @@ -78,7 +78,7 @@ .monaco-workbench .inline-chat .status .label { overflow: hidden; color: var(--vscode-descriptionForeground); - font-size: 12px; + font-size: 11px; display: inline-flex; } @@ -146,9 +146,25 @@ padding-top: 3px; } +.monaco-workbench .inline-chat .status .actions .action-item.text-only .action-label, +.monaco-workbench .inline-chat-content-widget .status .actions .action-item.text-only .action-label { + font-size: 12px; + line-height: 16px; + padding: 2px; + margin: 2px 0; + border-radius: 2px; +} + +.monaco-action-bar .action-item.menu-entry.text-only + .action-item:not(.text-only) > .monaco-dropdown .action-label { + font-size: 12px; + line-height: 16px; + width: unset; + height: unset; +} + .monaco-workbench .inline-chat .status .actions > .monaco-button, .monaco-workbench .inline-chat .status .actions > .monaco-button-dropdown { - margin-right: 6px; + margin-right: 4px; } .monaco-workbench .inline-chat .status .actions > .monaco-button-dropdown > .monaco-dropdown-button { @@ -166,12 +182,8 @@ } .monaco-workbench .inline-chat .status .actions .monaco-text-button { - padding: 2px 4px; - white-space: nowrap; -} - -.monaco-workbench .inline-chat .status .monaco-toolbar .action-item { padding: 0 2px; + white-space: nowrap; } /* TODO@jrieken not needed? */ diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css index 829b3d78fc3d6..8800ca13e35ea 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css @@ -5,7 +5,7 @@ .monaco-workbench .inline-chat-content-widget { z-index: 50; - padding: 6px 6px 6px 6px; + padding: 6px 6px 0px 6px; border-radius: 4px; background-color: var(--vscode-inlineChat-background); box-shadow: 0 4px 8px var(--vscode-inlineChat-shadow); @@ -23,20 +23,3 @@ .monaco-workbench .inline-chat-content-widget.interactive-session .interactive-input-part.compact { padding: 0; } - -.monaco-workbench .inline-chat-content-widget .message { - overflow: hidden; - color: var(--vscode-descriptionForeground); - font-size: 11px; - display: inline-flex; -} - -.monaco-workbench .inline-chat-content-widget .message > .codicon { - padding-right: 5px; - font-size: 12px; - line-height: 18px; -} - -.monaco-workbench .inline-chat-content-widget .hidden { - display: none; -} diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index a4ba41a17b2b3..916415694585c 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -6,27 +6,86 @@ import { localize } from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Registry } from 'vs/platform/registry/common/platform'; -import { diffInserted, diffRemoved, editorHoverHighlight, editorWidgetBackground, editorWidgetBorder, focusBorder, inputBackground, inputPlaceholderForeground, registerColor, transparent, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; -import { Extensions as ExtensionsMigration, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration'; +import { diffInserted, diffRemoved, editorWidgetBackground, editorWidgetBorder, focusBorder, inputBackground, inputPlaceholderForeground, registerColor, transparent, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +// settings -export const enum InlineChatResponseTypes { - Empty = 'empty', - OnlyEdits = 'onlyEdits', - OnlyMessages = 'onlyMessages', - Mixed = 'mixed' +export const enum InlineChatConfigKeys { + Mode = 'inlineChat.mode', + FinishOnType = 'inlineChat.finishOnType', + AcceptedOrDiscardBeforeSave = 'inlineChat.acceptedOrDiscardBeforeSave', + HoldToSpeech = 'inlineChat.holdToSpeech', + AccessibleDiffView = 'inlineChat.accessibleDiffView', + ExpTextButtons = 'inlineChat.experimental.textButtons' } -export const INLINE_CHAT_ID = 'interactiveEditor'; -export const INTERACTIVE_EDITOR_ACCESSIBILITY_HELP_ID = 'interactiveEditorAccessiblityHelp'; - export const enum EditMode { Live = 'live', Preview = 'preview' } +Registry.as(Extensions.Configuration).registerConfiguration({ + id: 'editor', + properties: { + [InlineChatConfigKeys.Mode]: { + description: localize('mode', "Configure if changes crafted with inline chat are applied directly to the document or are previewed first."), + default: EditMode.Live, + type: 'string', + enum: [EditMode.Live, EditMode.Preview], + markdownEnumDescriptions: [ + localize('mode.live', "Changes are applied directly to the document, can be highlighted via inline diffs, and accepted/discarded by hunks. Ending a session will keep the changes."), + localize('mode.preview', "Changes are previewed only and need to be accepted via the apply button. Ending a session will discard the changes."), + ], + tags: ['experimental'] + }, + [InlineChatConfigKeys.FinishOnType]: { + description: localize('finishOnType', "Whether to finish an inline chat session when typing outside of changed regions."), + default: false, + type: 'boolean' + }, + [InlineChatConfigKeys.AcceptedOrDiscardBeforeSave]: { + description: localize('acceptedOrDiscardBeforeSave', "Whether pending inline chat sessions prevent saving."), + default: true, + type: 'boolean' + }, + [InlineChatConfigKeys.HoldToSpeech]: { + description: localize('holdToSpeech', "Whether holding the inline chat keybinding will automatically enable speech recognition."), + default: true, + type: 'boolean' + }, + [InlineChatConfigKeys.AccessibleDiffView]: { + description: localize('accessibleDiffView', "Whether the inline chat also renders an accessible diff viewer for its changes."), + default: 'auto', + type: 'string', + enum: ['auto', 'on', 'off'], + markdownEnumDescriptions: [ + localize('accessibleDiffView.auto', "The accessible diff viewer is based screen reader mode being enabled."), + localize('accessibleDiffView.on', "The accessible diff viewer is always enabled."), + localize('accessibleDiffView.off', "The accessible diff viewer is never enabled."), + ], + }, + [InlineChatConfigKeys.ExpTextButtons]: { + description: localize('txtButtons', "Whether to use textual buttons (Requires restart)."), + default: false, + type: 'boolean' + }, + } +}); + + +export const INLINE_CHAT_ID = 'interactiveEditor'; +export const INTERACTIVE_EDITOR_ACCESSIBILITY_HELP_ID = 'interactiveEditorAccessiblityHelp'; + +// --- CONTEXT + +export const enum InlineChatResponseType { + None = 'none', + Messages = 'messages', + MessagesAndEdits = 'messagesAndEdits' +} + export const CTX_INLINE_CHAT_HAS_AGENT = new RawContextKey('inlineChatHasProvider', false, localize('inlineChatHasProvider', "Whether a provider for interactive editors exists")); export const CTX_INLINE_CHAT_VISIBLE = new RawContextKey('inlineChatVisible', false, localize('inlineChatVisible', "Whether the interactive editor input is visible")); export const CTX_INLINE_CHAT_FOCUSED = new RawContextKey('inlineChatFocused', false, localize('inlineChatFocused', "Whether the interactive editor input is focused")); @@ -38,14 +97,17 @@ export const CTX_INLINE_CHAT_INNER_CURSOR_START = new RawContextKey('in export const CTX_INLINE_CHAT_INNER_CURSOR_END = new RawContextKey('inlineChatInnerCursorEnd', false, localize('inlineChatInnerCursorEnd', "Whether the cursor of the iteractive editor input is on the end of the input")); export const CTX_INLINE_CHAT_OUTER_CURSOR_POSITION = new RawContextKey<'above' | 'below' | ''>('inlineChatOuterCursorPosition', '', localize('inlineChatOuterCursorPosition', "Whether the cursor of the outer editor is above or below the interactive editor input")); export const CTX_INLINE_CHAT_HAS_STASHED_SESSION = new RawContextKey('inlineChatHasStashedSession', false, localize('inlineChatHasStashedSession', "Whether interactive editor has kept a session for quick restore")); -export const CTX_INLINE_CHAT_RESPONSE_TYPES = new RawContextKey('inlineChatResponseTypes', InlineChatResponseTypes.Empty, localize('inlineChatResponseTypes', "What type was the responses have been receieved")); export const CTX_INLINE_CHAT_USER_DID_EDIT = new RawContextKey('inlineChatUserDidEdit', undefined, localize('inlineChatUserDidEdit', "Whether the user did changes ontop of the inline chat")); export const CTX_INLINE_CHAT_DOCUMENT_CHANGED = new RawContextKey('inlineChatDocumentChanged', false, localize('inlineChatDocumentChanged', "Whether the document has changed concurrently")); export const CTX_INLINE_CHAT_CHANGE_HAS_DIFF = new RawContextKey('inlineChatChangeHasDiff', false, localize('inlineChatChangeHasDiff', "Whether the current change supports showing a diff")); export const CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF = new RawContextKey('inlineChatChangeShowsDiff', false, localize('inlineChatChangeShowsDiff', "Whether the current change showing a diff")); export const CTX_INLINE_CHAT_EDIT_MODE = new RawContextKey('config.inlineChat.mode', EditMode.Live); +export const CTX_INLINE_CHAT_REQUEST_IN_PROGRESS = new RawContextKey('inlineChatRequestInProgress', false, localize('inlineChatRequestInProgress', "Whether an inline chat request is currently in progress")); +export const CTX_INLINE_CHAT_RESPONSE_TYPE = new RawContextKey('inlineChatResponseType', InlineChatResponseType.None, localize('inlineChatResponseTypes', "What type was the responses have been receieved, nothing yet, just messages, or messaged and local edits")); + +export const CTX_INLINE_CHAT_CONFIG_TXT_BTNS = ContextKeyExpr.equals(`config.${[InlineChatConfigKeys.ExpTextButtons]}`, true); -// --- (select) action identifier +// --- (selected) action identifier export const ACTION_ACCEPT_CHANGES = 'inlineChat.acceptChanges'; export const ACTION_REGENERATE_RESPONSE = 'inlineChat.regenerate'; @@ -55,6 +117,7 @@ export const ACTION_TOGGLE_DIFF = 'inlineChat.toggleDiff'; // --- menus export const MENU_INLINE_CHAT_WIDGET = MenuId.for('inlineChatWidget'); +export const MENU_INLINE_CHAT_CONTENT_STATUS = MenuId.for('inlineChat.content.status'); export const MENU_INLINE_CHAT_WIDGET_STATUS = MenuId.for('inlineChatWidget.status'); // --- colors @@ -63,7 +126,6 @@ export const MENU_INLINE_CHAT_WIDGET_STATUS = MenuId.for('inlineChatWidget.statu export const inlineChatBackground = registerColor('inlineChat.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize('inlineChat.background', "Background color of the interactive editor widget")); export const inlineChatBorder = registerColor('inlineChat.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize('inlineChat.border', "Border color of the interactive editor widget")); export const inlineChatShadow = registerColor('inlineChat.shadow', { dark: widgetShadow, light: widgetShadow, hcDark: widgetShadow, hcLight: widgetShadow }, localize('inlineChat.shadow', "Shadow color of the interactive editor widget")); -export const inlineChatRegionHighlight = registerColor('inlineChat.regionHighlight', { dark: editorHoverHighlight, light: editorHoverHighlight, hcDark: editorHoverHighlight, hcLight: editorHoverHighlight }, localize('inlineChat.regionHighlight', "Background highlighting of the current interactive region. Must be transparent."), true); export const inlineChatInputBorder = registerColor('inlineChatInput.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize('inlineChatInput.border', "Border color of the interactive editor input")); export const inlineChatInputFocusBorder = registerColor('inlineChatInput.focusBorder', { dark: focusBorder, light: focusBorder, hcDark: focusBorder, hcLight: focusBorder }, localize('inlineChatInput.focusBorder', "Border color of the interactive editor input when focused")); export const inlineChatInputPlaceholderForeground = registerColor('inlineChatInput.placeholderForeground', { dark: inputPlaceholderForeground, light: inputPlaceholderForeground, hcDark: inputPlaceholderForeground, hcLight: inputPlaceholderForeground }, localize('inlineChatInput.placeholderForeground', "Foreground color of the interactive editor input placeholder")); @@ -75,67 +137,3 @@ export const minimapInlineChatDiffInserted = registerColor('editorOverviewRuler. export const inlineChatDiffRemoved = registerColor('inlineChatDiff.removed', { dark: transparent(diffRemoved, .5), light: transparent(diffRemoved, .5), hcDark: transparent(diffRemoved, .5), hcLight: transparent(diffRemoved, .5) }, localize('inlineChatDiff.removed', "Background color of removed text in the interactive editor input")); export const overviewRulerInlineChatDiffRemoved = registerColor('editorOverviewRuler.inlineChatRemoved', { dark: transparent(diffRemoved, 0.6), light: transparent(diffRemoved, 0.8), hcDark: transparent(diffRemoved, 0.6), hcLight: transparent(diffRemoved, 0.8) }, localize('editorOverviewRuler.inlineChatRemoved', 'Overview ruler marker color for inline chat removed content.')); - - -// settings - - - -Registry.as(ExtensionsMigration.ConfigurationMigration).registerConfigurationMigrations( - [{ - key: 'interactiveEditor.editMode', migrateFn: (value: any) => { - return [['inlineChat.mode', { value: value }]]; - } - }] -); - -export const enum InlineChatConfigKeys { - Mode = 'inlineChat.mode', - FinishOnType = 'inlineChat.finishOnType', - AcceptedOrDiscardBeforeSave = 'inlineChat.acceptedOrDiscardBeforeSave', - HoldToSpeech = 'inlineChat.holdToSpeech', - AccessibleDiffView = 'inlineChat.accessibleDiffView' -} - -Registry.as(Extensions.Configuration).registerConfiguration({ - id: 'editor', - properties: { - [InlineChatConfigKeys.Mode]: { - description: localize('mode', "Configure if changes crafted with inline chat are applied directly to the document or are previewed first."), - default: EditMode.Live, - type: 'string', - enum: [EditMode.Live, EditMode.Preview], - markdownEnumDescriptions: [ - localize('mode.live', "Changes are applied directly to the document, can be highlighted via inline diffs, and accepted/discarded by hunks. Ending a session will keep the changes."), - localize('mode.preview', "Changes are previewed only and need to be accepted via the apply button. Ending a session will discard the changes."), - ], - tags: ['experimental'] - }, - [InlineChatConfigKeys.FinishOnType]: { - description: localize('finishOnType', "Whether to finish an inline chat session when typing outside of changed regions."), - default: false, - type: 'boolean' - }, - [InlineChatConfigKeys.AcceptedOrDiscardBeforeSave]: { - description: localize('acceptedOrDiscardBeforeSave', "Whether pending inline chat sessions prevent saving."), - default: true, - type: 'boolean' - }, - [InlineChatConfigKeys.HoldToSpeech]: { - description: localize('holdToSpeech', "Whether holding the inline chat keybinding will automatically enable speech recognition."), - default: true, - type: 'boolean' - }, - [InlineChatConfigKeys.AccessibleDiffView]: { - description: localize('accessibleDiffView', "Whether the inline chat also renders an accessible diff viewer for its changes."), - default: 'auto', - type: 'string', - enum: ['auto', 'on', 'off'], - markdownEnumDescriptions: [ - localize('accessibleDiffView.auto', "The accessible diff viewer is based screen reader mode being enabled."), - localize('accessibleDiffView.on', "The accessible diff viewer is always enabled."), - localize('accessibleDiffView.off', "The accessible diff viewer is never enabled."), - ], - } - } -}); diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts index 827280275d565..00e75f658161b 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts @@ -31,7 +31,7 @@ import { IView, IViewDescriptorService } from 'vs/workbench/common/views'; import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import { IAccessibleViewService } from 'vs/platform/accessibility/browser/accessibleView'; import { IChatAccessibilityService, IChatWidget, IChatWidgetService } from 'vs/workbench/contrib/chat/browser/chat'; -import { ChatAgentLocation, ChatAgentService, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { ChatAgentLocation, ChatAgentService, IChatAgentData, IChatAgentNameService, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IChatResponseViewModel } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { InlineChatController, InlineChatRunOptions, State } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; import { Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; @@ -156,6 +156,11 @@ suite('InteractiveChatController', function () { [IChatWidgetService, new SyncDescriptor(ChatWidgetService)], [IChatSlashCommandService, new SyncDescriptor(ChatSlashCommandService)], [IChatService, new SyncDescriptor(ChatService)], + [IChatAgentNameService, new class extends mock() { + override getAgentNameRestriction(chatAgentData: IChatAgentData): boolean { + return false; + } + }], [IEditorWorkerService, new SyncDescriptor(TestWorkerService)], [IContextKeyService, contextKeyService], [IChatAgentService, new SyncDescriptor(ChatAgentService)], @@ -323,6 +328,7 @@ suite('InteractiveChatController', function () { assert.ok(session); assert.deepStrictEqual(session.wholeRange.value, new Range(3, 1, 3, 3)); // initial + ctrl.chatWidget.setInput('GENGEN'); ctrl.acceptInput(); assert.strictEqual(await ctrl.awaitStates([State.SHOW_REQUEST, State.SHOW_RESPONSE, State.WAIT_FOR_INPUT]), undefined); @@ -540,6 +546,7 @@ suite('InteractiveChatController', function () { // REQUEST 2 const p2 = ctrl.awaitStates([State.SHOW_REQUEST, State.SHOW_RESPONSE, State.WAIT_FOR_INPUT]); + ctrl.chatWidget.setInput('1'); await ctrl.acceptInput(); assert.strictEqual(await p2, undefined); @@ -623,6 +630,7 @@ suite('InteractiveChatController', function () { // REQUEST 2 const p2 = ctrl.awaitStates([State.SHOW_REQUEST, State.SHOW_RESPONSE, State.WAIT_FOR_INPUT]); + ctrl.chatWidget.setInput('1'); await ctrl.acceptInput(); assert.strictEqual(await p2, undefined); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts index 7ed5b3c56832f..47b4a3d4edfce 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts @@ -15,7 +15,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_RESPONSE_TYPES, InlineChatResponseTypes } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_RESPONSE_TYPE, InlineChatResponseType } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { CTX_NOTEBOOK_CELL_CHAT_FOCUSED, CTX_NOTEBOOK_CHAT_HAS_ACTIVE_REQUEST, CTX_NOTEBOOK_CHAT_OUTER_FOCUS_POSITION, CTX_NOTEBOOK_CHAT_USER_DID_EDIT, MENU_CELL_CHAT_INPUT, MENU_CELL_CHAT_WIDGET, MENU_CELL_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext'; import { NotebookChatController } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController'; import { CELL_TITLE_CELL_GROUP_ID, INotebookActionContext, INotebookCellActionContext, NotebookAction, NotebookCellAction, getEditorFromArgsOrActivePane } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; @@ -261,7 +261,7 @@ registerAction2(class extends NotebookAction { id: MENU_CELL_CHAT_WIDGET_STATUS, group: 'inline', order: 0, - when: CTX_INLINE_CHAT_RESPONSE_TYPES.notEqualsTo(InlineChatResponseTypes.OnlyMessages), + when: CTX_INLINE_CHAT_RESPONSE_TYPE.notEqualsTo(InlineChatResponseType.Messages), } ], f1: false diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 8aa50a2b008d1..22fdd384eab2d 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -203,13 +203,17 @@ async function loadTests(opts) { 'throw ListenerLeakError' ]); + const _allowedSuitesWithOutput = new Set([ + 'InteractiveChatController' + ]); + let _testsWithUnexpectedOutput = false; for (const consoleFn of [console.log, console.error, console.info, console.warn, console.trace, console.debug]) { console[consoleFn.name] = function (msg) { if (!currentTest) { consoleFn.apply(console, arguments); - } else if (!_allowedTestOutput.some(a => a.test(msg)) && !_allowedTestsWithOutput.has(currentTest.title)) { + } else if (!_allowedTestOutput.some(a => a.test(msg)) && !_allowedTestsWithOutput.has(currentTest.title) && !_allowedSuitesWithOutput.has(currentTest.parent?.title)) { _testsWithUnexpectedOutput = true; consoleFn.apply(console, arguments); } From 934307f5be0525d3f8ec71b96e69ac6b75b54006 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 17 Jun 2024 12:51:47 +0200 Subject: [PATCH 263/755] fix #214621 (#215942) --- .../contrib/userDataProfile/browser/userDataProfilesEditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 920e71224a140..a34110b5b966e 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -557,7 +557,7 @@ class ProfileWidget extends Disposable { this.copyFromSelectBox.render(append(this.copyFromContainer, $('.profile-select-container'))); this.useAsDefaultProfileContainer = append(body, $('.profile-use-as-default-container')); - const useAsDefaultProfileTitle = localize('enable for new windows', "Use this profile for new windows"); + const useAsDefaultProfileTitle = localize('enable for new windows', "Use this profile as default for new windows"); this.useAsDefaultProfileCheckbox = this._register(new Checkbox(useAsDefaultProfileTitle, false, defaultCheckboxStyles)); append(this.useAsDefaultProfileContainer, this.useAsDefaultProfileCheckbox.domNode); const useAsDefaultProfileLabel = append(this.useAsDefaultProfileContainer, $('.profile-use-as-default-label', undefined, useAsDefaultProfileTitle)); From 24ca2600cecb9501f9d4ca443a5e7bfe2dcf31cf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 17 Jun 2024 14:12:07 +0200 Subject: [PATCH 264/755] more deterministics names for event leakage tracing (#215950) --- src/vs/base/common/event.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index fab6be41690cd..d563a2c77db7c 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -831,13 +831,15 @@ export function setGlobalLeakWarningThreshold(n: number): IDisposable { class LeakageMonitor { + private static _idPool = 1; + private _stacks: Map | undefined; private _warnCountdown: number = 0; constructor( private readonly _errorHandler: (err: Error) => void, readonly threshold: number, - readonly name: string = Math.random().toString(18).slice(2, 5), + readonly name: string = (LeakageMonitor._idPool++).toString(16).padStart(3, '0') ) { } dispose(): void { From 7a711a998683b26f7339fa83004d153ccf60f5a2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 17 Jun 2024 15:40:13 +0200 Subject: [PATCH 265/755] define and use `inlineChatForeground` (defaults to`editorWidgetForeground`) (#215951) --- .../contrib/inlineChat/browser/inlineChatWidget.ts | 6 +++--- src/vs/workbench/contrib/inlineChat/common/inlineChat.ts | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index e951504924d8d..f378f83f709f6 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -30,14 +30,14 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { asCssVariable, asCssVariableName, editorBackground, editorForeground, inputBackground } from 'vs/platform/theme/common/colorRegistry'; +import { asCssVariable, asCssVariableName, editorBackground, inputBackground } from 'vs/platform/theme/common/colorRegistry'; import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import { IAccessibleViewService } from 'vs/platform/accessibility/browser/accessibleView'; import { AccessibilityCommandId } from 'vs/workbench/contrib/accessibility/common/accessibilityCommands'; import { ChatModel, IChatModel } from 'vs/workbench/contrib/chat/common/chatModel'; import { isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { HunkInformation, Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; -import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED, inlineChatBackground, InlineChatConfigKeys } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED, inlineChatBackground, InlineChatConfigKeys, inlineChatForeground } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { chatRequestBackground } from 'vs/workbench/contrib/chat/common/chatColors'; import { Selection } from 'vs/editor/common/core/selection'; @@ -163,7 +163,7 @@ export class InlineChatWidget { ...options.chatWidgetViewOptions }, { - listForeground: editorForeground, + listForeground: inlineChatForeground, listBackground: inlineChatBackground, inputEditorBackground: inputBackground, resultEditorBackground: editorBackground diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index 916415694585c..7cb071748bea2 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -8,7 +8,7 @@ import { MenuId } from 'vs/platform/actions/common/actions'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Registry } from 'vs/platform/registry/common/platform'; -import { diffInserted, diffRemoved, editorWidgetBackground, editorWidgetBorder, focusBorder, inputBackground, inputPlaceholderForeground, registerColor, transparent, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { diffInserted, diffRemoved, editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, focusBorder, inputBackground, inputPlaceholderForeground, registerColor, transparent, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; // settings @@ -123,6 +123,7 @@ export const MENU_INLINE_CHAT_WIDGET_STATUS = MenuId.for('inlineChatWidget.statu // --- colors +export const inlineChatForeground = registerColor('inlineChat.foreground', { dark: editorWidgetForeground, light: editorWidgetForeground, hcDark: editorWidgetForeground, hcLight: editorWidgetForeground }, localize('inlineChat.foreground', "Foreground color of the interactive editor widget")); export const inlineChatBackground = registerColor('inlineChat.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize('inlineChat.background', "Background color of the interactive editor widget")); export const inlineChatBorder = registerColor('inlineChat.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize('inlineChat.border', "Border color of the interactive editor widget")); export const inlineChatShadow = registerColor('inlineChat.shadow', { dark: widgetShadow, light: widgetShadow, hcDark: widgetShadow, hcLight: widgetShadow }, localize('inlineChat.shadow', "Shadow color of the interactive editor widget")); From 1fd1f389d29d57d5a4f4b9807ec6a364a034526c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 17 Jun 2024 16:36:30 +0200 Subject: [PATCH 266/755] disable auto restart setting by default (#215961) --- .../browser/extensions.contribution.ts | 7 ++++++- .../browser/extensionsWorkbenchService.ts | 19 +------------------ 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 0ff4dca2f7189..cdf00b4c2d31d 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -13,7 +13,7 @@ import { EnablementState, IExtensionManagementServerService, IWorkbenchExtension import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg } from 'vs/workbench/contrib/extensions/common/extensions'; +import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg, AutoRestartConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { ReinstallAction, InstallSpecificVersionOfExtensionAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, PromptExtensionInstallFailureAction, SearchExtensionsAction, SetColorThemeAction, SetFileIconThemeAction, SetProductIconThemeAction, ClearLanguageAction, ToggleAutoUpdateForExtensionAction, ToggleAutoUpdatesForPublisherAction, TogglePreReleaseExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor'; @@ -258,6 +258,11 @@ Registry.as(ConfigurationExtensions.Configuration) type: 'boolean', description: localize('extensionsInQuickAccess', "When enabled, extensions can be searched for via Quick Access and report issues from there."), default: true + }, + [AutoRestartConfigurationKey]: { + type: 'boolean', + description: localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus."), + default: false } } }); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index f76a65d5e576a..28da73ba87343 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -18,7 +18,7 @@ import { IExtensionsControlManifest, IExtensionInfo, IExtensionQueryOptions, IDeprecationInfo, isTargetPlatformCompatible, InstallExtensionInfo, EXTENSION_IDENTIFIER_REGEX, InstallOptions, IProductVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, DefaultIconPath, IResourceExtension, extensionsConfigurationNodeBase } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, DefaultIconPath, IResourceExtension } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions, groupByExtension, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -58,8 +58,6 @@ import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator' import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ShowCurrentReleaseNotesActionId } from 'vs/workbench/contrib/update/common/update'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; interface IExtensionStateProvider { (extension: Extension): T; @@ -951,25 +949,10 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension })); urlService.registerHandler(this); - this.registerConfigurations(); this.whenInitialized = this.initialize(); } - private registerConfigurations(): void { - Registry.as(ConfigurationExtensions.Configuration) - .registerConfiguration({ - ...extensionsConfigurationNodeBase, - properties: { - [AutoRestartConfigurationKey]: { - type: 'boolean', - description: nls.localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus."), - default: this.productService.quality !== 'stable', - } - } - }); - } - private async initialize(): Promise { // initialize local extensions await Promise.all([this.queryLocal(), this.extensionService.whenInstalledExtensionsRegistered()]); From b8d1155b9049f81688911740f80524beb72b1b95 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Mon, 17 Jun 2024 16:59:13 +0200 Subject: [PATCH 267/755] Using service collection in the test file (#215962) using service collection in the tests --- .../test/browser/indentation.test.ts | 287 +++++++++++------- .../browser/indentationLineProcessor.test.ts | 46 ++- 2 files changed, 204 insertions(+), 129 deletions(-) diff --git a/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts index 4bf731059949c..f689466ed5114 100644 --- a/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts +++ b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts @@ -23,6 +23,9 @@ import { cppOnEnterRules, htmlOnEnterRules, javascriptOnEnterRules, phpOnEnterRu import { TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; import { cppBracketRules, goBracketRules, htmlBracketRules, latexBracketRules, luaBracketRules, phpBracketRules, rubyBracketRules, typescriptBracketRules, vbBracketRules } from 'vs/editor/test/common/modes/supports/bracketRules'; import { latexAutoClosingPairsRules } from 'vs/editor/test/common/modes/supports/autoClosingPairsRules'; +import { LanguageService } from 'vs/editor/common/services/languageService'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; export enum Language { TypeScript = 'ts-test', @@ -44,16 +47,11 @@ function testIndentationToTabsCommand(lines: string[], selection: Selection, tab testCommand(lines, null, selection, (accessor, sel) => new IndentationToTabsCommand(sel, tabSize), expectedLines, expectedSelection); } -export function registerLanguage(instantiationService: TestInstantiationService, language: Language): IDisposable { - const disposables = new DisposableStore(); - const languageService = instantiationService.get(ILanguageService); - disposables.add(registerLanguageConfiguration(instantiationService, language)); - disposables.add(languageService.registerLanguage({ id: language })); - return disposables; +export function registerLanguage(languageService: ILanguageService, language: Language): IDisposable { + return languageService.registerLanguage({ id: language }); } -export function registerLanguageConfiguration(instantiationService: TestInstantiationService, language: Language): IDisposable { - const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); +export function registerLanguageConfiguration(languageConfigurationService: ILanguageConfigurationService, language: Language): IDisposable { switch (language) { case Language.TypeScript: return languageConfigurationService.register(language, { @@ -317,9 +315,20 @@ suite('Indent With Tab - TypeScript/JavaScript', () => { const languageId = Language.TypeScript; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -343,9 +352,7 @@ suite('Indent With Tab - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(1, 1, 3, 5)); editor.executeCommands('editor.action.indentLines', TypeOperations.indent(viewModel.cursorConfig, editor.getModel(), editor.getSelections())); assert.strictEqual(model.getValue(), [ @@ -369,9 +376,7 @@ suite('Indent With Tab - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(1, 1, 5, 2)); editor.executeCommands('editor.action.indentLines', TypeOperations.indent(viewModel.cursorConfig, editor.getModel(), editor.getSelections())); assert.strictEqual(model.getValue(), [ @@ -389,9 +394,20 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const languageId = Language.TypeScript; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -405,7 +421,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { const pasteText = [ '/**', ' * JSDoc', @@ -439,7 +455,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { { startIndex: 15, standardTokenType: StandardTokenType.Other }, ] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(pasteText, true, undefined, 'keyboard'); @@ -453,7 +468,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { // no need for tokenization because there are no comments const pasteText = [ @@ -470,7 +485,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { '}' ].join('\n'); - disposables.add(registerLanguage(instantiationService, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(pasteText, true, undefined, 'keyboard'); autoIndentOnPasteController.trigger(new Range(1, 1, 11, 2)); @@ -488,8 +502,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(2, 6, 2, 6)); const text = ', null'; viewModel.paste(text, true, undefined, 'keyboard'); @@ -516,8 +529,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(5, 24, 5, 34)); const text = 'IMacLinuxKeyMapping'; viewModel.paste(text, true, undefined, 'keyboard'); @@ -541,8 +553,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const model = createTextModel('', languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { const text = [ '/*----------------', ' * Copyright (c) ', @@ -569,7 +580,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const model = createTextModel(initialText, languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other }, @@ -582,7 +593,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { { startIndex: 0, standardTokenType: StandardTokenType.String }, ] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); editor.setSelection(new Selection(2, 10, 2, 15)); @@ -602,7 +612,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { const text = [ '/**', ' * @typedef {', @@ -634,7 +644,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { { startIndex: 3, standardTokenType: StandardTokenType.Other }, ] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(text, true, undefined, 'keyboard'); @@ -654,7 +663,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(2, 1, 2, 1)); const text = [ '() => {', @@ -662,7 +671,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { '}', '' ].join('\n'); - disposables.add(registerLanguage(instantiationService, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(text, true, undefined, 'keyboard'); autoIndentOnPasteController.trigger(new Range(2, 1, 5, 1)); @@ -696,7 +704,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(2, 5, 2, 5)); const text = [ '() => {', @@ -704,7 +712,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { '}', ' ' ].join('\n'); - disposables.add(registerLanguage(instantiationService, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(text, true, undefined, 'keyboard'); // todo@aiday-mar, make sure range is correct, and make test work as in real life @@ -727,7 +734,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { const model = createTextModel('', languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(2, 5, 2, 5)); const text = [ 'function makeSub(a,b) {', @@ -735,7 +742,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { 'return subsent;', '}', ].join('\n'); - disposables.add(registerLanguage(instantiationService, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(text, true, undefined, 'keyboard'); // todo@aiday-mar, make sure range is correct, and make test work as in real life @@ -760,7 +766,7 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'full' }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: 'full', serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other }, @@ -791,7 +797,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { { startIndex: 0, standardTokenType: StandardTokenType.Other }, { startIndex: 1, standardTokenType: StandardTokenType.Other }] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); editor.setSelection(new Selection(2, 1, 2, 1)); @@ -799,7 +804,6 @@ suite('Auto Indent On Paste - TypeScript/JavaScript', () => { '// comment', 'const foo = 42', ].join('\n'); - disposables.add(registerLanguage(instantiationService, languageId)); const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); viewModel.paste(text, true, undefined, 'keyboard'); autoIndentOnPasteController.trigger(new Range(2, 1, 3, 15)); @@ -817,9 +821,20 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { const languageId = Language.TypeScript; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -837,8 +852,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { viewModel.type('const add1 = (n) =>'); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -859,8 +873,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(3, 9, 3, 9)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -879,10 +892,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); - + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { viewModel.type([ 'const add1 = (n) =>', ' n + 1;', @@ -908,9 +918,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(3, 1, 3, 1)); viewModel.type('\n', 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -939,8 +947,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'advanced' }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: 'advanced', serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(7, 6, 7, 6)); viewModel.type('\n', 'keyboard'); assert.strictEqual(model.getValue(), @@ -970,8 +977,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: 'advanced' }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: 'advanced', serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(1, 4, 1, 4)); viewModel.type('\n', 'keyboard'); assert.strictEqual(model.getValue(), @@ -996,8 +1002,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 12, 2, 12)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1020,9 +1025,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 19, 2, 19)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1055,9 +1058,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [{ startIndex: 0, standardTokenType: StandardTokenType.Comment }], [{ startIndex: 0, standardTokenType: StandardTokenType.Comment }], @@ -1090,8 +1091,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(1, 14, 1, 14)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1114,8 +1114,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 7, 2, 7)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1138,8 +1137,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 7, 2, 7)); viewModel.type("\n", 'keyboard'); viewModel.type("."); @@ -1163,8 +1161,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 24, 2, 24)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1189,8 +1186,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(3, 5, 3, 5)); viewModel.type("."); assert.strictEqual(model.getValue(), [ @@ -1213,8 +1209,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 25, 2, 25)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1233,10 +1228,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { const model = createTextModel('function foo() {}', languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); - + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(1, 17, 1, 17)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1267,9 +1259,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(3, 14, 3, 14)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1295,9 +1285,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(4, 1, 4, 1)); viewModel.type("}", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1319,16 +1307,13 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 5, 2, 5)); viewModel.type("{}", 'keyboard'); assert.strictEqual(model.getValue(), [ 'if (true)', '{}', ].join('\n')); - editor.setSelection(new Selection(2, 2, 2, 2)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1350,8 +1335,7 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "keep" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "keep", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 5, 2, 5)); viewModel.type("}", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1366,9 +1350,20 @@ suite('Auto Indent On Type - Ruby', () => { const languageId = Language.Ruby; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1384,10 +1379,7 @@ suite('Auto Indent On Type - Ruby', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); - + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { viewModel.type("def foo\n i"); viewModel.type("n", 'keyboard'); assert.strictEqual(model.getValue(), "def foo\n in"); @@ -1412,10 +1404,7 @@ suite('Auto Indent On Type - Ruby', () => { const model = createTextModel("", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); - + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { viewModel.type("method('#foo') do"); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1430,9 +1419,20 @@ suite('Auto Indent On Type - PHP', () => { const languageId = Language.PHP; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1448,9 +1448,7 @@ suite('Auto Indent On Type - PHP', () => { const model = createTextModel("preg_replace('{');", languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other }, @@ -1473,9 +1471,20 @@ suite('Auto Indent On Paste - Go', () => { const languageId = Language.Go; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1500,8 +1509,7 @@ suite('Auto Indent On Paste - Go', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(3, 1, 3, 1)); const text = ' '; const autoIndentOnPasteController = editor.registerAndInstantiateContribution(AutoIndentOnPaste.ID, AutoIndentOnPaste); @@ -1521,9 +1529,20 @@ suite('Auto Indent On Type - CPP', () => { const languageId = Language.CPP; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1546,8 +1565,7 @@ suite('Auto Indent On Type - CPP', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 20, 2, 20)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1569,8 +1587,7 @@ suite('Auto Indent On Type - CPP', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(1, 20, 1, 20)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1591,9 +1608,7 @@ suite('Auto Indent On Type - CPP', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "none" }, (editor, viewModel, instantiationService) => { - - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "none", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 3, 2, 3)); viewModel.type("}", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1609,9 +1624,20 @@ suite('Auto Indent On Type - HTML', () => { const languageId = Language.HTML; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1635,8 +1661,7 @@ suite('Auto Indent On Type - HTML', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 48, 2, 48)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1653,9 +1678,20 @@ suite('Auto Indent On Type - Visual Basic', () => { const languageId = Language.VB; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1679,8 +1715,7 @@ suite('Auto Indent On Type - Visual Basic', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { editor.setSelection(new Selection(3, 10, 3, 10)); viewModel.type("f", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1697,9 +1732,20 @@ suite('Auto Indent On Type - Latex', () => { const languageId = Language.Latex; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1722,8 +1768,7 @@ suite('Auto Indent On Type - Latex', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(2, 9, 2, 9)); viewModel.type("{", 'keyboard'); assert.strictEqual(model.getValue(), [ @@ -1738,9 +1783,20 @@ suite('Auto Indent On Type - Lua', () => { const languageId = Language.Lua; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -1762,8 +1818,7 @@ suite('Auto Indent On Type - Lua', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { - disposables.add(registerLanguage(instantiationService, languageId)); + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { editor.setSelection(new Selection(1, 28, 1, 28)); viewModel.type("\n", 'keyboard'); assert.strictEqual(model.getValue(), [ diff --git a/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts b/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts index 0a1b40949d74d..2004b864cbe79 100644 --- a/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts +++ b/src/vs/editor/contrib/indentation/test/browser/indentationLineProcessor.test.ts @@ -8,18 +8,33 @@ import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/uti import { StandardTokenType } from 'vs/editor/common/encodedTokenAttributes'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IndentationContextProcessor, ProcessedIndentRulesSupport } from 'vs/editor/common/languages/supports/indentationLineProcessor'; -import { Language, registerLanguage, registerTokenizationSupport, StandardTokenTypeData } from 'vs/editor/contrib/indentation/test/browser/indentation.test'; +import { Language, registerLanguage, registerLanguageConfiguration, registerTokenizationSupport, StandardTokenTypeData } from 'vs/editor/contrib/indentation/test/browser/indentation.test'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { Range } from 'vs/editor/common/core/range'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { LanguageService } from 'vs/editor/common/services/languageService'; +import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; +import { ILanguageService } from 'vs/editor/common/languages/language'; suite('Indentation Context Processor - TypeScript/JavaScript', () => { const languageId = Language.TypeScript; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -35,13 +50,12 @@ suite('Indentation Context Processor - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [[ { startIndex: 0, standardTokenType: StandardTokenType.Other }, { startIndex: 16, standardTokenType: StandardTokenType.String }, { startIndex: 28, standardTokenType: StandardTokenType.String } ]]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService); @@ -60,7 +74,7 @@ suite('Indentation Context Processor - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other }, @@ -72,7 +86,6 @@ suite('Indentation Context Processor - TypeScript/JavaScript', () => { { startIndex: 46, standardTokenType: StandardTokenType.Other }, { startIndex: 47, standardTokenType: StandardTokenType.String } ]]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService); @@ -91,7 +104,7 @@ suite('Indentation Context Processor - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other }, @@ -104,7 +117,6 @@ suite('Indentation Context Processor - TypeScript/JavaScript', () => { { startIndex: 44, standardTokenType: StandardTokenType.Other }, ] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); const indentationContextProcessor = new IndentationContextProcessor(model, languageConfigurationService); @@ -120,9 +132,20 @@ suite('Processed Indent Rules Support - TypeScript/JavaScript', () => { const languageId = Language.TypeScript; let disposables: DisposableStore; + let serviceCollection: ServiceCollection; setup(() => { disposables = new DisposableStore(); + const languageService = new LanguageService(); + const languageConfigurationService = new TestLanguageConfigurationService(); + disposables.add(languageService); + disposables.add(languageConfigurationService); + disposables.add(registerLanguage(languageService, languageId)); + disposables.add(registerLanguageConfiguration(languageConfigurationService, languageId)); + serviceCollection = new ServiceCollection( + [ILanguageService, languageService], + [ILanguageConfigurationService, languageConfigurationService] + ); }); teardown(() => { @@ -140,7 +163,7 @@ suite('Processed Indent Rules Support - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other } @@ -154,7 +177,6 @@ suite('Processed Indent Rules Support - TypeScript/JavaScript', () => { { startIndex: 17, standardTokenType: StandardTokenType.Comment }, ] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); const indentationRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport; @@ -177,13 +199,12 @@ suite('Processed Indent Rules Support - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [{ startIndex: 0, standardTokenType: StandardTokenType.Other }], [{ startIndex: 0, standardTokenType: StandardTokenType.String }], [{ startIndex: 0, standardTokenType: StandardTokenType.Comment }] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); const indentationRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport; @@ -206,7 +227,7 @@ suite('Processed Indent Rules Support - TypeScript/JavaScript', () => { ].join('\n'), languageId, {}); disposables.add(model); - withTestCodeEditor(model, { autoIndent: "full" }, (editor, viewModel, instantiationService) => { + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel, instantiationService) => { const tokens: StandardTokenTypeData[][] = [ [ { startIndex: 0, standardTokenType: StandardTokenType.Other } @@ -220,7 +241,6 @@ suite('Processed Indent Rules Support - TypeScript/JavaScript', () => { { startIndex: 18, standardTokenType: StandardTokenType.RegEx } ] ]; - disposables.add(registerLanguage(instantiationService, languageId)); disposables.add(registerTokenizationSupport(instantiationService, tokens, languageId)); const languageConfigurationService = instantiationService.get(ILanguageConfigurationService); const indentationRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport; From 825680cf03c8fae03fba14152475c0e5e2d541b5 Mon Sep 17 00:00:00 2001 From: Ole Date: Mon, 17 Jun 2024 17:04:53 +0200 Subject: [PATCH 268/755] Use MutableDisposable and await _updateThread. --- .../browser/view/cellParts/cellComments.ts | 40 +++++++++---------- test/automation/package.json | 4 +- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index 7e4ad29842b4d..cbf886228ef67 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { coalesce } from 'vs/base/common/arrays'; -import { DisposableStore } from 'vs/base/common/lifecycle'; +import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import * as languages from 'vs/editor/common/languages'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -20,7 +20,7 @@ import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; export class CellComments extends CellContentPart { - private _commentThreadWidget: CommentThreadWidget | null = null; + private readonly _commentThreadWidget = new MutableDisposable>; private currentElement: CodeCellViewModel | undefined; private readonly _commentThreadDisposables = this._register(new DisposableStore()); @@ -49,13 +49,12 @@ export class CellComments extends CellContentPart { } this.currentElement = element as CodeCellViewModel; - this._updateThread(); + await this._updateThread(); } private async _createCommentTheadWidget(owner: string, commentThread: languages.CommentThread) { - this._commentThreadWidget?.dispose(); this._commentThreadDisposables.clear(); - this._commentThreadWidget = this.instantiationService.createInstance( + this._commentThreadWidget.value = this.instantiationService.createInstance( CommentThreadWidget, this.container, this.notebookEditor, @@ -79,12 +78,12 @@ export class CellComments extends CellContentPart { const layoutInfo = this.notebookEditor.getLayoutInfo(); - await this._commentThreadWidget.display(layoutInfo.fontInfo.lineHeight, true); + await this._commentThreadWidget.value.display(layoutInfo.fontInfo.lineHeight, true); this._applyTheme(); - this._commentThreadDisposables.add(this._commentThreadWidget.onDidResize(() => { - if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget) { - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); + this._commentThreadDisposables.add(this._commentThreadWidget.value.onDidResize(() => { + if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value.getDimensions().height); } })); } @@ -98,29 +97,28 @@ export class CellComments extends CellContentPart { return; } const info = await this._getCommentThreadForCell(this.currentElement); - if (!this._commentThreadWidget && info) { + if (!this._commentThreadWidget.value && info) { await this._createCommentTheadWidget(info.owner, info.thread); const layoutInfo = (this.currentElement as CodeCellViewModel).layoutInfo; this.container.style.top = `${layoutInfo.outputContainerOffset + layoutInfo.outputTotalHeight}px`; - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget!.getDimensions().height); + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value!.getDimensions().height); return; } - if (this._commentThreadWidget) { + if (this._commentThreadWidget.value) { if (!info) { this._commentThreadDisposables.clear(); this._commentThreadWidget.dispose(); - this._commentThreadWidget = null; this.currentElement.commentHeight = 0; return; } - if (this._commentThreadWidget.commentThread === info.thread) { - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); + if (this._commentThreadWidget.value.commentThread === info.thread) { + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value.getDimensions().height); return; } - await this._commentThreadWidget.updateCommentThread(info.thread); - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); + await this._commentThreadWidget.value.updateCommentThread(info.thread); + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value.getDimensions().height); } } @@ -151,7 +149,7 @@ export class CellComments extends CellContentPart { private _applyTheme() { const theme = this.themeService.getColorTheme(); const fontInfo = this.notebookEditor.getLayoutInfo().fontInfo; - this._commentThreadWidget?.applyTheme(theme, fontInfo); + this._commentThreadWidget.value?.applyTheme(theme, fontInfo); } override didRenderCell(element: ICellViewModel): void { @@ -164,13 +162,13 @@ export class CellComments extends CellContentPart { } override prepareLayout(): void { - if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget) { - this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.getDimensions().height); + if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { + this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value.getDimensions().height); } } override updateInternalLayoutNow(element: ICellViewModel): void { - if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget) { + if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { const layoutInfo = (element as CodeCellViewModel).layoutInfo; this.container.style.top = `${layoutInfo.outputContainerOffset + layoutInfo.outputTotalHeight}px`; } diff --git a/test/automation/package.json b/test/automation/package.json index b9dbbec4bb81a..8172250a9a397 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -1,6 +1,6 @@ { "name": "vscode-automation", - "version": "1.71.0", + "version": "1.91.0", "description": "VS Code UI automation driver", "author": { "name": "Microsoft Corporation" @@ -33,4 +33,4 @@ "npm-run-all": "^4.1.5", "watch": "^1.0.2" } -} +} \ No newline at end of file From 3b2fc596fd2edc4d4d68b8154b28ebc2ad0b9a4d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 17 Jun 2024 17:40:54 +0200 Subject: [PATCH 269/755] do not support auto restart in stable (#215963) --- .../browser/extensions.contribution.ts | 7 +----- .../browser/extensionsWorkbenchService.ts | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index cdf00b4c2d31d..0ff4dca2f7189 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -13,7 +13,7 @@ import { EnablementState, IExtensionManagementServerService, IWorkbenchExtension import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg, AutoRestartConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; +import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg } from 'vs/workbench/contrib/extensions/common/extensions'; import { ReinstallAction, InstallSpecificVersionOfExtensionAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, PromptExtensionInstallFailureAction, SearchExtensionsAction, SetColorThemeAction, SetFileIconThemeAction, SetProductIconThemeAction, ClearLanguageAction, ToggleAutoUpdateForExtensionAction, ToggleAutoUpdatesForPublisherAction, TogglePreReleaseExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor'; @@ -258,11 +258,6 @@ Registry.as(ConfigurationExtensions.Configuration) type: 'boolean', description: localize('extensionsInQuickAccess', "When enabled, extensions can be searched for via Quick Access and report issues from there."), default: true - }, - [AutoRestartConfigurationKey]: { - type: 'boolean', - description: localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus."), - default: false } } }); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 28da73ba87343..a2ef5f0a28fea 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -18,7 +18,7 @@ import { IExtensionsControlManifest, IExtensionInfo, IExtensionQueryOptions, IDeprecationInfo, isTargetPlatformCompatible, InstallExtensionInfo, EXTENSION_IDENTIFIER_REGEX, InstallOptions, IProductVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, DefaultIconPath, IResourceExtension } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService, DefaultIconPath, IResourceExtension, extensionsConfigurationNodeBase } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions, groupByExtension, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -58,6 +58,8 @@ import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator' import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ShowCurrentReleaseNotesActionId } from 'vs/workbench/contrib/update/common/update'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; interface IExtensionStateProvider { (extension: Extension): T; @@ -950,9 +952,27 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension urlService.registerHandler(this); + if (this.productService.quality !== 'stable') { + this.registerAutoRestartConfig(); + } + this.whenInitialized = this.initialize(); } + private registerAutoRestartConfig(): void { + Registry.as(ConfigurationExtensions.Configuration) + .registerConfiguration({ + ...extensionsConfigurationNodeBase, + properties: { + [AutoRestartConfigurationKey]: { + type: 'boolean', + description: nls.localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus."), + default: false, + } + } + }); + } + private async initialize(): Promise { // initialize local extensions await Promise.all([this.queryLocal(), this.extensionService.whenInstalledExtensionsRegistered()]); From fd9c4c8559742eeb23f274fd7990fc80311b6f2d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2024 19:11:41 +0200 Subject: [PATCH 270/755] :up: distro (#215971) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4b96c29b8d77..876f075700e24 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "269c4ac603b4b3c0532b39a04bb0beb9eeb3d49b", + "distro": "170beceb9849568b8f7159757bc3fc3964af1986", "author": { "name": "Microsoft Corporation" }, From 1b6851d6867f7d37ef7461503de17222bbbfc663 Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Mon, 17 Jun 2024 12:17:36 -0500 Subject: [PATCH 271/755] Fix configure tasks in serverless can delete entire tasks file (#215810) Fixes #213824 --- src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 0e9b7879ba0c1..e11e8a81fc38f 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -3241,7 +3241,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer let configFileCreated = false; this._fileService.stat(resource).then((stat) => stat, () => undefined).then(async (stat) => { const fileExists: boolean = !!stat; - const configValue = this._configurationService.inspect('tasks'); + const configValue = this._configurationService.inspect('tasks', { resource }); let tasksExistInFile: boolean; let target: ConfigurationTarget; switch (taskSource) { From be0e53510d8128ee4d17205fcb9511963a5bbb43 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 17 Jun 2024 19:50:51 +0200 Subject: [PATCH 272/755] add notification on auto restart (#215976) --- .../contrib/extensions/browser/extensionsViewlet.ts | 7 ++++--- .../extensions/browser/extensionsWorkbenchService.ts | 9 ++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 7ca65d956cee6..9a81262ecf8f7 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -16,7 +16,7 @@ import { append, $, Dimension, hide, show, DragAndDropObserver, trackFocus } fro import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu } from '../common/extensions'; +import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu, AutoRestartConfigurationKey } from '../common/extensions'; import { InstallLocalExtensionsInRemoteAction, InstallRemoteExtensionsInLocalAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; @@ -846,7 +846,8 @@ export class StatusUpdater extends Disposable implements IWorkbenchContribution constructor( @IActivityService private readonly activityService: IActivityService, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, - @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService + @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService, + @IConfigurationService private readonly configurationService: IConfigurationService ) { super(); this.onServiceChange(); @@ -856,7 +857,7 @@ export class StatusUpdater extends Disposable implements IWorkbenchContribution private onServiceChange(): void { this.badgeHandle.clear(); - const actionRequired = this.extensionsWorkbenchService.installed.filter(e => e.runtimeState !== undefined); + const actionRequired = this.configurationService.getValue(AutoRestartConfigurationKey) === true ? [] : this.extensionsWorkbenchService.installed.filter(e => e.runtimeState !== undefined); const outdated = this.extensionsWorkbenchService.outdated.reduce((r, e) => r + (this.extensionEnablementService.isEnabled(e.local!) && !actionRequired.includes(e) ? 1 : 0), 0); const newBadgeNumber = outdated + actionRequired.length; if (newBadgeNumber > 0) { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index a2ef5f0a28fea..f5a1bf6d01ae6 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -30,7 +30,7 @@ import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/commo import { ExtensionsInput, IExtensionEditorOptions } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ILogService } from 'vs/platform/log/common/log'; import { IProgressOptions, IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { INotificationService, NotificationPriority, Severity } from 'vs/platform/notification/common/notification'; import * as resources from 'vs/base/common/resources'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; @@ -1345,6 +1345,13 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (toAdd.length || toRemove.length) { if (await this.extensionService.stopExtensionHosts(nls.localize('restart', "Enable or Disable extensions"), auto)) { await this.extensionService.startExtensionHosts({ toAdd, toRemove }); + if (auto) { + this.notificationService.notify({ + severity: Severity.Info, + message: nls.localize('extensionsAutoRestart', "Extensions were auto restarted to enable updates."), + priority: NotificationPriority.SILENT + }); + } type ExtensionsAutoRestartClassification = { owner: 'sandy081'; comment: 'Report when extensions are auto restarted'; From 8a6edc51da302ea3d011b90fd530209bab33f0f8 Mon Sep 17 00:00:00 2001 From: eleanorjboyd Date: Mon, 17 Jun 2024 12:20:24 -0700 Subject: [PATCH 273/755] add menu contribution for python manage config --- src/vs/platform/actions/common/actions.ts | 1 + .../testing/browser/testingExplorerView.ts | 24 +++++++++++++++---- .../actions/common/menusExtensionPoint.ts | 5 ++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index fa9bd76ed8a5e..2338ee797c694 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -138,6 +138,7 @@ export class MenuId { static readonly StickyScrollContext = new MenuId('StickyScrollContext'); static readonly TestItem = new MenuId('TestItem'); static readonly TestItemGutter = new MenuId('TestItemGutter'); + static readonly TestPythonConfigMenu = new MenuId('TestPythonConfigMenu'); static readonly TestMessageContext = new MenuId('TestMessageContext'); static readonly TestMessageContent = new MenuId('TestMessageContent'); static readonly TestPeekElement = new MenuId('TestPeekElement'); diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 5c5572d1dc0a0..6d122015ad8ae 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -30,7 +30,7 @@ import 'vs/css!./media/testing'; import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; import { localize } from 'vs/nls'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; -import { MenuEntryActionViewItem, createActionViewItem, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { MenuEntryActionViewItem, createActionViewItem, createAndFillInActionBarActions, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -115,6 +115,7 @@ export class TestingExplorerView extends ViewPane { @IHoverService hoverService: IHoverService, @ITestProfileService private readonly testProfileService: ITestProfileService, @ICommandService private readonly commandService: ICommandService, + @IMenuService private readonly menuService: IMenuService, ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService); @@ -349,9 +350,19 @@ export class TestingExplorerView extends ViewPane { } } - // If there's only one group, don't add a heading for it in the dropdown. - if (participatingGroups === 1) { - profileActions.shift(); + const menuActions: IAction[] = []; + + const key = this.contextKeyService.createOverlay([]); + const menu = this.menuService.createMenu(MenuId.TestPythonConfigMenu, key); + const actions = menu.getActions({ renderShortTitle: true }).flatMap(entry => entry[1]); + if (actions.length > 0) { + // fill if there are any actions + try { + createAndFillInContextMenuActions(menu, undefined, menuActions); + } finally { + menu.dispose(); + } + } const postActions: IAction[] = []; @@ -375,7 +386,10 @@ export class TestingExplorerView extends ViewPane { )); } - return Separator.join(profileActions, postActions); + // show menu actions if there are any otherwise don't + return menuActions.length > 0 + ? Separator.join(profileActions, menuActions, postActions) + : Separator.join(profileActions, postActions); } /** diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index 6791e00042cc0..a8cf20f1132e1 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -343,6 +343,11 @@ const apiMenus: IAPIMenu[] = [ id: MenuId.TestItemGutter, description: localize('testing.item.gutter.title', "The menu for a gutter decoration for a test item"), }, + { + key: 'testing/pythonConfig', + id: MenuId.TestPythonConfigMenu, + description: localize('testing.pythonConfig.title', "The menu for configuring Python tests"), + }, { key: 'testing/item/result', id: MenuId.TestPeekElement, From 406d1d726fc68ab1146a2baf8afd134d5b95075a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 17 Jun 2024 21:25:03 +0200 Subject: [PATCH 274/755] :up: `@parcel/watcher@2.4.0` (#215964) --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 25 ++++++++++---------- yarn.lock | 56 ++++++++++++--------------------------------- 4 files changed, 29 insertions(+), 56 deletions(-) diff --git a/package.json b/package.json index 876f075700e24..b958cf79b1f37 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@parcel/watcher": "2.1.0", + "@parcel/watcher": "github:parcel-bundler/watcher#v2.4.0", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/policy-watcher": "^1.1.4", diff --git a/remote/package.json b/remote/package.json index c9b813f2b65d4..df8fb8149ccc2 100644 --- a/remote/package.json +++ b/remote/package.json @@ -5,7 +5,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@parcel/watcher": "2.1.0", + "@parcel/watcher": "github:parcel-bundler/watcher#v2.4.0", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/proxy-agent": "^0.20.0", diff --git a/remote/yarn.lock b/remote/yarn.lock index f57d42bd60431..ac935e882f454 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -38,15 +38,14 @@ resolved "https://registry.yarnpkg.com/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz#7437db7aa061162ee94e4131b69a62b8dad5dea6" integrity sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ== -"@parcel/watcher@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545" - integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== +"@parcel/watcher@github:parcel-bundler/watcher#v2.4.0": + version "2.4.0" + resolved "https://codeload.github.com/parcel-bundler/watcher/tar.gz/02ebcbe7ab1931e78495f0be93a54f06f6d6e68a" dependencies: + detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" - node-addon-api "^3.2.1" - node-gyp-build "^4.3.0" + node-addon-api "^7.0.0" "@tootallnate/once@^3.0.0": version "3.0.0" @@ -241,6 +240,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-libc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -439,7 +443,7 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@7.1.0, node-addon-api@^7.1.0: +node-addon-api@7.1.0, node-addon-api@^7.0.0, node-addon-api@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== @@ -449,17 +453,12 @@ node-addon-api@^3.0.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== -node-addon-api@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - node-addon-api@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== -node-gyp-build@4.8.1, node-gyp-build@^4.3.0: +node-gyp-build@4.8.1: version "4.8.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== diff --git a/yarn.lock b/yarn.lock index 72431fd74c633..64db4a5fbd06c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -887,15 +887,14 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.3.tgz#13a12ae9e05c2a782f7b5e84c3cbfda4225eaf80" integrity sha512-puWxACExDe9nxbBB3lOymQFrLYml2dVOrd7USiVRnSbgXE+KwBu+HxFvxrzfqsiSda9IWsXJG1ef7C1O2/GmKQ== -"@parcel/watcher@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545" - integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== +"@parcel/watcher@github:parcel-bundler/watcher#v2.4.0": + version "2.4.0" + resolved "https://codeload.github.com/parcel-bundler/watcher/tar.gz/02ebcbe7ab1931e78495f0be93a54f06f6d6e68a" dependencies: + detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" - node-addon-api "^3.2.1" - node-gyp-build "^4.3.0" + node-addon-api "^7.0.0" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -3684,6 +3683,11 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-libc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -7253,7 +7257,7 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@7.1.0, node-addon-api@^7.1.0: +node-addon-api@7.1.0, node-addon-api@^7.0.0, node-addon-api@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== @@ -7263,11 +7267,6 @@ node-addon-api@^3.0.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== -node-addon-api@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - node-addon-api@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" @@ -7297,7 +7296,7 @@ node-fetch@^2.6.0, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-gyp-build@4.8.1, node-gyp-build@^4.3.0: +node-gyp-build@4.8.1: version "4.8.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== @@ -9326,7 +9325,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9370,15 +9369,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9432,7 +9422,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9467,13 +9457,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10629,7 +10612,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10664,15 +10647,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 3ef8921a2018c221208040d228476d4a142c37b6 Mon Sep 17 00:00:00 2001 From: John Murray Date: Mon, 17 Jun 2024 16:48:28 -0400 Subject: [PATCH 275/755] Page correctly on multi-provider timeline (fix #213452) (#213453) --- .../workbench/contrib/timeline/browser/timelinePane.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts index f152f086e9dd1..6ca11ce3e4e09 100644 --- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts +++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts @@ -574,6 +574,15 @@ export class TimelinePane extends ViewPane { } if (options === undefined) { + if ( + !reset && + timeline !== undefined && + timeline.items.length > 0 && + !timeline.more + ) { + // If we are not resetting, have item(s), and already know there are no more to fetch, we're done here + return false; + } options = { cursor: reset ? undefined : timeline?.cursor, limit: this.pageSize }; } From 290eb3df07869411b1883eb6921f7d70f7885742 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Jun 2024 14:07:00 -0700 Subject: [PATCH 276/755] Make sure drop edits are disposed of properly (#216084) --- src/vs/editor/common/languages.ts | 10 ++++++- .../browser/defaultProviders.ts | 14 +++++++--- .../browser/dropIntoEditorController.ts | 27 ++++++++++++------- .../api/browser/mainThreadLanguageFeatures.ts | 23 +++++++++------- .../workbench/api/common/extHost.protocol.ts | 1 + .../api/common/extHostLanguageFeatures.ts | 2 +- 6 files changed, 53 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 018258e559d45..96e743a2dcaf9 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -2214,6 +2214,14 @@ export interface DocumentDropEdit { additionalEdit?: WorkspaceEdit; } +/** + * @internal + */ +export interface DocumentDropEditsSession { + edits: readonly DocumentDropEdit[]; + dispose(): void; +} + /** * @internal */ @@ -2221,7 +2229,7 @@ export interface DocumentDropEditProvider { readonly id?: string; readonly dropMimeTypes?: readonly string[]; - provideDocumentDropEdits(model: model.ITextModel, position: IPosition, dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): ProviderResult; + provideDocumentDropEdits(model: model.ITextModel, position: IPosition, dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): ProviderResult; resolveDocumentDropEdit?(edit: DocumentDropEdit, token: CancellationToken): Promise; } diff --git a/src/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.ts b/src/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.ts index 006713618a6b8..e44d9341c9b8a 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.ts @@ -14,7 +14,7 @@ import { relativePath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { DocumentDropEdit, DocumentDropEditProvider, DocumentPasteContext, DocumentPasteEdit, DocumentPasteEditProvider, DocumentPasteEditsSession, DocumentPasteTriggerKind } from 'vs/editor/common/languages'; +import { DocumentDropEditProvider, DocumentDropEditsSession, DocumentPasteContext, DocumentPasteEdit, DocumentPasteEditProvider, DocumentPasteEditsSession, DocumentPasteTriggerKind } from 'vs/editor/common/languages'; import { ITextModel } from 'vs/editor/common/model'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { localize } from 'vs/nls'; @@ -34,14 +34,20 @@ abstract class SimplePasteAndDropProvider implements DocumentDropEditProvider, D } return { + edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }], dispose() { }, - edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }] }; } - async provideDocumentDropEdits(_model: ITextModel, _position: IPosition, dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): Promise { + async provideDocumentDropEdits(_model: ITextModel, _position: IPosition, dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): Promise { const edit = await this.getEdit(dataTransfer, token); - return edit ? [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }] : undefined; + if (!edit) { + return; + } + return { + edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }], + dispose() { }, + }; } protected abstract getEdit(dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): Promise; diff --git a/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts b/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts index 167baf7bdde8f..082b74478816b 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.ts @@ -7,7 +7,7 @@ import { coalesce } from 'vs/base/common/arrays'; import { CancelablePromise, createCancelablePromise, raceCancellation } from 'vs/base/common/async'; import { VSDataTransfer, matchesMimeType } from 'vs/base/common/dataTransfer'; import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { toExternalVSDataTransfer } from 'vs/editor/browser/dnd'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -84,8 +84,9 @@ export class DropIntoEditorController extends Disposable implements IEditorContr editor.setPosition(position); const p = createCancelablePromise(async (token) => { - const tokenSource = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value, undefined, token); + const disposables = new DisposableStore(); + const tokenSource = disposables.add(new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value, undefined, token)); try { const ourDataTransfer = await this.extractDataTransferData(dragEvent); if (ourDataTransfer.size === 0 || tokenSource.token.isCancellationRequested) { @@ -107,19 +108,19 @@ export class DropIntoEditorController extends Disposable implements IEditorContr return provider.dropMimeTypes.some(mime => ourDataTransfer.matches(mime)); }); - const edits = await this.getDropEdits(providers, model, position, ourDataTransfer, tokenSource); + const editSession = disposables.add(await this.getDropEdits(providers, model, position, ourDataTransfer, tokenSource)); if (tokenSource.token.isCancellationRequested) { return; } - if (edits.length) { - const activeEditIndex = this.getInitialActiveEditIndex(model, edits); + if (editSession.edits.length) { + const activeEditIndex = this.getInitialActiveEditIndex(model, editSession.edits); const canShowWidget = editor.getOption(EditorOption.dropIntoEditor).showDropSelector === 'afterDrop'; // Pass in the parent token here as it tracks cancelling the entire drop operation - await this._postDropWidgetManager.applyEditAndShowIfNeeded([Range.fromPositions(position)], { activeEditIndex, allEdits: edits }, canShowWidget, async edit => edit, token); + await this._postDropWidgetManager.applyEditAndShowIfNeeded([Range.fromPositions(position)], { activeEditIndex, allEdits: editSession.edits }, canShowWidget, async edit => edit, token); } } finally { - tokenSource.dispose(); + disposables.dispose(); if (this._currentOperation === p) { this._currentOperation = undefined; } @@ -131,10 +132,15 @@ export class DropIntoEditorController extends Disposable implements IEditorContr } private async getDropEdits(providers: readonly DocumentDropEditProvider[], model: ITextModel, position: IPosition, dataTransfer: VSDataTransfer, tokenSource: EditorStateCancellationTokenSource) { + const disposables = new DisposableStore(); + const results = await raceCancellation(Promise.all(providers.map(async provider => { try { const edits = await provider.provideDocumentDropEdits(model, position, dataTransfer, tokenSource.token); - return edits?.map(edit => ({ ...edit, providerId: provider.id })); + if (edits) { + disposables.add(edits); + } + return edits?.edits.map(edit => ({ ...edit, providerId: provider.id })); } catch (err) { console.error(err); } @@ -142,7 +148,10 @@ export class DropIntoEditorController extends Disposable implements IEditorContr })), tokenSource.token); const edits = coalesce(results ?? []).flat(); - return sortEditsByYieldTo(edits); + return { + edits: sortEditsByYieldTo(edits), + dispose: () => disposables.dispose() + }; } private getInitialActiveEditIndex(model: ITextModel, edits: ReadonlyArray) { diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 1781e73af7ac9..41ae1ab857c55 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -1124,7 +1124,7 @@ class MainThreadDocumentOnDropEditProvider implements languages.DocumentDropEdit } } - async provideDocumentDropEdits(model: ITextModel, position: IPosition, dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): Promise { + async provideDocumentDropEdits(model: ITextModel, position: IPosition, dataTransfer: IReadonlyVSDataTransfer, token: CancellationToken): Promise { const request = this.dataTransfers.add(dataTransfer); try { const dataTransferDto = await typeConvert.DataTransfer.from(dataTransfer); @@ -1137,14 +1137,19 @@ class MainThreadDocumentOnDropEditProvider implements languages.DocumentDropEdit return; } - return edits.map(edit => { - return { - ...edit, - yieldTo: edit.yieldTo?.map(x => ({ kind: new HierarchicalKind(x) })), - kind: edit.kind ? new HierarchicalKind(edit.kind) : undefined, - additionalEdit: reviveWorkspaceEditDto(edit.additionalEdit, this._uriIdentService, dataId => this.resolveDocumentOnDropFileData(request.id, dataId)), - }; - }); + return { + edits: edits.map(edit => { + return { + ...edit, + yieldTo: edit.yieldTo?.map(x => ({ kind: new HierarchicalKind(x) })), + kind: edit.kind ? new HierarchicalKind(edit.kind) : undefined, + additionalEdit: reviveWorkspaceEditDto(edit.additionalEdit, this._uriIdentService, dataId => this.resolveDocumentOnDropFileData(request.id, dataId)), + }; + }), + dispose: () => { + this._proxy.$releaseDocumentOnDropEdits(this._handle, request.id); + }, + }; } finally { request.dispose(); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index cc5a244204f98..67b467c93d1db 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2192,6 +2192,7 @@ export interface ExtHostLanguageFeaturesShape { $provideTypeHierarchySubtypes(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise; $releaseTypeHierarchy(handle: number, sessionId: string): void; $provideDocumentOnDropEdits(handle: number, requestId: number, resource: UriComponents, position: IPosition, dataTransferDto: DataTransferDTO, token: CancellationToken): Promise; + $releaseDocumentOnDropEdits(handle: number, cacheId: number): void; $provideMappedEdits(handle: number, document: UriComponents, codeBlocks: string[], context: IMappedEditsContextDto, token: CancellationToken): Promise; $provideInlineEdit(handle: number, document: UriComponents, context: languages.IInlineEditContext, token: CancellationToken): Promise; $freeInlineEdit(handle: number, pid: number): void; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index be98bd49d0dce..a4c8f96ca2015 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -2806,7 +2806,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._withAdapter(handle, DocumentDropEditAdapter, adapter => adapter.resolveDropEdit(id, token), {}, undefined); } - $releaseDropEdits(handle: number, cacheId: number): void { + $releaseDocumentOnDropEdits(handle: number, cacheId: number): void { this._withAdapter(handle, DocumentDropEditAdapter, adapter => Promise.resolve(adapter.releaseDropEdits(cacheId)), undefined, undefined); } From 9eba3ad2fc6b0da1dd4a0b888b0aa615e75aa731 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Jun 2024 14:11:22 -0700 Subject: [PATCH 277/755] Use overflow widgets dom node for context menus (#213929) Fixes clipping of custom context menus in embedded editors, such as those in the chat view --- src/vs/editor/contrib/contextmenu/browser/contextmenu.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts index 95609201da390..ddfaabbf49666 100644 --- a/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts @@ -227,7 +227,7 @@ export class ContextMenuController implements IEditorContribution { // Show menu this._contextMenuIsBeingShownCount++; this._contextMenuService.showContextMenu({ - domForShadowRoot: useShadowDOM ? this._editor.getDomNode() : undefined, + domForShadowRoot: useShadowDOM ? this._editor.getOverflowWidgetsDomNode() ?? this._editor.getDomNode() : undefined, getAnchor: () => anchor, From 3a682a623b28f575f97a6640c43cabac7589cb8e Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 17 Jun 2024 14:18:30 -0700 Subject: [PATCH 278/755] fix layout issues (#215969) --- .../chat/browser/terminalChatActions.ts | 2 +- .../chat/browser/terminalChatWidget.ts | 38 ++++++++++++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts index 6843d9869110c..b50f67ac55120 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts @@ -291,7 +291,7 @@ registerActiveXtermAction({ id: MENU_TERMINAL_CHAT_WIDGET_STATUS, group: '0_main', order: 1, - when: ContextKeyExpr.and(TerminalChatContextKeys.responseContainsCodeBlock.negate(), TerminalChatContextKeys.requestActive.negate()), + when: ContextKeyExpr.and(TerminalChatContextKeys.responseContainsCodeBlock, TerminalChatContextKeys.requestActive.negate()), }, { id: MENU_TERMINAL_CHAT_WIDGET, diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index bfeed279ee2c3..edb6b3af10933 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -20,7 +20,8 @@ import { MENU_TERMINAL_CHAT_INPUT, MENU_TERMINAL_CHAT_WIDGET, MENU_TERMINAL_CHAT import { TerminalStickyScrollContribution } from 'vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollContribution'; const enum Constants { - HorizontalMargin = 10 + HorizontalMargin = 10, + VerticalMargin = 30 } export class TerminalChatWidget extends Disposable { @@ -119,15 +120,26 @@ export class TerminalChatWidget extends Disposable { const style = getActiveWindow().getComputedStyle(xtermElement); const xtermPadding = parseInt(style.paddingLeft) + parseInt(style.paddingRight); const width = Math.min(640, xtermElement.clientWidth - 12/* padding */ - 2/* border */ - Constants.HorizontalMargin - xtermPadding); - const height = Math.min(480, heightInPixel, this._getTerminalWrapperHeight() ?? Number.MAX_SAFE_INTEGER); + const terminalWrapperHeight = this._getTerminalWrapperHeight() ?? Number.MAX_SAFE_INTEGER; + let height = Math.min(480, heightInPixel, terminalWrapperHeight); + const top = this._getTop() ?? 0; if (width === 0 || height === 0) { return; } + + let adjustedHeight = undefined; + if (height < this._inlineChatWidget.contentHeight) { + if (height - top > 0) { + height = height - top - Constants.VerticalMargin; + } else { + height = height - Constants.VerticalMargin; + adjustedHeight = height; + } + } this._container.style.paddingLeft = style.paddingLeft; this._dimension = new Dimension(width, height); this._inlineChatWidget.layout(this._dimension); - - this._updateVerticalPosition(); + this._updateVerticalPosition(adjustedHeight); } private _reset() { @@ -144,7 +156,7 @@ export class TerminalChatWidget extends Disposable { this._instance.scrollToBottom(); } - private _updateVerticalPosition(): void { + private _getTop(): number | undefined { const font = this._instance.xterm?.getFont(); if (!font?.charHeight) { return; @@ -153,21 +165,27 @@ export class TerminalChatWidget extends Disposable { const cellHeight = font.charHeight * font.lineHeight; const topPadding = terminalWrapperHeight - (this._instance.rows * cellHeight); const cursorY = (this._instance.xterm?.raw.buffer.active.cursorY ?? 0) + 1; - const top = topPadding + cursorY * cellHeight; + return topPadding + cursorY * cellHeight; + } + + private _updateVerticalPosition(adjustedHeight?: number): void { + const top = this._getTop(); + if (!top) { + return; + } this._container.style.top = `${top}px`; const widgetHeight = this._inlineChatWidget.contentHeight; + const terminalWrapperHeight = this._getTerminalWrapperHeight(); if (!terminalWrapperHeight) { return; } if (top > terminalWrapperHeight - widgetHeight && terminalWrapperHeight - widgetHeight > 0) { this._setTerminalOffset(top - (terminalWrapperHeight - widgetHeight)); + } else if (adjustedHeight) { + this._setTerminalOffset(adjustedHeight); } else { this._setTerminalOffset(undefined); } - if (terminalWrapperHeight - widgetHeight < 0) { - this._dimension = new Dimension(this._dimension!.width, terminalWrapperHeight - top - 20); - this._inlineChatWidget.layout(this._dimension!); - } } private _getTerminalWrapperHeight(): number | undefined { From 61eba45dc45128263ef29d3f4ba31a1e37a3e709 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 17 Jun 2024 15:14:59 -0700 Subject: [PATCH 279/755] Don't register js/ts paste provider if setting is off (#216168) --- extensions/typescript-language-features/package.json | 4 ++-- .../src/languageFeatures/copyPaste.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 4c8a54d8f3956..01981b1db9529 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -1316,14 +1316,14 @@ "scope": "window" }, "javascript.experimental.updateImportsOnPaste": { - "scope": "resource", + "scope": "window", "type": "boolean", "default": false, "description": "%configuration.updateImportsOnPaste%", "tags": ["experimental"] }, "typescript.experimental.updateImportsOnPaste": { - "scope": "resource", + "scope": "window", "type": "boolean", "default": false, "description": "%configuration.updateImportsOnPaste%", diff --git a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts index fc869116dc724..393d1768dca2e 100644 --- a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts +++ b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import { DocumentSelector } from '../configuration/documentSelector'; import * as typeConverters from '../typeConverters'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; -import { conditionalRegistration, requireMinVersion, requireSomeCapability } from './util/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration, requireMinVersion, requireSomeCapability } from './util/dependentRegistration'; import protocol from '../tsServer/protocol/protocol'; import { API } from '../tsServer/api'; import { LanguageDescription } from '../configuration/languageDescription'; @@ -38,6 +38,8 @@ class CopyMetadata { } } +const settingId = 'experimental.updateImportsOnPaste'; + class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { static readonly kind = vscode.DocumentDropOrPasteEditKind.Empty.append('text', 'jsts', 'pasteWithImports'); @@ -61,7 +63,7 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { token: vscode.CancellationToken, ): Promise { const config = vscode.workspace.getConfiguration(this._modeId, document.uri); - if (!config.get('experimental.updateImportsOnPaste', false)) { + if (!config.get(settingId, false)) { return; } @@ -131,6 +133,7 @@ export function register(selector: DocumentSelector, language: LanguageDescripti return conditionalRegistration([ requireSomeCapability(client, ClientCapability.Semantic), requireMinVersion(client, API.v560), + requireGlobalConfiguration(language.id, settingId), ], () => { return vscode.languages.registerDocumentPasteEditProvider(selector.semantic, new DocumentPasteProvider(language.id, client), { providedPasteEditKinds: [DocumentPasteProvider.kind], From 6f28d7fdad70f5a4478dea8e037904499b737688 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 17 Jun 2024 17:10:14 -0700 Subject: [PATCH 280/755] add `hasChatAgent` context key for terminal (#215554) terminal part of #215526 --- .../browser/terminal.chat.contribution.ts | 4 +++ .../chat/browser/terminalChat.ts | 3 ++ .../chat/browser/terminalChatActions.ts | 5 ++- .../chat/browser/terminalChatEnabler.ts | 35 +++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatEnabler.ts diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.chat.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.chat.contribution.ts index a2c974a0baa95..ba1325e8af46a 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.chat.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.chat.contribution.ts @@ -18,6 +18,8 @@ registerTerminalContribution(TerminalChatController.ID, TerminalChatController, AccessibleViewRegistry.register(new TerminalInlineChatAccessibleView()); AccessibleViewRegistry.register(new TerminalChatAccessibilityHelp()); +registerWorkbenchContribution2(TerminalChatEnabler.Id, TerminalChatEnabler, WorkbenchPhase.AfterRestored); + // #endregion // #region Actions @@ -25,5 +27,7 @@ AccessibleViewRegistry.register(new TerminalChatAccessibilityHelp()); import 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions'; import { AccessibleViewRegistry } from 'vs/platform/accessibility/browser/accessibleViewRegistry'; import { TerminalChatAccessibilityHelp } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChatAccessibilityHelp'; +import { registerWorkbenchContribution2, WorkbenchPhase } from 'vs/workbench/common/contributions'; +import { TerminalChatEnabler } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChatEnabler'; // #endregion diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts index 094c3731bf60d..13d70f863522e 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts @@ -62,4 +62,7 @@ export namespace TerminalChatContextKeys { /** The chat response contains multiple code blocks */ export const responseContainsMultipleCodeBlocks = new RawContextKey(TerminalChatContextKeyStrings.ChatResponseContainsMultipleCodeBlocks, false, localize('chatResponseContainsMultipleCodeBlocksContextKey', "Whether the chat response contains multiple code blocks.")); + + /** A chat agent exists for the terminal location */ + export const hasChatAgent = new RawContextKey(TerminalChatContextKeyStrings.ChatAgentRegistered, false, localize('chatAgentRegisteredContextKey', "Whether a chat agent is registered for the terminal location.")); } diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts index b50f67ac55120..d53b7cd4968db 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts @@ -9,7 +9,7 @@ import { localize2 } from 'vs/nls'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { AbstractInlineChatAction } from 'vs/workbench/contrib/inlineChat/browser/inlineChatActions'; -import { CTX_INLINE_CHAT_EMPTY, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_AGENT } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_INLINE_CHAT_EMPTY, CTX_INLINE_CHAT_FOCUSED } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { isDetachedTerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { registerActiveXtermAction } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; @@ -29,8 +29,7 @@ registerActiveXtermAction({ category: AbstractInlineChatAction.category, precondition: ContextKeyExpr.and( ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), - // TODO: This needs to change to check for a terminal location capable agent - CTX_INLINE_CHAT_HAS_AGENT + TerminalChatContextKeys.hasChatAgent ), run: (_xterm, _accessor, activeInstance, opts?: unknown) => { if (isDetachedTerminalInstance(activeInstance)) { diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatEnabler.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatEnabler.ts new file mode 100644 index 0000000000000..fdcdf5c006f39 --- /dev/null +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatEnabler.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IChatAgentService, ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { TerminalChatContextKeys } from 'vs/workbench/contrib/terminal/browser/terminalContribExports'; + + +export class TerminalChatEnabler { + + static Id = 'terminalChat.enabler'; + + private readonly _ctxHasProvider: IContextKey; + + private readonly _store = new DisposableStore(); + + constructor( + @IContextKeyService contextKeyService: IContextKeyService, + @IChatAgentService chatAgentService: IChatAgentService + ) { + this._ctxHasProvider = TerminalChatContextKeys.hasChatAgent.bindTo(contextKeyService); + this._store.add(chatAgentService.onDidChangeAgents(() => { + const hasTerminalAgent = Boolean(chatAgentService.getDefaultAgent(ChatAgentLocation.Terminal)); + this._ctxHasProvider.set(hasTerminalAgent); + })); + } + + dispose() { + this._ctxHasProvider.reset(); + this._store.dispose(); + } +} From 545058462e534c3a7972c876b5de33c315be9ef6 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 17 Jun 2024 17:49:09 -0700 Subject: [PATCH 281/755] Start refactoring ChatListRenderer (#216140) * Start breaking ChatListRenderer content types into their own classes * Make renderTextEdit a Part as well * Add ChatMarkdownContentPart * Layout codeblock refs --- src/vs/workbench/contrib/chat/browser/chat.ts | 1 + .../chatContentParts/chatCollections.ts | 43 ++ .../chatCommandContentPart.ts | 40 ++ .../chatConfirmationContentPart.ts | 52 ++ .../chatConfirmationWidget.ts | 0 .../chatMarkdownContentPart.ts | 172 +++++ .../chatProgressContentPart.ts | 38 ++ .../chatTextEditContentPart.ts | 192 ++++++ .../chatContentParts/chatTreeContentPart.ts | 214 ++++++ .../chatWarningContentPart.ts | 47 ++ .../media/chatConfirmationWidget.css | 0 .../contrib/chat/browser/chatListRenderer.ts | 639 ++---------------- 12 files changed, 863 insertions(+), 575 deletions(-) create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatCollections.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts rename src/vs/workbench/contrib/chat/browser/{ => chatContentParts}/chatConfirmationWidget.ts (100%) create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts rename src/vs/workbench/contrib/chat/browser/{ => chatContentParts}/media/chatConfirmationWidget.css (100%) diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index 3b2729c983d14..b6b9a43127a17 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -80,6 +80,7 @@ export interface IChatAccessibilityService { export interface IChatCodeBlockInfo { codeBlockIndex: number; element: IChatResponseViewModel; + uri: URI | undefined; focus(): void; } diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCollections.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCollections.ts new file mode 100644 index 0000000000000..d13bbdff23b40 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCollections.ts @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; + +export class ResourcePool extends Disposable { + private readonly pool: T[] = []; + + private _inUse = new Set; + public get inUse(): ReadonlySet { + return this._inUse; + } + + constructor( + private readonly _itemFactory: () => T, + ) { + super(); + } + + get(): T { + if (this.pool.length > 0) { + const item = this.pool.pop()!; + this._inUse.add(item); + return item; + } + + const item = this._register(this._itemFactory()); + this._inUse.add(item); + return item; + } + + release(item: T): void { + this._inUse.delete(item); + this.pool.push(item); + } +} + +export interface IDisposableReference extends IDisposable { + object: T; + isStale: () => boolean; +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts new file mode 100644 index 0000000000000..56ce42a6d6a9f --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { Button } from 'vs/base/browser/ui/button/button'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { localize } from 'vs/nls'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatCommandButton } from 'vs/workbench/contrib/chat/common/chatService'; +import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; + +const $ = dom.$; + +export class ChatCommandButtonContentPart extends Disposable { + public readonly element: HTMLElement; + + constructor( + commandButton: IChatCommandButton, + element: ChatTreeItem, + @ICommandService private readonly commandService: ICommandService + ) { + super(); + + this.element = $('.chat-command-button'); + const enabled = !isResponseVM(element) || !element.isStale; + const tooltip = enabled ? + commandButton.command.tooltip : + localize('commandButtonDisabled', "Button not available in restored chat"); + const button = this._register(new Button(this.element, { ...defaultButtonStyles, supportIcons: true, title: tooltip })); + button.label = commandButton.command.title; + button.enabled = enabled; + + // TODO still need telemetry for command buttons + this._register(button.onDidClick(() => this.commandService.executeCommand(commandButton.command.id, ...(commandButton.command.arguments ?? [])))); + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts new file mode 100644 index 0000000000000..0478adf077c5b --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts @@ -0,0 +1,52 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { localize } from 'vs/nls'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { ChatConfirmationWidget } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget'; +import { IChatConfirmation, IChatSendRequestOptions, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; +import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; + +export class ChatConfirmationContentPart extends Disposable { + public readonly element: HTMLElement; + + private readonly _onDidChangeHeight = this._register(new Emitter()); + public readonly onDidChangeHeight = this._onDidChangeHeight.event; + + constructor( + confirmation: IChatConfirmation, + element: ChatTreeItem, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IChatService private readonly chatService: IChatService, + ) { + super(); + + const confirmationWidget = this._register(this.instantiationService.createInstance(ChatConfirmationWidget, confirmation.title, confirmation.message, [ + { label: localize('accept', "Accept"), data: confirmation.data }, + { label: localize('dismiss', "Dismiss"), data: confirmation.data, isSecondary: true }, + ])); + confirmationWidget.setShowButtons(!confirmation.isUsed); + + this._register(confirmationWidget.onDidClick(async e => { + if (isResponseVM(element)) { + const prompt = `${e.label}: "${confirmation.title}"`; + const data: IChatSendRequestOptions = e.isSecondary ? + { rejectedConfirmationData: [e.data] } : + { acceptedConfirmationData: [e.data] }; + data.agentId = element.agent?.id; + if (await this.chatService.sendRequest(element.sessionId, prompt, data)) { + confirmation.isUsed = true; + confirmationWidget.setShowButtons(false); + this._onDidChangeHeight.fire(); + } + } + })); + + this.element = confirmationWidget.domNode; + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatConfirmationWidget.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget.ts similarity index 100% rename from src/vs/workbench/contrib/chat/browser/chatConfirmationWidget.ts rename to src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget.ts diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts new file mode 100644 index 0000000000000..a0e21ffc005b3 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts @@ -0,0 +1,172 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { Emitter } from 'vs/base/common/event'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { equalsIgnoreCase } from 'vs/base/common/strings'; +import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { Range } from 'vs/editor/common/core/range'; +import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ChatTreeItem, IChatCodeBlockInfo, IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; +import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatRendererDelegate } from 'vs/workbench/contrib/chat/browser/chatListRenderer'; +import { ChatMarkdownDecorationsRenderer } from 'vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer'; +import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions'; +import { CodeBlockPart, ICodeBlockData, localFileLanguageId, parseLocalFileData } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; +import { IMarkdownVulnerability } from 'vs/workbench/contrib/chat/common/annotations'; +import { isRequestVM, isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; +import { CodeBlockModelCollection } from 'vs/workbench/contrib/chat/common/codeBlockModelCollection'; + +const $ = dom.$; + +export class ChatMarkdownContentPart extends Disposable { + public readonly element: HTMLElement; + private readonly allRefs: IDisposableReference[] = []; + + private readonly _onDidChangeHeight = this._register(new Emitter()); + public readonly onDidChangeHeight = this._onDidChangeHeight.event; + + // TODO@roblourens this is weird, why are IChatCodeBlockInfo only for responses? + public readonly codeblocks: IChatCodeBlockInfo[] = []; + public readonly codeBlockCount: number; + + constructor( + markdown: IMarkdownString, + element: ChatTreeItem, + private readonly editorPool: EditorPool, + fillInIncompleteTokens = false, + codeBlockStartIndex = 0, + renderer: MarkdownRenderer, + currentWidth: number, + private readonly codeBlockModelCollection: CodeBlockModelCollection, + rendererOptions: IChatListItemRendererOptions, + @IContextKeyService contextKeyService: IContextKeyService, + @ITextModelService private readonly textModelService: ITextModelService, + @IInstantiationService instantiationService: IInstantiationService, + ) { + super(); + + const markdownDecorationsRenderer = instantiationService.createInstance(ChatMarkdownDecorationsRenderer); + + // We release editors in order so that it's more likely that the same editor will be assigned if this element is re-rendered right away, like it often is during progressive rendering + const orderedDisposablesList: IDisposable[] = []; + const codeblocks: IChatCodeBlockInfo[] = []; + let codeBlockIndex = codeBlockStartIndex; + const result = this._register(renderer.render(markdown, { + fillInIncompleteTokens, + codeBlockRendererSync: (languageId, text) => { + const index = codeBlockIndex++; + let textModel: Promise; + let range: Range | undefined; + let vulns: readonly IMarkdownVulnerability[] | undefined; + if (equalsIgnoreCase(languageId, localFileLanguageId)) { + try { + const parsedBody = parseLocalFileData(text); + range = parsedBody.range && Range.lift(parsedBody.range); + textModel = this.textModelService.createModelReference(parsedBody.uri).then(ref => ref.object); + } catch (e) { + return $('div'); + } + } else { + if (!isRequestVM(element) && !isResponseVM(element)) { + console.error('Trying to render code block in welcome', element.id, index); + return $('div'); + } + + const sessionId = isResponseVM(element) || isRequestVM(element) ? element.sessionId : ''; + const modelEntry = this.codeBlockModelCollection.getOrCreate(sessionId, element, index); + vulns = modelEntry.vulns; + textModel = modelEntry.model; + } + + const hideToolbar = isResponseVM(element) && element.errorDetails?.responseIsFiltered; + const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: contextKeyService, vulns }, text, currentWidth, rendererOptions.editableCodeBlock); + this.allRefs.push(ref); + + // Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping) + // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) + this._register(ref.object.onDidChangeContentHeight(() => this._onDidChangeHeight.fire())); + + if (isResponseVM(element)) { + const info: IChatCodeBlockInfo = { + codeBlockIndex: index, + element, + focus() { + ref.object.focus(); + }, + uri: ref.object.uri + }; + codeblocks.push(info); + + } + orderedDisposablesList.push(ref); + return ref.object.element; + }, + asyncRenderCallback: () => this._onDidChangeHeight.fire(), + })); + + this._register(markdownDecorationsRenderer.walkTreeAndAnnotateReferenceLinks(result.element)); + + orderedDisposablesList.reverse().forEach(d => this._register(d)); + this.element = result.element; + this.codeBlockCount = codeBlockIndex - codeBlockStartIndex; + } + + private renderCodeBlock(data: ICodeBlockData, text: string, currentWidth: number, editableCodeBlock: boolean | undefined): IDisposableReference { + const ref = this.editorPool.get(); + const editorInfo = ref.object; + if (isResponseVM(data.element)) { + this.codeBlockModelCollection.update(data.element.sessionId, data.element, data.codeBlockIndex, { text, languageId: data.languageId }); + } + + editorInfo.render(data, currentWidth, editableCodeBlock); + + return ref; + } + + layout(width: number): void { + this.allRefs.forEach(ref => ref.object.layout(width)); + } +} + +export class EditorPool extends Disposable { + + private readonly _pool: ResourcePool; + + public inUse(): Iterable { + return this._pool.inUse; + } + + constructor( + options: ChatEditorOptions, + delegate: IChatRendererDelegate, + overflowWidgetsDomNode: HTMLElement | undefined, + @IInstantiationService instantiationService: IInstantiationService, + ) { + super(); + this._pool = this._register(new ResourcePool(() => { + return instantiationService.createInstance(CodeBlockPart, options, MenuId.ChatCodeBlock, delegate, overflowWidgetsDomNode); + })); + } + + get(): IDisposableReference { + const codeBlock = this._pool.get(); + let stale = false; + return { + object: codeBlock, + isStale: () => stale, + dispose: () => { + codeBlock.reset(); + stale = true; + this._pool.release(codeBlock); + } + }; + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts new file mode 100644 index 0000000000000..eb672ed36f0d0 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { alert } from 'vs/base/browser/ui/aria/aria'; +import { Codicon } from 'vs/base/common/codicons'; +import { MarkdownString } from 'vs/base/common/htmlContent'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ThemeIcon } from 'vs/base/common/themables'; +import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { IChatProgressMessage, IChatTask } from 'vs/workbench/contrib/chat/common/chatService'; + +export class ChatProgressContentPart extends Disposable { + public readonly element: HTMLElement; + + constructor( + progress: IChatProgressMessage | IChatTask, + showSpinner: boolean, + renderer: MarkdownRenderer, + ) { + super(); + + if (showSpinner) { + // TODO@roblourens is this the right place for this? + // this step is in progress, communicate it to SR users + alert(progress.content.value); + } + const codicon = showSpinner ? ThemeIcon.modify(Codicon.loading, 'spin').id : Codicon.check.id; + const markdown = new MarkdownString(`$(${codicon}) ${progress.content.value}`, { + supportThemeIcons: true + }); + const result = this._register(renderer.render(markdown)); + result.element.classList.add('progress-step'); + + this.element = result.element; + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts new file mode 100644 index 0000000000000..f0d1edb0bd3c7 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts @@ -0,0 +1,192 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; +import { isEqual } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { generateUuid } from 'vs/base/common/uuid'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; +import { TextEdit } from 'vs/editor/common/languages'; +import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; +import { IModelService } from 'vs/editor/common/services/model'; +import { DefaultModelSHA1Computer } from 'vs/editor/common/services/modelService'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { localize } from 'vs/nls'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ChatTreeItem, IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; +import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatRendererDelegate } from 'vs/workbench/contrib/chat/browser/chatListRenderer'; +import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions'; +import { CodeCompareBlockPart, ICodeCompareBlockData, ICodeCompareBlockDiffData } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; +import { IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; +import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; +import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; + +const $ = dom.$; + +export class ChatTextEditContentPart extends Disposable { + public readonly element: HTMLElement; + private readonly ref: IDisposableReference | undefined; + + private readonly _onDidChangeHeight = this._register(new Emitter()); + public readonly onDidChangeHeight = this._onDidChangeHeight.event; + + constructor( + chatTextEdit: IChatTextEditGroup, + element: ChatTreeItem, + rendererOptions: IChatListItemRendererOptions, + diffEditorPool: DiffEditorPool, + currentWidth: number, + @ITextModelService private readonly textModelService: ITextModelService, + @IModelService private readonly modelService: IModelService, + @IChatService private readonly chatService: IChatService, + ) { + super(); + + // TODO@jrieken move this into the CompareCodeBlock and properly say what kind of changes happen + if (rendererOptions.renderTextEditsAsSummary?.(chatTextEdit.uri)) { + if (isResponseVM(element) && element.response.value.every(item => item.kind === 'textEditGroup')) { + this.element = $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")); + } + + // TODO@roblourens this case is now handled outside this Part in ChatListRenderer, but can it be cleaned up? + // return; + } + + const cts = new CancellationTokenSource(); + + let isDisposed = false; + this._register(toDisposable(() => { + isDisposed = true; + cts.dispose(true); + })); + + this.ref = this._register(diffEditorPool.get()); + + // Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping) + // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) + this._register(this.ref.object.onDidChangeContentHeight(() => { + this._onDidChangeHeight.fire(); + })); + + const data: ICodeCompareBlockData = { + element, + edit: chatTextEdit, + diffData: (async () => { + + const ref = await this.textModelService.createModelReference(chatTextEdit.uri); + + if (isDisposed) { + ref.dispose(); + return; + } + + this._register(ref); + + const original = ref.object.textEditorModel; + let originalSha1: string = ''; + + if (chatTextEdit.state) { + originalSha1 = chatTextEdit.state.sha1; + } else { + const sha1 = new DefaultModelSHA1Computer(); + if (sha1.canComputeSHA1(original)) { + originalSha1 = sha1.computeSHA1(original); + chatTextEdit.state = { sha1: originalSha1, applied: 0 }; + } + } + + const modified = this.modelService.createModel( + createTextBufferFactoryFromSnapshot(original.createSnapshot()), + { languageId: original.getLanguageId(), onDidChange: Event.None }, + URI.from({ scheme: Schemas.vscodeChatCodeBlock, path: original.uri.path, query: generateUuid() }), + false + ); + const modRef = await this.textModelService.createModelReference(modified.uri); + this._register(modRef); + + const editGroups: ISingleEditOperation[][] = []; + if (isResponseVM(element)) { + const chatModel = this.chatService.getSession(element.sessionId)!; + + for (const request of chatModel.getRequests()) { + if (!request.response) { + continue; + } + for (const item of request.response.response.value) { + if (item.kind !== 'textEditGroup' || item.state?.applied || !isEqual(item.uri, chatTextEdit.uri)) { + continue; + } + for (const group of item.edits) { + const edits = group.map(TextEdit.asEditOperation); + editGroups.push(edits); + } + } + if (request.response === element.model) { + break; + } + } + } + + for (const edits of editGroups) { + modified.pushEditOperations(null, edits, () => null); + } + + return { + modified, + original, + originalSha1 + } satisfies ICodeCompareBlockDiffData; + })() + }; + this.ref.object.render(data, currentWidth, cts.token); + + this.element = this.ref.object.element; + } + + layout(width: number): void { + this.ref?.object.layout(width); + } +} + +export class DiffEditorPool extends Disposable { + + private readonly _pool: ResourcePool; + + public inUse(): Iterable { + return this._pool.inUse; + } + + constructor( + options: ChatEditorOptions, + delegate: IChatRendererDelegate, + overflowWidgetsDomNode: HTMLElement | undefined, + @IInstantiationService instantiationService: IInstantiationService, + ) { + super(); + this._pool = this._register(new ResourcePool(() => { + return instantiationService.createInstance(CodeCompareBlockPart, options, MenuId.ChatCompareBlock, delegate, overflowWidgetsDomNode); + })); + } + + get(): IDisposableReference { + const codeBlock = this._pool.get(); + let stale = false; + return { + object: codeBlock, + isStale: () => stale, + dispose: () => { + codeBlock.reset(); + stale = true; + this._pool.release(codeBlock); + } + }; + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts new file mode 100644 index 0000000000000..6bdae0b311a05 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts @@ -0,0 +1,214 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { ITreeCompressionDelegate } from 'vs/base/browser/ui/tree/asyncDataTree'; +import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; +import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; +import { IAsyncDataSource, ITreeNode } from 'vs/base/browser/ui/tree/tree'; +import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { localize } from 'vs/nls'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { FileKind, FileType } from 'vs/platform/files/common/files'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatResponseProgressFileTreeData } from 'vs/workbench/contrib/chat/common/chatService'; +import { createFileIconThemableTreeContainerScope } from 'vs/workbench/contrib/files/browser/views/explorerView'; +import { IFilesConfiguration } from 'vs/workbench/contrib/files/common/files'; + +const $ = dom.$; + +export class ChatTreeContentPart extends Disposable { + public readonly element: HTMLElement; + + private readonly _onDidChangeHeight = this._register(new Emitter()); + public readonly onDidChangeHeight = this._onDidChangeHeight.event; + + public readonly onDidFocus: Event; + + private tree: WorkbenchCompressibleAsyncDataTree; + + constructor( + data: IChatResponseProgressFileTreeData, + element: ChatTreeItem, + treePool: TreePool, + treeDataIndex: number, + @IOpenerService private readonly openerService: IOpenerService + ) { + super(); + + const ref = this._register(treePool.get()); + this.tree = ref.object; + this.onDidFocus = this.tree.onDidFocus; + + this._register(this.tree.onDidOpen((e) => { + if (e.element && !('children' in e.element)) { + this.openerService.open(e.element.uri); + } + })); + this._register(this.tree.onDidChangeCollapseState(() => { + this._onDidChangeHeight.fire(); + })); + this._register(this.tree.onContextMenu((e) => { + e.browserEvent.preventDefault(); + e.browserEvent.stopPropagation(); + })); + + this.tree.setInput(data).then(() => { + if (!ref.isStale()) { + this.tree.layout(); + this._onDidChangeHeight.fire(); + } + }); + + this.element = this.tree.getHTMLElement().parentElement!; + } + + domFocus() { + this.tree.domFocus(); + } +} + +export class TreePool extends Disposable { + private _pool: ResourcePool>; + + public get inUse(): ReadonlySet> { + return this._pool.inUse; + } + + constructor( + private _onDidChangeVisibility: Event, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IConfigurationService private readonly configService: IConfigurationService, + @IThemeService private readonly themeService: IThemeService, + ) { + super(); + this._pool = this._register(new ResourcePool(() => this.treeFactory())); + } + + private treeFactory(): WorkbenchCompressibleAsyncDataTree { + const resourceLabels = this._register(this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this._onDidChangeVisibility })); + + const container = $('.interactive-response-progress-tree'); + this._register(createFileIconThemableTreeContainerScope(container, this.themeService)); + + const tree = this.instantiationService.createInstance( + WorkbenchCompressibleAsyncDataTree, + 'ChatListRenderer', + container, + new ChatListTreeDelegate(), + new ChatListTreeCompressionDelegate(), + [new ChatListTreeRenderer(resourceLabels, this.configService.getValue('explorer.decorations'))], + new ChatListTreeDataSource(), + { + collapseByDefault: () => false, + expandOnlyOnTwistieClick: () => false, + identityProvider: { + getId: (e: IChatResponseProgressFileTreeData) => e.uri.toString() + }, + accessibilityProvider: { + getAriaLabel: (element: IChatResponseProgressFileTreeData) => element.label, + getWidgetAriaLabel: () => localize('treeAriaLabel', "File Tree") + }, + alwaysConsumeMouseWheel: false + }); + + return tree; + } + + get(): IDisposableReference> { + const object = this._pool.get(); + let stale = false; + return { + object, + isStale: () => stale, + dispose: () => { + stale = true; + this._pool.release(object); + } + }; + } +} + +class ChatListTreeDelegate implements IListVirtualDelegate { + static readonly ITEM_HEIGHT = 22; + + getHeight(element: IChatResponseProgressFileTreeData): number { + return ChatListTreeDelegate.ITEM_HEIGHT; + } + + getTemplateId(element: IChatResponseProgressFileTreeData): string { + return 'chatListTreeTemplate'; + } +} + +class ChatListTreeCompressionDelegate implements ITreeCompressionDelegate { + isIncompressible(element: IChatResponseProgressFileTreeData): boolean { + return !element.children; + } +} + +interface IChatListTreeRendererTemplate { + templateDisposables: DisposableStore; + label: IResourceLabel; +} + +class ChatListTreeRenderer implements ICompressibleTreeRenderer { + templateId: string = 'chatListTreeTemplate'; + + constructor(private labels: ResourceLabels, private decorations: IFilesConfiguration['explorer']['decorations']) { } + + renderCompressedElements(element: ITreeNode, void>, index: number, templateData: IChatListTreeRendererTemplate, height: number | undefined): void { + templateData.label.element.style.display = 'flex'; + const label = element.element.elements.map((e) => e.label); + templateData.label.setResource({ resource: element.element.elements[0].uri, name: label }, { + title: element.element.elements[0].label, + fileKind: element.children ? FileKind.FOLDER : FileKind.FILE, + extraClasses: ['explorer-item'], + fileDecorations: this.decorations + }); + } + renderTemplate(container: HTMLElement): IChatListTreeRendererTemplate { + const templateDisposables = new DisposableStore(); + const label = templateDisposables.add(this.labels.create(container, { supportHighlights: true })); + return { templateDisposables, label }; + } + renderElement(element: ITreeNode, index: number, templateData: IChatListTreeRendererTemplate, height: number | undefined): void { + templateData.label.element.style.display = 'flex'; + if (!element.children.length && element.element.type !== FileType.Directory) { + templateData.label.setFile(element.element.uri, { + fileKind: FileKind.FILE, + hidePath: true, + fileDecorations: this.decorations, + }); + } else { + templateData.label.setResource({ resource: element.element.uri, name: element.element.label }, { + title: element.element.label, + fileKind: FileKind.FOLDER, + fileDecorations: this.decorations + }); + } + } + disposeTemplate(templateData: IChatListTreeRendererTemplate): void { + templateData.templateDisposables.dispose(); + } +} + +class ChatListTreeDataSource implements IAsyncDataSource { + hasChildren(element: IChatResponseProgressFileTreeData): boolean { + return !!element.children; + } + + async getChildren(element: IChatResponseProgressFileTreeData): Promise> { + return element.children ?? []; + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts new file mode 100644 index 0000000000000..0c297b64ab5a2 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; +import { Codicon } from 'vs/base/common/codicons'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; + +const $ = dom.$; + +export class ChatWarningContentPart extends Disposable { + public readonly element: HTMLElement; + + constructor( + kind: 'info' | 'warning' | 'error', + content: IMarkdownString, + renderer: MarkdownRenderer, + ) { + super(); + + this.element = $('.chat-notification-widget'); + let icon; + let iconClass; + switch (kind) { + case 'warning': + icon = Codicon.warning; + iconClass = '.chat-warning-codicon'; + break; + case 'error': + icon = Codicon.error; + iconClass = '.chat-error-codicon'; + break; + case 'info': + icon = Codicon.info; + iconClass = '.chat-info-codicon'; + break; + } + this.element.appendChild($(iconClass, undefined, renderIcon(icon))); + const markdownContent = renderer.render(content); + this.element.appendChild(markdownContent.element); + + } +} diff --git a/src/vs/workbench/contrib/chat/browser/media/chatConfirmationWidget.css b/src/vs/workbench/contrib/chat/browser/chatContentParts/media/chatConfirmationWidget.css similarity index 100% rename from src/vs/workbench/contrib/chat/browser/media/chatConfirmationWidget.css rename to src/vs/workbench/contrib/chat/browser/chatContentParts/media/chatConfirmationWidget.css diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 34babb987ea47..8bdd8bd69172c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -7,18 +7,12 @@ import * as dom from 'vs/base/browser/dom'; import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; -import { alert } from 'vs/base/browser/ui/aria/aria'; import { Button } from 'vs/base/browser/ui/button/button'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { ITreeCompressionDelegate } from 'vs/base/browser/ui/tree/asyncDataTree'; -import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; -import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; -import { IAsyncDataSource, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; +import { ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { IAction } from 'vs/base/common/actions'; import { distinct } from 'vs/base/common/arrays'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; import { Emitter, Event } from 'vs/base/common/event'; import { FuzzyScore } from 'vs/base/common/filters'; @@ -30,18 +24,10 @@ import { FileAccess, Schemas, matchesSomeScheme } from 'vs/base/common/network'; import { clamp } from 'vs/base/common/numbers'; import { autorun } from 'vs/base/common/observable'; import { basename } from 'vs/base/common/path'; -import { basenameOrAuthority, isEqual } from 'vs/base/common/resources'; -import { equalsIgnoreCase } from 'vs/base/common/strings'; +import { basenameOrAuthority } from 'vs/base/common/resources'; import { ThemeIcon } from 'vs/base/common/themables'; import { URI } from 'vs/base/common/uri'; -import { generateUuid } from 'vs/base/common/uuid'; import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; -import { Range } from 'vs/editor/common/core/range'; -import { TextEdit } from 'vs/editor/common/languages'; -import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; -import { IModelService } from 'vs/editor/common/services/model'; -import { DefaultModelSHA1Computer } from 'vs/editor/common/services/modelService'; -import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; import { localize } from 'vs/nls'; import { IMenuEntryActionViewItemOptions, MenuEntryActionViewItem, createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; @@ -49,39 +35,43 @@ import { MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { FileKind, FileType } from 'vs/platform/files/common/files'; +import { FileKind } from 'vs/platform/files/common/files'; import { IHoverService } from 'vs/platform/hover/browser/hover'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { WorkbenchCompressibleAsyncDataTree, WorkbenchList } from 'vs/platform/list/browser/listService'; +import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { ILogService } from 'vs/platform/log/common/log'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { ChatTreeItem, GeneratingPhrase, IChatCodeBlockInfo, IChatFileTreeInfo } from 'vs/workbench/contrib/chat/browser/chat'; import { ChatAgentHover, getChatAgentHoverOptions } from 'vs/workbench/contrib/chat/browser/chatAgentHover'; -import { ChatConfirmationWidget } from 'vs/workbench/contrib/chat/browser/chatConfirmationWidget'; +import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { ChatCommandButtonContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart'; +import { ChatConfirmationContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart'; +import { ChatMarkdownContentPart, EditorPool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart'; +import { ChatProgressContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart'; +import { ChatTextEditContentPart, DiffEditorPool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart'; +import { ChatTreeContentPart, TreePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart'; +import { ChatWarningContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart'; import { ChatFollowups } from 'vs/workbench/contrib/chat/browser/chatFollowups'; import { ChatMarkdownDecorationsRenderer } from 'vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer'; +import { ChatMarkdownRenderer } from 'vs/workbench/contrib/chat/browser/chatMarkdownRenderer'; import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions'; -import { ChatCodeBlockContentProvider, CodeBlockPart, CodeCompareBlockPart, ICodeBlockData, ICodeCompareBlockData, ICodeCompareBlockDiffData, localFileLanguageId, parseLocalFileData } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; +import { ChatCodeBlockContentProvider } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; import { ChatAgentLocation, IChatAgentMetadata } from 'vs/workbench/contrib/chat/common/chatAgents'; import { CONTEXT_CHAT_RESPONSE_SUPPORT_ISSUE_REPORTING, CONTEXT_REQUEST, CONTEXT_RESPONSE, CONTEXT_RESPONSE_DETECTED_AGENT_COMMAND, CONTEXT_RESPONSE_FILTERED, CONTEXT_RESPONSE_VOTE } from 'vs/workbench/contrib/chat/common/chatContextKeys'; import { IChatProgressRenderableResponseContent, IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; import { chatSubcommandLeader } from 'vs/workbench/contrib/chat/common/chatParserTypes'; -import { ChatAgentVoteDirection, IChatCommandButton, IChatConfirmation, IChatContentReference, IChatFollowup, IChatProgressMessage, IChatResponseProgressFileTreeData, IChatSendRequestOptions, IChatService, IChatTask, IChatWarningMessage } from 'vs/workbench/contrib/chat/common/chatService'; +import { ChatAgentVoteDirection, IChatCommandButton, IChatConfirmation, IChatContentReference, IChatFollowup, IChatProgressMessage, IChatResponseProgressFileTreeData, IChatTask, IChatWarningMessage } from 'vs/workbench/contrib/chat/common/chatService'; import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import { IChatProgressMessageRenderData, IChatRenderData, IChatResponseMarkdownRenderData, IChatResponseViewModel, IChatTaskRenderData, IChatWelcomeMessageViewModel, isRequestVM, isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { IWordCountResult, getNWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; import { createFileIconThemableTreeContainerScope } from 'vs/workbench/contrib/files/browser/views/explorerView'; -import { IFilesConfiguration } from 'vs/workbench/contrib/files/common/files'; -import { IMarkdownVulnerability, annotateSpecialMarkdownContent } from '../common/annotations'; +import { annotateSpecialMarkdownContent } from '../common/annotations'; import { CodeBlockModelCollection } from '../common/codeBlockModelCollection'; import { IChatListItemRendererOptions } from './chat'; -import { ChatMarkdownRenderer } from 'vs/workbench/contrib/chat/browser/chatMarkdownRenderer'; -import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; const $ = dom.$; @@ -95,6 +85,7 @@ interface IChatListItemTemplate { readonly value: HTMLElement; readonly referencesListContainer: HTMLElement; readonly contextKeyService: IContextKeyService; + readonly instantiationService: IInstantiationService; readonly templateDisposables: IDisposable; readonly elementDisposables: DisposableStore; readonly agentHover: ChatAgentHover; @@ -163,10 +154,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer void } { - const treeDisposables = new DisposableStore(); - const ref = treeDisposables.add(this._treePool.get()); - const tree = ref.object; + const store = new DisposableStore(); + const treePart = store.add(this.instantiationService.createInstance(ChatTreeContentPart, data, element, this._treePool, treeDataIndex)); - treeDisposables.add(tree.onDidOpen((e) => { - if (e.element && !('children' in e.element)) { - this.openerService.open(e.element.uri); - } - })); - treeDisposables.add(tree.onDidChangeCollapseState(() => { + store.add(treePart.onDidChangeHeight(() => { this.updateItemHeight(templateData); })); - treeDisposables.add(tree.onContextMenu((e) => { - e.browserEvent.preventDefault(); - e.browserEvent.stopPropagation(); - })); - - tree.setInput(data).then(() => { - if (!ref.isStale()) { - tree.layout(); - this.updateItemHeight(templateData); - } - }); if (isResponseVM(element)) { const fileTreeFocusInfo = { treeDataId: data.uri.toString(), treeIndex: treeDataIndex, focus() { - tree.domFocus(); + treePart.domFocus(); } }; - treeDisposables.add(tree.onDidFocus(() => { + // TODO@roblourens there's got to be a better way to navigate trees + store.add(treePart.onDidFocus(() => { this.focusedFileTreesByResponseId.set(element.id, fileTreeFocusInfo.treeIndex); })); const fileTrees = this.fileTreesByResponseId.get(element.id) ?? []; fileTrees.push(fileTreeFocusInfo); this.fileTreesByResponseId.set(element.id, distinct(fileTrees, (v) => v.treeDataId)); - treeDisposables.add(toDisposable(() => this.fileTreesByResponseId.set(element.id, fileTrees.filter(v => v.treeDataId !== data.uri.toString())))); + store.add(toDisposable(() => this.fileTreesByResponseId.set(element.id, fileTrees.filter(v => v.treeDataId !== data.uri.toString())))); } return { - element: tree.getHTMLElement().parentElement!, - dispose: () => { - treeDisposables.dispose(); - } + element: treePart.element, + dispose: () => store.dispose() }; } @@ -950,303 +920,65 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer this.commandService.executeCommand(commandButton.command.id, ...(commandButton.command.arguments ?? [])))); - return { - dispose() { - disposables.dispose(); - }, - element: container - }; - } - - private renderNotification(kind: 'info' | 'warning' | 'error', content: IMarkdownString): IMarkdownRenderResult { - const container = $('.chat-notification-widget'); - let icon; - let iconClass; - switch (kind) { - case 'warning': - icon = Codicon.warning; - iconClass = '.chat-warning-codicon'; - break; - case 'error': - icon = Codicon.error; - iconClass = '.chat-error-codicon'; - break; - case 'info': - icon = Codicon.info; - iconClass = '.chat-info-codicon'; - break; - } - container.appendChild($(iconClass, undefined, renderIcon(icon))); - const markdownContent = this.renderer.render(content); - container.appendChild(markdownContent.element); - return { - element: container, - dispose() { markdownContent.dispose(); } - }; + return this.instantiationService.createInstance(ChatProgressContentPart, progress, showSpinner, this.renderer); } private renderConfirmation(element: ChatTreeItem, confirmation: IChatConfirmation, templateData: IChatListItemTemplate): IMarkdownRenderResult | undefined { const store = new DisposableStore(); - const confirmationWidget = store.add(this.instantiationService.createInstance(ChatConfirmationWidget, confirmation.title, confirmation.message, [ - { label: localize('accept', "Accept"), data: confirmation.data }, - { label: localize('dismiss', "Dismiss"), data: confirmation.data, isSecondary: true }, - ])); - confirmationWidget.setShowButtons(!confirmation.isUsed); - - store.add(confirmationWidget.onDidClick(async e => { - if (isResponseVM(element)) { - const prompt = `${e.label}: "${confirmation.title}"`; - const data: IChatSendRequestOptions = e.isSecondary ? - { rejectedConfirmationData: [e.data] } : - { acceptedConfirmationData: [e.data] }; - data.agentId = element.agent?.id; - if (await this.chatService.sendRequest(element.sessionId, prompt, data)) { - confirmation.isUsed = true; - confirmationWidget.setShowButtons(false); - this.updateItemHeight(templateData); - } - } - })); - + const part = store.add(this.instantiationService.createInstance(ChatConfirmationContentPart, confirmation, element)); + store.add(part.onDidChangeHeight(() => this.updateItemHeight(templateData))); return { - element: confirmationWidget.domNode, + element: part.element, dispose() { store.dispose(); } }; } private renderTextEdit(element: ChatTreeItem, chatTextEdit: IChatTextEditGroup, templateData: IChatListItemTemplate): IMarkdownRenderResult | undefined { - - // TODO@jrieken move this into the CompareCodeBlock and properly say what kind of changes happen - if (this.rendererOptions.renderTextEditsAsSummary?.(chatTextEdit.uri)) { - if (isResponseVM(element) && element.response.value.every(item => item.kind === 'textEditGroup')) { - return { - element: $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")), - dispose() { } - }; - } - return undefined; + if (this.rendererOptions.renderTextEditsAsSummary?.(chatTextEdit.uri) && !(isResponseVM(element) && element.response.value.every(item => item.kind === 'textEditGroup'))) { + return; } const store = new DisposableStore(); - const cts = new CancellationTokenSource(); - - let isDisposed = false; - store.add(toDisposable(() => { - isDisposed = true; - cts.dispose(true); - })); - - const ref = this._diffEditorPool.get(); - - // Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping) - // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) - store.add(ref.object.onDidChangeContentHeight(() => { - ref.object.layout(this._currentLayoutWidth); + const textEditPart = store.add(this.instantiationService.createInstance(ChatTextEditContentPart, chatTextEdit, element, this.rendererOptions, this._diffEditorPool, this._currentLayoutWidth)); + store.add(textEditPart.onDidChangeHeight(() => { + textEditPart.layout(this._currentLayoutWidth); this.updateItemHeight(templateData); })); - const data: ICodeCompareBlockData = { - element, - edit: chatTextEdit, - diffData: (async () => { - - const ref = await this.textModelService.createModelReference(chatTextEdit.uri); - - if (isDisposed) { - ref.dispose(); - return; - } - - store.add(ref); - - const original = ref.object.textEditorModel; - let originalSha1: string = ''; - - if (chatTextEdit.state) { - originalSha1 = chatTextEdit.state.sha1; - } else { - const sha1 = new DefaultModelSHA1Computer(); - if (sha1.canComputeSHA1(original)) { - originalSha1 = sha1.computeSHA1(original); - chatTextEdit.state = { sha1: originalSha1, applied: 0 }; - } - } - - const modified = this.modelService.createModel( - createTextBufferFactoryFromSnapshot(original.createSnapshot()), - { languageId: original.getLanguageId(), onDidChange: Event.None }, - URI.from({ scheme: Schemas.vscodeChatCodeBlock, path: original.uri.path, query: generateUuid() }), - false - ); - const modRef = await this.textModelService.createModelReference(modified.uri); - store.add(modRef); - - const editGroups: ISingleEditOperation[][] = []; - if (isResponseVM(element)) { - const chatModel = this.chatService.getSession(element.sessionId)!; - - for (const request of chatModel.getRequests()) { - if (!request.response) { - continue; - } - for (const item of request.response.response.value) { - if (item.kind !== 'textEditGroup' || item.state?.applied || !isEqual(item.uri, chatTextEdit.uri)) { - continue; - } - for (const group of item.edits) { - const edits = group.map(TextEdit.asEditOperation); - editGroups.push(edits); - } - } - if (request.response === element.model) { - break; - } - } - } - - for (const edits of editGroups) { - modified.pushEditOperations(null, edits, () => null); - } - - return { - modified, - original, - originalSha1 - } satisfies ICodeCompareBlockDiffData; - })() - }; - ref.object.render(data, this._currentLayoutWidth, cts.token); - return { - element: ref.object.element, - dispose() { - store.dispose(); - ref.dispose(); - }, + element: textEditPart.element, + dispose() { store.dispose(); } }; } private renderMarkdown(markdown: IMarkdownString, element: ChatTreeItem, templateData: IChatListItemTemplate, fillInIncompleteTokens = false, codeBlockStartIndex = 0): IChatMarkdownRenderResult { - const disposables = new DisposableStore(); - - // We release editors in order so that it's more likely that the same editor will be assigned if this element is re-rendered right away, like it often is during progressive rendering - const orderedDisposablesList: IDisposable[] = []; - const codeblocks: IChatCodeBlockInfo[] = []; - let codeBlockIndex = codeBlockStartIndex; - const result = this.renderer.render(markdown, { - fillInIncompleteTokens, - codeBlockRendererSync: (languageId, text) => { - const index = codeBlockIndex++; - let textModel: Promise; - let range: Range | undefined; - let vulns: readonly IMarkdownVulnerability[] | undefined; - if (equalsIgnoreCase(languageId, localFileLanguageId)) { - try { - const parsedBody = parseLocalFileData(text); - range = parsedBody.range && Range.lift(parsedBody.range); - textModel = this.textModelService.createModelReference(parsedBody.uri).then(ref => ref.object); - } catch (e) { - return $('div'); - } - } else { - if (!isRequestVM(element) && !isResponseVM(element)) { - console.error('Trying to render code block in welcome', element.id, index); - return $('div'); - } - - const sessionId = isResponseVM(element) || isRequestVM(element) ? element.sessionId : ''; - const modelEntry = this.codeBlockModelCollection.getOrCreate(sessionId, element, index); - vulns = modelEntry.vulns; - textModel = modelEntry.model; - } - - const hideToolbar = isResponseVM(element) && element.errorDetails?.responseIsFiltered; - const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns }, text); - - // Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping) - // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) - disposables.add(ref.object.onDidChangeContentHeight(() => { - ref.object.layout(this._currentLayoutWidth); - this.updateItemHeight(templateData); - })); - - if (isResponseVM(element)) { - const info: IChatCodeBlockInfo = { - codeBlockIndex: index, - element, - focus() { - ref.object.focus(); - } - }; - codeblocks.push(info); - if (ref.object.uri) { - const uri = ref.object.uri; - this.codeBlocksByEditorUri.set(uri, info); - disposables.add(toDisposable(() => this.codeBlocksByEditorUri.delete(uri))); - } - } - orderedDisposablesList.push(ref); - return ref.object.element; - }, - asyncRenderCallback: () => this.updateItemHeight(templateData), + const store = new DisposableStore(); + // TODO@roblourens too many parameters + const markdownPart = store.add(this.instantiationService.createInstance(ChatMarkdownContentPart, markdown, element, this._editorPool, fillInIncompleteTokens, codeBlockStartIndex, this.renderer, this._currentLayoutWidth, this.codeBlockModelCollection, this.rendererOptions)); + store.add(markdownPart.onDidChangeHeight(() => { + markdownPart.layout(this._currentLayoutWidth); + this.updateItemHeight(templateData); + })); + this.codeBlocksByResponseId.set(element.id, markdownPart.codeblocks); + store.add(toDisposable(() => this.codeBlocksByResponseId.delete(element.id))); + + markdownPart.codeblocks.forEach(info => { + if (info.uri) { + const uri = info.uri; + this.codeBlocksByEditorUri.set(uri, info); + this._register(toDisposable(() => this.codeBlocksByEditorUri.delete(uri))); + } }); - if (isResponseVM(element)) { - this.codeBlocksByResponseId.set(element.id, codeblocks); - disposables.add(toDisposable(() => this.codeBlocksByResponseId.delete(element.id))); - } - - disposables.add(this.markdownDecorationsRenderer.walkTreeAndAnnotateReferenceLinks(result.element)); - - orderedDisposablesList.reverse().forEach(d => disposables.add(d)); return { - codeBlockCount: codeBlockIndex - codeBlockStartIndex, - element: result.element, + codeBlockCount: markdownPart.codeBlockCount, + element: markdownPart.element, dispose() { - result.dispose(); - disposables.dispose(); + store.dispose(); } }; } - private renderCodeBlock(data: ICodeBlockData, text: string): IDisposableReference { - const ref = this._editorPool.get(); - const editorInfo = ref.object; - if (isResponseVM(data.element)) { - this.codeBlockModelCollection.update(data.element.sessionId, data.element, data.codeBlockIndex, { text, languageId: data.languageId }); - } - - editorInfo.render(data, this._currentLayoutWidth, this.rendererOptions.editableCodeBlock); - - return ref; - } - private getDataForProgressiveRender(element: IChatResponseViewModel, data: IMarkdownString, renderData: Pick): IWordCountResult & { rate: number } | undefined { const rate = this.getProgressiveRenderRate(element); const numWordsToRender = renderData.lastRenderTime === 0 ? @@ -1304,143 +1036,6 @@ export class ChatListDelegate implements IListVirtualDelegate { } } - -interface IDisposableReference extends IDisposable { - object: T; - isStale: () => boolean; -} - -class EditorPool extends Disposable { - - private readonly _pool: ResourcePool; - - public inUse(): Iterable { - return this._pool.inUse; - } - - constructor( - options: ChatEditorOptions, - delegate: IChatRendererDelegate, - overflowWidgetsDomNode: HTMLElement | undefined, - @IInstantiationService instantiationService: IInstantiationService, - ) { - super(); - this._pool = this._register(new ResourcePool(() => { - return instantiationService.createInstance(CodeBlockPart, options, MenuId.ChatCodeBlock, delegate, overflowWidgetsDomNode); - })); - } - - get(): IDisposableReference { - const codeBlock = this._pool.get(); - let stale = false; - return { - object: codeBlock, - isStale: () => stale, - dispose: () => { - codeBlock.reset(); - stale = true; - this._pool.release(codeBlock); - } - }; - } -} - -class DiffEditorPool extends Disposable { - - private readonly _pool: ResourcePool; - - public inUse(): Iterable { - return this._pool.inUse; - } - - constructor( - options: ChatEditorOptions, - delegate: IChatRendererDelegate, - overflowWidgetsDomNode: HTMLElement | undefined, - @IInstantiationService instantiationService: IInstantiationService, - ) { - super(); - this._pool = this._register(new ResourcePool(() => { - return instantiationService.createInstance(CodeCompareBlockPart, options, MenuId.ChatCompareBlock, delegate, overflowWidgetsDomNode); - })); - } - - get(): IDisposableReference { - const codeBlock = this._pool.get(); - let stale = false; - return { - object: codeBlock, - isStale: () => stale, - dispose: () => { - codeBlock.reset(); - stale = true; - this._pool.release(codeBlock); - } - }; - } -} - -class TreePool extends Disposable { - private _pool: ResourcePool>; - - public get inUse(): ReadonlySet> { - return this._pool.inUse; - } - - constructor( - private _onDidChangeVisibility: Event, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IConfigurationService private readonly configService: IConfigurationService, - @IThemeService private readonly themeService: IThemeService, - ) { - super(); - this._pool = this._register(new ResourcePool(() => this.treeFactory())); - } - - private treeFactory(): WorkbenchCompressibleAsyncDataTree { - const resourceLabels = this._register(this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this._onDidChangeVisibility })); - - const container = $('.interactive-response-progress-tree'); - this._register(createFileIconThemableTreeContainerScope(container, this.themeService)); - - const tree = this.instantiationService.createInstance( - WorkbenchCompressibleAsyncDataTree, - 'ChatListRenderer', - container, - new ChatListTreeDelegate(), - new ChatListTreeCompressionDelegate(), - [new ChatListTreeRenderer(resourceLabels, this.configService.getValue('explorer.decorations'))], - new ChatListTreeDataSource(), - { - collapseByDefault: () => false, - expandOnlyOnTwistieClick: () => false, - identityProvider: { - getId: (e: IChatResponseProgressFileTreeData) => e.uri.toString() - }, - accessibilityProvider: { - getAriaLabel: (element: IChatResponseProgressFileTreeData) => element.label, - getWidgetAriaLabel: () => localize('treeAriaLabel', "File Tree") - }, - alwaysConsumeMouseWheel: false - }); - - return tree; - } - - get(): IDisposableReference> { - const object = this._pool.get(); - let stale = false; - return { - object, - isStale: () => stale, - dispose: () => { - stale = true; - this._pool.release(object); - } - }; - } -} - class ContentReferencesListPool extends Disposable { private _pool: ResourcePool>; @@ -1610,38 +1205,6 @@ class ContentReferencesListRenderer implements IListRenderer extends Disposable { - private readonly pool: T[] = []; - - private _inUse = new Set; - public get inUse(): ReadonlySet { - return this._inUse; - } - - constructor( - private readonly _itemFactory: () => T, - ) { - super(); - } - - get(): T { - if (this.pool.length > 0) { - const item = this.pool.pop()!; - this._inUse.add(item); - return item; - } - - const item = this._register(this._itemFactory()); - this._inUse.add(item); - return item; - } - - release(item: T): void { - this._inUse.delete(item); - this.pool.push(item); - } -} - class ChatVoteButton extends MenuEntryActionViewItem { override render(container: HTMLElement): void { super.render(container); @@ -1649,80 +1212,6 @@ class ChatVoteButton extends MenuEntryActionViewItem { } } -class ChatListTreeDelegate implements IListVirtualDelegate { - static readonly ITEM_HEIGHT = 22; - - getHeight(element: IChatResponseProgressFileTreeData): number { - return ChatListTreeDelegate.ITEM_HEIGHT; - } - - getTemplateId(element: IChatResponseProgressFileTreeData): string { - return 'chatListTreeTemplate'; - } -} - -class ChatListTreeCompressionDelegate implements ITreeCompressionDelegate { - isIncompressible(element: IChatResponseProgressFileTreeData): boolean { - return !element.children; - } -} - -interface IChatListTreeRendererTemplate { - templateDisposables: DisposableStore; - label: IResourceLabel; -} - -class ChatListTreeRenderer implements ICompressibleTreeRenderer { - templateId: string = 'chatListTreeTemplate'; - - constructor(private labels: ResourceLabels, private decorations: IFilesConfiguration['explorer']['decorations']) { } - - renderCompressedElements(element: ITreeNode, void>, index: number, templateData: IChatListTreeRendererTemplate, height: number | undefined): void { - templateData.label.element.style.display = 'flex'; - const label = element.element.elements.map((e) => e.label); - templateData.label.setResource({ resource: element.element.elements[0].uri, name: label }, { - title: element.element.elements[0].label, - fileKind: element.children ? FileKind.FOLDER : FileKind.FILE, - extraClasses: ['explorer-item'], - fileDecorations: this.decorations - }); - } - renderTemplate(container: HTMLElement): IChatListTreeRendererTemplate { - const templateDisposables = new DisposableStore(); - const label = templateDisposables.add(this.labels.create(container, { supportHighlights: true })); - return { templateDisposables, label }; - } - renderElement(element: ITreeNode, index: number, templateData: IChatListTreeRendererTemplate, height: number | undefined): void { - templateData.label.element.style.display = 'flex'; - if (!element.children.length && element.element.type !== FileType.Directory) { - templateData.label.setFile(element.element.uri, { - fileKind: FileKind.FILE, - hidePath: true, - fileDecorations: this.decorations, - }); - } else { - templateData.label.setResource({ resource: element.element.uri, name: element.element.label }, { - title: element.element.label, - fileKind: FileKind.FOLDER, - fileDecorations: this.decorations - }); - } - } - disposeTemplate(templateData: IChatListTreeRendererTemplate): void { - templateData.templateDisposables.dispose(); - } -} - -class ChatListTreeDataSource implements IAsyncDataSource { - hasChildren(element: IChatResponseProgressFileTreeData): boolean { - return !!element.children; - } - - async getChildren(element: IChatResponseProgressFileTreeData): Promise> { - return element.children ?? []; - } -} - function isInteractiveProgressTreeData(item: Object): item is IChatResponseProgressFileTreeData { return 'label' in item; } From 83b92b5e974ed5b67559d6176848f2b11b5f24de Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 17 Jun 2024 17:50:19 -0700 Subject: [PATCH 282/755] Revert "Don't clear chat disposables too early while progressive rendering (#215907)" (#216267) This reverts commit 85e9b0786cc505d85f326991227de364a5bd7293. --- src/vs/workbench/contrib/chat/browser/chatListRenderer.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 8bdd8bd69172c..ee0b9225af60c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -697,6 +697,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { From 68b971efb2b543062e6c87196d51bb632b427ca2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 18 Jun 2024 06:28:54 +0200 Subject: [PATCH 283/755] fix #212904 (#215973) --- .../node/sharedProcess/sharedProcessMain.ts | 4 +- .../common/userDataProfileStorageService.ts | 65 +++++++++++++------ .../userDataProfileStorageService.ts | 2 +- .../node/userDataProfileStorageService.ts | 4 +- .../userDataProfileStorageService.test.ts | 3 +- .../test/common/userDataSyncClient.ts | 2 +- .../browser/userDataProfileStorageService.ts | 2 +- 7 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/vs/code/node/sharedProcess/sharedProcessMain.ts b/src/vs/code/node/sharedProcess/sharedProcessMain.ts index f8e915491fc46..69c81ac249896 100644 --- a/src/vs/code/node/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/node/sharedProcess/sharedProcessMain.ts @@ -71,7 +71,7 @@ import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyn import { UserDataSyncServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncServiceIpc'; import { UserDataSyncStoreManagementService, UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { IUserDataProfileStorageService } from 'vs/platform/userDataProfile/common/userDataProfileStorageService'; -import { NativeUserDataProfileStorageService } from 'vs/platform/userDataProfile/node/userDataProfileStorageService'; +import { SharedProcessUserDataProfileStorageService } from 'vs/platform/userDataProfile/node/userDataProfileStorageService'; import { ActiveWindowManager } from 'vs/platform/windows/node/windowTracker'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/node/signService'; @@ -355,7 +355,7 @@ class SharedProcessMain extends Disposable implements IClientConnectionFilter { services.set(IUserDataSyncLocalStoreService, new SyncDescriptor(UserDataSyncLocalStoreService, undefined, false /* Eagerly cleans up old backups */)); services.set(IUserDataSyncEnablementService, new SyncDescriptor(UserDataSyncEnablementService, undefined, true)); services.set(IUserDataSyncService, new SyncDescriptor(UserDataSyncService, undefined, false /* Initializes the Sync State */)); - services.set(IUserDataProfileStorageService, new SyncDescriptor(NativeUserDataProfileStorageService, undefined, true)); + services.set(IUserDataProfileStorageService, new SyncDescriptor(SharedProcessUserDataProfileStorageService, undefined, true)); services.set(IUserDataSyncResourceProviderService, new SyncDescriptor(UserDataSyncResourceProviderService, undefined, true)); // Signing diff --git a/src/vs/platform/userDataProfile/common/userDataProfileStorageService.ts b/src/vs/platform/userDataProfile/common/userDataProfileStorageService.ts index a04c44f96ef50..a9a7b3771c7a5 100644 --- a/src/vs/platform/userDataProfile/common/userDataProfileStorageService.ts +++ b/src/vs/platform/userDataProfile/common/userDataProfileStorageService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, MutableDisposable, isDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableMap, MutableDisposable, isDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IStorage, IStorageDatabase, Storage } from 'vs/base/parts/storage/common/storage'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { AbstractStorageService, IStorageService, IStorageValueChangeEvent, StorageScope, StorageTarget, isProfileUsingDefaultStorage } from 'vs/platform/storage/common/storage'; @@ -63,10 +63,16 @@ export abstract class AbstractUserDataProfileStorageService extends Disposable i readonly abstract onDidChange: Event; + private readonly storageServicesMap: DisposableMap | undefined; + constructor( + persistStorages: boolean, @IStorageService protected readonly storageService: IStorageService ) { super(); + if (persistStorages) { + this.storageServicesMap = this._register(new DisposableMap()); + } } async readStorageData(profile: IUserDataProfile): Promise> { @@ -82,16 +88,30 @@ export abstract class AbstractUserDataProfileStorageService extends Disposable i return fn(this.storageService); } - const storageDatabase = await this.createStorageDatabase(profile); - const storageService = new StorageService(storageDatabase); + let storageService = this.storageServicesMap?.get(profile.id); + if (!storageService) { + storageService = new StorageService(this.createStorageDatabase(profile)); + this.storageServicesMap?.set(profile.id, storageService); + + try { + await storageService.initialize(); + } catch (error) { + if (this.storageServicesMap?.has(profile.id)) { + this.storageServicesMap.deleteAndDispose(profile.id); + } else { + storageService.dispose(); + } + throw error; + } + } try { - await storageService.initialize(); const result = await fn(storageService); await storageService.flush(); return result; } finally { - storageService.dispose(); - await this.closeAndDispose(storageDatabase); + if (!this.storageServicesMap?.has(profile.id)) { + storageService.dispose(); + } } } @@ -111,16 +131,6 @@ export abstract class AbstractUserDataProfileStorageService extends Disposable i storageService.storeAll(Array.from(items.entries()).map(([key, value]) => ({ key, value, scope: StorageScope.PROFILE, target })), true); } - protected async closeAndDispose(storageDatabase: IStorageDatabase): Promise { - try { - await storageDatabase.close(); - } finally { - if (isDisposable(storageDatabase)) { - storageDatabase.dispose(); - } - } - } - protected abstract createStorageDatabase(profile: IUserDataProfile): Promise; } @@ -130,12 +140,13 @@ export class RemoteUserDataProfileStorageService extends AbstractUserDataProfile readonly onDidChange: Event; constructor( + persistStorages: boolean, private readonly remoteService: IRemoteService, userDataProfilesService: IUserDataProfilesService, storageService: IStorageService, logService: ILogService, ) { - super(storageService); + super(persistStorages, storageService); const channel = remoteService.getChannel('profileStorageListener'); const disposable = this._register(new MutableDisposable()); @@ -164,14 +175,26 @@ export class RemoteUserDataProfileStorageService extends AbstractUserDataProfile class StorageService extends AbstractStorageService { - private readonly profileStorage: IStorage; + private profileStorage: IStorage | undefined; - constructor(profileStorageDatabase: IStorageDatabase) { + constructor(private readonly profileStorageDatabase: Promise) { super({ flushInterval: 100 }); - this.profileStorage = this._register(new Storage(profileStorageDatabase)); } - protected doInitialize(): Promise { + protected async doInitialize(): Promise { + const profileStorageDatabase = await this.profileStorageDatabase; + const profileStorage = new Storage(profileStorageDatabase); + this._register(profileStorage.onDidChangeStorage(e => { + this.emitDidChangeValue(StorageScope.PROFILE, e); + })); + this._register(toDisposable(() => { + profileStorage.close(); + profileStorage.dispose(); + if (isDisposable(profileStorageDatabase)) { + profileStorageDatabase.dispose(); + } + })); + this.profileStorage = profileStorage; return this.profileStorage.init(); } diff --git a/src/vs/platform/userDataProfile/electron-sandbox/userDataProfileStorageService.ts b/src/vs/platform/userDataProfile/electron-sandbox/userDataProfileStorageService.ts index 0679efcc74208..313bedc9bffc5 100644 --- a/src/vs/platform/userDataProfile/electron-sandbox/userDataProfileStorageService.ts +++ b/src/vs/platform/userDataProfile/electron-sandbox/userDataProfileStorageService.ts @@ -18,7 +18,7 @@ export class NativeUserDataProfileStorageService extends RemoteUserDataProfileSt @IStorageService storageService: IStorageService, @ILogService logService: ILogService, ) { - super(mainProcessService, userDataProfilesService, storageService, logService); + super(false, mainProcessService, userDataProfilesService, storageService, logService); } } diff --git a/src/vs/platform/userDataProfile/node/userDataProfileStorageService.ts b/src/vs/platform/userDataProfile/node/userDataProfileStorageService.ts index 3b37d056aae10..703011c9d607e 100644 --- a/src/vs/platform/userDataProfile/node/userDataProfileStorageService.ts +++ b/src/vs/platform/userDataProfile/node/userDataProfileStorageService.ts @@ -9,7 +9,7 @@ import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/use import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { RemoteUserDataProfileStorageService } from 'vs/platform/userDataProfile/common/userDataProfileStorageService'; -export class NativeUserDataProfileStorageService extends RemoteUserDataProfileStorageService { +export class SharedProcessUserDataProfileStorageService extends RemoteUserDataProfileStorageService { constructor( @IMainProcessService mainProcessService: IMainProcessService, @@ -17,6 +17,6 @@ export class NativeUserDataProfileStorageService extends RemoteUserDataProfileSt @IStorageService storageService: IStorageService, @ILogService logService: ILogService, ) { - super(mainProcessService, userDataProfilesService, storageService, logService); + super(true, mainProcessService, userDataProfilesService, storageService, logService); } } diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts index 3302b56ea6b0d..36cfb4efce5a3 100644 --- a/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts +++ b/src/vs/platform/userDataProfile/test/common/userDataProfileStorageService.test.ts @@ -43,7 +43,6 @@ export class TestUserDataProfileStorageService extends AbstractUserDataProfileSt return this.createStorageDatabase(profile); } - protected override async closeAndDispose(): Promise { } } suite('ProfileStorageService', () => { @@ -54,7 +53,7 @@ suite('ProfileStorageService', () => { let storage: Storage; setup(async () => { - testObject = disposables.add(new TestUserDataProfileStorageService(disposables.add(new InMemoryStorageService()))); + testObject = disposables.add(new TestUserDataProfileStorageService(false, disposables.add(new InMemoryStorageService()))); storage = disposables.add(new Storage(await testObject.setupStorageDatabase(profile))); await storage.init(); }); diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index b622a3efe44b1..3a035f63221cb 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -95,7 +95,7 @@ export class UserDataSyncClient extends Disposable { const storageService = this._register(new TestStorageService(userDataProfilesService.defaultProfile)); this.instantiationService.stub(IStorageService, this._register(storageService)); - this.instantiationService.stub(IUserDataProfileStorageService, this._register(new TestUserDataProfileStorageService(storageService))); + this.instantiationService.stub(IUserDataProfileStorageService, this._register(new TestUserDataProfileStorageService(false, storageService))); const configurationService = this._register(new ConfigurationService(userDataProfilesService.defaultProfile.settingsResource, fileService, new NullPolicyService(), logService)); await configurationService.initialize(); diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileStorageService.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileStorageService.ts index 3dfaaf20e4c37..24a18be859876 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileStorageService.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileStorageService.ts @@ -24,7 +24,7 @@ export class UserDataProfileStorageService extends AbstractUserDataProfileStorag @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, @ILogService private readonly logService: ILogService, ) { - super(storageService); + super(true, storageService); const disposables = this._register(new DisposableStore()); this._register(Event.filter(storageService.onDidChangeTarget, e => e.scope === StorageScope.PROFILE, disposables)(() => this.onDidChangeStorageTargetInCurrentProfile())); this._register(storageService.onDidChangeValue(StorageScope.PROFILE, undefined, disposables)(e => this.onDidChangeStorageValueInCurrentProfile(e))); From 7d06e7bd5ccc364af3ce28a946e2d3369634eb5f Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 17 Jun 2024 21:55:06 -0700 Subject: [PATCH 284/755] Fix /explain sorting (#215600) hack --- .../contrib/chat/browser/contrib/chatInputCompletions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts index cbd7042dc425b..1dbda1e1150e4 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts @@ -209,7 +209,7 @@ class AgentCompletions extends Disposable { const getFilterText = (agent: IChatAgentData, command: string) => { // This is hacking the filter algorithm to make @terminal /explain match worse than @workspace /explain by making its match index later in the string. // When I type `/exp`, the workspace one should be sorted over the terminal one. - const dummyPrefix = agent.id === 'github.copilot.terminal' ? `0000` : ``; + const dummyPrefix = agent.id === 'github.copilot.terminalPanel' ? `0000` : ``; return `${chatSubcommandLeader}${dummyPrefix}${agent.name}.${command}`; }; From 77b63a165e11072b7a8e13ebd1ec563f18fb83ba Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 17 Jun 2024 23:11:41 -0700 Subject: [PATCH 285/755] Reveal breakpoints view when adding a function breakpoint to it (#216315) Fix #216137 --- src/vs/workbench/contrib/debug/browser/breakpointsView.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index 3ca9114d882d2..ac8dc3ed3d0fc 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -55,6 +55,7 @@ import { Breakpoint, DataBreakpoint, ExceptionBreakpoint, FunctionBreakpoint, In import { DisassemblyViewInput } from 'vs/workbench/contrib/debug/common/disassemblyViewInput'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; const $ = dom.$; @@ -1426,8 +1427,10 @@ registerAction2(class extends Action2 { }); } - run(accessor: ServicesAccessor): void { + async run(accessor: ServicesAccessor): Promise { const debugService = accessor.get(IDebugService); + const viewService = accessor.get(IViewsService); + await viewService.openView(BREAKPOINTS_VIEW_ID); debugService.addFunctionBreakpoint(); } }); From 214a425a0f29c60e4e5035b5a613c24e10b937e4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 18 Jun 2024 08:43:31 +0200 Subject: [PATCH 286/755] Revert ":up: `@parcel/watcher@2.4.0`" (#216318) Revert ":up: `@parcel/watcher@2.4.0` (#215964)" This reverts commit 406d1d726fc68ab1146a2baf8afd134d5b95075a. --- package.json | 2 +- remote/package.json | 2 +- remote/yarn.lock | 25 ++++++++++---------- yarn.lock | 56 +++++++++++++++++++++++++++++++++------------ 4 files changed, 56 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index b958cf79b1f37..876f075700e24 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@parcel/watcher": "github:parcel-bundler/watcher#v2.4.0", + "@parcel/watcher": "2.1.0", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/policy-watcher": "^1.1.4", diff --git a/remote/package.json b/remote/package.json index df8fb8149ccc2..c9b813f2b65d4 100644 --- a/remote/package.json +++ b/remote/package.json @@ -5,7 +5,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@parcel/watcher": "github:parcel-bundler/watcher#v2.4.0", + "@parcel/watcher": "2.1.0", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/proxy-agent": "^0.20.0", diff --git a/remote/yarn.lock b/remote/yarn.lock index ac935e882f454..f57d42bd60431 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -38,14 +38,15 @@ resolved "https://registry.yarnpkg.com/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz#7437db7aa061162ee94e4131b69a62b8dad5dea6" integrity sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ== -"@parcel/watcher@github:parcel-bundler/watcher#v2.4.0": - version "2.4.0" - resolved "https://codeload.github.com/parcel-bundler/watcher/tar.gz/02ebcbe7ab1931e78495f0be93a54f06f6d6e68a" +"@parcel/watcher@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545" + integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== dependencies: - detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" - node-addon-api "^7.0.0" + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" "@tootallnate/once@^3.0.0": version "3.0.0" @@ -240,11 +241,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - detect-libc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -443,7 +439,7 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@7.1.0, node-addon-api@^7.0.0, node-addon-api@^7.1.0: +node-addon-api@7.1.0, node-addon-api@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== @@ -453,12 +449,17 @@ node-addon-api@^3.0.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-addon-api@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== -node-gyp-build@4.8.1: +node-gyp-build@4.8.1, node-gyp-build@^4.3.0: version "4.8.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== diff --git a/yarn.lock b/yarn.lock index 64db4a5fbd06c..72431fd74c633 100644 --- a/yarn.lock +++ b/yarn.lock @@ -887,14 +887,15 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.3.tgz#13a12ae9e05c2a782f7b5e84c3cbfda4225eaf80" integrity sha512-puWxACExDe9nxbBB3lOymQFrLYml2dVOrd7USiVRnSbgXE+KwBu+HxFvxrzfqsiSda9IWsXJG1ef7C1O2/GmKQ== -"@parcel/watcher@github:parcel-bundler/watcher#v2.4.0": - version "2.4.0" - resolved "https://codeload.github.com/parcel-bundler/watcher/tar.gz/02ebcbe7ab1931e78495f0be93a54f06f6d6e68a" +"@parcel/watcher@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545" + integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== dependencies: - detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" - node-addon-api "^7.0.0" + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -3683,11 +3684,6 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - detect-libc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -7257,7 +7253,7 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-addon-api@7.1.0, node-addon-api@^7.0.0, node-addon-api@^7.1.0: +node-addon-api@7.1.0, node-addon-api@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== @@ -7267,6 +7263,11 @@ node-addon-api@^3.0.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-addon-api@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" @@ -7296,7 +7297,7 @@ node-fetch@^2.6.0, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-gyp-build@4.8.1: +node-gyp-build@4.8.1, node-gyp-build@^4.3.0: version "4.8.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== @@ -9325,7 +9326,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9369,6 +9370,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9422,7 +9432,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9457,6 +9467,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10612,7 +10629,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10647,6 +10664,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 3b94c28ffbcc28fb555f3b043aa50bce210c9012 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 17 Jun 2024 23:51:27 -0700 Subject: [PATCH 287/755] Check for valid issue on open (#216334) --- .github/workflows/on-open.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index 361ac11b94667..679c1c65db87c 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -16,6 +16,11 @@ jobs: - name: Install Actions run: npm install --production --prefix ./actions + - name: Check for Validity + uses: ./actions/validity-checker + with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + - name: Run CopyCat (VSCodeTriageBot/testissues) uses: ./actions/copycat with: From b631c0aa4d30ff471171dd75376c6b49504f7ba1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 18 Jun 2024 09:39:17 +0200 Subject: [PATCH 288/755] fix https://github.com/microsoft/vscode-copilot/issues/6236 (#216367) --- .../chatTextEditContentPart.ts | 152 +++++++++--------- .../contrib/chat/browser/chatListRenderer.ts | 3 - 2 files changed, 78 insertions(+), 77 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts index f0d1edb0bd3c7..9752ec4a0e50d 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts @@ -54,101 +54,105 @@ export class ChatTextEditContentPart extends Disposable { if (rendererOptions.renderTextEditsAsSummary?.(chatTextEdit.uri)) { if (isResponseVM(element) && element.response.value.every(item => item.kind === 'textEditGroup')) { this.element = $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")); + } else { + this.element = $('div'); } // TODO@roblourens this case is now handled outside this Part in ChatListRenderer, but can it be cleaned up? // return; - } + } else { - const cts = new CancellationTokenSource(); - let isDisposed = false; - this._register(toDisposable(() => { - isDisposed = true; - cts.dispose(true); - })); + const cts = new CancellationTokenSource(); - this.ref = this._register(diffEditorPool.get()); + let isDisposed = false; + this._register(toDisposable(() => { + isDisposed = true; + cts.dispose(true); + })); - // Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping) - // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) - this._register(this.ref.object.onDidChangeContentHeight(() => { - this._onDidChangeHeight.fire(); - })); + this.ref = this._register(diffEditorPool.get()); + + // Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping) + // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) + this._register(this.ref.object.onDidChangeContentHeight(() => { + this._onDidChangeHeight.fire(); + })); - const data: ICodeCompareBlockData = { - element, - edit: chatTextEdit, - diffData: (async () => { + const data: ICodeCompareBlockData = { + element, + edit: chatTextEdit, + diffData: (async () => { - const ref = await this.textModelService.createModelReference(chatTextEdit.uri); + const ref = await this.textModelService.createModelReference(chatTextEdit.uri); - if (isDisposed) { - ref.dispose(); - return; - } + if (isDisposed) { + ref.dispose(); + return; + } - this._register(ref); + this._register(ref); - const original = ref.object.textEditorModel; - let originalSha1: string = ''; + const original = ref.object.textEditorModel; + let originalSha1: string = ''; - if (chatTextEdit.state) { - originalSha1 = chatTextEdit.state.sha1; - } else { - const sha1 = new DefaultModelSHA1Computer(); - if (sha1.canComputeSHA1(original)) { - originalSha1 = sha1.computeSHA1(original); - chatTextEdit.state = { sha1: originalSha1, applied: 0 }; - } - } - - const modified = this.modelService.createModel( - createTextBufferFactoryFromSnapshot(original.createSnapshot()), - { languageId: original.getLanguageId(), onDidChange: Event.None }, - URI.from({ scheme: Schemas.vscodeChatCodeBlock, path: original.uri.path, query: generateUuid() }), - false - ); - const modRef = await this.textModelService.createModelReference(modified.uri); - this._register(modRef); - - const editGroups: ISingleEditOperation[][] = []; - if (isResponseVM(element)) { - const chatModel = this.chatService.getSession(element.sessionId)!; - - for (const request of chatModel.getRequests()) { - if (!request.response) { - continue; + if (chatTextEdit.state) { + originalSha1 = chatTextEdit.state.sha1; + } else { + const sha1 = new DefaultModelSHA1Computer(); + if (sha1.canComputeSHA1(original)) { + originalSha1 = sha1.computeSHA1(original); + chatTextEdit.state = { sha1: originalSha1, applied: 0 }; } - for (const item of request.response.response.value) { - if (item.kind !== 'textEditGroup' || item.state?.applied || !isEqual(item.uri, chatTextEdit.uri)) { + } + + const modified = this.modelService.createModel( + createTextBufferFactoryFromSnapshot(original.createSnapshot()), + { languageId: original.getLanguageId(), onDidChange: Event.None }, + URI.from({ scheme: Schemas.vscodeChatCodeBlock, path: original.uri.path, query: generateUuid() }), + false + ); + const modRef = await this.textModelService.createModelReference(modified.uri); + this._register(modRef); + + const editGroups: ISingleEditOperation[][] = []; + if (isResponseVM(element)) { + const chatModel = this.chatService.getSession(element.sessionId)!; + + for (const request of chatModel.getRequests()) { + if (!request.response) { continue; } - for (const group of item.edits) { - const edits = group.map(TextEdit.asEditOperation); - editGroups.push(edits); + for (const item of request.response.response.value) { + if (item.kind !== 'textEditGroup' || item.state?.applied || !isEqual(item.uri, chatTextEdit.uri)) { + continue; + } + for (const group of item.edits) { + const edits = group.map(TextEdit.asEditOperation); + editGroups.push(edits); + } + } + if (request.response === element.model) { + break; } - } - if (request.response === element.model) { - break; } } - } - - for (const edits of editGroups) { - modified.pushEditOperations(null, edits, () => null); - } - - return { - modified, - original, - originalSha1 - } satisfies ICodeCompareBlockDiffData; - })() - }; - this.ref.object.render(data, currentWidth, cts.token); - this.element = this.ref.object.element; + for (const edits of editGroups) { + modified.pushEditOperations(null, edits, () => null); + } + + return { + modified, + original, + originalSha1 + } satisfies ICodeCompareBlockDiffData; + })() + }; + this.ref.object.render(data, currentWidth, cts.token); + + this.element = this.ref.object.element; + } } layout(width: number): void { diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index ee0b9225af60c..6c569ce11e951 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -935,9 +935,6 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer item.kind === 'textEditGroup'))) { - return; - } const store = new DisposableStore(); const textEditPart = store.add(this.instantiationService.createInstance(ChatTextEditContentPart, chatTextEdit, element, this.rendererOptions, this._diffEditorPool, this._currentLayoutWidth)); From 5e2e40c42ecdce67e7ce5cc09490ea5be30124cb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 18 Jun 2024 10:00:46 +0200 Subject: [PATCH 289/755] tweak accept or discard message (#216384) --- .../contrib/inlineChat/browser/inlineChatStrategies.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index c98fcfa30f8d0..a5259dd82dc2a 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -578,7 +578,7 @@ export class LiveStrategy extends EditModeStrategy { message = localize('change.0', "Nothing changed."); } else if (remaining === 1) { message = needsReview - ? localize('review.1', "$(info) Accept or discard 1 change") + ? localize('review.1', "$(info) Accept or discard change") : localize('change.1', "1 change"); } else { message = needsReview From 69105b9a4eb23e67ab77766ba900df23438840d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:09:38 +0200 Subject: [PATCH 290/755] Bump ws from 7.4.6 to 7.5.10 (#216023) Bumps [ws](https://github.com/websockets/ws) from 7.4.6 to 7.5.10. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.6...7.5.10) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 72431fd74c633..73b954aaa6c15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10695,9 +10695,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.2.0: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xml2js@^0.4.19: version "0.4.23" From f388d52dc74931acf9831da7d9cec3f285763ce6 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Tue, 18 Jun 2024 01:36:44 -0700 Subject: [PATCH 291/755] Check for valid issue on reopen (#216397) --- .github/workflows/on-reopen.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/on-reopen.yml diff --git a/.github/workflows/on-reopen.yml b/.github/workflows/on-reopen.yml new file mode 100644 index 0000000000000..d29de326c53a3 --- /dev/null +++ b/.github/workflows/on-reopen.yml @@ -0,0 +1,22 @@ +name: On Reopen +on: + issues: + types: [reopened] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v4 + with: + repository: "microsoft/vscode-github-triage-actions" + ref: stable + path: ./actions + - name: Install Actions + run: npm install --production --prefix ./actions + + - name: Check for Validity + uses: ./actions/validity-checker + with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} From a8e00a00ddd047fd5346408b434bcc67956754ee Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:59:53 +0200 Subject: [PATCH 292/755] Git - expose untracked changes group (#216414) --- extensions/git/src/api/api1.ts | 1 + extensions/git/src/api/git.d.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/extensions/git/src/api/api1.ts b/extensions/git/src/api/api1.ts index f049939c137f6..f94ecbab7b0e0 100644 --- a/extensions/git/src/api/api1.ts +++ b/extensions/git/src/api/api1.ts @@ -44,6 +44,7 @@ export class ApiRepositoryState implements RepositoryState { get mergeChanges(): Change[] { return this._repository.mergeGroup.resourceStates.map(r => new ApiChange(r)); } get indexChanges(): Change[] { return this._repository.indexGroup.resourceStates.map(r => new ApiChange(r)); } get workingTreeChanges(): Change[] { return this._repository.workingTreeGroup.resourceStates.map(r => new ApiChange(r)); } + get untrackedChanges(): Change[] { return this._repository.untrackedGroup.resourceStates.map(r => new ApiChange(r)); } readonly onDidChange: Event = this._repository.onDidRunGitStatus; diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index 685b541394700..a9c766b95dc9e 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -122,6 +122,7 @@ export interface RepositoryState { readonly mergeChanges: Change[]; readonly indexChanges: Change[]; readonly workingTreeChanges: Change[]; + readonly untrackedChanges: Change[]; readonly onDidChange: Event; } From 52f062f709290eec516dbf5db8562ef33d5ef5b9 Mon Sep 17 00:00:00 2001 From: Ole Date: Tue, 18 Jun 2024 11:11:37 +0200 Subject: [PATCH 293/755] Revert again the unintentional change to test/automation/package.json. I wonder if VSCode or some extension I have keeps updating this? I am not doing it handishly. Anyways, gone again. --- test/automation/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/automation/package.json b/test/automation/package.json index 8172250a9a397..b9dbbec4bb81a 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -1,6 +1,6 @@ { "name": "vscode-automation", - "version": "1.91.0", + "version": "1.71.0", "description": "VS Code UI automation driver", "author": { "name": "Microsoft Corporation" @@ -33,4 +33,4 @@ "npm-run-all": "^4.1.5", "watch": "^1.0.2" } -} \ No newline at end of file +} From 34cd6898741a0bad3089b8f2765ea04445132920 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 05:52:50 -0700 Subject: [PATCH 294/755] Speculative fix for terminal tabs flaky smoke test Wait briefly between backspace and enter. Fixes #216460 --- test/automation/src/terminal.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/automation/src/terminal.ts b/test/automation/src/terminal.ts index b40606928f8c6..8ebcbd686361b 100644 --- a/test/automation/src/terminal.ts +++ b/test/automation/src/terminal.ts @@ -119,6 +119,7 @@ export class Terminal { // Reset await this.code.dispatchKeybinding('Backspace'); } + await this.code.wait(100); await this.code.dispatchKeybinding(altKey ? 'Alt+Enter' : 'enter'); await this.quickinput.waitForQuickInputClosed(); if (commandId === TerminalCommandIdWithValue.NewWithProfile) { From ff975788b201bbbb0ab9ec05151d07b85870b904 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Tue, 18 Jun 2024 15:38:32 +0200 Subject: [PATCH 295/755] Refactoring `cursorTypeOperation.ts` file (#216442) * add code * addnig code * poishing the code * removing cyclic dependency * adding correct import --- src/vs/editor/browser/coreCommands.ts | 3 +- src/vs/editor/common/cursor/cursor.ts | 3 +- .../common/cursor/cursorTypeEditOperations.ts | 974 +++++++++++++++++ .../common/cursor/cursorTypeOperations.ts | 984 +----------------- .../browser/linesOperations.ts | 5 +- 5 files changed, 1016 insertions(+), 953 deletions(-) create mode 100644 src/vs/editor/common/cursor/cursorTypeEditOperations.ts diff --git a/src/vs/editor/browser/coreCommands.ts b/src/vs/editor/browser/coreCommands.ts index a05216711a116..e7f0743af8318 100644 --- a/src/vs/editor/browser/coreCommands.ts +++ b/src/vs/editor/browser/coreCommands.ts @@ -30,6 +30,7 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IViewModel } from 'vs/editor/common/viewModel'; import { ISelection } from 'vs/editor/common/core/selection'; import { getActiveElement } from 'vs/base/browser/dom'; +import { EnterOperation } from 'vs/editor/common/cursor/cursorTypeEditOperations'; const CORE_WEIGHT = KeybindingWeight.EditorCore; @@ -1988,7 +1989,7 @@ export namespace CoreEditingCommands { public runCoreEditingCommand(editor: ICodeEditor, viewModel: IViewModel, args: unknown): void { editor.pushUndoStop(); - editor.executeCommands(this.id, TypeOperations.lineBreakInsert(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection))); + editor.executeCommands(this.id, EnterOperation.lineBreakInsert(viewModel.cursorConfig, viewModel.model, viewModel.getCursorStates().map(s => s.modelState.selection))); } }); diff --git a/src/vs/editor/common/cursor/cursor.ts b/src/vs/editor/common/cursor/cursor.ts index 4df16ec8db26a..27491a38a6a36 100644 --- a/src/vs/editor/common/cursor/cursor.ts +++ b/src/vs/editor/common/cursor/cursor.ts @@ -10,7 +10,7 @@ import { CursorConfiguration, CursorState, EditOperationResult, EditOperationTyp import { CursorContext } from 'vs/editor/common/cursor/cursorContext'; import { DeleteOperations } from 'vs/editor/common/cursor/cursorDeleteOperations'; import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; -import { CompositionOutcome, TypeOperations, TypeWithAutoClosingCommand } from 'vs/editor/common/cursor/cursorTypeOperations'; +import { CompositionOutcome, TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; import { Position } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { ISelection, Selection, SelectionDirection } from 'vs/editor/common/core/selection'; @@ -21,6 +21,7 @@ import { VerticalRevealType, ViewCursorStateChangedEvent, ViewRevealRangeRequest import { dispose, Disposable } from 'vs/base/common/lifecycle'; import { ICoordinatesConverter } from 'vs/editor/common/viewModel'; import { CursorStateChangedEvent, ViewModelEventsCollector } from 'vs/editor/common/viewModelEventDispatcher'; +import { TypeWithAutoClosingCommand } from 'vs/editor/common/cursor/cursorTypeEditOperations'; export class CursorsController extends Disposable { diff --git a/src/vs/editor/common/cursor/cursorTypeEditOperations.ts b/src/vs/editor/common/cursor/cursorTypeEditOperations.ts new file mode 100644 index 0000000000000..ec8f484f39590 --- /dev/null +++ b/src/vs/editor/common/cursor/cursorTypeEditOperations.ts @@ -0,0 +1,974 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CharCode } from 'vs/base/common/charCode'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import * as strings from 'vs/base/common/strings'; +import { ReplaceCommand, ReplaceCommandWithOffsetCursorState, ReplaceCommandWithoutChangingPosition, ReplaceCommandThatPreservesSelection } from 'vs/editor/common/commands/replaceCommand'; +import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; +import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; +import { CursorConfiguration, EditOperationResult, EditOperationType, ICursorSimpleModel, isQuote } from 'vs/editor/common/cursorCommon'; +import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { Position } from 'vs/editor/common/core/position'; +import { ICommand, ICursorStateComputerData } from 'vs/editor/common/editorCommon'; +import { ITextModel } from 'vs/editor/common/model'; +import { EnterAction, IndentAction, StandardAutoClosingPairConditional } from 'vs/editor/common/languages/languageConfiguration'; +import { getIndentationAtPosition } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { IElectricAction } from 'vs/editor/common/languages/supports/electricCharacter'; +import { EditorAutoClosingStrategy, EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions'; +import { createScopedLineTokens } from 'vs/editor/common/languages/supports'; +import { getIndentActionForType, getIndentForEnter, getInheritIndentForLine } from 'vs/editor/common/languages/autoIndent'; +import { getEnterAction } from 'vs/editor/common/languages/enterAction'; + +export class AutoIndentOperation { + + public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, isDoingComposition: boolean): EditOperationResult | undefined { + if (!isDoingComposition && this._isAutoIndentType(config, model, selections)) { + const commands: Array = []; + let autoIndentFails = false; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = this._runAutoIndentType(config, model, selections[i], ch); + if (!commands[i]) { + autoIndentFails = true; + break; + } + } + if (!autoIndentFails) { + return new EditOperationResult(EditOperationType.TypingOther, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false, + }); + } + } + return; + } + + private static _isAutoIndentType(config: CursorConfiguration, model: ITextModel, selections: Selection[]): boolean { + if (config.autoIndent < EditorAutoIndentStrategy.Full) { + return false; + } + for (let i = 0, len = selections.length; i < len; i++) { + if (!model.tokenization.isCheapToTokenize(selections[i].getEndPosition().lineNumber)) { + return false; + } + } + return true; + } + + private static _runAutoIndentType(config: CursorConfiguration, model: ITextModel, range: Range, ch: string): ICommand | null { + const currentIndentation = getIndentationAtPosition(model, range.startLineNumber, range.startColumn); + const actualIndentation = getIndentActionForType(config.autoIndent, model, range, ch, { + shiftIndent: (indentation) => { + return shiftIndent(config, indentation); + }, + unshiftIndent: (indentation) => { + return unshiftIndent(config, indentation); + }, + }, config.languageConfigurationService); + + if (actualIndentation === null) { + return null; + } + + if (actualIndentation !== config.normalizeIndentation(currentIndentation)) { + const firstNonWhitespace = model.getLineFirstNonWhitespaceColumn(range.startLineNumber); + if (firstNonWhitespace === 0) { + return typeCommand( + new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn), + config.normalizeIndentation(actualIndentation) + ch, + false + ); + } else { + return typeCommand( + new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn), + config.normalizeIndentation(actualIndentation) + + model.getLineContent(range.startLineNumber).substring(firstNonWhitespace - 1, range.startColumn - 1) + ch, + false + ); + } + } + return null; + } +} + +export class AutoClosingOvertypeOperation { + + public static getEdits(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], autoClosedCharacters: Range[], ch: string): EditOperationResult | undefined { + if (isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) { + return this._runAutoClosingOvertype(prevEditOperationType, selections, ch); + } + return; + } + + private static _runAutoClosingOvertype(prevEditOperationType: EditOperationType, selections: Selection[], ch: string): EditOperationResult { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const position = selection.getPosition(); + const typeSelection = new Range(position.lineNumber, position.column, position.lineNumber, position.column + 1); + commands[i] = new ReplaceCommand(typeSelection, ch); + } + return new EditOperationResult(EditOperationType.TypingOther, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, EditOperationType.TypingOther), + shouldPushStackElementAfter: false + }); + } +} + +export class AutoClosingOvertypeWithInterceptorsOperation { + + public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], autoClosedCharacters: Range[], ch: string): EditOperationResult | undefined { + if (isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) { + // Unfortunately, the close character is at this point "doubled", so we need to delete it... + const commands = selections.map(s => new ReplaceCommand(new Range(s.positionLineNumber, s.positionColumn, s.positionLineNumber, s.positionColumn + 1), '', false)); + return new EditOperationResult(EditOperationType.TypingOther, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + return; + } +} + +export class AutoClosingOpenCharTypeOperation { + + public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean, isDoingComposition: boolean): EditOperationResult | undefined { + if (!isDoingComposition) { + const autoClosingPairClose = this._getAutoClosingPairClose(config, model, selections, ch, chIsAlreadyTyped); + if (autoClosingPairClose !== null) { + return this._runAutoClosingOpenCharType(selections, ch, chIsAlreadyTyped, autoClosingPairClose); + } + } + return; + } + + private static _runAutoClosingOpenCharType(selections: Selection[], ch: string, chIsAlreadyTyped: boolean, autoClosingPairClose: string): EditOperationResult { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + commands[i] = new TypeWithAutoClosingCommand(selection, ch, !chIsAlreadyTyped, autoClosingPairClose); + } + return new EditOperationResult(EditOperationType.TypingOther, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false + }); + } + + private static _getAutoClosingPairClose(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean): string | null { + for (const selection of selections) { + if (!selection.isEmpty()) { + return null; + } + } + // This method is called both when typing (regularly) and when composition ends + // This means that we need to work with a text buffer where sometimes `ch` is not + // there (it is being typed right now) or with a text buffer where `ch` has already been typed + // + // In order to avoid adding checks for `chIsAlreadyTyped` in all places, we will work + // with two conceptual positions, the position before `ch` and the position after `ch` + // + const positions: { lineNumber: number; beforeColumn: number; afterColumn: number }[] = selections.map((s) => { + const position = s.getPosition(); + if (chIsAlreadyTyped) { + return { lineNumber: position.lineNumber, beforeColumn: position.column - ch.length, afterColumn: position.column }; + } else { + return { lineNumber: position.lineNumber, beforeColumn: position.column, afterColumn: position.column }; + } + }); + // Find the longest auto-closing open pair in case of multiple ending in `ch` + // e.g. when having [f","] and [","], it picks [f","] if the character before is f + const pair = this._findAutoClosingPairOpen(config, model, positions.map(p => new Position(p.lineNumber, p.beforeColumn)), ch); + if (!pair) { + return null; + } + let autoCloseConfig: EditorAutoClosingStrategy; + let shouldAutoCloseBefore: (ch: string) => boolean; + + const chIsQuote = isQuote(ch); + if (chIsQuote) { + autoCloseConfig = config.autoClosingQuotes; + shouldAutoCloseBefore = config.shouldAutoCloseBefore.quote; + } else { + const pairIsForComments = config.blockCommentStartToken ? pair.open.includes(config.blockCommentStartToken) : false; + if (pairIsForComments) { + autoCloseConfig = config.autoClosingComments; + shouldAutoCloseBefore = config.shouldAutoCloseBefore.comment; + } else { + autoCloseConfig = config.autoClosingBrackets; + shouldAutoCloseBefore = config.shouldAutoCloseBefore.bracket; + } + } + if (autoCloseConfig === 'never') { + return null; + } + // Sometimes, it is possible to have two auto-closing pairs that have a containment relationship + // e.g. when having [(,)] and [(*,*)] + // - when typing (, the resulting state is (|) + // - when typing *, the desired resulting state is (*|*), not (*|*)) + const containedPair = this._findContainedAutoClosingPair(config, pair); + const containedPairClose = containedPair ? containedPair.close : ''; + let isContainedPairPresent = true; + + for (const position of positions) { + const { lineNumber, beforeColumn, afterColumn } = position; + const lineText = model.getLineContent(lineNumber); + const lineBefore = lineText.substring(0, beforeColumn - 1); + const lineAfter = lineText.substring(afterColumn - 1); + + if (!lineAfter.startsWith(containedPairClose)) { + isContainedPairPresent = false; + } + // Only consider auto closing the pair if an allowed character follows or if another autoclosed pair closing brace follows + if (lineAfter.length > 0) { + const characterAfter = lineAfter.charAt(0); + const isBeforeCloseBrace = this._isBeforeClosingBrace(config, lineAfter); + if (!isBeforeCloseBrace && !shouldAutoCloseBefore(characterAfter)) { + return null; + } + } + // Do not auto-close ' or " after a word character + if (pair.open.length === 1 && (ch === '\'' || ch === '"') && autoCloseConfig !== 'always') { + const wordSeparators = getMapForWordSeparators(config.wordSeparators, []); + if (lineBefore.length > 0) { + const characterBefore = lineBefore.charCodeAt(lineBefore.length - 1); + if (wordSeparators.get(characterBefore) === WordCharacterClass.Regular) { + return null; + } + } + } + if (!model.tokenization.isCheapToTokenize(lineNumber)) { + // Do not force tokenization + return null; + } + model.tokenization.forceTokenization(lineNumber); + const lineTokens = model.tokenization.getLineTokens(lineNumber); + const scopedLineTokens = createScopedLineTokens(lineTokens, beforeColumn - 1); + if (!pair.shouldAutoClose(scopedLineTokens, beforeColumn - scopedLineTokens.firstCharOffset)) { + return null; + } + // Typing for example a quote could either start a new string, in which case auto-closing is desirable + // or it could end a previously started string, in which case auto-closing is not desirable + // + // In certain cases, it is really not possible to look at the previous token to determine + // what would happen. That's why we do something really unusual, we pretend to type a different + // character and ask the tokenizer what the outcome of doing that is: after typing a neutral + // character, are we in a string (i.e. the quote would most likely end a string) or not? + // + const neutralCharacter = pair.findNeutralCharacter(); + if (neutralCharacter) { + const tokenType = model.tokenization.getTokenTypeIfInsertingCharacter(lineNumber, beforeColumn, neutralCharacter); + if (!pair.isOK(tokenType)) { + return null; + } + } + } + if (isContainedPairPresent) { + return pair.close.substring(0, pair.close.length - containedPairClose.length); + } else { + return pair.close; + } + } + + /** + * Find another auto-closing pair that is contained by the one passed in. + * + * e.g. when having [(,)] and [(*,*)] as auto-closing pairs + * this method will find [(,)] as a containment pair for [(*,*)] + */ + private static _findContainedAutoClosingPair(config: CursorConfiguration, pair: StandardAutoClosingPairConditional): StandardAutoClosingPairConditional | null { + if (pair.open.length <= 1) { + return null; + } + const lastChar = pair.close.charAt(pair.close.length - 1); + // get candidates with the same last character as close + const candidates = config.autoClosingPairs.autoClosingPairsCloseByEnd.get(lastChar) || []; + let result: StandardAutoClosingPairConditional | null = null; + for (const candidate of candidates) { + if (candidate.open !== pair.open && pair.open.includes(candidate.open) && pair.close.endsWith(candidate.close)) { + if (!result || candidate.open.length > result.open.length) { + result = candidate; + } + } + } + return result; + } + + /** + * Determine if typing `ch` at all `positions` in the `model` results in an + * auto closing open sequence being typed. + * + * Auto closing open sequences can consist of multiple characters, which + * can lead to ambiguities. In such a case, the longest auto-closing open + * sequence is returned. + */ + private static _findAutoClosingPairOpen(config: CursorConfiguration, model: ITextModel, positions: Position[], ch: string): StandardAutoClosingPairConditional | null { + const candidates = config.autoClosingPairs.autoClosingPairsOpenByEnd.get(ch); + if (!candidates) { + return null; + } + // Determine which auto-closing pair it is + let result: StandardAutoClosingPairConditional | null = null; + for (const candidate of candidates) { + if (result === null || candidate.open.length > result.open.length) { + let candidateIsMatch = true; + for (const position of positions) { + const relevantText = model.getValueInRange(new Range(position.lineNumber, position.column - candidate.open.length + 1, position.lineNumber, position.column)); + if (relevantText + ch !== candidate.open) { + candidateIsMatch = false; + break; + } + } + if (candidateIsMatch) { + result = candidate; + } + } + } + return result; + } + + private static _isBeforeClosingBrace(config: CursorConfiguration, lineAfter: string) { + // If the start of lineAfter can be interpretted as both a starting or ending brace, default to returning false + const nextChar = lineAfter.charAt(0); + const potentialStartingBraces = config.autoClosingPairs.autoClosingPairsOpenByStart.get(nextChar) || []; + const potentialClosingBraces = config.autoClosingPairs.autoClosingPairsCloseByStart.get(nextChar) || []; + + const isBeforeStartingBrace = potentialStartingBraces.some(x => lineAfter.startsWith(x.open)); + const isBeforeClosingBrace = potentialClosingBraces.some(x => lineAfter.startsWith(x.close)); + + return !isBeforeStartingBrace && isBeforeClosingBrace; + } +} + +export class SurroundSelectionOperation { + + public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, isDoingComposition: boolean): EditOperationResult | undefined { + if (!isDoingComposition && this._isSurroundSelectionType(config, model, selections, ch)) { + return this._runSurroundSelectionType(config, selections, ch); + } + return; + } + + private static _runSurroundSelectionType(config: CursorConfiguration, selections: Selection[], ch: string): EditOperationResult { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const closeCharacter = config.surroundingPairs[ch]; + commands[i] = new SurroundSelectionCommand(selection, ch, closeCharacter); + } + return new EditOperationResult(EditOperationType.Other, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } + + private static _isSurroundSelectionType(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string): boolean { + if (!shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) { + return false; + } + const isTypingAQuoteCharacter = isQuote(ch); + for (const selection of selections) { + if (selection.isEmpty()) { + return false; + } + let selectionContainsOnlyWhitespace = true; + for (let lineNumber = selection.startLineNumber; lineNumber <= selection.endLineNumber; lineNumber++) { + const lineText = model.getLineContent(lineNumber); + const startIndex = (lineNumber === selection.startLineNumber ? selection.startColumn - 1 : 0); + const endIndex = (lineNumber === selection.endLineNumber ? selection.endColumn - 1 : lineText.length); + const selectedText = lineText.substring(startIndex, endIndex); + if (/[^ \t]/.test(selectedText)) { + // this selected text contains something other than whitespace + selectionContainsOnlyWhitespace = false; + break; + } + } + if (selectionContainsOnlyWhitespace) { + return false; + } + if (isTypingAQuoteCharacter && selection.startLineNumber === selection.endLineNumber && selection.startColumn + 1 === selection.endColumn) { + const selectionText = model.getValueInRange(selection); + if (isQuote(selectionText)) { + // Typing a quote character on top of another quote character + // => disable surround selection type + return false; + } + } + } + return true; + } +} + +export class InterceptorElectricCharOperation { + + public static getEdits(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, isDoingComposition: boolean): EditOperationResult | undefined { + // Electric characters make sense only when dealing with a single cursor, + // as multiple cursors typing brackets for example would interfer with bracket matching + if (!isDoingComposition && this._isTypeInterceptorElectricChar(config, model, selections)) { + const r = this._typeInterceptorElectricChar(prevEditOperationType, config, model, selections[0], ch); + if (r) { + return r; + } + } + return; + } + + private static _isTypeInterceptorElectricChar(config: CursorConfiguration, model: ITextModel, selections: Selection[]) { + if (selections.length === 1 && model.tokenization.isCheapToTokenize(selections[0].getEndPosition().lineNumber)) { + return true; + } + return false; + } + + private static _typeInterceptorElectricChar(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selection: Selection, ch: string): EditOperationResult | null { + if (!config.electricChars.hasOwnProperty(ch) || !selection.isEmpty()) { + return null; + } + const position = selection.getPosition(); + model.tokenization.forceTokenization(position.lineNumber); + const lineTokens = model.tokenization.getLineTokens(position.lineNumber); + let electricAction: IElectricAction | null; + try { + electricAction = config.onElectricCharacter(ch, lineTokens, position.column); + } catch (e) { + onUnexpectedError(e); + return null; + } + if (!electricAction) { + return null; + } + if (electricAction.matchOpenBracket) { + const endColumn = (lineTokens.getLineContent() + ch).lastIndexOf(electricAction.matchOpenBracket) + 1; + const match = model.bracketPairs.findMatchingBracketUp(electricAction.matchOpenBracket, { + lineNumber: position.lineNumber, + column: endColumn + }, 500 /* give at most 500ms to compute */); + if (match) { + if (match.startLineNumber === position.lineNumber) { + // matched something on the same line => no change in indentation + return null; + } + const matchLine = model.getLineContent(match.startLineNumber); + const matchLineIndentation = strings.getLeadingWhitespace(matchLine); + const newIndentation = config.normalizeIndentation(matchLineIndentation); + const lineText = model.getLineContent(position.lineNumber); + const lineFirstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(position.lineNumber) || position.column; + const prefix = lineText.substring(lineFirstNonBlankColumn - 1, position.column - 1); + const typeText = newIndentation + prefix + ch; + const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, position.column); + const command = new ReplaceCommand(typeSelection, typeText); + return new EditOperationResult(getTypingOperation(typeText, prevEditOperationType), [command], { + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: true + }); + } + } + return null; + } +} + +export class SimpleCharacterTypeOperation { + + public static getEdits(prevEditOperationType: EditOperationType, selections: Selection[], ch: string): EditOperationResult { + // A simple character type + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], ch); + } + + const opType = getTypingOperation(ch, prevEditOperationType); + return new EditOperationResult(opType, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType), + shouldPushStackElementAfter: false + }); + } +} + +export class EnterOperation { + + public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, isDoingComposition: boolean): EditOperationResult | undefined { + if (!isDoingComposition && ch === '\n') { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = this._enter(config, model, false, selections[i]); + } + return new EditOperationResult(EditOperationType.TypingOther, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: false, + }); + } + return; + } + + private static _enter(config: CursorConfiguration, model: ITextModel, keepPosition: boolean, range: Range): ICommand { + if (config.autoIndent === EditorAutoIndentStrategy.None) { + return typeCommand(range, '\n', keepPosition); + } + if (!model.tokenization.isCheapToTokenize(range.getStartPosition().lineNumber) || config.autoIndent === EditorAutoIndentStrategy.Keep) { + const lineText = model.getLineContent(range.startLineNumber); + const indentation = strings.getLeadingWhitespace(lineText).substring(0, range.startColumn - 1); + return typeCommand(range, '\n' + config.normalizeIndentation(indentation), keepPosition); + } + const r = getEnterAction(config.autoIndent, model, range, config.languageConfigurationService); + if (r) { + if (r.indentAction === IndentAction.None) { + // Nothing special + return typeCommand(range, '\n' + config.normalizeIndentation(r.indentation + r.appendText), keepPosition); + + } else if (r.indentAction === IndentAction.Indent) { + // Indent once + return typeCommand(range, '\n' + config.normalizeIndentation(r.indentation + r.appendText), keepPosition); + + } else if (r.indentAction === IndentAction.IndentOutdent) { + // Ultra special + const normalIndent = config.normalizeIndentation(r.indentation); + const increasedIndent = config.normalizeIndentation(r.indentation + r.appendText); + const typeText = '\n' + increasedIndent + '\n' + normalIndent; + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range, typeText, true); + } else { + return new ReplaceCommandWithOffsetCursorState(range, typeText, -1, increasedIndent.length - normalIndent.length, true); + } + } else if (r.indentAction === IndentAction.Outdent) { + const actualIndentation = unshiftIndent(config, r.indentation); + return typeCommand(range, '\n' + config.normalizeIndentation(actualIndentation + r.appendText), keepPosition); + } + } + + const lineText = model.getLineContent(range.startLineNumber); + const indentation = strings.getLeadingWhitespace(lineText).substring(0, range.startColumn - 1); + + if (config.autoIndent >= EditorAutoIndentStrategy.Full) { + const ir = getIndentForEnter(config.autoIndent, model, range, { + unshiftIndent: (indent) => { + return unshiftIndent(config, indent); + }, + shiftIndent: (indent) => { + return shiftIndent(config, indent); + }, + normalizeIndentation: (indent) => { + return config.normalizeIndentation(indent); + } + }, config.languageConfigurationService); + + if (ir) { + let oldEndViewColumn = config.visibleColumnFromColumn(model, range.getEndPosition()); + const oldEndColumn = range.endColumn; + const newLineContent = model.getLineContent(range.endLineNumber); + const firstNonWhitespace = strings.firstNonWhitespaceIndex(newLineContent); + if (firstNonWhitespace >= 0) { + range = range.setEndPosition(range.endLineNumber, Math.max(range.endColumn, firstNonWhitespace + 1)); + } else { + range = range.setEndPosition(range.endLineNumber, model.getLineMaxColumn(range.endLineNumber)); + } + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range, '\n' + config.normalizeIndentation(ir.afterEnter), true); + } else { + let offset = 0; + if (oldEndColumn <= firstNonWhitespace + 1) { + if (!config.insertSpaces) { + oldEndViewColumn = Math.ceil(oldEndViewColumn / config.indentSize); + } + offset = Math.min(oldEndViewColumn + 1 - config.normalizeIndentation(ir.afterEnter).length - 1, 0); + } + return new ReplaceCommandWithOffsetCursorState(range, '\n' + config.normalizeIndentation(ir.afterEnter), 0, offset, true); + } + } + } + return typeCommand(range, '\n' + config.normalizeIndentation(indentation), keepPosition); + } + + + public static lineInsertBefore(config: CursorConfiguration, model: ITextModel | null, selections: Selection[] | null): ICommand[] { + if (model === null || selections === null) { + return []; + } + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + let lineNumber = selections[i].positionLineNumber; + if (lineNumber === 1) { + commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\n'); + } else { + lineNumber--; + const column = model.getLineMaxColumn(lineNumber); + + commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); + } + } + return commands; + } + + public static lineInsertAfter(config: CursorConfiguration, model: ITextModel | null, selections: Selection[] | null): ICommand[] { + if (model === null || selections === null) { + return []; + } + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + const lineNumber = selections[i].positionLineNumber; + const column = model.getLineMaxColumn(lineNumber); + commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); + } + return commands; + } + + public static lineBreakInsert(config: CursorConfiguration, model: ITextModel, selections: Selection[]): ICommand[] { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = this._enter(config, model, true, selections[i]); + } + return commands; + } +} + +export class PasteOperation { + + public static getEdits(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean, multicursorText: string[]) { + const distributedPaste = this._distributePasteToCursors(config, selections, text, pasteOnNewLine, multicursorText); + if (distributedPaste) { + selections = selections.sort(Range.compareRangesUsingStarts); + return this._distributedPaste(config, model, selections, distributedPaste); + } else { + return this._simplePaste(config, model, selections, text, pasteOnNewLine); + } + } + + private static _distributePasteToCursors(config: CursorConfiguration, selections: Selection[], text: string, pasteOnNewLine: boolean, multicursorText: string[]): string[] | null { + if (pasteOnNewLine) { + return null; + } + if (selections.length === 1) { + return null; + } + if (multicursorText && multicursorText.length === selections.length) { + return multicursorText; + } + if (config.multiCursorPaste === 'spread') { + // Try to spread the pasted text in case the line count matches the cursor count + // Remove trailing \n if present + if (text.charCodeAt(text.length - 1) === CharCode.LineFeed) { + text = text.substring(0, text.length - 1); + } + // Remove trailing \r if present + if (text.charCodeAt(text.length - 1) === CharCode.CarriageReturn) { + text = text.substring(0, text.length - 1); + } + const lines = strings.splitLines(text); + if (lines.length === selections.length) { + return lines; + } + } + return null; + } + + private static _distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string[]): EditOperationResult { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], text[i]); + } + return new EditOperationResult(EditOperationType.Other, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } + + private static _simplePaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean): EditOperationResult { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const position = selection.getPosition(); + if (pasteOnNewLine && !selection.isEmpty()) { + pasteOnNewLine = false; + } + if (pasteOnNewLine && text.indexOf('\n') !== text.length - 1) { + pasteOnNewLine = false; + } + if (pasteOnNewLine) { + // Paste entire line at the beginning of line + const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, 1); + commands[i] = new ReplaceCommandThatPreservesSelection(typeSelection, text, selection, true); + } else { + commands[i] = new ReplaceCommand(selection, text); + } + } + return new EditOperationResult(EditOperationType.Other, commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); + } +} + +export class CompositionOperation { + + public static getEdits(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number) { + const commands = selections.map(selection => this._compositionType(model, selection, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta)); + return new EditOperationResult(EditOperationType.TypingOther, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, EditOperationType.TypingOther), + shouldPushStackElementAfter: false + }); + } + + private static _compositionType(model: ITextModel, selection: Selection, text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number): ICommand | null { + if (!selection.isEmpty()) { + // looks like https://github.com/microsoft/vscode/issues/2773 + // where a cursor operation occurred before a canceled composition + // => ignore composition + return null; + } + const pos = selection.getPosition(); + const startColumn = Math.max(1, pos.column - replacePrevCharCnt); + const endColumn = Math.min(model.getLineMaxColumn(pos.lineNumber), pos.column + replaceNextCharCnt); + const range = new Range(pos.lineNumber, startColumn, pos.lineNumber, endColumn); + const oldText = model.getValueInRange(range); + if (oldText === text && positionDelta === 0) { + // => ignore composition that doesn't do anything + return null; + } + return new ReplaceCommandWithOffsetCursorState(range, text, 0, positionDelta); + } +} + +export class TypeWithoutInterceptorsOperation { + + public static getEdits(prevEditOperationType: EditOperationType, selections: Selection[], str: string): EditOperationResult { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], str); + } + const opType = getTypingOperation(str, prevEditOperationType); + return new EditOperationResult(opType, commands, { + shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType), + shouldPushStackElementAfter: false + }); + } +} + +export class TabOperation { + + public static getCommands(config: CursorConfiguration, model: ITextModel, selections: Selection[]) { + const commands: ICommand[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + if (selection.isEmpty()) { + const lineText = model.getLineContent(selection.startLineNumber); + if (/^\s*$/.test(lineText) && model.tokenization.isCheapToTokenize(selection.startLineNumber)) { + let goodIndent = this._goodIndentForLine(config, model, selection.startLineNumber); + goodIndent = goodIndent || '\t'; + const possibleTypeText = config.normalizeIndentation(goodIndent); + if (!lineText.startsWith(possibleTypeText)) { + commands[i] = new ReplaceCommand(new Range(selection.startLineNumber, 1, selection.startLineNumber, lineText.length + 1), possibleTypeText, true); + continue; + } + } + commands[i] = this._replaceJumpToNextIndent(config, model, selection, true); + } else { + if (selection.startLineNumber === selection.endLineNumber) { + const lineMaxColumn = model.getLineMaxColumn(selection.startLineNumber); + if (selection.startColumn !== 1 || selection.endColumn !== lineMaxColumn) { + // This is a single line selection that is not the entire line + commands[i] = this._replaceJumpToNextIndent(config, model, selection, false); + continue; + } + } + commands[i] = new ShiftCommand(selection, { + isUnshift: false, + tabSize: config.tabSize, + indentSize: config.indentSize, + insertSpaces: config.insertSpaces, + useTabStops: config.useTabStops, + autoIndent: config.autoIndent + }, config.languageConfigurationService); + } + } + return commands; + } + + private static _goodIndentForLine(config: CursorConfiguration, model: ITextModel, lineNumber: number): string | null { + let action: IndentAction | EnterAction | null = null; + let indentation: string = ''; + const expectedIndentAction = getInheritIndentForLine(config.autoIndent, model, lineNumber, false, config.languageConfigurationService); + if (expectedIndentAction) { + action = expectedIndentAction.action; + indentation = expectedIndentAction.indentation; + } else if (lineNumber > 1) { + let lastLineNumber: number; + for (lastLineNumber = lineNumber - 1; lastLineNumber >= 1; lastLineNumber--) { + const lineText = model.getLineContent(lastLineNumber); + const nonWhitespaceIdx = strings.lastNonWhitespaceIndex(lineText); + if (nonWhitespaceIdx >= 0) { + break; + } + } + if (lastLineNumber < 1) { + // No previous line with content found + return null; + } + const maxColumn = model.getLineMaxColumn(lastLineNumber); + const expectedEnterAction = getEnterAction(config.autoIndent, model, new Range(lastLineNumber, maxColumn, lastLineNumber, maxColumn), config.languageConfigurationService); + if (expectedEnterAction) { + indentation = expectedEnterAction.indentation + expectedEnterAction.appendText; + } + } + if (action) { + if (action === IndentAction.Indent) { + indentation = shiftIndent(config, indentation); + } + if (action === IndentAction.Outdent) { + indentation = unshiftIndent(config, indentation); + } + indentation = config.normalizeIndentation(indentation); + } + if (!indentation) { + return null; + } + return indentation; + } + + private static _replaceJumpToNextIndent(config: CursorConfiguration, model: ICursorSimpleModel, selection: Selection, insertsAutoWhitespace: boolean): ReplaceCommand { + let typeText = ''; + const position = selection.getStartPosition(); + if (config.insertSpaces) { + const visibleColumnFromColumn = config.visibleColumnFromColumn(model, position); + const indentSize = config.indentSize; + const spacesCnt = indentSize - (visibleColumnFromColumn % indentSize); + for (let i = 0; i < spacesCnt; i++) { + typeText += ' '; + } + } else { + typeText = '\t'; + } + return new ReplaceCommand(selection, typeText, insertsAutoWhitespace); + } +} + +export class TypeWithAutoClosingCommand extends ReplaceCommandWithOffsetCursorState { + + private readonly _openCharacter: string; + private readonly _closeCharacter: string; + public closeCharacterRange: Range | null; + public enclosingRange: Range | null; + + constructor(selection: Selection, openCharacter: string, insertOpenCharacter: boolean, closeCharacter: string) { + super(selection, (insertOpenCharacter ? openCharacter : '') + closeCharacter, 0, -closeCharacter.length); + this._openCharacter = openCharacter; + this._closeCharacter = closeCharacter; + this.closeCharacterRange = null; + this.enclosingRange = null; + } + + public override computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection { + const inverseEditOperations = helper.getInverseEditOperations(); + const range = inverseEditOperations[0].range; + this.closeCharacterRange = new Range(range.startLineNumber, range.endColumn - this._closeCharacter.length, range.endLineNumber, range.endColumn); + this.enclosingRange = new Range(range.startLineNumber, range.endColumn - this._openCharacter.length - this._closeCharacter.length, range.endLineNumber, range.endColumn); + return super.computeCursorState(model, helper); + } +} + +function getTypingOperation(typedText: string, previousTypingOperation: EditOperationType): EditOperationType { + if (typedText === ' ') { + return previousTypingOperation === EditOperationType.TypingFirstSpace + || previousTypingOperation === EditOperationType.TypingConsecutiveSpace + ? EditOperationType.TypingConsecutiveSpace + : EditOperationType.TypingFirstSpace; + } + + return EditOperationType.TypingOther; +} + +function shouldPushStackElementBetween(previousTypingOperation: EditOperationType, typingOperation: EditOperationType): boolean { + if (isTypingOperation(previousTypingOperation) && !isTypingOperation(typingOperation)) { + // Always set an undo stop before non-type operations + return true; + } + if (previousTypingOperation === EditOperationType.TypingFirstSpace) { + // `abc |d`: No undo stop + // `abc |d`: Undo stop + return false; + } + // Insert undo stop between different operation types + return normalizeOperationType(previousTypingOperation) !== normalizeOperationType(typingOperation); +} + +function normalizeOperationType(type: EditOperationType): EditOperationType | 'space' { + return (type === EditOperationType.TypingConsecutiveSpace || type === EditOperationType.TypingFirstSpace) + ? 'space' + : type; +} + +function isTypingOperation(type: EditOperationType): boolean { + return type === EditOperationType.TypingOther + || type === EditOperationType.TypingFirstSpace + || type === EditOperationType.TypingConsecutiveSpace; +} + +function isAutoClosingOvertype(config: CursorConfiguration, model: ITextModel, selections: Selection[], autoClosedCharacters: Range[], ch: string): boolean { + if (config.autoClosingOvertype === 'never') { + return false; + } + if (!config.autoClosingPairs.autoClosingPairsCloseSingleChar.has(ch)) { + return false; + } + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + if (!selection.isEmpty()) { + return false; + } + const position = selection.getPosition(); + const lineText = model.getLineContent(position.lineNumber); + const afterCharacter = lineText.charAt(position.column - 1); + if (afterCharacter !== ch) { + return false; + } + // Do not over-type quotes after a backslash + const chIsQuote = isQuote(ch); + const beforeCharacter = position.column > 2 ? lineText.charCodeAt(position.column - 2) : CharCode.Null; + if (beforeCharacter === CharCode.Backslash && chIsQuote) { + return false; + } + // Must over-type a closing character typed by the editor + if (config.autoClosingOvertype === 'auto') { + let found = false; + for (let j = 0, lenJ = autoClosedCharacters.length; j < lenJ; j++) { + const autoClosedCharacter = autoClosedCharacters[j]; + if (position.lineNumber === autoClosedCharacter.startLineNumber && position.column === autoClosedCharacter.startColumn) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + } + return true; +} + +function typeCommand(range: Range, text: string, keepPosition: boolean): ICommand { + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range, text, true); + } else { + return new ReplaceCommand(range, text, true); + } +} + +export function shiftIndent(config: CursorConfiguration, indentation: string, count?: number): string { + count = count || 1; + return ShiftCommand.shiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces); +} + +export function unshiftIndent(config: CursorConfiguration, indentation: string, count?: number): string { + count = count || 1; + return ShiftCommand.unshiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces); +} + +export function shouldSurroundChar(config: CursorConfiguration, ch: string): boolean { + if (isQuote(ch)) { + return (config.autoSurround === 'quotes' || config.autoSurround === 'languageDefined'); + } else { + // Character is a bracket + return (config.autoSurround === 'brackets' || config.autoSurround === 'languageDefined'); + } +} diff --git a/src/vs/editor/common/cursor/cursorTypeOperations.ts b/src/vs/editor/common/cursor/cursorTypeOperations.ts index ffa80cbb63ca7..b4c65156f8511 100644 --- a/src/vs/editor/common/cursor/cursorTypeOperations.ts +++ b/src/vs/editor/common/cursor/cursorTypeOperations.ts @@ -3,26 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CharCode } from 'vs/base/common/charCode'; -import { onUnexpectedError } from 'vs/base/common/errors'; -import * as strings from 'vs/base/common/strings'; -import { ReplaceCommand, ReplaceCommandWithOffsetCursorState, ReplaceCommandWithoutChangingPosition, ReplaceCommandThatPreservesSelection } from 'vs/editor/common/commands/replaceCommand'; import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; -import { CompositionSurroundSelectionCommand, SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; +import { CompositionSurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { CursorConfiguration, EditOperationResult, EditOperationType, ICursorSimpleModel, isQuote } from 'vs/editor/common/cursorCommon'; -import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { Position } from 'vs/editor/common/core/position'; -import { ICommand, ICursorStateComputerData } from 'vs/editor/common/editorCommon'; +import { ICommand } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { EnterAction, IndentAction, StandardAutoClosingPairConditional } from 'vs/editor/common/languages/languageConfiguration'; -import { getIndentationAtPosition } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { IElectricAction } from 'vs/editor/common/languages/supports/electricCharacter'; -import { EditorAutoClosingStrategy, EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions'; -import { createScopedLineTokens } from 'vs/editor/common/languages/supports'; -import { getIndentActionForType, getIndentForEnter, getInheritIndentForLine } from 'vs/editor/common/languages/autoIndent'; -import { getEnterAction } from 'vs/editor/common/languages/enterAction'; +import { AutoClosingOpenCharTypeOperation, AutoClosingOvertypeOperation, AutoClosingOvertypeWithInterceptorsOperation, AutoIndentOperation, CompositionOperation, EnterOperation, InterceptorElectricCharOperation, PasteOperation, shiftIndent, shouldSurroundChar, SimpleCharacterTypeOperation, SurroundSelectionOperation, TabOperation, TypeWithoutInterceptorsOperation, unshiftIndent } from 'vs/editor/common/cursor/cursorTypeEditOperations'; export class TypeOperations { @@ -61,777 +50,23 @@ export class TypeOperations { } public static shiftIndent(config: CursorConfiguration, indentation: string, count?: number): string { - count = count || 1; - return ShiftCommand.shiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces); + return shiftIndent(config, indentation, count); } public static unshiftIndent(config: CursorConfiguration, indentation: string, count?: number): string { - count = count || 1; - return ShiftCommand.unshiftIndent(indentation, indentation.length + count, config.tabSize, config.indentSize, config.insertSpaces); - } - - private static _distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string[]): EditOperationResult { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = new ReplaceCommand(selections[i], text[i]); - } - return new EditOperationResult(EditOperationType.Other, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - }); - } - - private static _simplePaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean): EditOperationResult { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - const selection = selections[i]; - const position = selection.getPosition(); - - if (pasteOnNewLine && !selection.isEmpty()) { - pasteOnNewLine = false; - } - if (pasteOnNewLine && text.indexOf('\n') !== text.length - 1) { - pasteOnNewLine = false; - } - - if (pasteOnNewLine) { - // Paste entire line at the beginning of line - const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, 1); - commands[i] = new ReplaceCommandThatPreservesSelection(typeSelection, text, selection, true); - } else { - commands[i] = new ReplaceCommand(selection, text); - } - } - return new EditOperationResult(EditOperationType.Other, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - }); - } - - private static _distributePasteToCursors(config: CursorConfiguration, selections: Selection[], text: string, pasteOnNewLine: boolean, multicursorText: string[]): string[] | null { - if (pasteOnNewLine) { - return null; - } - - if (selections.length === 1) { - return null; - } - - if (multicursorText && multicursorText.length === selections.length) { - return multicursorText; - } - - if (config.multiCursorPaste === 'spread') { - // Try to spread the pasted text in case the line count matches the cursor count - // Remove trailing \n if present - if (text.charCodeAt(text.length - 1) === CharCode.LineFeed) { - text = text.substr(0, text.length - 1); - } - // Remove trailing \r if present - if (text.charCodeAt(text.length - 1) === CharCode.CarriageReturn) { - text = text.substr(0, text.length - 1); - } - const lines = strings.splitLines(text); - if (lines.length === selections.length) { - return lines; - } - } - - return null; + return unshiftIndent(config, indentation, count); } public static paste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean, multicursorText: string[]): EditOperationResult { - const distributedPaste = this._distributePasteToCursors(config, selections, text, pasteOnNewLine, multicursorText); - - if (distributedPaste) { - selections = selections.sort(Range.compareRangesUsingStarts); - return this._distributedPaste(config, model, selections, distributedPaste); - } else { - return this._simplePaste(config, model, selections, text, pasteOnNewLine); - } - } - - private static _goodIndentForLine(config: CursorConfiguration, model: ITextModel, lineNumber: number): string | null { - let action: IndentAction | EnterAction | null = null; - let indentation: string = ''; - - const expectedIndentAction = getInheritIndentForLine(config.autoIndent, model, lineNumber, false, config.languageConfigurationService); - if (expectedIndentAction) { - action = expectedIndentAction.action; - indentation = expectedIndentAction.indentation; - } else if (lineNumber > 1) { - let lastLineNumber: number; - for (lastLineNumber = lineNumber - 1; lastLineNumber >= 1; lastLineNumber--) { - const lineText = model.getLineContent(lastLineNumber); - const nonWhitespaceIdx = strings.lastNonWhitespaceIndex(lineText); - if (nonWhitespaceIdx >= 0) { - break; - } - } - - if (lastLineNumber < 1) { - // No previous line with content found - return null; - } - - const maxColumn = model.getLineMaxColumn(lastLineNumber); - const expectedEnterAction = getEnterAction(config.autoIndent, model, new Range(lastLineNumber, maxColumn, lastLineNumber, maxColumn), config.languageConfigurationService); - if (expectedEnterAction) { - indentation = expectedEnterAction.indentation + expectedEnterAction.appendText; - } - } - - if (action) { - if (action === IndentAction.Indent) { - indentation = TypeOperations.shiftIndent(config, indentation); - } - - if (action === IndentAction.Outdent) { - indentation = TypeOperations.unshiftIndent(config, indentation); - } - - indentation = config.normalizeIndentation(indentation); - } - - if (!indentation) { - return null; - } - - return indentation; - } - - private static _replaceJumpToNextIndent(config: CursorConfiguration, model: ICursorSimpleModel, selection: Selection, insertsAutoWhitespace: boolean): ReplaceCommand { - let typeText = ''; - - const position = selection.getStartPosition(); - if (config.insertSpaces) { - const visibleColumnFromColumn = config.visibleColumnFromColumn(model, position); - const indentSize = config.indentSize; - const spacesCnt = indentSize - (visibleColumnFromColumn % indentSize); - for (let i = 0; i < spacesCnt; i++) { - typeText += ' '; - } - } else { - typeText = '\t'; - } - - return new ReplaceCommand(selection, typeText, insertsAutoWhitespace); + return PasteOperation.getEdits(config, model, selections, text, pasteOnNewLine, multicursorText); } public static tab(config: CursorConfiguration, model: ITextModel, selections: Selection[]): ICommand[] { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - const selection = selections[i]; - - if (selection.isEmpty()) { - - const lineText = model.getLineContent(selection.startLineNumber); - - if (/^\s*$/.test(lineText) && model.tokenization.isCheapToTokenize(selection.startLineNumber)) { - let goodIndent = this._goodIndentForLine(config, model, selection.startLineNumber); - goodIndent = goodIndent || '\t'; - const possibleTypeText = config.normalizeIndentation(goodIndent); - if (!lineText.startsWith(possibleTypeText)) { - commands[i] = new ReplaceCommand(new Range(selection.startLineNumber, 1, selection.startLineNumber, lineText.length + 1), possibleTypeText, true); - continue; - } - } - - commands[i] = this._replaceJumpToNextIndent(config, model, selection, true); - } else { - if (selection.startLineNumber === selection.endLineNumber) { - const lineMaxColumn = model.getLineMaxColumn(selection.startLineNumber); - if (selection.startColumn !== 1 || selection.endColumn !== lineMaxColumn) { - // This is a single line selection that is not the entire line - commands[i] = this._replaceJumpToNextIndent(config, model, selection, false); - continue; - } - } - - commands[i] = new ShiftCommand(selection, { - isUnshift: false, - tabSize: config.tabSize, - indentSize: config.indentSize, - insertSpaces: config.insertSpaces, - useTabStops: config.useTabStops, - autoIndent: config.autoIndent - }, config.languageConfigurationService); - } - } - return commands; + return TabOperation.getCommands(config, model, selections); } public static compositionType(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number): EditOperationResult { - const commands = selections.map(selection => this._compositionType(model, selection, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta)); - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, EditOperationType.TypingOther), - shouldPushStackElementAfter: false - }); - } - - private static _compositionType(model: ITextModel, selection: Selection, text: string, replacePrevCharCnt: number, replaceNextCharCnt: number, positionDelta: number): ICommand | null { - if (!selection.isEmpty()) { - // looks like https://github.com/microsoft/vscode/issues/2773 - // where a cursor operation occurred before a canceled composition - // => ignore composition - return null; - } - const pos = selection.getPosition(); - const startColumn = Math.max(1, pos.column - replacePrevCharCnt); - const endColumn = Math.min(model.getLineMaxColumn(pos.lineNumber), pos.column + replaceNextCharCnt); - const range = new Range(pos.lineNumber, startColumn, pos.lineNumber, endColumn); - const oldText = model.getValueInRange(range); - if (oldText === text && positionDelta === 0) { - // => ignore composition that doesn't do anything - return null; - } - return new ReplaceCommandWithOffsetCursorState(range, text, 0, positionDelta); - } - - private static _typeCommand(range: Range, text: string, keepPosition: boolean): ICommand { - if (keepPosition) { - return new ReplaceCommandWithoutChangingPosition(range, text, true); - } else { - return new ReplaceCommand(range, text, true); - } - } - - private static _enter(config: CursorConfiguration, model: ITextModel, keepPosition: boolean, range: Range): ICommand { - if (config.autoIndent === EditorAutoIndentStrategy.None) { - return TypeOperations._typeCommand(range, '\n', keepPosition); - } - if (!model.tokenization.isCheapToTokenize(range.getStartPosition().lineNumber) || config.autoIndent === EditorAutoIndentStrategy.Keep) { - const lineText = model.getLineContent(range.startLineNumber); - const indentation = strings.getLeadingWhitespace(lineText).substring(0, range.startColumn - 1); - return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(indentation), keepPosition); - } - - const r = getEnterAction(config.autoIndent, model, range, config.languageConfigurationService); - if (r) { - if (r.indentAction === IndentAction.None) { - // Nothing special - return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(r.indentation + r.appendText), keepPosition); - - } else if (r.indentAction === IndentAction.Indent) { - // Indent once - return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(r.indentation + r.appendText), keepPosition); - - } else if (r.indentAction === IndentAction.IndentOutdent) { - // Ultra special - const normalIndent = config.normalizeIndentation(r.indentation); - const increasedIndent = config.normalizeIndentation(r.indentation + r.appendText); - - const typeText = '\n' + increasedIndent + '\n' + normalIndent; - - if (keepPosition) { - return new ReplaceCommandWithoutChangingPosition(range, typeText, true); - } else { - return new ReplaceCommandWithOffsetCursorState(range, typeText, -1, increasedIndent.length - normalIndent.length, true); - } - } else if (r.indentAction === IndentAction.Outdent) { - const actualIndentation = TypeOperations.unshiftIndent(config, r.indentation); - return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(actualIndentation + r.appendText), keepPosition); - } - } - - const lineText = model.getLineContent(range.startLineNumber); - const indentation = strings.getLeadingWhitespace(lineText).substring(0, range.startColumn - 1); - - if (config.autoIndent >= EditorAutoIndentStrategy.Full) { - const ir = getIndentForEnter(config.autoIndent, model, range, { - unshiftIndent: (indent) => { - return TypeOperations.unshiftIndent(config, indent); - }, - shiftIndent: (indent) => { - return TypeOperations.shiftIndent(config, indent); - }, - normalizeIndentation: (indent) => { - return config.normalizeIndentation(indent); - } - }, config.languageConfigurationService); - - if (ir) { - let oldEndViewColumn = config.visibleColumnFromColumn(model, range.getEndPosition()); - const oldEndColumn = range.endColumn; - const newLineContent = model.getLineContent(range.endLineNumber); - const firstNonWhitespace = strings.firstNonWhitespaceIndex(newLineContent); - if (firstNonWhitespace >= 0) { - range = range.setEndPosition(range.endLineNumber, Math.max(range.endColumn, firstNonWhitespace + 1)); - } else { - range = range.setEndPosition(range.endLineNumber, model.getLineMaxColumn(range.endLineNumber)); - } - - if (keepPosition) { - return new ReplaceCommandWithoutChangingPosition(range, '\n' + config.normalizeIndentation(ir.afterEnter), true); - } else { - let offset = 0; - if (oldEndColumn <= firstNonWhitespace + 1) { - if (!config.insertSpaces) { - oldEndViewColumn = Math.ceil(oldEndViewColumn / config.indentSize); - } - offset = Math.min(oldEndViewColumn + 1 - config.normalizeIndentation(ir.afterEnter).length - 1, 0); - } - return new ReplaceCommandWithOffsetCursorState(range, '\n' + config.normalizeIndentation(ir.afterEnter), 0, offset, true); - } - } - } - - return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(indentation), keepPosition); - } - - private static _isAutoIndentType(config: CursorConfiguration, model: ITextModel, selections: Selection[]): boolean { - if (config.autoIndent < EditorAutoIndentStrategy.Full) { - return false; - } - - for (let i = 0, len = selections.length; i < len; i++) { - if (!model.tokenization.isCheapToTokenize(selections[i].getEndPosition().lineNumber)) { - return false; - } - } - - return true; - } - - private static _runAutoIndentType(config: CursorConfiguration, model: ITextModel, range: Range, ch: string): ICommand | null { - const currentIndentation = getIndentationAtPosition(model, range.startLineNumber, range.startColumn); - const actualIndentation = getIndentActionForType(config.autoIndent, model, range, ch, { - shiftIndent: (indentation) => { - return TypeOperations.shiftIndent(config, indentation); - }, - unshiftIndent: (indentation) => { - return TypeOperations.unshiftIndent(config, indentation); - }, - }, config.languageConfigurationService); - - if (actualIndentation === null) { - return null; - } - - if (actualIndentation !== config.normalizeIndentation(currentIndentation)) { - const firstNonWhitespace = model.getLineFirstNonWhitespaceColumn(range.startLineNumber); - if (firstNonWhitespace === 0) { - return TypeOperations._typeCommand( - new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn), - config.normalizeIndentation(actualIndentation) + ch, - false - ); - } else { - return TypeOperations._typeCommand( - new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn), - config.normalizeIndentation(actualIndentation) + - model.getLineContent(range.startLineNumber).substring(firstNonWhitespace - 1, range.startColumn - 1) + ch, - false - ); - } - } - - return null; - } - - private static _isAutoClosingOvertype(config: CursorConfiguration, model: ITextModel, selections: Selection[], autoClosedCharacters: Range[], ch: string): boolean { - if (config.autoClosingOvertype === 'never') { - return false; - } - - if (!config.autoClosingPairs.autoClosingPairsCloseSingleChar.has(ch)) { - return false; - } - - for (let i = 0, len = selections.length; i < len; i++) { - const selection = selections[i]; - - if (!selection.isEmpty()) { - return false; - } - - const position = selection.getPosition(); - const lineText = model.getLineContent(position.lineNumber); - const afterCharacter = lineText.charAt(position.column - 1); - - if (afterCharacter !== ch) { - return false; - } - - // Do not over-type quotes after a backslash - const chIsQuote = isQuote(ch); - const beforeCharacter = position.column > 2 ? lineText.charCodeAt(position.column - 2) : CharCode.Null; - if (beforeCharacter === CharCode.Backslash && chIsQuote) { - return false; - } - - // Must over-type a closing character typed by the editor - if (config.autoClosingOvertype === 'auto') { - let found = false; - for (let j = 0, lenJ = autoClosedCharacters.length; j < lenJ; j++) { - const autoClosedCharacter = autoClosedCharacters[j]; - if (position.lineNumber === autoClosedCharacter.startLineNumber && position.column === autoClosedCharacter.startColumn) { - found = true; - break; - } - } - if (!found) { - return false; - } - } - } - - return true; - } - - private static _runAutoClosingOvertype(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string): EditOperationResult { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - const selection = selections[i]; - const position = selection.getPosition(); - const typeSelection = new Range(position.lineNumber, position.column, position.lineNumber, position.column + 1); - commands[i] = new ReplaceCommand(typeSelection, ch); - } - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, EditOperationType.TypingOther), - shouldPushStackElementAfter: false - }); - } - - private static _isBeforeClosingBrace(config: CursorConfiguration, lineAfter: string) { - // If the start of lineAfter can be interpretted as both a starting or ending brace, default to returning false - const nextChar = lineAfter.charAt(0); - const potentialStartingBraces = config.autoClosingPairs.autoClosingPairsOpenByStart.get(nextChar) || []; - const potentialClosingBraces = config.autoClosingPairs.autoClosingPairsCloseByStart.get(nextChar) || []; - - const isBeforeStartingBrace = potentialStartingBraces.some(x => lineAfter.startsWith(x.open)); - const isBeforeClosingBrace = potentialClosingBraces.some(x => lineAfter.startsWith(x.close)); - - return !isBeforeStartingBrace && isBeforeClosingBrace; - } - - /** - * Determine if typing `ch` at all `positions` in the `model` results in an - * auto closing open sequence being typed. - * - * Auto closing open sequences can consist of multiple characters, which - * can lead to ambiguities. In such a case, the longest auto-closing open - * sequence is returned. - */ - private static _findAutoClosingPairOpen(config: CursorConfiguration, model: ITextModel, positions: Position[], ch: string): StandardAutoClosingPairConditional | null { - const candidates = config.autoClosingPairs.autoClosingPairsOpenByEnd.get(ch); - if (!candidates) { - return null; - } - - // Determine which auto-closing pair it is - let result: StandardAutoClosingPairConditional | null = null; - for (const candidate of candidates) { - if (result === null || candidate.open.length > result.open.length) { - let candidateIsMatch = true; - for (const position of positions) { - const relevantText = model.getValueInRange(new Range(position.lineNumber, position.column - candidate.open.length + 1, position.lineNumber, position.column)); - if (relevantText + ch !== candidate.open) { - candidateIsMatch = false; - break; - } - } - - if (candidateIsMatch) { - result = candidate; - } - } - } - return result; - } - - /** - * Find another auto-closing pair that is contained by the one passed in. - * - * e.g. when having [(,)] and [(*,*)] as auto-closing pairs - * this method will find [(,)] as a containment pair for [(*,*)] - */ - private static _findContainedAutoClosingPair(config: CursorConfiguration, pair: StandardAutoClosingPairConditional): StandardAutoClosingPairConditional | null { - if (pair.open.length <= 1) { - return null; - } - const lastChar = pair.close.charAt(pair.close.length - 1); - // get candidates with the same last character as close - const candidates = config.autoClosingPairs.autoClosingPairsCloseByEnd.get(lastChar) || []; - let result: StandardAutoClosingPairConditional | null = null; - for (const candidate of candidates) { - if (candidate.open !== pair.open && pair.open.includes(candidate.open) && pair.close.endsWith(candidate.close)) { - if (!result || candidate.open.length > result.open.length) { - result = candidate; - } - } - } - return result; - } - - private static _getAutoClosingPairClose(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean): string | null { - - for (const selection of selections) { - if (!selection.isEmpty()) { - return null; - } - } - - // This method is called both when typing (regularly) and when composition ends - // This means that we need to work with a text buffer where sometimes `ch` is not - // there (it is being typed right now) or with a text buffer where `ch` has already been typed - // - // In order to avoid adding checks for `chIsAlreadyTyped` in all places, we will work - // with two conceptual positions, the position before `ch` and the position after `ch` - // - const positions: { lineNumber: number; beforeColumn: number; afterColumn: number }[] = selections.map((s) => { - const position = s.getPosition(); - if (chIsAlreadyTyped) { - return { lineNumber: position.lineNumber, beforeColumn: position.column - ch.length, afterColumn: position.column }; - } else { - return { lineNumber: position.lineNumber, beforeColumn: position.column, afterColumn: position.column }; - } - }); - - - // Find the longest auto-closing open pair in case of multiple ending in `ch` - // e.g. when having [f","] and [","], it picks [f","] if the character before is f - const pair = this._findAutoClosingPairOpen(config, model, positions.map(p => new Position(p.lineNumber, p.beforeColumn)), ch); - if (!pair) { - return null; - } - - let autoCloseConfig: EditorAutoClosingStrategy; - let shouldAutoCloseBefore: (ch: string) => boolean; - - const chIsQuote = isQuote(ch); - if (chIsQuote) { - autoCloseConfig = config.autoClosingQuotes; - shouldAutoCloseBefore = config.shouldAutoCloseBefore.quote; - } else { - const pairIsForComments = config.blockCommentStartToken ? pair.open.includes(config.blockCommentStartToken) : false; - if (pairIsForComments) { - autoCloseConfig = config.autoClosingComments; - shouldAutoCloseBefore = config.shouldAutoCloseBefore.comment; - } else { - autoCloseConfig = config.autoClosingBrackets; - shouldAutoCloseBefore = config.shouldAutoCloseBefore.bracket; - } - } - - if (autoCloseConfig === 'never') { - return null; - } - - // Sometimes, it is possible to have two auto-closing pairs that have a containment relationship - // e.g. when having [(,)] and [(*,*)] - // - when typing (, the resulting state is (|) - // - when typing *, the desired resulting state is (*|*), not (*|*)) - const containedPair = this._findContainedAutoClosingPair(config, pair); - const containedPairClose = containedPair ? containedPair.close : ''; - let isContainedPairPresent = true; - - for (const position of positions) { - const { lineNumber, beforeColumn, afterColumn } = position; - const lineText = model.getLineContent(lineNumber); - const lineBefore = lineText.substring(0, beforeColumn - 1); - const lineAfter = lineText.substring(afterColumn - 1); - - if (!lineAfter.startsWith(containedPairClose)) { - isContainedPairPresent = false; - } - - // Only consider auto closing the pair if an allowed character follows or if another autoclosed pair closing brace follows - if (lineAfter.length > 0) { - const characterAfter = lineAfter.charAt(0); - const isBeforeCloseBrace = TypeOperations._isBeforeClosingBrace(config, lineAfter); - - if (!isBeforeCloseBrace && !shouldAutoCloseBefore(characterAfter)) { - return null; - } - } - - // Do not auto-close ' or " after a word character - if (pair.open.length === 1 && (ch === '\'' || ch === '"') && autoCloseConfig !== 'always') { - const wordSeparators = getMapForWordSeparators(config.wordSeparators, []); - if (lineBefore.length > 0) { - const characterBefore = lineBefore.charCodeAt(lineBefore.length - 1); - if (wordSeparators.get(characterBefore) === WordCharacterClass.Regular) { - return null; - } - } - } - - if (!model.tokenization.isCheapToTokenize(lineNumber)) { - // Do not force tokenization - return null; - } - - model.tokenization.forceTokenization(lineNumber); - const lineTokens = model.tokenization.getLineTokens(lineNumber); - const scopedLineTokens = createScopedLineTokens(lineTokens, beforeColumn - 1); - if (!pair.shouldAutoClose(scopedLineTokens, beforeColumn - scopedLineTokens.firstCharOffset)) { - return null; - } - - // Typing for example a quote could either start a new string, in which case auto-closing is desirable - // or it could end a previously started string, in which case auto-closing is not desirable - // - // In certain cases, it is really not possible to look at the previous token to determine - // what would happen. That's why we do something really unusual, we pretend to type a different - // character and ask the tokenizer what the outcome of doing that is: after typing a neutral - // character, are we in a string (i.e. the quote would most likely end a string) or not? - // - const neutralCharacter = pair.findNeutralCharacter(); - if (neutralCharacter) { - const tokenType = model.tokenization.getTokenTypeIfInsertingCharacter(lineNumber, beforeColumn, neutralCharacter); - if (!pair.isOK(tokenType)) { - return null; - } - } - } - - if (isContainedPairPresent) { - return pair.close.substring(0, pair.close.length - containedPairClose.length); - } else { - return pair.close; - } - } - - private static _runAutoClosingOpenCharType(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean, autoClosingPairClose: string): EditOperationResult { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - const selection = selections[i]; - commands[i] = new TypeWithAutoClosingCommand(selection, ch, !chIsAlreadyTyped, autoClosingPairClose); - } - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false - }); - } - - private static _shouldSurroundChar(config: CursorConfiguration, ch: string): boolean { - if (isQuote(ch)) { - return (config.autoSurround === 'quotes' || config.autoSurround === 'languageDefined'); - } else { - // Character is a bracket - return (config.autoSurround === 'brackets' || config.autoSurround === 'languageDefined'); - } - } - - private static _isSurroundSelectionType(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string): boolean { - if (!TypeOperations._shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) { - return false; - } - - const isTypingAQuoteCharacter = isQuote(ch); - - for (const selection of selections) { - - if (selection.isEmpty()) { - return false; - } - - let selectionContainsOnlyWhitespace = true; - - for (let lineNumber = selection.startLineNumber; lineNumber <= selection.endLineNumber; lineNumber++) { - const lineText = model.getLineContent(lineNumber); - const startIndex = (lineNumber === selection.startLineNumber ? selection.startColumn - 1 : 0); - const endIndex = (lineNumber === selection.endLineNumber ? selection.endColumn - 1 : lineText.length); - const selectedText = lineText.substring(startIndex, endIndex); - if (/[^ \t]/.test(selectedText)) { - // this selected text contains something other than whitespace - selectionContainsOnlyWhitespace = false; - break; - } - } - - if (selectionContainsOnlyWhitespace) { - return false; - } - - if (isTypingAQuoteCharacter && selection.startLineNumber === selection.endLineNumber && selection.startColumn + 1 === selection.endColumn) { - const selectionText = model.getValueInRange(selection); - if (isQuote(selectionText)) { - // Typing a quote character on top of another quote character - // => disable surround selection type - return false; - } - } - } - - return true; - } - - private static _runSurroundSelectionType(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string): EditOperationResult { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - const selection = selections[i]; - const closeCharacter = config.surroundingPairs[ch]; - commands[i] = new SurroundSelectionCommand(selection, ch, closeCharacter); - } - return new EditOperationResult(EditOperationType.Other, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - }); - } - - private static _isTypeInterceptorElectricChar(config: CursorConfiguration, model: ITextModel, selections: Selection[]) { - if (selections.length === 1 && model.tokenization.isCheapToTokenize(selections[0].getEndPosition().lineNumber)) { - return true; - } - return false; - } - - private static _typeInterceptorElectricChar(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selection: Selection, ch: string): EditOperationResult | null { - if (!config.electricChars.hasOwnProperty(ch) || !selection.isEmpty()) { - return null; - } - - const position = selection.getPosition(); - model.tokenization.forceTokenization(position.lineNumber); - const lineTokens = model.tokenization.getLineTokens(position.lineNumber); - - let electricAction: IElectricAction | null; - try { - electricAction = config.onElectricCharacter(ch, lineTokens, position.column); - } catch (e) { - onUnexpectedError(e); - return null; - } - - if (!electricAction) { - return null; - } - - if (electricAction.matchOpenBracket) { - const endColumn = (lineTokens.getLineContent() + ch).lastIndexOf(electricAction.matchOpenBracket) + 1; - const match = model.bracketPairs.findMatchingBracketUp(electricAction.matchOpenBracket, { - lineNumber: position.lineNumber, - column: endColumn - }, 500 /* give at most 500ms to compute */); - - if (match) { - if (match.startLineNumber === position.lineNumber) { - // matched something on the same line => no change in indentation - return null; - } - const matchLine = model.getLineContent(match.startLineNumber); - const matchLineIndentation = strings.getLeadingWhitespace(matchLine); - const newIndentation = config.normalizeIndentation(matchLineIndentation); - - const lineText = model.getLineContent(position.lineNumber); - const lineFirstNonBlankColumn = model.getLineFirstNonWhitespaceColumn(position.lineNumber) || position.column; - - const prefix = lineText.substring(lineFirstNonBlankColumn - 1, position.column - 1); - const typeText = newIndentation + prefix + ch; - - const typeSelection = new Range(position.lineNumber, 1, position.lineNumber, position.column); - - const command = new ReplaceCommand(typeSelection, typeText); - return new EditOperationResult(getTypingOperation(typeText, prevEditOperationType), [command], { - shouldPushStackElementBefore: false, - shouldPushStackElementAfter: true - }); - } - } - - return null; + return CompositionOperation.getEdits(prevEditOperationType, config, model, selections, text, replacePrevCharCnt, replaceNextCharCnt, positionDelta); } /** @@ -871,7 +106,7 @@ export class TypeOperations { if (hasDeletion) { // Check if this could have been a surround selection - if (!TypeOperations._shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) { + if (!shouldSurroundChar(config, ch) || !config.surroundingPairs.hasOwnProperty(ch)) { return null; } @@ -914,18 +149,14 @@ export class TypeOperations { }); } - if (this._isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) { - // Unfortunately, the close character is at this point "doubled", so we need to delete it... - const commands = selections.map(s => new ReplaceCommand(new Range(s.positionLineNumber, s.positionColumn, s.positionLineNumber, s.positionColumn + 1), '', false)); - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false - }); + const autoClosingOvertypeEdits = AutoClosingOvertypeWithInterceptorsOperation.getEdits(config, model, selections, autoClosedCharacters, ch); + if (autoClosingOvertypeEdits !== undefined) { + return autoClosingOvertypeEdits; } - const autoClosingPairClose = this._getAutoClosingPairClose(config, model, selections, ch, true); - if (autoClosingPairClose !== null) { - return this._runAutoClosingOpenCharType(prevEditOperationType, config, model, selections, ch, true, autoClosingPairClose); + const autoClosingOpenCharEdits = AutoClosingOpenCharTypeOperation.getEdits(config, model, selections, ch, true, false); + if (autoClosingOpenCharEdits !== undefined) { + return autoClosingOpenCharEdits; } return null; @@ -933,149 +164,41 @@ export class TypeOperations { public static typeWithInterceptors(isDoingComposition: boolean, prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], autoClosedCharacters: Range[], ch: string): EditOperationResult { - if (!isDoingComposition && ch === '\n') { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = TypeOperations._enter(config, model, false, selections[i]); - } - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false, - }); + const enterEdits = EnterOperation.getEdits(config, model, selections, ch, isDoingComposition); + if (enterEdits !== undefined) { + return enterEdits; } - if (!isDoingComposition && this._isAutoIndentType(config, model, selections)) { - const commands: Array = []; - let autoIndentFails = false; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = this._runAutoIndentType(config, model, selections[i], ch); - if (!commands[i]) { - autoIndentFails = true; - break; - } - } - if (!autoIndentFails) { - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false, - }); - } + const autoIndentEdits = AutoIndentOperation.getEdits(config, model, selections, ch, isDoingComposition); + if (autoIndentEdits !== undefined) { + return autoIndentEdits; } - if (this._isAutoClosingOvertype(config, model, selections, autoClosedCharacters, ch)) { - return this._runAutoClosingOvertype(prevEditOperationType, config, model, selections, ch); + const autoClosingOverTypeEdits = AutoClosingOvertypeOperation.getEdits(prevEditOperationType, config, model, selections, autoClosedCharacters, ch); + if (autoClosingOverTypeEdits !== undefined) { + return autoClosingOverTypeEdits; } - if (!isDoingComposition) { - const autoClosingPairClose = this._getAutoClosingPairClose(config, model, selections, ch, false); - if (autoClosingPairClose) { - return this._runAutoClosingOpenCharType(prevEditOperationType, config, model, selections, ch, false, autoClosingPairClose); - } + const autoClosingOpenCharEdits = AutoClosingOpenCharTypeOperation.getEdits(config, model, selections, ch, false, isDoingComposition); + if (autoClosingOpenCharEdits !== undefined) { + return autoClosingOpenCharEdits; } - if (!isDoingComposition && this._isSurroundSelectionType(config, model, selections, ch)) { - return this._runSurroundSelectionType(prevEditOperationType, config, model, selections, ch); + const surroundSelectionEdits = SurroundSelectionOperation.getEdits(config, model, selections, ch, isDoingComposition); + if (surroundSelectionEdits !== undefined) { + return surroundSelectionEdits; } - // Electric characters make sense only when dealing with a single cursor, - // as multiple cursors typing brackets for example would interfer with bracket matching - if (!isDoingComposition && this._isTypeInterceptorElectricChar(config, model, selections)) { - const r = this._typeInterceptorElectricChar(prevEditOperationType, config, model, selections[0], ch); - if (r) { - return r; - } + const interceptorElectricCharOperation = InterceptorElectricCharOperation.getEdits(prevEditOperationType, config, model, selections, ch, isDoingComposition); + if (interceptorElectricCharOperation !== undefined) { + return interceptorElectricCharOperation; } - // A simple character type - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = new ReplaceCommand(selections[i], ch); - } - - const opType = getTypingOperation(ch, prevEditOperationType); - return new EditOperationResult(opType, commands, { - shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType), - shouldPushStackElementAfter: false - }); + return SimpleCharacterTypeOperation.getEdits(prevEditOperationType, selections, ch); } public static typeWithoutInterceptors(prevEditOperationType: EditOperationType, config: CursorConfiguration, model: ITextModel, selections: Selection[], str: string): EditOperationResult { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = new ReplaceCommand(selections[i], str); - } - const opType = getTypingOperation(str, prevEditOperationType); - return new EditOperationResult(opType, commands, { - shouldPushStackElementBefore: shouldPushStackElementBetween(prevEditOperationType, opType), - shouldPushStackElementAfter: false - }); - } - - public static lineInsertBefore(config: CursorConfiguration, model: ITextModel | null, selections: Selection[] | null): ICommand[] { - if (model === null || selections === null) { - return []; - } - - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - let lineNumber = selections[i].positionLineNumber; - - if (lineNumber === 1) { - commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\n'); - } else { - lineNumber--; - const column = model.getLineMaxColumn(lineNumber); - - commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); - } - } - return commands; - } - - public static lineInsertAfter(config: CursorConfiguration, model: ITextModel | null, selections: Selection[] | null): ICommand[] { - if (model === null || selections === null) { - return []; - } - - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - const lineNumber = selections[i].positionLineNumber; - const column = model.getLineMaxColumn(lineNumber); - commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); - } - return commands; - } - - public static lineBreakInsert(config: CursorConfiguration, model: ITextModel, selections: Selection[]): ICommand[] { - const commands: ICommand[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = this._enter(config, model, true, selections[i]); - } - return commands; - } -} - -export class TypeWithAutoClosingCommand extends ReplaceCommandWithOffsetCursorState { - - private readonly _openCharacter: string; - private readonly _closeCharacter: string; - public closeCharacterRange: Range | null; - public enclosingRange: Range | null; - - constructor(selection: Selection, openCharacter: string, insertOpenCharacter: boolean, closeCharacter: string) { - super(selection, (insertOpenCharacter ? openCharacter : '') + closeCharacter, 0, -closeCharacter.length); - this._openCharacter = openCharacter; - this._closeCharacter = closeCharacter; - this.closeCharacterRange = null; - this.enclosingRange = null; - } - - public override computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection { - const inverseEditOperations = helper.getInverseEditOperations(); - const range = inverseEditOperations[0].range; - this.closeCharacterRange = new Range(range.startLineNumber, range.endColumn - this._closeCharacter.length, range.endLineNumber, range.endColumn); - this.enclosingRange = new Range(range.startLineNumber, range.endColumn - this._openCharacter.length - this._closeCharacter.length, range.endLineNumber, range.endColumn); - return super.computeCursorState(model, helper); + return TypeWithoutInterceptorsOperation.getEdits(prevEditOperationType, selections, str); } } @@ -1089,40 +212,3 @@ export class CompositionOutcome { public readonly insertedSelectionEnd: number, ) { } } - -function getTypingOperation(typedText: string, previousTypingOperation: EditOperationType): EditOperationType { - if (typedText === ' ') { - return previousTypingOperation === EditOperationType.TypingFirstSpace - || previousTypingOperation === EditOperationType.TypingConsecutiveSpace - ? EditOperationType.TypingConsecutiveSpace - : EditOperationType.TypingFirstSpace; - } - - return EditOperationType.TypingOther; -} - -function shouldPushStackElementBetween(previousTypingOperation: EditOperationType, typingOperation: EditOperationType): boolean { - if (isTypingOperation(previousTypingOperation) && !isTypingOperation(typingOperation)) { - // Always set an undo stop before non-type operations - return true; - } - if (previousTypingOperation === EditOperationType.TypingFirstSpace) { - // `abc |d`: No undo stop - // `abc |d`: Undo stop - return false; - } - // Insert undo stop between different operation types - return normalizeOperationType(previousTypingOperation) !== normalizeOperationType(typingOperation); -} - -function normalizeOperationType(type: EditOperationType): EditOperationType | 'space' { - return (type === EditOperationType.TypingConsecutiveSpace || type === EditOperationType.TypingFirstSpace) - ? 'space' - : type; -} - -function isTypingOperation(type: EditOperationType): boolean { - return type === EditOperationType.TypingOther - || type === EditOperationType.TypingFirstSpace - || type === EditOperationType.TypingConsecutiveSpace; -} diff --git a/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts b/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts index 45b3fafba7146..60601d1fcdd71 100644 --- a/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts @@ -11,6 +11,7 @@ import { ReplaceCommand, ReplaceCommandThatPreservesSelection, ReplaceCommandTha import { TrimTrailingWhitespaceCommand } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; +import { EnterOperation } from 'vs/editor/common/cursor/cursorTypeEditOperations'; import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -594,7 +595,7 @@ export class InsertLineBeforeAction extends EditorAction { return; } editor.pushUndoStop(); - editor.executeCommands(this.id, TypeOperations.lineInsertBefore(viewModel.cursorConfig, editor.getModel(), editor.getSelections())); + editor.executeCommands(this.id, EnterOperation.lineInsertBefore(viewModel.cursorConfig, editor.getModel(), editor.getSelections())); } } @@ -619,7 +620,7 @@ export class InsertLineAfterAction extends EditorAction { return; } editor.pushUndoStop(); - editor.executeCommands(this.id, TypeOperations.lineInsertAfter(viewModel.cursorConfig, editor.getModel(), editor.getSelections())); + editor.executeCommands(this.id, EnterOperation.lineInsertAfter(viewModel.cursorConfig, editor.getModel(), editor.getSelections())); } } From bc8fea78c6b5e266e66cd3b2f28fd071506ebabe Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 18 Jun 2024 16:01:59 +0200 Subject: [PATCH 296/755] Joh/uniform-impala (#216485) * add header to compare code editor part re https://github.com/microsoft/vscode-copilot/issues/5906 * hide header when having edits applied * add a command to discard edits --- .../browser/actions/chatCodeblockActions.ts | 27 ++++++- .../contrib/chat/browser/codeBlockPart.css | 14 ++++ .../contrib/chat/browser/codeBlockPart.ts | 76 +++++++++---------- 3 files changed, 78 insertions(+), 39 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts index 6d9b8c58a4314..9204812e3becf 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts @@ -610,7 +610,8 @@ export function registerChatCodeCompareBlockActions() { precondition: ContextKeyExpr.and(EditorContextKeys.hasChanges, CONTEXT_CHAT_EDIT_APPLIED.negate()), menu: { id: MenuId.ChatCompareBlock, - group: 'navigation' + group: 'navigation', + order: 1, } }); } @@ -629,4 +630,28 @@ export function registerChatCodeCompareBlockActions() { }); } }); + + registerAction2(class DiscardEditsCompareBlockAction extends ChatCompareCodeBlockAction { + constructor() { + super({ + id: 'workbench.action.chat.discardCompareEdits', + title: localize2('interactive.compare.discard', "Discard Edits"), + f1: false, + category: CHAT_CATEGORY, + icon: Codicon.trash, + precondition: ContextKeyExpr.and(EditorContextKeys.hasChanges, CONTEXT_CHAT_EDIT_APPLIED.negate()), + menu: { + id: MenuId.ChatCompareBlock, + group: 'navigation', + order: 2, + } + }); + } + + async runWithContext(accessor: ServicesAccessor, context: ICodeCompareBlockActionContext): Promise { + const instaService = accessor.get(IInstantiationService); + const editor = instaService.createInstance(DefaultChatTextEditor); + editor.discard(context.element, context.edit); + } + }); } diff --git a/src/vs/workbench/contrib/chat/browser/codeBlockPart.css b/src/vs/workbench/contrib/chat/browser/codeBlockPart.css index 279626daf8218..89596f8974851 100644 --- a/src/vs/workbench/contrib/chat/browser/codeBlockPart.css +++ b/src/vs/workbench/contrib/chat/browser/codeBlockPart.css @@ -147,3 +147,17 @@ .interactive-result-code-block.compare .message A > CODE { color: var(--vscode-textLink-foreground); } + +.interactive-result-code-block.compare .interactive-result-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 3px; + box-sizing: border-box; + border-bottom: solid 1px var(--vscode-chat-requestBorder); +} + +.interactive-result-code-block.compare.no-diff .interactive-result-header, +.interactive-result-code-block.compare.no-diff .interactive-result-editor { + display: none; +} diff --git a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts index 394b956b167f9..9346615d4873f 100644 --- a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts +++ b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts @@ -7,15 +7,13 @@ import 'vs/css!./codeBlockPart'; import * as dom from 'vs/base/browser/dom'; import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Button } from 'vs/base/browser/ui/button/button'; -import { toAction } from 'vs/base/common/actions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; import { Emitter } from 'vs/base/common/event'; import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; -import { basename, isEqual } from 'vs/base/common/resources'; +import { isEqual } from 'vs/base/common/resources'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { TabFocus } from 'vs/editor/browser/config/tabFocus'; @@ -64,6 +62,8 @@ import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreve import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { IMarkdownVulnerability } from '../common/annotations'; +import { ResourceLabel } from 'vs/workbench/browser/labels'; +import { FileKind } from 'vs/platform/files/common/files'; const $ = dom.$; @@ -460,7 +460,7 @@ export interface ICodeCompareBlockData { readonly diffData: Promise; readonly parentContextKeyService?: IContextKeyService; - readonly hideToolbar?: boolean; + // readonly hideToolbar?: boolean; } @@ -470,8 +470,8 @@ export class CodeCompareBlockPart extends Disposable { private readonly contextKeyService: IContextKeyService; private readonly diffEditor: DiffEditorWidget; - private readonly toolbar1: ActionBar; - private readonly toolbar2: MenuWorkbenchToolBar; + private readonly resourceLabel: ResourceLabel; + private readonly toolbar: MenuWorkbenchToolBar; readonly element: HTMLElement; private readonly messageElement: HTMLElement; @@ -501,6 +501,7 @@ export class CodeCompareBlockPart extends Disposable { this.contextKeyService = this._register(contextKeyService.createScoped(this.element)); const scopedInstantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService])); + const editorHeader = dom.append(this.element, $('.interactive-result-header.show-file-icons')); const editorElement = dom.append(this.element, $('.interactive-result-editor')); this.diffEditor = this.createDiffEditor(scopedInstantiationService, editorElement, { ...getSimpleEditorOptions(this.configurationService), @@ -527,24 +528,16 @@ export class CodeCompareBlockPart extends Disposable { ...this.getEditorOptionsFromConfig(), }); - const toolbarElement = dom.append(this.element, $('.interactive-result-code-block-toolbar')); - - // this.resourceLabel = this._register(scopedInstantiationService.createInstance(ResourceLabel, toolbarElement, { supportIcons: true })); + this.resourceLabel = this._register(scopedInstantiationService.createInstance(ResourceLabel, editorHeader, { supportIcons: true })); - const editorScopedService = this.diffEditor.getModifiedEditor().contextKeyService.createScoped(toolbarElement); + const editorScopedService = this.diffEditor.getModifiedEditor().contextKeyService.createScoped(editorHeader); const editorScopedInstantiationService = scopedInstantiationService.createChild(new ServiceCollection([IContextKeyService, editorScopedService])); - this.toolbar1 = this._register(new ActionBar(toolbarElement, {})); - this.toolbar2 = this._register(editorScopedInstantiationService.createInstance(MenuWorkbenchToolBar, toolbarElement, menuId, { + this.toolbar = this._register(editorScopedInstantiationService.createInstance(MenuWorkbenchToolBar, editorHeader, menuId, { menuOptions: { shouldForwardArgs: true } })); - - this._register(this.toolbar2.onDidChangeDropdownVisibility(e => { - toolbarElement.classList.toggle('force-visibility', e); - })); - this._configureForScreenReader(); this._register(this.accessibilityService.onDidChangeScreenReaderOptimized(() => this._configureForScreenReader())); this._register(this.configurationService.onDidChangeConfiguration((e) => { @@ -639,7 +632,7 @@ export class CodeCompareBlockPart extends Disposable { } private _configureForScreenReader(): void { - const toolbarElt = this.toolbar2.getElement(); + const toolbarElt = this.toolbar.getElement(); if (this.accessibilityService.isScreenReaderOptimized()) { toolbarElt.style.display = 'block'; toolbarElt.ariaLabel = this.configurationService.getValue(AccessibilityVerbositySettingId.Chat) ? localize('chat.codeBlock.toolbarVerbose', 'Toolbar for code block which can be reached via tab') : localize('chat.codeBlock.toolbar', 'Code block toolbar'); @@ -692,21 +685,10 @@ export class CodeCompareBlockPart extends Disposable { this.layout(width); this.diffEditor.updateOptions({ ariaLabel: localize('chat.compareCodeBlockLabel', "Code Edits") }); - this.toolbar1.clear(); - this.toolbar1.push(toAction({ - label: basename(data.edit.uri), - tooltip: localize('chat.edit.tooltip', "Open '{0}'", this.labelService.getUriLabel(data.edit.uri, { relative: true })), - run: () => { - this.openerService.open(data.edit.uri, { fromUserGesture: true, allowCommands: false }); - }, - id: '', - }), { icon: false, label: true }); - - if (data.hideToolbar) { - dom.hide(this.toolbar2.getElement()); - } else { - dom.show(this.toolbar2.getElement()); - } + this.resourceLabel.element.setFile(data.edit.uri, { + fileKind: FileKind.FILE, + fileDecorations: { colors: true, badges: false } + }); } reset() { @@ -734,10 +716,14 @@ export class CodeCompareBlockPart extends Disposable { const uriLabel = this.labelService.getUriLabel(data.edit.uri, { relative: true, noPrefix: true }); - const template = data.edit.state.applied > 1 - ? localize('chat.edits.N', "Made {0} changes in [[``{1}``]]", data.edit.state.applied, uriLabel) - : localize('chat.edits.1', "Made 1 change in [[``{0}``]]", uriLabel); - + let template: string; + if (data.edit.state.applied === 1) { + template = localize('chat.edits.1', "Made 1 change in [[``{0}``]]", uriLabel); + } else if (data.edit.state.applied < 0) { + template = localize('chat.edits.rejected', "Edits in [[``{0}``]] have been rejected", uriLabel); + } else { + template = localize('chat.edits.N', "Made {0} changes in [[``{1}``]]", data.edit.state.applied, uriLabel); + } const message = renderFormattedText(template, { renderCodeSegments: true, @@ -778,7 +764,7 @@ export class CodeCompareBlockPart extends Disposable { this._lastDiffEditorViewModel.value = undefined; } - this.toolbar2.context = { + this.toolbar.context = { edit: data.edit, element: data.element, diffEditor: this.diffEditor, @@ -890,4 +876,18 @@ export class DefaultChatTextEditor { } return true; } + + discard(response: IChatResponseModel | IChatResponseViewModel, item: IChatTextEditGroup) { + if (!response.response.value.includes(item)) { + // bogous item + return; + } + + if (item.state?.applied) { + // already applied + return; + } + + response.setEditApplied(item, -1); + } } From ed9e9efbd9c7b69a22ea4b01c0c702a7d9a08d79 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 18 Jun 2024 16:02:26 +0200 Subject: [PATCH 297/755] add telemetry for update metadata errors (#216486) --- .../common/extensionManagement.ts | 1 + .../node/extensionManagementService.ts | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index fa3ad5f55955b..0f608249f78d9 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -443,6 +443,7 @@ export const enum ExtensionManagementErrorCode { Download = 'Download', DownloadSignature = 'DownloadSignature', DownloadFailedWriting = ExtensionGalleryErrorCode.DownloadFailedWriting, + UpdateExistingMetadata = 'UpdateExistingMetadata', UpdateMetadata = 'UpdateMetadata', Extract = 'Extract', Scanning = 'Scanning', diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 1977a4ad1fe02..6b9405d389448 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -484,6 +484,17 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi } } +type UpdateMetadataErrorClassification = { + owner: 'sandy081'; + comment: 'Update metadata error'; + extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'extension identifier' }; + code?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'result code of the verification' }; +}; +type UpdateMetadataErrorEvent = { + extensionId: string; + code?: string; +}; + export class ExtensionsScanner extends Disposable { private readonly uninstalledResource: URI; @@ -501,6 +512,7 @@ export class ExtensionsScanner extends Disposable { @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + @ITelemetryService private readonly telemetryService: ITelemetryService, @ILogService private readonly logService: ILogService, ) { super(); @@ -582,7 +594,8 @@ export class ExtensionsScanner extends Disposable { try { await this.extensionsScannerService.updateMetadata(extensionLocation, metadata); } catch (error) { - throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata); + this.telemetryService.publicLog2('extension:extract', { extensionId: extensionKey.id, code: error.code }); + throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateExistingMetadata); } } else { try { @@ -602,6 +615,7 @@ export class ExtensionsScanner extends Disposable { try { await this.extensionsScannerService.updateMetadata(tempLocation, metadata); } catch (error) { + this.telemetryService.publicLog2('extension:extract', { extensionId: extensionKey.id, code: error.code }); throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata); } @@ -657,6 +671,7 @@ export class ExtensionsScanner extends Disposable { await this.extensionsScannerService.updateMetadata(local.location, metadata); } } catch (error) { + this.telemetryService.publicLog2('extension:extract', { extensionId: local.identifier.id, code: error.code }); throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata); } return this.scanLocalExtension(local.location, local.type, profileLocation); From 7696c3e01da3fb1850b0d53933bfe1c8f5ccf0ea Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:05:31 +0200 Subject: [PATCH 298/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20repository=20l?= =?UTF-8?q?abel=20should=20use=20custom=20hover=20(#216488)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/scm/browser/scmRepositoryRenderer.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts index 53b0e14907119..594d24ef8f3ca 100644 --- a/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts +++ b/src/vs/workbench/contrib/scm/browser/scmRepositoryRenderer.ts @@ -24,6 +24,9 @@ import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IManagedHover } from 'vs/base/browser/ui/hover/hover'; +import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; export class RepositoryActionRunner extends ActionRunner { constructor(private readonly getSelectedRepositories: () => ISCMRepository[]) { @@ -44,6 +47,7 @@ export class RepositoryActionRunner extends ActionRunner { interface RepositoryTemplate { readonly label: HTMLElement; + readonly labelCustomHover: IManagedHover; readonly name: HTMLElement; readonly description: HTMLElement; readonly countContainer: HTMLElement; @@ -65,6 +69,7 @@ export class RepositoryRenderer implements ICompressibleTreeRenderer provider.classList.toggle('active', e)); - const templateDisposable = combinedDisposable(visibilityDisposable, toolBar); + const templateDisposable = combinedDisposable(labelCustomHover, visibilityDisposable, toolBar); - return { label, name, description, countContainer, count, toolBar, elementDisposables: new DisposableStore(), templateDisposable }; + return { label, labelCustomHover, name, description, countContainer, count, toolBar, elementDisposables: new DisposableStore(), templateDisposable }; } renderElement(arg: ISCMRepository | ITreeNode, index: number, templateData: RepositoryTemplate, height: number | undefined): void { @@ -96,10 +102,10 @@ export class RepositoryRenderer implements ICompressibleTreeRenderer Date: Tue, 18 Jun 2024 16:09:35 +0200 Subject: [PATCH 299/755] Include command to toggle for session in read-only msg (#216489) Include command to toggle for session in readonly msg --- .../filesConfiguration/common/filesConfigurationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts index d4c2c6f025ef6..4500b974e7214 100644 --- a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts +++ b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts @@ -125,7 +125,7 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi private static readonly READONLY_MESSAGES = { providerReadonly: { value: localize('providerReadonly', "Editor is read-only because the file system of the file is read-only."), isTrusted: true }, sessionReadonly: { value: localize({ key: 'sessionReadonly', comment: ['Please do not translate the word "command", it is part of our internal syntax which must not change', '{Locked="](command:{0})"}'] }, "Editor is read-only because the file was set read-only in this session. [Click here](command:{0}) to set writeable.", 'workbench.action.files.setActiveEditorWriteableInSession'), isTrusted: true }, - configuredReadonly: { value: localize({ key: 'configuredReadonly', comment: ['Please do not translate the word "command", it is part of our internal syntax which must not change', '{Locked="](command:{0})"}'] }, "Editor is read-only because the file was set read-only via settings. [Click here](command:{0}) to configure.", `workbench.action.openSettings?${encodeURIComponent('["files.readonly"]')}`), isTrusted: true }, + configuredReadonly: { value: localize({ key: 'configuredReadonly', comment: ['Please do not translate the word "command", it is part of our internal syntax which must not change', '{Locked="](command:{0})"}'] }, "Editor is read-only because the file was set read-only via settings. [Click here](command:{0}) to configure or [toggle for this session](command:{1}).", `workbench.action.openSettings?${encodeURIComponent('["files.readonly"]')}`, 'workbench.action.files.toggleActiveEditorReadonlyInSession'), isTrusted: true }, fileLocked: { value: localize({ key: 'fileLocked', comment: ['Please do not translate the word "command", it is part of our internal syntax which must not change', '{Locked="](command:{0})"}'] }, "Editor is read-only because of file permissions. [Click here](command:{0}) to set writeable anyway.", 'workbench.action.files.setActiveEditorWriteableInSession'), isTrusted: true }, fileReadonly: { value: localize('fileReadonly', "Editor is read-only because the file is read-only."), isTrusted: true } }; From bfb7af52e54343022d5ffa144c6f1decab8a3526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 18 Jun 2024 16:36:32 +0200 Subject: [PATCH 300/755] fix darwin icons (#216492) --- build/lib/electron.js | 2 +- build/lib/electron.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/lib/electron.js b/build/lib/electron.js index 8524b18850cee..99252e4e64a2d 100644 --- a/build/lib/electron.js +++ b/build/lib/electron.js @@ -54,7 +54,7 @@ function darwinBundleDocumentType(extensions, icon, nameOrSuffix, utis) { role: 'Editor', ostypes: ['TEXT', 'utxt', 'TUTX', '****'], extensions, - iconFile: 'resources/darwin/' + icon + '.icns', + iconFile: 'resources/darwin/' + icon.toLowerCase() + '.icns', utis }; } diff --git a/build/lib/electron.ts b/build/lib/electron.ts index ba93c3a2af39e..7a2a2a195576a 100644 --- a/build/lib/electron.ts +++ b/build/lib/electron.ts @@ -68,7 +68,7 @@ function darwinBundleDocumentType(extensions: string[], icon: string, nameOrSuff role: 'Editor', ostypes: ['TEXT', 'utxt', 'TUTX', '****'], extensions, - iconFile: 'resources/darwin/' + icon + '.icns', + iconFile: 'resources/darwin/' + icon.toLowerCase() + '.icns', utis }; } From be0696db68acbd270bea1be8e0444281a360d491 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 18 Jun 2024 16:39:09 +0200 Subject: [PATCH 301/755] polish (#216493) --- .../browser/media/userDataProfilesEditor.css | 10 ++++++++++ .../userDataProfile/browser/userDataProfilesEditor.ts | 3 +++ .../browser/userDataProfilesEditorModel.ts | 7 ++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index c9b7ddd7c8cd4..c143024f72ebd 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -112,6 +112,16 @@ font-size: large; padding: 4px; margin-right: 8px; + border-radius: 5px; +} + +.profiles-editor .contents-container .profile-title-container .codicon.disabled { + cursor: default; +} + +.profiles-editor .contents-container .profile-title-container .codicon:not(.disabled):hover { + background-color: var(--vscode-toolbar-hoverBackground); + outline: 1px dashed var(--vscode-toolbar-hoverOutline); } .profiles-editor .contents-container .profile-title-container .monaco-inputbox { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index a34110b5b966e..f5175a3d8c101 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -137,6 +137,7 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi }, Sizing.Distribute, undefined, true); this.registerListeners(); + this.updateStyles(); this.userDataProfileManagementService.getBuiltinProfileTemplates().then(templates => { this.templates = templates; @@ -717,6 +718,8 @@ class ProfileWidget extends Disposable { const profile = profileElement instanceof UserDataProfileElement ? profileElement.profile : undefined; this.profileTitle.classList.toggle('hide', !profile?.isDefault); this.nameInput.element.classList.toggle('hide', !!profile?.isDefault); + this.iconElement.classList.toggle('disabled', !!profile?.isDefault); + this.iconElement.setAttribute('tabindex', profile?.isDefault ? '' : '0'); disposables.add(profileElement.onDidChange(e => { if (e.flags || e.copyFrom || e.copyFlags || e.disabled) { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 3d2df24343c45..16663b55aaca4 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -686,8 +686,10 @@ export class UserDataProfilesEditorModel extends EditorModel { } private onDidChangeProfiles(e: DidChangeProfilesEvent): void { + let changed = false; for (const profile of e.added) { if (!profile.isTransient && profile.name !== this.newProfileElement?.name) { + changed = true; this._profiles.push(this.createProfileElement(profile)); } } @@ -697,10 +699,13 @@ export class UserDataProfilesEditorModel extends EditorModel { } const index = this._profiles.findIndex(([p]) => p instanceof UserDataProfileElement && p.profile.id === profile.id); if (index !== -1) { + changed = true; this._profiles.splice(index, 1).map(([, disposables]) => disposables.dispose()); } } - this._onDidChange.fire(undefined); + if (changed) { + this._onDidChange.fire(undefined); + } } private createProfileElement(profile: IUserDataProfile): [UserDataProfileElement, DisposableStore] { From 0e96ca9c6461b2c2c60162aaf6bc6d5fdc532796 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 18 Jun 2024 17:11:26 +0200 Subject: [PATCH 302/755] fixes https://github.com/microsoft/vscode/issues/215519 (#216506) --- src/vs/workbench/contrib/chat/browser/chatInputPart.ts | 1 + .../contrib/inlineChat/browser/inlineChatContentWidget.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index 15182bb6bdff7..abf61519b3881 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -549,6 +549,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge if (items && items.length > 0) { this.followupsDisposables.add(this.instantiationService.createInstance, ChatFollowups>(ChatFollowups, this.followupsContainer, items, this.location, undefined, followup => this._onDidAcceptFollowup.fire({ followup, response }))); } + this._onDidChangeHeight.fire(); } get contentHeight(): number { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts index 38386b959efed..199f66d0c42ba 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts @@ -90,7 +90,7 @@ export class InlineChatContentWidget implements IContentWidget { this._store.add(this._widget); this._widget.render(this._inputContainer); this._widget.setModel(this._defaultChatModel, {}); - this._store.add(this._widget.inputEditor.onDidContentSizeChange(() => _editor.layoutContentWidget(this))); + this._store.add(this._widget.onDidChangeContentHeight(() => _editor.layoutContentWidget(this))); this._domNode.tabIndex = -1; this._domNode.className = 'inline-chat-content-widget interactive-session'; From 170d851e98bc84e7560509a96f6275f09b33628a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 18 Jun 2024 17:49:49 +0200 Subject: [PATCH 303/755] report auto restart setting event (#216487) --- .../telemetry/browser/telemetry.contribution.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts index c397b896093ba..755566d543519 100644 --- a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts +++ b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts @@ -31,7 +31,7 @@ import { mainWindow } from 'vs/base/browser/window'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { isBoolean, isNumber, isString } from 'vs/base/common/types'; import { LayoutSettings } from 'vs/workbench/services/layout/browser/layoutService'; -import { AutoUpdateConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; +import { AutoRestartConfigurationKey, AutoUpdateConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { KEYWORD_ACTIVIATION_SETTING_ID } from 'vs/workbench/contrib/chat/common/chatService'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; @@ -438,6 +438,15 @@ class ConfigurationTelemetryContribution extends Disposable implements IWorkbenc }>('window.systemColorTheme', { settingValue, source }); return; } + + case AutoRestartConfigurationKey: + this.telemetryService.publicLog2('window.systemColorTheme', { settingValue: this.getValueToReport(key, target), source }); + return; } } From 9a9aa283747b8a9a20a438cbcdba8014dd758d05 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 18 Jun 2024 17:50:17 +0200 Subject: [PATCH 304/755] update new window actions (#216514) --- .../contrib/userDataProfile/browser/userDataProfile.ts | 4 ++-- .../userDataProfile/browser/userDataProfilesEditorModel.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts index db8e52ceaf4a7..caa0aaa31681d 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts @@ -178,9 +178,9 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements private registerOpenProfileSubMenu(): void { MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - title: localize('open profile', "Open Profile"), + title: localize('New Profile Window', "New Window with Profile"), submenu: OpenProfileMenu, - group: '2_open', + group: '1_new', order: 4, when: HAS_PROFILES_CONTEXT, }); diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 16663b55aaca4..90223e5867b18 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -744,7 +744,7 @@ export class UserDataProfilesEditorModel extends EditorModel { const newWindowAction = disposables.add(new Action( 'userDataProfile.newWindow', - localize('open new window', "Open"), + localize('open new window', "New Window"), ThemeIcon.asClassName(Codicon.emptyWindow), true, () => this.openWindow(profile) From c3515864b9461e6ddce5137853f90fff7e47c865 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 18 Jun 2024 09:08:04 -0700 Subject: [PATCH 305/755] Enable use strict on `unc.js` (#216515) Fixes #216424 Reveals a few errors too that should be fixed by future changes --- src/vs/base/node/unc.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/base/node/unc.js b/src/vs/base/node/unc.js index b0af4d38b68fa..b14faebd36fa3 100644 --- a/src/vs/base/node/unc.js +++ b/src/vs/base/node/unc.js @@ -3,9 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - //@ts-check +'use strict'; (function () { function factory() { From f4e68757bec55bcb6a9c69c795b75043dc8d2e4b Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:30:11 -0700 Subject: [PATCH 306/755] Ensure completion text is used over label if present Fixes #216002 --- .../terminalContrib/suggest/browser/terminalSuggestAddon.ts | 6 +++--- .../services/suggest/browser/simpleCompletionItem.ts | 2 +- .../services/suggest/browser/simpleCompletionModel.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts index 90170614e53c5..27be802c52677 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts @@ -279,13 +279,13 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest this._leadingLineContent = this._promptInputModel.value.substring(0, this._promptInputModel.cursorIndex); - // If there's no space it means this is a command, add cached commands list to completions const firstChar = this._leadingLineContent.length === 0 ? '' : this._leadingLineContent[0]; if (this._leadingLineContent.trim().includes(' ') || firstChar === '[') { replacementIndex = parseInt(args[0]); replacementLength = parseInt(args[1]); - this._leadingLineContent = completions[0]?.completion.label.slice(0, replacementLength) ?? ''; + const firstCompletion = completions[0]?.completion; + this._leadingLineContent = (firstCompletion?.completionText ?? firstCompletion.label).slice(0, replacementLength) ?? ''; } else { completions.push(...this._cachedPwshCommands); } @@ -407,7 +407,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest this._leadingLineContent = completions[0].completion.label.slice(0, replacementLength); const model = new SimpleCompletionModel(completions, new LineContext(this._leadingLineContent, replacementIndex), replacementIndex, replacementLength); if (completions.length === 1) { - const insertText = completions[0].completion.label.substring(replacementLength); + const insertText = (completions[0].completion.completionText ?? completions[0].completion.label).substring(replacementLength); if (insertText.length === 0) { this._onBell.fire(); return; diff --git a/src/vs/workbench/services/suggest/browser/simpleCompletionItem.ts b/src/vs/workbench/services/suggest/browser/simpleCompletionItem.ts index 3aa43e4c72711..fd3b2131cf5f0 100644 --- a/src/vs/workbench/services/suggest/browser/simpleCompletionItem.ts +++ b/src/vs/workbench/services/suggest/browser/simpleCompletionItem.ts @@ -38,6 +38,6 @@ export class SimpleCompletionItem { readonly completion: ISimpleCompletion ) { // ensure lower-variants (perf) - this.labelLow = this.completion.label.toLowerCase(); + this.labelLow = (this.completion.completionText ?? this.completion.label).toLowerCase(); } } diff --git a/src/vs/workbench/services/suggest/browser/simpleCompletionModel.ts b/src/vs/workbench/services/suggest/browser/simpleCompletionModel.ts index 1418e462f0088..628ee0a809e14 100644 --- a/src/vs/workbench/services/suggest/browser/simpleCompletionModel.ts +++ b/src/vs/workbench/services/suggest/browser/simpleCompletionModel.ts @@ -165,7 +165,7 @@ export class SimpleCompletionModel { } else { // by default match `word` against the `label` - const match = scoreFn(word, wordLow, wordPos, item.completion.label, item.labelLow, 0, this._fuzzyScoreOptions); + const match = scoreFn(word, wordLow, wordPos, item.completion.completionText ?? item.completion.label, item.labelLow, 0, this._fuzzyScoreOptions); if (!match) { continue; // NO match } @@ -177,7 +177,7 @@ export class SimpleCompletionModel { target.push(item); // update stats - labelLengths.push(item.completion.label.length); + labelLengths.push((item.completion.completionText ?? item.completion.label).length); } this._filteredItems = target.sort((a, b) => b.score[0] - a.score[0]); From 40e1b609926a4dc7545c186eeceecfed436aa0c6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 18 Jun 2024 18:50:23 +0200 Subject: [PATCH 307/755] ux feedback (#216518) * ux feedback * do not add activate action --- .../userDataProfile/browser/media/userDataProfilesEditor.css | 2 +- .../userDataProfile/browser/userDataProfilesEditorModel.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css index c143024f72ebd..86a5a8d011982 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css +++ b/src/vs/workbench/contrib/userDataProfile/browser/media/userDataProfilesEditor.css @@ -125,7 +125,7 @@ } .profiles-editor .contents-container .profile-title-container .monaco-inputbox { - max-width: 340px; + margin-right: 10px; flex: 1; } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 90223e5867b18..257625aed4d57 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -759,6 +759,7 @@ export class UserDataProfilesEditorModel extends EditorModel { )); const titlePrimaryActions: IAction[] = []; + titlePrimaryActions.push(newWindowAction); const titleSecondaryActions: IAction[] = []; titleSecondaryActions.push(copyFromProfileAction); titleSecondaryActions.push(exportAction); @@ -782,7 +783,7 @@ export class UserDataProfilesEditorModel extends EditorModel { const profileElement = disposables.add(this.instantiationService.createInstance(UserDataProfileElement, profile, - [[newWindowAction], []], + [[], []], [titlePrimaryActions, titleSecondaryActions], [primaryActions, secondaryActions] )); @@ -816,7 +817,7 @@ export class UserDataProfilesEditorModel extends EditorModel { const cancelAction = disposables.add(new Action( 'userDataProfile.cancel', localize('cancel', "Cancel"), - ThemeIcon.asClassName(Codicon.close), + ThemeIcon.asClassName(Codicon.trash), true, () => this.discardNewProfile() )); From af6d5d3ee602141bc15f674a0081ebd530c7bcc7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:27:55 -0700 Subject: [PATCH 308/755] Update terminalSuggestAddon.ts --- .../terminalContrib/suggest/browser/terminalSuggestAddon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts index 27be802c52677..740bc06c77122 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts @@ -285,7 +285,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest replacementIndex = parseInt(args[0]); replacementLength = parseInt(args[1]); const firstCompletion = completions[0]?.completion; - this._leadingLineContent = (firstCompletion?.completionText ?? firstCompletion.label).slice(0, replacementLength) ?? ''; + this._leadingLineContent = (firstCompletion?.completionText ?? firstCompletion?.label)?.slice(0, replacementLength) ?? ''; } else { completions.push(...this._cachedPwshCommands); } From f0edc07570220a0a73aff9db2062f481aafbac79 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 18 Jun 2024 11:00:08 -0700 Subject: [PATCH 309/755] re #215526. move off inline chat context key in notebook --- .../controller/chat/cellChatActions.ts | 15 ++++++----- .../chat/notebook.chat.contribution.ts | 25 ++++++++++++++++--- .../controller/chat/notebookChatContext.ts | 2 ++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts index 47b4a3d4edfce..f7651b21fe923 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts @@ -15,8 +15,8 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_RESPONSE_TYPE, InlineChatResponseType } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; -import { CTX_NOTEBOOK_CELL_CHAT_FOCUSED, CTX_NOTEBOOK_CHAT_HAS_ACTIVE_REQUEST, CTX_NOTEBOOK_CHAT_OUTER_FOCUS_POSITION, CTX_NOTEBOOK_CHAT_USER_DID_EDIT, MENU_CELL_CHAT_INPUT, MENU_CELL_CHAT_WIDGET, MENU_CELL_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext'; +import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_RESPONSE_TYPE, InlineChatResponseType } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { CTX_NOTEBOOK_CELL_CHAT_FOCUSED, CTX_NOTEBOOK_CHAT_HAS_ACTIVE_REQUEST, CTX_NOTEBOOK_CHAT_HAS_AGENT, CTX_NOTEBOOK_CHAT_OUTER_FOCUS_POSITION, CTX_NOTEBOOK_CHAT_USER_DID_EDIT, MENU_CELL_CHAT_INPUT, MENU_CELL_CHAT_WIDGET, MENU_CELL_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext'; import { NotebookChatController } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController'; import { CELL_TITLE_CELL_GROUP_ID, INotebookActionContext, INotebookCellActionContext, NotebookAction, NotebookCellAction, getEditorFromArgsOrActivePane } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { insertNewCell } from 'vs/workbench/contrib/notebook/browser/controller/insertCellActions'; @@ -24,7 +24,6 @@ import { CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBro import { CellKind, NOTEBOOK_EDITOR_CURSOR_BOUNDARY, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NOTEBOOK_CELL_EDITOR_FOCUSED, NOTEBOOK_CELL_GENERATED_BY_CHAT, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; - registerAction2(class extends NotebookAction { constructor() { super( @@ -367,7 +366,7 @@ registerAction2(class extends NotebookAction { NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_EDITABLE.isEqualTo(true), ContextKeyExpr.not(InputFocusedContextKey), - CTX_INLINE_CHAT_HAS_AGENT, + CTX_NOTEBOOK_CHAT_HAS_AGENT, ContextKeyExpr.or( ContextKeyExpr.equals(`config.${NotebookSetting.cellChat}`, true), ContextKeyExpr.equals(`config.${NotebookSetting.cellGenerate}`, true) @@ -384,7 +383,7 @@ registerAction2(class extends NotebookAction { order: -1, when: ContextKeyExpr.and( NOTEBOOK_EDITOR_EDITABLE.isEqualTo(true), - CTX_INLINE_CHAT_HAS_AGENT, + CTX_NOTEBOOK_CHAT_HAS_AGENT, ContextKeyExpr.or( ContextKeyExpr.equals(`config.${NotebookSetting.cellChat}`, true), ContextKeyExpr.equals(`config.${NotebookSetting.cellGenerate}`, true) @@ -459,7 +458,7 @@ registerAction2(class extends NotebookAction { order: -1, when: ContextKeyExpr.and( NOTEBOOK_EDITOR_EDITABLE.isEqualTo(true), - CTX_INLINE_CHAT_HAS_AGENT, + CTX_NOTEBOOK_CHAT_HAS_AGENT, ContextKeyExpr.or( ContextKeyExpr.equals(`config.${NotebookSetting.cellChat}`, true), ContextKeyExpr.equals(`config.${NotebookSetting.cellGenerate}`, true) @@ -488,7 +487,7 @@ MenuRegistry.appendMenuItem(MenuId.NotebookToolbar, { NOTEBOOK_EDITOR_EDITABLE.isEqualTo(true), ContextKeyExpr.notEquals('config.notebook.insertToolbarLocation', 'betweenCells'), ContextKeyExpr.notEquals('config.notebook.insertToolbarLocation', 'hidden'), - CTX_INLINE_CHAT_HAS_AGENT, + CTX_NOTEBOOK_CHAT_HAS_AGENT, ContextKeyExpr.or( ContextKeyExpr.equals(`config.${NotebookSetting.cellChat}`, true), ContextKeyExpr.equals(`config.${NotebookSetting.cellGenerate}`, true) @@ -633,7 +632,7 @@ registerAction2(class extends NotebookCellAction { order: 0, when: ContextKeyExpr.and( NOTEBOOK_EDITOR_EDITABLE.isEqualTo(true), - CTX_INLINE_CHAT_HAS_AGENT, + CTX_NOTEBOOK_CHAT_HAS_AGENT, NOTEBOOK_CELL_GENERATED_BY_CHAT, ContextKeyExpr.equals(`config.${NotebookSetting.cellChat}`, true) ) diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts index f35264aa8cc80..0460f9e57da49 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts @@ -4,19 +4,26 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from 'vs/workbench/common/contributions'; +import { ChatAgentLocation, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import 'vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions'; +import { CTX_NOTEBOOK_CHAT_HAS_AGENT } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext'; import { NotebookChatController } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; -class NotebookChatVariables extends Disposable implements IWorkbenchContribution { +class NotebookChatContribution extends Disposable implements IWorkbenchContribution { - static readonly ID = 'workbench.contrib.notebookChatVariables'; + static readonly ID = 'workbench.contrib.notebookChatContribution'; + + private readonly _ctxHasProvider: IContextKey; constructor( @IChatVariablesService private readonly _chatVariableService: IChatVariablesService, - @INotebookEditorService private readonly _notebookEditorService: INotebookEditorService + @INotebookEditorService private readonly _notebookEditorService: INotebookEditorService, + @IContextKeyService contextKeyService: IContextKeyService, + @IChatAgentService chatAgentService: IChatAgentService ) { super(); @@ -34,7 +41,17 @@ class NotebookChatVariables extends Disposable implements IWorkbenchContribution return undefined; } )); + + this._ctxHasProvider = CTX_NOTEBOOK_CHAT_HAS_AGENT.bindTo(contextKeyService); + + const updateNotebookAgentStatus = () => { + const hasNotebookAgent = Boolean(chatAgentService.getDefaultAgent(ChatAgentLocation.Notebook)); + this._ctxHasProvider.set(hasNotebookAgent); + }; + + updateNotebookAgentStatus(); + this._register(chatAgentService.onDidChangeAgents(updateNotebookAgentStatus)); } } -registerWorkbenchContribution2(NotebookChatVariables.ID, NotebookChatVariables, WorkbenchPhase.BlockRestore); +registerWorkbenchContribution2(NotebookChatContribution.ID, NotebookChatContribution, WorkbenchPhase.BlockRestore); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.ts index 4c8a6aa024d0c..259b8e8303edc 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.ts @@ -17,3 +17,5 @@ export const MENU_CELL_CHAT_WIDGET = MenuId.for('cellChatWidget'); export const MENU_CELL_CHAT_WIDGET_STATUS = MenuId.for('cellChatWidget.status'); export const MENU_CELL_CHAT_WIDGET_FEEDBACK = MenuId.for('cellChatWidget.feedback'); export const MENU_CELL_CHAT_WIDGET_TOOLBAR = MenuId.for('cellChatWidget.toolbar'); + +export const CTX_NOTEBOOK_CHAT_HAS_AGENT = new RawContextKey('notebookChatAgentRegistered', false, localize('notebookChatAgentRegistered', "Whether a chat agent for notebook is registered")); From 03476c3864e1f49df1a30652a5088d1af4dc3ad8 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 18 Jun 2024 11:10:17 -0700 Subject: [PATCH 310/755] fix #215421 --- .../browser/controller/chat/notebookChatController.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts index a8441f86c2d36..5558c1a7b6914 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts @@ -471,6 +471,10 @@ export class NotebookChatController extends Disposable implements INotebookEdito this._sessionCtor = createCancelablePromise(async token => { await this._startSession(token); + assertType(this._model.value); + const model = this._model.value; + this._widget?.inlineChatWidget.setChatModel(model); + if (fakeParentEditor.hasModel()) { if (this._widget) { @@ -548,9 +552,6 @@ export class NotebookChatController extends Disposable implements INotebookEdito assertType(this._model.value); assertType(this._strategy); - const model = this._model.value; - this._widget.inlineChatWidget.setChatModel(model); - const lastInput = this._widget.inlineChatWidget.value; this._historyUpdate(lastInput); From ec121acd62943c5a4c1347b6d1a0e306621d53fb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 18 Jun 2024 20:30:17 +0200 Subject: [PATCH 311/755] debt - enable type check in JS files (#216534) * debt - enable type check in JS files * fix require --- src/vs/base/common/performance.js | 5 +++-- src/vs/base/node/unc.js | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/base/common/performance.js b/src/vs/base/common/performance.js index aff4d0734dec1..2af54743f33a7 100644 --- a/src/vs/base/common/performance.js +++ b/src/vs/base/common/performance.js @@ -3,9 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - //@ts-check +'use strict'; (function () { @@ -42,6 +41,7 @@ // Identify browser environment when following property is not present // https://nodejs.org/dist/latest-v16.x/docs/api/perf_hooks.html#performancenodetiming + // @ts-ignore if (typeof performance === 'object' && typeof performance.mark === 'function' && !performance.nodeTiming) { // in a browser context, reuse performance-util @@ -119,6 +119,7 @@ module.exports = _factory(sharedObj); } else { console.trace('perf-util defined in UNKNOWN context (neither requirejs or commonjs)'); + // @ts-ignore sharedObj.perf = _factory(sharedObj); } diff --git a/src/vs/base/node/unc.js b/src/vs/base/node/unc.js index b14faebd36fa3..e019e5258cef3 100644 --- a/src/vs/base/node/unc.js +++ b/src/vs/base/node/unc.js @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/// + //@ts-check 'use strict'; @@ -17,6 +19,7 @@ // The property `process.uncHostAllowlist` is not available in official node.js // releases, only in our own builds, so we have to probe for availability + // @ts-ignore return process.uncHostAllowlist; } @@ -113,6 +116,7 @@ return; } + // @ts-ignore process.restrictUNCAccess = false; } @@ -121,6 +125,7 @@ return true; } + // @ts-ignore return process.restrictUNCAccess === false; } From 5091dda80e399e3850a3de3c1e9d8adaa84a10eb Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 18 Jun 2024 11:43:05 -0700 Subject: [PATCH 312/755] Fix chat confirmations for slash commands (#216536) --- .../chat/browser/chatContentParts/chatConfirmationContentPart.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts index 0478adf077c5b..f79c78f0c1f9a 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts @@ -39,6 +39,7 @@ export class ChatConfirmationContentPart extends Disposable { { rejectedConfirmationData: [e.data] } : { acceptedConfirmationData: [e.data] }; data.agentId = element.agent?.id; + data.slashCommand = element.slashCommand?.name; if (await this.chatService.sendRequest(element.sessionId, prompt, data)) { confirmation.isUsed = true; confirmationWidget.setShowButtons(false); From b4ed13f770808101c60772c1f8a727bd5f1336b6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:03:15 -0700 Subject: [PATCH 313/755] Add prompt input detection across wrapped lines (not continuations) Fixes #211078 --- .../commandDetection/promptInputModel.ts | 23 +- .../commandDetection/promptInputModel.test.ts | 20 ++ .../windows11_pwsh_getcontent_wrapped.ts | 312 ++++++++++++++++++ .../terminalSuggestAddon.integrationTest.ts | 2 + 4 files changed, 353 insertions(+), 4 deletions(-) create mode 100644 src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts diff --git a/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts b/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts index 0f1c53efded8f..f22b5181d4674 100644 --- a/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts +++ b/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts @@ -220,8 +220,13 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { const absoluteCursorY = buffer.baseY + buffer.cursorY; let value = commandLine; - let cursorIndex = absoluteCursorY === commandStartY ? this._getRelativeCursorIndex(this._commandStartX, buffer, line) : commandLine.trimEnd().length + 1; let ghostTextIndex = -1; + let cursorIndex: number; + if (absoluteCursorY === commandStartY) { + cursorIndex = this._getRelativeCursorIndex(this._commandStartX, buffer, line); + } else { + cursorIndex = commandLine.trimEnd().length; + } // Detect ghost text by looking for italic or dim text in or after the cursor and // non-italic/dim text in the cell closest non-whitespace cell before the cursor @@ -235,15 +240,25 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { line = buffer.getLine(y); const lineText = line?.translateToString(true); if (lineText && line) { + // Check if the line wrapped without a new line (continuation) + if (line.isWrapped) { + value += lineText; + const relativeCursorIndex = this._getRelativeCursorIndex(0, buffer, line); + if (absoluteCursorY === y) { + cursorIndex += relativeCursorIndex; + } else { + cursorIndex += lineText.length; + } + } // Verify continuation prompt if we have it, if this line doesn't have it then the - // user likely just pressed enter - if (this._continuationPrompt === undefined || this._lineContainsContinuationPrompt(lineText)) { + // user likely just pressed enter. + else if (this._continuationPrompt === undefined || this._lineContainsContinuationPrompt(lineText)) { const trimmedLineText = this._trimContinuationPrompt(lineText); value += `\n${trimmedLineText}`; if (absoluteCursorY === y) { const continuationCellWidth = this._getContinuationPromptCellWidth(line, lineText); const relativeCursorIndex = this._getRelativeCursorIndex(continuationCellWidth, buffer, line); - cursorIndex += relativeCursorIndex; + cursorIndex += relativeCursorIndex + 1; } else { cursorIndex += trimmedLineText.length + 1; } diff --git a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts index 4566eb4b00817..ffebc0e81bf77 100644 --- a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts +++ b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts @@ -469,6 +469,26 @@ suite('PromptInputModel', () => { }); }); + suite('wrapped line (non-continuation)', () => { + test('basic wrapped line', async () => { + xterm.resize(5, 10); + + await writePromise('$ '); + fireCommandStart(); + await assertPromptInput('|'); + + await writePromise('ech'); + await assertPromptInput(`ech|`); + + await writePromise('o '); + await assertPromptInput(`echo |`); + + await writePromise('"a"'); + // HACK: Trailing whitespace is due to flaky detection in wrapped lines (but it doesn't matter much) + await assertPromptInput(`echo "a"| `); + }); + }); + // To "record a session" for these tests: // - Enable debug logging // - Open and clear Terminal output channel diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts new file mode 100644 index 0000000000000..d6a5df03dcc38 --- /dev/null +++ b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts @@ -0,0 +1,312 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +/* eslint-disable */ +export const events = [ + { + "type": "resize", + "cols": 10, + "rows": 21 + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[2J\u001b[m\u001b[H\u001b]0;C:\\Program Files\\WindowsApps\\Microsoft.PowerShell_7.4.2.0_x64__8wekyb3d8bbwe\\pwsh.exe\u0007\u001b[?25h" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\u001b[H\u001b[?25h" + }, + { + "type": "output", + "data": "\u001b]633;P;IsWindows=True\u0007" + }, + { + "type": "output", + "data": "\u001b]633;P;ContinuationPrompt=\\x1b[38\\x3b5\\x3b8m∙\\x1b[0m \u0007" + }, + { + "type": "output", + "data": "\u001b]633;CompletionsPwshCommands;commands;[{\"CompletionText\":\"%\",\"ListItemText\":\"%\",\"ResultType\":2,\"ToolTip\":\"ForEach-Object\"},{\"CompletionText\":\"?\",\"ListItemText\":\"?\",\"ResultType\":2,\"ToolTip\":\"Where-Object\"},{\"CompletionText\":\"A:\",\"ListItemText\":\"A:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nA: \\r\\n\"},{\"CompletionText\":\"ac\",\"ListItemText\":\"ac\",\"ResultType\":2,\"ToolTip\":\"Add-Content\"},{\"CompletionText\":\"Add-AdlAnalyticsDataSource\",\"ListItemText\":\"Add-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Add-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Add-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Add-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Add-AdlStoreFirewallRule\",\"ListItemText\":\"Add-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreFirewallRule\"},{\"CompletionText\":\"Add-AdlStoreItemContent\",\"ListItemText\":\"Add-AdlStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreItemContent\"},{\"CompletionText\":\"Add-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Add-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Add-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Add-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Add-AppPackage\",\"ListItemText\":\"Add-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppPackage\"},{\"CompletionText\":\"Add-AppPackageVolume\",\"ListItemText\":\"Add-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Add-AppPackageVolume\"},{\"CompletionText\":\"Add-AppProvisionedPackage\",\"ListItemText\":\"Add-AppProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppProvisionedPackage\"},{\"CompletionText\":\"Add-AppProvisionedSharedPackageContainer\",\"ListItemText\":\"Add-AppProvisionedSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Add-AppProvisionedSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Add-AppSharedPackageContainer\",\"ListItemText\":\"Add-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Add-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Add-AppxPackage\",\"ListItemText\":\"Add-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppxPackage\\r\\n\"},{\"CompletionText\":\"Add-AppxProvisionedPackage\",\"ListItemText\":\"Add-AppxProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppxProvisionedPackage\\r\\n\"},{\"CompletionText\":\"Add-AppxVolume\",\"ListItemText\":\"Add-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Add-AppxVolume\\r\\n\"},{\"CompletionText\":\"Add-ASRReplicationProtectedItemDisk\",\"ListItemText\":\"Add-ASRReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Add-ASRReplicationProtectedItemDisk\"},{\"CompletionText\":\"Add-AzAccount\",\"ListItemText\":\"Add-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Add-AzAccount\"},{\"CompletionText\":\"Add-AzADAppPermission\",\"ListItemText\":\"Add-AzADAppPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzADAppPermission \\r\\n\"},{\"CompletionText\":\"Add-AzADGroupMember\",\"ListItemText\":\"Add-AzADGroupMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzADGroupMember \\r\\n\"},{\"CompletionText\":\"Add-AzAnalysisServicesAccount\",\"ListItemText\":\"Add-AzAnalysisServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Add-AzAnalysisServicesAccount\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementApiToGateway\",\"ListItemText\":\"Add-AzApiManagementApiToGateway\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementApiToGateway\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementApiToProduct\",\"ListItemText\":\"Add-AzApiManagementApiToProduct\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementApiToProduct\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementProductToGroup\",\"ListItemText\":\"Add-AzApiManagementProductToGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementProductToGroup\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementRegion\",\"ListItemText\":\"Add-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementUserToGroup\",\"ListItemText\":\"Add-AzApiManagementUserToGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementUserToGroup\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Add-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Add-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Add-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Add-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Add-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayCustomError\",\"ListItemText\":\"Add-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Add-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Add-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Add-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Add-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Add-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayListener\",\"ListItemText\":\"Add-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Add-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Add-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Add-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Add-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Add-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Add-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Add-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Add-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Add-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Add-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Add-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Add-AzAttestationPolicySigner\",\"ListItemText\":\"Add-AzAttestationPolicySigner\",\"ResultType\":2,\"ToolTip\":\"Add-AzAttestationPolicySigner\\r\\n\"},{\"CompletionText\":\"Add-AzCognitiveServicesAccountNetworkRule\",\"ListItemText\":\"Add-AzCognitiveServicesAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzCognitiveServicesAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzContainerInstanceOutput\",\"ListItemText\":\"Add-AzContainerInstanceOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzContainerInstanceOutput \\r\\n\"},{\"CompletionText\":\"Add-AzDataFactoryV2DataFlowDebugSessionPackage\",\"ListItemText\":\"Add-AzDataFactoryV2DataFlowDebugSessionPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataFactoryV2DataFlowDebugSessionPackage\\r\\n\"},{\"CompletionText\":\"Add-AzDataFactoryV2TriggerSubscription\",\"ListItemText\":\"Add-AzDataFactoryV2TriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataFactoryV2TriggerSubscription\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Add-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Add-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Add-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreItemContent\",\"ListItemText\":\"Add-AzDataLakeStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreItemContent\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Add-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Add-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzDelegation\",\"ListItemText\":\"Add-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"Add-AzDelegation\\r\\n\"},{\"CompletionText\":\"Add-AzDnsRecordConfig\",\"ListItemText\":\"Add-AzDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Add-AzEnvironment\",\"ListItemText\":\"Add-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Add-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"Add-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Add-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Add-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCrossConnectionPeering\",\"ListItemText\":\"Add-AzExpressRouteCrossConnectionPeering\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCrossConnectionPeering\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRoutePortAuthorization\",\"ListItemText\":\"Add-AzExpressRoutePortAuthorization\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRoutePortAuthorization\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightClusterIdentity\",\"ListItemText\":\"Add-AzHDInsightClusterIdentity\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightClusterIdentity\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightComponentVersion\",\"ListItemText\":\"Add-AzHDInsightComponentVersion\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightComponentVersion\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightConfigValue\",\"ListItemText\":\"Add-AzHDInsightConfigValue\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightConfigValue\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightMetastore\",\"ListItemText\":\"Add-AzHDInsightMetastore\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightMetastore\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightScriptAction\",\"ListItemText\":\"Add-AzHDInsightScriptAction\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightScriptAction\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightSecurityProfile\",\"ListItemText\":\"Add-AzHDInsightSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightSecurityProfile\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightStorage\",\"ListItemText\":\"Add-AzHDInsightStorage\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightStorage\\r\\n\"},{\"CompletionText\":\"Add-AzImageDataDisk\",\"ListItemText\":\"Add-AzImageDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzImageDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubCertificate\",\"ListItemText\":\"Add-AzIotHubCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubConfiguration\",\"ListItemText\":\"Add-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubDCL\",\"ListItemText\":\"Add-AzIotHubDCL\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDCL\"},{\"CompletionText\":\"Add-AzIotHubDeployment\",\"ListItemText\":\"Add-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubDevice\",\"ListItemText\":\"Add-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubDeviceChildren\",\"ListItemText\":\"Add-AzIotHubDeviceChildren\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDeviceChildren\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubEHCG\",\"ListItemText\":\"Add-AzIotHubEHCG\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubEHCG\"},{\"CompletionText\":\"Add-AzIotHubEventHubConsumerGroup\",\"ListItemText\":\"Add-AzIotHubEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubEventHubConsumerGroup\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubKey\",\"ListItemText\":\"Add-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubMessageEnrichment\",\"ListItemText\":\"Add-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubModule\",\"ListItemText\":\"Add-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubMsgEnrich\",\"ListItemText\":\"Add-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Add-AzIotHubRoute\",\"ListItemText\":\"Add-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubRoutingEndpoint\",\"ListItemText\":\"Add-AzIotHubRoutingEndpoint\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubRoutingEndpoint\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultCertificate\",\"ListItemText\":\"Add-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultCertificateContact\",\"ListItemText\":\"Add-AzKeyVaultCertificateContact\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultCertificateContact\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultKey\",\"ListItemText\":\"Add-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Add-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultNetworkRule\",\"ListItemText\":\"Add-AzKeyVaultNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzKustoClusterLanguageExtension\",\"ListItemText\":\"Add-AzKustoClusterLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzKustoClusterLanguageExtension \\r\\n\"},{\"CompletionText\":\"Add-AzKustoDatabasePrincipal\",\"ListItemText\":\"Add-AzKustoDatabasePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzKustoDatabasePrincipal \\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"Add-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Add-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Add-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Add-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Add-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Add-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Add-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLogProfile\",\"ListItemText\":\"Add-AzLogProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzLogProfile\\r\\n\"},{\"CompletionText\":\"Add-AzMetricAlertRule\",\"ListItemText\":\"Add-AzMetricAlertRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzMetricAlertRule\\r\\n\"},{\"CompletionText\":\"Add-AzMetricAlertRuleV2\",\"ListItemText\":\"Add-AzMetricAlertRuleV2\",\"ResultType\":2,\"ToolTip\":\"Add-AzMetricAlertRuleV2\\r\\n\"},{\"CompletionText\":\"Add-AzMlWebServiceRegionalProperty\",\"ListItemText\":\"Add-AzMlWebServiceRegionalProperty\",\"ResultType\":2,\"ToolTip\":\"Add-AzMlWebServiceRegionalProperty\\r\\n\"},{\"CompletionText\":\"Add-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Add-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Add-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Add-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Add-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Add-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzPrivateDnsRecordConfig\",\"ListItemText\":\"Add-AzPrivateDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzPrivateDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Add-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ListItemText\":\"Add-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzRecoveryServicesAsrReplicationProtectedItemDisk\\r\\n\"},{\"CompletionText\":\"Add-AzResourceMoverMoveResource\",\"ListItemText\":\"Add-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzResourceMoverMoveResource \\r\\n\"},{\"CompletionText\":\"Add-AzRmStorageContainerLegalHold\",\"ListItemText\":\"Add-AzRmStorageContainerLegalHold\",\"ResultType\":2,\"ToolTip\":\"Add-AzRmStorageContainerLegalHold\\r\\n\"},{\"CompletionText\":\"Add-AzRouteConfig\",\"ListItemText\":\"Add-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Add-AzRouteFilterRuleConfig\",\"ListItemText\":\"Add-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzRouteServerPeer\",\"ListItemText\":\"Add-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Add-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Add-AzRoutingPolicy\",\"ListItemText\":\"Add-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Add-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Add-AzSecurityAdaptiveNetworkHardening\",\"ListItemText\":\"Add-AzSecurityAdaptiveNetworkHardening\",\"ResultType\":2,\"ToolTip\":\"Add-AzSecurityAdaptiveNetworkHardening\\r\\n\"},{\"CompletionText\":\"Add-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Add-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Add-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Add-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Add-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricClientCertificate\",\"ListItemText\":\"Add-AzServiceFabricClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricClientCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedClusterClientCertificate\",\"ListItemText\":\"Add-AzServiceFabricManagedClusterClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedClusterClientCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedClusterNetworkSecurityRule\",\"ListItemText\":\"Add-AzServiceFabricManagedClusterNetworkSecurityRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedClusterNetworkSecurityRule\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedNodeTypeVMExtension\",\"ListItemText\":\"Add-AzServiceFabricManagedNodeTypeVMExtension\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedNodeTypeVMExtension\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedNodeTypeVMSecret\",\"ListItemText\":\"Add-AzServiceFabricManagedNodeTypeVMSecret\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedNodeTypeVMSecret\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricNode\",\"ListItemText\":\"Add-AzServiceFabricNode\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricNode\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricNodeType\",\"ListItemText\":\"Add-AzServiceFabricNodeType\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricNodeType\\r\\n\"},{\"CompletionText\":\"Add-AzSqlDatabaseToFailoverGroup\",\"ListItemText\":\"Add-AzSqlDatabaseToFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlDatabaseToFailoverGroup\\r\\n\"},{\"CompletionText\":\"Add-AzSqlElasticJobStep\",\"ListItemText\":\"Add-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Add-AzSqlElasticJobTarget\",\"ListItemText\":\"Add-AzSqlElasticJobTarget\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlElasticJobTarget\\r\\n\"},{\"CompletionText\":\"Add-AzSqlInstanceKeyVaultKey\",\"ListItemText\":\"Add-AzSqlInstanceKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlInstanceKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Add-AzSqlManagedInstanceTransparentDataEncryptionCertificate\",\"ListItemText\":\"Add-AzSqlManagedInstanceTransparentDataEncryptionCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlManagedInstanceTransparentDataEncryptionCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzSqlServerKeyVaultKey\",\"ListItemText\":\"Add-AzSqlServerKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlServerKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Add-AzSqlServerTransparentDataEncryptionCertificate\",\"ListItemText\":\"Add-AzSqlServerTransparentDataEncryptionCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlServerTransparentDataEncryptionCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzStackHCIVMAttestation\",\"ListItemText\":\"Add-AzStackHCIVMAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzStackHCIVMAttestation \\r\\n\"},{\"CompletionText\":\"Add-AzStorageAccountManagementPolicyAction\",\"ListItemText\":\"Add-AzStorageAccountManagementPolicyAction\",\"ResultType\":2,\"ToolTip\":\"Add-AzStorageAccountManagementPolicyAction\\r\\n\"},{\"CompletionText\":\"Add-AzStorageAccountNetworkRule\",\"ListItemText\":\"Add-AzStorageAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzStorageAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzSynapseDataFlowDebugSessionPackage\",\"ListItemText\":\"Add-AzSynapseDataFlowDebugSessionPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AzSynapseDataFlowDebugSessionPackage\\r\\n\"},{\"CompletionText\":\"Add-AzSynapseKustoPoolLanguageExtension\",\"ListItemText\":\"Add-AzSynapseKustoPoolLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzSynapseKustoPoolLanguageExtension \\r\\n\"},{\"CompletionText\":\"Add-AzSynapseTriggerSubscription\",\"ListItemText\":\"Add-AzSynapseTriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Add-AzSynapseTriggerSubscription\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerCustomHeaderToEndpoint\",\"ListItemText\":\"Add-AzTrafficManagerCustomHeaderToEndpoint\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerCustomHeaderToEndpoint\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerCustomHeaderToProfile\",\"ListItemText\":\"Add-AzTrafficManagerCustomHeaderToProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerCustomHeaderToProfile\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerEndpointConfig\",\"ListItemText\":\"Add-AzTrafficManagerEndpointConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerEndpointConfig\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerExpectedStatusCodeRange\",\"ListItemText\":\"Add-AzTrafficManagerExpectedStatusCodeRange\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerExpectedStatusCodeRange\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerIpAddressRange\",\"ListItemText\":\"Add-AzTrafficManagerIpAddressRange\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerIpAddressRange\\r\\n\"},{\"CompletionText\":\"Add-AzVhd\",\"ListItemText\":\"Add-AzVhd\",\"ResultType\":2,\"ToolTip\":\"Add-AzVhd\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualHubRoute\",\"ListItemText\":\"Add-AzVirtualHubRoute\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualHubRoute\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualHubRouteTable\",\"ListItemText\":\"Add-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualNetworkGatewayIpConfig\",\"ListItemText\":\"Add-AzVirtualNetworkGatewayIpConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualNetworkGatewayIpConfig\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualNetworkPeering\",\"ListItemText\":\"Add-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Add-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualRouterPeer\",\"ListItemText\":\"Add-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Add-AzVMAdditionalUnattendContent\",\"ListItemText\":\"Add-AzVMAdditionalUnattendContent\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMAdditionalUnattendContent\\r\\n\"},{\"CompletionText\":\"Add-AzVMDataDisk\",\"ListItemText\":\"Add-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzVmGalleryApplication\",\"ListItemText\":\"Add-AzVmGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmGalleryApplication\\r\\n\"},{\"CompletionText\":\"Add-AzVMNetworkInterface\",\"ListItemText\":\"Add-AzVMNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMNetworkInterface\\r\\n\"},{\"CompletionText\":\"Add-AzVMSecret\",\"ListItemText\":\"Add-AzVMSecret\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMSecret\\r\\n\"},{\"CompletionText\":\"Add-AzVmssAdditionalUnattendContent\",\"ListItemText\":\"Add-AzVmssAdditionalUnattendContent\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssAdditionalUnattendContent\\r\\n\"},{\"CompletionText\":\"Add-AzVmssDataDisk\",\"ListItemText\":\"Add-AzVmssDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzVmssDiagnosticsExtension\",\"ListItemText\":\"Add-AzVmssDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Add-AzVmssExtension\",\"ListItemText\":\"Add-AzVmssExtension\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssExtension\\r\\n\"},{\"CompletionText\":\"Add-AzVmssGalleryApplication\",\"ListItemText\":\"Add-AzVmssGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssGalleryApplication\\r\\n\"},{\"CompletionText\":\"Add-AzVMSshPublicKey\",\"ListItemText\":\"Add-AzVMSshPublicKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMSshPublicKey\\r\\n\"},{\"CompletionText\":\"Add-AzVmssNetworkInterfaceConfiguration\",\"ListItemText\":\"Add-AzVmssNetworkInterfaceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssNetworkInterfaceConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzVmssRunCommand\",\"ListItemText\":\"Add-AzVmssRunCommand\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssRunCommand\\r\\n\"},{\"CompletionText\":\"Add-AzVmssSecret\",\"ListItemText\":\"Add-AzVmssSecret\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssSecret\\r\\n\"},{\"CompletionText\":\"Add-AzVmssSshPublicKey\",\"ListItemText\":\"Add-AzVmssSshPublicKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssSshPublicKey\\r\\n\"},{\"CompletionText\":\"Add-AzVmssVMDataDisk\",\"ListItemText\":\"Add-AzVmssVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssVMDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzVmssWinRMListener\",\"ListItemText\":\"Add-AzVmssWinRMListener\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssWinRMListener\\r\\n\"},{\"CompletionText\":\"Add-AzVpnClientRevokedCertificate\",\"ListItemText\":\"Add-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzVpnClientRootCertificate\",\"ListItemText\":\"Add-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzWebAppAccessRestrictionRule\",\"ListItemText\":\"Add-AzWebAppAccessRestrictionRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzWebAppAccessRestrictionRule\\r\\n\"},{\"CompletionText\":\"Add-AzWebAppTrafficRouting\",\"ListItemText\":\"Add-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Add-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Add-AzWebtestAlertRule\",\"ListItemText\":\"Add-AzWebtestAlertRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzWebtestAlertRule\\r\\n\"},{\"CompletionText\":\"Add-BCDataCacheExtension\",\"ListItemText\":\"Add-BCDataCacheExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-BCDataCacheExtension \\r\\n\"},{\"CompletionText\":\"Add-BitLockerKeyProtector\",\"ListItemText\":\"Add-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"Add-BitsFile\",\"ListItemText\":\"Add-BitsFile\",\"ResultType\":2,\"ToolTip\":\"Add-BitsFile\\r\\n\"},{\"CompletionText\":\"Add-CertificateEnrollmentPolicyServer\",\"ListItemText\":\"Add-CertificateEnrollmentPolicyServer\",\"ResultType\":2,\"ToolTip\":\"Add-CertificateEnrollmentPolicyServer\\r\\n\"},{\"CompletionText\":\"Add-Content\",\"ListItemText\":\"Add-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Content [-Path] [-Value] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\\r\\nAdd-Content [-Value] -LiteralPath [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Add-DnsClientDohServerAddress\",\"ListItemText\":\"Add-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Add-DnsClientNrptRule\",\"ListItemText\":\"Add-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Add-DtcClusterTMMapping\",\"ListItemText\":\"Add-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Add-EtwTraceProvider\",\"ListItemText\":\"Add-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Add-History\",\"ListItemText\":\"Add-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-History [[-InputObject] ] [-Passthru] []\\r\\n\"},{\"CompletionText\":\"Add-InitiatorIdToMaskingSet\",\"ListItemText\":\"Add-InitiatorIdToMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-InitiatorIdToMaskingSet \\r\\n\"},{\"CompletionText\":\"Add-JobTrigger\",\"ListItemText\":\"Add-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Add-JobTrigger\\r\\n\"},{\"CompletionText\":\"Add-KdsRootKey\",\"ListItemText\":\"Add-KdsRootKey\",\"ResultType\":2,\"ToolTip\":\"Add-KdsRootKey\\r\\n\"},{\"CompletionText\":\"Add-LocalGroupMember\",\"ListItemText\":\"Add-LocalGroupMember\",\"ResultType\":2,\"ToolTip\":\"Add-LocalGroupMember\\r\\n\"},{\"CompletionText\":\"Add-Member\",\"ListItemText\":\"Add-Member\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Member -InputObject -TypeName [-PassThru] []\\r\\n\\r\\nAdd-Member [-MemberType] [-Name] [[-Value] ] [[-SecondValue] ] -InputObject [-TypeName ] [-Force] [-PassThru] []\\r\\n\\r\\nAdd-Member [-NotePropertyName] [-NotePropertyValue] -InputObject [-TypeName ] [-Force] [-PassThru] []\\r\\n\\r\\nAdd-Member [-NotePropertyMembers] -InputObject [-TypeName ] [-Force] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Add-MpPreference\",\"ListItemText\":\"Add-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-MpPreference \\r\\n\"},{\"CompletionText\":\"Add-NetEventNetworkAdapter\",\"ListItemText\":\"Add-NetEventNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Add-NetEventPacketCaptureProvider\",\"ListItemText\":\"Add-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventProvider\",\"ListItemText\":\"Add-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventVFPProvider\",\"ListItemText\":\"Add-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventVmNetworkAdapter\",\"ListItemText\":\"Add-NetEventVmNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVmNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Add-NetEventVmSwitch\",\"ListItemText\":\"Add-NetEventVmSwitch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVmSwitch \\r\\n\"},{\"CompletionText\":\"Add-NetEventVmSwitchProvider\",\"ListItemText\":\"Add-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventWFPCaptureProvider\",\"ListItemText\":\"Add-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Add-NetIPHttpsCertBinding\",\"ListItemText\":\"Add-NetIPHttpsCertBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetIPHttpsCertBinding \\r\\n\"},{\"CompletionText\":\"Add-NetLbfoTeamMember\",\"ListItemText\":\"Add-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Add-NetLbfoTeamNic\",\"ListItemText\":\"Add-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Add-NetNatExternalAddress\",\"ListItemText\":\"Add-NetNatExternalAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetNatExternalAddress \\r\\n\"},{\"CompletionText\":\"Add-NetNatStaticMapping\",\"ListItemText\":\"Add-NetNatStaticMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetNatStaticMapping \\r\\n\"},{\"CompletionText\":\"Add-NetSwitchTeamMember\",\"ListItemText\":\"Add-NetSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetSwitchTeamMember \\r\\n\"},{\"CompletionText\":\"Add-OdbcDsn\",\"ListItemText\":\"Add-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Add-PartitionAccessPath\",\"ListItemText\":\"Add-PartitionAccessPath\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PartitionAccessPath \\r\\n\"},{\"CompletionText\":\"Add-PhysicalDisk\",\"ListItemText\":\"Add-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Add-PoshGitToProfile\",\"ListItemText\":\"Add-PoshGitToProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PoshGitToProfile \\r\\n\"},{\"CompletionText\":\"Add-Printer\",\"ListItemText\":\"Add-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Printer \\r\\n\"},{\"CompletionText\":\"Add-PrinterDriver\",\"ListItemText\":\"Add-PrinterDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PrinterDriver \\r\\n\"},{\"CompletionText\":\"Add-PrinterPort\",\"ListItemText\":\"Add-PrinterPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PrinterPort \\r\\n\"},{\"CompletionText\":\"Add-ProvisionedAppPackage\",\"ListItemText\":\"Add-ProvisionedAppPackage\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisionedAppPackage\"},{\"CompletionText\":\"Add-ProvisionedAppSharedPackageContainer\",\"ListItemText\":\"Add-ProvisionedAppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisionedAppSharedPackageContainer\"},{\"CompletionText\":\"Add-ProvisionedAppxPackage\",\"ListItemText\":\"Add-ProvisionedAppxPackage\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisionedAppxPackage\"},{\"CompletionText\":\"Add-ProvisioningPackage\",\"ListItemText\":\"Add-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisioningPackage\"},{\"CompletionText\":\"Add-SignerRule\",\"ListItemText\":\"Add-SignerRule\",\"ResultType\":2,\"ToolTip\":\"Add-SignerRule\\r\\n\"},{\"CompletionText\":\"Add-StorageFaultDomain\",\"ListItemText\":\"Add-StorageFaultDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-StorageFaultDomain \\r\\n\"},{\"CompletionText\":\"Add-TargetPortToMaskingSet\",\"ListItemText\":\"Add-TargetPortToMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-TargetPortToMaskingSet \\r\\n\"},{\"CompletionText\":\"Add-TrustedProvisioningCertificate\",\"ListItemText\":\"Add-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-TrustedProvisioningCertificate\"},{\"CompletionText\":\"Add-Type\",\"ListItemText\":\"Add-Type\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Type [-TypeDefinition] [-Language ] [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type [-Name] [-MemberDefinition] [-Namespace ] [-UsingNamespace ] [-Language ] [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type [-Path] [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type -LiteralPath [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type -AssemblyName [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Add-VirtualDiskToMaskingSet\",\"ListItemText\":\"Add-VirtualDiskToMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VirtualDiskToMaskingSet \\r\\n\"},{\"CompletionText\":\"Add-VMAssignableDevice\",\"ListItemText\":\"Add-VMAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Add-VMAssignableDevice\\r\\n\"},{\"CompletionText\":\"Add-VMDirectVirtualDisk\",\"ListItemText\":\"Add-VMDirectVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VMDirectVirtualDisk \\r\\n\"},{\"CompletionText\":\"Add-VMDvdDrive\",\"ListItemText\":\"Add-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Add-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Add-VMFibreChannelHba\",\"ListItemText\":\"Add-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Add-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Add-VMGpuPartitionAdapter\",\"ListItemText\":\"Add-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Add-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Add-VMGroupMember\",\"ListItemText\":\"Add-VMGroupMember\",\"ResultType\":2,\"ToolTip\":\"Add-VMGroupMember\\r\\n\"},{\"CompletionText\":\"Add-VMHardDiskDrive\",\"ListItemText\":\"Add-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Add-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Add-VMHostAssignableDevice\",\"ListItemText\":\"Add-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Add-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Add-VMKeyStorageDrive\",\"ListItemText\":\"Add-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Add-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Add-VMMigrationNetwork\",\"ListItemText\":\"Add-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Add-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapter\",\"ListItemText\":\"Add-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapterAcl\",\"ListItemText\":\"Add-VMNetworkAdapterAcl\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapterAcl\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapterExtendedAcl\",\"ListItemText\":\"Add-VMNetworkAdapterExtendedAcl\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapterExtendedAcl\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Add-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Add-VMPmemController\",\"ListItemText\":\"Add-VMPmemController\",\"ResultType\":2,\"ToolTip\":\"Add-VMPmemController\\r\\n\"},{\"CompletionText\":\"Add-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Add-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Add-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Add-VMScsiController\",\"ListItemText\":\"Add-VMScsiController\",\"ResultType\":2,\"ToolTip\":\"Add-VMScsiController\\r\\n\"},{\"CompletionText\":\"Add-VMStoragePath\",\"ListItemText\":\"Add-VMStoragePath\",\"ResultType\":2,\"ToolTip\":\"Add-VMStoragePath\\r\\n\"},{\"CompletionText\":\"Add-VMSwitch\",\"ListItemText\":\"Add-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitch\\r\\n\"},{\"CompletionText\":\"Add-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Add-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Add-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Add-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Add-VMSwitchTeamMember\",\"ListItemText\":\"Add-VMSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitchTeamMember\\r\\n\"},{\"CompletionText\":\"Add-VpnConnection\",\"ListItemText\":\"Add-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnection \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionRoute\",\"ListItemText\":\"Add-VpnConnectionRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionRoute \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionTriggerApplication\",\"ListItemText\":\"Add-VpnConnectionTriggerApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionTriggerApplication \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionTriggerDnsConfiguration\",\"ListItemText\":\"Add-VpnConnectionTriggerDnsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionTriggerDnsConfiguration \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionTriggerTrustedNetwork\",\"ListItemText\":\"Add-VpnConnectionTriggerTrustedNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionTriggerTrustedNetwork \\r\\n\"},{\"CompletionText\":\"Add-WindowsCapability\",\"ListItemText\":\"Add-WindowsCapability\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsCapability\\r\\n\"},{\"CompletionText\":\"Add-WindowsDriver\",\"ListItemText\":\"Add-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Add-WindowsImage\",\"ListItemText\":\"Add-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsImage\\r\\n\"},{\"CompletionText\":\"Add-WindowsPackage\",\"ListItemText\":\"Add-WindowsPackage\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsPackage\\r\\n\"},{\"CompletionText\":\"AfterAll\",\"ListItemText\":\"AfterAll\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAfterAll \\r\\n\"},{\"CompletionText\":\"AfterEach\",\"ListItemText\":\"AfterEach\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAfterEach \\r\\n\"},{\"CompletionText\":\"agentactivationruntimestarter.exe\",\"ListItemText\":\"agentactivationruntimestarter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\agentactivationruntimestarter.exe\"},{\"CompletionText\":\"AgentService.exe\",\"ListItemText\":\"AgentService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AgentService.exe\"},{\"CompletionText\":\"AggregatorHost.exe\",\"ListItemText\":\"AggregatorHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AggregatorHost.exe\"},{\"CompletionText\":\"aitstatic.exe\",\"ListItemText\":\"aitstatic.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\aitstatic.exe\"},{\"CompletionText\":\"alg.exe\",\"ListItemText\":\"alg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\alg.exe\"},{\"CompletionText\":\"algm\",\"ListItemText\":\"algm\",\"ResultType\":2,\"ToolTip\":\"algm\"},{\"CompletionText\":\"AppHostRegistrationVerifier.exe\",\"ListItemText\":\"AppHostRegistrationVerifier.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppHostRegistrationVerifier.exe\"},{\"CompletionText\":\"appidcertstorecheck.exe\",\"ListItemText\":\"appidcertstorecheck.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appidcertstorecheck.exe\"},{\"CompletionText\":\"appidpolicyconverter.exe\",\"ListItemText\":\"appidpolicyconverter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appidpolicyconverter.exe\"},{\"CompletionText\":\"appidtel.exe\",\"ListItemText\":\"appidtel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appidtel.exe\"},{\"CompletionText\":\"AppInstallerBackgroundUpdate.exe\",\"ListItemText\":\"AppInstallerBackgroundUpdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppInstallerBackgroundUpdate.exe\"},{\"CompletionText\":\"appletviewer.exe\",\"ListItemText\":\"appletviewer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\appletviewer.exe\"},{\"CompletionText\":\"ApplicationFrameHost.exe\",\"ListItemText\":\"ApplicationFrameHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApplicationFrameHost.exe\"},{\"CompletionText\":\"Apply-WindowsUnattend\",\"ListItemText\":\"Apply-WindowsUnattend\",\"ResultType\":2,\"ToolTip\":\"Apply-WindowsUnattend\"},{\"CompletionText\":\"ApplySettingsTemplateCatalog.exe\",\"ListItemText\":\"ApplySettingsTemplateCatalog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApplySettingsTemplateCatalog.exe\"},{\"CompletionText\":\"ApplyTrustOffline.exe\",\"ListItemText\":\"ApplyTrustOffline.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApplyTrustOffline.exe\"},{\"CompletionText\":\"Approve-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Approve-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nApprove-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Approve-AzPrivateEndpointConnection\",\"ListItemText\":\"Approve-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Approve-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Approve-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Approve-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nApprove-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"ApproveChildRequest.exe\",\"ListItemText\":\"ApproveChildRequest.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApproveChildRequest.exe\"},{\"CompletionText\":\"AppVClient.exe\",\"ListItemText\":\"AppVClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVClient.exe\"},{\"CompletionText\":\"AppVDllSurrogate.exe\",\"ListItemText\":\"AppVDllSurrogate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVDllSurrogate.exe\"},{\"CompletionText\":\"appverif.exe\",\"ListItemText\":\"appverif.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appverif.exe\"},{\"CompletionText\":\"AppVNice.exe\",\"ListItemText\":\"AppVNice.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVNice.exe\"},{\"CompletionText\":\"AppVShNotify.exe\",\"ListItemText\":\"AppVShNotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVShNotify.exe\"},{\"CompletionText\":\"appwiz.cpl\",\"ListItemText\":\"appwiz.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appwiz.cpl\"},{\"CompletionText\":\"ARP.EXE\",\"ListItemText\":\"ARP.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ARP.EXE\"},{\"CompletionText\":\"aslr-manager.ps1\",\"ListItemText\":\"aslr-manager.ps1\",\"ResultType\":2,\"ToolTip\":\"aslr-manager.ps1 [-Action] [-paths] []\\r\\n\"},{\"CompletionText\":\"Assert-MockCalled\",\"ListItemText\":\"Assert-MockCalled\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAssert-MockCalled \\r\\n\"},{\"CompletionText\":\"Assert-VerifiableMocks\",\"ListItemText\":\"Assert-VerifiableMocks\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAssert-VerifiableMocks \\r\\n\"},{\"CompletionText\":\"AssignedAccessGuard.exe\",\"ListItemText\":\"AssignedAccessGuard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AssignedAccessGuard.exe\"},{\"CompletionText\":\"AsusDownloadAgent.exe\",\"ListItemText\":\"AsusDownloadAgent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AsusDownloadAgent.exe\"},{\"CompletionText\":\"AsusDownLoadLicense.exe\",\"ListItemText\":\"AsusDownLoadLicense.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AsusDownLoadLicense.exe\"},{\"CompletionText\":\"AsusUpdateCheck.exe\",\"ListItemText\":\"AsusUpdateCheck.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AsusUpdateCheck.exe\"},{\"CompletionText\":\"at.exe\",\"ListItemText\":\"at.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\at.exe\"},{\"CompletionText\":\"AtBroker.exe\",\"ListItemText\":\"AtBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AtBroker.exe\"},{\"CompletionText\":\"attrib.exe\",\"ListItemText\":\"attrib.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\attrib.exe\"},{\"CompletionText\":\"audiodg.exe\",\"ListItemText\":\"audiodg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\audiodg.exe\"},{\"CompletionText\":\"auditpol.exe\",\"ListItemText\":\"auditpol.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\auditpol.exe\"},{\"CompletionText\":\"AuthHost.exe\",\"ListItemText\":\"AuthHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AuthHost.exe\"},{\"CompletionText\":\"autochk.exe\",\"ListItemText\":\"autochk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\autochk.exe\"},{\"CompletionText\":\"AxInstUI.exe\",\"ListItemText\":\"AxInstUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AxInstUI.exe\"},{\"CompletionText\":\"az.cmd\",\"ListItemText\":\"az.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Microsoft SDKs\\\\Azure\\\\CLI2\\\\wbin\\\\az.cmd\"},{\"CompletionText\":\"azman.msc\",\"ListItemText\":\"azman.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\azman.msc\"},{\"CompletionText\":\"azps.ps1\",\"ListItemText\":\"azps.ps1\",\"ResultType\":2,\"ToolTip\":\"azps.ps1 \\r\\n\"},{\"CompletionText\":\"AzureVpn.exe\",\"ListItemText\":\"AzureVpn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\AzureVpn.exe\"},{\"CompletionText\":\"B:\",\"ListItemText\":\"B:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nB: \\r\\n\"},{\"CompletionText\":\"baaupdate.exe\",\"ListItemText\":\"baaupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\baaupdate.exe\"},{\"CompletionText\":\"backgroundTaskHost.exe\",\"ListItemText\":\"backgroundTaskHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\backgroundTaskHost.exe\"},{\"CompletionText\":\"BackgroundTransferHost.exe\",\"ListItemText\":\"BackgroundTransferHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BackgroundTransferHost.exe\"},{\"CompletionText\":\"Backup-AzApiManagement\",\"ListItemText\":\"Backup-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Backup-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Backup-AzDataProtectionBackupInstanceAdhoc\",\"ListItemText\":\"Backup-AzDataProtectionBackupInstanceAdhoc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBackup-AzDataProtectionBackupInstanceAdhoc \\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVault\",\"ListItemText\":\"Backup-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultCertificate\",\"ListItemText\":\"Backup-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultKey\",\"ListItemText\":\"Backup-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Backup-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultSecret\",\"ListItemText\":\"Backup-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Backup-AzRecoveryServicesBackupItem\",\"ListItemText\":\"Backup-AzRecoveryServicesBackupItem\",\"ResultType\":2,\"ToolTip\":\"Backup-AzRecoveryServicesBackupItem\\r\\n\"},{\"CompletionText\":\"Backup-BitLockerKeyProtector\",\"ListItemText\":\"Backup-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBackup-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"BackupToAAD-BitLockerKeyProtector\",\"ListItemText\":\"BackupToAAD-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBackupToAAD-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"bash.exe\",\"ListItemText\":\"bash.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bash.exe\"},{\"CompletionText\":\"bcdboot.exe\",\"ListItemText\":\"bcdboot.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bcdboot.exe\"},{\"CompletionText\":\"bcdedit.exe\",\"ListItemText\":\"bcdedit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bcdedit.exe\"},{\"CompletionText\":\"bdechangepin.exe\",\"ListItemText\":\"bdechangepin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bdechangepin.exe\"},{\"CompletionText\":\"BdeHdCfg.exe\",\"ListItemText\":\"BdeHdCfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BdeHdCfg.exe\"},{\"CompletionText\":\"BdeUISrv.exe\",\"ListItemText\":\"BdeUISrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BdeUISrv.exe\"},{\"CompletionText\":\"bdeunlock.exe\",\"ListItemText\":\"bdeunlock.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bdeunlock.exe\"},{\"CompletionText\":\"BeforeAll\",\"ListItemText\":\"BeforeAll\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBeforeAll \\r\\n\"},{\"CompletionText\":\"BeforeEach\",\"ListItemText\":\"BeforeEach\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBeforeEach \\r\\n\"},{\"CompletionText\":\"bfsvc.exe\",\"ListItemText\":\"bfsvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\bfsvc.exe\"},{\"CompletionText\":\"BioIso.exe\",\"ListItemText\":\"BioIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BioIso.exe\"},{\"CompletionText\":\"BitLockerDeviceEncryption.exe\",\"ListItemText\":\"BitLockerDeviceEncryption.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BitLockerDeviceEncryption.exe\"},{\"CompletionText\":\"BitLockerWizard.exe\",\"ListItemText\":\"BitLockerWizard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BitLockerWizard.exe\"},{\"CompletionText\":\"BitLockerWizardElev.exe\",\"ListItemText\":\"BitLockerWizardElev.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BitLockerWizardElev.exe\"},{\"CompletionText\":\"bitsadmin.exe\",\"ListItemText\":\"bitsadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bitsadmin.exe\"},{\"CompletionText\":\"Block-FileShareAccess\",\"ListItemText\":\"Block-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBlock-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Block-SmbClientAccessToServer\",\"ListItemText\":\"Block-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBlock-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Block-SmbShareAccess\",\"ListItemText\":\"Block-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBlock-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"blsmba\",\"ListItemText\":\"blsmba\",\"ResultType\":2,\"ToolTip\":\"blsmba\"},{\"CompletionText\":\"blsmbclas\",\"ListItemText\":\"blsmbclas\",\"ResultType\":2,\"ToolTip\":\"blsmbclas\"},{\"CompletionText\":\"bootim.exe\",\"ListItemText\":\"bootim.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bootim.exe\"},{\"CompletionText\":\"bootsect.exe\",\"ListItemText\":\"bootsect.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bootsect.exe\"},{\"CompletionText\":\"bridgeunattend.exe\",\"ListItemText\":\"bridgeunattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bridgeunattend.exe\"},{\"CompletionText\":\"browserexport.exe\",\"ListItemText\":\"browserexport.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\browserexport.exe\"},{\"CompletionText\":\"browser_broker.exe\",\"ListItemText\":\"browser_broker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\browser_broker.exe\"},{\"CompletionText\":\"bthprops.cpl\",\"ListItemText\":\"bthprops.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bthprops.cpl\"},{\"CompletionText\":\"bthudtask.exe\",\"ListItemText\":\"bthudtask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bthudtask.exe\"},{\"CompletionText\":\"ByteCodeGenerator.exe\",\"ListItemText\":\"ByteCodeGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ByteCodeGenerator.exe\"},{\"CompletionText\":\"c\",\"ListItemText\":\"c\",\"ResultType\":2,\"ToolTip\":\"code-insiders.cmd\"},{\"CompletionText\":\"C:\",\"ListItemText\":\"C:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nC: \\r\\n\"},{\"CompletionText\":\"cacls.exe\",\"ListItemText\":\"cacls.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cacls.exe\"},{\"CompletionText\":\"calc.exe\",\"ListItemText\":\"calc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\calc.exe\"},{\"CompletionText\":\"CameraSettingsUIHost.exe\",\"ListItemText\":\"CameraSettingsUIHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CameraSettingsUIHost.exe\"},{\"CompletionText\":\"CastSrv.exe\",\"ListItemText\":\"CastSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CastSrv.exe\"},{\"CompletionText\":\"cat\",\"ListItemText\":\"cat\",\"ResultType\":2,\"ToolTip\":\"Get-Content\"},{\"CompletionText\":\"CCG.exe\",\"ListItemText\":\"CCG.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CCG.exe\"},{\"CompletionText\":\"cd\",\"ListItemText\":\"cd\",\"ResultType\":2,\"ToolTip\":\"Set-Location\"},{\"CompletionText\":\"cd..\",\"ListItemText\":\"cd..\",\"ResultType\":2,\"ToolTip\":\"\\r\\ncd.. \\r\\n\"},{\"CompletionText\":\"cd\\\\\",\"ListItemText\":\"cd\\\\\",\"ResultType\":2,\"ToolTip\":\"\\r\\ncd\\\\ \\r\\n\"},{\"CompletionText\":\"cd~\",\"ListItemText\":\"cd~\",\"ResultType\":2,\"ToolTip\":\"\\r\\ncd~ \\r\\n\"},{\"CompletionText\":\"CertEnrollCtrl.exe\",\"ListItemText\":\"CertEnrollCtrl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CertEnrollCtrl.exe\"},{\"CompletionText\":\"certlm.msc\",\"ListItemText\":\"certlm.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certlm.msc\"},{\"CompletionText\":\"certmgr.msc\",\"ListItemText\":\"certmgr.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certmgr.msc\"},{\"CompletionText\":\"certreq.exe\",\"ListItemText\":\"certreq.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certreq.exe\"},{\"CompletionText\":\"certutil.exe\",\"ListItemText\":\"certutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certutil.exe\"},{\"CompletionText\":\"cfy\",\"ListItemText\":\"cfy\",\"ResultType\":2,\"ToolTip\":\"cfy\"},{\"CompletionText\":\"change.exe\",\"ListItemText\":\"change.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\change.exe\"},{\"CompletionText\":\"changepk.exe\",\"ListItemText\":\"changepk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\changepk.exe\"},{\"CompletionText\":\"charmap.exe\",\"ListItemText\":\"charmap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\charmap.exe\"},{\"CompletionText\":\"chcp.com\",\"ListItemText\":\"chcp.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chcp.com\"},{\"CompletionText\":\"chdir\",\"ListItemText\":\"chdir\",\"ResultType\":2,\"ToolTip\":\"Set-Location\"},{\"CompletionText\":\"CheckNetIsolation.exe\",\"ListItemText\":\"CheckNetIsolation.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CheckNetIsolation.exe\"},{\"CompletionText\":\"Checkpoint-VM\",\"ListItemText\":\"Checkpoint-VM\",\"ResultType\":2,\"ToolTip\":\"Checkpoint-VM\\r\\n\"},{\"CompletionText\":\"chglogon.exe\",\"ListItemText\":\"chglogon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chglogon.exe\"},{\"CompletionText\":\"chgport.exe\",\"ListItemText\":\"chgport.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chgport.exe\"},{\"CompletionText\":\"chgusr.exe\",\"ListItemText\":\"chgusr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chgusr.exe\"},{\"CompletionText\":\"chkdsk.exe\",\"ListItemText\":\"chkdsk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chkdsk.exe\"},{\"CompletionText\":\"chkntfs.exe\",\"ListItemText\":\"chkntfs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chkntfs.exe\"},{\"CompletionText\":\"choco.exe\",\"ListItemText\":\"choco.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\choco.exe\"},{\"CompletionText\":\"choice.exe\",\"ListItemText\":\"choice.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\choice.exe\"},{\"CompletionText\":\"CIDiag.exe\",\"ListItemText\":\"CIDiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CIDiag.exe\"},{\"CompletionText\":\"cipher.exe\",\"ListItemText\":\"cipher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cipher.exe\"},{\"CompletionText\":\"CiTool.exe\",\"ListItemText\":\"CiTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CiTool.exe\"},{\"CompletionText\":\"clc\",\"ListItemText\":\"clc\",\"ResultType\":2,\"ToolTip\":\"Clear-Content\"},{\"CompletionText\":\"cleanmgr.exe\",\"ListItemText\":\"cleanmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cleanmgr.exe\"},{\"CompletionText\":\"clear\",\"ListItemText\":\"clear\",\"ResultType\":2,\"ToolTip\":\"Clear-Host\"},{\"CompletionText\":\"Clear-AssignedAccess\",\"ListItemText\":\"Clear-AssignedAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AssignedAccess \\r\\n\"},{\"CompletionText\":\"Clear-AzAppConfigurationDeletedStore\",\"ListItemText\":\"Clear-AzAppConfigurationDeletedStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AzAppConfigurationDeletedStore \\r\\n\"},{\"CompletionText\":\"Clear-AzCdnEndpointContent\",\"ListItemText\":\"Clear-AzCdnEndpointContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AzCdnEndpointContent \\r\\n\"},{\"CompletionText\":\"Clear-AzConfig\",\"ListItemText\":\"Clear-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Clear-AzConfig\\r\\n\"},{\"CompletionText\":\"Clear-AzContext\",\"ListItemText\":\"Clear-AzContext\",\"ResultType\":2,\"ToolTip\":\"Clear-AzContext\\r\\n\"},{\"CompletionText\":\"Clear-AzDefault\",\"ListItemText\":\"Clear-AzDefault\",\"ResultType\":2,\"ToolTip\":\"Clear-AzDefault\\r\\n\"},{\"CompletionText\":\"Clear-AzFrontDoorCdnEndpointContent\",\"ListItemText\":\"Clear-AzFrontDoorCdnEndpointContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AzFrontDoorCdnEndpointContent \\r\\n\"},{\"CompletionText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Clear-AzSqlServerVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlServerVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlServerVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Clear-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Clear-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlAdvancedThreatProtectionSetting\"},{\"CompletionText\":\"Clear-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Clear-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlPoolAdvancedThreatProtectionSetting\"},{\"CompletionText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-BCCache\",\"ListItemText\":\"Clear-BCCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-BCCache \\r\\n\"},{\"CompletionText\":\"Clear-BitLockerAutoUnlock\",\"ListItemText\":\"Clear-BitLockerAutoUnlock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-BitLockerAutoUnlock \\r\\n\"},{\"CompletionText\":\"Clear-Content\",\"ListItemText\":\"Clear-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Content [-Path] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\\r\\nClear-Content -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Clear-Disk\",\"ListItemText\":\"Clear-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Disk \\r\\n\"},{\"CompletionText\":\"Clear-DnsClientCache\",\"ListItemText\":\"Clear-DnsClientCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-DnsClientCache \\r\\n\"},{\"CompletionText\":\"Clear-FileStorageTier\",\"ListItemText\":\"Clear-FileStorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-FileStorageTier \\r\\n\"},{\"CompletionText\":\"Clear-History\",\"ListItemText\":\"Clear-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-History [[-Id] ] [[-Count] ] [-Newest] [-WhatIf] [-Confirm] []\\r\\n\\r\\nClear-History [[-Count] ] [-CommandLine ] [-Newest] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-Host\",\"ListItemText\":\"Clear-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Host \\r\\n\"},{\"CompletionText\":\"Clear-Item\",\"ListItemText\":\"Clear-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Item [-Path] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nClear-Item -LiteralPath [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-ItemProperty\",\"ListItemText\":\"Clear-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-ItemProperty [-Path] [-Name] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nClear-ItemProperty [-Name] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-KdsCache\",\"ListItemText\":\"Clear-KdsCache\",\"ResultType\":2,\"ToolTip\":\"Clear-KdsCache\\r\\n\"},{\"CompletionText\":\"Clear-PcsvDeviceLog\",\"ListItemText\":\"Clear-PcsvDeviceLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-PcsvDeviceLog \\r\\n\"},{\"CompletionText\":\"Clear-RecycleBin\",\"ListItemText\":\"Clear-RecycleBin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-RecycleBin [[-DriveLetter] ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-StorageBusDisk\",\"ListItemText\":\"Clear-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Clear-StorageDiagnosticInfo\",\"ListItemText\":\"Clear-StorageDiagnosticInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-StorageDiagnosticInfo \\r\\n\"},{\"CompletionText\":\"Clear-Tpm\",\"ListItemText\":\"Clear-Tpm\",\"ResultType\":2,\"ToolTip\":\"Clear-Tpm\\r\\n\"},{\"CompletionText\":\"Clear-Variable\",\"ListItemText\":\"Clear-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Variable [-Name] [-Include ] [-Exclude ] [-Force] [-PassThru] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-WindowsCorruptMountPoint\",\"ListItemText\":\"Clear-WindowsCorruptMountPoint\",\"ResultType\":2,\"ToolTip\":\"Clear-WindowsCorruptMountPoint\\r\\n\"},{\"CompletionText\":\"clhsdb.exe\",\"ListItemText\":\"clhsdb.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\clhsdb.exe\"},{\"CompletionText\":\"clhy\",\"ListItemText\":\"clhy\",\"ResultType\":2,\"ToolTip\":\"Clear-History\"},{\"CompletionText\":\"cli\",\"ListItemText\":\"cli\",\"ResultType\":2,\"ToolTip\":\"Clear-Item\"},{\"CompletionText\":\"cliconfg.exe\",\"ListItemText\":\"cliconfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cliconfg.exe\"},{\"CompletionText\":\"clip.exe\",\"ListItemText\":\"clip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\clip.exe\"},{\"CompletionText\":\"clipchamp.exe\",\"ListItemText\":\"clipchamp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\clipchamp.exe\"},{\"CompletionText\":\"ClipDLS.exe\",\"ListItemText\":\"ClipDLS.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ClipDLS.exe\"},{\"CompletionText\":\"ClipRenew.exe\",\"ListItemText\":\"ClipRenew.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ClipRenew.exe\"},{\"CompletionText\":\"ClipUp.exe\",\"ListItemText\":\"ClipUp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ClipUp.exe\"},{\"CompletionText\":\"Close-AzStorageFileHandle\",\"ListItemText\":\"Close-AzStorageFileHandle\",\"ResultType\":2,\"ToolTip\":\"Close-AzStorageFileHandle\\r\\n\"},{\"CompletionText\":\"Close-SmbOpenFile\",\"ListItemText\":\"Close-SmbOpenFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClose-SmbOpenFile \\r\\n\"},{\"CompletionText\":\"Close-SmbSession\",\"ListItemText\":\"Close-SmbSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClose-SmbSession \\r\\n\"},{\"CompletionText\":\"CloudExperienceHostBroker.exe\",\"ListItemText\":\"CloudExperienceHostBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CloudExperienceHostBroker.exe\"},{\"CompletionText\":\"CloudNotifications.exe\",\"ListItemText\":\"CloudNotifications.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CloudNotifications.exe\"},{\"CompletionText\":\"clp\",\"ListItemText\":\"clp\",\"ResultType\":2,\"ToolTip\":\"Clear-ItemProperty\"},{\"CompletionText\":\"cls\",\"ListItemText\":\"cls\",\"ResultType\":2,\"ToolTip\":\"Clear-Host\"},{\"CompletionText\":\"clv\",\"ListItemText\":\"clv\",\"ResultType\":2,\"ToolTip\":\"Clear-Variable\"},{\"CompletionText\":\"cmd.exe\",\"ListItemText\":\"cmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmd.exe\"},{\"CompletionText\":\"cmdkey.exe\",\"ListItemText\":\"cmdkey.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmdkey.exe\"},{\"CompletionText\":\"cmdl32.exe\",\"ListItemText\":\"cmdl32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmdl32.exe\"},{\"CompletionText\":\"cmmon32.exe\",\"ListItemText\":\"cmmon32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmmon32.exe\"},{\"CompletionText\":\"cmpcfg\",\"ListItemText\":\"cmpcfg\",\"ResultType\":2,\"ToolTip\":\"cmpcfg\"},{\"CompletionText\":\"cmstp.exe\",\"ListItemText\":\"cmstp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmstp.exe\"},{\"CompletionText\":\"cnsn\",\"ListItemText\":\"cnsn\",\"ResultType\":2,\"ToolTip\":\"Connect-PSSession\"},{\"CompletionText\":\"code-exploration.cmd\",\"ListItemText\":\"code-exploration.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Exploration\\\\bin\\\\code-exploration.cmd\"},{\"CompletionText\":\"code-insiders.cmd\",\"ListItemText\":\"code-insiders.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Insiders\\\\bin\\\\code-insiders.cmd\"},{\"CompletionText\":\"code-tunnel-exploration.exe\",\"ListItemText\":\"code-tunnel-exploration.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Exploration\\\\bin\\\\code-tunnel-exploration.exe\"},{\"CompletionText\":\"code-tunnel-insiders.exe\",\"ListItemText\":\"code-tunnel-insiders.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Insiders\\\\bin\\\\code-tunnel-insiders.exe\"},{\"CompletionText\":\"code-tunnel.exe\",\"ListItemText\":\"code-tunnel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Microsoft VS Code\\\\bin\\\\code-tunnel.exe\"},{\"CompletionText\":\"code.cmd\",\"ListItemText\":\"code.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Microsoft VS Code\\\\bin\\\\code.cmd\"},{\"CompletionText\":\"cofire.exe\",\"ListItemText\":\"cofire.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cofire.exe\"},{\"CompletionText\":\"colorcpl.exe\",\"ListItemText\":\"colorcpl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\colorcpl.exe\"},{\"CompletionText\":\"com.docker.cli.exe\",\"ListItemText\":\"com.docker.cli.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\com.docker.cli.exe\"},{\"CompletionText\":\"comexp.msc\",\"ListItemText\":\"comexp.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\comexp.msc\"},{\"CompletionText\":\"comp.exe\",\"ListItemText\":\"comp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\comp.exe\"},{\"CompletionText\":\"compact.exe\",\"ListItemText\":\"compact.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\compact.exe\"},{\"CompletionText\":\"compare\",\"ListItemText\":\"compare\",\"ResultType\":2,\"ToolTip\":\"Compare-Object\"},{\"CompletionText\":\"Compare-Object\",\"ListItemText\":\"Compare-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCompare-Object [-ReferenceObject] [-DifferenceObject] [-SyncWindow ] [-Property ] [-ExcludeDifferent] [-IncludeEqual] [-PassThru] [-Culture ] [-CaseSensitive] []\\r\\n\"},{\"CompletionText\":\"Compare-VM\",\"ListItemText\":\"Compare-VM\",\"ResultType\":2,\"ToolTip\":\"Compare-VM\\r\\n\"},{\"CompletionText\":\"CompatTelRunner.exe\",\"ListItemText\":\"CompatTelRunner.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CompatTelRunner.exe\"},{\"CompletionText\":\"Complete-AzServiceBusMigration\",\"ListItemText\":\"Complete-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nComplete-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Complete-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Complete-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Complete-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Complete-BitsTransfer\",\"ListItemText\":\"Complete-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Complete-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Complete-DtcDiagnosticTransaction\",\"ListItemText\":\"Complete-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Complete-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"Complete-VMFailover\",\"ListItemText\":\"Complete-VMFailover\",\"ResultType\":2,\"ToolTip\":\"Complete-VMFailover\\r\\n\"},{\"CompletionText\":\"compmgmt.msc\",\"ListItemText\":\"compmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\compmgmt.msc\"},{\"CompletionText\":\"CompMgmtLauncher.exe\",\"ListItemText\":\"CompMgmtLauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CompMgmtLauncher.exe\"},{\"CompletionText\":\"CompPkgSrv.exe\",\"ListItemText\":\"CompPkgSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CompPkgSrv.exe\"},{\"CompletionText\":\"Compress-Archive\",\"ListItemText\":\"Compress-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCompress-Archive \\r\\n\"},{\"CompletionText\":\"ComputerDefaults.exe\",\"ListItemText\":\"ComputerDefaults.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ComputerDefaults.exe\"},{\"CompletionText\":\"Configuration\",\"ListItemText\":\"Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConfiguration \\r\\n\"},{\"CompletionText\":\"Confirm-AzSecurityAutomation\",\"ListItemText\":\"Confirm-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Confirm-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"Confirm-SecureBootUEFI\",\"ListItemText\":\"Confirm-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Confirm-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"conhost.exe\",\"ListItemText\":\"conhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\conhost.exe\"},{\"CompletionText\":\"Connect-AzAccount\",\"ListItemText\":\"Connect-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Connect-AzAccount\\r\\n\"},{\"CompletionText\":\"Connect-AzContainerRegistry\",\"ListItemText\":\"Connect-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"Connect-AzContainerRegistry\\r\\n\"},{\"CompletionText\":\"Connect-IscsiTarget\",\"ListItemText\":\"Connect-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConnect-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Connect-PSSession\",\"ListItemText\":\"Connect-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConnect-PSSession -Name [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-Session] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-ComputerName] [-ApplicationName ] [-ConfigurationName ] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession -ComputerName -InstanceId [-ApplicationName ] [-ConfigurationName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-ConnectionUri] [-ConfigurationName ] [-AllowRedirection] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-ConnectionUri] -InstanceId [-ConfigurationName ] [-AllowRedirection] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession -InstanceId [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-Id] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Connect-VirtualDisk\",\"ListItemText\":\"Connect-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConnect-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Connect-VMNetworkAdapter\",\"ListItemText\":\"Connect-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Connect-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Connect-VMSan\",\"ListItemText\":\"Connect-VMSan\",\"ResultType\":2,\"ToolTip\":\"Connect-VMSan\\r\\n\"},{\"CompletionText\":\"Connect-WSMan\",\"ListItemText\":\"Connect-WSMan\",\"ResultType\":2,\"ToolTip\":\"Connect-WSMan\\r\\n\"},{\"CompletionText\":\"consent.exe\",\"ListItemText\":\"consent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\consent.exe\"},{\"CompletionText\":\"Context\",\"ListItemText\":\"Context\",\"ResultType\":2,\"ToolTip\":\"\\r\\nContext \\r\\n\"},{\"CompletionText\":\"control.exe\",\"ListItemText\":\"control.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\control.exe\"},{\"CompletionText\":\"Convert-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Convert-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Convert-AzSqlDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Convert-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Convert-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Convert-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Convert-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ListItemText\":\"Convert-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Convert-AzSynapseSqlPoolVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Convert-Path\",\"ListItemText\":\"Convert-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvert-Path [-Path] []\\r\\n\\r\\nConvert-Path -LiteralPath []\\r\\n\"},{\"CompletionText\":\"Convert-VHD\",\"ListItemText\":\"Convert-VHD\",\"ResultType\":2,\"ToolTip\":\"Convert-VHD\\r\\n\"},{\"CompletionText\":\"convert.exe\",\"ListItemText\":\"convert.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\convert.exe\"},{\"CompletionText\":\"ConvertFrom-CIPolicy\",\"ListItemText\":\"ConvertFrom-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"ConvertFrom-CIPolicy\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Csv\",\"ListItemText\":\"ConvertFrom-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Csv [-InputObject] [[-Delimiter] ] [-Header ] []\\r\\n\\r\\nConvertFrom-Csv [-InputObject] -UseCulture [-Header ] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Json\",\"ListItemText\":\"ConvertFrom-Json\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Json [-InputObject] [-AsHashtable] [-Depth ] [-NoEnumerate] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Markdown\",\"ListItemText\":\"ConvertFrom-Markdown\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Markdown [-Path] [-AsVT100EncodedString] []\\r\\n\\r\\nConvertFrom-Markdown -LiteralPath [-AsVT100EncodedString] []\\r\\n\\r\\nConvertFrom-Markdown -InputObject [-AsVT100EncodedString] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-SddlString\",\"ListItemText\":\"ConvertFrom-SddlString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-SddlString [-Sddl] [-Type ] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-SecureString\",\"ListItemText\":\"ConvertFrom-SecureString\",\"ResultType\":2,\"ToolTip\":\"ConvertFrom-SecureString\\r\\n\"},{\"CompletionText\":\"ConvertFrom-StringData\",\"ListItemText\":\"ConvertFrom-StringData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-StringData [-StringData] [[-Delimiter] ] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Yaml\",\"ListItemText\":\"ConvertFrom-Yaml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Yaml \\r\\n\"},{\"CompletionText\":\"ConvertTo-AzVMManagedDisk\",\"ListItemText\":\"ConvertTo-AzVMManagedDisk\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-AzVMManagedDisk\\r\\n\"},{\"CompletionText\":\"ConvertTo-Csv\",\"ListItemText\":\"ConvertTo-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Csv [-InputObject] [[-Delimiter] ] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] []\\r\\n\\r\\nConvertTo-Csv [-InputObject] [-UseCulture] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-HgsKeyProtector\",\"ListItemText\":\"ConvertTo-HgsKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-HgsKeyProtector \\r\\n\"},{\"CompletionText\":\"ConvertTo-Html\",\"ListItemText\":\"ConvertTo-Html\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Html [[-Property] ] [[-Head] ] [[-Title] ] [[-Body] ] [-InputObject ] [-As ] [-CssUri ] [-PostContent ] [-PreContent ] [-Meta ] [-Charset ] [-Transitional] []\\r\\n\\r\\nConvertTo-Html [[-Property] ] [-InputObject ] [-As ] [-Fragment] [-PostContent ] [-PreContent ] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-Json\",\"ListItemText\":\"ConvertTo-Json\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Json [-InputObject] [-Depth ] [-Compress] [-EnumsAsStrings] [-AsArray] [-EscapeHandling ] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-ProcessMitigationPolicy\",\"ListItemText\":\"ConvertTo-ProcessMitigationPolicy\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-ProcessMitigationPolicy\\r\\n\"},{\"CompletionText\":\"ConvertTo-SecureString\",\"ListItemText\":\"ConvertTo-SecureString\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-SecureString\\r\\n\"},{\"CompletionText\":\"ConvertTo-TpmOwnerAuth\",\"ListItemText\":\"ConvertTo-TpmOwnerAuth\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-TpmOwnerAuth\\r\\n\"},{\"CompletionText\":\"ConvertTo-Xml\",\"ListItemText\":\"ConvertTo-Xml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Xml [-InputObject] [-Depth ] [-NoTypeInformation] [-As ] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-Yaml\",\"ListItemText\":\"ConvertTo-Yaml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Yaml \\r\\n\"},{\"CompletionText\":\"convertvhd.exe\",\"ListItemText\":\"convertvhd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\convertvhd.exe\"},{\"CompletionText\":\"copy\",\"ListItemText\":\"copy\",\"ResultType\":2,\"ToolTip\":\"Copy-Item\"},{\"CompletionText\":\"Copy-AzRecoveryServicesVault\",\"ListItemText\":\"Copy-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Copy-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Copy-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Copy-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Copy-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Copy-AzStorageBlob\",\"ListItemText\":\"Copy-AzStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Copy-AzStorageBlob\\r\\n\"},{\"CompletionText\":\"Copy-BcdEntry\",\"ListItemText\":\"Copy-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"Copy-BcdEntry\\r\\n\"},{\"CompletionText\":\"Copy-Item\",\"ListItemText\":\"Copy-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-Item [-Path] [[-Destination] ] [-Container] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] [-FromSession ] [-ToSession ] []\\r\\n\\r\\nCopy-Item [[-Destination] ] -LiteralPath [-Container] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] [-FromSession ] [-ToSession ] []\\r\\n\"},{\"CompletionText\":\"Copy-ItemProperty\",\"ListItemText\":\"Copy-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-ItemProperty [-Path] [-Destination] [-Name] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nCopy-ItemProperty [-Destination] [-Name] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Copy-NetFirewallRule\",\"ListItemText\":\"Copy-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Copy-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecMainModeRule\",\"ListItemText\":\"Copy-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Copy-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Copy-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Copy-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecRule\",\"ListItemText\":\"Copy-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Copy-UserInternationalSettingsToSystem\",\"ListItemText\":\"Copy-UserInternationalSettingsToSystem\",\"ResultType\":2,\"ToolTip\":\"Copy-UserInternationalSettingsToSystem\\r\\n\"},{\"CompletionText\":\"Copy-VMFile\",\"ListItemText\":\"Copy-VMFile\",\"ResultType\":2,\"ToolTip\":\"Copy-VMFile\\r\\n\"},{\"CompletionText\":\"coredpussvr.exe\",\"ListItemText\":\"coredpussvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\coredpussvr.exe\"},{\"CompletionText\":\"corepack.cmd\",\"ListItemText\":\"corepack.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\corepack.cmd\"},{\"CompletionText\":\"cp\",\"ListItemText\":\"cp\",\"ResultType\":2,\"ToolTip\":\"Copy-Item\"},{\"CompletionText\":\"cpi\",\"ListItemText\":\"cpi\",\"ResultType\":2,\"ToolTip\":\"Copy-Item\"},{\"CompletionText\":\"cpp\",\"ListItemText\":\"cpp\",\"ResultType\":2,\"ToolTip\":\"Copy-ItemProperty\"},{\"CompletionText\":\"createdump.exe\",\"ListItemText\":\"createdump.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\WindowsApps\\\\Microsoft.PowerShell_7.4.2.0_x64__8wekyb3d8bbwe\\\\createdump.exe\"},{\"CompletionText\":\"CredentialEnrollmentManager.exe\",\"ListItemText\":\"CredentialEnrollmentManager.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CredentialEnrollmentManager.exe\"},{\"CompletionText\":\"CredentialUIBroker.exe\",\"ListItemText\":\"CredentialUIBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CredentialUIBroker.exe\"},{\"CompletionText\":\"credwiz.exe\",\"ListItemText\":\"credwiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\credwiz.exe\"},{\"CompletionText\":\"cscript.exe\",\"ListItemText\":\"cscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cscript.exe\"},{\"CompletionText\":\"csrss.exe\",\"ListItemText\":\"csrss.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\csrss.exe\"},{\"CompletionText\":\"cssmbo\",\"ListItemText\":\"cssmbo\",\"ResultType\":2,\"ToolTip\":\"cssmbo\"},{\"CompletionText\":\"cssmbse\",\"ListItemText\":\"cssmbse\",\"ResultType\":2,\"ToolTip\":\"cssmbse\"},{\"CompletionText\":\"ctfmon.exe\",\"ListItemText\":\"ctfmon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ctfmon.exe\"},{\"CompletionText\":\"cttune.exe\",\"ListItemText\":\"cttune.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cttune.exe\"},{\"CompletionText\":\"cttunesvr.exe\",\"ListItemText\":\"cttunesvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cttunesvr.exe\"},{\"CompletionText\":\"cty\",\"ListItemText\":\"cty\",\"ResultType\":2,\"ToolTip\":\"cty\"},{\"CompletionText\":\"curl.exe\",\"ListItemText\":\"curl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\curl.exe\"},{\"CompletionText\":\"CustomInstallExec.exe\",\"ListItemText\":\"CustomInstallExec.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CustomInstallExec.exe\"},{\"CompletionText\":\"CustomShellHost.exe\",\"ListItemText\":\"CustomShellHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CustomShellHost.exe\"},{\"CompletionText\":\"cvpa\",\"ListItemText\":\"cvpa\",\"ResultType\":2,\"ToolTip\":\"Convert-Path\"},{\"CompletionText\":\"d3dconfig.exe\",\"ListItemText\":\"d3dconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\d3dconfig.exe\"},{\"CompletionText\":\"D:\",\"ListItemText\":\"D:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nD: \\r\\n\"},{\"CompletionText\":\"dasHost.exe\",\"ListItemText\":\"dasHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dasHost.exe\"},{\"CompletionText\":\"DataExchangeHost.exe\",\"ListItemText\":\"DataExchangeHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DataExchangeHost.exe\"},{\"CompletionText\":\"DataStoreCacheDumpTool.exe\",\"ListItemText\":\"DataStoreCacheDumpTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DataStoreCacheDumpTool.exe\"},{\"CompletionText\":\"dbp\",\"ListItemText\":\"dbp\",\"ResultType\":2,\"ToolTip\":\"Disable-PSBreakpoint\"},{\"CompletionText\":\"dccw.exe\",\"ListItemText\":\"dccw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dccw.exe\"},{\"CompletionText\":\"dcomcnfg.exe\",\"ListItemText\":\"dcomcnfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dcomcnfg.exe\"},{\"CompletionText\":\"ddodiag.exe\",\"ListItemText\":\"ddodiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ddodiag.exe\"},{\"CompletionText\":\"debian.exe\",\"ListItemText\":\"debian.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\debian.exe\"},{\"CompletionText\":\"Debug-FileShare\",\"ListItemText\":\"Debug-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-FileShare \\r\\n\"},{\"CompletionText\":\"Debug-Job\",\"ListItemText\":\"Debug-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Job [-Job] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Job [-Name] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Job [-Id] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Job [-InstanceId] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Debug-MMAppPrelaunch\",\"ListItemText\":\"Debug-MMAppPrelaunch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-MMAppPrelaunch \\r\\n\"},{\"CompletionText\":\"Debug-Process\",\"ListItemText\":\"Debug-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Process [-Name] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Process [-Id] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Process -InputObject [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Debug-Runspace\",\"ListItemText\":\"Debug-Runspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Runspace [-Runspace] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Runspace [-Name] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Runspace [-Id] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Runspace [-InstanceId] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Debug-StorageSubSystem\",\"ListItemText\":\"Debug-StorageSubSystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-StorageSubSystem \\r\\n\"},{\"CompletionText\":\"Debug-VM\",\"ListItemText\":\"Debug-VM\",\"ResultType\":2,\"ToolTip\":\"Debug-VM\\r\\n\"},{\"CompletionText\":\"Debug-Volume\",\"ListItemText\":\"Debug-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Volume \\r\\n\"},{\"CompletionText\":\"Defrag.exe\",\"ListItemText\":\"Defrag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Defrag.exe\"},{\"CompletionText\":\"del\",\"ListItemText\":\"del\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"Delete-DeliveryOptimizationCache\",\"ListItemText\":\"Delete-DeliveryOptimizationCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDelete-DeliveryOptimizationCache \\r\\n\"},{\"CompletionText\":\"Deny-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Deny-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDeny-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Deny-AzPrivateEndpointConnection\",\"ListItemText\":\"Deny-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Deny-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Deny-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Deny-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDeny-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Deploy-AzNetworkManagerCommit\",\"ListItemText\":\"Deploy-AzNetworkManagerCommit\",\"ResultType\":2,\"ToolTip\":\"Deploy-AzNetworkManagerCommit\\r\\n\"},{\"CompletionText\":\"deploymentcsphelper.exe\",\"ListItemText\":\"deploymentcsphelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\deploymentcsphelper.exe\"},{\"CompletionText\":\"Describe\",\"ListItemText\":\"Describe\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDescribe \\r\\n\"},{\"CompletionText\":\"desk.cpl\",\"ListItemText\":\"desk.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\desk.cpl\"},{\"CompletionText\":\"desktopimgdownldr.exe\",\"ListItemText\":\"desktopimgdownldr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\desktopimgdownldr.exe\"},{\"CompletionText\":\"DeviceCensus.exe\",\"ListItemText\":\"DeviceCensus.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceCensus.exe\"},{\"CompletionText\":\"DeviceCredentialDeployment.exe\",\"ListItemText\":\"DeviceCredentialDeployment.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceCredentialDeployment.exe\"},{\"CompletionText\":\"DeviceEject.exe\",\"ListItemText\":\"DeviceEject.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceEject.exe\"},{\"CompletionText\":\"DeviceEnroller.exe\",\"ListItemText\":\"DeviceEnroller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceEnroller.exe\"},{\"CompletionText\":\"DevicePairingWizard.exe\",\"ListItemText\":\"DevicePairingWizard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DevicePairingWizard.exe\"},{\"CompletionText\":\"DeviceProperties.exe\",\"ListItemText\":\"DeviceProperties.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceProperties.exe\"},{\"CompletionText\":\"devmgmt.msc\",\"ListItemText\":\"devmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\devmgmt.msc\"},{\"CompletionText\":\"DevModeRunAsUserConfig.msc\",\"ListItemText\":\"DevModeRunAsUserConfig.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DevModeRunAsUserConfig.msc\"},{\"CompletionText\":\"DFDWiz.exe\",\"ListItemText\":\"DFDWiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DFDWiz.exe\"},{\"CompletionText\":\"dfrgui.exe\",\"ListItemText\":\"dfrgui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dfrgui.exe\"},{\"CompletionText\":\"dialer.exe\",\"ListItemText\":\"dialer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dialer.exe\"},{\"CompletionText\":\"diff\",\"ListItemText\":\"diff\",\"ResultType\":2,\"ToolTip\":\"Compare-Object\"},{\"CompletionText\":\"dir\",\"ListItemText\":\"dir\",\"ResultType\":2,\"ToolTip\":\"Get-ChildItem\"},{\"CompletionText\":\"directxdatabaseupdater.exe\",\"ListItemText\":\"directxdatabaseupdater.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\directxdatabaseupdater.exe\"},{\"CompletionText\":\"dirmngr.exe\",\"ListItemText\":\"dirmngr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\dirmngr.exe\"},{\"CompletionText\":\"dirmngr_ldap.exe\",\"ListItemText\":\"dirmngr_ldap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\dirmngr_ldap.exe\"},{\"CompletionText\":\"Disable-AppBackgroundTaskDiagnosticLog\",\"ListItemText\":\"Disable-AppBackgroundTaskDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Disable-AppBackgroundTaskDiagnosticLog\\r\\n\"},{\"CompletionText\":\"Disable-AzAdvisorRecommendation\",\"ListItemText\":\"Disable-AzAdvisorRecommendation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzAdvisorRecommendation \\r\\n\"},{\"CompletionText\":\"Disable-AzAksAddOn\",\"ListItemText\":\"Disable-AzAksAddOn\",\"ResultType\":2,\"ToolTip\":\"Disable-AzAksAddOn\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchAutoScale\",\"ListItemText\":\"Disable-AzBatchAutoScale\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchAutoScale\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchComputeNodeScheduling\",\"ListItemText\":\"Disable-AzBatchComputeNodeScheduling\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchComputeNodeScheduling\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchJob\",\"ListItemText\":\"Disable-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchJobSchedule\",\"ListItemText\":\"Disable-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Disable-AzCdnCustomDomainCustomHttps\",\"ListItemText\":\"Disable-AzCdnCustomDomainCustomHttps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzCdnCustomDomainCustomHttps \\r\\n\"},{\"CompletionText\":\"Disable-AzContextAutosave\",\"ListItemText\":\"Disable-AzContextAutosave\",\"ResultType\":2,\"ToolTip\":\"Disable-AzContextAutosave\\r\\n\"},{\"CompletionText\":\"Disable-AzDataCollection\",\"ListItemText\":\"Disable-AzDataCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzDataCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzFrontDoorCustomDomainHttps\",\"ListItemText\":\"Disable-AzFrontDoorCustomDomainHttps\",\"ResultType\":2,\"ToolTip\":\"Disable-AzFrontDoorCustomDomainHttps\\r\\n\"},{\"CompletionText\":\"Disable-AzHDInsightAzureMonitor\",\"ListItemText\":\"Disable-AzHDInsightAzureMonitor\",\"ResultType\":2,\"ToolTip\":\"Disable-AzHDInsightAzureMonitor\\r\\n\"},{\"CompletionText\":\"Disable-AzHDInsightMonitoring\",\"ListItemText\":\"Disable-AzHDInsightMonitoring\",\"ResultType\":2,\"ToolTip\":\"Disable-AzHDInsightMonitoring\\r\\n\"},{\"CompletionText\":\"Disable-AzIotSecurityAnalyticsAggregatedAlert\",\"ListItemText\":\"Disable-AzIotSecurityAnalyticsAggregatedAlert\",\"ResultType\":2,\"ToolTip\":\"Disable-AzIotSecurityAnalyticsAggregatedAlert\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsIISLogCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsIISLogCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsIISLogCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsLinuxCustomLogCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsLinuxCustomLogCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsLinuxCustomLogCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsLinuxPerformanceCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsLinuxPerformanceCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsLinuxPerformanceCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsLinuxSyslogCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsLinuxSyslogCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsLinuxSyslogCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzRecoveryServicesBackupAutoProtection\",\"ListItemText\":\"Disable-AzRecoveryServicesBackupAutoProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzRecoveryServicesBackupAutoProtection\\r\\n\"},{\"CompletionText\":\"Disable-AzRecoveryServicesBackupProtection\",\"ListItemText\":\"Disable-AzRecoveryServicesBackupProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzRecoveryServicesBackupProtection\\r\\n\"},{\"CompletionText\":\"Disable-AzRecoveryServicesBackupRPMountScript\",\"ListItemText\":\"Disable-AzRecoveryServicesBackupRPMountScript\",\"ResultType\":2,\"ToolTip\":\"Disable-AzRecoveryServicesBackupRPMountScript\\r\\n\"},{\"CompletionText\":\"Disable-AzSecurityAdvancedThreatProtection\",\"ListItemText\":\"Disable-AzSecurityAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSecurityAdvancedThreatProtection\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlDatabaseLedgerDigestUpload\",\"ListItemText\":\"Disable-AzSqlDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlDatabaseSensitivityRecommendation\",\"ListItemText\":\"Disable-AzSqlDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Disable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceAdvancedDataSecurity\",\"ListItemText\":\"Disable-AzSqlInstanceAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ListItemText\":\"Disable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ListItemText\":\"Disable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Disable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlServerActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlServerAdvancedDataSecurity\",\"ListItemText\":\"Disable-AzSqlServerAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlServerAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Disable-AzStackHCIAttestation\",\"ListItemText\":\"Disable-AzStackHCIAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzStackHCIAttestation \\r\\n\"},{\"CompletionText\":\"Disable-AzStackHCIRemoteSupport\",\"ListItemText\":\"Disable-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Disable-AzStorageBlobDeleteRetentionPolicy\",\"ListItemText\":\"Disable-AzStorageBlobDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageBlobDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageBlobLastAccessTimeTracking\",\"ListItemText\":\"Disable-AzStorageBlobLastAccessTimeTracking\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageBlobLastAccessTimeTracking\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageBlobRestorePolicy\",\"ListItemText\":\"Disable-AzStorageBlobRestorePolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageBlobRestorePolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageContainerDeleteRetentionPolicy\",\"ListItemText\":\"Disable-AzStorageContainerDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageContainerDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageDeleteRetentionPolicy\",\"ListItemText\":\"Disable-AzStorageDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageSoftDelete\",\"ListItemText\":\"Disable-AzStorageSoftDelete\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageSoftDelete\"},{\"CompletionText\":\"Disable-AzStorageStaticWebsite\",\"ListItemText\":\"Disable-AzStorageStaticWebsite\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageStaticWebsite\\r\\n\"},{\"CompletionText\":\"Disable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Disable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Disable-AzSynapseSqlAdvancedDataSecurity\",\"ListItemText\":\"Disable-AzSynapseSqlAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseSqlAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Disable-AzSynapseSqlAdvancedThreatProtection\",\"ListItemText\":\"Disable-AzSynapseSqlAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseSqlAdvancedThreatProtection\"},{\"CompletionText\":\"Disable-AzSynapseSqlPoolSensitivityRecommendation\",\"ListItemText\":\"Disable-AzSynapseSqlPoolSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseSqlPoolSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Disable-AzTrafficManagerEndpoint\",\"ListItemText\":\"Disable-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Disable-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Disable-AzTrafficManagerProfile\",\"ListItemText\":\"Disable-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Disable-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Disable-AzureRmAlias\",\"ListItemText\":\"Disable-AzureRmAlias\",\"ResultType\":2,\"ToolTip\":\"Disable-AzureRmAlias\\r\\n\"},{\"CompletionText\":\"Disable-AzVMDiskEncryption\",\"ListItemText\":\"Disable-AzVMDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Disable-AzVMDiskEncryption\\r\\n\"},{\"CompletionText\":\"Disable-AzVmssDiskEncryption\",\"ListItemText\":\"Disable-AzVmssDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Disable-AzVmssDiskEncryption\\r\\n\"},{\"CompletionText\":\"Disable-BC\",\"ListItemText\":\"Disable-BC\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BC \\r\\n\"},{\"CompletionText\":\"Disable-BcdElementBootDebug\",\"ListItemText\":\"Disable-BcdElementBootDebug\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementBootDebug\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementBootEms\",\"ListItemText\":\"Disable-BcdElementBootEms\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementBootEms\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementDebug\",\"ListItemText\":\"Disable-BcdElementDebug\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementDebug\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementEms\",\"ListItemText\":\"Disable-BcdElementEms\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementEms\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementEventLogging\",\"ListItemText\":\"Disable-BcdElementEventLogging\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementEventLogging\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementHypervisorDebug\",\"ListItemText\":\"Disable-BcdElementHypervisorDebug\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementHypervisorDebug\\r\\n\"},{\"CompletionText\":\"Disable-BCDowngrading\",\"ListItemText\":\"Disable-BCDowngrading\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BCDowngrading \\r\\n\"},{\"CompletionText\":\"Disable-BCServeOnBattery\",\"ListItemText\":\"Disable-BCServeOnBattery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BCServeOnBattery \\r\\n\"},{\"CompletionText\":\"Disable-BitLocker\",\"ListItemText\":\"Disable-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BitLocker \\r\\n\"},{\"CompletionText\":\"Disable-BitLockerAutoUnlock\",\"ListItemText\":\"Disable-BitLockerAutoUnlock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BitLockerAutoUnlock \\r\\n\"},{\"CompletionText\":\"Disable-DAManualEntryPointSelection\",\"ListItemText\":\"Disable-DAManualEntryPointSelection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-DAManualEntryPointSelection \\r\\n\"},{\"CompletionText\":\"Disable-DeliveryOptimizationVerboseLogs\",\"ListItemText\":\"Disable-DeliveryOptimizationVerboseLogs\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-DeliveryOptimizationVerboseLogs \\r\\n\"},{\"CompletionText\":\"Disable-DscDebug\",\"ListItemText\":\"Disable-DscDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-DscDebug \\r\\n\"},{\"CompletionText\":\"Disable-ExperimentalFeature\",\"ListItemText\":\"Disable-ExperimentalFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-ExperimentalFeature [-Name] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-JobTrigger\",\"ListItemText\":\"Disable-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Disable-JobTrigger\\r\\n\"},{\"CompletionText\":\"Disable-LocalUser\",\"ListItemText\":\"Disable-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Disable-LocalUser\\r\\n\"},{\"CompletionText\":\"Disable-MMAgent\",\"ListItemText\":\"Disable-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-MMAgent \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapter\",\"ListItemText\":\"Disable-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapter \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterBinding\",\"ListItemText\":\"Disable-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterChecksumOffload\",\"ListItemText\":\"Disable-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Disable-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterIPsecOffload\",\"ListItemText\":\"Disable-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterLso\",\"ListItemText\":\"Disable-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterPacketDirect\",\"ListItemText\":\"Disable-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterPowerManagement\",\"ListItemText\":\"Disable-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterQos\",\"ListItemText\":\"Disable-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterRdma\",\"ListItemText\":\"Disable-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterRsc\",\"ListItemText\":\"Disable-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterRss\",\"ListItemText\":\"Disable-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterSriov\",\"ListItemText\":\"Disable-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterUso\",\"ListItemText\":\"Disable-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterVmq\",\"ListItemText\":\"Disable-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Disable-NetDnsTransitionConfiguration\",\"ListItemText\":\"Disable-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Disable-NetFirewallHyperVRule\",\"ListItemText\":\"Disable-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Disable-NetFirewallRule\",\"ListItemText\":\"Disable-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Disable-NetIPHttpsProfile\",\"ListItemText\":\"Disable-NetIPHttpsProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetIPHttpsProfile \\r\\n\"},{\"CompletionText\":\"Disable-NetIPsecMainModeRule\",\"ListItemText\":\"Disable-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Disable-NetIPsecRule\",\"ListItemText\":\"Disable-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Disable-NetNatTransitionConfiguration\",\"ListItemText\":\"Disable-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Disable-NetworkSwitchEthernetPort\",\"ListItemText\":\"Disable-NetworkSwitchEthernetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetworkSwitchEthernetPort \\r\\n\"},{\"CompletionText\":\"Disable-NetworkSwitchFeature\",\"ListItemText\":\"Disable-NetworkSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetworkSwitchFeature \\r\\n\"},{\"CompletionText\":\"Disable-NetworkSwitchVlan\",\"ListItemText\":\"Disable-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Disable-OdbcPerfCounter\",\"ListItemText\":\"Disable-OdbcPerfCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-OdbcPerfCounter \\r\\n\"},{\"CompletionText\":\"Disable-PhysicalDiskIdentification\",\"ListItemText\":\"Disable-PhysicalDiskIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PhysicalDiskIdentification \\r\\n\"},{\"CompletionText\":\"Disable-PhysicalDiskIndication\",\"ListItemText\":\"Disable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"Disable-PhysicalDiskIndication\"},{\"CompletionText\":\"Disable-PnpDevice\",\"ListItemText\":\"Disable-PnpDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PnpDevice \\r\\n\"},{\"CompletionText\":\"Disable-PSBreakpoint\",\"ListItemText\":\"Disable-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSBreakpoint [-Breakpoint] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisable-PSBreakpoint [-Id] [-PassThru] [-Runspace ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-PSRemoting\",\"ListItemText\":\"Disable-PSRemoting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSRemoting [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-PSSessionConfiguration\",\"ListItemText\":\"Disable-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSSessionConfiguration [[-Name] ] [-Force] [-NoServiceRestart] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-PSTrace\",\"ListItemText\":\"Disable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSTrace \\r\\n\"},{\"CompletionText\":\"Disable-PSWSManCombinedTrace\",\"ListItemText\":\"Disable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"Disable-RunspaceDebug\",\"ListItemText\":\"Disable-RunspaceDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-RunspaceDebug [[-RunspaceName] ] []\\r\\n\\r\\nDisable-RunspaceDebug [-Runspace] []\\r\\n\\r\\nDisable-RunspaceDebug [-RunspaceId] []\\r\\n\\r\\nDisable-RunspaceDebug [-RunspaceInstanceId] []\\r\\n\\r\\nDisable-RunspaceDebug [[-ProcessName] ] [[-AppDomainName] ] []\\r\\n\"},{\"CompletionText\":\"Disable-ScheduledJob\",\"ListItemText\":\"Disable-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Disable-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Disable-ScheduledTask\",\"ListItemText\":\"Disable-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Disable-SmbDelegation\",\"ListItemText\":\"Disable-SmbDelegation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-SmbDelegation \\r\\n\"},{\"CompletionText\":\"Disable-StorageBusCache\",\"ListItemText\":\"Disable-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Disable-StorageBusDisk\",\"ListItemText\":\"Disable-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Disable-StorageDataCollection\",\"ListItemText\":\"Disable-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Disable-StorageDiagnosticLog\",\"ListItemText\":\"Disable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Disable-StorageDiagnosticLog\"},{\"CompletionText\":\"Disable-StorageEnclosureIdentification\",\"ListItemText\":\"Disable-StorageEnclosureIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageEnclosureIdentification \\r\\n\"},{\"CompletionText\":\"Disable-StorageEnclosurePower\",\"ListItemText\":\"Disable-StorageEnclosurePower\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageEnclosurePower \\r\\n\"},{\"CompletionText\":\"Disable-StorageHighAvailability\",\"ListItemText\":\"Disable-StorageHighAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageHighAvailability \\r\\n\"},{\"CompletionText\":\"Disable-StorageMaintenanceMode\",\"ListItemText\":\"Disable-StorageMaintenanceMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageMaintenanceMode \\r\\n\"},{\"CompletionText\":\"Disable-TlsCipherSuite\",\"ListItemText\":\"Disable-TlsCipherSuite\",\"ResultType\":2,\"ToolTip\":\"Disable-TlsCipherSuite\\r\\n\"},{\"CompletionText\":\"Disable-TlsEccCurve\",\"ListItemText\":\"Disable-TlsEccCurve\",\"ResultType\":2,\"ToolTip\":\"Disable-TlsEccCurve\\r\\n\"},{\"CompletionText\":\"Disable-TlsSessionTicketKey\",\"ListItemText\":\"Disable-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"Disable-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"Disable-TpmAutoProvisioning\",\"ListItemText\":\"Disable-TpmAutoProvisioning\",\"ResultType\":2,\"ToolTip\":\"Disable-TpmAutoProvisioning\\r\\n\"},{\"CompletionText\":\"Disable-VMConsoleSupport\",\"ListItemText\":\"Disable-VMConsoleSupport\",\"ResultType\":2,\"ToolTip\":\"Disable-VMConsoleSupport\\r\\n\"},{\"CompletionText\":\"Disable-VMEventing\",\"ListItemText\":\"Disable-VMEventing\",\"ResultType\":2,\"ToolTip\":\"Disable-VMEventing\\r\\n\"},{\"CompletionText\":\"Disable-VMIntegrationService\",\"ListItemText\":\"Disable-VMIntegrationService\",\"ResultType\":2,\"ToolTip\":\"Disable-VMIntegrationService\\r\\n\"},{\"CompletionText\":\"Disable-VMMigration\",\"ListItemText\":\"Disable-VMMigration\",\"ResultType\":2,\"ToolTip\":\"Disable-VMMigration\\r\\n\"},{\"CompletionText\":\"Disable-VMRemoteFXPhysicalVideoAdapter\",\"ListItemText\":\"Disable-VMRemoteFXPhysicalVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Disable-VMRemoteFXPhysicalVideoAdapter\\r\\n\"},{\"CompletionText\":\"Disable-VMResourceMetering\",\"ListItemText\":\"Disable-VMResourceMetering\",\"ResultType\":2,\"ToolTip\":\"Disable-VMResourceMetering\\r\\n\"},{\"CompletionText\":\"Disable-VMSwitchExtension\",\"ListItemText\":\"Disable-VMSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Disable-VMSwitchExtension\\r\\n\"},{\"CompletionText\":\"Disable-VMTPM\",\"ListItemText\":\"Disable-VMTPM\",\"ResultType\":2,\"ToolTip\":\"Disable-VMTPM\\r\\n\"},{\"CompletionText\":\"Disable-WdacBidTrace\",\"ListItemText\":\"Disable-WdacBidTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-WdacBidTrace \\r\\n\"},{\"CompletionText\":\"Disable-WindowsErrorReporting\",\"ListItemText\":\"Disable-WindowsErrorReporting\",\"ResultType\":2,\"ToolTip\":\"Disable-WindowsErrorReporting\\r\\n\"},{\"CompletionText\":\"Disable-WindowsOptionalFeature\",\"ListItemText\":\"Disable-WindowsOptionalFeature\",\"ResultType\":2,\"ToolTip\":\"Disable-WindowsOptionalFeature\\r\\n\"},{\"CompletionText\":\"Disable-WSManCredSSP\",\"ListItemText\":\"Disable-WSManCredSSP\",\"ResultType\":2,\"ToolTip\":\"Disable-WSManCredSSP\\r\\n\"},{\"CompletionText\":\"Disable-WSManTrace\",\"ListItemText\":\"Disable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-WSManTrace \\r\\n\"},{\"CompletionText\":\"Disconnect-AzAccount\",\"ListItemText\":\"Disconnect-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Disconnect-AzAccount\\r\\n\"},{\"CompletionText\":\"Disconnect-AzP2sVpnGatewayVpnConnection\",\"ListItemText\":\"Disconnect-AzP2sVpnGatewayVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Disconnect-AzP2sVpnGatewayVpnConnection\\r\\n\"},{\"CompletionText\":\"Disconnect-AzVirtualNetworkGatewayVpnConnection\",\"ListItemText\":\"Disconnect-AzVirtualNetworkGatewayVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Disconnect-AzVirtualNetworkGatewayVpnConnection\\r\\n\"},{\"CompletionText\":\"Disconnect-AzWvdUserSession\",\"ListItemText\":\"Disconnect-AzWvdUserSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-AzWvdUserSession \\r\\n\"},{\"CompletionText\":\"Disconnect-IscsiTarget\",\"ListItemText\":\"Disconnect-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Disconnect-PSSession\",\"ListItemText\":\"Disconnect-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-PSSession [-Session] [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisconnect-PSSession -Name [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisconnect-PSSession [-Id] [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisconnect-PSSession -InstanceId [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disconnect-VirtualDisk\",\"ListItemText\":\"Disconnect-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Disconnect-VMNetworkAdapter\",\"ListItemText\":\"Disconnect-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Disconnect-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Disconnect-VMSan\",\"ListItemText\":\"Disconnect-VMSan\",\"ResultType\":2,\"ToolTip\":\"Disconnect-VMSan\\r\\n\"},{\"CompletionText\":\"Disconnect-WSMan\",\"ListItemText\":\"Disconnect-WSMan\",\"ResultType\":2,\"ToolTip\":\"Disconnect-WSMan\\r\\n\"},{\"CompletionText\":\"diskmgmt.msc\",\"ListItemText\":\"diskmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskmgmt.msc\"},{\"CompletionText\":\"diskpart.exe\",\"ListItemText\":\"diskpart.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskpart.exe\"},{\"CompletionText\":\"diskperf.exe\",\"ListItemText\":\"diskperf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskperf.exe\"},{\"CompletionText\":\"diskraid.exe\",\"ListItemText\":\"diskraid.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskraid.exe\"},{\"CompletionText\":\"DiskSnapshot.exe\",\"ListItemText\":\"DiskSnapshot.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DiskSnapshot.exe\"},{\"CompletionText\":\"diskusage.exe\",\"ListItemText\":\"diskusage.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskusage.exe\"},{\"CompletionText\":\"Dism.exe\",\"ListItemText\":\"Dism.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Dism.exe\"},{\"CompletionText\":\"Dismount-AppPackageVolume\",\"ListItemText\":\"Dismount-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Dismount-AppPackageVolume\"},{\"CompletionText\":\"Dismount-AppxVolume\",\"ListItemText\":\"Dismount-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Dismount-AppxVolume\\r\\n\"},{\"CompletionText\":\"Dismount-DiskImage\",\"ListItemText\":\"Dismount-DiskImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDismount-DiskImage \\r\\n\"},{\"CompletionText\":\"Dismount-VHD\",\"ListItemText\":\"Dismount-VHD\",\"ResultType\":2,\"ToolTip\":\"Dismount-VHD\\r\\n\"},{\"CompletionText\":\"Dismount-VMHostAssignableDevice\",\"ListItemText\":\"Dismount-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Dismount-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Dismount-WindowsImage\",\"ListItemText\":\"Dismount-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Dismount-WindowsImage\\r\\n\"},{\"CompletionText\":\"dispdiag.exe\",\"ListItemText\":\"dispdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dispdiag.exe\"},{\"CompletionText\":\"DisplaySwitch.exe\",\"ListItemText\":\"DisplaySwitch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DisplaySwitch.exe\"},{\"CompletionText\":\"djoin.exe\",\"ListItemText\":\"djoin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\djoin.exe\"},{\"CompletionText\":\"dllhost.exe\",\"ListItemText\":\"dllhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dllhost.exe\"},{\"CompletionText\":\"dllhst3g.exe\",\"ListItemText\":\"dllhst3g.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dllhst3g.exe\"},{\"CompletionText\":\"dlu\",\"ListItemText\":\"dlu\",\"ResultType\":2,\"ToolTip\":\"dlu\"},{\"CompletionText\":\"dmcertinst.exe\",\"ListItemText\":\"dmcertinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dmcertinst.exe\"},{\"CompletionText\":\"dmcfghost.exe\",\"ListItemText\":\"dmcfghost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dmcfghost.exe\"},{\"CompletionText\":\"dmclient.exe\",\"ListItemText\":\"dmclient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dmclient.exe\"},{\"CompletionText\":\"DmNotificationBroker.exe\",\"ListItemText\":\"DmNotificationBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DmNotificationBroker.exe\"},{\"CompletionText\":\"DmOmaCpMo.exe\",\"ListItemText\":\"DmOmaCpMo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DmOmaCpMo.exe\"},{\"CompletionText\":\"dnscacheugc.exe\",\"ListItemText\":\"dnscacheugc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dnscacheugc.exe\"},{\"CompletionText\":\"dnsn\",\"ListItemText\":\"dnsn\",\"ResultType\":2,\"ToolTip\":\"Disconnect-PSSession\"},{\"CompletionText\":\"docker-compose.exe\",\"ListItemText\":\"docker-compose.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-compose.exe\"},{\"CompletionText\":\"docker-credential-desktop.exe\",\"ListItemText\":\"docker-credential-desktop.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-credential-desktop.exe\"},{\"CompletionText\":\"docker-credential-ecr-login.exe\",\"ListItemText\":\"docker-credential-ecr-login.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-credential-ecr-login.exe\"},{\"CompletionText\":\"docker-credential-wincred.exe\",\"ListItemText\":\"docker-credential-wincred.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-credential-wincred.exe\"},{\"CompletionText\":\"docker-index.exe\",\"ListItemText\":\"docker-index.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-index.exe\"},{\"CompletionText\":\"docker.exe\",\"ListItemText\":\"docker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker.exe\"},{\"CompletionText\":\"doskey.exe\",\"ListItemText\":\"doskey.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\doskey.exe\"},{\"CompletionText\":\"dotnet.exe\",\"ListItemText\":\"dotnet.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\dotnet\\\\dotnet.exe\"},{\"CompletionText\":\"dpapimig.exe\",\"ListItemText\":\"dpapimig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dpapimig.exe\"},{\"CompletionText\":\"DpiScaling.exe\",\"ListItemText\":\"DpiScaling.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DpiScaling.exe\"},{\"CompletionText\":\"dpnsvr.exe\",\"ListItemText\":\"dpnsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dpnsvr.exe\"},{\"CompletionText\":\"driverquery.exe\",\"ListItemText\":\"driverquery.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\driverquery.exe\"},{\"CompletionText\":\"drvinst.exe\",\"ListItemText\":\"drvinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\drvinst.exe\"},{\"CompletionText\":\"dsmbd\",\"ListItemText\":\"dsmbd\",\"ResultType\":2,\"ToolTip\":\"dsmbd\"},{\"CompletionText\":\"DsmUserTask.exe\",\"ListItemText\":\"DsmUserTask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DsmUserTask.exe\"},{\"CompletionText\":\"dsregcmd.exe\",\"ListItemText\":\"dsregcmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dsregcmd.exe\"},{\"CompletionText\":\"dstokenclean.exe\",\"ListItemText\":\"dstokenclean.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dstokenclean.exe\"},{\"CompletionText\":\"dtdump.exe\",\"ListItemText\":\"dtdump.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dtdump.exe\"},{\"CompletionText\":\"DuckDuckGo.exe\",\"ListItemText\":\"DuckDuckGo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\DuckDuckGo.exe\"},{\"CompletionText\":\"dusmtask.exe\",\"ListItemText\":\"dusmtask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dusmtask.exe\"},{\"CompletionText\":\"dvdplay.exe\",\"ListItemText\":\"dvdplay.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dvdplay.exe\"},{\"CompletionText\":\"dwm.exe\",\"ListItemText\":\"dwm.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dwm.exe\"},{\"CompletionText\":\"DWWIN.EXE\",\"ListItemText\":\"DWWIN.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DWWIN.EXE\"},{\"CompletionText\":\"DXCap.exe\",\"ListItemText\":\"DXCap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DXCap.exe\"},{\"CompletionText\":\"DXCpl.exe\",\"ListItemText\":\"DXCpl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DXCpl.exe\"},{\"CompletionText\":\"dxdiag.exe\",\"ListItemText\":\"dxdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dxdiag.exe\"},{\"CompletionText\":\"dxgiadaptercache.exe\",\"ListItemText\":\"dxgiadaptercache.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dxgiadaptercache.exe\"},{\"CompletionText\":\"Dxpserver.exe\",\"ListItemText\":\"Dxpserver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Dxpserver.exe\"},{\"CompletionText\":\"E:\",\"ListItemText\":\"E:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nE: \\r\\n\"},{\"CompletionText\":\"Eap3Host.exe\",\"ListItemText\":\"Eap3Host.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Eap3Host.exe\"},{\"CompletionText\":\"EaseOfAccessDialog.exe\",\"ListItemText\":\"EaseOfAccessDialog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EaseOfAccessDialog.exe\"},{\"CompletionText\":\"easinvoker.exe\",\"ListItemText\":\"easinvoker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\easinvoker.exe\"},{\"CompletionText\":\"EASPolicyManagerBrokerHost.exe\",\"ListItemText\":\"EASPolicyManagerBrokerHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EASPolicyManagerBrokerHost.exe\"},{\"CompletionText\":\"ebp\",\"ListItemText\":\"ebp\",\"ResultType\":2,\"ToolTip\":\"Enable-PSBreakpoint\"},{\"CompletionText\":\"echo\",\"ListItemText\":\"echo\",\"ResultType\":2,\"ToolTip\":\"Write-Output\"},{\"CompletionText\":\"Edit-ASRRecoveryPlan\",\"ListItemText\":\"Edit-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Edit-ASRRecoveryPlan\"},{\"CompletionText\":\"Edit-ASRRP\",\"ListItemText\":\"Edit-ASRRP\",\"ResultType\":2,\"ToolTip\":\"Edit-ASRRP\"},{\"CompletionText\":\"Edit-AzDataProtectionPolicyRetentionRuleClientObject\",\"ListItemText\":\"Edit-AzDataProtectionPolicyRetentionRuleClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEdit-AzDataProtectionPolicyRetentionRuleClientObject \\r\\n\"},{\"CompletionText\":\"Edit-AzDataProtectionPolicyTagClientObject\",\"ListItemText\":\"Edit-AzDataProtectionPolicyTagClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEdit-AzDataProtectionPolicyTagClientObject \\r\\n\"},{\"CompletionText\":\"Edit-AzDataProtectionPolicyTriggerClientObject\",\"ListItemText\":\"Edit-AzDataProtectionPolicyTriggerClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEdit-AzDataProtectionPolicyTriggerClientObject \\r\\n\"},{\"CompletionText\":\"Edit-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Edit-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Edit-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Edit-AzWebAppBackupConfiguration\",\"ListItemText\":\"Edit-AzWebAppBackupConfiguration\",\"ResultType\":2,\"ToolTip\":\"Edit-AzWebAppBackupConfiguration\\r\\n\"},{\"CompletionText\":\"Edit-CIPolicyRule\",\"ListItemText\":\"Edit-CIPolicyRule\",\"ResultType\":2,\"ToolTip\":\"Edit-CIPolicyRule\\r\\n\"},{\"CompletionText\":\"EDPCleanup.exe\",\"ListItemText\":\"EDPCleanup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EDPCleanup.exe\"},{\"CompletionText\":\"edpnotify.exe\",\"ListItemText\":\"edpnotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\edpnotify.exe\"},{\"CompletionText\":\"EduPrintProv.exe\",\"ListItemText\":\"EduPrintProv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EduPrintProv.exe\"},{\"CompletionText\":\"efsui.exe\",\"ListItemText\":\"efsui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\efsui.exe\"},{\"CompletionText\":\"EhStorAuthn.exe\",\"ListItemText\":\"EhStorAuthn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EhStorAuthn.exe\"},{\"CompletionText\":\"elu\",\"ListItemText\":\"elu\",\"ResultType\":2,\"ToolTip\":\"elu\"},{\"CompletionText\":\"Enable-AdlStoreKeyVault\",\"ListItemText\":\"Enable-AdlStoreKeyVault\",\"ResultType\":2,\"ToolTip\":\"Enable-AdlStoreKeyVault\"},{\"CompletionText\":\"Enable-AppBackgroundTaskDiagnosticLog\",\"ListItemText\":\"Enable-AppBackgroundTaskDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Enable-AppBackgroundTaskDiagnosticLog\\r\\n\"},{\"CompletionText\":\"Enable-AzAdvisorRecommendation\",\"ListItemText\":\"Enable-AzAdvisorRecommendation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzAdvisorRecommendation \\r\\n\"},{\"CompletionText\":\"Enable-AzAksAddOn\",\"ListItemText\":\"Enable-AzAksAddOn\",\"ResultType\":2,\"ToolTip\":\"Enable-AzAksAddOn\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchAutoScale\",\"ListItemText\":\"Enable-AzBatchAutoScale\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchAutoScale\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchComputeNodeScheduling\",\"ListItemText\":\"Enable-AzBatchComputeNodeScheduling\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchComputeNodeScheduling\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchJob\",\"ListItemText\":\"Enable-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchJobSchedule\",\"ListItemText\":\"Enable-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchTask\",\"ListItemText\":\"Enable-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Enable-AzCdnCustomDomainCustomHttps\",\"ListItemText\":\"Enable-AzCdnCustomDomainCustomHttps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzCdnCustomDomainCustomHttps \\r\\n\"},{\"CompletionText\":\"Enable-AzContextAutosave\",\"ListItemText\":\"Enable-AzContextAutosave\",\"ResultType\":2,\"ToolTip\":\"Enable-AzContextAutosave\\r\\n\"},{\"CompletionText\":\"Enable-AzDataCollection\",\"ListItemText\":\"Enable-AzDataCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzDataCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzDataLakeStoreKeyVault\",\"ListItemText\":\"Enable-AzDataLakeStoreKeyVault\",\"ResultType\":2,\"ToolTip\":\"Enable-AzDataLakeStoreKeyVault\\r\\n\"},{\"CompletionText\":\"Enable-AzEventGridPartnerTopic\",\"ListItemText\":\"Enable-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Enable-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Enable-AzFrontDoorCdnProfileMigration\",\"ListItemText\":\"Enable-AzFrontDoorCdnProfileMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzFrontDoorCdnProfileMigration \\r\\n\"},{\"CompletionText\":\"Enable-AzFrontDoorCustomDomainHttps\",\"ListItemText\":\"Enable-AzFrontDoorCustomDomainHttps\",\"ResultType\":2,\"ToolTip\":\"Enable-AzFrontDoorCustomDomainHttps\\r\\n\"},{\"CompletionText\":\"Enable-AzHDInsightAzureMonitor\",\"ListItemText\":\"Enable-AzHDInsightAzureMonitor\",\"ResultType\":2,\"ToolTip\":\"Enable-AzHDInsightAzureMonitor\\r\\n\"},{\"CompletionText\":\"Enable-AzHDInsightMonitoring\",\"ListItemText\":\"Enable-AzHDInsightMonitoring\",\"ResultType\":2,\"ToolTip\":\"Enable-AzHDInsightMonitoring\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsIISLogCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsIISLogCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsIISLogCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsLinuxCustomLogCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsLinuxCustomLogCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsLinuxCustomLogCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsLinuxPerformanceCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsLinuxPerformanceCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsLinuxPerformanceCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsLinuxSyslogCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsLinuxSyslogCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsLinuxSyslogCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzRecoveryServicesBackupAutoProtection\",\"ListItemText\":\"Enable-AzRecoveryServicesBackupAutoProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzRecoveryServicesBackupAutoProtection\\r\\n\"},{\"CompletionText\":\"Enable-AzRecoveryServicesBackupProtection\",\"ListItemText\":\"Enable-AzRecoveryServicesBackupProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzRecoveryServicesBackupProtection\\r\\n\"},{\"CompletionText\":\"Enable-AzSecurityAdvancedThreatProtection\",\"ListItemText\":\"Enable-AzSecurityAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSecurityAdvancedThreatProtection\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlDatabaseLedgerDigestUpload\",\"ListItemText\":\"Enable-AzSqlDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlDatabaseSensitivityRecommendation\",\"ListItemText\":\"Enable-AzSqlDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Enable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceAdvancedDataSecurity\",\"ListItemText\":\"Enable-AzSqlInstanceAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ListItemText\":\"Enable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ListItemText\":\"Enable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Enable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlServerActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlServerAdvancedDataSecurity\",\"ListItemText\":\"Enable-AzSqlServerAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlServerAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Enable-AzStackHCIAttestation\",\"ListItemText\":\"Enable-AzStackHCIAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzStackHCIAttestation \\r\\n\"},{\"CompletionText\":\"Enable-AzStackHCIRemoteSupport\",\"ListItemText\":\"Enable-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Enable-AzStorageBlobDeleteRetentionPolicy\",\"ListItemText\":\"Enable-AzStorageBlobDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageBlobDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageBlobLastAccessTimeTracking\",\"ListItemText\":\"Enable-AzStorageBlobLastAccessTimeTracking\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageBlobLastAccessTimeTracking\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageBlobRestorePolicy\",\"ListItemText\":\"Enable-AzStorageBlobRestorePolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageBlobRestorePolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageContainerDeleteRetentionPolicy\",\"ListItemText\":\"Enable-AzStorageContainerDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageContainerDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageDeleteRetentionPolicy\",\"ListItemText\":\"Enable-AzStorageDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageSoftDelete\",\"ListItemText\":\"Enable-AzStorageSoftDelete\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageSoftDelete\"},{\"CompletionText\":\"Enable-AzStorageStaticWebsite\",\"ListItemText\":\"Enable-AzStorageStaticWebsite\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageStaticWebsite\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Enable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseSqlAdvancedDataSecurity\",\"ListItemText\":\"Enable-AzSynapseSqlAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseSqlAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseSqlAdvancedThreatProtection\",\"ListItemText\":\"Enable-AzSynapseSqlAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseSqlAdvancedThreatProtection\"},{\"CompletionText\":\"Enable-AzSynapseSqlPoolSensitivityRecommendation\",\"ListItemText\":\"Enable-AzSynapseSqlPoolSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseSqlPoolSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseWorkspace\",\"ListItemText\":\"Enable-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Enable-AzTrafficManagerEndpoint\",\"ListItemText\":\"Enable-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Enable-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Enable-AzTrafficManagerProfile\",\"ListItemText\":\"Enable-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Enable-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Enable-AzureRmAlias\",\"ListItemText\":\"Enable-AzureRmAlias\",\"ResultType\":2,\"ToolTip\":\"Enable-AzureRmAlias\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementBootDebug\",\"ListItemText\":\"Enable-BcdElementBootDebug\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementBootDebug\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementBootEms\",\"ListItemText\":\"Enable-BcdElementBootEms\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementBootEms\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementDebug\",\"ListItemText\":\"Enable-BcdElementDebug\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementDebug\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementEms\",\"ListItemText\":\"Enable-BcdElementEms\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementEms\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementEventLogging\",\"ListItemText\":\"Enable-BcdElementEventLogging\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementEventLogging\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementHypervisorDebug\",\"ListItemText\":\"Enable-BcdElementHypervisorDebug\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementHypervisorDebug\\r\\n\"},{\"CompletionText\":\"Enable-BCDistributed\",\"ListItemText\":\"Enable-BCDistributed\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCDistributed \\r\\n\"},{\"CompletionText\":\"Enable-BCDowngrading\",\"ListItemText\":\"Enable-BCDowngrading\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCDowngrading \\r\\n\"},{\"CompletionText\":\"Enable-BCHostedClient\",\"ListItemText\":\"Enable-BCHostedClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCHostedClient \\r\\n\"},{\"CompletionText\":\"Enable-BCHostedServer\",\"ListItemText\":\"Enable-BCHostedServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCHostedServer \\r\\n\"},{\"CompletionText\":\"Enable-BCLocal\",\"ListItemText\":\"Enable-BCLocal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCLocal \\r\\n\"},{\"CompletionText\":\"Enable-BCServeOnBattery\",\"ListItemText\":\"Enable-BCServeOnBattery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCServeOnBattery \\r\\n\"},{\"CompletionText\":\"Enable-BitLocker\",\"ListItemText\":\"Enable-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BitLocker \\r\\n\"},{\"CompletionText\":\"Enable-BitLockerAutoUnlock\",\"ListItemText\":\"Enable-BitLockerAutoUnlock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BitLockerAutoUnlock \\r\\n\"},{\"CompletionText\":\"Enable-DAManualEntryPointSelection\",\"ListItemText\":\"Enable-DAManualEntryPointSelection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-DAManualEntryPointSelection \\r\\n\"},{\"CompletionText\":\"Enable-DeliveryOptimizationVerboseLogs\",\"ListItemText\":\"Enable-DeliveryOptimizationVerboseLogs\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-DeliveryOptimizationVerboseLogs \\r\\n\"},{\"CompletionText\":\"Enable-DscDebug\",\"ListItemText\":\"Enable-DscDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-DscDebug \\r\\n\"},{\"CompletionText\":\"Enable-ExperimentalFeature\",\"ListItemText\":\"Enable-ExperimentalFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-ExperimentalFeature [-Name] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-JobTrigger\",\"ListItemText\":\"Enable-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Enable-JobTrigger\\r\\n\"},{\"CompletionText\":\"Enable-LocalUser\",\"ListItemText\":\"Enable-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Enable-LocalUser\\r\\n\"},{\"CompletionText\":\"Enable-MMAgent\",\"ListItemText\":\"Enable-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-MMAgent \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapter\",\"ListItemText\":\"Enable-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapter \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterBinding\",\"ListItemText\":\"Enable-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterChecksumOffload\",\"ListItemText\":\"Enable-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Enable-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterIPsecOffload\",\"ListItemText\":\"Enable-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterLso\",\"ListItemText\":\"Enable-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterPacketDirect\",\"ListItemText\":\"Enable-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterPowerManagement\",\"ListItemText\":\"Enable-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterQos\",\"ListItemText\":\"Enable-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterRdma\",\"ListItemText\":\"Enable-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterRsc\",\"ListItemText\":\"Enable-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterRss\",\"ListItemText\":\"Enable-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterSriov\",\"ListItemText\":\"Enable-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterUso\",\"ListItemText\":\"Enable-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterVmq\",\"ListItemText\":\"Enable-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Enable-NetDnsTransitionConfiguration\",\"ListItemText\":\"Enable-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Enable-NetFirewallHyperVRule\",\"ListItemText\":\"Enable-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Enable-NetFirewallRule\",\"ListItemText\":\"Enable-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Enable-NetIPHttpsProfile\",\"ListItemText\":\"Enable-NetIPHttpsProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetIPHttpsProfile \\r\\n\"},{\"CompletionText\":\"Enable-NetIPsecMainModeRule\",\"ListItemText\":\"Enable-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Enable-NetIPsecRule\",\"ListItemText\":\"Enable-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Enable-NetNatTransitionConfiguration\",\"ListItemText\":\"Enable-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Enable-NetworkSwitchEthernetPort\",\"ListItemText\":\"Enable-NetworkSwitchEthernetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetworkSwitchEthernetPort \\r\\n\"},{\"CompletionText\":\"Enable-NetworkSwitchFeature\",\"ListItemText\":\"Enable-NetworkSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetworkSwitchFeature \\r\\n\"},{\"CompletionText\":\"Enable-NetworkSwitchVlan\",\"ListItemText\":\"Enable-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Enable-OdbcPerfCounter\",\"ListItemText\":\"Enable-OdbcPerfCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-OdbcPerfCounter \\r\\n\"},{\"CompletionText\":\"Enable-PhysicalDiskIdentification\",\"ListItemText\":\"Enable-PhysicalDiskIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PhysicalDiskIdentification \\r\\n\"},{\"CompletionText\":\"Enable-PhysicalDiskIndication\",\"ListItemText\":\"Enable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"Enable-PhysicalDiskIndication\"},{\"CompletionText\":\"Enable-PnpDevice\",\"ListItemText\":\"Enable-PnpDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PnpDevice \\r\\n\"},{\"CompletionText\":\"Enable-PSBreakpoint\",\"ListItemText\":\"Enable-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSBreakpoint [-Breakpoint] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nEnable-PSBreakpoint [-Id] [-PassThru] [-Runspace ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-PSRemoting\",\"ListItemText\":\"Enable-PSRemoting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSRemoting [-Force] [-SkipNetworkProfileCheck] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-PSSessionConfiguration\",\"ListItemText\":\"Enable-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSSessionConfiguration [[-Name] ] [-Force] [-SecurityDescriptorSddl ] [-SkipNetworkProfileCheck] [-NoServiceRestart] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-PSTrace\",\"ListItemText\":\"Enable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSTrace \\r\\n\"},{\"CompletionText\":\"Enable-PSWSManCombinedTrace\",\"ListItemText\":\"Enable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"Enable-RunspaceDebug\",\"ListItemText\":\"Enable-RunspaceDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-RunspaceDebug [[-RunspaceName] ] [-BreakAll] []\\r\\n\\r\\nEnable-RunspaceDebug [-Runspace] [-BreakAll] []\\r\\n\\r\\nEnable-RunspaceDebug [-RunspaceId] [-BreakAll] []\\r\\n\\r\\nEnable-RunspaceDebug [-RunspaceInstanceId] []\\r\\n\\r\\nEnable-RunspaceDebug [[-ProcessName] ] [[-AppDomainName] ] []\\r\\n\"},{\"CompletionText\":\"Enable-ScheduledJob\",\"ListItemText\":\"Enable-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Enable-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Enable-ScheduledTask\",\"ListItemText\":\"Enable-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Enable-SmbDelegation\",\"ListItemText\":\"Enable-SmbDelegation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-SmbDelegation \\r\\n\"},{\"CompletionText\":\"Enable-StorageBusCache\",\"ListItemText\":\"Enable-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Enable-StorageBusDisk\",\"ListItemText\":\"Enable-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Enable-StorageDataCollection\",\"ListItemText\":\"Enable-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Enable-StorageDiagnosticLog\",\"ListItemText\":\"Enable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Enable-StorageDiagnosticLog\"},{\"CompletionText\":\"Enable-StorageEnclosureIdentification\",\"ListItemText\":\"Enable-StorageEnclosureIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageEnclosureIdentification \\r\\n\"},{\"CompletionText\":\"Enable-StorageEnclosurePower\",\"ListItemText\":\"Enable-StorageEnclosurePower\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageEnclosurePower \\r\\n\"},{\"CompletionText\":\"Enable-StorageHighAvailability\",\"ListItemText\":\"Enable-StorageHighAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageHighAvailability \\r\\n\"},{\"CompletionText\":\"Enable-StorageMaintenanceMode\",\"ListItemText\":\"Enable-StorageMaintenanceMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageMaintenanceMode \\r\\n\"},{\"CompletionText\":\"Enable-TlsCipherSuite\",\"ListItemText\":\"Enable-TlsCipherSuite\",\"ResultType\":2,\"ToolTip\":\"Enable-TlsCipherSuite\\r\\n\"},{\"CompletionText\":\"Enable-TlsEccCurve\",\"ListItemText\":\"Enable-TlsEccCurve\",\"ResultType\":2,\"ToolTip\":\"Enable-TlsEccCurve\\r\\n\"},{\"CompletionText\":\"Enable-TlsSessionTicketKey\",\"ListItemText\":\"Enable-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"Enable-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"Enable-TpmAutoProvisioning\",\"ListItemText\":\"Enable-TpmAutoProvisioning\",\"ResultType\":2,\"ToolTip\":\"Enable-TpmAutoProvisioning\\r\\n\"},{\"CompletionText\":\"Enable-VMConsoleSupport\",\"ListItemText\":\"Enable-VMConsoleSupport\",\"ResultType\":2,\"ToolTip\":\"Enable-VMConsoleSupport\\r\\n\"},{\"CompletionText\":\"Enable-VMEventing\",\"ListItemText\":\"Enable-VMEventing\",\"ResultType\":2,\"ToolTip\":\"Enable-VMEventing\\r\\n\"},{\"CompletionText\":\"Enable-VMIntegrationService\",\"ListItemText\":\"Enable-VMIntegrationService\",\"ResultType\":2,\"ToolTip\":\"Enable-VMIntegrationService\\r\\n\"},{\"CompletionText\":\"Enable-VMMigration\",\"ListItemText\":\"Enable-VMMigration\",\"ResultType\":2,\"ToolTip\":\"Enable-VMMigration\\r\\n\"},{\"CompletionText\":\"Enable-VMRemoteFXPhysicalVideoAdapter\",\"ListItemText\":\"Enable-VMRemoteFXPhysicalVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Enable-VMRemoteFXPhysicalVideoAdapter\\r\\n\"},{\"CompletionText\":\"Enable-VMReplication\",\"ListItemText\":\"Enable-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Enable-VMReplication\\r\\n\"},{\"CompletionText\":\"Enable-VMResourceMetering\",\"ListItemText\":\"Enable-VMResourceMetering\",\"ResultType\":2,\"ToolTip\":\"Enable-VMResourceMetering\\r\\n\"},{\"CompletionText\":\"Enable-VMSwitchExtension\",\"ListItemText\":\"Enable-VMSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Enable-VMSwitchExtension\\r\\n\"},{\"CompletionText\":\"Enable-VMTPM\",\"ListItemText\":\"Enable-VMTPM\",\"ResultType\":2,\"ToolTip\":\"Enable-VMTPM\\r\\n\"},{\"CompletionText\":\"Enable-WdacBidTrace\",\"ListItemText\":\"Enable-WdacBidTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-WdacBidTrace \\r\\n\"},{\"CompletionText\":\"Enable-WindowsErrorReporting\",\"ListItemText\":\"Enable-WindowsErrorReporting\",\"ResultType\":2,\"ToolTip\":\"Enable-WindowsErrorReporting\\r\\n\"},{\"CompletionText\":\"Enable-WindowsOptionalFeature\",\"ListItemText\":\"Enable-WindowsOptionalFeature\",\"ResultType\":2,\"ToolTip\":\"Enable-WindowsOptionalFeature\\r\\n\"},{\"CompletionText\":\"Enable-WSManCredSSP\",\"ListItemText\":\"Enable-WSManCredSSP\",\"ResultType\":2,\"ToolTip\":\"Enable-WSManCredSSP\\r\\n\"},{\"CompletionText\":\"Enable-WSManTrace\",\"ListItemText\":\"Enable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-WSManTrace \\r\\n\"},{\"CompletionText\":\"Enter-PSHostProcess\",\"ListItemText\":\"Enter-PSHostProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnter-PSHostProcess [-Id] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess [-Process] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess [-Name] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess [-HostProcessInfo] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess -CustomPipeName []\\r\\n\"},{\"CompletionText\":\"Enter-PSSession\",\"ListItemText\":\"Enter-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnter-PSSession [-ComputerName] [-EnableNetworkAccess] [-Credential ] [-ConfigurationName ] [-Port ] [-UseSSL] [-ApplicationName ] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nEnter-PSSession [-HostName] [-Options ] [-Port ] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] []\\r\\n\\r\\nEnter-PSSession [[-Session] ] []\\r\\n\\r\\nEnter-PSSession [[-ConnectionUri] ] [-EnableNetworkAccess] [-Credential ] [-ConfigurationName ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nEnter-PSSession [-InstanceId ] []\\r\\n\\r\\nEnter-PSSession [[-Id] ] []\\r\\n\\r\\nEnter-PSSession [-Name ] []\\r\\n\\r\\nEnter-PSSession [-VMId] [-Credential] [-ConfigurationName ] []\\r\\n\\r\\nEnter-PSSession [-VMName] [-Credential] [-ConfigurationName ] []\\r\\n\\r\\nEnter-PSSession [-ContainerId] [-ConfigurationName ] [-RunAsAdministrator] []\\r\\n\"},{\"CompletionText\":\"env\",\"ListItemText\":\"env\",\"ResultType\":2,\"ToolTip\":\"\\r\\nenv \\r\\n\"},{\"CompletionText\":\"EoAExperiences.exe\",\"ListItemText\":\"EoAExperiences.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EoAExperiences.exe\"},{\"CompletionText\":\"epal\",\"ListItemText\":\"epal\",\"ResultType\":2,\"ToolTip\":\"Export-Alias\"},{\"CompletionText\":\"epcsv\",\"ListItemText\":\"epcsv\",\"ResultType\":2,\"ToolTip\":\"Export-Csv\"},{\"CompletionText\":\"erase\",\"ListItemText\":\"erase\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"esentutl.exe\",\"ListItemText\":\"esentutl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\esentutl.exe\"},{\"CompletionText\":\"esimtool.exe\",\"ListItemText\":\"esimtool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\esimtool.exe\"},{\"CompletionText\":\"esmbd\",\"ListItemText\":\"esmbd\",\"ResultType\":2,\"ToolTip\":\"esmbd\"},{\"CompletionText\":\"etsn\",\"ListItemText\":\"etsn\",\"ResultType\":2,\"ToolTip\":\"Enter-PSSession\"},{\"CompletionText\":\"eudcedit.exe\",\"ListItemText\":\"eudcedit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eudcedit.exe\"},{\"CompletionText\":\"eventcreate.exe\",\"ListItemText\":\"eventcreate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eventcreate.exe\"},{\"CompletionText\":\"eventvwr.exe\",\"ListItemText\":\"eventvwr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eventvwr.exe\"},{\"CompletionText\":\"eventvwr.msc\",\"ListItemText\":\"eventvwr.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eventvwr.msc\"},{\"CompletionText\":\"Exit-PSHostProcess\",\"ListItemText\":\"Exit-PSHostProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExit-PSHostProcess []\\r\\n\"},{\"CompletionText\":\"Exit-PSSession\",\"ListItemText\":\"Exit-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExit-PSSession []\\r\\n\"},{\"CompletionText\":\"Expand-Archive\",\"ListItemText\":\"Expand-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-Archive \\r\\n\"},{\"CompletionText\":\"Expand-AzWvdMsixImage\",\"ListItemText\":\"Expand-AzWvdMsixImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-AzWvdMsixImage \\r\\n\"},{\"CompletionText\":\"Expand-GitCommand\",\"ListItemText\":\"Expand-GitCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-GitCommand \\r\\n\"},{\"CompletionText\":\"Expand-WindowsCustomDataImage\",\"ListItemText\":\"Expand-WindowsCustomDataImage\",\"ResultType\":2,\"ToolTip\":\"Expand-WindowsCustomDataImage\\r\\n\"},{\"CompletionText\":\"Expand-WindowsImage\",\"ListItemText\":\"Expand-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Expand-WindowsImage\\r\\n\"},{\"CompletionText\":\"expand.exe\",\"ListItemText\":\"expand.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\expand.exe\"},{\"CompletionText\":\"explorer.exe\",\"ListItemText\":\"explorer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\explorer.exe\"},{\"CompletionText\":\"Export-AdlStoreChildItemProperties\",\"ListItemText\":\"Export-AdlStoreChildItemProperties\",\"ResultType\":2,\"ToolTip\":\"Export-AdlStoreChildItemProperties\"},{\"CompletionText\":\"Export-AdlStoreItem\",\"ListItemText\":\"Export-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Export-AdlStoreItem\"},{\"CompletionText\":\"Export-Alias\",\"ListItemText\":\"Export-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-Alias [-Path] [[-Name] ] [-PassThru] [-As ] [-Append] [-Force] [-NoClobber] [-Description ] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nExport-Alias [[-Name] ] -LiteralPath [-PassThru] [-As ] [-Append] [-Force] [-NoClobber] [-Description ] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Export-AzAnalysisServicesInstanceLog\",\"ListItemText\":\"Export-AzAnalysisServicesInstanceLog\",\"ResultType\":2,\"ToolTip\":\"Export-AzAnalysisServicesInstanceLog\\r\\n\"},{\"CompletionText\":\"Export-AzApiManagementApi\",\"ListItemText\":\"Export-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Export-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Export-AzAsInstanceLog\",\"ListItemText\":\"Export-AzAsInstanceLog\",\"ResultType\":2,\"ToolTip\":\"Export-AzAsInstanceLog\"},{\"CompletionText\":\"Export-AzAutomationDscConfiguration\",\"ListItemText\":\"Export-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Export-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Export-AzAutomationDscNodeReportContent\",\"ListItemText\":\"Export-AzAutomationDscNodeReportContent\",\"ResultType\":2,\"ToolTip\":\"Export-AzAutomationDscNodeReportContent\\r\\n\"},{\"CompletionText\":\"Export-AzAutomationRunbook\",\"ListItemText\":\"Export-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Export-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Export-AzConfig\",\"ListItemText\":\"Export-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Export-AzConfig\\r\\n\"},{\"CompletionText\":\"Export-AzDataLakeStoreChildItemProperties\",\"ListItemText\":\"Export-AzDataLakeStoreChildItemProperties\",\"ResultType\":2,\"ToolTip\":\"Export-AzDataLakeStoreChildItemProperties\"},{\"CompletionText\":\"Export-AzDataLakeStoreChildItemProperty\",\"ListItemText\":\"Export-AzDataLakeStoreChildItemProperty\",\"ResultType\":2,\"ToolTip\":\"Export-AzDataLakeStoreChildItemProperty\\r\\n\"},{\"CompletionText\":\"Export-AzDataLakeStoreItem\",\"ListItemText\":\"Export-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Export-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Export-AzKeyVaultSecurityDomain\",\"ListItemText\":\"Export-AzKeyVaultSecurityDomain\",\"ResultType\":2,\"ToolTip\":\"Export-AzKeyVaultSecurityDomain\\r\\n\"},{\"CompletionText\":\"Export-AzLogAnalyticRequestRateByInterval\",\"ListItemText\":\"Export-AzLogAnalyticRequestRateByInterval\",\"ResultType\":2,\"ToolTip\":\"Export-AzLogAnalyticRequestRateByInterval\\r\\n\"},{\"CompletionText\":\"Export-AzLogAnalyticThrottledRequest\",\"ListItemText\":\"Export-AzLogAnalyticThrottledRequest\",\"ResultType\":2,\"ToolTip\":\"Export-AzLogAnalyticThrottledRequest\\r\\n\"},{\"CompletionText\":\"Export-AzMlWebService\",\"ListItemText\":\"Export-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Export-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Export-AzRedisCache\",\"ListItemText\":\"Export-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Export-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Export-AzRedisEnterpriseCache\",\"ListItemText\":\"Export-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Export-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Export-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"Export-AzRedisEnterpriseCacheDatabase\"},{\"CompletionText\":\"Export-AzResourceGroup\",\"ListItemText\":\"Export-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Export-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseKqlScript\",\"ListItemText\":\"Export-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseNotebook\",\"ListItemText\":\"Export-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseSparkConfiguration\",\"ListItemText\":\"Export-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseSqlScript\",\"ListItemText\":\"Export-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Export-AzTemplateSpec\",\"ListItemText\":\"Export-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Export-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Export-AzureAsInstanceLog\",\"ListItemText\":\"Export-AzureAsInstanceLog\",\"ResultType\":2,\"ToolTip\":\"Export-AzureAsInstanceLog\"},{\"CompletionText\":\"Export-BCCachePackage\",\"ListItemText\":\"Export-BCCachePackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-BCCachePackage \\r\\n\"},{\"CompletionText\":\"Export-BcdStore\",\"ListItemText\":\"Export-BcdStore\",\"ResultType\":2,\"ToolTip\":\"Export-BcdStore\\r\\n\"},{\"CompletionText\":\"Export-BCSecretKey\",\"ListItemText\":\"Export-BCSecretKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-BCSecretKey \\r\\n\"},{\"CompletionText\":\"Export-BinaryMiLog\",\"ListItemText\":\"Export-BinaryMiLog\",\"ResultType\":2,\"ToolTip\":\"Export-BinaryMiLog\\r\\n\"},{\"CompletionText\":\"Export-Certificate\",\"ListItemText\":\"Export-Certificate\",\"ResultType\":2,\"ToolTip\":\"Export-Certificate\\r\\n\"},{\"CompletionText\":\"Export-Clixml\",\"ListItemText\":\"Export-Clixml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-Clixml [-Path] -InputObject [-Depth ] [-Force] [-NoClobber] [-Encoding ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nExport-Clixml -LiteralPath -InputObject [-Depth ] [-Force] [-NoClobber] [-Encoding ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Export-Counter\",\"ListItemText\":\"Export-Counter\",\"ResultType\":2,\"ToolTip\":\"Export-Counter\\r\\n\"},{\"CompletionText\":\"Export-Csv\",\"ListItemText\":\"Export-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-Csv [[-Path] ] [[-Delimiter] ] -InputObject [-LiteralPath ] [-Force] [-NoClobber] [-Encoding ] [-Append] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] [-WhatIf] [-Confirm] []\\r\\n\\r\\nExport-Csv [[-Path] ] -InputObject [-LiteralPath ] [-Force] [-NoClobber] [-Encoding ] [-Append] [-UseCulture] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Export-FormatData\",\"ListItemText\":\"Export-FormatData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-FormatData -InputObject -Path [-Force] [-NoClobber] [-IncludeScriptBlock] []\\r\\n\\r\\nExport-FormatData -InputObject -LiteralPath [-Force] [-NoClobber] [-IncludeScriptBlock] []\\r\\n\"},{\"CompletionText\":\"Export-HgsGuardian\",\"ListItemText\":\"Export-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Export-ModuleMember\",\"ListItemText\":\"Export-ModuleMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-ModuleMember [[-Function] ] [-Cmdlet ] [-Variable ] [-Alias ] []\\r\\n\"},{\"CompletionText\":\"Export-ODataEndpointProxy\",\"ListItemText\":\"Export-ODataEndpointProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-ODataEndpointProxy \\r\\n\"},{\"CompletionText\":\"Export-PfxCertificate\",\"ListItemText\":\"Export-PfxCertificate\",\"ResultType\":2,\"ToolTip\":\"Export-PfxCertificate\\r\\n\"},{\"CompletionText\":\"Export-ProvisioningPackage\",\"ListItemText\":\"Export-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Export-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Export-PSSession\",\"ListItemText\":\"Export-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-PSSession [-Session] [-OutputModule] [[-CommandName] ] [[-FormatTypeName] ] [-Force] [-Encoding ] [-AllowClobber] [-ArgumentList ] [-CommandType ] [-Module ] [-FullyQualifiedModule ] [-Certificate ] []\\r\\n\"},{\"CompletionText\":\"Export-ScheduledTask\",\"ListItemText\":\"Export-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Export-StartLayout\",\"ListItemText\":\"Export-StartLayout\",\"ResultType\":2,\"ToolTip\":\"Export-StartLayout\\r\\n\"},{\"CompletionText\":\"Export-StartLayoutEdgeAssets\",\"ListItemText\":\"Export-StartLayoutEdgeAssets\",\"ResultType\":2,\"ToolTip\":\"Export-StartLayoutEdgeAssets\\r\\n\"},{\"CompletionText\":\"Export-TlsSessionTicketKey\",\"ListItemText\":\"Export-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"Export-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"Export-Trace\",\"ListItemText\":\"Export-Trace\",\"ResultType\":2,\"ToolTip\":\"Export-Trace\\r\\n\"},{\"CompletionText\":\"Export-VM\",\"ListItemText\":\"Export-VM\",\"ResultType\":2,\"ToolTip\":\"Export-VM\\r\\n\"},{\"CompletionText\":\"Export-VMCheckpoint\",\"ListItemText\":\"Export-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Export-VMCheckpoint\"},{\"CompletionText\":\"Export-VMSnapshot\",\"ListItemText\":\"Export-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Export-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Export-WindowsCapabilitySource\",\"ListItemText\":\"Export-WindowsCapabilitySource\",\"ResultType\":2,\"ToolTip\":\"Export-WindowsCapabilitySource\\r\\n\"},{\"CompletionText\":\"Export-WindowsDriver\",\"ListItemText\":\"Export-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Export-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Export-WindowsImage\",\"ListItemText\":\"Export-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Export-WindowsImage\\r\\n\"},{\"CompletionText\":\"Export-WinhttpProxy\",\"ListItemText\":\"Export-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"exsn\",\"ListItemText\":\"exsn\",\"ResultType\":2,\"ToolTip\":\"Exit-PSSession\"},{\"CompletionText\":\"extcheck.exe\",\"ListItemText\":\"extcheck.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\extcheck.exe\"},{\"CompletionText\":\"extension-admin.exe\",\"ListItemText\":\"extension-admin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\extension-admin.exe\"},{\"CompletionText\":\"extrac32.exe\",\"ListItemText\":\"extrac32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\extrac32.exe\"},{\"CompletionText\":\"F:\",\"ListItemText\":\"F:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nF: \\r\\n\"},{\"CompletionText\":\"fc\",\"ListItemText\":\"fc\",\"ResultType\":2,\"ToolTip\":\"Format-Custom\"},{\"CompletionText\":\"fc.exe\",\"ListItemText\":\"fc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fc.exe\"},{\"CompletionText\":\"fclip.exe\",\"ListItemText\":\"fclip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fclip.exe\"},{\"CompletionText\":\"fdres\",\"ListItemText\":\"fdres\",\"ResultType\":2,\"ToolTip\":\"fdres\"},{\"CompletionText\":\"fhmanagew.exe\",\"ListItemText\":\"fhmanagew.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fhmanagew.exe\"},{\"CompletionText\":\"fhx\",\"ListItemText\":\"fhx\",\"ResultType\":2,\"ToolTip\":\"Format-Hex\"},{\"CompletionText\":\"FileDialogBroker.exe\",\"ListItemText\":\"FileDialogBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FileDialogBroker.exe\"},{\"CompletionText\":\"FileHistory.exe\",\"ListItemText\":\"FileHistory.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FileHistory.exe\"},{\"CompletionText\":\"fimo\",\"ListItemText\":\"fimo\",\"ResultType\":2,\"ToolTip\":\"fimo\"},{\"CompletionText\":\"Find-AzDataProtectionRestorableTimeRange\",\"ListItemText\":\"Find-AzDataProtectionRestorableTimeRange\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-AzDataProtectionRestorableTimeRange \\r\\n\"},{\"CompletionText\":\"Find-Command\",\"ListItemText\":\"Find-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Command \\r\\n\"},{\"CompletionText\":\"Find-DSCResource\",\"ListItemText\":\"Find-DSCResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-DSCResource \\r\\n\"},{\"CompletionText\":\"Find-LapsADExtendedRights\",\"ListItemText\":\"Find-LapsADExtendedRights\",\"ResultType\":2,\"ToolTip\":\"Find-LapsADExtendedRights\\r\\n\"},{\"CompletionText\":\"Find-Module\",\"ListItemText\":\"Find-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Module \\r\\n\"},{\"CompletionText\":\"Find-NetIPsecRule\",\"ListItemText\":\"Find-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Find-NetRoute\",\"ListItemText\":\"Find-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-NetRoute \\r\\n\"},{\"CompletionText\":\"Find-Package\",\"ListItemText\":\"Find-Package\",\"ResultType\":2,\"ToolTip\":\"Find-Package\\r\\n\"},{\"CompletionText\":\"Find-PackageProvider\",\"ListItemText\":\"Find-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Find-PackageProvider\\r\\n\"},{\"CompletionText\":\"Find-PSResource\",\"ListItemText\":\"Find-PSResource\",\"ResultType\":2,\"ToolTip\":\"Find-PSResource\\r\\n\"},{\"CompletionText\":\"Find-RoleCapability\",\"ListItemText\":\"Find-RoleCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-RoleCapability \\r\\n\"},{\"CompletionText\":\"Find-Script\",\"ListItemText\":\"Find-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Script \\r\\n\"},{\"CompletionText\":\"find.exe\",\"ListItemText\":\"find.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\find.exe\"},{\"CompletionText\":\"findstr.exe\",\"ListItemText\":\"findstr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\findstr.exe\"},{\"CompletionText\":\"finger.exe\",\"ListItemText\":\"finger.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\finger.exe\"},{\"CompletionText\":\"Firewall.cpl\",\"ListItemText\":\"Firewall.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Firewall.cpl\"},{\"CompletionText\":\"fixmapi.exe\",\"ListItemText\":\"fixmapi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fixmapi.exe\"},{\"CompletionText\":\"fl\",\"ListItemText\":\"fl\",\"ResultType\":2,\"ToolTip\":\"Format-List\"},{\"CompletionText\":\"fleet.cmd\",\"ListItemText\":\"fleet.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\JetBrains\\\\Toolbox\\\\scripts\\\\fleet.cmd\"},{\"CompletionText\":\"fltMC.exe\",\"ListItemText\":\"fltMC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fltMC.exe\"},{\"CompletionText\":\"Flush-EtwTraceSession\",\"ListItemText\":\"Flush-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFlush-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Flush-Volume\",\"ListItemText\":\"Flush-Volume\",\"ResultType\":2,\"ToolTip\":\"Flush-Volume\"},{\"CompletionText\":\"fodhelper.exe\",\"ListItemText\":\"fodhelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fodhelper.exe\"},{\"CompletionText\":\"Fondue.exe\",\"ListItemText\":\"Fondue.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Fondue.exe\"},{\"CompletionText\":\"fontdrvhost.exe\",\"ListItemText\":\"fontdrvhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fontdrvhost.exe\"},{\"CompletionText\":\"fontview.exe\",\"ListItemText\":\"fontview.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fontview.exe\"},{\"CompletionText\":\"foreach\",\"ListItemText\":\"foreach\",\"ResultType\":2,\"ToolTip\":\"ForEach-Object\"},{\"CompletionText\":\"ForEach-Object\",\"ListItemText\":\"ForEach-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nForEach-Object [-Process] [-InputObject ] [-Begin ] [-End ] [-RemainingScripts ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nForEach-Object [-MemberName] [-InputObject ] [-ArgumentList ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nForEach-Object -Parallel [-InputObject ] [-ThrottleLimit ] [-TimeoutSeconds ] [-AsJob] [-UseNewRunspace] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"forfiles.exe\",\"ListItemText\":\"forfiles.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\forfiles.exe\"},{\"CompletionText\":\"Format-Custom\",\"ListItemText\":\"Format-Custom\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Custom [[-Property] ] [-Depth ] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Format-GitBranchName\",\"ListItemText\":\"Format-GitBranchName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-GitBranchName \\r\\n\"},{\"CompletionText\":\"Format-Hex\",\"ListItemText\":\"Format-Hex\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Hex [-Path] [-Count ] [-Offset ] []\\r\\n\\r\\nFormat-Hex -LiteralPath [-Count ] [-Offset ] []\\r\\n\\r\\nFormat-Hex -InputObject [-Encoding ] [-Count ] [-Offset ] [-Raw] []\\r\\n\"},{\"CompletionText\":\"Format-List\",\"ListItemText\":\"Format-List\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-List [[-Property] ] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Format-SecureBootUEFI\",\"ListItemText\":\"Format-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Format-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"Format-Table\",\"ListItemText\":\"Format-Table\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Table [[-Property] ] [-AutoSize] [-RepeatHeader] [-HideTableHeaders] [-Wrap] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Format-Volume\",\"ListItemText\":\"Format-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Volume \\r\\n\"},{\"CompletionText\":\"Format-Wide\",\"ListItemText\":\"Format-Wide\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Wide [[-Property] ] [-AutoSize] [-Column ] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"format.com\",\"ListItemText\":\"format.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\format.com\"},{\"CompletionText\":\"fsavailux.exe\",\"ListItemText\":\"fsavailux.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsavailux.exe\"},{\"CompletionText\":\"FsIso.exe\",\"ListItemText\":\"FsIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FsIso.exe\"},{\"CompletionText\":\"fsmgmt.msc\",\"ListItemText\":\"fsmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsmgmt.msc\"},{\"CompletionText\":\"fsquirt.exe\",\"ListItemText\":\"fsquirt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsquirt.exe\"},{\"CompletionText\":\"fsutil.exe\",\"ListItemText\":\"fsutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsutil.exe\"},{\"CompletionText\":\"ft\",\"ListItemText\":\"ft\",\"ResultType\":2,\"ToolTip\":\"Format-Table\"},{\"CompletionText\":\"ftp.exe\",\"ListItemText\":\"ftp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ftp.exe\"},{\"CompletionText\":\"fvenotify.exe\",\"ListItemText\":\"fvenotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fvenotify.exe\"},{\"CompletionText\":\"fveprompt.exe\",\"ListItemText\":\"fveprompt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fveprompt.exe\"},{\"CompletionText\":\"fw\",\"ListItemText\":\"fw\",\"ResultType\":2,\"ToolTip\":\"Format-Wide\"},{\"CompletionText\":\"FXSCOVER.exe\",\"ListItemText\":\"FXSCOVER.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FXSCOVER.exe\"},{\"CompletionText\":\"FXSSVC.exe\",\"ListItemText\":\"FXSSVC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FXSSVC.exe\"},{\"CompletionText\":\"FXSUNATD.exe\",\"ListItemText\":\"FXSUNATD.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FXSUNATD.exe\"},{\"CompletionText\":\"G:\",\"ListItemText\":\"G:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nG: \\r\\n\"},{\"CompletionText\":\"gal\",\"ListItemText\":\"gal\",\"ResultType\":2,\"ToolTip\":\"Get-Alias\"},{\"CompletionText\":\"GameBarElevatedFT_Alias.exe\",\"ListItemText\":\"GameBarElevatedFT_Alias.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\GameBarElevatedFT_Alias.exe\"},{\"CompletionText\":\"GameBarPresenceWriter.exe\",\"ListItemText\":\"GameBarPresenceWriter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GameBarPresenceWriter.exe\"},{\"CompletionText\":\"GameInputSvc.exe\",\"ListItemText\":\"GameInputSvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GameInputSvc.exe\"},{\"CompletionText\":\"GamePanel.exe\",\"ListItemText\":\"GamePanel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GamePanel.exe\"},{\"CompletionText\":\"gatherNetworkInfo.vbs\",\"ListItemText\":\"gatherNetworkInfo.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gatherNetworkInfo.vbs\"},{\"CompletionText\":\"gbp\",\"ListItemText\":\"gbp\",\"ResultType\":2,\"ToolTip\":\"Get-PSBreakpoint\"},{\"CompletionText\":\"gc\",\"ListItemText\":\"gc\",\"ResultType\":2,\"ToolTip\":\"Get-Content\"},{\"CompletionText\":\"gcai\",\"ListItemText\":\"gcai\",\"ResultType\":2,\"ToolTip\":\"gcai\"},{\"CompletionText\":\"gcb\",\"ListItemText\":\"gcb\",\"ResultType\":2,\"ToolTip\":\"Get-Clipboard\"},{\"CompletionText\":\"gcfg\",\"ListItemText\":\"gcfg\",\"ResultType\":2,\"ToolTip\":\"gcfg\"},{\"CompletionText\":\"gcfgs\",\"ListItemText\":\"gcfgs\",\"ResultType\":2,\"ToolTip\":\"gcfgs\"},{\"CompletionText\":\"gci\",\"ListItemText\":\"gci\",\"ResultType\":2,\"ToolTip\":\"Get-ChildItem\"},{\"CompletionText\":\"gcim\",\"ListItemText\":\"gcim\",\"ResultType\":2,\"ToolTip\":\"gcim\"},{\"CompletionText\":\"gcls\",\"ListItemText\":\"gcls\",\"ResultType\":2,\"ToolTip\":\"gcls\"},{\"CompletionText\":\"gcm\",\"ListItemText\":\"gcm\",\"ResultType\":2,\"ToolTip\":\"Get-Command\"},{\"CompletionText\":\"gcms\",\"ListItemText\":\"gcms\",\"ResultType\":2,\"ToolTip\":\"gcms\"},{\"CompletionText\":\"gcs\",\"ListItemText\":\"gcs\",\"ResultType\":2,\"ToolTip\":\"Get-PSCallStack\"},{\"CompletionText\":\"gdr\",\"ListItemText\":\"gdr\",\"ResultType\":2,\"ToolTip\":\"Get-PSDrive\"},{\"CompletionText\":\"GenValObj.exe\",\"ListItemText\":\"GenValObj.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GenValObj.exe\"},{\"CompletionText\":\"gerr\",\"ListItemText\":\"gerr\",\"ResultType\":2,\"ToolTip\":\"Get-Error\"},{\"CompletionText\":\"Get-Acl\",\"ListItemText\":\"Get-Acl\",\"ResultType\":2,\"ToolTip\":\"Get-Acl\\r\\n\"},{\"CompletionText\":\"Get-AdlAnalyticsAccount\",\"ListItemText\":\"Get-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsAccount\"},{\"CompletionText\":\"Get-AdlAnalyticsComputePolicy\",\"ListItemText\":\"Get-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"Get-AdlAnalyticsDataSource\",\"ListItemText\":\"Get-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Get-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Get-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Get-AdlCatalogItem\",\"ListItemText\":\"Get-AdlCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlCatalogItem\"},{\"CompletionText\":\"Get-AdlCatalogItemAclEntry\",\"ListItemText\":\"Get-AdlCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AdlCatalogItemAclEntry\"},{\"CompletionText\":\"Get-AdlJob\",\"ListItemText\":\"Get-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Get-AdlJob\"},{\"CompletionText\":\"Get-AdlJobPipeline\",\"ListItemText\":\"Get-AdlJobPipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AdlJobPipeline\"},{\"CompletionText\":\"Get-AdlJobRecurrence\",\"ListItemText\":\"Get-AdlJobRecurrence\",\"ResultType\":2,\"ToolTip\":\"Get-AdlJobRecurrence\"},{\"CompletionText\":\"Get-AdlStore\",\"ListItemText\":\"Get-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStore\"},{\"CompletionText\":\"Get-AdlStoreChildItem\",\"ListItemText\":\"Get-AdlStoreChildItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreChildItem\"},{\"CompletionText\":\"Get-AdlStoreChildItemSummary\",\"ListItemText\":\"Get-AdlStoreChildItemSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreChildItemSummary\"},{\"CompletionText\":\"Get-AdlStoreDeletedItem\",\"ListItemText\":\"Get-AdlStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreDeletedItem\"},{\"CompletionText\":\"Get-AdlStoreFirewallRule\",\"ListItemText\":\"Get-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreFirewallRule\"},{\"CompletionText\":\"Get-AdlStoreItem\",\"ListItemText\":\"Get-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItem\"},{\"CompletionText\":\"Get-AdlStoreItemAclEntry\",\"ListItemText\":\"Get-AdlStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemAclEntry\"},{\"CompletionText\":\"Get-AdlStoreItemContent\",\"ListItemText\":\"Get-AdlStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemContent\"},{\"CompletionText\":\"Get-AdlStoreItemOwner\",\"ListItemText\":\"Get-AdlStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemOwner\"},{\"CompletionText\":\"Get-AdlStoreItemPermission\",\"ListItemText\":\"Get-AdlStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemPermission\"},{\"CompletionText\":\"Get-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Get-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Get-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Get-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Get-Alias\",\"ListItemText\":\"Get-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Alias [[-Name] ] [-Exclude ] [-Scope ] []\\r\\n\\r\\nGet-Alias [-Exclude ] [-Scope ] [-Definition ] []\\r\\n\"},{\"CompletionText\":\"Get-AppBackgroundTask\",\"ListItemText\":\"Get-AppBackgroundTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppBackgroundTask \\r\\n\"},{\"CompletionText\":\"Get-AppLockerFileInformation\",\"ListItemText\":\"Get-AppLockerFileInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AppLockerFileInformation\\r\\n\"},{\"CompletionText\":\"Get-AppLockerPolicy\",\"ListItemText\":\"Get-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"Get-AppPackage\",\"ListItemText\":\"Get-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackage\"},{\"CompletionText\":\"Get-AppPackageAutoUpdateSettings\",\"ListItemText\":\"Get-AppPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageAutoUpdateSettings\"},{\"CompletionText\":\"Get-AppPackageDefaultVolume\",\"ListItemText\":\"Get-AppPackageDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageDefaultVolume\"},{\"CompletionText\":\"Get-AppPackageLastError\",\"ListItemText\":\"Get-AppPackageLastError\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageLastError\"},{\"CompletionText\":\"Get-AppPackageLog\",\"ListItemText\":\"Get-AppPackageLog\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageLog\"},{\"CompletionText\":\"Get-AppPackageManifest\",\"ListItemText\":\"Get-AppPackageManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageManifest\"},{\"CompletionText\":\"Get-AppPackageVolume\",\"ListItemText\":\"Get-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageVolume\"},{\"CompletionText\":\"Get-AppProvisionedPackage\",\"ListItemText\":\"Get-AppProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppProvisionedPackage\"},{\"CompletionText\":\"Get-AppProvisionedSharedPackageContainer\",\"ListItemText\":\"Get-AppProvisionedSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AppProvisionedSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Get-AppSharedPackageContainer\",\"ListItemText\":\"Get-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Get-AppvVirtualProcess\",\"ListItemText\":\"Get-AppvVirtualProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppvVirtualProcess \\r\\n\"},{\"CompletionText\":\"Get-AppxDefaultVolume\",\"ListItemText\":\"Get-AppxDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppxDefaultVolume\\r\\n\"},{\"CompletionText\":\"Get-AppxLastError\",\"ListItemText\":\"Get-AppxLastError\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppxLastError \\r\\n\"},{\"CompletionText\":\"Get-AppxLog\",\"ListItemText\":\"Get-AppxLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppxLog \\r\\n\"},{\"CompletionText\":\"Get-AppxPackage\",\"ListItemText\":\"Get-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppxPackage\\r\\n\"},{\"CompletionText\":\"Get-AppxPackageAutoUpdateSettings\",\"ListItemText\":\"Get-AppxPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AppxPackageAutoUpdateSettings\\r\\n\"},{\"CompletionText\":\"Get-AppxPackageManifest\",\"ListItemText\":\"Get-AppxPackageManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AppxPackageManifest\\r\\n\"},{\"CompletionText\":\"Get-AppxProvisionedPackage\",\"ListItemText\":\"Get-AppxProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppxProvisionedPackage\\r\\n\"},{\"CompletionText\":\"Get-AppxVolume\",\"ListItemText\":\"Get-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppxVolume\\r\\n\"},{\"CompletionText\":\"Get-ASRAlertSetting\",\"ListItemText\":\"Get-ASRAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Get-ASRAlertSetting\"},{\"CompletionText\":\"Get-ASREvent\",\"ListItemText\":\"Get-ASREvent\",\"ResultType\":2,\"ToolTip\":\"Get-ASREvent\"},{\"CompletionText\":\"Get-ASRFabric\",\"ListItemText\":\"Get-ASRFabric\",\"ResultType\":2,\"ToolTip\":\"Get-ASRFabric\"},{\"CompletionText\":\"Get-ASRJob\",\"ListItemText\":\"Get-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Get-ASRJob\"},{\"CompletionText\":\"Get-ASRNetwork\",\"ListItemText\":\"Get-ASRNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-ASRNetwork\"},{\"CompletionText\":\"Get-ASRNetworkMapping\",\"ListItemText\":\"Get-ASRNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Get-ASRNetworkMapping\"},{\"CompletionText\":\"Get-ASRNotificationSetting\",\"ListItemText\":\"Get-ASRNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Get-ASRNotificationSetting\"},{\"CompletionText\":\"Get-ASRPolicy\",\"ListItemText\":\"Get-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-ASRPolicy\"},{\"CompletionText\":\"Get-ASRProtectableItem\",\"ListItemText\":\"Get-ASRProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Get-ASRProtectableItem\"},{\"CompletionText\":\"Get-ASRProtectionContainer\",\"ListItemText\":\"Get-ASRProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"Get-ASRProtectionContainer\"},{\"CompletionText\":\"Get-ASRProtectionContainerMapping\",\"ListItemText\":\"Get-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Get-ASRProtectionContainerMapping\"},{\"CompletionText\":\"Get-ASRRecoveryPlan\",\"ListItemText\":\"Get-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Get-ASRRecoveryPlan\"},{\"CompletionText\":\"Get-ASRRecoveryPoint\",\"ListItemText\":\"Get-ASRRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Get-ASRRecoveryPoint\"},{\"CompletionText\":\"Get-ASRReplicationProtectedItem\",\"ListItemText\":\"Get-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Get-ASRReplicationProtectedItem\"},{\"CompletionText\":\"Get-ASRRP\",\"ListItemText\":\"Get-ASRRP\",\"ResultType\":2,\"ToolTip\":\"Get-ASRRP\"},{\"CompletionText\":\"Get-ASRServicesProvider\",\"ListItemText\":\"Get-ASRServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Get-ASRServicesProvider\"},{\"CompletionText\":\"Get-ASRStorageClassification\",\"ListItemText\":\"Get-ASRStorageClassification\",\"ResultType\":2,\"ToolTip\":\"Get-ASRStorageClassification\"},{\"CompletionText\":\"Get-ASRStorageClassificationMapping\",\"ListItemText\":\"Get-ASRStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Get-ASRStorageClassificationMapping\"},{\"CompletionText\":\"Get-ASRvCenter\",\"ListItemText\":\"Get-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"Get-ASRvCenter\"},{\"CompletionText\":\"Get-AssignedAccess\",\"ListItemText\":\"Get-AssignedAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AssignedAccess \\r\\n\"},{\"CompletionText\":\"Get-AuthenticodeSignature\",\"ListItemText\":\"Get-AuthenticodeSignature\",\"ResultType\":2,\"ToolTip\":\"Get-AuthenticodeSignature\\r\\n\"},{\"CompletionText\":\"Get-AutologgerConfig\",\"ListItemText\":\"Get-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Get-AzAccessToken\",\"ListItemText\":\"Get-AzAccessToken\",\"ResultType\":2,\"ToolTip\":\"Get-AzAccessToken\\r\\n\"},{\"CompletionText\":\"Get-AzActionGroup\",\"ListItemText\":\"Get-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Get-AzActivityLog\",\"ListItemText\":\"Get-AzActivityLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzActivityLog\\r\\n\"},{\"CompletionText\":\"Get-AzActivityLogAlert\",\"ListItemText\":\"Get-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"Get-AzADAppCredential\",\"ListItemText\":\"Get-AzADAppCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADAppCredential \\r\\n\"},{\"CompletionText\":\"Get-AzADAppFederatedCredential\",\"ListItemText\":\"Get-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"Get-AzADApplication\",\"ListItemText\":\"Get-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADApplication \\r\\n\"},{\"CompletionText\":\"Get-AzADAppPermission\",\"ListItemText\":\"Get-AzADAppPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADAppPermission \\r\\n\"},{\"CompletionText\":\"Get-AzADGroup\",\"ListItemText\":\"Get-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADGroup \\r\\n\"},{\"CompletionText\":\"Get-AzADGroupMember\",\"ListItemText\":\"Get-AzADGroupMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADGroupMember \\r\\n\"},{\"CompletionText\":\"Get-AzADOrganization\",\"ListItemText\":\"Get-AzADOrganization\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADOrganization \\r\\n\"},{\"CompletionText\":\"Get-AzADServicePrincipal\",\"ListItemText\":\"Get-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"Get-AzADServicePrincipalCredential\",\"ListItemText\":\"Get-AzADServicePrincipalCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzADServicePrincipalCredential\"},{\"CompletionText\":\"Get-AzADSpCredential\",\"ListItemText\":\"Get-AzADSpCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADSpCredential \\r\\n\"},{\"CompletionText\":\"Get-AzADUser\",\"ListItemText\":\"Get-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADUser \\r\\n\"},{\"CompletionText\":\"Get-AzAdvisorConfiguration\",\"ListItemText\":\"Get-AzAdvisorConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAdvisorConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzAdvisorRecommendation\",\"ListItemText\":\"Get-AzAdvisorRecommendation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAdvisorRecommendation \\r\\n\"},{\"CompletionText\":\"Get-AzAksCluster\",\"ListItemText\":\"Get-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzAksCluster\\r\\n\"},{\"CompletionText\":\"Get-AzAksClusterUpgradeProfile\",\"ListItemText\":\"Get-AzAksClusterUpgradeProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzAksClusterUpgradeProfile\"},{\"CompletionText\":\"Get-AzAksMaintenanceConfiguration\",\"ListItemText\":\"Get-AzAksMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksMaintenanceConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzAksManagedClusterCommandResult\",\"ListItemText\":\"Get-AzAksManagedClusterCommandResult\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksManagedClusterCommandResult \\r\\n\"},{\"CompletionText\":\"Get-AzAksManagedClusterOSOption\",\"ListItemText\":\"Get-AzAksManagedClusterOSOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksManagedClusterOSOption \\r\\n\"},{\"CompletionText\":\"Get-AzAksManagedClusterOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzAksManagedClusterOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksManagedClusterOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzAksNodePool\",\"ListItemText\":\"Get-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"Get-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"Get-AzAksNodePoolUpgradeProfile\",\"ListItemText\":\"Get-AzAksNodePoolUpgradeProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksNodePoolUpgradeProfile \\r\\n\"},{\"CompletionText\":\"Get-AzAksSnapshot\",\"ListItemText\":\"Get-AzAksSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksSnapshot \\r\\n\"},{\"CompletionText\":\"Get-AzAksUpgradeProfile\",\"ListItemText\":\"Get-AzAksUpgradeProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksUpgradeProfile \\r\\n\"},{\"CompletionText\":\"Get-AzAksVersion\",\"ListItemText\":\"Get-AzAksVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksVersion \\r\\n\"},{\"CompletionText\":\"Get-AzAlertHistory\",\"ListItemText\":\"Get-AzAlertHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzAlertHistory\\r\\n\"},{\"CompletionText\":\"Get-AzAlertRule\",\"ListItemText\":\"Get-AzAlertRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAlertRule\\r\\n\"},{\"CompletionText\":\"Get-AzAlertsSuppressionRule\",\"ListItemText\":\"Get-AzAlertsSuppressionRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAlertsSuppressionRule\\r\\n\"},{\"CompletionText\":\"Get-AzAllowedConnection\",\"ListItemText\":\"Get-AzAllowedConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzAllowedConnection\\r\\n\"},{\"CompletionText\":\"Get-AzAnalysisServicesServer\",\"ListItemText\":\"Get-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagement\",\"ListItemText\":\"Get-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApi\",\"ListItemText\":\"Get-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiRelease\",\"ListItemText\":\"Get-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiRevision\",\"ListItemText\":\"Get-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiSchema\",\"ListItemText\":\"Get-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiVersionSet\",\"ListItemText\":\"Get-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementAuthorizationServer\",\"ListItemText\":\"Get-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementAuthorizationServerClientSecret\",\"ListItemText\":\"Get-AzApiManagementAuthorizationServerClientSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementAuthorizationServerClientSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementBackend\",\"ListItemText\":\"Get-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementCache\",\"ListItemText\":\"Get-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementCertificate\",\"ListItemText\":\"Get-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementDiagnostic\",\"ListItemText\":\"Get-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGateway\",\"ListItemText\":\"Get-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGatewayHostnameConfiguration\",\"ListItemText\":\"Get-AzApiManagementGatewayHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGatewayHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGatewayKey\",\"ListItemText\":\"Get-AzApiManagementGatewayKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGatewayKey\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGroup\",\"ListItemText\":\"Get-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementIdentityProvider\",\"ListItemText\":\"Get-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementIdentityProviderClientSecret\",\"ListItemText\":\"Get-AzApiManagementIdentityProviderClientSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementIdentityProviderClientSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementLogger\",\"ListItemText\":\"Get-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementNamedValue\",\"ListItemText\":\"Get-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementNamedValueSecretValue\",\"ListItemText\":\"Get-AzApiManagementNamedValueSecretValue\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementNamedValueSecretValue\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementNetworkStatus\",\"ListItemText\":\"Get-AzApiManagementNetworkStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementNetworkStatus\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"Get-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementOpenIdConnectProviderClientSecret\",\"ListItemText\":\"Get-AzApiManagementOpenIdConnectProviderClientSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementOpenIdConnectProviderClientSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementOperation\",\"ListItemText\":\"Get-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementPolicy\",\"ListItemText\":\"Get-AzApiManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementProduct\",\"ListItemText\":\"Get-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementSsoToken\",\"ListItemText\":\"Get-AzApiManagementSsoToken\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementSsoToken\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementSubscription\",\"ListItemText\":\"Get-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementSubscriptionKey\",\"ListItemText\":\"Get-AzApiManagementSubscriptionKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementSubscriptionKey\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantAccess\",\"ListItemText\":\"Get-AzApiManagementTenantAccess\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantAccess\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantAccessSecret\",\"ListItemText\":\"Get-AzApiManagementTenantAccessSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantAccessSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantGitAccess\",\"ListItemText\":\"Get-AzApiManagementTenantGitAccess\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantGitAccess\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantGitAccessSecret\",\"ListItemText\":\"Get-AzApiManagementTenantGitAccessSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantGitAccessSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantSyncState\",\"ListItemText\":\"Get-AzApiManagementTenantSyncState\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantSyncState\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementUser\",\"ListItemText\":\"Get-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementUserSsoUrl\",\"ListItemText\":\"Get-AzApiManagementUserSsoUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementUserSsoUrl\\r\\n\"},{\"CompletionText\":\"Get-AzAppConfigurationDeletedStore\",\"ListItemText\":\"Get-AzAppConfigurationDeletedStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAppConfigurationDeletedStore \\r\\n\"},{\"CompletionText\":\"Get-AzAppConfigurationStore\",\"ListItemText\":\"Get-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"Get-AzAppConfigurationStoreKey\",\"ListItemText\":\"Get-AzAppConfigurationStoreKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAppConfigurationStoreKey \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGateway\",\"ListItemText\":\"Get-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Get-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableServerVariableAndHeader\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableSslOption\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableSslOption\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableSslOption\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableSslOptions\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableSslOptions\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableSslOptions\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableWafRuleSet\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableWafRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableWafRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableWafRuleSets\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableWafRuleSets\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableWafRuleSets\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Get-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendHealth\",\"ListItemText\":\"Get-AzApplicationGatewayBackendHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendHealth\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Get-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Get-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Get-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"Get-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayCustomError\",\"ListItemText\":\"Get-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"Get-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Get-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Get-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Get-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Get-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayIdentity\",\"ListItemText\":\"Get-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayListener\",\"ListItemText\":\"Get-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Get-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Get-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Get-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Get-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySku\",\"ListItemText\":\"Get-AzApplicationGatewaySku\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySku\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Get-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"Get-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslPredefinedPolicy\",\"ListItemText\":\"Get-AzApplicationGatewaySslPredefinedPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslPredefinedPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Get-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslProfilePolicy\",\"ListItemText\":\"Get-AzApplicationGatewaySslProfilePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslProfilePolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Get-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Get-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Get-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayWafDynamicManifest\",\"ListItemText\":\"Get-AzApplicationGatewayWafDynamicManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayWafDynamicManifest\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayWebApplicationFirewallConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsights\",\"ListItemText\":\"Get-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsApiKey\",\"ListItemText\":\"Get-AzApplicationInsightsApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsApiKey \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"Get-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"Get-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"Get-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWebTest\",\"ListItemText\":\"Get-AzApplicationInsightsWebTest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWebTest \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWorkbook\",\"ListItemText\":\"Get-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWorkbookRevision\",\"ListItemText\":\"Get-AzApplicationInsightsWorkbookRevision\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWorkbookRevision \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"Get-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationSecurityGroup\",\"ListItemText\":\"Get-AzApplicationSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzApplyUpdate\",\"ListItemText\":\"Get-AzApplyUpdate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplyUpdate\\r\\n\"},{\"CompletionText\":\"Get-AzAppServiceEnvironment\",\"ListItemText\":\"Get-AzAppServiceEnvironment\",\"ResultType\":2,\"ToolTip\":\"Get-AzAppServiceEnvironment\\r\\n\"},{\"CompletionText\":\"Get-AzAppServicePlan\",\"ListItemText\":\"Get-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"Get-AzAs\",\"ListItemText\":\"Get-AzAs\",\"ResultType\":2,\"ToolTip\":\"Get-AzAs\"},{\"CompletionText\":\"Get-AzAttestationDefaultProvider\",\"ListItemText\":\"Get-AzAttestationDefaultProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAttestationDefaultProvider \\r\\n\"},{\"CompletionText\":\"Get-AzAttestationPolicy\",\"ListItemText\":\"Get-AzAttestationPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzAttestationPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzAttestationPolicySigners\",\"ListItemText\":\"Get-AzAttestationPolicySigners\",\"ResultType\":2,\"ToolTip\":\"Get-AzAttestationPolicySigners\\r\\n\"},{\"CompletionText\":\"Get-AzAttestationProvider\",\"ListItemText\":\"Get-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"Get-AzAutoApprovedPrivateLinkService\",\"ListItemText\":\"Get-AzAutoApprovedPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutoApprovedPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageBestPractice\",\"ListItemText\":\"Get-AzAutomanageBestPractice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageBestPractice \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfile\",\"ListItemText\":\"Get-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfileAssignment\",\"ListItemText\":\"Get-AzAutomanageConfigProfileAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfileAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfileHciAssignment\",\"ListItemText\":\"Get-AzAutomanageConfigProfileHciAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfileHciAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfileHcrpAssignment\",\"ListItemText\":\"Get-AzAutomanageConfigProfileHcrpAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfileHcrpAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageHciReport\",\"ListItemText\":\"Get-AzAutomanageHciReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageHciReport \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageHcrpReport\",\"ListItemText\":\"Get-AzAutomanageHcrpReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageHcrpReport \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageReport\",\"ListItemText\":\"Get-AzAutomanageReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageReport \\r\\n\"},{\"CompletionText\":\"Get-AzAutomationAccount\",\"ListItemText\":\"Get-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationCertificate\",\"ListItemText\":\"Get-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationConnection\",\"ListItemText\":\"Get-AzAutomationConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationConnection\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationCredential\",\"ListItemText\":\"Get-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscCompilationJob\",\"ListItemText\":\"Get-AzAutomationDscCompilationJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscCompilationJob\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscCompilationJobOutput\",\"ListItemText\":\"Get-AzAutomationDscCompilationJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscCompilationJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscConfiguration\",\"ListItemText\":\"Get-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNode\",\"ListItemText\":\"Get-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeConfiguration\",\"ListItemText\":\"Get-AzAutomationDscNodeConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeConfigurationDeployment\",\"ListItemText\":\"Get-AzAutomationDscNodeConfigurationDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeConfigurationDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeConfigurationDeploymentSchedule\",\"ListItemText\":\"Get-AzAutomationDscNodeConfigurationDeploymentSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeConfigurationDeploymentSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeReport\",\"ListItemText\":\"Get-AzAutomationDscNodeReport\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeReport\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscOnboardingMetaconfig\",\"ListItemText\":\"Get-AzAutomationDscOnboardingMetaconfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscOnboardingMetaconfig\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"Get-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"Get-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationHybridWorkerGroup\",\"ListItemText\":\"Get-AzAutomationHybridWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationHybridWorkerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationJob\",\"ListItemText\":\"Get-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationJobOutput\",\"ListItemText\":\"Get-AzAutomationJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationJobOutputRecord\",\"ListItemText\":\"Get-AzAutomationJobOutputRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationJobOutputRecord\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationModule\",\"ListItemText\":\"Get-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationPython3Package\",\"ListItemText\":\"Get-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationRegistrationInfo\",\"ListItemText\":\"Get-AzAutomationRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationRegistrationInfo\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationRunbook\",\"ListItemText\":\"Get-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSchedule\",\"ListItemText\":\"Get-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationScheduledRunbook\",\"ListItemText\":\"Get-AzAutomationScheduledRunbook\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationScheduledRunbook\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSoftwareUpdateConfiguration\",\"ListItemText\":\"Get-AzAutomationSoftwareUpdateConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSoftwareUpdateConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSoftwareUpdateMachineRun\",\"ListItemText\":\"Get-AzAutomationSoftwareUpdateMachineRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSoftwareUpdateMachineRun\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSoftwareUpdateRun\",\"ListItemText\":\"Get-AzAutomationSoftwareUpdateRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSoftwareUpdateRun\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSourceControl\",\"ListItemText\":\"Get-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSourceControlSyncJob\",\"ListItemText\":\"Get-AzAutomationSourceControlSyncJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSourceControlSyncJob\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSourceControlSyncJobOutput\",\"ListItemText\":\"Get-AzAutomationSourceControlSyncJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSourceControlSyncJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationVariable\",\"ListItemText\":\"Get-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationWebhook\",\"ListItemText\":\"Get-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"Get-AzAutoscaleHistory\",\"ListItemText\":\"Get-AzAutoscaleHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutoscaleHistory\\r\\n\"},{\"CompletionText\":\"Get-AzAutoscalePredictiveMetric\",\"ListItemText\":\"Get-AzAutoscalePredictiveMetric\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutoscalePredictiveMetric \\r\\n\"},{\"CompletionText\":\"Get-AzAutoscaleSetting\",\"ListItemText\":\"Get-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"Get-AzAvailabilityGroupListener\",\"ListItemText\":\"Get-AzAvailabilityGroupListener\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAvailabilityGroupListener \\r\\n\"},{\"CompletionText\":\"Get-AzAvailabilitySet\",\"ListItemText\":\"Get-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"Get-AzAvailablePrivateEndpointType\",\"ListItemText\":\"Get-AzAvailablePrivateEndpointType\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailablePrivateEndpointType\\r\\n\"},{\"CompletionText\":\"Get-AzAvailableServiceAlias\",\"ListItemText\":\"Get-AzAvailableServiceAlias\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailableServiceAlias\\r\\n\"},{\"CompletionText\":\"Get-AzAvailableServiceDelegation\",\"ListItemText\":\"Get-AzAvailableServiceDelegation\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailableServiceDelegation\\r\\n\"},{\"CompletionText\":\"Get-AzBastion\",\"ListItemText\":\"Get-AzBastion\",\"ResultType\":2,\"ToolTip\":\"Get-AzBastion\\r\\n\"},{\"CompletionText\":\"Get-AzBatchAccount\",\"ListItemText\":\"Get-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"Get-AzBatchAccountKey\",\"ListItemText\":\"Get-AzBatchAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzBatchAccountKeys\",\"ListItemText\":\"Get-AzBatchAccountKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchAccountKeys\"},{\"CompletionText\":\"Get-AzBatchApplication\",\"ListItemText\":\"Get-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"Get-AzBatchApplicationPackage\",\"ListItemText\":\"Get-AzBatchApplicationPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchApplicationPackage\\r\\n\"},{\"CompletionText\":\"Get-AzBatchCertificate\",\"ListItemText\":\"Get-AzBatchCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzBatchComputeNode\",\"ListItemText\":\"Get-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Get-AzBatchComputeNodeExtension\",\"ListItemText\":\"Get-AzBatchComputeNodeExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchComputeNodeExtension\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJob\",\"ListItemText\":\"Get-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobPreparationAndReleaseTaskStatus\",\"ListItemText\":\"Get-AzBatchJobPreparationAndReleaseTaskStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobPreparationAndReleaseTaskStatus\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobSchedule\",\"ListItemText\":\"Get-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobStatistic\",\"ListItemText\":\"Get-AzBatchJobStatistic\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobStatistic\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobStatistics\",\"ListItemText\":\"Get-AzBatchJobStatistics\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobStatistics\"},{\"CompletionText\":\"Get-AzBatchLocationQuota\",\"ListItemText\":\"Get-AzBatchLocationQuota\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchLocationQuota\\r\\n\"},{\"CompletionText\":\"Get-AzBatchLocationQuotas\",\"ListItemText\":\"Get-AzBatchLocationQuotas\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchLocationQuotas\"},{\"CompletionText\":\"Get-AzBatchNodeFile\",\"ListItemText\":\"Get-AzBatchNodeFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchNodeFile\\r\\n\"},{\"CompletionText\":\"Get-AzBatchNodeFileContent\",\"ListItemText\":\"Get-AzBatchNodeFileContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchNodeFileContent\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPool\",\"ListItemText\":\"Get-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPool\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolNodeCount\",\"ListItemText\":\"Get-AzBatchPoolNodeCount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolNodeCount\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolNodeCounts\",\"ListItemText\":\"Get-AzBatchPoolNodeCounts\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolNodeCounts\"},{\"CompletionText\":\"Get-AzBatchPoolStatistic\",\"ListItemText\":\"Get-AzBatchPoolStatistic\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolStatistic\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolStatistics\",\"ListItemText\":\"Get-AzBatchPoolStatistics\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolStatistics\"},{\"CompletionText\":\"Get-AzBatchPoolUsageMetric\",\"ListItemText\":\"Get-AzBatchPoolUsageMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolUsageMetric\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolUsageMetrics\",\"ListItemText\":\"Get-AzBatchPoolUsageMetrics\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolUsageMetrics\"},{\"CompletionText\":\"Get-AzBatchRemoteDesktopProtocolFile\",\"ListItemText\":\"Get-AzBatchRemoteDesktopProtocolFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchRemoteDesktopProtocolFile\\r\\n\"},{\"CompletionText\":\"Get-AzBatchRemoteLoginSetting\",\"ListItemText\":\"Get-AzBatchRemoteLoginSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchRemoteLoginSetting\\r\\n\"},{\"CompletionText\":\"Get-AzBatchRemoteLoginSettings\",\"ListItemText\":\"Get-AzBatchRemoteLoginSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchRemoteLoginSettings\"},{\"CompletionText\":\"Get-AzBatchSubscriptionQuotas\",\"ListItemText\":\"Get-AzBatchSubscriptionQuotas\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSubscriptionQuotas\"},{\"CompletionText\":\"Get-AzBatchSubtask\",\"ListItemText\":\"Get-AzBatchSubtask\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSubtask\\r\\n\"},{\"CompletionText\":\"Get-AzBatchSupportedImage\",\"ListItemText\":\"Get-AzBatchSupportedImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSupportedImage\\r\\n\"},{\"CompletionText\":\"Get-AzBatchSupportedVirtualMachineSku\",\"ListItemText\":\"Get-AzBatchSupportedVirtualMachineSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSupportedVirtualMachineSku\\r\\n\"},{\"CompletionText\":\"Get-AzBatchSupportedVMSku\",\"ListItemText\":\"Get-AzBatchSupportedVMSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSupportedVMSku\"},{\"CompletionText\":\"Get-AzBatchTask\",\"ListItemText\":\"Get-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Get-AzBatchTaskCount\",\"ListItemText\":\"Get-AzBatchTaskCount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTaskCount\\r\\n\"},{\"CompletionText\":\"Get-AzBatchTaskCounts\",\"ListItemText\":\"Get-AzBatchTaskCounts\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTaskCounts\"},{\"CompletionText\":\"Get-AzBatchTaskSlotCount\",\"ListItemText\":\"Get-AzBatchTaskSlotCount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTaskSlotCount\\r\\n\"},{\"CompletionText\":\"Get-AzBgpServiceCommunity\",\"ListItemText\":\"Get-AzBgpServiceCommunity\",\"ResultType\":2,\"ToolTip\":\"Get-AzBgpServiceCommunity\\r\\n\"},{\"CompletionText\":\"Get-AzBillingAccount\",\"ListItemText\":\"Get-AzBillingAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingAccount\\r\\n\"},{\"CompletionText\":\"Get-AzBillingInvoice\",\"ListItemText\":\"Get-AzBillingInvoice\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingInvoice\\r\\n\"},{\"CompletionText\":\"Get-AzBillingPeriod\",\"ListItemText\":\"Get-AzBillingPeriod\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingPeriod\\r\\n\"},{\"CompletionText\":\"Get-AzBillingProfile\",\"ListItemText\":\"Get-AzBillingProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingProfile\\r\\n\"},{\"CompletionText\":\"Get-AzCapacityReservation\",\"ListItemText\":\"Get-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"Get-AzCapacityReservationGroup\",\"ListItemText\":\"Get-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"Get-AzCdnCustomDomain\",\"ListItemText\":\"Get-AzCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzCdnEdgeNode\",\"ListItemText\":\"Get-AzCdnEdgeNode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnEdgeNode \\r\\n\"},{\"CompletionText\":\"Get-AzCdnEndpoint\",\"ListItemText\":\"Get-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzCdnEndpointResourceUsage\",\"ListItemText\":\"Get-AzCdnEndpointResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnEndpointResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzCdnOrigin\",\"ListItemText\":\"Get-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"Get-AzCdnOriginGroup\",\"ListItemText\":\"Get-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Get-AzCdnProfile\",\"ListItemText\":\"Get-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"Get-AzCdnProfileResourceUsage\",\"ListItemText\":\"Get-AzCdnProfileResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnProfileResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzCdnProfileSupportedOptimizationType\",\"ListItemText\":\"Get-AzCdnProfileSupportedOptimizationType\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnProfileSupportedOptimizationType \\r\\n\"},{\"CompletionText\":\"Get-AzCdnSubscriptionResourceUsage\",\"ListItemText\":\"Get-AzCdnSubscriptionResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnSubscriptionResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzCloudService\",\"ListItemText\":\"Get-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudService \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceInstanceView\",\"ListItemText\":\"Get-AzCloudServiceInstanceView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceInstanceView \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceNetworkInterface\",\"ListItemText\":\"Get-AzCloudServiceNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceNetworkInterface \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceOSFamily\",\"ListItemText\":\"Get-AzCloudServiceOSFamily\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceOSFamily \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceOSVersion\",\"ListItemText\":\"Get-AzCloudServiceOSVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceOSVersion \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServicePublicIPAddress\",\"ListItemText\":\"Get-AzCloudServicePublicIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServicePublicIPAddress \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceRoleInstance\",\"ListItemText\":\"Get-AzCloudServiceRoleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceRoleInstance \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceRoleInstanceRemoteDesktopFile\",\"ListItemText\":\"Get-AzCloudServiceRoleInstanceRemoteDesktopFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceRoleInstanceRemoteDesktopFile \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceRoleInstanceView\",\"ListItemText\":\"Get-AzCloudServiceRoleInstanceView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceRoleInstanceView \\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccount\",\"ListItemText\":\"Get-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountCommitmentPlan\",\"ListItemText\":\"Get-AzCognitiveServicesAccountCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountDeployment\",\"ListItemText\":\"Get-AzCognitiveServicesAccountDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountKey\",\"ListItemText\":\"Get-AzCognitiveServicesAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountModel\",\"ListItemText\":\"Get-AzCognitiveServicesAccountModel\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountModel\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountNetworkRuleSet\",\"ListItemText\":\"Get-AzCognitiveServicesAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountSku\",\"ListItemText\":\"Get-AzCognitiveServicesAccountSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountSku\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountSkus\",\"ListItemText\":\"Get-AzCognitiveServicesAccountSkus\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountSkus\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountType\",\"ListItemText\":\"Get-AzCognitiveServicesAccountType\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountType\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountUsage\",\"ListItemText\":\"Get-AzCognitiveServicesAccountUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountUsage\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesCommitmentPlan\",\"ListItemText\":\"Get-AzCognitiveServicesCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesCommitmentPlanAssociation\",\"ListItemText\":\"Get-AzCognitiveServicesCommitmentPlanAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesCommitmentPlanAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesCommitmentTier\",\"ListItemText\":\"Get-AzCognitiveServicesCommitmentTier\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesCommitmentTier\\r\\n\"},{\"CompletionText\":\"Get-AzComputeResourceSku\",\"ListItemText\":\"Get-AzComputeResourceSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzComputeResourceSku\\r\\n\"},{\"CompletionText\":\"Get-AzConfidentialLedger\",\"ListItemText\":\"Get-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"Get-AzConfig\",\"ListItemText\":\"Get-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzConfig\\r\\n\"},{\"CompletionText\":\"Get-AzConfigurationAssignment\",\"ListItemText\":\"Get-AzConfigurationAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzConfigurationAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionBudget\",\"ListItemText\":\"Get-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionMarketplace\",\"ListItemText\":\"Get-AzConsumptionMarketplace\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionMarketplace\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionPriceSheet\",\"ListItemText\":\"Get-AzConsumptionPriceSheet\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionPriceSheet\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionReservationDetail\",\"ListItemText\":\"Get-AzConsumptionReservationDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionReservationDetail\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionReservationSummary\",\"ListItemText\":\"Get-AzConsumptionReservationSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionReservationSummary\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionUsageDetail\",\"ListItemText\":\"Get-AzConsumptionUsageDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionUsageDetail\\r\\n\"},{\"CompletionText\":\"Get-AzContainerGroup\",\"ListItemText\":\"Get-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Get-AzContainerGroupOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzContainerGroupOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerGroupOutboundNetworkDependencyEndpoint\"},{\"CompletionText\":\"Get-AzContainerInstanceCachedImage\",\"ListItemText\":\"Get-AzContainerInstanceCachedImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceCachedImage \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceCapability\",\"ListItemText\":\"Get-AzContainerInstanceCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceCapability \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceContainerGroupOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzContainerInstanceContainerGroupOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceContainerGroupOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceLog\",\"ListItemText\":\"Get-AzContainerInstanceLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceLog \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceUsage\",\"ListItemText\":\"Get-AzContainerInstanceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistry\",\"ListItemText\":\"Get-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryAgentPool\",\"ListItemText\":\"Get-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryAgentPoolQueueStatus\",\"ListItemText\":\"Get-AzContainerRegistryAgentPoolQueueStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryAgentPoolQueueStatus \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryCredential\",\"ListItemText\":\"Get-AzContainerRegistryCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryCredential \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryExportPipeline\",\"ListItemText\":\"Get-AzContainerRegistryExportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryExportPipeline \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryImportPipeline\",\"ListItemText\":\"Get-AzContainerRegistryImportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryImportPipeline \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryManifest\",\"ListItemText\":\"Get-AzContainerRegistryManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerRegistryManifest\\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryReplication\",\"ListItemText\":\"Get-AzContainerRegistryReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryReplication \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryRepository\",\"ListItemText\":\"Get-AzContainerRegistryRepository\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerRegistryRepository\\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryScopeMap\",\"ListItemText\":\"Get-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryTag\",\"ListItemText\":\"Get-AzContainerRegistryTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerRegistryTag\\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryToken\",\"ListItemText\":\"Get-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryUsage\",\"ListItemText\":\"Get-AzContainerRegistryUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryUsage \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryWebhook\",\"ListItemText\":\"Get-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryWebhookCallbackConfig\",\"ListItemText\":\"Get-AzContainerRegistryWebhookCallbackConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryWebhookCallbackConfig \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryWebhookEvent\",\"ListItemText\":\"Get-AzContainerRegistryWebhookEvent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryWebhookEvent \\r\\n\"},{\"CompletionText\":\"Get-AzContext\",\"ListItemText\":\"Get-AzContext\",\"ResultType\":2,\"ToolTip\":\"Get-AzContext\\r\\n\"},{\"CompletionText\":\"Get-AzContextAutosaveSetting\",\"ListItemText\":\"Get-AzContextAutosaveSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzContextAutosaveSetting\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBAccount\",\"ListItemText\":\"Get-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBAccountKey\",\"ListItemText\":\"Get-AzCosmosDBAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"Get-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraKeyspaceThroughput\",\"ListItemText\":\"Get-AzCosmosDBCassandraKeyspaceThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraKeyspaceThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraTable\",\"ListItemText\":\"Get-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraTableThroughput\",\"ListItemText\":\"Get-AzCosmosDBCassandraTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraTableThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDbClientEncryptionKey\",\"ListItemText\":\"Get-AzCosmosDbClientEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDbClientEncryptionKey\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"Get-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinDatabaseThroughput\",\"ListItemText\":\"Get-AzCosmosDBGremlinDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinGraph\",\"ListItemText\":\"Get-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinGraphBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBGremlinGraphBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinGraphBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinGraphThroughput\",\"ListItemText\":\"Get-AzCosmosDBGremlinGraphThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinGraphThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinRestorableDatabase\",\"ListItemText\":\"Get-AzCosmosDBGremlinRestorableDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinRestorableDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinRestorableGraph\",\"ListItemText\":\"Get-AzCosmosDBGremlinRestorableGraph\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinRestorableGraph\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBGremlinRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBLocation\",\"ListItemText\":\"Get-AzCosmosDBLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBLocation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"Get-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBCollectionBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBMongoDBCollectionBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBCollectionBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBCollectionThroughput\",\"ListItemText\":\"Get-AzCosmosDBMongoDBCollectionThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBCollectionThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"Get-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBDatabaseThroughput\",\"ListItemText\":\"Get-AzCosmosDBMongoDBDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRestorableCollection\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRestorableCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRestorableCollection\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRestorableDatabase\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRestorableDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRestorableDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"Get-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBRestorableDatabaseAccount\",\"ListItemText\":\"Get-AzCosmosDBRestorableDatabaseAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBRestorableDatabaseAccount\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBService\",\"ListItemText\":\"Get-AzCosmosDBService\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBService\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlContainer\",\"ListItemText\":\"Get-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlContainerBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBSqlContainerBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlContainerBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlContainerThroughput\",\"ListItemText\":\"Get-AzCosmosDBSqlContainerThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlContainerThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlDatabase\",\"ListItemText\":\"Get-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlDatabaseThroughput\",\"ListItemText\":\"Get-AzCosmosDBSqlDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRestorableContainer\",\"ListItemText\":\"Get-AzCosmosDBSqlRestorableContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRestorableContainer\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRestorableDatabase\",\"ListItemText\":\"Get-AzCosmosDBSqlRestorableDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRestorableDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBSqlRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"Get-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"Get-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"Get-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlTrigger\",\"ListItemText\":\"Get-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"Get-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTable\",\"ListItemText\":\"Get-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBTableBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBTableRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableRestorableTable\",\"ListItemText\":\"Get-AzCosmosDBTableRestorableTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableRestorableTable\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableThroughput\",\"ListItemText\":\"Get-AzCosmosDBTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCustomIpPrefix\",\"ListItemText\":\"Get-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Get-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"Get-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeDevice\",\"ListItemText\":\"Get-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeJob\",\"ListItemText\":\"Get-AzDataBoxEdgeJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeJob\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeOrder\",\"ListItemText\":\"Get-AzDataBoxEdgeOrder\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeOrder\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeRole\",\"ListItemText\":\"Get-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeShare\",\"ListItemText\":\"Get-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeStorageAccount\",\"ListItemText\":\"Get-AzDataBoxEdgeStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"Get-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"Get-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeTrigger\",\"ListItemText\":\"Get-AzDataBoxEdgeTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeUser\",\"ListItemText\":\"Get-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksAccessConnector\",\"ListItemText\":\"Get-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksOutboundNetworkDependenciesEndpoint\",\"ListItemText\":\"Get-AzDatabricksOutboundNetworkDependenciesEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksOutboundNetworkDependenciesEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksVNetPeering\",\"ListItemText\":\"Get-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksWorkspace\",\"ListItemText\":\"Get-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzDataCollectionRule\",\"ListItemText\":\"Get-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataCollectionRuleAssociation\",\"ListItemText\":\"Get-AzDataCollectionRuleAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataCollectionRuleAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactory\",\"ListItemText\":\"Get-AzDataFactory\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactory\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryActivityWindow\",\"ListItemText\":\"Get-AzDataFactoryActivityWindow\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryActivityWindow\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryDataset\",\"ListItemText\":\"Get-AzDataFactoryDataset\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryDataset\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryGateway\",\"ListItemText\":\"Get-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryGatewayAuthkey\",\"ListItemText\":\"Get-AzDataFactoryGatewayAuthkey\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryGatewayAuthkey\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryHub\",\"ListItemText\":\"Get-AzDataFactoryHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryHub\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryLinkedService\",\"ListItemText\":\"Get-AzDataFactoryLinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryLinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryPipeline\",\"ListItemText\":\"Get-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryRun\",\"ListItemText\":\"Get-AzDataFactoryRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactorySlice\",\"ListItemText\":\"Get-AzDataFactorySlice\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactorySlice\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2\",\"ListItemText\":\"Get-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2ActivityRun\",\"ListItemText\":\"Get-AzDataFactoryV2ActivityRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2ActivityRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2DataFlow\",\"ListItemText\":\"Get-AzDataFactoryV2DataFlow\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2DataFlow\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2DataFlowDebugSession\",\"ListItemText\":\"Get-AzDataFactoryV2DataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2DataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2Dataset\",\"ListItemText\":\"Get-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2Dataset\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeKey\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeMetric\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeMetric\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeNode\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeOutboundNetworkDependenciesEndpoint\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeOutboundNetworkDependenciesEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeOutboundNetworkDependenciesEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2LinkedService\",\"ListItemText\":\"Get-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2LinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Get-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2PipelineRun\",\"ListItemText\":\"Get-AzDataFactoryV2PipelineRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2PipelineRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2Trigger\",\"ListItemText\":\"Get-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2TriggerRun\",\"ListItemText\":\"Get-AzDataFactoryV2TriggerRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2TriggerRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2TriggerSubscriptionStatus\",\"ListItemText\":\"Get-AzDataFactoryV2TriggerSubscriptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2TriggerSubscriptionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Get-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsCatalogItem\",\"ListItemText\":\"Get-AzDataLakeAnalyticsCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsCatalogItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ListItemText\":\"Get-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsCatalogItemAclEntry\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"Get-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Get-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Get-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Get-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsJobPipeline\",\"ListItemText\":\"Get-AzDataLakeAnalyticsJobPipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsJobPipeline\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsJobRecurrence\",\"ListItemText\":\"Get-AzDataLakeAnalyticsJobRecurrence\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsJobRecurrence\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeGen2ChildItem\",\"ListItemText\":\"Get-AzDataLakeGen2ChildItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2ChildItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeGen2DeletedItem\",\"ListItemText\":\"Get-AzDataLakeGen2DeletedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2DeletedItem\\r\\n\"},{\"CompletionText\":\"Get-AzDatalakeGen2FileSystem\",\"ListItemText\":\"Get-AzDatalakeGen2FileSystem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDatalakeGen2FileSystem\"},{\"CompletionText\":\"Get-AzDataLakeGen2Item\",\"ListItemText\":\"Get-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeGen2ItemContent\",\"ListItemText\":\"Get-AzDataLakeGen2ItemContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2ItemContent\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreAccount\",\"ListItemText\":\"Get-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreChildItem\",\"ListItemText\":\"Get-AzDataLakeStoreChildItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreChildItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreChildItemSummary\",\"ListItemText\":\"Get-AzDataLakeStoreChildItemSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreChildItemSummary\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreDeletedItem\",\"ListItemText\":\"Get-AzDataLakeStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreDeletedItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Get-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItem\",\"ListItemText\":\"Get-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemAclEntry\",\"ListItemText\":\"Get-AzDataLakeStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemAclEntry\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemContent\",\"ListItemText\":\"Get-AzDataLakeStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemContent\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemOwner\",\"ListItemText\":\"Get-AzDataLakeStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemOwner\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemPermission\",\"ListItemText\":\"Get-AzDataLakeStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemPermission\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Get-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Get-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionBackupInstance\",\"ListItemText\":\"Get-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionBackupPolicy\",\"ListItemText\":\"Get-AzDataProtectionBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionBackupPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionBackupVault\",\"ListItemText\":\"Get-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionJob\",\"ListItemText\":\"Get-AzDataProtectionJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionJob \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionOperation\",\"ListItemText\":\"Get-AzDataProtectionOperation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionOperation \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionOperationStatus\",\"ListItemText\":\"Get-AzDataProtectionOperationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionOperationStatus \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionPolicyTemplate\",\"ListItemText\":\"Get-AzDataProtectionPolicyTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionPolicyTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionRecoveryPoint\",\"ListItemText\":\"Get-AzDataProtectionRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionRecoveryPoint \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionResourceGuard\",\"ListItemText\":\"Get-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"Get-AzDataShare\",\"ListItemText\":\"Get-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShare\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareAccount\",\"ListItemText\":\"Get-AzDataShareAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareDataSet\",\"ListItemText\":\"Get-AzDataShareDataSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareDataSet\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareDataSetMapping\",\"ListItemText\":\"Get-AzDataShareDataSetMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareDataSetMapping\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareInvitation\",\"ListItemText\":\"Get-AzDataShareInvitation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareInvitation\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareProviderShareSubscription\",\"ListItemText\":\"Get-AzDataShareProviderShareSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareProviderShareSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareReceivedInvitation\",\"ListItemText\":\"Get-AzDataShareReceivedInvitation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareReceivedInvitation\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSourceDataSet\",\"ListItemText\":\"Get-AzDataShareSourceDataSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSourceDataSet\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSubscription\",\"ListItemText\":\"Get-AzDataShareSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSubscriptionSynchronization\",\"ListItemText\":\"Get-AzDataShareSubscriptionSynchronization\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSubscriptionSynchronization\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSubscriptionSynchronizationDetail\",\"ListItemText\":\"Get-AzDataShareSubscriptionSynchronizationDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSubscriptionSynchronizationDetail\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSynchronization\",\"ListItemText\":\"Get-AzDataShareSynchronization\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSynchronization\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSynchronizationDetail\",\"ListItemText\":\"Get-AzDataShareSynchronizationDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSynchronizationDetail\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSynchronizationSetting\",\"ListItemText\":\"Get-AzDataShareSynchronizationSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSynchronizationSetting\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareTrigger\",\"ListItemText\":\"Get-AzDataShareTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzDdosProtectionPlan\",\"ListItemText\":\"Get-AzDdosProtectionPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzDdosProtectionPlan\\r\\n\"},{\"CompletionText\":\"Get-AzDefault\",\"ListItemText\":\"Get-AzDefault\",\"ResultType\":2,\"ToolTip\":\"Get-AzDefault\\r\\n\"},{\"CompletionText\":\"Get-AzDelegation\",\"ListItemText\":\"Get-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDelegation\\r\\n\"},{\"CompletionText\":\"Get-AzDeletedWebApp\",\"ListItemText\":\"Get-AzDeletedWebApp\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeletedWebApp\\r\\n\"},{\"CompletionText\":\"Get-AzDenyAssignment\",\"ListItemText\":\"Get-AzDenyAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzDenyAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzDeployment\",\"ListItemText\":\"Get-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"Get-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerRollout\",\"ListItemText\":\"Get-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerService\",\"ListItemText\":\"Get-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"Get-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"Get-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerStep\",\"ListItemText\":\"Get-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentOperation\",\"ListItemText\":\"Get-AzDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentScript\",\"ListItemText\":\"Get-AzDeploymentScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentScript\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentScriptLog\",\"ListItemText\":\"Get-AzDeploymentScriptLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentScriptLog\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzDeviceSecurityGroup\",\"ListItemText\":\"Get-AzDeviceSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeviceSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzDiagnosticSetting\",\"ListItemText\":\"Get-AzDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Get-AzDiagnosticSettingCategory\",\"ListItemText\":\"Get-AzDiagnosticSettingCategory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDiagnosticSettingCategory \\r\\n\"},{\"CompletionText\":\"Get-AzDiscoveredSecuritySolution\",\"ListItemText\":\"Get-AzDiscoveredSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiscoveredSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzDisk\",\"ListItemText\":\"Get-AzDisk\",\"ResultType\":2,\"ToolTip\":\"Get-AzDisk\\r\\n\"},{\"CompletionText\":\"Get-AzDiskAccess\",\"ListItemText\":\"Get-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Get-AzDiskEncryptionSet\",\"ListItemText\":\"Get-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"Get-AzDiskEncryptionSetAssociatedResource\",\"ListItemText\":\"Get-AzDiskEncryptionSetAssociatedResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiskEncryptionSetAssociatedResource\\r\\n\"},{\"CompletionText\":\"Get-AzDnsRecordSet\",\"ListItemText\":\"Get-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Get-AzDnsZone\",\"ListItemText\":\"Get-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"Get-AzDnsZone\\r\\n\"},{\"CompletionText\":\"Get-AzDomain\",\"ListItemText\":\"Get-AzDomain\",\"ResultType\":2,\"ToolTip\":\"Get-AzDomain\"},{\"CompletionText\":\"Get-AzDtlAllowedVMSizesPolicy\",\"ListItemText\":\"Get-AzDtlAllowedVMSizesPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlAllowedVMSizesPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlAutoShutdownPolicy\",\"ListItemText\":\"Get-AzDtlAutoShutdownPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlAutoShutdownPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlAutoStartPolicy\",\"ListItemText\":\"Get-AzDtlAutoStartPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlAutoStartPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlVMsPerLabPolicy\",\"ListItemText\":\"Get-AzDtlVMsPerLabPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlVMsPerLabPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlVMsPerUserPolicy\",\"ListItemText\":\"Get-AzDtlVMsPerUserPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlVMsPerUserPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzEffectiveNetworkSecurityGroup\",\"ListItemText\":\"Get-AzEffectiveNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzEffectiveNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzEffectiveRouteTable\",\"ListItemText\":\"Get-AzEffectiveRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzEffectiveRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzEnrollmentAccount\",\"ListItemText\":\"Get-AzEnrollmentAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzEnrollmentAccount\\r\\n\"},{\"CompletionText\":\"Get-AzEnvironment\",\"ListItemText\":\"Get-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Get-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Get-AzEventCategory\",\"ListItemText\":\"Get-AzEventCategory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventCategory \\r\\n\"},{\"CompletionText\":\"Get-AzEventGridChannel\",\"ListItemText\":\"Get-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridDomain\",\"ListItemText\":\"Get-AzEventGridDomain\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridDomain\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridDomainKey\",\"ListItemText\":\"Get-AzEventGridDomainKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridDomainKey\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridDomainTopic\",\"ListItemText\":\"Get-AzEventGridDomainTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridDomainTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridFullUrlForPartnerTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridFullUrlForPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridFullUrlForPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridFullUrlForSystemTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridFullUrlForSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridFullUrlForSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Get-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerNamespace\",\"ListItemText\":\"Get-AzEventGridPartnerNamespace\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerNamespace\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerNamespaceKey\",\"ListItemText\":\"Get-AzEventGridPartnerNamespaceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerNamespaceKey\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerRegistration\",\"ListItemText\":\"Get-AzEventGridPartnerRegistration\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerRegistration\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerTopic\",\"ListItemText\":\"Get-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerTopicEventSubscriptionDeliveryAttribute\",\"ListItemText\":\"Get-AzEventGridPartnerTopicEventSubscriptionDeliveryAttribute\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerTopicEventSubscriptionDeliveryAttribute\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSubscription\",\"ListItemText\":\"Get-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSystemTopic\",\"ListItemText\":\"Get-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSystemTopicEventSubscriptionDeliveryAttribute\",\"ListItemText\":\"Get-AzEventGridSystemTopicEventSubscriptionDeliveryAttribute\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSystemTopicEventSubscriptionDeliveryAttribute\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridTopic\",\"ListItemText\":\"Get-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridTopicKey\",\"ListItemText\":\"Get-AzEventGridTopicKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridTopicKey\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridTopicType\",\"ListItemText\":\"Get-AzEventGridTopicType\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridTopicType\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridVerifiedPartner\",\"ListItemText\":\"Get-AzEventGridVerifiedPartner\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridVerifiedPartner\\r\\n\"},{\"CompletionText\":\"Get-AzEventHub\",\"ListItemText\":\"Get-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHub \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubApplicationGroup\",\"ListItemText\":\"Get-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubAuthorizationRule\",\"ListItemText\":\"Get-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubCluster\",\"ListItemText\":\"Get-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubClusterNamespace\",\"ListItemText\":\"Get-AzEventHubClusterNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubClusterNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubClustersAvailableRegion\",\"ListItemText\":\"Get-AzEventHubClustersAvailableRegion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubClustersAvailableRegion \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubConsumerGroup\",\"ListItemText\":\"Get-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubGeoDRConfiguration\",\"ListItemText\":\"Get-AzEventHubGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubKey\",\"ListItemText\":\"Get-AzEventHubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubKey \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubNamespace\",\"ListItemText\":\"Get-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubNamespaceV2\",\"ListItemText\":\"Get-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventHubNamespaceV2\"},{\"CompletionText\":\"Get-AzEventHubNetworkRuleSet\",\"ListItemText\":\"Get-AzEventHubNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Get-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubPrivateLink\",\"ListItemText\":\"Get-AzEventHubPrivateLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubPrivateLink \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubSchemaGroup\",\"ListItemText\":\"Get-AzEventHubSchemaGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubSchemaGroup \\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuit\",\"ListItemText\":\"Get-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitARPTable\",\"ListItemText\":\"Get-AzExpressRouteCircuitARPTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitARPTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"Get-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Get-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Get-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitRouteTable\",\"ListItemText\":\"Get-AzExpressRouteCircuitRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitRouteTableSummary\",\"ListItemText\":\"Get-AzExpressRouteCircuitRouteTableSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitRouteTableSummary\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitStat\",\"ListItemText\":\"Get-AzExpressRouteCircuitStat\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitStat\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitStats\",\"ListItemText\":\"Get-AzExpressRouteCircuitStats\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitStats\"},{\"CompletionText\":\"Get-AzExpressRouteConnection\",\"ListItemText\":\"Get-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnection\",\"ListItemText\":\"Get-AzExpressRouteCrossConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnection\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionArpTable\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionArpTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionArpTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionPeering\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionPeering\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionPeering\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionRouteTable\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionRouteTableSummary\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionRouteTableSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionRouteTableSummary\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteGateway\",\"ListItemText\":\"Get-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePort\",\"ListItemText\":\"Get-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortAuthorization\",\"ListItemText\":\"Get-AzExpressRoutePortAuthorization\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortAuthorization\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortIdentity\",\"ListItemText\":\"Get-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortLinkConfig\",\"ListItemText\":\"Get-AzExpressRoutePortLinkConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortLinkConfig\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortsLocation\",\"ListItemText\":\"Get-AzExpressRoutePortsLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortsLocation\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteServiceProvider\",\"ListItemText\":\"Get-AzExpressRouteServiceProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteServiceProvider\\r\\n\"},{\"CompletionText\":\"Get-AzExternalSecuritySolution\",\"ListItemText\":\"Get-AzExternalSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzExternalSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzFederatedIdentityCredentials\",\"ListItemText\":\"Get-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"Get-AzFirewall\",\"ListItemText\":\"Get-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewall\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallFqdnTag\",\"ListItemText\":\"Get-AzFirewallFqdnTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallFqdnTag\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallLearnedIpPrefix\",\"ListItemText\":\"Get-AzFirewallLearnedIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallLearnedIpPrefix\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallPolicy\",\"ListItemText\":\"Get-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"Get-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoor\",\"ListItemText\":\"Get-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"Get-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"Get-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnEndpointResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnEndpointResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnEndpointResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnOrigin\",\"ListItemText\":\"Get-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"Get-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnOriginGroupResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnOriginGroupResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnOriginGroupResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnProfile\",\"ListItemText\":\"Get-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnProfileResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnProfileResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnProfileResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRoute\",\"ListItemText\":\"Get-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRule\",\"ListItemText\":\"Get-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRuleSet\",\"ListItemText\":\"Get-AzFrontDoorCdnRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRuleSetResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnRuleSetResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRuleSetResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnSecret\",\"ListItemText\":\"Get-AzFrontDoorCdnSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnSecret \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"Get-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorFrontendEndpoint\",\"ListItemText\":\"Get-AzFrontDoorFrontendEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorFrontendEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorRulesEngine\",\"ListItemText\":\"Get-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorWafManagedRuleSetDefinition\",\"ListItemText\":\"Get-AzFrontDoorWafManagedRuleSetDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorWafManagedRuleSetDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorWafPolicy\",\"ListItemText\":\"Get-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzFunctionApp\",\"ListItemText\":\"Get-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Get-AzFunctionAppAvailableLocation\",\"ListItemText\":\"Get-AzFunctionAppAvailableLocation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionAppAvailableLocation \\r\\n\"},{\"CompletionText\":\"Get-AzFunctionAppPlan\",\"ListItemText\":\"Get-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"Get-AzFunctionAppSetting\",\"ListItemText\":\"Get-AzFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzGallery\",\"ListItemText\":\"Get-AzGallery\",\"ResultType\":2,\"ToolTip\":\"Get-AzGallery\\r\\n\"},{\"CompletionText\":\"Get-AzGalleryApplication\",\"ListItemText\":\"Get-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"Get-AzGalleryApplicationVersion\",\"ListItemText\":\"Get-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"Get-AzGalleryImageDefinition\",\"ListItemText\":\"Get-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzGalleryImageVersion\",\"ListItemText\":\"Get-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"Get-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightAzureMonitor\",\"ListItemText\":\"Get-AzHDInsightAzureMonitor\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightAzureMonitor\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightCluster\",\"ListItemText\":\"Get-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"Get-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightHost\",\"ListItemText\":\"Get-AzHDInsightHost\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightHost\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightJob\",\"ListItemText\":\"Get-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightJobOutput\",\"ListItemText\":\"Get-AzHDInsightJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightMonitoring\",\"ListItemText\":\"Get-AzHDInsightMonitoring\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightMonitoring\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightPersistedScriptAction\",\"ListItemText\":\"Get-AzHDInsightPersistedScriptAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightPersistedScriptAction\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightProperty\",\"ListItemText\":\"Get-AzHDInsightProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightProperty\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightScriptActionHistory\",\"ListItemText\":\"Get-AzHDInsightScriptActionHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightScriptActionHistory\\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareApisService\",\"ListItemText\":\"Get-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareApisWorkspace\",\"ListItemText\":\"Get-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareDicomService\",\"ListItemText\":\"Get-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareFhirDestination\",\"ListItemText\":\"Get-AzHealthcareFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareFhirDestination \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareFhirService\",\"ListItemText\":\"Get-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareIotConnector\",\"ListItemText\":\"Get-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareIotConnectorFhirDestination\",\"ListItemText\":\"Get-AzHealthcareIotConnectorFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareIotConnectorFhirDestination \\r\\n\"},{\"CompletionText\":\"Get-AzHost\",\"ListItemText\":\"Get-AzHost\",\"ResultType\":2,\"ToolTip\":\"Get-AzHost\\r\\n\"},{\"CompletionText\":\"Get-AzHostGroup\",\"ListItemText\":\"Get-AzHostGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzHostGroup\\r\\n\"},{\"CompletionText\":\"Get-AzImage\",\"ListItemText\":\"Get-AzImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzImage\\r\\n\"},{\"CompletionText\":\"Get-AzInsightsPrivateLinkScope\",\"ListItemText\":\"Get-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"Get-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"Get-AzInsightsPrivateLinkScopedResource\",\"ListItemText\":\"Get-AzInsightsPrivateLinkScopedResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzInsightsPrivateLinkScopedResource\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccount\",\"ListItemText\":\"Get-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountAgreement\",\"ListItemText\":\"Get-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountAssembly\",\"ListItemText\":\"Get-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"Get-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountCallbackUrl\",\"ListItemText\":\"Get-AzIntegrationAccountCallbackUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountCallbackUrl\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountCertificate\",\"ListItemText\":\"Get-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountGeneratedIcn\",\"ListItemText\":\"Get-AzIntegrationAccountGeneratedIcn\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountGeneratedIcn\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountMap\",\"ListItemText\":\"Get-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountPartner\",\"ListItemText\":\"Get-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountReceivedIcn\",\"ListItemText\":\"Get-AzIntegrationAccountReceivedIcn\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountReceivedIcn\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountSchema\",\"ListItemText\":\"Get-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"Get-AzInterfaceEndpoint\",\"ListItemText\":\"Get-AzInterfaceEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzInterfaceEndpoint\"},{\"CompletionText\":\"Get-AzInvoiceSection\",\"ListItemText\":\"Get-AzInvoiceSection\",\"ResultType\":2,\"ToolTip\":\"Get-AzInvoiceSection\\r\\n\"},{\"CompletionText\":\"Get-AzIotHub\",\"ListItemText\":\"Get-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHub\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubCertificate\",\"ListItemText\":\"Get-AzIotHubCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubCertificateVerificationCode\",\"ListItemText\":\"Get-AzIotHubCertificateVerificationCode\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubCertificateVerificationCode\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubConfiguration\",\"ListItemText\":\"Get-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubConnectionString\",\"ListItemText\":\"Get-AzIotHubConnectionString\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubConnectionString\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubCVC\",\"ListItemText\":\"Get-AzIotHubCVC\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubCVC\"},{\"CompletionText\":\"Get-AzIotHubDCL\",\"ListItemText\":\"Get-AzIotHubDCL\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDCL\"},{\"CompletionText\":\"Get-AzIotHubDCS\",\"ListItemText\":\"Get-AzIotHubDCS\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDCS\"},{\"CompletionText\":\"Get-AzIotHubDeployment\",\"ListItemText\":\"Get-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDevice\",\"ListItemText\":\"Get-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceChildren\",\"ListItemText\":\"Get-AzIotHubDeviceChildren\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceChildren\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceConnectionString\",\"ListItemText\":\"Get-AzIotHubDeviceConnectionString\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceConnectionString\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceParent\",\"ListItemText\":\"Get-AzIotHubDeviceParent\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceParent\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceTwin\",\"ListItemText\":\"Get-AzIotHubDeviceTwin\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceTwin\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDistributedTracing\",\"ListItemText\":\"Get-AzIotHubDistributedTracing\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDistributedTracing\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubEHCG\",\"ListItemText\":\"Get-AzIotHubEHCG\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubEHCG\"},{\"CompletionText\":\"Get-AzIotHubEventHubConsumerGroup\",\"ListItemText\":\"Get-AzIotHubEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubEventHubConsumerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubJob\",\"ListItemText\":\"Get-AzIotHubJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubJob\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubKey\",\"ListItemText\":\"Get-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubMCS\",\"ListItemText\":\"Get-AzIotHubMCS\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubMCS\"},{\"CompletionText\":\"Get-AzIotHubMessageEnrichment\",\"ListItemText\":\"Get-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubModule\",\"ListItemText\":\"Get-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubModuleConnectionString\",\"ListItemText\":\"Get-AzIotHubModuleConnectionString\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubModuleConnectionString\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubModuleTwin\",\"ListItemText\":\"Get-AzIotHubModuleTwin\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubModuleTwin\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubMsgEnrich\",\"ListItemText\":\"Get-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Get-AzIotHubQuotaMetric\",\"ListItemText\":\"Get-AzIotHubQuotaMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubQuotaMetric\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubRegistryStatistic\",\"ListItemText\":\"Get-AzIotHubRegistryStatistic\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubRegistryStatistic\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubRoute\",\"ListItemText\":\"Get-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubRoutingEndpoint\",\"ListItemText\":\"Get-AzIotHubRoutingEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubRoutingEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubTracing\",\"ListItemText\":\"Get-AzIotHubTracing\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubTracing\"},{\"CompletionText\":\"Get-AzIotHubValidSku\",\"ListItemText\":\"Get-AzIotHubValidSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubValidSku\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecurityAnalytics\",\"ListItemText\":\"Get-AzIotSecurityAnalytics\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecurityAnalytics\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecurityAnalyticsAggregatedAlert\",\"ListItemText\":\"Get-AzIotSecurityAnalyticsAggregatedAlert\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecurityAnalyticsAggregatedAlert\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecurityAnalyticsAggregatedRecommendation\",\"ListItemText\":\"Get-AzIotSecurityAnalyticsAggregatedRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecurityAnalyticsAggregatedRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecuritySolution\",\"ListItemText\":\"Get-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzIpAllocation\",\"ListItemText\":\"Get-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"Get-AzIpGroup\",\"ListItemText\":\"Get-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzIpGroup\\r\\n\"},{\"CompletionText\":\"Get-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Get-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVault\",\"ListItemText\":\"Get-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificate\",\"ListItemText\":\"Get-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificateContact\",\"ListItemText\":\"Get-AzKeyVaultCertificateContact\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificateContact\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificateIssuer\",\"ListItemText\":\"Get-AzKeyVaultCertificateIssuer\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificateIssuer\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificateOperation\",\"ListItemText\":\"Get-AzKeyVaultCertificateOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificateOperation\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificatePolicy\",\"ListItemText\":\"Get-AzKeyVaultCertificatePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificatePolicy\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultKey\",\"ListItemText\":\"Get-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultKeyRotationPolicy\",\"ListItemText\":\"Get-AzKeyVaultKeyRotationPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultKeyRotationPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultManagedHsm\",\"ListItemText\":\"Get-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Get-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultManagedStorageSasDefinition\",\"ListItemText\":\"Get-AzKeyVaultManagedStorageSasDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultManagedStorageSasDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultRandomNumber\",\"ListItemText\":\"Get-AzKeyVaultRandomNumber\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultRandomNumber\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultRoleAssignment\",\"ListItemText\":\"Get-AzKeyVaultRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultRoleDefinition\",\"ListItemText\":\"Get-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultSecret\",\"ListItemText\":\"Get-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Get-AzKustoAttachedDatabaseConfiguration\",\"ListItemText\":\"Get-AzKustoAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzKustoCluster\",\"ListItemText\":\"Get-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterFollowerDatabase\",\"ListItemText\":\"Get-AzKustoClusterFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterLanguageExtension\",\"ListItemText\":\"Get-AzKustoClusterLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterLanguageExtension \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzKustoClusterOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterPrincipalAssignment\",\"ListItemText\":\"Get-AzKustoClusterPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterSku\",\"ListItemText\":\"Get-AzKustoClusterSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterSku \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDatabase\",\"ListItemText\":\"Get-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDatabasePrincipal\",\"ListItemText\":\"Get-AzKustoDatabasePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDatabasePrincipal \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDatabasePrincipalAssignment\",\"ListItemText\":\"Get-AzKustoDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDataConnection\",\"ListItemText\":\"Get-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"Get-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"Get-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzKustoOperationsResult\",\"ListItemText\":\"Get-AzKustoOperationsResult\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoOperationsResult \\r\\n\"},{\"CompletionText\":\"Get-AzKustoOperationsResultLocation\",\"ListItemText\":\"Get-AzKustoOperationsResultLocation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoOperationsResultLocation \\r\\n\"},{\"CompletionText\":\"Get-AzKustoPrivateEndpointConnection\",\"ListItemText\":\"Get-AzKustoPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Get-AzKustoPrivateLinkResource\",\"ListItemText\":\"Get-AzKustoPrivateLinkResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoPrivateLinkResource \\r\\n\"},{\"CompletionText\":\"Get-AzKustoScript\",\"ListItemText\":\"Get-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoScript \\r\\n\"},{\"CompletionText\":\"Get-AzKustoSku\",\"ListItemText\":\"Get-AzKustoSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoSku \\r\\n\"},{\"CompletionText\":\"Get-AzLoad\",\"ListItemText\":\"Get-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzLoad \\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancer\",\"ListItemText\":\"Get-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerBackendAddressInboundNatRulePortMapping\",\"ListItemText\":\"Get-AzLoadBalancerBackendAddressInboundNatRulePortMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerBackendAddressInboundNatRulePortMapping\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"Get-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"Get-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Get-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Get-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Get-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Get-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Get-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Get-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLocalNetworkGateway\",\"ListItemText\":\"Get-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"Get-AzLocation\",\"ListItemText\":\"Get-AzLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzLocation\\r\\n\"},{\"CompletionText\":\"Get-AzLog\",\"ListItemText\":\"Get-AzLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzLog\"},{\"CompletionText\":\"Get-AzLogicApp\",\"ListItemText\":\"Get-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppRunAction\",\"ListItemText\":\"Get-AzLogicAppRunAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppRunAction\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppRunHistory\",\"ListItemText\":\"Get-AzLogicAppRunHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppRunHistory\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppTrigger\",\"ListItemText\":\"Get-AzLogicAppTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppTriggerCallbackUrl\",\"ListItemText\":\"Get-AzLogicAppTriggerCallbackUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppTriggerCallbackUrl\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppTriggerHistory\",\"ListItemText\":\"Get-AzLogicAppTriggerHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppTriggerHistory\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppUpgradedDefinition\",\"ListItemText\":\"Get-AzLogicAppUpgradedDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppUpgradedDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzLogProfile\",\"ListItemText\":\"Get-AzLogProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogProfile\\r\\n\"},{\"CompletionText\":\"Get-AzMaintenanceConfiguration\",\"ListItemText\":\"Get-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzMaintenancePublicConfiguration\",\"ListItemText\":\"Get-AzMaintenancePublicConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzMaintenancePublicConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzMaintenanceUpdate\",\"ListItemText\":\"Get-AzMaintenanceUpdate\",\"ResultType\":2,\"ToolTip\":\"Get-AzMaintenanceUpdate\\r\\n\"},{\"CompletionText\":\"Get-AzManagedApplication\",\"ListItemText\":\"Get-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"Get-AzManagedApplicationDefinition\",\"ListItemText\":\"Get-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzManagedCassandraCluster\",\"ListItemText\":\"Get-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"Get-AzManagedCassandraDataCenter\",\"ListItemText\":\"Get-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"Get-AzManagedServicesAssignment\",\"ListItemText\":\"Get-AzManagedServicesAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzManagedServicesAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzManagedServicesDefinition\",\"ListItemText\":\"Get-AzManagedServicesDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzManagedServicesDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzManagedServicesMarketplaceDefinition\",\"ListItemText\":\"Get-AzManagedServicesMarketplaceDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzManagedServicesMarketplaceDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroup\",\"ListItemText\":\"Get-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupDeployment\",\"ListItemText\":\"Get-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupDeploymentOperation\",\"ListItemText\":\"Get-AzManagementGroupDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzManagementGroupDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupEntity\",\"ListItemText\":\"Get-AzManagementGroupEntity\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupEntity\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupHierarchySetting\",\"ListItemText\":\"Get-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupNameAvailability\",\"ListItemText\":\"Get-AzManagementGroupNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupNameAvailability\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupSubscription\",\"ListItemText\":\"Get-AzManagementGroupSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzMarketplaceTerms\",\"ListItemText\":\"Get-AzMarketplaceTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMarketplaceTerms \\r\\n\"},{\"CompletionText\":\"Get-AzMediaService\",\"ListItemText\":\"Get-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaService\\r\\n\"},{\"CompletionText\":\"Get-AzMediaServiceKey\",\"ListItemText\":\"Get-AzMediaServiceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaServiceKey\\r\\n\"},{\"CompletionText\":\"Get-AzMediaServiceKeys\",\"ListItemText\":\"Get-AzMediaServiceKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaServiceKeys\"},{\"CompletionText\":\"Get-AzMediaServiceNameAvailability\",\"ListItemText\":\"Get-AzMediaServiceNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaServiceNameAvailability\\r\\n\"},{\"CompletionText\":\"Get-AzMetric\",\"ListItemText\":\"Get-AzMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzMetric\\r\\n\"},{\"CompletionText\":\"Get-AzMetricAlertRuleV2\",\"ListItemText\":\"Get-AzMetricAlertRuleV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzMetricAlertRuleV2\\r\\n\"},{\"CompletionText\":\"Get-AzMetricDefinition\",\"ListItemText\":\"Get-AzMetricDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzMetricDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzMigrateDiscoveredServer\",\"ListItemText\":\"Get-AzMigrateDiscoveredServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateDiscoveredServer \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateJob\",\"ListItemText\":\"Get-AzMigrateJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateJob \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateProject\",\"ListItemText\":\"Get-AzMigrateProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateProject \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationFabric\",\"ListItemText\":\"Get-AzMigrateReplicationFabric\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationFabric \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationPolicy\",\"ListItemText\":\"Get-AzMigrateReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationProtectionContainer\",\"ListItemText\":\"Get-AzMigrateReplicationProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationProtectionContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationProtectionContainerMapping\",\"ListItemText\":\"Get-AzMigrateReplicationProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationProtectionContainerMapping \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationRecoveryServicesProvider\",\"ListItemText\":\"Get-AzMigrateReplicationRecoveryServicesProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationRecoveryServicesProvider \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateRunAsAccount\",\"ListItemText\":\"Get-AzMigrateRunAsAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateRunAsAccount \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateServerReplication\",\"ListItemText\":\"Get-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateSite\",\"ListItemText\":\"Get-AzMigrateSite\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateSite \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateSolution\",\"ListItemText\":\"Get-AzMigrateSolution\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateSolution \\r\\n\"},{\"CompletionText\":\"Get-AzMlCommitmentAssociation\",\"ListItemText\":\"Get-AzMlCommitmentAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlCommitmentAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzMlCommitmentPlan\",\"ListItemText\":\"Get-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Get-AzMlCommitmentPlanUsageHistory\",\"ListItemText\":\"Get-AzMlCommitmentPlanUsageHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlCommitmentPlanUsageHistory\\r\\n\"},{\"CompletionText\":\"Get-AzMLServiceQuota\",\"ListItemText\":\"Get-AzMLServiceQuota\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLServiceQuota \\r\\n\"},{\"CompletionText\":\"Get-AzMLServiceUsage\",\"ListItemText\":\"Get-AzMLServiceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLServiceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzMLServiceVMSize\",\"ListItemText\":\"Get-AzMLServiceVMSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLServiceVMSize \\r\\n\"},{\"CompletionText\":\"Get-AzMlWebService\",\"ListItemText\":\"Get-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Get-AzMlWebServiceKey\",\"ListItemText\":\"Get-AzMlWebServiceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlWebServiceKey\\r\\n\"},{\"CompletionText\":\"Get-AzMlWebServiceKeys\",\"ListItemText\":\"Get-AzMlWebServiceKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlWebServiceKeys\"},{\"CompletionText\":\"Get-AzMLWorkspace\",\"ListItemText\":\"Get-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"Get-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"Get-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceCodeVersion\",\"ListItemText\":\"Get-AzMLWorkspaceCodeVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceCodeVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComponentContainer\",\"ListItemText\":\"Get-AzMLWorkspaceComponentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComponentContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComponentVersion\",\"ListItemText\":\"Get-AzMLWorkspaceComponentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComponentVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceCompute\",\"ListItemText\":\"Get-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComputeKey\",\"ListItemText\":\"Get-AzMLWorkspaceComputeKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComputeKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComputeNode\",\"ListItemText\":\"Get-AzMLWorkspaceComputeNode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComputeNode \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceConnection\",\"ListItemText\":\"Get-AzMLWorkspaceConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceConnection \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDataContainer\",\"ListItemText\":\"Get-AzMLWorkspaceDataContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDataContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDatastore\",\"ListItemText\":\"Get-AzMLWorkspaceDatastore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDatastore \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDatastoreSecret\",\"ListItemText\":\"Get-AzMLWorkspaceDatastoreSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDatastoreSecret \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDataVersion\",\"ListItemText\":\"Get-AzMLWorkspaceDataVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDataVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceEnvironmentContainer\",\"ListItemText\":\"Get-AzMLWorkspaceEnvironmentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceEnvironmentContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceEnvironmentVersion\",\"ListItemText\":\"Get-AzMLWorkspaceEnvironmentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceEnvironmentVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceFeature\",\"ListItemText\":\"Get-AzMLWorkspaceFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceFeature \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceJob\",\"ListItemText\":\"Get-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceKey\",\"ListItemText\":\"Get-AzMLWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceModelContainer\",\"ListItemText\":\"Get-AzMLWorkspaceModelContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceModelContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceModelVersion\",\"ListItemText\":\"Get-AzMLWorkspaceModelVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceModelVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceNotebookAccessToken\",\"ListItemText\":\"Get-AzMLWorkspaceNotebookAccessToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceNotebookAccessToken \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceNotebookKey\",\"ListItemText\":\"Get-AzMLWorkspaceNotebookKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceNotebookKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineDeploymentLog\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineDeploymentLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineDeploymentLog \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineDeploymentSku\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineDeploymentSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineDeploymentSku \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineEndpointKey\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineEndpointKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineEndpointKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineEndpointToken\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineEndpointToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineEndpointToken \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzMLWorkspaceOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceStorageAccountKey\",\"ListItemText\":\"Get-AzMLWorkspaceStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceStorageAccountKey \\r\\n\"},{\"CompletionText\":\"Get-AzMonitorWorkspace\",\"ListItemText\":\"Get-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlConfiguration\",\"ListItemText\":\"Get-AzMySqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlConnectionString\",\"ListItemText\":\"Get-AzMySqlConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFirewallRule\",\"ListItemText\":\"Get-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServer\",\"ListItemText\":\"Get-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerConfiguration\",\"ListItemText\":\"Get-AzMySqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerConnectionString\",\"ListItemText\":\"Get-AzMySqlFlexibleServerConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerDatabase\",\"ListItemText\":\"Get-AzMySqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"Get-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerLocationBasedCapability\",\"ListItemText\":\"Get-AzMySqlFlexibleServerLocationBasedCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerLocationBasedCapability \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerReplica\",\"ListItemText\":\"Get-AzMySqlFlexibleServerReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerReplica \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlReplica\",\"ListItemText\":\"Get-AzMySqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlReplica \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlServer\",\"ListItemText\":\"Get-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"Get-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Get-AzNatGateway\",\"ListItemText\":\"Get-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzNatGateway\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkInterface\",\"ListItemText\":\"Get-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Get-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Get-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManager\",\"ListItemText\":\"Get-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerActiveConnectivityConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerActiveConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerActiveConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerActiveSecurityAdminRule\",\"ListItemText\":\"Get-AzNetworkManagerActiveSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerActiveSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerDeploymentStatus\",\"ListItemText\":\"Get-AzNetworkManagerDeploymentStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerDeploymentStatus\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerEffectiveConnectivityConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerEffectiveConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerEffectiveConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerEffectiveSecurityAdminRule\",\"ListItemText\":\"Get-AzNetworkManagerEffectiveSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerEffectiveSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerGroup\",\"ListItemText\":\"Get-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"Get-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerScopeConnection\",\"ListItemText\":\"Get-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"Get-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"Get-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerStaticMember\",\"ListItemText\":\"Get-AzNetworkManagerStaticMember\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerStaticMember\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"Get-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkProfile\",\"ListItemText\":\"Get-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkSecurityGroup\",\"ListItemText\":\"Get-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Get-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkServiceTag\",\"ListItemText\":\"Get-AzNetworkServiceTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkServiceTag\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkUsage\",\"ListItemText\":\"Get-AzNetworkUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkUsage\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkVirtualAppliance\",\"ListItemText\":\"Get-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkVirtualApplianceSku\",\"ListItemText\":\"Get-AzNetworkVirtualApplianceSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkVirtualApplianceSku\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcher\",\"ListItemText\":\"Get-AzNetworkWatcher\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcher\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Get-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherConnectionMonitorReport\",\"ListItemText\":\"Get-AzNetworkWatcherConnectionMonitorReport\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherConnectionMonitorReport\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherFlowLog\",\"ListItemText\":\"Get-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherFlowLogStatus\",\"ListItemText\":\"Get-AzNetworkWatcherFlowLogStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherFlowLogStatus\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherNextHop\",\"ListItemText\":\"Get-AzNetworkWatcherNextHop\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherNextHop\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"Get-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherReachabilityProvidersList\",\"ListItemText\":\"Get-AzNetworkWatcherReachabilityProvidersList\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherReachabilityProvidersList\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherReachabilityReport\",\"ListItemText\":\"Get-AzNetworkWatcherReachabilityReport\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherReachabilityReport\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherSecurityGroupView\",\"ListItemText\":\"Get-AzNetworkWatcherSecurityGroupView\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherSecurityGroupView\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherTopology\",\"ListItemText\":\"Get-AzNetworkWatcherTopology\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherTopology\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherTroubleshootingResult\",\"ListItemText\":\"Get-AzNetworkWatcherTroubleshootingResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherTroubleshootingResult\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHub\",\"ListItemText\":\"Get-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"Get-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"Get-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"Get-AzNotificationHubListKey\",\"ListItemText\":\"Get-AzNotificationHubListKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubListKey\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubListKeys\",\"ListItemText\":\"Get-AzNotificationHubListKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubListKeys\"},{\"CompletionText\":\"Get-AzNotificationHubPNSCredential\",\"ListItemText\":\"Get-AzNotificationHubPNSCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubPNSCredential\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubPNSCredentials\",\"ListItemText\":\"Get-AzNotificationHubPNSCredentials\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubPNSCredentials\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespace\",\"ListItemText\":\"Get-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceListKey\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceListKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceListKey\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceListKeys\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceListKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceListKeys\"},{\"CompletionText\":\"Get-AzOperationalInsightsAvailableServiceTier\",\"ListItemText\":\"Get-AzOperationalInsightsAvailableServiceTier\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsAvailableServiceTier\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsCluster\",\"ListItemText\":\"Get-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsDataExport\",\"ListItemText\":\"Get-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsDataSource\",\"ListItemText\":\"Get-AzOperationalInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsDataSource\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsDeletedWorkspace\",\"ListItemText\":\"Get-AzOperationalInsightsDeletedWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsDeletedWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsIntelligencePack\",\"ListItemText\":\"Get-AzOperationalInsightsIntelligencePack\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsIntelligencePack\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsIntelligencePacks\",\"ListItemText\":\"Get-AzOperationalInsightsIntelligencePacks\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsIntelligencePacks\"},{\"CompletionText\":\"Get-AzOperationalInsightsLinkedService\",\"ListItemText\":\"Get-AzOperationalInsightsLinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsLinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"Get-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsOperation\",\"ListItemText\":\"Get-AzOperationalInsightsOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsOperation\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsOperationStatus\",\"ListItemText\":\"Get-AzOperationalInsightsOperationStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsOperationStatus\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsPurgeWorkspaceStatus\",\"ListItemText\":\"Get-AzOperationalInsightsPurgeWorkspaceStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsPurgeWorkspaceStatus\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"Get-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsSchema\",\"ListItemText\":\"Get-AzOperationalInsightsSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsSchema\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"Get-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsTable\",\"ListItemText\":\"Get-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceManagementGroup\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceManagementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceManagementGroups\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceManagementGroups\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceManagementGroups\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceSharedKey\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceSharedKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceSharedKey\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceSharedKeys\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceSharedKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceSharedKeys\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceUsage\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceUsage\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGateway\",\"ListItemText\":\"Get-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGatewayConnectionHealth\",\"ListItemText\":\"Get-AzP2sVpnGatewayConnectionHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGatewayConnectionHealth\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGatewayDetailedConnectionHealth\",\"ListItemText\":\"Get-AzP2sVpnGatewayDetailedConnectionHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGatewayDetailedConnectionHealth\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGatewayVpnProfile\",\"ListItemText\":\"Get-AzP2sVpnGatewayVpnProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGatewayVpnProfile\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyAlias\",\"ListItemText\":\"Get-AzPolicyAlias\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyAlias\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyAssignment\",\"ListItemText\":\"Get-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyAttestation\",\"ListItemText\":\"Get-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyDefinition\",\"ListItemText\":\"Get-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyEvent\",\"ListItemText\":\"Get-AzPolicyEvent\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyEvent\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyExemption\",\"ListItemText\":\"Get-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyMetadata\",\"ListItemText\":\"Get-AzPolicyMetadata\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyMetadata\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyRemediation\",\"ListItemText\":\"Get-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Get-AzPolicySetDefinition\",\"ListItemText\":\"Get-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyState\",\"ListItemText\":\"Get-AzPolicyState\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyState\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyStateSummary\",\"ListItemText\":\"Get-AzPolicyStateSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyStateSummary\\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlConfiguration\",\"ListItemText\":\"Get-AzPostgreSqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlConnectionString\",\"ListItemText\":\"Get-AzPostgreSqlConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFirewallRule\",\"ListItemText\":\"Get-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerConfiguration\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerConnectionString\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerDatabase\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerLocationBasedCapability\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerLocationBasedCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerLocationBasedCapability \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlReplica\",\"ListItemText\":\"Get-AzPostgreSqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlReplica \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlServer\",\"ListItemText\":\"Get-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"Get-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Get-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspace\",\"ListItemText\":\"Get-AzPowerBIWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspaceCollection\",\"ListItemText\":\"Get-AzPowerBIWorkspaceCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspaceCollection\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspaceCollectionAccessKey\",\"ListItemText\":\"Get-AzPowerBIWorkspaceCollectionAccessKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspaceCollectionAccessKey\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspaceCollectionAccessKeys\",\"ListItemText\":\"Get-AzPowerBIWorkspaceCollectionAccessKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspaceCollectionAccessKeys\"},{\"CompletionText\":\"Get-AzPrivateDnsRecordSet\",\"ListItemText\":\"Get-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"Get-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateDnsZone\",\"ListItemText\":\"Get-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateDnsZoneGroup\",\"ListItemText\":\"Get-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateEndpoint\",\"ListItemText\":\"Get-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateEndpointConnection\",\"ListItemText\":\"Get-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateLinkAssociation\",\"ListItemText\":\"Get-AzPrivateLinkAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateLinkAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateLinkResource\",\"ListItemText\":\"Get-AzPrivateLinkResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateLinkResource\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateLinkService\",\"ListItemText\":\"Get-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Get-AzProviderFeature\",\"ListItemText\":\"Get-AzProviderFeature\",\"ResultType\":2,\"ToolTip\":\"Get-AzProviderFeature\\r\\n\"},{\"CompletionText\":\"Get-AzProviderOperation\",\"ListItemText\":\"Get-AzProviderOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzProviderOperation\\r\\n\"},{\"CompletionText\":\"Get-AzProviderPreviewFeature\",\"ListItemText\":\"Get-AzProviderPreviewFeature\",\"ResultType\":2,\"ToolTip\":\"Get-AzProviderPreviewFeature\\r\\n\"},{\"CompletionText\":\"Get-AzProximityPlacementGroup\",\"ListItemText\":\"Get-AzProximityPlacementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzProximityPlacementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzPublicIpAddress\",\"ListItemText\":\"Get-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"Get-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"Get-AzPublicIpPrefix\",\"ListItemText\":\"Get-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Get-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrAlertSetting\",\"ListItemText\":\"Get-AzRecoveryServicesAsrAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrAlertSetting\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrEvent\",\"ListItemText\":\"Get-AzRecoveryServicesAsrEvent\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrEvent\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrFabric\",\"ListItemText\":\"Get-AzRecoveryServicesAsrFabric\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrFabric\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Get-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrNetwork\",\"ListItemText\":\"Get-AzRecoveryServicesAsrNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrNetwork\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"Get-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrNotificationSetting\",\"ListItemText\":\"Get-AzRecoveryServicesAsrNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrNotificationSetting\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"Get-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrProtectableItem\",\"ListItemText\":\"Get-AzRecoveryServicesAsrProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrProtectableItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrProtectionContainer\",\"ListItemText\":\"Get-AzRecoveryServicesAsrProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrProtectionContainer\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"Get-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Get-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrRecoveryPoint\",\"ListItemText\":\"Get-AzRecoveryServicesAsrRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"Get-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrServicesProvider\",\"ListItemText\":\"Get-AzRecoveryServicesAsrServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrServicesProvider\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrStorageClassification\",\"ListItemText\":\"Get-AzRecoveryServicesAsrStorageClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrStorageClassification\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrStorageClassificationMapping\",\"ListItemText\":\"Get-AzRecoveryServicesAsrStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrStorageClassificationMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrVaultContext\",\"ListItemText\":\"Get-AzRecoveryServicesAsrVaultContext\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrVaultContext\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrVaultSettings\",\"ListItemText\":\"Get-AzRecoveryServicesAsrVaultSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrVaultSettings\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"Get-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupContainer\",\"ListItemText\":\"Get-AzRecoveryServicesBackupContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupContainer\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupItem\",\"ListItemText\":\"Get-AzRecoveryServicesBackupItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupJob\",\"ListItemText\":\"Get-AzRecoveryServicesBackupJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupJob\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupJobDetail\",\"ListItemText\":\"Get-AzRecoveryServicesBackupJobDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupJobDetail\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupManagementServer\",\"ListItemText\":\"Get-AzRecoveryServicesBackupManagementServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupManagementServer\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProperties\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProperties\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProperties\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProperty\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProperty\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProtectableItem\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProtectableItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRecommendedArchivableRPGroup\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRecommendedArchivableRPGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRecommendedArchivableRPGroup\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRecoveryLogChain\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRecoveryLogChain\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRecoveryLogChain\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRecoveryPoint\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRetentionPolicyObject\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRetentionPolicyObject\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRetentionPolicyObject\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRPMountScript\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRPMountScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRPMountScript\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupSchedulePolicyObject\",\"ListItemText\":\"Get-AzRecoveryServicesBackupSchedulePolicyObject\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupSchedulePolicyObject\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupStatus\",\"ListItemText\":\"Get-AzRecoveryServicesBackupStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupStatus\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupWorkloadRecoveryConfig\",\"ListItemText\":\"Get-AzRecoveryServicesBackupWorkloadRecoveryConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupWorkloadRecoveryConfig\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesResourceGuardMapping\",\"ListItemText\":\"Get-AzRecoveryServicesResourceGuardMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesResourceGuardMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesVault\",\"ListItemText\":\"Get-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesVaultProperty\",\"ListItemText\":\"Get-AzRecoveryServicesVaultProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesVaultProperty\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesVaultSettingsFile\",\"ListItemText\":\"Get-AzRecoveryServicesVaultSettingsFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesVaultSettingsFile\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCache\",\"ListItemText\":\"Get-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCacheFirewallRule\",\"ListItemText\":\"Get-AzRedisCacheFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCacheFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCacheKey\",\"ListItemText\":\"Get-AzRedisCacheKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCacheKey\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCacheLink\",\"ListItemText\":\"Get-AzRedisCacheLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCacheLink\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCachePatchSchedule\",\"ListItemText\":\"Get-AzRedisCachePatchSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCachePatchSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCache\",\"ListItemText\":\"Get-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheAccessKey\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheAccessKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisEnterpriseCacheAccessKey\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheDatabaseKey\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheDatabaseKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisEnterpriseCacheDatabaseKey\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheKey\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCacheKey \\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheOperationStatus\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheOperationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCacheOperationStatus \\r\\n\"},{\"CompletionText\":\"Get-AzRegulatoryComplainceAssessment\",\"ListItemText\":\"Get-AzRegulatoryComplainceAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplainceAssessment\"},{\"CompletionText\":\"Get-AzRegulatoryComplianceAssessment\",\"ListItemText\":\"Get-AzRegulatoryComplianceAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplianceAssessment\\r\\n\"},{\"CompletionText\":\"Get-AzRegulatoryComplianceControl\",\"ListItemText\":\"Get-AzRegulatoryComplianceControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplianceControl\\r\\n\"},{\"CompletionText\":\"Get-AzRegulatoryComplianceStandard\",\"ListItemText\":\"Get-AzRegulatoryComplianceStandard\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplianceStandard\\r\\n\"},{\"CompletionText\":\"Get-AzRelayAuthorizationRule\",\"ListItemText\":\"Get-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Get-AzRelayHybridConnection\",\"ListItemText\":\"Get-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"Get-AzRelayKey\",\"ListItemText\":\"Get-AzRelayKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayKey \\r\\n\"},{\"CompletionText\":\"Get-AzRelayNamespace\",\"ListItemText\":\"Get-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzRelayNamespaceNetworkRuleSet\",\"ListItemText\":\"Get-AzRelayNamespaceNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayNamespaceNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzRemoteDesktopFile\",\"ListItemText\":\"Get-AzRemoteDesktopFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzRemoteDesktopFile\\r\\n\"},{\"CompletionText\":\"Get-AzResource\",\"ListItemText\":\"Get-AzResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzResource\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroup\",\"ListItemText\":\"Get-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroupDeployment\",\"ListItemText\":\"Get-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroupDeploymentOperation\",\"ListItemText\":\"Get-AzResourceGroupDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroupDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroupDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzResourceGroupDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroupDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzResourceLock\",\"ListItemText\":\"Get-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceLock\\r\\n\"},{\"CompletionText\":\"Get-AzResourceManagementPrivateLink\",\"ListItemText\":\"Get-AzResourceManagementPrivateLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceManagementPrivateLink\\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverMoveCollection\",\"ListItemText\":\"Get-AzResourceMoverMoveCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverMoveCollection \\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverMoveResource\",\"ListItemText\":\"Get-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverMoveResource \\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverRequiredForResources\",\"ListItemText\":\"Get-AzResourceMoverRequiredForResources\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverRequiredForResources \\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverUnresolvedDependency\",\"ListItemText\":\"Get-AzResourceMoverUnresolvedDependency\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverUnresolvedDependency \\r\\n\"},{\"CompletionText\":\"Get-AzResourceProvider\",\"ListItemText\":\"Get-AzResourceProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceProvider\\r\\n\"},{\"CompletionText\":\"Get-AzResourceProviderAction\",\"ListItemText\":\"Get-AzResourceProviderAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceProviderAction\"},{\"CompletionText\":\"Get-AzRestorePoint\",\"ListItemText\":\"Get-AzRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzRestorePoint\\r\\n\"},{\"CompletionText\":\"Get-AzRestorePointCollection\",\"ListItemText\":\"Get-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"Get-AzRmStorageContainer\",\"ListItemText\":\"Get-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"Get-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Get-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzRmStorageShare\",\"ListItemText\":\"Get-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignment\",\"ListItemText\":\"Get-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignmentSchedule\",\"ListItemText\":\"Get-AzRoleAssignmentSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleAssignmentSchedule \\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignmentScheduleInstance\",\"ListItemText\":\"Get-AzRoleAssignmentScheduleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleAssignmentScheduleInstance \\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignmentScheduleRequest\",\"ListItemText\":\"Get-AzRoleAssignmentScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleAssignmentScheduleRequest \\r\\n\"},{\"CompletionText\":\"Get-AzRoleDefinition\",\"ListItemText\":\"Get-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibilitySchedule\",\"ListItemText\":\"Get-AzRoleEligibilitySchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibilitySchedule \\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibilityScheduleInstance\",\"ListItemText\":\"Get-AzRoleEligibilityScheduleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibilityScheduleInstance \\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibilityScheduleRequest\",\"ListItemText\":\"Get-AzRoleEligibilityScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibilityScheduleRequest \\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibleChildResource\",\"ListItemText\":\"Get-AzRoleEligibleChildResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibleChildResource \\r\\n\"},{\"CompletionText\":\"Get-AzRoleManagementPolicy\",\"ListItemText\":\"Get-AzRoleManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleManagementPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzRoleManagementPolicyAssignment\",\"ListItemText\":\"Get-AzRoleManagementPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleManagementPolicyAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzRouteConfig\",\"ListItemText\":\"Get-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Get-AzRouteFilter\",\"ListItemText\":\"Get-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"Get-AzRouteFilterRuleConfig\",\"ListItemText\":\"Get-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzRouteMap\",\"ListItemText\":\"Get-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteMap\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServer\",\"ListItemText\":\"Get-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServer\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServerPeer\",\"ListItemText\":\"Get-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServerPeerAdvertisedRoute\",\"ListItemText\":\"Get-AzRouteServerPeerAdvertisedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServerPeerAdvertisedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServerPeerLearnedRoute\",\"ListItemText\":\"Get-AzRouteServerPeerLearnedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServerPeerLearnedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzRouteTable\",\"ListItemText\":\"Get-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzRoutingIntent\",\"ListItemText\":\"Get-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"Get-AzRoutingPolicy\",\"ListItemText\":\"Get-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzScheduledQueryRule\",\"ListItemText\":\"Get-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdaptiveApplicationControl\",\"ListItemText\":\"Get-AzSecurityAdaptiveApplicationControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdaptiveApplicationControl\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdaptiveApplicationControlGroup\",\"ListItemText\":\"Get-AzSecurityAdaptiveApplicationControlGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdaptiveApplicationControlGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdaptiveNetworkHardening\",\"ListItemText\":\"Get-AzSecurityAdaptiveNetworkHardening\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdaptiveNetworkHardening\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdvancedThreatProtection\",\"ListItemText\":\"Get-AzSecurityAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdvancedThreatProtection\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAlert\",\"ListItemText\":\"Get-AzSecurityAlert\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAlert\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAssessment\",\"ListItemText\":\"Get-AzSecurityAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAssessment\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAssessmentMetadata\",\"ListItemText\":\"Get-AzSecurityAssessmentMetadata\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAssessmentMetadata\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAutomation\",\"ListItemText\":\"Get-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAutoProvisioningSetting\",\"ListItemText\":\"Get-AzSecurityAutoProvisioningSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAutoProvisioningSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityCompliance\",\"ListItemText\":\"Get-AzSecurityCompliance\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityCompliance\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityContact\",\"ListItemText\":\"Get-AzSecurityContact\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityContact\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityLocation\",\"ListItemText\":\"Get-AzSecurityLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityLocation\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityPartnerProvider\",\"ListItemText\":\"Get-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityPricing\",\"ListItemText\":\"Get-AzSecurityPricing\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityPricing\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySecureScore\",\"ListItemText\":\"Get-AzSecuritySecureScore\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySecureScore\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySecureScoreControl\",\"ListItemText\":\"Get-AzSecuritySecureScoreControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySecureScoreControl\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySecureScoreControlDefinition\",\"ListItemText\":\"Get-AzSecuritySecureScoreControlDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySecureScoreControlDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySetting\",\"ListItemText\":\"Get-AzSecuritySetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySetting\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySolution\",\"ListItemText\":\"Get-AzSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySolutionsReferenceData\",\"ListItemText\":\"Get-AzSecuritySolutionsReferenceData\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySolutionsReferenceData\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Get-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanResult\",\"ListItemText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanResult\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySubAssessment\",\"ListItemText\":\"Get-AzSecuritySubAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySubAssessment\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityTask\",\"ListItemText\":\"Get-AzSecurityTask\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityTask\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityTopology\",\"ListItemText\":\"Get-AzSecurityTopology\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityTopology\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityWorkspaceSetting\",\"ListItemText\":\"Get-AzSecurityWorkspaceSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityWorkspaceSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAlertRule\",\"ListItemText\":\"Get-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAlertRuleAction\",\"ListItemText\":\"Get-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAlertRuleTemplate\",\"ListItemText\":\"Get-AzSentinelAlertRuleTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAlertRuleTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAutomationRule\",\"ListItemText\":\"Get-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelBookmark\",\"ListItemText\":\"Get-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelBookmarkRelation\",\"ListItemText\":\"Get-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelDataConnector\",\"ListItemText\":\"Get-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEnrichment\",\"ListItemText\":\"Get-AzSentinelEnrichment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEnrichment \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntity\",\"ListItemText\":\"Get-AzSentinelEntity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntity \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityActivity\",\"ListItemText\":\"Get-AzSentinelEntityActivity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityActivity \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityInsight\",\"ListItemText\":\"Get-AzSentinelEntityInsight\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityInsight \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityQuery\",\"ListItemText\":\"Get-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityQueryTemplate\",\"ListItemText\":\"Get-AzSentinelEntityQueryTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityQueryTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityRelation\",\"ListItemText\":\"Get-AzSentinelEntityRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityRelation \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityTimeline\",\"ListItemText\":\"Get-AzSentinelEntityTimeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityTimeline \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncident\",\"ListItemText\":\"Get-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentAlert\",\"ListItemText\":\"Get-AzSentinelIncidentAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentAlert \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentBookmark\",\"ListItemText\":\"Get-AzSentinelIncidentBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentBookmark \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentComment\",\"ListItemText\":\"Get-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentEntity\",\"ListItemText\":\"Get-AzSentinelIncidentEntity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentEntity \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentRelation\",\"ListItemText\":\"Get-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelMetadata\",\"ListItemText\":\"Get-AzSentinelMetadata\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelMetadata \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelOnboardingState\",\"ListItemText\":\"Get-AzSentinelOnboardingState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelOnboardingState \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelSetting\",\"ListItemText\":\"Get-AzSentinelSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelSetting \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelThreatIntelligenceIndicator\",\"ListItemText\":\"Get-AzSentinelThreatIntelligenceIndicator\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelThreatIntelligenceIndicator \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelThreatIntelligenceIndicatorMetric\",\"ListItemText\":\"Get-AzSentinelThreatIntelligenceIndicatorMetric\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelThreatIntelligenceIndicatorMetric \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusAuthorizationRule\",\"ListItemText\":\"Get-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusGeoDRConfiguration\",\"ListItemText\":\"Get-AzServiceBusGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusKey\",\"ListItemText\":\"Get-AzServiceBusKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusKey \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusMigration\",\"ListItemText\":\"Get-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusNamespace\",\"ListItemText\":\"Get-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusNamespaceV2\",\"ListItemText\":\"Get-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"Get-AzServiceBusNetworkRuleSet\",\"ListItemText\":\"Get-AzServiceBusNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Get-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusPrivateLink\",\"ListItemText\":\"Get-AzServiceBusPrivateLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusPrivateLink \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusQueue\",\"ListItemText\":\"Get-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusRule\",\"ListItemText\":\"Get-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusSubscription\",\"ListItemText\":\"Get-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusTopic\",\"ListItemText\":\"Get-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"Get-AzServiceEndpointPolicy\",\"ListItemText\":\"Get-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Get-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricApplication\",\"ListItemText\":\"Get-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricApplicationType\",\"ListItemText\":\"Get-AzServiceFabricApplicationType\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricApplicationType\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricApplicationTypeVersion\",\"ListItemText\":\"Get-AzServiceFabricApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricCluster\",\"ListItemText\":\"Get-AzServiceFabricCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricCluster\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedCluster\",\"ListItemText\":\"Get-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterService\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Get-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricService\",\"ListItemText\":\"Get-AzServiceFabricService\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricService\\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationForContainerApp\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationForContainerApp \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationForSpringCloud\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationForSpringCloud \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationForWebApp\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationForWebApp \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationName\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationName \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Get-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Get-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerForWebApp\",\"ListItemText\":\"Get-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Get-AzSignalR\",\"ListItemText\":\"Get-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Get-AzSignalR\\r\\n\"},{\"CompletionText\":\"Get-AzSignalRKey\",\"ListItemText\":\"Get-AzSignalRKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSignalRKey\\r\\n\"},{\"CompletionText\":\"Get-AzSignalRUsage\",\"ListItemText\":\"Get-AzSignalRUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzSignalRUsage\\r\\n\"},{\"CompletionText\":\"Get-AzSnapshot\",\"ListItemText\":\"Get-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-AzSnapshot\\r\\n\"},{\"CompletionText\":\"Get-AzSqlCapability\",\"ListItemText\":\"Get-AzSqlCapability\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlCapability\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabase\",\"ListItemText\":\"Get-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseActivity\",\"ListItemText\":\"Get-AzSqlDatabaseActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseAdvisor\",\"ListItemText\":\"Get-AzSqlDatabaseAdvisor\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseAdvisor\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseAudit\",\"ListItemText\":\"Get-AzSqlDatabaseAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseAudit\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseDataMaskingPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseDataMaskingPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseDataMaskingPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"Get-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseExpanded\",\"ListItemText\":\"Get-AzSqlDatabaseExpanded\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseExpanded\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Get-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseGeoBackup\",\"ListItemText\":\"Get-AzSqlDatabaseGeoBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseGeoBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseGeoBackupPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseGeoBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseGeoBackupPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseImportExportStatus\",\"ListItemText\":\"Get-AzSqlDatabaseImportExportStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseImportExportStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseIndexRecommendation\",\"ListItemText\":\"Get-AzSqlDatabaseIndexRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseIndexRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Get-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseLedgerDigestUpload\",\"ListItemText\":\"Get-AzSqlDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Get-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseLongTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseLongTermRetentionPolicy\"},{\"CompletionText\":\"Get-AzSqlDatabaseRecommendedAction\",\"ListItemText\":\"Get-AzSqlDatabaseRecommendedAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseRecommendedAction\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseReplicationLink\",\"ListItemText\":\"Get-AzSqlDatabaseReplicationLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseReplicationLink\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseRestorePoint\",\"ListItemText\":\"Get-AzSqlDatabaseRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseRestorePoint\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseSensitivityClassification\",\"ListItemText\":\"Get-AzSqlDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseSensitivityRecommendation\",\"ListItemText\":\"Get-AzSqlDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseServerAuditingPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseServerAuditingPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseServerAuditingPolicy\"},{\"CompletionText\":\"Get-AzSqlDatabaseTransparentDataEncryption\",\"ListItemText\":\"Get-AzSqlDatabaseTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseTransparentDataEncryptionActivity\",\"ListItemText\":\"Get-AzSqlDatabaseTransparentDataEncryptionActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseTransparentDataEncryptionActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseUpgradeHint\",\"ListItemText\":\"Get-AzSqlDatabaseUpgradeHint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseUpgradeHint\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Get-AzSqlDeletedDatabaseBackup\",\"ListItemText\":\"Get-AzSqlDeletedDatabaseBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDeletedDatabaseBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDeletedInstanceDatabaseBackup\",\"ListItemText\":\"Get-AzSqlDeletedInstanceDatabaseBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDeletedInstanceDatabaseBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJob\",\"ListItemText\":\"Get-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobAgent\",\"ListItemText\":\"Get-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobCredential\",\"ListItemText\":\"Get-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobExecution\",\"ListItemText\":\"Get-AzSqlElasticJobExecution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobExecution\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobStep\",\"ListItemText\":\"Get-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobStepExecution\",\"ListItemText\":\"Get-AzSqlElasticJobStepExecution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobStepExecution\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobTargetExecution\",\"ListItemText\":\"Get-AzSqlElasticJobTargetExecution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobTargetExecution\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobTargetGroup\",\"ListItemText\":\"Get-AzSqlElasticJobTargetGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobTargetGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPool\",\"ListItemText\":\"Get-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolActivity\",\"ListItemText\":\"Get-AzSqlElasticPoolActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolAdvisor\",\"ListItemText\":\"Get-AzSqlElasticPoolAdvisor\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolAdvisor\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolDatabase\",\"ListItemText\":\"Get-AzSqlElasticPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolRecommendation\",\"ListItemText\":\"Get-AzSqlElasticPoolRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolRecommendedAction\",\"ListItemText\":\"Get-AzSqlElasticPoolRecommendedAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolRecommendedAction\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInformationProtectionPolicy\",\"ListItemText\":\"Get-AzSqlInformationProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInformationProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstance\",\"ListItemText\":\"Get-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceActiveDirectoryAdministrator\",\"ListItemText\":\"Get-AzSqlInstanceActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Get-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceAdvancedDataSecurityPolicy\",\"ListItemText\":\"Get-AzSqlInstanceAdvancedDataSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceAdvancedDataSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabase\",\"ListItemText\":\"Get-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseGeoBackup\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseGeoBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseGeoBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseSensitivityClassification\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Get-AzSqlInstanceDtc\",\"ListItemText\":\"Get-AzSqlInstanceDtc\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDtc\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceEndpointCertificate\",\"ListItemText\":\"Get-AzSqlInstanceEndpointCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceEndpointCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceKeyVaultKey\",\"ListItemText\":\"Get-AzSqlInstanceKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceLink\",\"ListItemText\":\"Get-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceOperation\",\"ListItemText\":\"Get-AzSqlInstanceOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceOperation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstancePool\",\"ListItemText\":\"Get-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstancePoolUsage\",\"ListItemText\":\"Get-AzSqlInstancePoolUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstancePoolUsage\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceServerTrustCertificate\",\"ListItemText\":\"Get-AzSqlInstanceServerTrustCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceServerTrustCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceTDEProtector\",\"ListItemText\":\"Get-AzSqlInstanceTDEProtector\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceTDEProtector\"},{\"CompletionText\":\"Get-AzSqlInstanceTransparentDataEncryptionProtector\",\"ListItemText\":\"Get-AzSqlInstanceTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServer\",\"ListItemText\":\"Get-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServer\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerActiveDirectoryAdministrator\",\"ListItemText\":\"Get-AzSqlServerActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Get-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAdvancedDataSecurityPolicy\",\"ListItemText\":\"Get-AzSqlServerAdvancedDataSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAdvancedDataSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlServerAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAdvisor\",\"ListItemText\":\"Get-AzSqlServerAdvisor\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAdvisor\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAudit\",\"ListItemText\":\"Get-AzSqlServerAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAudit\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerCommunicationLink\",\"ListItemText\":\"Get-AzSqlServerCommunicationLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerCommunicationLink\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerConfigurationOption\",\"ListItemText\":\"Get-AzSqlServerConfigurationOption\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerConfigurationOption\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"Get-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerDisasterRecoveryConfigurationActivity\",\"ListItemText\":\"Get-AzSqlServerDisasterRecoveryConfigurationActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerDisasterRecoveryConfigurationActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerDnsAlias\",\"ListItemText\":\"Get-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerFirewallRule\",\"ListItemText\":\"Get-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"Get-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerKeyVaultKey\",\"ListItemText\":\"Get-AzSqlServerKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerMSSupportAudit\",\"ListItemText\":\"Get-AzSqlServerMSSupportAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerMSSupportAudit\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerOutboundFirewallRule\",\"ListItemText\":\"Get-AzSqlServerOutboundFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerOutboundFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerRecommendedAction\",\"ListItemText\":\"Get-AzSqlServerRecommendedAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerRecommendedAction\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerServiceObjective\",\"ListItemText\":\"Get-AzSqlServerServiceObjective\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerServiceObjective\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerTransparentDataEncryptionProtector\",\"ListItemText\":\"Get-AzSqlServerTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerTrustGroup\",\"ListItemText\":\"Get-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerTrustGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerUpgradeHint\",\"ListItemText\":\"Get-AzSqlServerUpgradeHint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerUpgradeHint\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"Get-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlServerVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncAgent\",\"ListItemText\":\"Get-AzSqlSyncAgent\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncAgent\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncAgentLinkedDatabase\",\"ListItemText\":\"Get-AzSqlSyncAgentLinkedDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncAgentLinkedDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncGroup\",\"ListItemText\":\"Get-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncGroupLog\",\"ListItemText\":\"Get-AzSqlSyncGroupLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncGroupLog\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncMember\",\"ListItemText\":\"Get-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncSchema\",\"ListItemText\":\"Get-AzSqlSyncSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncSchema\\r\\n\"},{\"CompletionText\":\"Get-AzSqlVirtualCluster\",\"ListItemText\":\"Get-AzSqlVirtualCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlVirtualCluster\\r\\n\"},{\"CompletionText\":\"Get-AzSqlVM\",\"ListItemText\":\"Get-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSqlVM \\r\\n\"},{\"CompletionText\":\"Get-AzSqlVMGroup\",\"ListItemText\":\"Get-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"Get-AzSshKey\",\"ListItemText\":\"Get-AzSshKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSshKey\\r\\n\"},{\"CompletionText\":\"Get-AzStackHciArcSetting\",\"ListItemText\":\"Get-AzStackHciArcSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHciArcSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStackHciCluster\",\"ListItemText\":\"Get-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"Get-AzStackHciExtension\",\"ListItemText\":\"Get-AzStackHciExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHciExtension \\r\\n\"},{\"CompletionText\":\"Get-AzStackHCIRemoteSupportAccess\",\"ListItemText\":\"Get-AzStackHCIRemoteSupportAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHCIRemoteSupportAccess \\r\\n\"},{\"CompletionText\":\"Get-AzStackHCIRemoteSupportSessionHistory\",\"ListItemText\":\"Get-AzStackHCIRemoteSupportSessionHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHCIRemoteSupportSessionHistory \\r\\n\"},{\"CompletionText\":\"Get-AzStackHCIVMAttestation\",\"ListItemText\":\"Get-AzStackHCIVMAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHCIVMAttestation \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebApp\",\"ListItemText\":\"Get-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuild\",\"ListItemText\":\"Get-AzStaticWebAppBuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuild \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuildAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppBuildAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuildAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuildFunction\",\"ListItemText\":\"Get-AzStaticWebAppBuildFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuildFunction \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuildFunctionAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppBuildFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuildFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppConfiguredRole\",\"ListItemText\":\"Get-AzStaticWebAppConfiguredRole\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppConfiguredRole \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppCustomDomain\",\"ListItemText\":\"Get-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppFunction\",\"ListItemText\":\"Get-AzStaticWebAppFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppFunction \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppFunctionAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppSecret\",\"ListItemText\":\"Get-AzStaticWebAppSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppSecret \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppUser\",\"ListItemText\":\"Get-AzStaticWebAppUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppUser \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppUserProvidedFunctionApp\",\"ListItemText\":\"Get-AzStaticWebAppUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccount\",\"ListItemText\":\"Get-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountKey\",\"ListItemText\":\"Get-AzStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountManagementPolicy\",\"ListItemText\":\"Get-AzStorageAccountManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountManagementPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountNameAvailability\",\"ListItemText\":\"Get-AzStorageAccountNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountNameAvailability\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountNetworkRuleSet\",\"ListItemText\":\"Get-AzStorageAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlob\",\"ListItemText\":\"Get-AzStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlob\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobByTag\",\"ListItemText\":\"Get-AzStorageBlobByTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobByTag\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobContent\",\"ListItemText\":\"Get-AzStorageBlobContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobContent\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobCopyState\",\"ListItemText\":\"Get-AzStorageBlobCopyState\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobCopyState\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobInventoryPolicy\",\"ListItemText\":\"Get-AzStorageBlobInventoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobInventoryPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobQueryResult\",\"ListItemText\":\"Get-AzStorageBlobQueryResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobQueryResult\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobServiceProperty\",\"ListItemText\":\"Get-AzStorageBlobServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobServiceProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobTag\",\"ListItemText\":\"Get-AzStorageBlobTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobTag\\r\\n\"},{\"CompletionText\":\"Get-AzStorageContainer\",\"ListItemText\":\"Get-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"Get-AzStorageContainerAcl\",\"ListItemText\":\"Get-AzStorageContainerAcl\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageContainerAcl\"},{\"CompletionText\":\"Get-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageCORSRule\",\"ListItemText\":\"Get-AzStorageCORSRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageCORSRule\\r\\n\"},{\"CompletionText\":\"Get-AzStorageEncryptionScope\",\"ListItemText\":\"Get-AzStorageEncryptionScope\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageEncryptionScope\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFile\",\"ListItemText\":\"Get-AzStorageFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFile\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileContent\",\"ListItemText\":\"Get-AzStorageFileContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileContent\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileCopyState\",\"ListItemText\":\"Get-AzStorageFileCopyState\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileCopyState\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileHandle\",\"ListItemText\":\"Get-AzStorageFileHandle\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileHandle\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileServiceProperty\",\"ListItemText\":\"Get-AzStorageFileServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileServiceProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageLocalUser\",\"ListItemText\":\"Get-AzStorageLocalUser\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageLocalUser\\r\\n\"},{\"CompletionText\":\"Get-AzStorageLocalUserKey\",\"ListItemText\":\"Get-AzStorageLocalUserKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageLocalUserKey\\r\\n\"},{\"CompletionText\":\"Get-AzStorageMover\",\"ListItemText\":\"Get-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMover \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverAgent\",\"ListItemText\":\"Get-AzStorageMoverAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverAgent \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverEndpoint\",\"ListItemText\":\"Get-AzStorageMoverEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverJobDefinition\",\"ListItemText\":\"Get-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverJobRun\",\"ListItemText\":\"Get-AzStorageMoverJobRun\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverJobRun \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverProject\",\"ListItemText\":\"Get-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"Get-AzStorageObjectReplicationPolicy\",\"ListItemText\":\"Get-AzStorageObjectReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageObjectReplicationPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageQueue\",\"ListItemText\":\"Get-AzStorageQueue\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageQueue\\r\\n\"},{\"CompletionText\":\"Get-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageServiceLoggingProperty\",\"ListItemText\":\"Get-AzStorageServiceLoggingProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageServiceLoggingProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageServiceMetricsProperty\",\"ListItemText\":\"Get-AzStorageServiceMetricsProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageServiceMetricsProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageServiceProperty\",\"ListItemText\":\"Get-AzStorageServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageServiceProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageShare\",\"ListItemText\":\"Get-AzStorageShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageShare\\r\\n\"},{\"CompletionText\":\"Get-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncCloudEndpoint\",\"ListItemText\":\"Get-AzStorageSyncCloudEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncCloudEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncGroup\",\"ListItemText\":\"Get-AzStorageSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncGroup\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncServer\",\"ListItemText\":\"Get-AzStorageSyncServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncServer\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncServerEndpoint\",\"ListItemText\":\"Get-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncService\",\"ListItemText\":\"Get-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"Get-AzStorageTable\",\"ListItemText\":\"Get-AzStorageTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageTable\\r\\n\"},{\"CompletionText\":\"Get-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageUsage\",\"ListItemText\":\"Get-AzStorageUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageUsage\\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsCluster\",\"ListItemText\":\"Get-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsClusterStreamingJob\",\"ListItemText\":\"Get-AzStreamAnalyticsClusterStreamingJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsClusterStreamingJob \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsDefaultFunctionDefinition\",\"ListItemText\":\"Get-AzStreamAnalyticsDefaultFunctionDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsDefaultFunctionDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsFunction\",\"ListItemText\":\"Get-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsInput\",\"ListItemText\":\"Get-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsJob\",\"ListItemText\":\"Get-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsOutput\",\"ListItemText\":\"Get-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsQuota\",\"ListItemText\":\"Get-AzStreamAnalyticsQuota\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsQuota \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsTransformation\",\"ListItemText\":\"Get-AzStreamAnalyticsTransformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsTransformation \\r\\n\"},{\"CompletionText\":\"Get-AzSubscription\",\"ListItemText\":\"Get-AzSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzSubscriptionDeployment\",\"ListItemText\":\"Get-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscriptionDeployment\"},{\"CompletionText\":\"Get-AzSubscriptionDeploymentOperation\",\"ListItemText\":\"Get-AzSubscriptionDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscriptionDeploymentOperation\"},{\"CompletionText\":\"Get-AzSubscriptionDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzSubscriptionDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscriptionDeploymentWhatIfResult\"},{\"CompletionText\":\"Get-AzSubscriptionDiagnosticSetting\",\"ListItemText\":\"Get-AzSubscriptionDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSubscriptionDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Get-AzSupportProblemClassification\",\"ListItemText\":\"Get-AzSupportProblemClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportProblemClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSupportService\",\"ListItemText\":\"Get-AzSupportService\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportService\\r\\n\"},{\"CompletionText\":\"Get-AzSupportTicket\",\"ListItemText\":\"Get-AzSupportTicket\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportTicket\\r\\n\"},{\"CompletionText\":\"Get-AzSupportTicketCommunication\",\"ListItemText\":\"Get-AzSupportTicketCommunication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportTicketCommunication\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Get-AzSynapseActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseActivityRun\",\"ListItemText\":\"Get-AzSynapseActivityRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseActivityRun\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDataFlow\",\"ListItemText\":\"Get-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDataFlow\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDataFlowDebugSession\",\"ListItemText\":\"Get-AzSynapseDataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDataset\",\"ListItemText\":\"Get-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDataset\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDroppedSqlPool\",\"ListItemText\":\"Get-AzSynapseDroppedSqlPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDroppedSqlPool\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseFirewallRule\",\"ListItemText\":\"Get-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntimeKey\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntimeMetric\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntimeMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntimeMetric\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntimeNode\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKqlScript\",\"ListItemText\":\"Get-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPool\",\"ListItemText\":\"Get-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ListItemText\":\"Get-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"Get-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ListItemText\":\"Get-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"Get-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolFollowerDatabase\",\"ListItemText\":\"Get-AzSynapseKustoPoolFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolLanguageExtension\",\"ListItemText\":\"Get-AzSynapseKustoPoolLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolLanguageExtension \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolPrincipalAssignment\",\"ListItemText\":\"Get-AzSynapseKustoPoolPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolSku\",\"ListItemText\":\"Get-AzSynapseKustoPoolSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolSku \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnection\",\"ListItemText\":\"Get-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnectionDetailedStatus\",\"ListItemText\":\"Get-AzSynapseLinkConnectionDetailedStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnectionDetailedStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnectionLinkTable\",\"ListItemText\":\"Get-AzSynapseLinkConnectionLinkTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnectionLinkTable\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnectionLinkTableStatus\",\"ListItemText\":\"Get-AzSynapseLinkConnectionLinkTableStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnectionLinkTableStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkedService\",\"ListItemText\":\"Get-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseManagedIdentitySqlControlSetting\",\"ListItemText\":\"Get-AzSynapseManagedIdentitySqlControlSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseManagedIdentitySqlControlSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"Get-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseManagedPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseNotebook\",\"ListItemText\":\"Get-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Get-AzSynapsePipeline\",\"ListItemText\":\"Get-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Get-AzSynapsePipelineRun\",\"ListItemText\":\"Get-AzSynapsePipelineRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapsePipelineRun\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseRoleAssignment\",\"ListItemText\":\"Get-AzSynapseRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseRoleDefinition\",\"ListItemText\":\"Get-AzSynapseRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseRoleScope\",\"ListItemText\":\"Get-AzSynapseRoleScope\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseRoleScope\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkConfiguration\",\"ListItemText\":\"Get-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkJob\",\"ListItemText\":\"Get-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkJobDefinition\",\"ListItemText\":\"Get-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkJobDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkPool\",\"ListItemText\":\"Get-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkSession\",\"ListItemText\":\"Get-AzSynapseSparkSession\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkSession\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkStatement\",\"ListItemText\":\"Get-AzSynapseSparkStatement\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkStatement\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlActiveDirectoryAdministrator\",\"ListItemText\":\"Get-AzSynapseSqlActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlAdvancedDataSecurityPolicy\",\"ListItemText\":\"Get-AzSynapseSqlAdvancedDataSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAdvancedDataSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlAudit\",\"ListItemText\":\"Get-AzSynapseSqlAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAudit\"},{\"CompletionText\":\"Get-AzSynapseSqlAuditSetting\",\"ListItemText\":\"Get-AzSynapseSqlAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAuditSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlDatabase\",\"ListItemText\":\"Get-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPool\",\"ListItemText\":\"Get-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolAudit\",\"ListItemText\":\"Get-AzSynapseSqlPoolAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolAudit\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolAuditSetting\",\"ListItemText\":\"Get-AzSynapseSqlPoolAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolAuditSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolGeoBackup\",\"ListItemText\":\"Get-AzSynapseSqlPoolGeoBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolGeoBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolRestorePoint\",\"ListItemText\":\"Get-AzSynapseSqlPoolRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolRestorePoint\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolSensitivityClassification\",\"ListItemText\":\"Get-AzSynapseSqlPoolSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolSensitivityRecommendation\",\"ListItemText\":\"Get-AzSynapseSqlPoolSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolTransparentDataEncryption\",\"ListItemText\":\"Get-AzSynapseSqlPoolTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlScript\",\"ListItemText\":\"Get-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseTrigger\",\"ListItemText\":\"Get-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseTriggerRun\",\"ListItemText\":\"Get-AzSynapseTriggerRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseTriggerRun\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseTriggerSubscriptionStatus\",\"ListItemText\":\"Get-AzSynapseTriggerSubscriptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseTriggerSubscriptionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseWorkspace\",\"ListItemText\":\"Get-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseWorkspaceKey\",\"ListItemText\":\"Get-AzSynapseWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseWorkspaceKey\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseWorkspacePackage\",\"ListItemText\":\"Get-AzSynapseWorkspacePackage\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseWorkspacePackage\\r\\n\"},{\"CompletionText\":\"Get-AzSystemAssignedIdentity\",\"ListItemText\":\"Get-AzSystemAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSystemAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Get-AzTag\",\"ListItemText\":\"Get-AzTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzTag\\r\\n\"},{\"CompletionText\":\"Get-AzTemplateSpec\",\"ListItemText\":\"Get-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Get-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Get-AzTenant\",\"ListItemText\":\"Get-AzTenant\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenant\\r\\n\"},{\"CompletionText\":\"Get-AzTenantBackfillStatus\",\"ListItemText\":\"Get-AzTenantBackfillStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantBackfillStatus\\r\\n\"},{\"CompletionText\":\"Get-AzTenantDeployment\",\"ListItemText\":\"Get-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzTenantDeploymentOperation\",\"ListItemText\":\"Get-AzTenantDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzTenantDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzTenantDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzTrafficManagerEndpoint\",\"ListItemText\":\"Get-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzTrafficManagerProfile\",\"ListItemText\":\"Get-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Get-AzUserAssignedIdentity\",\"ListItemText\":\"Get-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Get-AzUserAssignedIdentityAssociatedResource\",\"ListItemText\":\"Get-AzUserAssignedIdentityAssociatedResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzUserAssignedIdentityAssociatedResource \\r\\n\"},{\"CompletionText\":\"Get-AzVHubEffectiveRoute\",\"ListItemText\":\"Get-AzVHubEffectiveRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubEffectiveRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVHubInboundRoute\",\"ListItemText\":\"Get-AzVHubInboundRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubInboundRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVHubOutboundRoute\",\"ListItemText\":\"Get-AzVHubOutboundRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubOutboundRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVHubRouteTable\",\"ListItemText\":\"Get-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualApplianceSite\",\"ListItemText\":\"Get-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHub\",\"ListItemText\":\"Get-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHubBgpConnection\",\"ListItemText\":\"Get-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHubRouteTable\",\"ListItemText\":\"Get-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHubVnetConnection\",\"ListItemText\":\"Get-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetwork\",\"ListItemText\":\"Get-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkAvailableEndpointService\",\"ListItemText\":\"Get-AzVirtualNetworkAvailableEndpointService\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkAvailableEndpointService\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGateway\",\"ListItemText\":\"Get-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayAdvertisedRoute\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayAdvertisedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayAdvertisedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayBgpPeerStatus\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayBgpPeerStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayBgpPeerStatus\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnectionIkeSa\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnectionIkeSa\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnectionIkeSa\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnectionSharedKey\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnectionSharedKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnectionSharedKey\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnectionVpnDeviceConfigScript\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnectionVpnDeviceConfigScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnectionVpnDeviceConfigScript\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayLearnedRoute\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayLearnedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayLearnedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewaySupportedVpnDevice\",\"ListItemText\":\"Get-AzVirtualNetworkGatewaySupportedVpnDevice\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewaySupportedVpnDevice\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayVpnclientConnectionHealth\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayVpnclientConnectionHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayVpnclientConnectionHealth\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkPeering\",\"ListItemText\":\"Get-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Get-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkTap\",\"ListItemText\":\"Get-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkUsageList\",\"ListItemText\":\"Get-AzVirtualNetworkUsageList\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkUsageList\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouter\",\"ListItemText\":\"Get-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouterPeer\",\"ListItemText\":\"Get-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouterPeerAdvertisedRoute\",\"ListItemText\":\"Get-AzVirtualRouterPeerAdvertisedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouterPeerAdvertisedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouterPeerLearnedRoute\",\"ListItemText\":\"Get-AzVirtualRouterPeerLearnedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouterPeerLearnedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWan\",\"ListItemText\":\"Get-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWanVpnConfiguration\",\"ListItemText\":\"Get-AzVirtualWanVpnConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWanVpnConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWanVpnServerConfiguration\",\"ListItemText\":\"Get-AzVirtualWanVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWanVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWanVpnServerConfigurationVpnProfile\",\"ListItemText\":\"Get-AzVirtualWanVpnServerConfigurationVpnProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWanVpnServerConfigurationVpnProfile\\r\\n\"},{\"CompletionText\":\"Get-AzVM\",\"ListItemText\":\"Get-AzVM\",\"ResultType\":2,\"ToolTip\":\"Get-AzVM\\r\\n\"},{\"CompletionText\":\"Get-AzVMAccessExtension\",\"ListItemText\":\"Get-AzVMAccessExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMAccessExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMADDomainExtension\",\"ListItemText\":\"Get-AzVMADDomainExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMADDomainExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMAEMExtension\",\"ListItemText\":\"Get-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMBootDiagnosticsData\",\"ListItemText\":\"Get-AzVMBootDiagnosticsData\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMBootDiagnosticsData\\r\\n\"},{\"CompletionText\":\"Get-AzVMChefExtension\",\"ListItemText\":\"Get-AzVMChefExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMChefExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMCustomScriptExtension\",\"ListItemText\":\"Get-AzVMCustomScriptExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMCustomScriptExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMDiagnosticsExtension\",\"ListItemText\":\"Get-AzVMDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMDiskEncryptionStatus\",\"ListItemText\":\"Get-AzVMDiskEncryptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDiskEncryptionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzVMDscExtension\",\"ListItemText\":\"Get-AzVMDscExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDscExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMDscExtensionStatus\",\"ListItemText\":\"Get-AzVMDscExtensionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDscExtensionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzVMExtension\",\"ListItemText\":\"Get-AzVMExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMExtensionImage\",\"ListItemText\":\"Get-AzVMExtensionImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMExtensionImage\\r\\n\"},{\"CompletionText\":\"Get-AzVMExtensionImageType\",\"ListItemText\":\"Get-AzVMExtensionImageType\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMExtensionImageType\\r\\n\"},{\"CompletionText\":\"Get-AzVMImage\",\"ListItemText\":\"Get-AzVMImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImage\\r\\n\"},{\"CompletionText\":\"Get-AzVMImageOffer\",\"ListItemText\":\"Get-AzVMImageOffer\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImageOffer\\r\\n\"},{\"CompletionText\":\"Get-AzVMImagePublisher\",\"ListItemText\":\"Get-AzVMImagePublisher\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImagePublisher\\r\\n\"},{\"CompletionText\":\"Get-AzVMImageSku\",\"ListItemText\":\"Get-AzVMImageSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImageSku\\r\\n\"},{\"CompletionText\":\"Get-AzVMRunCommand\",\"ListItemText\":\"Get-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMRunCommand\\r\\n\"},{\"CompletionText\":\"Get-AzVMRunCommandDocument\",\"ListItemText\":\"Get-AzVMRunCommandDocument\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMRunCommandDocument\\r\\n\"},{\"CompletionText\":\"Get-AzVMSize\",\"ListItemText\":\"Get-AzVMSize\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMSize\\r\\n\"},{\"CompletionText\":\"Get-AzVMSqlServerExtension\",\"ListItemText\":\"Get-AzVMSqlServerExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMSqlServerExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVmss\",\"ListItemText\":\"Get-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmss\\r\\n\"},{\"CompletionText\":\"Get-AzVmssDiskEncryption\",\"ListItemText\":\"Get-AzVmssDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssDiskEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzVmssDiskEncryptionStatus\",\"ListItemText\":\"Get-AzVmssDiskEncryptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssDiskEncryptionStatus\"},{\"CompletionText\":\"Get-AzVmssRollingUpgrade\",\"ListItemText\":\"Get-AzVmssRollingUpgrade\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssRollingUpgrade\\r\\n\"},{\"CompletionText\":\"Get-AzVmssSku\",\"ListItemText\":\"Get-AzVmssSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssSku\\r\\n\"},{\"CompletionText\":\"Get-AzVmssVM\",\"ListItemText\":\"Get-AzVmssVM\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVM\\r\\n\"},{\"CompletionText\":\"Get-AzVmssVMDiskEncryption\",\"ListItemText\":\"Get-AzVmssVMDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVMDiskEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzVmssVMDiskEncryptionStatus\",\"ListItemText\":\"Get-AzVmssVMDiskEncryptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVMDiskEncryptionStatus\"},{\"CompletionText\":\"Get-AzVmssVMRunCommand\",\"ListItemText\":\"Get-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVMRunCommand\\r\\n\"},{\"CompletionText\":\"Get-AzVMUsage\",\"ListItemText\":\"Get-AzVMUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMUsage\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientConfiguration\",\"ListItemText\":\"Get-AzVpnClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientIpsecParameter\",\"ListItemText\":\"Get-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientPackage\",\"ListItemText\":\"Get-AzVpnClientPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientPackage\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientRevokedCertificate\",\"ListItemText\":\"Get-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientRootCertificate\",\"ListItemText\":\"Get-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzVpnConnection\",\"ListItemText\":\"Get-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVpnGateway\",\"ListItemText\":\"Get-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Get-AzVpnGatewayNatRule\",\"ListItemText\":\"Get-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Get-AzVpnServerConfiguration\",\"ListItemText\":\"Get-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"Get-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"Get-AzVpnSite\",\"ListItemText\":\"Get-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnSite\\r\\n\"},{\"CompletionText\":\"Get-AzVpnSiteLinkConnectionIkeSa\",\"ListItemText\":\"Get-AzVpnSiteLinkConnectionIkeSa\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnSiteLinkConnectionIkeSa\\r\\n\"},{\"CompletionText\":\"Get-AzWcfRelay\",\"ListItemText\":\"Get-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"Get-AzWebApp\",\"ListItemText\":\"Get-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebApp\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppAccessRestrictionConfig\",\"ListItemText\":\"Get-AzWebAppAccessRestrictionConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppAccessRestrictionConfig\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppBackup\",\"ListItemText\":\"Get-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppBackupConfiguration\",\"ListItemText\":\"Get-AzWebAppBackupConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppBackupConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppBackupList\",\"ListItemText\":\"Get-AzWebAppBackupList\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppBackupList\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppCertificate\",\"ListItemText\":\"Get-AzWebAppCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppContainerContinuousDeploymentUrl\",\"ListItemText\":\"Get-AzWebAppContainerContinuousDeploymentUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppContainerContinuousDeploymentUrl\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppContinuousWebJob\",\"ListItemText\":\"Get-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppPublishingProfile\",\"ListItemText\":\"Get-AzWebAppPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppPublishingProfile\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlot\",\"ListItemText\":\"Get-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotConfigName\",\"ListItemText\":\"Get-AzWebAppSlotConfigName\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSlotConfigName\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Get-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotPublishingProfile\",\"ListItemText\":\"Get-AzWebAppSlotPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSlotPublishingProfile\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotTriggeredWebJob\",\"ListItemText\":\"Get-AzWebAppSlotTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotTriggeredWebJobHistory\",\"ListItemText\":\"Get-AzWebAppSlotTriggeredWebJobHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotTriggeredWebJobHistory \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotWebJob\",\"ListItemText\":\"Get-AzWebAppSlotWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSnapshot\",\"ListItemText\":\"Get-AzWebAppSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSnapshot\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSSLBinding\",\"ListItemText\":\"Get-AzWebAppSSLBinding\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSSLBinding\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppTrafficRouting\",\"ListItemText\":\"Get-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppTriggeredWebJob\",\"ListItemText\":\"Get-AzWebAppTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppTriggeredWebJobHistory\",\"ListItemText\":\"Get-AzWebAppTriggeredWebJobHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppTriggeredWebJobHistory \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppWebJob\",\"ListItemText\":\"Get-AzWebAppWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSub\",\"ListItemText\":\"Get-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubCustomCertificate\",\"ListItemText\":\"Get-AzWebPubSubCustomCertificate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubCustomCertificate \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubCustomDomain\",\"ListItemText\":\"Get-AzWebPubSubCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubHub\",\"ListItemText\":\"Get-AzWebPubSubHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubHub \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubKey\",\"ListItemText\":\"Get-AzWebPubSubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubKey \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubSku\",\"ListItemText\":\"Get-AzWebPubSubSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubSku \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubUsage\",\"ListItemText\":\"Get-AzWebPubSubUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubUsage \\r\\n\"},{\"CompletionText\":\"Get-AzWvdApplication\",\"ListItemText\":\"Get-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"Get-AzWvdApplicationGroup\",\"ListItemText\":\"Get-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Get-AzWvdDesktop\",\"ListItemText\":\"Get-AzWvdDesktop\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdDesktop \\r\\n\"},{\"CompletionText\":\"Get-AzWvdHostPool\",\"ListItemText\":\"Get-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"Get-AzWvdHostPoolRegistrationToken\",\"ListItemText\":\"Get-AzWvdHostPoolRegistrationToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdHostPoolRegistrationToken \\r\\n\"},{\"CompletionText\":\"Get-AzWvdMsixPackage\",\"ListItemText\":\"Get-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"Get-AzWvdRegistrationInfo\",\"ListItemText\":\"Get-AzWvdRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdRegistrationInfo \\r\\n\"},{\"CompletionText\":\"Get-AzWvdScalingPlan\",\"ListItemText\":\"Get-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"Get-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"Get-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"Get-AzWvdSessionHost\",\"ListItemText\":\"Get-AzWvdSessionHost\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdSessionHost \\r\\n\"},{\"CompletionText\":\"Get-AzWvdStartMenuItem\",\"ListItemText\":\"Get-AzWvdStartMenuItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdStartMenuItem \\r\\n\"},{\"CompletionText\":\"Get-AzWvdUserSession\",\"ListItemText\":\"Get-AzWvdUserSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdUserSession \\r\\n\"},{\"CompletionText\":\"Get-AzWvdWorkspace\",\"ListItemText\":\"Get-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"Get-BCClientConfiguration\",\"ListItemText\":\"Get-BCClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCClientConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCContentServerConfiguration\",\"ListItemText\":\"Get-BCContentServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCContentServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCDataCache\",\"ListItemText\":\"Get-BCDataCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCDataCache \\r\\n\"},{\"CompletionText\":\"Get-BCDataCacheExtension\",\"ListItemText\":\"Get-BCDataCacheExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCDataCacheExtension \\r\\n\"},{\"CompletionText\":\"Get-BcdEntry\",\"ListItemText\":\"Get-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"Get-BcdEntry\\r\\n\"},{\"CompletionText\":\"Get-BcdEntryDebugSettings\",\"ListItemText\":\"Get-BcdEntryDebugSettings\",\"ResultType\":2,\"ToolTip\":\"Get-BcdEntryDebugSettings\\r\\n\"},{\"CompletionText\":\"Get-BcdEntryHypervisorSettings\",\"ListItemText\":\"Get-BcdEntryHypervisorSettings\",\"ResultType\":2,\"ToolTip\":\"Get-BcdEntryHypervisorSettings\\r\\n\"},{\"CompletionText\":\"Get-BcdStore\",\"ListItemText\":\"Get-BcdStore\",\"ResultType\":2,\"ToolTip\":\"Get-BcdStore\\r\\n\"},{\"CompletionText\":\"Get-BCHashCache\",\"ListItemText\":\"Get-BCHashCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCHashCache \\r\\n\"},{\"CompletionText\":\"Get-BCHostedCacheServerConfiguration\",\"ListItemText\":\"Get-BCHostedCacheServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCHostedCacheServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCNetworkConfiguration\",\"ListItemText\":\"Get-BCNetworkConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCNetworkConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCStatus\",\"ListItemText\":\"Get-BCStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCStatus \\r\\n\"},{\"CompletionText\":\"Get-BitLockerVolume\",\"ListItemText\":\"Get-BitLockerVolume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BitLockerVolume \\r\\n\"},{\"CompletionText\":\"Get-BitsTransfer\",\"ListItemText\":\"Get-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Get-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Get-Certificate\",\"ListItemText\":\"Get-Certificate\",\"ResultType\":2,\"ToolTip\":\"Get-Certificate\\r\\n\"},{\"CompletionText\":\"Get-CertificateAutoEnrollmentPolicy\",\"ListItemText\":\"Get-CertificateAutoEnrollmentPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-CertificateAutoEnrollmentPolicy\\r\\n\"},{\"CompletionText\":\"Get-CertificateEnrollmentPolicyServer\",\"ListItemText\":\"Get-CertificateEnrollmentPolicyServer\",\"ResultType\":2,\"ToolTip\":\"Get-CertificateEnrollmentPolicyServer\\r\\n\"},{\"CompletionText\":\"Get-CertificateNotificationTask\",\"ListItemText\":\"Get-CertificateNotificationTask\",\"ResultType\":2,\"ToolTip\":\"Get-CertificateNotificationTask\\r\\n\"},{\"CompletionText\":\"Get-ChildItem\",\"ListItemText\":\"Get-ChildItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ChildItem [[-Path] ] [[-Filter] ] [-Include ] [-Exclude ] [-Recurse] [-Depth ] [-Force] [-Name] [-Attributes ] [-FollowSymlink] [-Directory] [-File] [-Hidden] [-ReadOnly] [-System] []\\r\\n\\r\\nGet-ChildItem [[-Filter] ] -LiteralPath [-Include ] [-Exclude ] [-Recurse] [-Depth ] [-Force] [-Name] [-Attributes ] [-FollowSymlink] [-Directory] [-File] [-Hidden] [-ReadOnly] [-System] []\\r\\n\"},{\"CompletionText\":\"Get-CimAssociatedInstance\",\"ListItemText\":\"Get-CimAssociatedInstance\",\"ResultType\":2,\"ToolTip\":\"Get-CimAssociatedInstance\\r\\n\"},{\"CompletionText\":\"Get-CimClass\",\"ListItemText\":\"Get-CimClass\",\"ResultType\":2,\"ToolTip\":\"Get-CimClass\\r\\n\"},{\"CompletionText\":\"Get-CimInstance\",\"ListItemText\":\"Get-CimInstance\",\"ResultType\":2,\"ToolTip\":\"Get-CimInstance\\r\\n\"},{\"CompletionText\":\"Get-CimSession\",\"ListItemText\":\"Get-CimSession\",\"ResultType\":2,\"ToolTip\":\"Get-CimSession\\r\\n\"},{\"CompletionText\":\"Get-CIPolicy\",\"ListItemText\":\"Get-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-CIPolicy\\r\\n\"},{\"CompletionText\":\"Get-CIPolicyIdInfo\",\"ListItemText\":\"Get-CIPolicyIdInfo\",\"ResultType\":2,\"ToolTip\":\"Get-CIPolicyIdInfo\\r\\n\"},{\"CompletionText\":\"Get-CIPolicyInfo\",\"ListItemText\":\"Get-CIPolicyInfo\",\"ResultType\":2,\"ToolTip\":\"Get-CIPolicyInfo\\r\\n\"},{\"CompletionText\":\"Get-Clipboard\",\"ListItemText\":\"Get-Clipboard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Clipboard [-Raw] []\\r\\n\"},{\"CompletionText\":\"Get-ClusteredScheduledTask\",\"ListItemText\":\"Get-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Get-CmsMessage\",\"ListItemText\":\"Get-CmsMessage\",\"ResultType\":2,\"ToolTip\":\"Get-CmsMessage\\r\\n\"},{\"CompletionText\":\"Get-Command\",\"ListItemText\":\"Get-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Command [[-ArgumentList] ] [-Verb ] [-Noun ] [-Module ] [-FullyQualifiedModule ] [-TotalCount ] [-Syntax] [-ShowCommandInfo] [-All] [-ListImported] [-ParameterName ] [-ParameterType ] []\\r\\n\\r\\nGet-Command [[-Name] ] [[-ArgumentList] ] [-Module ] [-FullyQualifiedModule ] [-CommandType ] [-TotalCount ] [-Syntax] [-ShowCommandInfo] [-All] [-ListImported] [-ParameterName ] [-ParameterType ] [-UseFuzzyMatching] [-FuzzyMinimumDistance ] [-UseAbbreviationExpansion] []\\r\\n\"},{\"CompletionText\":\"Get-ComputeProcess\",\"ListItemText\":\"Get-ComputeProcess\",\"ResultType\":2,\"ToolTip\":\"Get-ComputeProcess\\r\\n\"},{\"CompletionText\":\"Get-ComputerInfo\",\"ListItemText\":\"Get-ComputerInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ComputerInfo [[-Property] ] []\\r\\n\"},{\"CompletionText\":\"Get-Content\",\"ListItemText\":\"Get-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Content [-Path] [-ReadCount ] [-TotalCount ] [-Tail ] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Delimiter ] [-Wait] [-Raw] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\\r\\nGet-Content -LiteralPath [-ReadCount ] [-TotalCount ] [-Tail ] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Delimiter ] [-Wait] [-Raw] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Get-Counter\",\"ListItemText\":\"Get-Counter\",\"ResultType\":2,\"ToolTip\":\"Get-Counter\\r\\n\"},{\"CompletionText\":\"Get-Credential\",\"ListItemText\":\"Get-Credential\",\"ResultType\":2,\"ToolTip\":\"Get-Credential\\r\\n\"},{\"CompletionText\":\"Get-CredsFromCredentialProvider\",\"ListItemText\":\"Get-CredsFromCredentialProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-CredsFromCredentialProvider \\r\\n\"},{\"CompletionText\":\"Get-Culture\",\"ListItemText\":\"Get-Culture\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Culture [-NoUserOverrides] []\\r\\n\\r\\nGet-Culture [[-Name] ] [-NoUserOverrides] []\\r\\n\\r\\nGet-Culture [-ListAvailable] []\\r\\n\"},{\"CompletionText\":\"Get-DAClientExperienceConfiguration\",\"ListItemText\":\"Get-DAClientExperienceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DAClientExperienceConfiguration \\r\\n\"},{\"CompletionText\":\"Get-DAConnectionStatus\",\"ListItemText\":\"Get-DAConnectionStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DAConnectionStatus \\r\\n\"},{\"CompletionText\":\"Get-DAEntryPointTableItem\",\"ListItemText\":\"Get-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Get-DAPolicyChange\",\"ListItemText\":\"Get-DAPolicyChange\",\"ResultType\":2,\"ToolTip\":\"Get-DAPolicyChange\\r\\n\"},{\"CompletionText\":\"Get-Date\",\"ListItemText\":\"Get-Date\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Date [[-Date] ] [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-Format ] [-AsUTC] []\\r\\n\\r\\nGet-Date [[-Date] ] -UFormat [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-AsUTC] []\\r\\n\\r\\nGet-Date -UnixTimeSeconds [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-Format ] [-AsUTC] []\\r\\n\\r\\nGet-Date -UnixTimeSeconds -UFormat [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-AsUTC] []\\r\\n\"},{\"CompletionText\":\"Get-DedupProperties\",\"ListItemText\":\"Get-DedupProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DedupProperties \\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationLog\",\"ListItemText\":\"Get-DeliveryOptimizationLog\",\"ResultType\":2,\"ToolTip\":\"Get-DeliveryOptimizationLog\\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationLogAnalysis\",\"ListItemText\":\"Get-DeliveryOptimizationLogAnalysis\",\"ResultType\":2,\"ToolTip\":\"Get-DeliveryOptimizationLogAnalysis\\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationPerfSnap\",\"ListItemText\":\"Get-DeliveryOptimizationPerfSnap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DeliveryOptimizationPerfSnap \\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationPerfSnapThisMonth\",\"ListItemText\":\"Get-DeliveryOptimizationPerfSnapThisMonth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DeliveryOptimizationPerfSnapThisMonth \\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationStatus\",\"ListItemText\":\"Get-DeliveryOptimizationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DeliveryOptimizationStatus \\r\\n\"},{\"CompletionText\":\"Get-Disk\",\"ListItemText\":\"Get-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Disk \\r\\n\"},{\"CompletionText\":\"Get-DiskImage\",\"ListItemText\":\"Get-DiskImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DiskImage \\r\\n\"},{\"CompletionText\":\"Get-DiskSNV\",\"ListItemText\":\"Get-DiskSNV\",\"ResultType\":2,\"ToolTip\":\"Get-DiskSNV\"},{\"CompletionText\":\"Get-DiskStorageNodeView\",\"ListItemText\":\"Get-DiskStorageNodeView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DiskStorageNodeView \\r\\n\"},{\"CompletionText\":\"Get-DnsClient\",\"ListItemText\":\"Get-DnsClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClient \\r\\n\"},{\"CompletionText\":\"Get-DnsClientCache\",\"ListItemText\":\"Get-DnsClientCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientCache \\r\\n\"},{\"CompletionText\":\"Get-DnsClientDohServerAddress\",\"ListItemText\":\"Get-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Get-DnsClientGlobalSetting\",\"ListItemText\":\"Get-DnsClientGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientGlobalSetting \\r\\n\"},{\"CompletionText\":\"Get-DnsClientNrptGlobal\",\"ListItemText\":\"Get-DnsClientNrptGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientNrptGlobal \\r\\n\"},{\"CompletionText\":\"Get-DnsClientNrptPolicy\",\"ListItemText\":\"Get-DnsClientNrptPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientNrptPolicy \\r\\n\"},{\"CompletionText\":\"Get-DnsClientNrptRule\",\"ListItemText\":\"Get-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Get-DnsClientServerAddress\",\"ListItemText\":\"Get-DnsClientServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientServerAddress \\r\\n\"},{\"CompletionText\":\"Get-DOConfig\",\"ListItemText\":\"Get-DOConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DOConfig \\r\\n\"},{\"CompletionText\":\"Get-DODownloadMode\",\"ListItemText\":\"Get-DODownloadMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DODownloadMode \\r\\n\"},{\"CompletionText\":\"Get-DOPercentageMaxBackgroundBandwidth\",\"ListItemText\":\"Get-DOPercentageMaxBackgroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DOPercentageMaxBackgroundBandwidth \\r\\n\"},{\"CompletionText\":\"Get-DOPercentageMaxForegroundBandwidth\",\"ListItemText\":\"Get-DOPercentageMaxForegroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DOPercentageMaxForegroundBandwidth \\r\\n\"},{\"CompletionText\":\"Get-DscConfiguration\",\"ListItemText\":\"Get-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Get-DscConfigurationStatus\",\"ListItemText\":\"Get-DscConfigurationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscConfigurationStatus \\r\\n\"},{\"CompletionText\":\"Get-DscLocalConfigurationManager\",\"ListItemText\":\"Get-DscLocalConfigurationManager\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscLocalConfigurationManager \\r\\n\"},{\"CompletionText\":\"Get-DscResource\",\"ListItemText\":\"Get-DscResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscResource \\r\\n\"},{\"CompletionText\":\"Get-Dtc\",\"ListItemText\":\"Get-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Dtc \\r\\n\"},{\"CompletionText\":\"Get-DtcAdvancedHostSetting\",\"ListItemText\":\"Get-DtcAdvancedHostSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcAdvancedHostSetting \\r\\n\"},{\"CompletionText\":\"Get-DtcAdvancedSetting\",\"ListItemText\":\"Get-DtcAdvancedSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcAdvancedSetting \\r\\n\"},{\"CompletionText\":\"Get-DtcClusterDefault\",\"ListItemText\":\"Get-DtcClusterDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcClusterDefault \\r\\n\"},{\"CompletionText\":\"Get-DtcClusterTMMapping\",\"ListItemText\":\"Get-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Get-DtcDefault\",\"ListItemText\":\"Get-DtcDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcDefault \\r\\n\"},{\"CompletionText\":\"Get-DtcLog\",\"ListItemText\":\"Get-DtcLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcLog \\r\\n\"},{\"CompletionText\":\"Get-DtcNetworkSetting\",\"ListItemText\":\"Get-DtcNetworkSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcNetworkSetting \\r\\n\"},{\"CompletionText\":\"Get-DtcTransaction\",\"ListItemText\":\"Get-DtcTransaction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransaction \\r\\n\"},{\"CompletionText\":\"Get-DtcTransactionsStatistics\",\"ListItemText\":\"Get-DtcTransactionsStatistics\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransactionsStatistics \\r\\n\"},{\"CompletionText\":\"Get-DtcTransactionsTraceSession\",\"ListItemText\":\"Get-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Get-DtcTransactionsTraceSetting\",\"ListItemText\":\"Get-DtcTransactionsTraceSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransactionsTraceSetting \\r\\n\"},{\"CompletionText\":\"Get-Error\",\"ListItemText\":\"Get-Error\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Error [-Newest ] []\\r\\n\\r\\nGet-Error [[-InputObject] ] []\\r\\n\"},{\"CompletionText\":\"Get-EtwTraceProvider\",\"ListItemText\":\"Get-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Get-EtwTraceSession\",\"ListItemText\":\"Get-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Get-Event\",\"ListItemText\":\"Get-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Event [[-SourceIdentifier] ] []\\r\\n\\r\\nGet-Event [-EventIdentifier] []\\r\\n\"},{\"CompletionText\":\"Get-EventSubscriber\",\"ListItemText\":\"Get-EventSubscriber\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-EventSubscriber [[-SourceIdentifier] ] [-Force] []\\r\\n\\r\\nGet-EventSubscriber [-SubscriptionId] [-Force] []\\r\\n\"},{\"CompletionText\":\"Get-ExecutionPolicy\",\"ListItemText\":\"Get-ExecutionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-ExecutionPolicy\\r\\n\"},{\"CompletionText\":\"Get-ExperimentalFeature\",\"ListItemText\":\"Get-ExperimentalFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ExperimentalFeature [[-Name] ] []\\r\\n\"},{\"CompletionText\":\"Get-FileHash\",\"ListItemText\":\"Get-FileHash\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileHash [-Path] [[-Algorithm] ] []\\r\\n\\r\\nGet-FileHash [-LiteralPath] [[-Algorithm] ] []\\r\\n\\r\\nGet-FileHash [-InputStream] [[-Algorithm] ] []\\r\\n\"},{\"CompletionText\":\"Get-FileIntegrity\",\"ListItemText\":\"Get-FileIntegrity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileIntegrity \\r\\n\"},{\"CompletionText\":\"Get-FileShare\",\"ListItemText\":\"Get-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileShare \\r\\n\"},{\"CompletionText\":\"Get-FileShareAccessControlEntry\",\"ListItemText\":\"Get-FileShareAccessControlEntry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileShareAccessControlEntry \\r\\n\"},{\"CompletionText\":\"Get-FileStorageTier\",\"ListItemText\":\"Get-FileStorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileStorageTier \\r\\n\"},{\"CompletionText\":\"Get-FormatData\",\"ListItemText\":\"Get-FormatData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FormatData [[-TypeName] ] [-PowerShellVersion ] []\\r\\n\"},{\"CompletionText\":\"Get-GitBranchStatusColor\",\"ListItemText\":\"Get-GitBranchStatusColor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-GitBranchStatusColor \\r\\n\"},{\"CompletionText\":\"Get-GitDirectory\",\"ListItemText\":\"Get-GitDirectory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-GitDirectory \\r\\n\"},{\"CompletionText\":\"Get-GitStatus\",\"ListItemText\":\"Get-GitStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-GitStatus \\r\\n\"},{\"CompletionText\":\"Get-Help\",\"ListItemText\":\"Get-Help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Help [[-Name] ] [-Path ] [-Category ] [-Full] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Detailed [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Examples [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Parameter [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Online [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -ShowWindow [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\"},{\"CompletionText\":\"Get-HgsAttestationBaselinePolicy\",\"ListItemText\":\"Get-HgsAttestationBaselinePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-HgsAttestationBaselinePolicy\\r\\n\"},{\"CompletionText\":\"Get-HgsClientConfiguration\",\"ListItemText\":\"Get-HgsClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HgsClientConfiguration \\r\\n\"},{\"CompletionText\":\"Get-HgsClientHostKey\",\"ListItemText\":\"Get-HgsClientHostKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HgsClientHostKey \\r\\n\"},{\"CompletionText\":\"Get-HgsGuardian\",\"ListItemText\":\"Get-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Get-HgsTrace\",\"ListItemText\":\"Get-HgsTrace\",\"ResultType\":2,\"ToolTip\":\"Get-HgsTrace\\r\\n\"},{\"CompletionText\":\"Get-HgsTraceFileData\",\"ListItemText\":\"Get-HgsTraceFileData\",\"ResultType\":2,\"ToolTip\":\"Get-HgsTraceFileData\\r\\n\"},{\"CompletionText\":\"Get-History\",\"ListItemText\":\"Get-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-History [[-Id] ] [[-Count] ] []\\r\\n\"},{\"CompletionText\":\"Get-HnsEndpoint\",\"ListItemText\":\"Get-HnsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsEndpoint \\r\\n\"},{\"CompletionText\":\"Get-HnsEndpointAddresses\",\"ListItemText\":\"Get-HnsEndpointAddresses\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsEndpointAddresses \\r\\n\"},{\"CompletionText\":\"Get-HnsEndpointStats\",\"ListItemText\":\"Get-HnsEndpointStats\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsEndpointStats \\r\\n\"},{\"CompletionText\":\"Get-HnsNamespace\",\"ListItemText\":\"Get-HnsNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsNamespace \\r\\n\"},{\"CompletionText\":\"Get-HnsNetwork\",\"ListItemText\":\"Get-HnsNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsNetwork \\r\\n\"},{\"CompletionText\":\"Get-HnsPolicyList\",\"ListItemText\":\"Get-HnsPolicyList\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsPolicyList \\r\\n\"},{\"CompletionText\":\"Get-Host\",\"ListItemText\":\"Get-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Host []\\r\\n\"},{\"CompletionText\":\"Get-HotFix\",\"ListItemText\":\"Get-HotFix\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HotFix [[-Id] ] [-ComputerName ] [-Credential ] []\\r\\n\\r\\nGet-HotFix [-Description ] [-ComputerName ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Get-InitiatorId\",\"ListItemText\":\"Get-InitiatorId\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InitiatorId \\r\\n\"},{\"CompletionText\":\"Get-InitiatorPort\",\"ListItemText\":\"Get-InitiatorPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InitiatorPort \\r\\n\"},{\"CompletionText\":\"Get-InstalledLanguage\",\"ListItemText\":\"Get-InstalledLanguage\",\"ResultType\":2,\"ToolTip\":\"Get-InstalledLanguage\\r\\n\"},{\"CompletionText\":\"Get-InstalledModule\",\"ListItemText\":\"Get-InstalledModule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledModule \\r\\n\"},{\"CompletionText\":\"Get-InstalledPSResource\",\"ListItemText\":\"Get-InstalledPSResource\",\"ResultType\":2,\"ToolTip\":\"Get-InstalledPSResource\\r\\n\"},{\"CompletionText\":\"Get-InstalledScript\",\"ListItemText\":\"Get-InstalledScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledScript \\r\\n\"},{\"CompletionText\":\"Get-IscsiConnection\",\"ListItemText\":\"Get-IscsiConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiConnection \\r\\n\"},{\"CompletionText\":\"Get-IscsiSession\",\"ListItemText\":\"Get-IscsiSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiSession \\r\\n\"},{\"CompletionText\":\"Get-IscsiTarget\",\"ListItemText\":\"Get-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Get-IscsiTargetPortal\",\"ListItemText\":\"Get-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"Get-IseSnippet\",\"ListItemText\":\"Get-IseSnippet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IseSnippet \\r\\n\"},{\"CompletionText\":\"Get-Item\",\"ListItemText\":\"Get-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Item [-Path] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Stream ] []\\r\\n\\r\\nGet-Item -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Get-ItemProperty\",\"ListItemText\":\"Get-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ItemProperty [-Path] [[-Name] ] [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\\r\\nGet-ItemProperty [[-Name] ] -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Get-ItemPropertyValue\",\"ListItemText\":\"Get-ItemPropertyValue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ItemPropertyValue [[-Path] ] [-Name] [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\\r\\nGet-ItemPropertyValue [-Name] -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Get-Job\",\"ListItemText\":\"Get-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Job [[-Id] ] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-InstanceId] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-Name] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-State] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] [-Command ] []\\r\\n\\r\\nGet-Job [-Filter] []\\r\\n\"},{\"CompletionText\":\"Get-JobTrigger\",\"ListItemText\":\"Get-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-JobTrigger\\r\\n\"},{\"CompletionText\":\"Get-KdsConfiguration\",\"ListItemText\":\"Get-KdsConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-KdsConfiguration\\r\\n\"},{\"CompletionText\":\"Get-KdsRootKey\",\"ListItemText\":\"Get-KdsRootKey\",\"ResultType\":2,\"ToolTip\":\"Get-KdsRootKey\\r\\n\"},{\"CompletionText\":\"Get-Language\",\"ListItemText\":\"Get-Language\",\"ResultType\":2,\"ToolTip\":\"Get-Language\"},{\"CompletionText\":\"Get-LapsAADPassword\",\"ListItemText\":\"Get-LapsAADPassword\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LapsAADPassword \\r\\n\"},{\"CompletionText\":\"Get-LapsADPassword\",\"ListItemText\":\"Get-LapsADPassword\",\"ResultType\":2,\"ToolTip\":\"Get-LapsADPassword\\r\\n\"},{\"CompletionText\":\"Get-LapsDiagnostics\",\"ListItemText\":\"Get-LapsDiagnostics\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LapsDiagnostics \\r\\n\"},{\"CompletionText\":\"Get-LocalGroup\",\"ListItemText\":\"Get-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Get-LocalGroup\\r\\n\"},{\"CompletionText\":\"Get-LocalGroupMember\",\"ListItemText\":\"Get-LocalGroupMember\",\"ResultType\":2,\"ToolTip\":\"Get-LocalGroupMember\\r\\n\"},{\"CompletionText\":\"Get-LocalUser\",\"ListItemText\":\"Get-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Get-LocalUser\\r\\n\"},{\"CompletionText\":\"Get-Location\",\"ListItemText\":\"Get-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Location [-PSProvider ] [-PSDrive ] []\\r\\n\\r\\nGet-Location [-Stack] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"Get-LogProperties\",\"ListItemText\":\"Get-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LogProperties \\r\\n\"},{\"CompletionText\":\"Get-MarkdownOption\",\"ListItemText\":\"Get-MarkdownOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MarkdownOption []\\r\\n\"},{\"CompletionText\":\"Get-MaskingSet\",\"ListItemText\":\"Get-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MaskingSet \\r\\n\"},{\"CompletionText\":\"Get-Member\",\"ListItemText\":\"Get-Member\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Member [[-Name] ] [-InputObject ] [-MemberType ] [-View ] [-Static] [-Force] []\\r\\n\"},{\"CompletionText\":\"Get-MMAgent\",\"ListItemText\":\"Get-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MMAgent \\r\\n\"},{\"CompletionText\":\"Get-MockDynamicParameters\",\"ListItemText\":\"Get-MockDynamicParameters\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MockDynamicParameters \\r\\n\"},{\"CompletionText\":\"Get-Module\",\"ListItemText\":\"Get-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Module [[-Name] ] [-FullyQualifiedName ] [-All] []\\r\\n\\r\\nGet-Module [[-Name] ] -ListAvailable [-FullyQualifiedName ] [-All] [-PSEdition ] [-SkipEditionCheck] [-Refresh] []\\r\\n\\r\\nGet-Module [[-Name] ] -PSSession [-FullyQualifiedName ] [-ListAvailable] [-PSEdition ] [-SkipEditionCheck] [-Refresh] []\\r\\n\\r\\nGet-Module [[-Name] ] -CimSession [-FullyQualifiedName ] [-ListAvailable] [-SkipEditionCheck] [-Refresh] [-CimResourceUri ] [-CimNamespace ] []\\r\\n\"},{\"CompletionText\":\"Get-MpComputerStatus\",\"ListItemText\":\"Get-MpComputerStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpComputerStatus \\r\\n\"},{\"CompletionText\":\"Get-MpPerformanceReport\",\"ListItemText\":\"Get-MpPerformanceReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPerformanceReport \\r\\n\"},{\"CompletionText\":\"Get-MpPreference\",\"ListItemText\":\"Get-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPreference \\r\\n\"},{\"CompletionText\":\"Get-MpThreat\",\"ListItemText\":\"Get-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreat \\r\\n\"},{\"CompletionText\":\"Get-MpThreatCatalog\",\"ListItemText\":\"Get-MpThreatCatalog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatCatalog \\r\\n\"},{\"CompletionText\":\"Get-MpThreatDetection\",\"ListItemText\":\"Get-MpThreatDetection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatDetection \\r\\n\"},{\"CompletionText\":\"Get-NCSIPolicyConfiguration\",\"ListItemText\":\"Get-NCSIPolicyConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NCSIPolicyConfiguration \\r\\n\"},{\"CompletionText\":\"Get-Net6to4Configuration\",\"ListItemText\":\"Get-Net6to4Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Net6to4Configuration \\r\\n\"},{\"CompletionText\":\"Get-NetAdapter\",\"ListItemText\":\"Get-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapter \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterAdvancedProperty\",\"ListItemText\":\"Get-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterBinding\",\"ListItemText\":\"Get-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterChecksumOffload\",\"ListItemText\":\"Get-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterDataPathConfiguration\",\"ListItemText\":\"Get-NetAdapterDataPathConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterDataPathConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Get-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterHardwareInfo\",\"ListItemText\":\"Get-NetAdapterHardwareInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterHardwareInfo \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterIPsecOffload\",\"ListItemText\":\"Get-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterLso\",\"ListItemText\":\"Get-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterPacketDirect\",\"ListItemText\":\"Get-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterPowerManagement\",\"ListItemText\":\"Get-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterQos\",\"ListItemText\":\"Get-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterRdma\",\"ListItemText\":\"Get-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterRsc\",\"ListItemText\":\"Get-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterRss\",\"ListItemText\":\"Get-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterSriov\",\"ListItemText\":\"Get-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterSriovVf\",\"ListItemText\":\"Get-NetAdapterSriovVf\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterSriovVf \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterStatistics\",\"ListItemText\":\"Get-NetAdapterStatistics\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterStatistics \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterUso\",\"ListItemText\":\"Get-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterVmq\",\"ListItemText\":\"Get-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterVMQQueue\",\"ListItemText\":\"Get-NetAdapterVMQQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterVMQQueue \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterVPort\",\"ListItemText\":\"Get-NetAdapterVPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterVPort \\r\\n\"},{\"CompletionText\":\"Get-NetCompartment\",\"ListItemText\":\"Get-NetCompartment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetCompartment \\r\\n\"},{\"CompletionText\":\"Get-NetConnectionProfile\",\"ListItemText\":\"Get-NetConnectionProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetConnectionProfile \\r\\n\"},{\"CompletionText\":\"Get-NetDnsTransitionConfiguration\",\"ListItemText\":\"Get-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetDnsTransitionMonitoring\",\"ListItemText\":\"Get-NetDnsTransitionMonitoring\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetDnsTransitionMonitoring \\r\\n\"},{\"CompletionText\":\"Get-NetEventNetworkAdapter\",\"ListItemText\":\"Get-NetEventNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Get-NetEventPacketCaptureProvider\",\"ListItemText\":\"Get-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventProvider\",\"ListItemText\":\"Get-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventSession\",\"ListItemText\":\"Get-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventSession \\r\\n\"},{\"CompletionText\":\"Get-NetEventVFPProvider\",\"ListItemText\":\"Get-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventVmNetworkAdapter\",\"ListItemText\":\"Get-NetEventVmNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVmNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Get-NetEventVmSwitch\",\"ListItemText\":\"Get-NetEventVmSwitch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVmSwitch \\r\\n\"},{\"CompletionText\":\"Get-NetEventVmSwitchProvider\",\"ListItemText\":\"Get-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventWFPCaptureProvider\",\"ListItemText\":\"Get-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallAddressFilter\",\"ListItemText\":\"Get-NetFirewallAddressFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallAddressFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallApplicationFilter\",\"ListItemText\":\"Get-NetFirewallApplicationFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallApplicationFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"Get-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVPort\",\"ListItemText\":\"Get-NetFirewallHyperVPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVPort \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVProfile\",\"ListItemText\":\"Get-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVRule\",\"ListItemText\":\"Get-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVVMCreator\",\"ListItemText\":\"Get-NetFirewallHyperVVMCreator\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVVMCreator \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVVMSetting\",\"ListItemText\":\"Get-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallInterfaceFilter\",\"ListItemText\":\"Get-NetFirewallInterfaceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallInterfaceFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallInterfaceTypeFilter\",\"ListItemText\":\"Get-NetFirewallInterfaceTypeFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallInterfaceTypeFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallPortFilter\",\"ListItemText\":\"Get-NetFirewallPortFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallPortFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallProfile\",\"ListItemText\":\"Get-NetFirewallProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallProfile \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallRule\",\"ListItemText\":\"Get-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallSecurityFilter\",\"ListItemText\":\"Get-NetFirewallSecurityFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallSecurityFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallServiceFilter\",\"ListItemText\":\"Get-NetFirewallServiceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallServiceFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallSetting\",\"ListItemText\":\"Get-NetFirewallSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallSetting \\r\\n\"},{\"CompletionText\":\"Get-NetIPAddress\",\"ListItemText\":\"Get-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPAddress \\r\\n\"},{\"CompletionText\":\"Get-NetIPConfiguration\",\"ListItemText\":\"Get-NetIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetIPHttpsConfiguration\",\"ListItemText\":\"Get-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetIPHttpsState\",\"ListItemText\":\"Get-NetIPHttpsState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPHttpsState \\r\\n\"},{\"CompletionText\":\"Get-NetIPInterface\",\"ListItemText\":\"Get-NetIPInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPInterface \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecDospSetting\",\"ListItemText\":\"Get-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Get-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecMainModeRule\",\"ListItemText\":\"Get-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecMainModeSA\",\"ListItemText\":\"Get-NetIPsecMainModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecMainModeSA \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Get-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Get-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Get-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecQuickModeSA\",\"ListItemText\":\"Get-NetIPsecQuickModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecQuickModeSA \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecRule\",\"ListItemText\":\"Get-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Get-NetIPv4Protocol\",\"ListItemText\":\"Get-NetIPv4Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPv4Protocol \\r\\n\"},{\"CompletionText\":\"Get-NetIPv6Protocol\",\"ListItemText\":\"Get-NetIPv6Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPv6Protocol \\r\\n\"},{\"CompletionText\":\"Get-NetIsatapConfiguration\",\"ListItemText\":\"Get-NetIsatapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIsatapConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetLbfoTeam\",\"ListItemText\":\"Get-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Get-NetLbfoTeamMember\",\"ListItemText\":\"Get-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Get-NetLbfoTeamNic\",\"ListItemText\":\"Get-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Get-NetNat\",\"ListItemText\":\"Get-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNat \\r\\n\"},{\"CompletionText\":\"Get-NetNatExternalAddress\",\"ListItemText\":\"Get-NetNatExternalAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatExternalAddress \\r\\n\"},{\"CompletionText\":\"Get-NetNatGlobal\",\"ListItemText\":\"Get-NetNatGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatGlobal \\r\\n\"},{\"CompletionText\":\"Get-NetNatSession\",\"ListItemText\":\"Get-NetNatSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatSession \\r\\n\"},{\"CompletionText\":\"Get-NetNatStaticMapping\",\"ListItemText\":\"Get-NetNatStaticMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatStaticMapping \\r\\n\"},{\"CompletionText\":\"Get-NetNatTransitionConfiguration\",\"ListItemText\":\"Get-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetNatTransitionMonitoring\",\"ListItemText\":\"Get-NetNatTransitionMonitoring\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatTransitionMonitoring \\r\\n\"},{\"CompletionText\":\"Get-NetNeighbor\",\"ListItemText\":\"Get-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNeighbor \\r\\n\"},{\"CompletionText\":\"Get-NetOffloadGlobalSetting\",\"ListItemText\":\"Get-NetOffloadGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetOffloadGlobalSetting \\r\\n\"},{\"CompletionText\":\"Get-NetPrefixPolicy\",\"ListItemText\":\"Get-NetPrefixPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetPrefixPolicy \\r\\n\"},{\"CompletionText\":\"Get-NetQosPolicy\",\"ListItemText\":\"Get-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"Get-NetRoute\",\"ListItemText\":\"Get-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetRoute \\r\\n\"},{\"CompletionText\":\"Get-NetSwitchTeam\",\"ListItemText\":\"Get-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"Get-NetSwitchTeamMember\",\"ListItemText\":\"Get-NetSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetSwitchTeamMember \\r\\n\"},{\"CompletionText\":\"Get-NetTCPConnection\",\"ListItemText\":\"Get-NetTCPConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTCPConnection \\r\\n\"},{\"CompletionText\":\"Get-NetTCPSetting\",\"ListItemText\":\"Get-NetTCPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTCPSetting \\r\\n\"},{\"CompletionText\":\"Get-NetTeredoConfiguration\",\"ListItemText\":\"Get-NetTeredoConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTeredoConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetTeredoState\",\"ListItemText\":\"Get-NetTeredoState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTeredoState \\r\\n\"},{\"CompletionText\":\"Get-NetTransportFilter\",\"ListItemText\":\"Get-NetTransportFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTransportFilter \\r\\n\"},{\"CompletionText\":\"Get-NetUDPEndpoint\",\"ListItemText\":\"Get-NetUDPEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetUDPEndpoint \\r\\n\"},{\"CompletionText\":\"Get-NetUDPSetting\",\"ListItemText\":\"Get-NetUDPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetUDPSetting \\r\\n\"},{\"CompletionText\":\"Get-NetView\",\"ListItemText\":\"Get-NetView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetView \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchEthernetPort\",\"ListItemText\":\"Get-NetworkSwitchEthernetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchEthernetPort \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchFeature\",\"ListItemText\":\"Get-NetworkSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchFeature \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchGlobalData\",\"ListItemText\":\"Get-NetworkSwitchGlobalData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchGlobalData \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchVlan\",\"ListItemText\":\"Get-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Get-NonRemovableAppsPolicy\",\"ListItemText\":\"Get-NonRemovableAppsPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-NonRemovableAppsPolicy\\r\\n\"},{\"CompletionText\":\"Get-OdbcDriver\",\"ListItemText\":\"Get-OdbcDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OdbcDriver \\r\\n\"},{\"CompletionText\":\"Get-OdbcDsn\",\"ListItemText\":\"Get-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Get-OdbcPerfCounter\",\"ListItemText\":\"Get-OdbcPerfCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OdbcPerfCounter \\r\\n\"},{\"CompletionText\":\"Get-OffloadDataTransferSetting\",\"ListItemText\":\"Get-OffloadDataTransferSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OffloadDataTransferSetting \\r\\n\"},{\"CompletionText\":\"Get-OperationValidation\",\"ListItemText\":\"Get-OperationValidation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OperationValidation \\r\\n\"},{\"CompletionText\":\"Get-Package\",\"ListItemText\":\"Get-Package\",\"ResultType\":2,\"ToolTip\":\"Get-Package\\r\\n\"},{\"CompletionText\":\"Get-PackageProvider\",\"ListItemText\":\"Get-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Get-PackageProvider\\r\\n\"},{\"CompletionText\":\"Get-PackageSource\",\"ListItemText\":\"Get-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Get-PackageSource\\r\\n\"},{\"CompletionText\":\"Get-Partition\",\"ListItemText\":\"Get-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Partition \\r\\n\"},{\"CompletionText\":\"Get-PartitionSupportedSize\",\"ListItemText\":\"Get-PartitionSupportedSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PartitionSupportedSize \\r\\n\"},{\"CompletionText\":\"Get-PcsvDevice\",\"ListItemText\":\"Get-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Get-PcsvDeviceLog\",\"ListItemText\":\"Get-PcsvDeviceLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PcsvDeviceLog \\r\\n\"},{\"CompletionText\":\"Get-PfxCertificate\",\"ListItemText\":\"Get-PfxCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-PfxCertificate\\r\\n\"},{\"CompletionText\":\"Get-PfxData\",\"ListItemText\":\"Get-PfxData\",\"ResultType\":2,\"ToolTip\":\"Get-PfxData\\r\\n\"},{\"CompletionText\":\"Get-PhysicalDisk\",\"ListItemText\":\"Get-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Get-PhysicalDiskSNV\",\"ListItemText\":\"Get-PhysicalDiskSNV\",\"ResultType\":2,\"ToolTip\":\"Get-PhysicalDiskSNV\"},{\"CompletionText\":\"Get-PhysicalDiskStorageNodeView\",\"ListItemText\":\"Get-PhysicalDiskStorageNodeView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalDiskStorageNodeView \\r\\n\"},{\"CompletionText\":\"Get-PhysicalExtent\",\"ListItemText\":\"Get-PhysicalExtent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalExtent \\r\\n\"},{\"CompletionText\":\"Get-PhysicalExtentAssociation\",\"ListItemText\":\"Get-PhysicalExtentAssociation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalExtentAssociation \\r\\n\"},{\"CompletionText\":\"Get-PmemDedicatedMemory\",\"ListItemText\":\"Get-PmemDedicatedMemory\",\"ResultType\":2,\"ToolTip\":\"Get-PmemDedicatedMemory\\r\\n\"},{\"CompletionText\":\"Get-PmemDisk\",\"ListItemText\":\"Get-PmemDisk\",\"ResultType\":2,\"ToolTip\":\"Get-PmemDisk\\r\\n\"},{\"CompletionText\":\"Get-PmemPhysicalDevice\",\"ListItemText\":\"Get-PmemPhysicalDevice\",\"ResultType\":2,\"ToolTip\":\"Get-PmemPhysicalDevice\\r\\n\"},{\"CompletionText\":\"Get-PmemUnusedRegion\",\"ListItemText\":\"Get-PmemUnusedRegion\",\"ResultType\":2,\"ToolTip\":\"Get-PmemUnusedRegion\\r\\n\"},{\"CompletionText\":\"Get-PnpDevice\",\"ListItemText\":\"Get-PnpDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PnpDevice \\r\\n\"},{\"CompletionText\":\"Get-PnpDeviceProperty\",\"ListItemText\":\"Get-PnpDeviceProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PnpDeviceProperty \\r\\n\"},{\"CompletionText\":\"Get-PreferredLanguage\",\"ListItemText\":\"Get-PreferredLanguage\",\"ResultType\":2,\"ToolTip\":\"Get-PreferredLanguage\"},{\"CompletionText\":\"Get-PrintConfiguration\",\"ListItemText\":\"Get-PrintConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrintConfiguration \\r\\n\"},{\"CompletionText\":\"Get-Printer\",\"ListItemText\":\"Get-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Printer \\r\\n\"},{\"CompletionText\":\"Get-PrinterDriver\",\"ListItemText\":\"Get-PrinterDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrinterDriver \\r\\n\"},{\"CompletionText\":\"Get-PrinterPort\",\"ListItemText\":\"Get-PrinterPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrinterPort \\r\\n\"},{\"CompletionText\":\"Get-PrinterProperty\",\"ListItemText\":\"Get-PrinterProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrinterProperty \\r\\n\"},{\"CompletionText\":\"Get-PrintJob\",\"ListItemText\":\"Get-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrintJob \\r\\n\"},{\"CompletionText\":\"Get-Process\",\"ListItemText\":\"Get-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Process [[-Name] ] [-Module] [-FileVersionInfo] []\\r\\n\\r\\nGet-Process [[-Name] ] -IncludeUserName []\\r\\n\\r\\nGet-Process -Id [-Module] [-FileVersionInfo] []\\r\\n\\r\\nGet-Process -Id -IncludeUserName []\\r\\n\\r\\nGet-Process -InputObject [-Module] [-FileVersionInfo] []\\r\\n\\r\\nGet-Process -InputObject -IncludeUserName []\\r\\n\"},{\"CompletionText\":\"Get-ProcessMitigation\",\"ListItemText\":\"Get-ProcessMitigation\",\"ResultType\":2,\"ToolTip\":\"Get-ProcessMitigation\\r\\n\"},{\"CompletionText\":\"Get-PromptConnectionInfo\",\"ListItemText\":\"Get-PromptConnectionInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PromptConnectionInfo \\r\\n\"},{\"CompletionText\":\"Get-PromptPath\",\"ListItemText\":\"Get-PromptPath\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PromptPath \\r\\n\"},{\"CompletionText\":\"Get-ProvisionedAppPackage\",\"ListItemText\":\"Get-ProvisionedAppPackage\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisionedAppPackage\"},{\"CompletionText\":\"Get-ProvisionedAppSharedPackageContainer\",\"ListItemText\":\"Get-ProvisionedAppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisionedAppSharedPackageContainer\"},{\"CompletionText\":\"Get-ProvisionedAppxPackage\",\"ListItemText\":\"Get-ProvisionedAppxPackage\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisionedAppxPackage\"},{\"CompletionText\":\"Get-ProvisioningPackage\",\"ListItemText\":\"Get-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Get-PSBreakpoint\",\"ListItemText\":\"Get-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSBreakpoint [[-Script] ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint -Command [-Script ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint -Variable [-Script ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint [-Type] [-Script ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint [-Id] [-Runspace ] []\\r\\n\"},{\"CompletionText\":\"Get-PSCallStack\",\"ListItemText\":\"Get-PSCallStack\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSCallStack []\\r\\n\"},{\"CompletionText\":\"Get-PSDrive\",\"ListItemText\":\"Get-PSDrive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSDrive [[-Name] ] [-Scope ] [-PSProvider ] []\\r\\n\\r\\nGet-PSDrive [-LiteralName] [-Scope ] [-PSProvider ] []\\r\\n\"},{\"CompletionText\":\"Get-PSHostProcessInfo\",\"ListItemText\":\"Get-PSHostProcessInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSHostProcessInfo [[-Name] ] []\\r\\n\\r\\nGet-PSHostProcessInfo [-Process] []\\r\\n\\r\\nGet-PSHostProcessInfo [-Id] []\\r\\n\"},{\"CompletionText\":\"Get-PSProvider\",\"ListItemText\":\"Get-PSProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSProvider [[-PSProvider] ] []\\r\\n\"},{\"CompletionText\":\"Get-PSReadLineKeyHandler\",\"ListItemText\":\"Get-PSReadLineKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSReadLineKeyHandler [-Bound] [-Unbound] []\\r\\n\\r\\nGet-PSReadLineKeyHandler [-Chord] []\\r\\n\"},{\"CompletionText\":\"Get-PSReadLineOption\",\"ListItemText\":\"Get-PSReadLineOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSReadLineOption []\\r\\n\"},{\"CompletionText\":\"Get-PSRepository\",\"ListItemText\":\"Get-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSRepository \\r\\n\"},{\"CompletionText\":\"Get-PSResource\",\"ListItemText\":\"Get-PSResource\",\"ResultType\":2,\"ToolTip\":\"Get-PSResource\"},{\"CompletionText\":\"Get-PSResourceRepository\",\"ListItemText\":\"Get-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Get-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Get-PSScriptFileInfo\",\"ListItemText\":\"Get-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"Get-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"Get-PSSession\",\"ListItemText\":\"Get-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSSession [-Name ] []\\r\\n\\r\\nGet-PSSession [-ComputerName] [-ApplicationName ] [-ConfigurationName ] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession [-ComputerName] -InstanceId [-ApplicationName ] [-ConfigurationName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession [-ConnectionUri] [-ConfigurationName ] [-AllowRedirection] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession [-ConnectionUri] -InstanceId [-ConfigurationName ] [-AllowRedirection] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession -ContainerId [-ConfigurationName ] [-Name ] [-State ] []\\r\\n\\r\\nGet-PSSession -InstanceId -ContainerId [-ConfigurationName ] [-State ] []\\r\\n\\r\\nGet-PSSession -VMId [-ConfigurationName ] [-Name ] [-State ] []\\r\\n\\r\\nGet-PSSession -InstanceId -VMId [-ConfigurationName ] [-State ] []\\r\\n\\r\\nGet-PSSession -VMName [-ConfigurationName ] [-Name ] [-State ] []\\r\\n\\r\\nGet-PSSession -InstanceId -VMName [-ConfigurationName ] [-State ] []\\r\\n\\r\\nGet-PSSession [-InstanceId ] []\\r\\n\\r\\nGet-PSSession [-Id] []\\r\\n\"},{\"CompletionText\":\"Get-PSSessionCapability\",\"ListItemText\":\"Get-PSSessionCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSSessionCapability [-ConfigurationName] [-Username] [-Full] []\\r\\n\"},{\"CompletionText\":\"Get-PSSessionConfiguration\",\"ListItemText\":\"Get-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSSessionConfiguration [[-Name] ] [-Force] []\\r\\n\"},{\"CompletionText\":\"Get-Random\",\"ListItemText\":\"Get-Random\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Random [[-Maximum] ] [-SetSeed ] [-Minimum ] [-Count ] []\\r\\n\\r\\nGet-Random [-InputObject] [-SetSeed ] [-Count ] []\\r\\n\\r\\nGet-Random [-InputObject] -Shuffle [-SetSeed ] []\\r\\n\"},{\"CompletionText\":\"Get-ResiliencySetting\",\"ListItemText\":\"Get-ResiliencySetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ResiliencySetting \\r\\n\"},{\"CompletionText\":\"Get-Runspace\",\"ListItemText\":\"Get-Runspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Runspace [[-Name] ] []\\r\\n\\r\\nGet-Runspace [-Id] []\\r\\n\\r\\nGet-Runspace [-InstanceId] []\\r\\n\"},{\"CompletionText\":\"Get-RunspaceDebug\",\"ListItemText\":\"Get-RunspaceDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-RunspaceDebug [[-RunspaceName] ] []\\r\\n\\r\\nGet-RunspaceDebug [-Runspace] []\\r\\n\\r\\nGet-RunspaceDebug [-RunspaceId] []\\r\\n\\r\\nGet-RunspaceDebug [-RunspaceInstanceId] []\\r\\n\\r\\nGet-RunspaceDebug [[-ProcessName] ] [[-AppDomainName] ] []\\r\\n\"},{\"CompletionText\":\"Get-ScheduledJob\",\"ListItemText\":\"Get-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Get-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Get-ScheduledJobOption\",\"ListItemText\":\"Get-ScheduledJobOption\",\"ResultType\":2,\"ToolTip\":\"Get-ScheduledJobOption\\r\\n\"},{\"CompletionText\":\"Get-ScheduledTask\",\"ListItemText\":\"Get-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Get-ScheduledTaskInfo\",\"ListItemText\":\"Get-ScheduledTaskInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ScheduledTaskInfo \\r\\n\"},{\"CompletionText\":\"Get-SecureBootPolicy\",\"ListItemText\":\"Get-SecureBootPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-SecureBootPolicy\\r\\n\"},{\"CompletionText\":\"Get-SecureBootUEFI\",\"ListItemText\":\"Get-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Get-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"Get-SecureRandom\",\"ListItemText\":\"Get-SecureRandom\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SecureRandom [[-Maximum] ] [-Minimum ] [-Count ] []\\r\\n\\r\\nGet-SecureRandom [-InputObject] [-Count ] []\\r\\n\\r\\nGet-SecureRandom [-InputObject] -Shuffle []\\r\\n\"},{\"CompletionText\":\"Get-Service\",\"ListItemText\":\"Get-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Service [[-Name] ] [-DependentServices] [-RequiredServices] [-Include ] [-Exclude ] []\\r\\n\\r\\nGet-Service -DisplayName [-DependentServices] [-RequiredServices] [-Include ] [-Exclude ] []\\r\\n\\r\\nGet-Service [-DependentServices] [-RequiredServices] [-Include ] [-Exclude ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Get-SmbBandWidthLimit\",\"ListItemText\":\"Get-SmbBandWidthLimit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbBandWidthLimit \\r\\n\"},{\"CompletionText\":\"Get-SmbClientAccessToServer\",\"ListItemText\":\"Get-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Get-SmbClientCertificateMapping\",\"ListItemText\":\"Get-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbClientConfiguration\",\"ListItemText\":\"Get-SmbClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientConfiguration \\r\\n\"},{\"CompletionText\":\"Get-SmbClientNetworkInterface\",\"ListItemText\":\"Get-SmbClientNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientNetworkInterface \\r\\n\"},{\"CompletionText\":\"Get-SmbConnection\",\"ListItemText\":\"Get-SmbConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbConnection \\r\\n\"},{\"CompletionText\":\"Get-SmbDelegation\",\"ListItemText\":\"Get-SmbDelegation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbDelegation \\r\\n\"},{\"CompletionText\":\"Get-SmbGlobalMapping\",\"ListItemText\":\"Get-SmbGlobalMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbGlobalMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbMapping\",\"ListItemText\":\"Get-SmbMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbMultichannelConnection\",\"ListItemText\":\"Get-SmbMultichannelConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbMultichannelConnection \\r\\n\"},{\"CompletionText\":\"Get-SmbMultichannelConstraint\",\"ListItemText\":\"Get-SmbMultichannelConstraint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbMultichannelConstraint \\r\\n\"},{\"CompletionText\":\"Get-SmbOpenFile\",\"ListItemText\":\"Get-SmbOpenFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbOpenFile \\r\\n\"},{\"CompletionText\":\"Get-SmbServerCertificateMapping\",\"ListItemText\":\"Get-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbServerCertProps\",\"ListItemText\":\"Get-SmbServerCertProps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerCertProps \\r\\n\"},{\"CompletionText\":\"Get-SmbServerConfiguration\",\"ListItemText\":\"Get-SmbServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-SmbServerNetworkInterface\",\"ListItemText\":\"Get-SmbServerNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerNetworkInterface \\r\\n\"},{\"CompletionText\":\"Get-SmbSession\",\"ListItemText\":\"Get-SmbSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbSession \\r\\n\"},{\"CompletionText\":\"Get-SmbShare\",\"ListItemText\":\"Get-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbShare \\r\\n\"},{\"CompletionText\":\"Get-SmbShareAccess\",\"ListItemText\":\"Get-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Get-SmbWitnessClient\",\"ListItemText\":\"Get-SmbWitnessClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbWitnessClient \\r\\n\"},{\"CompletionText\":\"Get-StartApps\",\"ListItemText\":\"Get-StartApps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StartApps \\r\\n\"},{\"CompletionText\":\"Get-StorageAdvancedProperty\",\"ListItemText\":\"Get-StorageAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Get-StorageBusBinding\",\"ListItemText\":\"Get-StorageBusBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusBinding \\r\\n\"},{\"CompletionText\":\"Get-StorageBusCache\",\"ListItemText\":\"Get-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Get-StorageBusClientDevice\",\"ListItemText\":\"Get-StorageBusClientDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusClientDevice \\r\\n\"},{\"CompletionText\":\"Get-StorageBusDisk\",\"ListItemText\":\"Get-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetCacheStore\",\"ListItemText\":\"Get-StorageBusTargetCacheStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetCacheStore \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetCacheStoresInstance\",\"ListItemText\":\"Get-StorageBusTargetCacheStoresInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetCacheStoresInstance \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetDevice\",\"ListItemText\":\"Get-StorageBusTargetDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetDevice \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetDeviceInstance\",\"ListItemText\":\"Get-StorageBusTargetDeviceInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetDeviceInstance \\r\\n\"},{\"CompletionText\":\"Get-StorageChassis\",\"ListItemText\":\"Get-StorageChassis\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageChassis \\r\\n\"},{\"CompletionText\":\"Get-StorageDataCollection\",\"ListItemText\":\"Get-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Get-StorageDiagnosticInfo\",\"ListItemText\":\"Get-StorageDiagnosticInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageDiagnosticInfo \\r\\n\"},{\"CompletionText\":\"Get-StorageEnclosure\",\"ListItemText\":\"Get-StorageEnclosure\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageEnclosure \\r\\n\"},{\"CompletionText\":\"Get-StorageEnclosureSNV\",\"ListItemText\":\"Get-StorageEnclosureSNV\",\"ResultType\":2,\"ToolTip\":\"Get-StorageEnclosureSNV\"},{\"CompletionText\":\"Get-StorageEnclosureStorageNodeView\",\"ListItemText\":\"Get-StorageEnclosureStorageNodeView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageEnclosureStorageNodeView \\r\\n\"},{\"CompletionText\":\"Get-StorageEnclosureVendorData\",\"ListItemText\":\"Get-StorageEnclosureVendorData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageEnclosureVendorData \\r\\n\"},{\"CompletionText\":\"Get-StorageExtendedStatus\",\"ListItemText\":\"Get-StorageExtendedStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageExtendedStatus \\r\\n\"},{\"CompletionText\":\"Get-StorageFaultDomain\",\"ListItemText\":\"Get-StorageFaultDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageFaultDomain \\r\\n\"},{\"CompletionText\":\"Get-StorageFileServer\",\"ListItemText\":\"Get-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageFileServer \\r\\n\"},{\"CompletionText\":\"Get-StorageFirmwareInformation\",\"ListItemText\":\"Get-StorageFirmwareInformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageFirmwareInformation \\r\\n\"},{\"CompletionText\":\"Get-StorageHealthAction\",\"ListItemText\":\"Get-StorageHealthAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHealthAction \\r\\n\"},{\"CompletionText\":\"Get-StorageHealthReport\",\"ListItemText\":\"Get-StorageHealthReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHealthReport \\r\\n\"},{\"CompletionText\":\"Get-StorageHealthSetting\",\"ListItemText\":\"Get-StorageHealthSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHealthSetting \\r\\n\"},{\"CompletionText\":\"Get-StorageHistory\",\"ListItemText\":\"Get-StorageHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHistory \\r\\n\"},{\"CompletionText\":\"Get-StorageJob\",\"ListItemText\":\"Get-StorageJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageJob \\r\\n\"},{\"CompletionText\":\"Get-StorageNode\",\"ListItemText\":\"Get-StorageNode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageNode \\r\\n\"},{\"CompletionText\":\"Get-StoragePool\",\"ListItemText\":\"Get-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StoragePool \\r\\n\"},{\"CompletionText\":\"Get-StorageProvider\",\"ListItemText\":\"Get-StorageProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageProvider \\r\\n\"},{\"CompletionText\":\"Get-StorageRack\",\"ListItemText\":\"Get-StorageRack\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageRack \\r\\n\"},{\"CompletionText\":\"Get-StorageReliabilityCounter\",\"ListItemText\":\"Get-StorageReliabilityCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageReliabilityCounter \\r\\n\"},{\"CompletionText\":\"Get-StorageScaleUnit\",\"ListItemText\":\"Get-StorageScaleUnit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageScaleUnit \\r\\n\"},{\"CompletionText\":\"Get-StorageSetting\",\"ListItemText\":\"Get-StorageSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageSetting \\r\\n\"},{\"CompletionText\":\"Get-StorageSite\",\"ListItemText\":\"Get-StorageSite\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageSite \\r\\n\"},{\"CompletionText\":\"Get-StorageSubSystem\",\"ListItemText\":\"Get-StorageSubSystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageSubSystem \\r\\n\"},{\"CompletionText\":\"Get-StorageTier\",\"ListItemText\":\"Get-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageTier \\r\\n\"},{\"CompletionText\":\"Get-StorageTierSupportedSize\",\"ListItemText\":\"Get-StorageTierSupportedSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageTierSupportedSize \\r\\n\"},{\"CompletionText\":\"Get-SupportedClusterSizes\",\"ListItemText\":\"Get-SupportedClusterSizes\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SupportedClusterSizes \\r\\n\"},{\"CompletionText\":\"Get-SupportedFileSystems\",\"ListItemText\":\"Get-SupportedFileSystems\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SupportedFileSystems \\r\\n\"},{\"CompletionText\":\"Get-SystemDriver\",\"ListItemText\":\"Get-SystemDriver\",\"ResultType\":2,\"ToolTip\":\"Get-SystemDriver\\r\\n\"},{\"CompletionText\":\"Get-SystemLanguage\",\"ListItemText\":\"Get-SystemLanguage\",\"ResultType\":2,\"ToolTip\":\"Get-SystemLanguage\"},{\"CompletionText\":\"Get-SystemPreferredUILanguage\",\"ListItemText\":\"Get-SystemPreferredUILanguage\",\"ResultType\":2,\"ToolTip\":\"Get-SystemPreferredUILanguage\\r\\n\"},{\"CompletionText\":\"Get-TargetPort\",\"ListItemText\":\"Get-TargetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TargetPort \\r\\n\"},{\"CompletionText\":\"Get-TargetPortal\",\"ListItemText\":\"Get-TargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TargetPortal \\r\\n\"},{\"CompletionText\":\"Get-TestDriveItem\",\"ListItemText\":\"Get-TestDriveItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TestDriveItem \\r\\n\"},{\"CompletionText\":\"Get-TimeZone\",\"ListItemText\":\"Get-TimeZone\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TimeZone [[-Name] ] []\\r\\n\\r\\nGet-TimeZone -Id []\\r\\n\\r\\nGet-TimeZone -ListAvailable []\\r\\n\"},{\"CompletionText\":\"Get-TlsCipherSuite\",\"ListItemText\":\"Get-TlsCipherSuite\",\"ResultType\":2,\"ToolTip\":\"Get-TlsCipherSuite\\r\\n\"},{\"CompletionText\":\"Get-TlsEccCurve\",\"ListItemText\":\"Get-TlsEccCurve\",\"ResultType\":2,\"ToolTip\":\"Get-TlsEccCurve\\r\\n\"},{\"CompletionText\":\"Get-Tpm\",\"ListItemText\":\"Get-Tpm\",\"ResultType\":2,\"ToolTip\":\"Get-Tpm\\r\\n\"},{\"CompletionText\":\"Get-TpmEndorsementKeyInfo\",\"ListItemText\":\"Get-TpmEndorsementKeyInfo\",\"ResultType\":2,\"ToolTip\":\"Get-TpmEndorsementKeyInfo\\r\\n\"},{\"CompletionText\":\"Get-TpmSupportedFeature\",\"ListItemText\":\"Get-TpmSupportedFeature\",\"ResultType\":2,\"ToolTip\":\"Get-TpmSupportedFeature\\r\\n\"},{\"CompletionText\":\"Get-TraceSource\",\"ListItemText\":\"Get-TraceSource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TraceSource [[-Name] ] []\\r\\n\"},{\"CompletionText\":\"Get-TroubleshootingPack\",\"ListItemText\":\"Get-TroubleshootingPack\",\"ResultType\":2,\"ToolTip\":\"Get-TroubleshootingPack\\r\\n\"},{\"CompletionText\":\"Get-TrustedProvisioningCertificate\",\"ListItemText\":\"Get-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-TrustedProvisioningCertificate\\r\\n\"},{\"CompletionText\":\"Get-TypeData\",\"ListItemText\":\"Get-TypeData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TypeData [[-TypeName] ] []\\r\\n\"},{\"CompletionText\":\"Get-UICulture\",\"ListItemText\":\"Get-UICulture\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-UICulture []\\r\\n\"},{\"CompletionText\":\"Get-Unique\",\"ListItemText\":\"Get-Unique\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Unique [-InputObject ] [-AsString] [-CaseInsensitive] []\\r\\n\\r\\nGet-Unique [-InputObject ] [-OnType] [-CaseInsensitive] []\\r\\n\"},{\"CompletionText\":\"Get-Uptime\",\"ListItemText\":\"Get-Uptime\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Uptime []\\r\\n\\r\\nGet-Uptime [-Since] []\\r\\n\"},{\"CompletionText\":\"Get-UsageAggregates\",\"ListItemText\":\"Get-UsageAggregates\",\"ResultType\":2,\"ToolTip\":\"Get-UsageAggregates\\r\\n\"},{\"CompletionText\":\"Get-Variable\",\"ListItemText\":\"Get-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Variable [[-Name] ] [-ValueOnly] [-Include ] [-Exclude ] [-Scope ] []\\r\\n\"},{\"CompletionText\":\"Get-Verb\",\"ListItemText\":\"Get-Verb\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Verb [[-Verb] ] [[-Group] ] []\\r\\n\"},{\"CompletionText\":\"Get-VHD\",\"ListItemText\":\"Get-VHD\",\"ResultType\":2,\"ToolTip\":\"Get-VHD\\r\\n\"},{\"CompletionText\":\"Get-VHDSet\",\"ListItemText\":\"Get-VHDSet\",\"ResultType\":2,\"ToolTip\":\"Get-VHDSet\\r\\n\"},{\"CompletionText\":\"Get-VHDSnapshot\",\"ListItemText\":\"Get-VHDSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-VHDSnapshot\\r\\n\"},{\"CompletionText\":\"Get-VirtualDisk\",\"ListItemText\":\"Get-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Get-VirtualDiskSupportedSize\",\"ListItemText\":\"Get-VirtualDiskSupportedSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VirtualDiskSupportedSize \\r\\n\"},{\"CompletionText\":\"Get-VM\",\"ListItemText\":\"Get-VM\",\"ResultType\":2,\"ToolTip\":\"Get-VM\\r\\n\"},{\"CompletionText\":\"Get-VMAssignableDevice\",\"ListItemText\":\"Get-VMAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Get-VMAssignableDevice\\r\\n\"},{\"CompletionText\":\"Get-VMBios\",\"ListItemText\":\"Get-VMBios\",\"ResultType\":2,\"ToolTip\":\"Get-VMBios\\r\\n\"},{\"CompletionText\":\"Get-VMCheckpoint\",\"ListItemText\":\"Get-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Get-VMCheckpoint\"},{\"CompletionText\":\"Get-VMComPort\",\"ListItemText\":\"Get-VMComPort\",\"ResultType\":2,\"ToolTip\":\"Get-VMComPort\\r\\n\"},{\"CompletionText\":\"Get-VMConnectAccess\",\"ListItemText\":\"Get-VMConnectAccess\",\"ResultType\":2,\"ToolTip\":\"Get-VMConnectAccess\\r\\n\"},{\"CompletionText\":\"Get-VMDirectVirtualDisk\",\"ListItemText\":\"Get-VMDirectVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VMDirectVirtualDisk \\r\\n\"},{\"CompletionText\":\"Get-VMDvdDrive\",\"ListItemText\":\"Get-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Get-VMFibreChannelHba\",\"ListItemText\":\"Get-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Get-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Get-VMFirmware\",\"ListItemText\":\"Get-VMFirmware\",\"ResultType\":2,\"ToolTip\":\"Get-VMFirmware\\r\\n\"},{\"CompletionText\":\"Get-VMFloppyDiskDrive\",\"ListItemText\":\"Get-VMFloppyDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMFloppyDiskDrive\\r\\n\"},{\"CompletionText\":\"Get-VMGpuPartitionAdapter\",\"ListItemText\":\"Get-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMGroup\",\"ListItemText\":\"Get-VMGroup\",\"ResultType\":2,\"ToolTip\":\"Get-VMGroup\\r\\n\"},{\"CompletionText\":\"Get-VMHardDiskDrive\",\"ListItemText\":\"Get-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Get-VMHost\",\"ListItemText\":\"Get-VMHost\",\"ResultType\":2,\"ToolTip\":\"Get-VMHost\\r\\n\"},{\"CompletionText\":\"Get-VMHostAssignableDevice\",\"ListItemText\":\"Get-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Get-VMHostCluster\",\"ListItemText\":\"Get-VMHostCluster\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostCluster\\r\\n\"},{\"CompletionText\":\"Get-VMHostNumaNode\",\"ListItemText\":\"Get-VMHostNumaNode\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostNumaNode\\r\\n\"},{\"CompletionText\":\"Get-VMHostNumaNodeStatus\",\"ListItemText\":\"Get-VMHostNumaNodeStatus\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostNumaNodeStatus\\r\\n\"},{\"CompletionText\":\"Get-VMHostPartitionableGpu\",\"ListItemText\":\"Get-VMHostPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Get-VMHostSupportedVersion\",\"ListItemText\":\"Get-VMHostSupportedVersion\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostSupportedVersion\\r\\n\"},{\"CompletionText\":\"Get-VMIdeController\",\"ListItemText\":\"Get-VMIdeController\",\"ResultType\":2,\"ToolTip\":\"Get-VMIdeController\\r\\n\"},{\"CompletionText\":\"Get-VMIntegrationService\",\"ListItemText\":\"Get-VMIntegrationService\",\"ResultType\":2,\"ToolTip\":\"Get-VMIntegrationService\\r\\n\"},{\"CompletionText\":\"Get-VMKeyProtector\",\"ListItemText\":\"Get-VMKeyProtector\",\"ResultType\":2,\"ToolTip\":\"Get-VMKeyProtector\\r\\n\"},{\"CompletionText\":\"Get-VMKeyStorageDrive\",\"ListItemText\":\"Get-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Get-VMMemory\",\"ListItemText\":\"Get-VMMemory\",\"ResultType\":2,\"ToolTip\":\"Get-VMMemory\\r\\n\"},{\"CompletionText\":\"Get-VMMigrationNetwork\",\"ListItemText\":\"Get-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapter\",\"ListItemText\":\"Get-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterAcl\",\"ListItemText\":\"Get-VMNetworkAdapterAcl\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterAcl\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterExtendedAcl\",\"ListItemText\":\"Get-VMNetworkAdapterExtendedAcl\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterExtendedAcl\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterFailoverConfiguration\",\"ListItemText\":\"Get-VMNetworkAdapterFailoverConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterFailoverConfiguration\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterIsolation\",\"ListItemText\":\"Get-VMNetworkAdapterIsolation\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterIsolation\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterRdma\",\"ListItemText\":\"Get-VMNetworkAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterRdma\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Get-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterTeamMapping\",\"ListItemText\":\"Get-VMNetworkAdapterTeamMapping\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterTeamMapping\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterVlan\",\"ListItemText\":\"Get-VMNetworkAdapterVlan\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterVlan\\r\\n\"},{\"CompletionText\":\"Get-VMPartitionableGpu\",\"ListItemText\":\"Get-VMPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Get-VMPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Get-VMPmemController\",\"ListItemText\":\"Get-VMPmemController\",\"ResultType\":2,\"ToolTip\":\"Get-VMPmemController\\r\\n\"},{\"CompletionText\":\"Get-VMProcessor\",\"ListItemText\":\"Get-VMProcessor\",\"ResultType\":2,\"ToolTip\":\"Get-VMProcessor\\r\\n\"},{\"CompletionText\":\"Get-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Get-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMRemoteFXPhysicalVideoAdapter\",\"ListItemText\":\"Get-VMRemoteFXPhysicalVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMRemoteFXPhysicalVideoAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMReplication\",\"ListItemText\":\"Get-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Get-VMReplication\\r\\n\"},{\"CompletionText\":\"Get-VMReplicationAuthorizationEntry\",\"ListItemText\":\"Get-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"Get-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"Get-VMReplicationServer\",\"ListItemText\":\"Get-VMReplicationServer\",\"ResultType\":2,\"ToolTip\":\"Get-VMReplicationServer\\r\\n\"},{\"CompletionText\":\"Get-VMResourcePool\",\"ListItemText\":\"Get-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Get-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Get-VMSan\",\"ListItemText\":\"Get-VMSan\",\"ResultType\":2,\"ToolTip\":\"Get-VMSan\\r\\n\"},{\"CompletionText\":\"Get-VMScsiController\",\"ListItemText\":\"Get-VMScsiController\",\"ResultType\":2,\"ToolTip\":\"Get-VMScsiController\\r\\n\"},{\"CompletionText\":\"Get-VMSecurity\",\"ListItemText\":\"Get-VMSecurity\",\"ResultType\":2,\"ToolTip\":\"Get-VMSecurity\\r\\n\"},{\"CompletionText\":\"Get-VMSnapshot\",\"ListItemText\":\"Get-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Get-VMStoragePath\",\"ListItemText\":\"Get-VMStoragePath\",\"ResultType\":2,\"ToolTip\":\"Get-VMStoragePath\\r\\n\"},{\"CompletionText\":\"Get-VMStorageSettings\",\"ListItemText\":\"Get-VMStorageSettings\",\"ResultType\":2,\"ToolTip\":\"Get-VMStorageSettings\\r\\n\"},{\"CompletionText\":\"Get-VMSwitch\",\"ListItemText\":\"Get-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitch\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtension\",\"ListItemText\":\"Get-VMSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtension\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionPortData\",\"ListItemText\":\"Get-VMSwitchExtensionPortData\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionPortData\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Get-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionSwitchData\",\"ListItemText\":\"Get-VMSwitchExtensionSwitchData\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionSwitchData\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Get-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchTeam\",\"ListItemText\":\"Get-VMSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchTeam\\r\\n\"},{\"CompletionText\":\"Get-VMSystemSwitchExtension\",\"ListItemText\":\"Get-VMSystemSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Get-VMSystemSwitchExtension\\r\\n\"},{\"CompletionText\":\"Get-VMSystemSwitchExtensionPortFeature\",\"ListItemText\":\"Get-VMSystemSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSystemSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Get-VMSystemSwitchExtensionSwitchFeature\",\"ListItemText\":\"Get-VMSystemSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSystemSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Get-VMVideo\",\"ListItemText\":\"Get-VMVideo\",\"ResultType\":2,\"ToolTip\":\"Get-VMVideo\\r\\n\"},{\"CompletionText\":\"Get-Volume\",\"ListItemText\":\"Get-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Volume \\r\\n\"},{\"CompletionText\":\"Get-VolumeCorruptionCount\",\"ListItemText\":\"Get-VolumeCorruptionCount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VolumeCorruptionCount \\r\\n\"},{\"CompletionText\":\"Get-VolumeScrubPolicy\",\"ListItemText\":\"Get-VolumeScrubPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VolumeScrubPolicy \\r\\n\"},{\"CompletionText\":\"Get-VpnConnection\",\"ListItemText\":\"Get-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VpnConnection \\r\\n\"},{\"CompletionText\":\"Get-VpnConnectionTrigger\",\"ListItemText\":\"Get-VpnConnectionTrigger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VpnConnectionTrigger \\r\\n\"},{\"CompletionText\":\"Get-WdacBidTrace\",\"ListItemText\":\"Get-WdacBidTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-WdacBidTrace \\r\\n\"},{\"CompletionText\":\"Get-WheaMemoryPolicy\",\"ListItemText\":\"Get-WheaMemoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-WheaMemoryPolicy\\r\\n\"},{\"CompletionText\":\"Get-WIMBootEntry\",\"ListItemText\":\"Get-WIMBootEntry\",\"ResultType\":2,\"ToolTip\":\"Get-WIMBootEntry\\r\\n\"},{\"CompletionText\":\"Get-WinAcceptLanguageFromLanguageListOptOut\",\"ListItemText\":\"Get-WinAcceptLanguageFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Get-WinAcceptLanguageFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Get-WinCultureFromLanguageListOptOut\",\"ListItemText\":\"Get-WinCultureFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Get-WinCultureFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Get-WinDefaultInputMethodOverride\",\"ListItemText\":\"Get-WinDefaultInputMethodOverride\",\"ResultType\":2,\"ToolTip\":\"Get-WinDefaultInputMethodOverride\\r\\n\"},{\"CompletionText\":\"Get-WindowsCapability\",\"ListItemText\":\"Get-WindowsCapability\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsCapability\\r\\n\"},{\"CompletionText\":\"Get-WindowsDeveloperLicense\",\"ListItemText\":\"Get-WindowsDeveloperLicense\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsDeveloperLicense\\r\\n\"},{\"CompletionText\":\"Get-WindowsDriver\",\"ListItemText\":\"Get-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Get-WindowsEdition\",\"ListItemText\":\"Get-WindowsEdition\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsEdition\\r\\n\"},{\"CompletionText\":\"Get-WindowsErrorReporting\",\"ListItemText\":\"Get-WindowsErrorReporting\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsErrorReporting\\r\\n\"},{\"CompletionText\":\"Get-WindowsImage\",\"ListItemText\":\"Get-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsImage\\r\\n\"},{\"CompletionText\":\"Get-WindowsImageContent\",\"ListItemText\":\"Get-WindowsImageContent\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsImageContent\\r\\n\"},{\"CompletionText\":\"Get-WindowsOptionalFeature\",\"ListItemText\":\"Get-WindowsOptionalFeature\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsOptionalFeature\\r\\n\"},{\"CompletionText\":\"Get-WindowsPackage\",\"ListItemText\":\"Get-WindowsPackage\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsPackage\\r\\n\"},{\"CompletionText\":\"Get-WindowsReservedStorageState\",\"ListItemText\":\"Get-WindowsReservedStorageState\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsReservedStorageState\\r\\n\"},{\"CompletionText\":\"Get-WindowsSearchSetting\",\"ListItemText\":\"Get-WindowsSearchSetting\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsSearchSetting\\r\\n\"},{\"CompletionText\":\"Get-WindowsUpdateLog\",\"ListItemText\":\"Get-WindowsUpdateLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-WindowsUpdateLog \\r\\n\"},{\"CompletionText\":\"Get-WinEvent\",\"ListItemText\":\"Get-WinEvent\",\"ResultType\":2,\"ToolTip\":\"Get-WinEvent\\r\\n\"},{\"CompletionText\":\"Get-WinHomeLocation\",\"ListItemText\":\"Get-WinHomeLocation\",\"ResultType\":2,\"ToolTip\":\"Get-WinHomeLocation\\r\\n\"},{\"CompletionText\":\"Get-WinhttpProxy\",\"ListItemText\":\"Get-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"Get-WinLanguageBarOption\",\"ListItemText\":\"Get-WinLanguageBarOption\",\"ResultType\":2,\"ToolTip\":\"Get-WinLanguageBarOption\\r\\n\"},{\"CompletionText\":\"Get-WinSystemLocale\",\"ListItemText\":\"Get-WinSystemLocale\",\"ResultType\":2,\"ToolTip\":\"Get-WinSystemLocale\\r\\n\"},{\"CompletionText\":\"Get-WinUILanguageOverride\",\"ListItemText\":\"Get-WinUILanguageOverride\",\"ResultType\":2,\"ToolTip\":\"Get-WinUILanguageOverride\\r\\n\"},{\"CompletionText\":\"Get-WinUserLanguageList\",\"ListItemText\":\"Get-WinUserLanguageList\",\"ResultType\":2,\"ToolTip\":\"Get-WinUserLanguageList\\r\\n\"},{\"CompletionText\":\"Get-WSManCredSSP\",\"ListItemText\":\"Get-WSManCredSSP\",\"ResultType\":2,\"ToolTip\":\"Get-WSManCredSSP\\r\\n\"},{\"CompletionText\":\"Get-WSManInstance\",\"ListItemText\":\"Get-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"Get-WSManInstance\\r\\n\"},{\"CompletionText\":\"GetHelp.exe\",\"ListItemText\":\"GetHelp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\GetHelp.exe\"},{\"CompletionText\":\"getmac.exe\",\"ListItemText\":\"getmac.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\getmac.exe\"},{\"CompletionText\":\"gh.exe\",\"ListItemText\":\"gh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\GitHub CLI\\\\gh.exe\"},{\"CompletionText\":\"ghy\",\"ListItemText\":\"ghy\",\"ResultType\":2,\"ToolTip\":\"Get-History\"},{\"CompletionText\":\"gi\",\"ListItemText\":\"gi\",\"ResultType\":2,\"ToolTip\":\"Get-Item\"},{\"CompletionText\":\"gin\",\"ListItemText\":\"gin\",\"ResultType\":2,\"ToolTip\":\"Get-ComputerInfo\"},{\"CompletionText\":\"gip\",\"ListItemText\":\"gip\",\"ResultType\":2,\"ToolTip\":\"gip\"},{\"CompletionText\":\"git-gui.exe\",\"ListItemText\":\"git-gui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-gui.exe\"},{\"CompletionText\":\"git-lfs.exe\",\"ListItemText\":\"git-lfs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git LFS\\\\git-lfs.exe\"},{\"CompletionText\":\"git-receive-pack.exe\",\"ListItemText\":\"git-receive-pack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-receive-pack.exe\"},{\"CompletionText\":\"git-upload-pack.exe\",\"ListItemText\":\"git-upload-pack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-upload-pack.exe\"},{\"CompletionText\":\"git.exe\",\"ListItemText\":\"git.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git.exe\"},{\"CompletionText\":\"gitk.exe\",\"ListItemText\":\"gitk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\gitk.exe\"},{\"CompletionText\":\"gjb\",\"ListItemText\":\"gjb\",\"ResultType\":2,\"ToolTip\":\"Get-Job\"},{\"CompletionText\":\"gl\",\"ListItemText\":\"gl\",\"ResultType\":2,\"ToolTip\":\"Get-Location\"},{\"CompletionText\":\"glcm\",\"ListItemText\":\"glcm\",\"ResultType\":2,\"ToolTip\":\"glcm\"},{\"CompletionText\":\"glg\",\"ListItemText\":\"glg\",\"ResultType\":2,\"ToolTip\":\"glg\"},{\"CompletionText\":\"glgm\",\"ListItemText\":\"glgm\",\"ResultType\":2,\"ToolTip\":\"glgm\"},{\"CompletionText\":\"glu\",\"ListItemText\":\"glu\",\"ResultType\":2,\"ToolTip\":\"glu\"},{\"CompletionText\":\"gm\",\"ListItemText\":\"gm\",\"ResultType\":2,\"ToolTip\":\"Get-Member\"},{\"CompletionText\":\"gmo\",\"ListItemText\":\"gmo\",\"ResultType\":2,\"ToolTip\":\"Get-Module\"},{\"CompletionText\":\"gp\",\"ListItemText\":\"gp\",\"ResultType\":2,\"ToolTip\":\"Get-ItemProperty\"},{\"CompletionText\":\"gpedit.msc\",\"ListItemText\":\"gpedit.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpedit.msc\"},{\"CompletionText\":\"gpg-agent.exe\",\"ListItemText\":\"gpg-agent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-agent.exe\"},{\"CompletionText\":\"gpg-card.exe\",\"ListItemText\":\"gpg-card.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-card.exe\"},{\"CompletionText\":\"gpg-check-pattern.exe\",\"ListItemText\":\"gpg-check-pattern.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-check-pattern.exe\"},{\"CompletionText\":\"gpg-connect-agent.exe\",\"ListItemText\":\"gpg-connect-agent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-connect-agent.exe\"},{\"CompletionText\":\"gpg-disable-keyboxd.bat\",\"ListItemText\":\"gpg-disable-keyboxd.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-disable-keyboxd.bat\"},{\"CompletionText\":\"gpg-enable-keyboxd.bat\",\"ListItemText\":\"gpg-enable-keyboxd.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-enable-keyboxd.bat\"},{\"CompletionText\":\"gpg-preset-passphrase.exe\",\"ListItemText\":\"gpg-preset-passphrase.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-preset-passphrase.exe\"},{\"CompletionText\":\"gpg-wks-client.exe\",\"ListItemText\":\"gpg-wks-client.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-wks-client.exe\"},{\"CompletionText\":\"gpg.exe\",\"ListItemText\":\"gpg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg.exe\"},{\"CompletionText\":\"gpgconf.exe\",\"ListItemText\":\"gpgconf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgconf.exe\"},{\"CompletionText\":\"gpgme-w32spawn.exe\",\"ListItemText\":\"gpgme-w32spawn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgme-w32spawn.exe\"},{\"CompletionText\":\"gpgsm.exe\",\"ListItemText\":\"gpgsm.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgsm.exe\"},{\"CompletionText\":\"gpgtar.exe\",\"ListItemText\":\"gpgtar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgtar.exe\"},{\"CompletionText\":\"gpgv.exe\",\"ListItemText\":\"gpgv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgv.exe\"},{\"CompletionText\":\"gpresult.exe\",\"ListItemText\":\"gpresult.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpresult.exe\"},{\"CompletionText\":\"gps\",\"ListItemText\":\"gps\",\"ResultType\":2,\"ToolTip\":\"Get-Process\"},{\"CompletionText\":\"gpscript.exe\",\"ListItemText\":\"gpscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpscript.exe\"},{\"CompletionText\":\"gpupdate.exe\",\"ListItemText\":\"gpupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpupdate.exe\"},{\"CompletionText\":\"gpv\",\"ListItemText\":\"gpv\",\"ResultType\":2,\"ToolTip\":\"Get-ItemPropertyValue\"},{\"CompletionText\":\"Grant-AzDataShareSubscriptionAccess\",\"ListItemText\":\"Grant-AzDataShareSubscriptionAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-AzDataShareSubscriptionAccess\\r\\n\"},{\"CompletionText\":\"Grant-AzDiskAccess\",\"ListItemText\":\"Grant-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Grant-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Grant-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Grant-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Grant-AzSnapshotAccess\",\"ListItemText\":\"Grant-AzSnapshotAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-AzSnapshotAccess\\r\\n\"},{\"CompletionText\":\"Grant-FileShareAccess\",\"ListItemText\":\"Grant-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Grant-HgsKeyProtectorAccess\",\"ListItemText\":\"Grant-HgsKeyProtectorAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-HgsKeyProtectorAccess \\r\\n\"},{\"CompletionText\":\"Grant-SmbClientAccessToServer\",\"ListItemText\":\"Grant-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Grant-SmbShareAccess\",\"ListItemText\":\"Grant-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Grant-VMConnectAccess\",\"ListItemText\":\"Grant-VMConnectAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-VMConnectAccess\\r\\n\"},{\"CompletionText\":\"group\",\"ListItemText\":\"group\",\"ResultType\":2,\"ToolTip\":\"Group-Object\"},{\"CompletionText\":\"Group-Object\",\"ListItemText\":\"Group-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGroup-Object [[-Property] ] [-NoElement] [-AsHashTable] [-AsString] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\"},{\"CompletionText\":\"grpconv.exe\",\"ListItemText\":\"grpconv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\grpconv.exe\"},{\"CompletionText\":\"grsmba\",\"ListItemText\":\"grsmba\",\"ResultType\":2,\"ToolTip\":\"grsmba\"},{\"CompletionText\":\"grsmbclas\",\"ListItemText\":\"grsmbclas\",\"ResultType\":2,\"ToolTip\":\"grsmbclas\"},{\"CompletionText\":\"gsmba\",\"ListItemText\":\"gsmba\",\"ResultType\":2,\"ToolTip\":\"gsmba\"},{\"CompletionText\":\"gsmbb\",\"ListItemText\":\"gsmbb\",\"ResultType\":2,\"ToolTip\":\"gsmbb\"},{\"CompletionText\":\"gsmbc\",\"ListItemText\":\"gsmbc\",\"ResultType\":2,\"ToolTip\":\"gsmbc\"},{\"CompletionText\":\"gsmbcc\",\"ListItemText\":\"gsmbcc\",\"ResultType\":2,\"ToolTip\":\"gsmbcc\"},{\"CompletionText\":\"gsmbccm\",\"ListItemText\":\"gsmbccm\",\"ResultType\":2,\"ToolTip\":\"gsmbccm\"},{\"CompletionText\":\"gsmbclas\",\"ListItemText\":\"gsmbclas\",\"ResultType\":2,\"ToolTip\":\"gsmbclas\"},{\"CompletionText\":\"gsmbcn\",\"ListItemText\":\"gsmbcn\",\"ResultType\":2,\"ToolTip\":\"gsmbcn\"},{\"CompletionText\":\"gsmbd\",\"ListItemText\":\"gsmbd\",\"ResultType\":2,\"ToolTip\":\"gsmbd\"},{\"CompletionText\":\"gsmbgm\",\"ListItemText\":\"gsmbgm\",\"ResultType\":2,\"ToolTip\":\"gsmbgm\"},{\"CompletionText\":\"gsmbm\",\"ListItemText\":\"gsmbm\",\"ResultType\":2,\"ToolTip\":\"gsmbm\"},{\"CompletionText\":\"gsmbmc\",\"ListItemText\":\"gsmbmc\",\"ResultType\":2,\"ToolTip\":\"gsmbmc\"},{\"CompletionText\":\"gsmbo\",\"ListItemText\":\"gsmbo\",\"ResultType\":2,\"ToolTip\":\"gsmbo\"},{\"CompletionText\":\"gsmbs\",\"ListItemText\":\"gsmbs\",\"ResultType\":2,\"ToolTip\":\"gsmbs\"},{\"CompletionText\":\"gsmbsc\",\"ListItemText\":\"gsmbsc\",\"ResultType\":2,\"ToolTip\":\"gsmbsc\"},{\"CompletionText\":\"gsmbscm\",\"ListItemText\":\"gsmbscm\",\"ResultType\":2,\"ToolTip\":\"gsmbscm\"},{\"CompletionText\":\"gsmbscp\",\"ListItemText\":\"gsmbscp\",\"ResultType\":2,\"ToolTip\":\"gsmbscp\"},{\"CompletionText\":\"gsmbse\",\"ListItemText\":\"gsmbse\",\"ResultType\":2,\"ToolTip\":\"gsmbse\"},{\"CompletionText\":\"gsmbsn\",\"ListItemText\":\"gsmbsn\",\"ResultType\":2,\"ToolTip\":\"gsmbsn\"},{\"CompletionText\":\"gsmbt\",\"ListItemText\":\"gsmbt\",\"ResultType\":2,\"ToolTip\":\"gsmbt\"},{\"CompletionText\":\"gsmbw\",\"ListItemText\":\"gsmbw\",\"ResultType\":2,\"ToolTip\":\"gsmbw\"},{\"CompletionText\":\"gsn\",\"ListItemText\":\"gsn\",\"ResultType\":2,\"ToolTip\":\"Get-PSSession\"},{\"CompletionText\":\"gsv\",\"ListItemText\":\"gsv\",\"ResultType\":2,\"ToolTip\":\"Get-Service\"},{\"CompletionText\":\"gtz\",\"ListItemText\":\"gtz\",\"ResultType\":2,\"ToolTip\":\"Get-TimeZone\"},{\"CompletionText\":\"gu\",\"ListItemText\":\"gu\",\"ResultType\":2,\"ToolTip\":\"Get-Unique\"},{\"CompletionText\":\"gv\",\"ListItemText\":\"gv\",\"ResultType\":2,\"ToolTip\":\"Get-Variable\"},{\"CompletionText\":\"gvm\",\"ListItemText\":\"gvm\",\"ResultType\":2,\"ToolTip\":\"gvm\"},{\"CompletionText\":\"gvmr\",\"ListItemText\":\"gvmr\",\"ResultType\":2,\"ToolTip\":\"gvmr\"},{\"CompletionText\":\"gvmrs\",\"ListItemText\":\"gvmrs\",\"ResultType\":2,\"ToolTip\":\"gvmrs\"},{\"CompletionText\":\"h\",\"ListItemText\":\"h\",\"ResultType\":2,\"ToolTip\":\"Get-History\"},{\"CompletionText\":\"H:\",\"ListItemText\":\"H:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nH: \\r\\n\"},{\"CompletionText\":\"handle.exe\",\"ListItemText\":\"handle.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Tools\\\\Handle\\\\handle.exe\"},{\"CompletionText\":\"handle64.exe\",\"ListItemText\":\"handle64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Tools\\\\Handle\\\\handle64.exe\"},{\"CompletionText\":\"handle64a.exe\",\"ListItemText\":\"handle64a.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Tools\\\\Handle\\\\handle64a.exe\"},{\"CompletionText\":\"hatch.exe\",\"ListItemText\":\"hatch.exe\",\"ResultType\":2,\"ToolTip\":\"c:\\\\users\\\\daniel\\\\.local\\\\bin\\\\hatch.exe\"},{\"CompletionText\":\"hcsdiag.exe\",\"ListItemText\":\"hcsdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hcsdiag.exe\"},{\"CompletionText\":\"hdwwiz.cpl\",\"ListItemText\":\"hdwwiz.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hdwwiz.cpl\"},{\"CompletionText\":\"hdwwiz.exe\",\"ListItemText\":\"hdwwiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hdwwiz.exe\"},{\"CompletionText\":\"help\",\"ListItemText\":\"help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nhelp [[-Name] ] [-Path ] [-Category ] [-Full] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Detailed [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Examples [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Parameter [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Online [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -ShowWindow [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\"},{\"CompletionText\":\"help.exe\",\"ListItemText\":\"help.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\help.exe\"},{\"CompletionText\":\"HelpPane.exe\",\"ListItemText\":\"HelpPane.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\HelpPane.exe\"},{\"CompletionText\":\"hh.exe\",\"ListItemText\":\"hh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\hh.exe\"},{\"CompletionText\":\"Hide-VirtualDisk\",\"ListItemText\":\"Hide-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nHide-VirtualDisk \\r\\n\"},{\"CompletionText\":\"history\",\"ListItemText\":\"history\",\"ResultType\":2,\"ToolTip\":\"Get-History\"},{\"CompletionText\":\"hnsdiag.exe\",\"ListItemText\":\"hnsdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hnsdiag.exe\"},{\"CompletionText\":\"HOSTNAME.EXE\",\"ListItemText\":\"HOSTNAME.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\HOSTNAME.EXE\"},{\"CompletionText\":\"hsdb.exe\",\"ListItemText\":\"hsdb.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\hsdb.exe\"},{\"CompletionText\":\"hub-tool.exe\",\"ListItemText\":\"hub-tool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\hub-tool.exe\"},{\"CompletionText\":\"hvax64.exe\",\"ListItemText\":\"hvax64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvax64.exe\"},{\"CompletionText\":\"hvc.exe\",\"ListItemText\":\"hvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvc.exe\"},{\"CompletionText\":\"hvix64.exe\",\"ListItemText\":\"hvix64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvix64.exe\"},{\"CompletionText\":\"hvsievaluator.exe\",\"ListItemText\":\"hvsievaluator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvsievaluator.exe\"},{\"CompletionText\":\"I:\",\"ListItemText\":\"I:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nI: \\r\\n\"},{\"CompletionText\":\"icacls.exe\",\"ListItemText\":\"icacls.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\icacls.exe\"},{\"CompletionText\":\"icim\",\"ListItemText\":\"icim\",\"ResultType\":2,\"ToolTip\":\"icim\"},{\"CompletionText\":\"icm\",\"ListItemText\":\"icm\",\"ResultType\":2,\"ToolTip\":\"Invoke-Command\"},{\"CompletionText\":\"IcsEntitlementHost.exe\",\"ListItemText\":\"IcsEntitlementHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\IcsEntitlementHost.exe\"},{\"CompletionText\":\"icsunattend.exe\",\"ListItemText\":\"icsunattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\icsunattend.exe\"},{\"CompletionText\":\"idle.exe\",\"ListItemText\":\"idle.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\idle.exe\"},{\"CompletionText\":\"idle3.9.exe\",\"ListItemText\":\"idle3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\idle3.9.exe\"},{\"CompletionText\":\"idle3.exe\",\"ListItemText\":\"idle3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\idle3.exe\"},{\"CompletionText\":\"idlj.exe\",\"ListItemText\":\"idlj.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\idlj.exe\"},{\"CompletionText\":\"ie4uinit.exe\",\"ListItemText\":\"ie4uinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ie4uinit.exe\"},{\"CompletionText\":\"ie4ushowIE.exe\",\"ListItemText\":\"ie4ushowIE.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ie4ushowIE.exe\"},{\"CompletionText\":\"IESettingSync.exe\",\"ListItemText\":\"IESettingSync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\IESettingSync.exe\"},{\"CompletionText\":\"ieUnatt.exe\",\"ListItemText\":\"ieUnatt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ieUnatt.exe\"},{\"CompletionText\":\"iex\",\"ListItemText\":\"iex\",\"ResultType\":2,\"ToolTip\":\"Invoke-Expression\"},{\"CompletionText\":\"iexpress.exe\",\"ListItemText\":\"iexpress.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iexpress.exe\"},{\"CompletionText\":\"ihy\",\"ListItemText\":\"ihy\",\"ResultType\":2,\"ToolTip\":\"Invoke-History\"},{\"CompletionText\":\"ii\",\"ListItemText\":\"ii\",\"ResultType\":2,\"ToolTip\":\"Invoke-Item\"},{\"CompletionText\":\"immersivetpmvscmgrsvr.exe\",\"ListItemText\":\"immersivetpmvscmgrsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\immersivetpmvscmgrsvr.exe\"},{\"CompletionText\":\"Import-AdlStoreItem\",\"ListItemText\":\"Import-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Import-AdlStoreItem\"},{\"CompletionText\":\"Import-Alias\",\"ListItemText\":\"Import-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Alias [-Path] [-Scope ] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nImport-Alias -LiteralPath [-Scope ] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Import-AzAksCredential\",\"ListItemText\":\"Import-AzAksCredential\",\"ResultType\":2,\"ToolTip\":\"Import-AzAksCredential\\r\\n\"},{\"CompletionText\":\"Import-AzApiManagementApi\",\"ListItemText\":\"Import-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Import-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Import-AzAutomationDscConfiguration\",\"ListItemText\":\"Import-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Import-AzAutomationDscNodeConfiguration\",\"ListItemText\":\"Import-AzAutomationDscNodeConfiguration\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationDscNodeConfiguration\\r\\n\"},{\"CompletionText\":\"Import-AzAutomationModule\",\"ListItemText\":\"Import-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationModule\"},{\"CompletionText\":\"Import-AzAutomationRunbook\",\"ListItemText\":\"Import-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Import-AzCdnEndpointContent\",\"ListItemText\":\"Import-AzCdnEndpointContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-AzCdnEndpointContent \\r\\n\"},{\"CompletionText\":\"Import-AzConfig\",\"ListItemText\":\"Import-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Import-AzConfig\\r\\n\"},{\"CompletionText\":\"Import-AzContainerRegistryImage\",\"ListItemText\":\"Import-AzContainerRegistryImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-AzContainerRegistryImage \\r\\n\"},{\"CompletionText\":\"Import-AzContext\",\"ListItemText\":\"Import-AzContext\",\"ResultType\":2,\"ToolTip\":\"Import-AzContext\\r\\n\"},{\"CompletionText\":\"Import-AzDataLakeStoreItem\",\"ListItemText\":\"Import-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Import-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Import-AzKeyVaultCertificate\",\"ListItemText\":\"Import-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Import-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Import-AzKeyVaultSecurityDomain\",\"ListItemText\":\"Import-AzKeyVaultSecurityDomain\",\"ResultType\":2,\"ToolTip\":\"Import-AzKeyVaultSecurityDomain\\r\\n\"},{\"CompletionText\":\"Import-AzMlWebService\",\"ListItemText\":\"Import-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Import-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Import-AzRecoveryServicesAsrVaultSettingsFile\",\"ListItemText\":\"Import-AzRecoveryServicesAsrVaultSettingsFile\",\"ResultType\":2,\"ToolTip\":\"Import-AzRecoveryServicesAsrVaultSettingsFile\\r\\n\"},{\"CompletionText\":\"Import-AzRedisCache\",\"ListItemText\":\"Import-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Import-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Import-AzRedisEnterpriseCache\",\"ListItemText\":\"Import-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Import-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Import-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"Import-AzRedisEnterpriseCacheDatabase\"},{\"CompletionText\":\"Import-AzSynapseKqlScript\",\"ListItemText\":\"Import-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseKqlScript\"},{\"CompletionText\":\"Import-AzSynapseNotebook\",\"ListItemText\":\"Import-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseNotebook\"},{\"CompletionText\":\"Import-AzSynapseSparkConfiguration\",\"ListItemText\":\"Import-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseSparkConfiguration\"},{\"CompletionText\":\"Import-AzSynapseSqlScript\",\"ListItemText\":\"Import-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseSqlScript\"},{\"CompletionText\":\"Import-AzWebAppKeyVaultCertificate\",\"ListItemText\":\"Import-AzWebAppKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Import-AzWebAppKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Import-BCCachePackage\",\"ListItemText\":\"Import-BCCachePackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-BCCachePackage \\r\\n\"},{\"CompletionText\":\"Import-BcdStore\",\"ListItemText\":\"Import-BcdStore\",\"ResultType\":2,\"ToolTip\":\"Import-BcdStore\\r\\n\"},{\"CompletionText\":\"Import-BCSecretKey\",\"ListItemText\":\"Import-BCSecretKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-BCSecretKey \\r\\n\"},{\"CompletionText\":\"Import-BinaryMiLog\",\"ListItemText\":\"Import-BinaryMiLog\",\"ResultType\":2,\"ToolTip\":\"Import-BinaryMiLog\\r\\n\"},{\"CompletionText\":\"Import-Certificate\",\"ListItemText\":\"Import-Certificate\",\"ResultType\":2,\"ToolTip\":\"Import-Certificate\\r\\n\"},{\"CompletionText\":\"Import-Clixml\",\"ListItemText\":\"Import-Clixml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Clixml [-Path] [-IncludeTotalCount] [-Skip ] [-First ] []\\r\\n\\r\\nImport-Clixml -LiteralPath [-IncludeTotalCount] [-Skip ] [-First ] []\\r\\n\"},{\"CompletionText\":\"Import-Counter\",\"ListItemText\":\"Import-Counter\",\"ResultType\":2,\"ToolTip\":\"Import-Counter\\r\\n\"},{\"CompletionText\":\"Import-Csv\",\"ListItemText\":\"Import-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Csv [-Path] [[-Delimiter] ] [-Header ] [-Encoding ] []\\r\\n\\r\\nImport-Csv [[-Delimiter] ] -LiteralPath [-Header ] [-Encoding ] []\\r\\n\\r\\nImport-Csv [-Path] -UseCulture [-Header ] [-Encoding ] []\\r\\n\\r\\nImport-Csv -LiteralPath -UseCulture [-Header ] [-Encoding ] []\\r\\n\"},{\"CompletionText\":\"Import-HgsGuardian\",\"ListItemText\":\"Import-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Import-IseSnippet\",\"ListItemText\":\"Import-IseSnippet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-IseSnippet \\r\\n\"},{\"CompletionText\":\"Import-LocalizedData\",\"ListItemText\":\"Import-LocalizedData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-LocalizedData [[-BindingVariable] ] [[-UICulture] ] [-BaseDirectory ] [-FileName ] [-SupportedCommand ] []\\r\\n\"},{\"CompletionText\":\"Import-Module\",\"ListItemText\":\"Import-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Module [-Name] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-Name] -PSSession [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-Name] -CimSession [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] [-CimResourceUri ] [-CimNamespace ] []\\r\\n\\r\\nImport-Module [-Name] -UseWindowsPowerShell [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-FullyQualifiedName] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-FullyQualifiedName] -PSSession [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-FullyQualifiedName] -UseWindowsPowerShell [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-Assembly] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-ModuleInfo] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\"},{\"CompletionText\":\"Import-PackageProvider\",\"ListItemText\":\"Import-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Import-PackageProvider\\r\\n\"},{\"CompletionText\":\"Import-PfxCertificate\",\"ListItemText\":\"Import-PfxCertificate\",\"ResultType\":2,\"ToolTip\":\"Import-PfxCertificate\\r\\n\"},{\"CompletionText\":\"Import-PowerShellDataFile\",\"ListItemText\":\"Import-PowerShellDataFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-PowerShellDataFile [-Path] [-SkipLimitCheck] []\\r\\n\\r\\nImport-PowerShellDataFile [-LiteralPath] [-SkipLimitCheck] []\\r\\n\"},{\"CompletionText\":\"Import-PSGetRepository\",\"ListItemText\":\"Import-PSGetRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-PSGetRepository \\r\\n\"},{\"CompletionText\":\"Import-PSSession\",\"ListItemText\":\"Import-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-PSSession [-Session] [[-CommandName] ] [[-FormatTypeName] ] [-Prefix ] [-DisableNameChecking] [-AllowClobber] [-ArgumentList ] [-CommandType ] [-Module ] [-FullyQualifiedModule ] [-Certificate ] []\\r\\n\"},{\"CompletionText\":\"Import-StartLayout\",\"ListItemText\":\"Import-StartLayout\",\"ResultType\":2,\"ToolTip\":\"Import-StartLayout\\r\\n\"},{\"CompletionText\":\"Import-TpmOwnerAuth\",\"ListItemText\":\"Import-TpmOwnerAuth\",\"ResultType\":2,\"ToolTip\":\"Import-TpmOwnerAuth\\r\\n\"},{\"CompletionText\":\"Import-VM\",\"ListItemText\":\"Import-VM\",\"ResultType\":2,\"ToolTip\":\"Import-VM\\r\\n\"},{\"CompletionText\":\"Import-VMInitialReplication\",\"ListItemText\":\"Import-VMInitialReplication\",\"ResultType\":2,\"ToolTip\":\"Import-VMInitialReplication\\r\\n\"},{\"CompletionText\":\"Import-WinhttpProxy\",\"ListItemText\":\"Import-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"In\",\"ListItemText\":\"In\",\"ResultType\":2,\"ToolTip\":\"\\r\\nIn \\r\\n\"},{\"CompletionText\":\"inetcpl.cpl\",\"ListItemText\":\"inetcpl.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\inetcpl.cpl\"},{\"CompletionText\":\"InfDefaultInstall.exe\",\"ListItemText\":\"InfDefaultInstall.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\InfDefaultInstall.exe\"},{\"CompletionText\":\"Initialize-AzDataProtectionBackupInstance\",\"ListItemText\":\"Initialize-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Initialize-AzDataProtectionRestoreRequest\",\"ListItemText\":\"Initialize-AzDataProtectionRestoreRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-AzDataProtectionRestoreRequest \\r\\n\"},{\"CompletionText\":\"Initialize-AzMigrateReplicationInfrastructure\",\"ListItemText\":\"Initialize-AzMigrateReplicationInfrastructure\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-AzMigrateReplicationInfrastructure \\r\\n\"},{\"CompletionText\":\"Initialize-AzRecoveryServicesBackupProtectableItem\",\"ListItemText\":\"Initialize-AzRecoveryServicesBackupProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Initialize-AzRecoveryServicesBackupProtectableItem\\r\\n\"},{\"CompletionText\":\"Initialize-AzRecoveryServicesDSMove\",\"ListItemText\":\"Initialize-AzRecoveryServicesDSMove\",\"ResultType\":2,\"ToolTip\":\"Initialize-AzRecoveryServicesDSMove\\r\\n\"},{\"CompletionText\":\"Initialize-Disk\",\"ListItemText\":\"Initialize-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-Disk \\r\\n\"},{\"CompletionText\":\"Initialize-PmemPhysicalDevice\",\"ListItemText\":\"Initialize-PmemPhysicalDevice\",\"ResultType\":2,\"ToolTip\":\"Initialize-PmemPhysicalDevice\\r\\n\"},{\"CompletionText\":\"Initialize-Tpm\",\"ListItemText\":\"Initialize-Tpm\",\"ResultType\":2,\"ToolTip\":\"Initialize-Tpm\\r\\n\"},{\"CompletionText\":\"Initialize-Volume\",\"ListItemText\":\"Initialize-Volume\",\"ResultType\":2,\"ToolTip\":\"Initialize-Volume\"},{\"CompletionText\":\"inmo\",\"ListItemText\":\"inmo\",\"ResultType\":2,\"ToolTip\":\"inmo\"},{\"CompletionText\":\"InModuleScope\",\"ListItemText\":\"InModuleScope\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInModuleScope \\r\\n\"},{\"CompletionText\":\"InputSwitchToastHandler.exe\",\"ListItemText\":\"InputSwitchToastHandler.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\InputSwitchToastHandler.exe\"},{\"CompletionText\":\"Install-AzAksCliTool\",\"ListItemText\":\"Install-AzAksCliTool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-AzAksCliTool \\r\\n\"},{\"CompletionText\":\"Install-AzAksKubectl\",\"ListItemText\":\"Install-AzAksKubectl\",\"ResultType\":2,\"ToolTip\":\"Install-AzAksKubectl\"},{\"CompletionText\":\"Install-AzStackHCIRemoteSupport\",\"ListItemText\":\"Install-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Install-Dtc\",\"ListItemText\":\"Install-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Dtc \\r\\n\"},{\"CompletionText\":\"Install-Language\",\"ListItemText\":\"Install-Language\",\"ResultType\":2,\"ToolTip\":\"Install-Language\\r\\n\"},{\"CompletionText\":\"Install-Module\",\"ListItemText\":\"Install-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Module \\r\\n\"},{\"CompletionText\":\"Install-Package\",\"ListItemText\":\"Install-Package\",\"ResultType\":2,\"ToolTip\":\"Install-Package\\r\\n\"},{\"CompletionText\":\"Install-PackageProvider\",\"ListItemText\":\"Install-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Install-PackageProvider\\r\\n\"},{\"CompletionText\":\"Install-PowerShellRemoting.ps1\",\"ListItemText\":\"Install-PowerShellRemoting.ps1\",\"ResultType\":2,\"ToolTip\":\"Install-PowerShellRemoting.ps1 [-PowerShellHome ] []\\r\\nInstall-PowerShellRemoting.ps1 -Force [-PowerShellHome ] []\\r\\n\"},{\"CompletionText\":\"Install-ProvisioningPackage\",\"ListItemText\":\"Install-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Install-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Install-PSResource\",\"ListItemText\":\"Install-PSResource\",\"ResultType\":2,\"ToolTip\":\"Install-PSResource\\r\\n\"},{\"CompletionText\":\"Install-Script\",\"ListItemText\":\"Install-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Script \\r\\n\"},{\"CompletionText\":\"Install-TrustedProvisioningCertificate\",\"ListItemText\":\"Install-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Install-TrustedProvisioningCertificate\\r\\n\"},{\"CompletionText\":\"InstallPSCorePolicyDefinitions.ps1\",\"ListItemText\":\"InstallPSCorePolicyDefinitions.ps1\",\"ResultType\":2,\"ToolTip\":\"InstallPSCorePolicyDefinitions.ps1 [[-Path] ] []\\r\\n\"},{\"CompletionText\":\"install_tools.bat\",\"ListItemText\":\"install_tools.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\install_tools.bat\"},{\"CompletionText\":\"intl.cpl\",\"ListItemText\":\"intl.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\intl.cpl\"},{\"CompletionText\":\"Invoke-AsWorkflow\",\"ListItemText\":\"Invoke-AsWorkflow\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AsWorkflow \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksAbortAgentPoolLatestOperation\",\"ListItemText\":\"Invoke-AzAksAbortAgentPoolLatestOperation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzAksAbortAgentPoolLatestOperation \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksAbortManagedClusterLatestOperation\",\"ListItemText\":\"Invoke-AzAksAbortManagedClusterLatestOperation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzAksAbortManagedClusterLatestOperation \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksRotateManagedClusterServiceAccountSigningKey\",\"ListItemText\":\"Invoke-AzAksRotateManagedClusterServiceAccountSigningKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzAksRotateManagedClusterServiceAccountSigningKey \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksRunCommand\",\"ListItemText\":\"Invoke-AzAksRunCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzAksRunCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceRebuild\",\"ListItemText\":\"Invoke-AzCloudServiceRebuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceRebuild \\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceReimage\",\"ListItemText\":\"Invoke-AzCloudServiceReimage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceReimage \\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceRoleInstanceRebuild\",\"ListItemText\":\"Invoke-AzCloudServiceRoleInstanceRebuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceRoleInstanceRebuild \\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceRoleInstanceReimage\",\"ListItemText\":\"Invoke-AzCloudServiceRoleInstanceReimage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceRoleInstanceReimage \\r\\n\"},{\"CompletionText\":\"Invoke-AzContainerInstanceCommand\",\"ListItemText\":\"Invoke-AzContainerInstanceCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzContainerInstanceCommand \\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBCassandraKeyspaceThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBCassandraKeyspaceThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBCassandraKeyspaceThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBCassandraTableThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBCassandraTableThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBCassandraTableThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBGremlinDatabaseThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBGremlinDatabaseThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBGremlinDatabaseThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBGremlinGraphThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBGremlinGraphThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBGremlinGraphThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBMongoDBCollectionThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBMongoDBCollectionThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBMongoDBCollectionThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBMongoDBDatabaseThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBMongoDBDatabaseThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBMongoDBDatabaseThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBSqlContainerThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBSqlContainerThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBSqlContainerThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBSqlDatabaseThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBSqlDatabaseThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBSqlDatabaseThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBTableThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBTableThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBTableThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataBoxEdgeDevice\",\"ListItemText\":\"Invoke-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataBoxEdgeShare\",\"ListItemText\":\"Invoke-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"Invoke-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2DataFlowDebugSessionCommand\",\"ListItemText\":\"Invoke-AzDataFactoryV2DataFlowDebugSessionCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2DataFlowDebugSessionCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2IntegrationRuntimeUpgrade\",\"ListItemText\":\"Invoke-AzDataFactoryV2IntegrationRuntimeUpgrade\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2IntegrationRuntimeUpgrade\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Invoke-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2TriggerRun\",\"ListItemText\":\"Invoke-AzDataFactoryV2TriggerRun\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2TriggerRun\\r\\n\"},{\"CompletionText\":\"Invoke-AzHDInsightHiveJob\",\"ListItemText\":\"Invoke-AzHDInsightHiveJob\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzHDInsightHiveJob\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubConfigMetric\",\"ListItemText\":\"Invoke-AzIotHubConfigMetric\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubConfigMetric\"},{\"CompletionText\":\"Invoke-AzIotHubConfigurationMetricsQuery\",\"ListItemText\":\"Invoke-AzIotHubConfigurationMetricsQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubConfigurationMetricsQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubDeploymentMetricsQuery\",\"ListItemText\":\"Invoke-AzIotHubDeploymentMetricsQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubDeploymentMetricsQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubDeployMetric\",\"ListItemText\":\"Invoke-AzIotHubDeployMetric\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubDeployMetric\"},{\"CompletionText\":\"Invoke-AzIotHubDeviceMethod\",\"ListItemText\":\"Invoke-AzIotHubDeviceMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubDeviceMethod\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubManualFailover\",\"ListItemText\":\"Invoke-AzIotHubManualFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubManualFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubModuleMethod\",\"ListItemText\":\"Invoke-AzIotHubModuleMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubModuleMethod\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubQuery\",\"ListItemText\":\"Invoke-AzIotHubQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzKeyVaultKeyOperation\",\"ListItemText\":\"Invoke-AzKeyVaultKeyOperation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzKeyVaultKeyOperation\\r\\n\"},{\"CompletionText\":\"Invoke-AzKeyVaultKeyRotation\",\"ListItemText\":\"Invoke-AzKeyVaultKeyRotation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzKeyVaultKeyRotation\\r\\n\"},{\"CompletionText\":\"Invoke-AzKustoDataConnectionValidation\",\"ListItemText\":\"Invoke-AzKustoDataConnectionValidation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzKustoDataConnectionValidation \\r\\n\"},{\"CompletionText\":\"Invoke-AzKustoDetachClusterFollowerDatabase\",\"ListItemText\":\"Invoke-AzKustoDetachClusterFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzKustoDetachClusterFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Invoke-AzKustoDiagnoseClusterVirtualNetwork\",\"ListItemText\":\"Invoke-AzKustoDiagnoseClusterVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzKustoDiagnoseClusterVirtualNetwork \\r\\n\"},{\"CompletionText\":\"Invoke-AzMarketplaceSignTerms\",\"ListItemText\":\"Invoke-AzMarketplaceSignTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzMarketplaceSignTerms \\r\\n\"},{\"CompletionText\":\"Invoke-AzMLWorkspaceDiagnose\",\"ListItemText\":\"Invoke-AzMLWorkspaceDiagnose\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzMLWorkspaceDiagnose \\r\\n\"},{\"CompletionText\":\"Invoke-AzMLWorkspaceNotebook\",\"ListItemText\":\"Invoke-AzMLWorkspaceNotebook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzMLWorkspaceNotebook \\r\\n\"},{\"CompletionText\":\"Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic\",\"ListItemText\":\"Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic\\r\\n\"},{\"CompletionText\":\"Invoke-AzOperationalInsightsMigrateTable\",\"ListItemText\":\"Invoke-AzOperationalInsightsMigrateTable\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzOperationalInsightsMigrateTable\\r\\n\"},{\"CompletionText\":\"Invoke-AzOperationalInsightsQuery\",\"ListItemText\":\"Invoke-AzOperationalInsightsQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzOperationalInsightsQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzRedeploySqlVM\",\"ListItemText\":\"Invoke-AzRedeploySqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzRedeploySqlVM \\r\\n\"},{\"CompletionText\":\"Invoke-AzRedisEnterpriseCacheDatabaseFlush\",\"ListItemText\":\"Invoke-AzRedisEnterpriseCacheDatabaseFlush\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzRedisEnterpriseCacheDatabaseFlush \\r\\n\"},{\"CompletionText\":\"Invoke-AzRedisEnterpriseCacheForceDatabaseUnlink\",\"ListItemText\":\"Invoke-AzRedisEnterpriseCacheForceDatabaseUnlink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzRedisEnterpriseCacheForceDatabaseUnlink \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceAction\",\"ListItemText\":\"Invoke-AzResourceAction\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzResourceAction\\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverBulkRemove\",\"ListItemText\":\"Invoke-AzResourceMoverBulkRemove\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverBulkRemove \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverCommit\",\"ListItemText\":\"Invoke-AzResourceMoverCommit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverCommit \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverDiscard\",\"ListItemText\":\"Invoke-AzResourceMoverDiscard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverDiscard \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverInitiateMove\",\"ListItemText\":\"Invoke-AzResourceMoverInitiateMove\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverInitiateMove \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverPrepare\",\"ListItemText\":\"Invoke-AzResourceMoverPrepare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverPrepare \\r\\n\"},{\"CompletionText\":\"Invoke-AzRest\",\"ListItemText\":\"Invoke-AzRest\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzRest\"},{\"CompletionText\":\"Invoke-AzRestMethod\",\"ListItemText\":\"Invoke-AzRestMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzRestMethod\\r\\n\"},{\"CompletionText\":\"Invoke-AzRmStorageContainerImmutableStorageWithVersioningMigration\",\"ListItemText\":\"Invoke-AzRmStorageContainerImmutableStorageWithVersioningMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzRmStorageContainerImmutableStorageWithVersioningMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzSentinelThreatIntelligenceIndicatorQuery\",\"ListItemText\":\"Invoke-AzSentinelThreatIntelligenceIndicatorQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzSentinelThreatIntelligenceIndicatorQuery \\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlDatabaseFailover\",\"ListItemText\":\"Invoke-AzSqlDatabaseFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlDatabaseFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevalidation\",\"ListItemText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevalidation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevalidation\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevert\",\"ListItemText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevert\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevert\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlElasticPoolFailover\",\"ListItemText\":\"Invoke-AzSqlElasticPoolFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlElasticPoolFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlInstanceFailover\",\"ListItemText\":\"Invoke-AzSqlInstanceFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlInstanceFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlInstanceTransparentDataEncryptionProtectorRevalidation\",\"ListItemText\":\"Invoke-AzSqlInstanceTransparentDataEncryptionProtectorRevalidation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlInstanceTransparentDataEncryptionProtectorRevalidation\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlServerExternalGovernanceStatusRefresh\",\"ListItemText\":\"Invoke-AzSqlServerExternalGovernanceStatusRefresh\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlServerExternalGovernanceStatusRefresh\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlServerTransparentDataEncryptionProtectorRevalidation\",\"ListItemText\":\"Invoke-AzSqlServerTransparentDataEncryptionProtectorRevalidation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlServerTransparentDataEncryptionProtectorRevalidation\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlVMTroubleshoot\",\"ListItemText\":\"Invoke-AzSqlVMTroubleshoot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzSqlVMTroubleshoot \\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageAccountFailover\",\"ListItemText\":\"Invoke-AzStorageAccountFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageAccountFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ListItemText\":\"Invoke-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageAccountHierarchicalNamespaceUpgrade\\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageSyncChangeDetection\",\"ListItemText\":\"Invoke-AzStorageSyncChangeDetection\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageSyncChangeDetection\\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageSyncCompatibilityCheck\",\"ListItemText\":\"Invoke-AzStorageSyncCompatibilityCheck\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageSyncCompatibilityCheck\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseDataFlowDebugSessionCommand\",\"ListItemText\":\"Invoke-AzSynapseDataFlowDebugSessionCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseDataFlowDebugSessionCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseDetachKustoPoolFollowerDatabase\",\"ListItemText\":\"Invoke-AzSynapseDetachKustoPoolFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzSynapseDetachKustoPoolFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseIntegrationRuntimeUpgrade\",\"ListItemText\":\"Invoke-AzSynapseIntegrationRuntimeUpgrade\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseIntegrationRuntimeUpgrade\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapsePipeline\",\"ListItemText\":\"Invoke-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseSparkStatement\",\"ListItemText\":\"Invoke-AzSynapseSparkStatement\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseSparkStatement\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseTriggerRun\",\"ListItemText\":\"Invoke-AzSynapseTriggerRun\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseTriggerRun\\r\\n\"},{\"CompletionText\":\"Invoke-AzVmAssessPatch\",\"ListItemText\":\"Invoke-AzVmAssessPatch\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmAssessPatch\"},{\"CompletionText\":\"Invoke-AzVmInstallPatch\",\"ListItemText\":\"Invoke-AzVmInstallPatch\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmInstallPatch\\r\\n\"},{\"CompletionText\":\"Invoke-AzVmPatchAssess\",\"ListItemText\":\"Invoke-AzVmPatchAssess\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmPatchAssess\"},{\"CompletionText\":\"Invoke-AzVmPatchAssessment\",\"ListItemText\":\"Invoke-AzVmPatchAssessment\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmPatchAssessment\\r\\n\"},{\"CompletionText\":\"Invoke-AzVMReimage\",\"ListItemText\":\"Invoke-AzVMReimage\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVMReimage\\r\\n\"},{\"CompletionText\":\"Invoke-AzVMRunCommand\",\"ListItemText\":\"Invoke-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVMRunCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzVmssVMRunCommand\",\"ListItemText\":\"Invoke-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmssVMRunCommand\\r\\n\"},{\"CompletionText\":\"Invoke-CimMethod\",\"ListItemText\":\"Invoke-CimMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-CimMethod\\r\\n\"},{\"CompletionText\":\"Invoke-Command\",\"ListItemText\":\"Invoke-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Command [-ScriptBlock] [-NoNewScope] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-Session] ] [-ScriptBlock] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-Session] ] [-FilePath] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-ComputerName] ] [-ScriptBlock] [-Credential ] [-Port ] [-UseSSL] [-ConfigurationName ] [-ApplicationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-SessionName ] [-HideComputerName] [-JobName ] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] [-CertificateThumbprint ] []\\r\\n\\r\\nInvoke-Command [[-ComputerName] ] [-FilePath] [-Credential ] [-Port ] [-UseSSL] [-ConfigurationName ] [-ApplicationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-SessionName ] [-HideComputerName] [-JobName ] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-ConnectionUri] ] [-ScriptBlock] [-Credential ] [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-HideComputerName] [-JobName ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] [-CertificateThumbprint ] []\\r\\n\\r\\nInvoke-Command [[-ConnectionUri] ] [-FilePath] [-Credential ] [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-HideComputerName] [-JobName ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-VMId] [-ScriptBlock] -Credential [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -Credential -VMName [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-VMId] [-FilePath] -Credential [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-FilePath] -Credential -VMName [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -HostName [-Port ] [-AsJob] [-HideComputerName] [-JobName ] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] [-Options ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -ContainerId [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RunAsAdministrator] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-FilePath] -ContainerId [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RunAsAdministrator] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -SSHConnection [-AsJob] [-HideComputerName] [-JobName ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command -FilePath -HostName [-AsJob] [-HideComputerName] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] [-Options ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command -FilePath -SSHConnection [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\"},{\"CompletionText\":\"Invoke-CommandInDesktopPackage\",\"ListItemText\":\"Invoke-CommandInDesktopPackage\",\"ResultType\":2,\"ToolTip\":\"Invoke-CommandInDesktopPackage\\r\\n\"},{\"CompletionText\":\"Invoke-DscResource\",\"ListItemText\":\"Invoke-DscResource\",\"ResultType\":2,\"ToolTip\":\"Invoke-DscResource\\r\\n\"},{\"CompletionText\":\"Invoke-Expression\",\"ListItemText\":\"Invoke-Expression\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Expression [-Command] []\\r\\n\"},{\"CompletionText\":\"Invoke-History\",\"ListItemText\":\"Invoke-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-History [[-Id] ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Invoke-HnsRequest\",\"ListItemText\":\"Invoke-HnsRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-HnsRequest \\r\\n\"},{\"CompletionText\":\"Invoke-Item\",\"ListItemText\":\"Invoke-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Item [-Path] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nInvoke-Item -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Invoke-LapsPolicyProcessing\",\"ListItemText\":\"Invoke-LapsPolicyProcessing\",\"ResultType\":2,\"ToolTip\":\"Invoke-LapsPolicyProcessing\\r\\n\"},{\"CompletionText\":\"Invoke-Mock\",\"ListItemText\":\"Invoke-Mock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Mock \\r\\n\"},{\"CompletionText\":\"Invoke-OperationValidation\",\"ListItemText\":\"Invoke-OperationValidation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-OperationValidation \\r\\n\"},{\"CompletionText\":\"Invoke-Pester\",\"ListItemText\":\"Invoke-Pester\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Pester \\r\\n\"},{\"CompletionText\":\"Invoke-RestMethod\",\"ListItemText\":\"Invoke-RestMethod\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-RestMethod [-Uri] [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-RestMethod [-Uri] -NoProxy [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-RestMethod [-Uri] -CustomMethod [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-RestMethod [-Uri] -CustomMethod -NoProxy [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\"},{\"CompletionText\":\"Invoke-TroubleshootingPack\",\"ListItemText\":\"Invoke-TroubleshootingPack\",\"ResultType\":2,\"ToolTip\":\"Invoke-TroubleshootingPack\\r\\n\"},{\"CompletionText\":\"Invoke-WebRequest\",\"ListItemText\":\"Invoke-WebRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-WebRequest [-Uri] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-WebRequest [-Uri] -NoProxy [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-WebRequest [-Uri] -CustomMethod [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-WebRequest [-Uri] -CustomMethod -NoProxy [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\"},{\"CompletionText\":\"Invoke-WSManAction\",\"ListItemText\":\"Invoke-WSManAction\",\"ResultType\":2,\"ToolTip\":\"Invoke-WSManAction\\r\\n\"},{\"CompletionText\":\"iotstartup.exe\",\"ListItemText\":\"iotstartup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iotstartup.exe\"},{\"CompletionText\":\"ipal\",\"ListItemText\":\"ipal\",\"ResultType\":2,\"ToolTip\":\"Import-Alias\"},{\"CompletionText\":\"ipconfig.exe\",\"ListItemText\":\"ipconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ipconfig.exe\"},{\"CompletionText\":\"ipcsv\",\"ListItemText\":\"ipcsv\",\"ResultType\":2,\"ToolTip\":\"Import-Csv\"},{\"CompletionText\":\"ipmo\",\"ListItemText\":\"ipmo\",\"ResultType\":2,\"ToolTip\":\"Import-Module\"},{\"CompletionText\":\"irm\",\"ListItemText\":\"irm\",\"ResultType\":2,\"ToolTip\":\"Invoke-RestMethod\"},{\"CompletionText\":\"irprops.cpl\",\"ListItemText\":\"irprops.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\irprops.cpl\"},{\"CompletionText\":\"iru\",\"ListItemText\":\"iru\",\"ResultType\":2,\"ToolTip\":\"iru\"},{\"CompletionText\":\"iscsicli.exe\",\"ListItemText\":\"iscsicli.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iscsicli.exe\"},{\"CompletionText\":\"iscsicpl.exe\",\"ListItemText\":\"iscsicpl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iscsicpl.exe\"},{\"CompletionText\":\"ISM.exe\",\"ListItemText\":\"ISM.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ISM.exe\"},{\"CompletionText\":\"isoburn.exe\",\"ListItemText\":\"isoburn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\isoburn.exe\"},{\"CompletionText\":\"isres\",\"ListItemText\":\"isres\",\"ResultType\":2,\"ToolTip\":\"isres\"},{\"CompletionText\":\"It\",\"ListItemText\":\"It\",\"ResultType\":2,\"ToolTip\":\"\\r\\nIt \\r\\n\"},{\"CompletionText\":\"iwr\",\"ListItemText\":\"iwr\",\"ResultType\":2,\"ToolTip\":\"Invoke-WebRequest\"},{\"CompletionText\":\"J:\",\"ListItemText\":\"J:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nJ: \\r\\n\"},{\"CompletionText\":\"jabswitch.exe\",\"ListItemText\":\"jabswitch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jabswitch.exe\"},{\"CompletionText\":\"jar.exe\",\"ListItemText\":\"jar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jar.exe\"},{\"CompletionText\":\"jarsigner.exe\",\"ListItemText\":\"jarsigner.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jarsigner.exe\"},{\"CompletionText\":\"java-rmi.exe\",\"ListItemText\":\"java-rmi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\java-rmi.exe\"},{\"CompletionText\":\"java.exe\",\"ListItemText\":\"java.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\java.exe\"},{\"CompletionText\":\"javac.exe\",\"ListItemText\":\"javac.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javac.exe\"},{\"CompletionText\":\"javadoc.exe\",\"ListItemText\":\"javadoc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javadoc.exe\"},{\"CompletionText\":\"javah.exe\",\"ListItemText\":\"javah.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javah.exe\"},{\"CompletionText\":\"javap.exe\",\"ListItemText\":\"javap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javap.exe\"},{\"CompletionText\":\"javaw.exe\",\"ListItemText\":\"javaw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javaw.exe\"},{\"CompletionText\":\"jcmd.exe\",\"ListItemText\":\"jcmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jcmd.exe\"},{\"CompletionText\":\"jconsole.exe\",\"ListItemText\":\"jconsole.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jconsole.exe\"},{\"CompletionText\":\"jdb.exe\",\"ListItemText\":\"jdb.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jdb.exe\"},{\"CompletionText\":\"jdeps.exe\",\"ListItemText\":\"jdeps.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jdeps.exe\"},{\"CompletionText\":\"jfr.exe\",\"ListItemText\":\"jfr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jfr.exe\"},{\"CompletionText\":\"jhat.exe\",\"ListItemText\":\"jhat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jhat.exe\"},{\"CompletionText\":\"jinfo.exe\",\"ListItemText\":\"jinfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jinfo.exe\"},{\"CompletionText\":\"jjs.exe\",\"ListItemText\":\"jjs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jjs.exe\"},{\"CompletionText\":\"jmap.exe\",\"ListItemText\":\"jmap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jmap.exe\"},{\"CompletionText\":\"Join-AdlStoreItem\",\"ListItemText\":\"Join-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Join-AdlStoreItem\"},{\"CompletionText\":\"Join-AzDataLakeStoreItem\",\"ListItemText\":\"Join-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Join-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Join-DtcDiagnosticResourceManager\",\"ListItemText\":\"Join-DtcDiagnosticResourceManager\",\"ResultType\":2,\"ToolTip\":\"Join-DtcDiagnosticResourceManager\\r\\n\"},{\"CompletionText\":\"Join-Path\",\"ListItemText\":\"Join-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nJoin-Path [-Path] [-ChildPath] [[-AdditionalChildPath] ] [-Resolve] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Join-String\",\"ListItemText\":\"Join-String\",\"ResultType\":2,\"ToolTip\":\"\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-UseCulture] [-InputObject ] []\\r\\n\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-SingleQuote] [-UseCulture] [-InputObject ] []\\r\\n\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-DoubleQuote] [-UseCulture] [-InputObject ] []\\r\\n\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-FormatString ] [-UseCulture] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"joy.cpl\",\"ListItemText\":\"joy.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\joy.cpl\"},{\"CompletionText\":\"jps.exe\",\"ListItemText\":\"jps.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jps.exe\"},{\"CompletionText\":\"jrunscript.exe\",\"ListItemText\":\"jrunscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jrunscript.exe\"},{\"CompletionText\":\"jsadebugd.exe\",\"ListItemText\":\"jsadebugd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jsadebugd.exe\"},{\"CompletionText\":\"jstack.exe\",\"ListItemText\":\"jstack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jstack.exe\"},{\"CompletionText\":\"jstat.exe\",\"ListItemText\":\"jstat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jstat.exe\"},{\"CompletionText\":\"jstatd.exe\",\"ListItemText\":\"jstatd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jstatd.exe\"},{\"CompletionText\":\"K:\",\"ListItemText\":\"K:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nK: \\r\\n\"},{\"CompletionText\":\"keyboxd.exe\",\"ListItemText\":\"keyboxd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\keyboxd.exe\"},{\"CompletionText\":\"keytool.exe\",\"ListItemText\":\"keytool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\keytool.exe\"},{\"CompletionText\":\"kill\",\"ListItemText\":\"kill\",\"ResultType\":2,\"ToolTip\":\"Stop-Process\"},{\"CompletionText\":\"kinit.exe\",\"ListItemText\":\"kinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\kinit.exe\"},{\"CompletionText\":\"klist.exe\",\"ListItemText\":\"klist.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\klist.exe\"},{\"CompletionText\":\"ksetup.exe\",\"ListItemText\":\"ksetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ksetup.exe\"},{\"CompletionText\":\"ktab.exe\",\"ListItemText\":\"ktab.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\ktab.exe\"},{\"CompletionText\":\"ktmutil.exe\",\"ListItemText\":\"ktmutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ktmutil.exe\"},{\"CompletionText\":\"kubectl.exe\",\"ListItemText\":\"kubectl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\kubectl.exe\"},{\"CompletionText\":\"L:\",\"ListItemText\":\"L:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nL: \\r\\n\"},{\"CompletionText\":\"la57setup.exe\",\"ListItemText\":\"la57setup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\la57setup.exe\"},{\"CompletionText\":\"label.exe\",\"ListItemText\":\"label.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\label.exe\"},{\"CompletionText\":\"LanguageComponentsInstallerComHandler.exe\",\"ListItemText\":\"LanguageComponentsInstallerComHandler.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LanguageComponentsInstallerComHandler.exe\"},{\"CompletionText\":\"LaunchTM.exe\",\"ListItemText\":\"LaunchTM.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LaunchTM.exe\"},{\"CompletionText\":\"LaunchWinApp.exe\",\"ListItemText\":\"LaunchWinApp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LaunchWinApp.exe\"},{\"CompletionText\":\"LegacyNetUXHost.exe\",\"ListItemText\":\"LegacyNetUXHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LegacyNetUXHost.exe\"},{\"CompletionText\":\"less.exe\",\"ListItemText\":\"less.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\less.exe\"},{\"CompletionText\":\"LicenseManagerShellext.exe\",\"ListItemText\":\"LicenseManagerShellext.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LicenseManagerShellext.exe\"},{\"CompletionText\":\"licensingdiag.exe\",\"ListItemText\":\"licensingdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\licensingdiag.exe\"},{\"CompletionText\":\"LicensingUI.exe\",\"ListItemText\":\"LicensingUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LicensingUI.exe\"},{\"CompletionText\":\"List-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ListItemText\":\"List-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewayAvailableServerVariableAndHeader\"},{\"CompletionText\":\"List-AzApplicationGatewayAvailableSslOptions\",\"ListItemText\":\"List-AzApplicationGatewayAvailableSslOptions\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewayAvailableSslOptions\"},{\"CompletionText\":\"List-AzApplicationGatewayAvailableWafRuleSets\",\"ListItemText\":\"List-AzApplicationGatewayAvailableWafRuleSets\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewayAvailableWafRuleSets\"},{\"CompletionText\":\"List-AzApplicationGatewaySslPredefinedPolicy\",\"ListItemText\":\"List-AzApplicationGatewaySslPredefinedPolicy\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewaySslPredefinedPolicy\"},{\"CompletionText\":\"LiveCaptions.exe\",\"ListItemText\":\"LiveCaptions.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LiveCaptions.exe\"},{\"CompletionText\":\"LocationNotificationWindows.exe\",\"ListItemText\":\"LocationNotificationWindows.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LocationNotificationWindows.exe\"},{\"CompletionText\":\"Locator.exe\",\"ListItemText\":\"Locator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Locator.exe\"},{\"CompletionText\":\"Lock-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Lock-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Lock-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Lock-BitLocker\",\"ListItemText\":\"Lock-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nLock-BitLocker \\r\\n\"},{\"CompletionText\":\"LockAppHost.exe\",\"ListItemText\":\"LockAppHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LockAppHost.exe\"},{\"CompletionText\":\"LockScreenContentServer.exe\",\"ListItemText\":\"LockScreenContentServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LockScreenContentServer.exe\"},{\"CompletionText\":\"lodctr.exe\",\"ListItemText\":\"lodctr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lodctr.exe\"},{\"CompletionText\":\"logagent.exe\",\"ListItemText\":\"logagent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\logagent.exe\"},{\"CompletionText\":\"Login-AzAccount\",\"ListItemText\":\"Login-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Login-AzAccount\"},{\"CompletionText\":\"Login-AzAsAccount\",\"ListItemText\":\"Login-AzAsAccount\",\"ResultType\":2,\"ToolTip\":\"Login-AzAsAccount\"},{\"CompletionText\":\"Login-AzureAsAccount\",\"ListItemText\":\"Login-AzureAsAccount\",\"ResultType\":2,\"ToolTip\":\"Login-AzureAsAccount\"},{\"CompletionText\":\"logman.exe\",\"ListItemText\":\"logman.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\logman.exe\"},{\"CompletionText\":\"logoff.exe\",\"ListItemText\":\"logoff.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\logoff.exe\"},{\"CompletionText\":\"LogonUI.exe\",\"ListItemText\":\"LogonUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LogonUI.exe\"},{\"CompletionText\":\"Logout-AzAccount\",\"ListItemText\":\"Logout-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Logout-AzAccount\"},{\"CompletionText\":\"lpkinstall.exe\",\"ListItemText\":\"lpkinstall.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lpkinstall.exe\"},{\"CompletionText\":\"lpksetup.exe\",\"ListItemText\":\"lpksetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lpksetup.exe\"},{\"CompletionText\":\"lpremove.exe\",\"ListItemText\":\"lpremove.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lpremove.exe\"},{\"CompletionText\":\"ls\",\"ListItemText\":\"ls\",\"ResultType\":2,\"ToolTip\":\"Get-ChildItem\"},{\"CompletionText\":\"LsaIso.exe\",\"ListItemText\":\"LsaIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LsaIso.exe\"},{\"CompletionText\":\"lsass.exe\",\"ListItemText\":\"lsass.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lsass.exe\"},{\"CompletionText\":\"lusrmgr.msc\",\"ListItemText\":\"lusrmgr.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lusrmgr.msc\"},{\"CompletionText\":\"M:\",\"ListItemText\":\"M:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nM: \\r\\n\"},{\"CompletionText\":\"Magnify.exe\",\"ListItemText\":\"Magnify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Magnify.exe\"},{\"CompletionText\":\"main.cpl\",\"ListItemText\":\"main.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\main.cpl\"},{\"CompletionText\":\"makecab.exe\",\"ListItemText\":\"makecab.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\makecab.exe\"},{\"CompletionText\":\"man\",\"ListItemText\":\"man\",\"ResultType\":2,\"ToolTip\":\"help\"},{\"CompletionText\":\"manage-bde.exe\",\"ListItemText\":\"manage-bde.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\manage-bde.exe\"},{\"CompletionText\":\"manage-bde.wsf\",\"ListItemText\":\"manage-bde.wsf\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\manage-bde.wsf\"},{\"CompletionText\":\"markdown-it.exe\",\"ListItemText\":\"markdown-it.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\markdown-it.exe\"},{\"CompletionText\":\"mavinject.exe\",\"ListItemText\":\"mavinject.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mavinject.exe\"},{\"CompletionText\":\"mblctr.exe\",\"ListItemText\":\"mblctr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mblctr.exe\"},{\"CompletionText\":\"MBR2GPT.EXE\",\"ListItemText\":\"MBR2GPT.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MBR2GPT.EXE\"},{\"CompletionText\":\"mcbuilder.exe\",\"ListItemText\":\"mcbuilder.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mcbuilder.exe\"},{\"CompletionText\":\"MCU.exe\",\"ListItemText\":\"MCU.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MCU.exe\"},{\"CompletionText\":\"md\",\"ListItemText\":\"md\",\"ResultType\":2,\"ToolTip\":\"mkdir\"},{\"CompletionText\":\"MDEServer.exe\",\"ListItemText\":\"MDEServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MDEServer.exe\"},{\"CompletionText\":\"MDMAgent.exe\",\"ListItemText\":\"MDMAgent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MDMAgent.exe\"},{\"CompletionText\":\"MDMAppInstaller.exe\",\"ListItemText\":\"MDMAppInstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MDMAppInstaller.exe\"},{\"CompletionText\":\"MdmDiagnosticsTool.exe\",\"ListItemText\":\"MdmDiagnosticsTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MdmDiagnosticsTool.exe\"},{\"CompletionText\":\"MdRes.exe\",\"ListItemText\":\"MdRes.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MdRes.exe\"},{\"CompletionText\":\"MdSched.exe\",\"ListItemText\":\"MdSched.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MdSched.exe\"},{\"CompletionText\":\"measure\",\"ListItemText\":\"measure\",\"ResultType\":2,\"ToolTip\":\"Measure-Object\"},{\"CompletionText\":\"Measure-Command\",\"ListItemText\":\"Measure-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMeasure-Command [-Expression] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Measure-Object\",\"ListItemText\":\"Measure-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMeasure-Object [[-Property] ] [-InputObject ] [-StandardDeviation] [-Sum] [-AllStats] [-Average] [-Maximum] [-Minimum] []\\r\\n\\r\\nMeasure-Object [[-Property] ] [-InputObject ] [-Line] [-Word] [-Character] [-IgnoreWhiteSpace] []\\r\\n\"},{\"CompletionText\":\"Measure-VM\",\"ListItemText\":\"Measure-VM\",\"ResultType\":2,\"ToolTip\":\"Measure-VM\\r\\n\"},{\"CompletionText\":\"Measure-VMReplication\",\"ListItemText\":\"Measure-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Measure-VMReplication\\r\\n\"},{\"CompletionText\":\"Measure-VMResourcePool\",\"ListItemText\":\"Measure-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Measure-VMResourcePool\\r\\n\"},{\"CompletionText\":\"MediaPlayer.exe\",\"ListItemText\":\"MediaPlayer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\MediaPlayer.exe\"},{\"CompletionText\":\"Merge-CIPolicy\",\"ListItemText\":\"Merge-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"Merge-CIPolicy\\r\\n\"},{\"CompletionText\":\"Merge-VHD\",\"ListItemText\":\"Merge-VHD\",\"ResultType\":2,\"ToolTip\":\"Merge-VHD\\r\\n\"},{\"CompletionText\":\"mfpmp.exe\",\"ListItemText\":\"mfpmp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mfpmp.exe\"},{\"CompletionText\":\"mi\",\"ListItemText\":\"mi\",\"ResultType\":2,\"ToolTip\":\"Move-Item\"},{\"CompletionText\":\"Microsoft.AzureVpn.exe\",\"ListItemText\":\"Microsoft.AzureVpn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\Microsoft.AzureVpn.exe\"},{\"CompletionText\":\"Microsoft.Uev.CscUnpinTool.exe\",\"ListItemText\":\"Microsoft.Uev.CscUnpinTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Microsoft.Uev.CscUnpinTool.exe\"},{\"CompletionText\":\"Microsoft.Uev.SyncController.exe\",\"ListItemText\":\"Microsoft.Uev.SyncController.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Microsoft.Uev.SyncController.exe\"},{\"CompletionText\":\"microsoft.windows.softwarelogo.showdesktop.exe\",\"ListItemText\":\"microsoft.windows.softwarelogo.showdesktop.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\microsoft.windows.softwarelogo.showdesktop.exe\"},{\"CompletionText\":\"MicrosoftEdgeBCHost.exe\",\"ListItemText\":\"MicrosoftEdgeBCHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeBCHost.exe\"},{\"CompletionText\":\"MicrosoftEdgeCP.exe\",\"ListItemText\":\"MicrosoftEdgeCP.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeCP.exe\"},{\"CompletionText\":\"MicrosoftEdgeDevTools.exe\",\"ListItemText\":\"MicrosoftEdgeDevTools.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeDevTools.exe\"},{\"CompletionText\":\"MicrosoftEdgeSH.exe\",\"ListItemText\":\"MicrosoftEdgeSH.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeSH.exe\"},{\"CompletionText\":\"MicrosoftWindows.DesktopStickerEditorCentennial.exe\",\"ListItemText\":\"MicrosoftWindows.DesktopStickerEditorCentennial.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\MicrosoftWindows.DesktopStickerEditorCentennial.exe\"},{\"CompletionText\":\"mkdir\",\"ListItemText\":\"mkdir\",\"ResultType\":2,\"ToolTip\":\"\\r\\nmkdir [-Path] [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nmkdir [[-Path] ] -Name [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"mmc.exe\",\"ListItemText\":\"mmc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mmc.exe\"},{\"CompletionText\":\"mmgaserver.exe\",\"ListItemText\":\"mmgaserver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mmgaserver.exe\"},{\"CompletionText\":\"mmsys.cpl\",\"ListItemText\":\"mmsys.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mmsys.cpl\"},{\"CompletionText\":\"mobsync.exe\",\"ListItemText\":\"mobsync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mobsync.exe\"},{\"CompletionText\":\"Mock\",\"ListItemText\":\"Mock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMock \\r\\n\"},{\"CompletionText\":\"mode.com\",\"ListItemText\":\"mode.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mode.com\"},{\"CompletionText\":\"mofcomp.exe\",\"ListItemText\":\"mofcomp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\mofcomp.exe\"},{\"CompletionText\":\"MoNotificationUxStub.exe\",\"ListItemText\":\"MoNotificationUxStub.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MoNotificationUxStub.exe\"},{\"CompletionText\":\"more.com\",\"ListItemText\":\"more.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\more.com\"},{\"CompletionText\":\"mount\",\"ListItemText\":\"mount\",\"ResultType\":2,\"ToolTip\":\"New-PSDrive\"},{\"CompletionText\":\"Mount-AppPackageVolume\",\"ListItemText\":\"Mount-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Mount-AppPackageVolume\"},{\"CompletionText\":\"Mount-AppxVolume\",\"ListItemText\":\"Mount-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Mount-AppxVolume\\r\\n\"},{\"CompletionText\":\"Mount-DiskImage\",\"ListItemText\":\"Mount-DiskImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMount-DiskImage \\r\\n\"},{\"CompletionText\":\"mount-sqlite\",\"ListItemText\":\"mount-sqlite\",\"ResultType\":2,\"ToolTip\":\"\\r\\nmount-sqlite \\r\\n\"},{\"CompletionText\":\"Mount-VHD\",\"ListItemText\":\"Mount-VHD\",\"ResultType\":2,\"ToolTip\":\"Mount-VHD\\r\\n\"},{\"CompletionText\":\"Mount-VMHostAssignableDevice\",\"ListItemText\":\"Mount-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Mount-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Mount-WindowsImage\",\"ListItemText\":\"Mount-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Mount-WindowsImage\\r\\n\"},{\"CompletionText\":\"mountvol.exe\",\"ListItemText\":\"mountvol.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mountvol.exe\"},{\"CompletionText\":\"move\",\"ListItemText\":\"move\",\"ResultType\":2,\"ToolTip\":\"Move-Item\"},{\"CompletionText\":\"Move-AdlStoreItem\",\"ListItemText\":\"Move-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Move-AdlStoreItem\"},{\"CompletionText\":\"Move-AppPackage\",\"ListItemText\":\"Move-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Move-AppPackage\"},{\"CompletionText\":\"Move-AppxPackage\",\"ListItemText\":\"Move-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Move-AppxPackage\\r\\n\"},{\"CompletionText\":\"Move-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"Move-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"Move-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"Move-AzDataLakeGen2Item\",\"ListItemText\":\"Move-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Move-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Move-AzDataLakeStoreItem\",\"ListItemText\":\"Move-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Move-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Move-AzExpressRouteCircuit\",\"ListItemText\":\"Move-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Move-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Move-AzMlCommitmentAssociation\",\"ListItemText\":\"Move-AzMlCommitmentAssociation\",\"ResultType\":2,\"ToolTip\":\"Move-AzMlCommitmentAssociation\\r\\n\"},{\"CompletionText\":\"Move-AzRecoveryServicesBackupRecoveryPoint\",\"ListItemText\":\"Move-AzRecoveryServicesBackupRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Move-AzRecoveryServicesBackupRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Move-AzResource\",\"ListItemText\":\"Move-AzResource\",\"ResultType\":2,\"ToolTip\":\"Move-AzResource\\r\\n\"},{\"CompletionText\":\"Move-Item\",\"ListItemText\":\"Move-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMove-Item [-Path] [[-Destination] ] [-Force] [-Filter ] [-Include ] [-Exclude ] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nMove-Item [[-Destination] ] -LiteralPath [-Force] [-Filter ] [-Include ] [-Exclude ] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Move-ItemProperty\",\"ListItemText\":\"Move-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMove-ItemProperty [-Path] [-Destination] [-Name] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nMove-ItemProperty [-Destination] [-Name] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Move-SmbClient\",\"ListItemText\":\"Move-SmbClient\",\"ResultType\":2,\"ToolTip\":\"Move-SmbClient\"},{\"CompletionText\":\"Move-SmbWitnessClient\",\"ListItemText\":\"Move-SmbWitnessClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMove-SmbWitnessClient \\r\\n\"},{\"CompletionText\":\"Move-VM\",\"ListItemText\":\"Move-VM\",\"ResultType\":2,\"ToolTip\":\"Move-VM\\r\\n\"},{\"CompletionText\":\"Move-VMStorage\",\"ListItemText\":\"Move-VMStorage\",\"ResultType\":2,\"ToolTip\":\"Move-VMStorage\\r\\n\"},{\"CompletionText\":\"mp\",\"ListItemText\":\"mp\",\"ResultType\":2,\"ToolTip\":\"Move-ItemProperty\"},{\"CompletionText\":\"mpnotify.exe\",\"ListItemText\":\"mpnotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mpnotify.exe\"},{\"CompletionText\":\"MpSigStub.exe\",\"ListItemText\":\"MpSigStub.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MpSigStub.exe\"},{\"CompletionText\":\"MRINFO.EXE\",\"ListItemText\":\"MRINFO.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MRINFO.EXE\"},{\"CompletionText\":\"MRT.exe\",\"ListItemText\":\"MRT.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MRT.exe\"},{\"CompletionText\":\"ms-teams.exe\",\"ListItemText\":\"ms-teams.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ms-teams.exe\"},{\"CompletionText\":\"ms-teamsupdate.exe\",\"ListItemText\":\"ms-teamsupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ms-teamsupdate.exe\"},{\"CompletionText\":\"ms-teams_autostarter.exe\",\"ListItemText\":\"ms-teams_autostarter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ms-teams_autostarter.exe\"},{\"CompletionText\":\"MSBuild.exe\",\"ListItemText\":\"MSBuild.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2017\\\\BuildTools\\\\MSBuild\\\\15.0\\\\Bin\\\\MSBuild.exe\"},{\"CompletionText\":\"MSBuildTaskHost.exe\",\"ListItemText\":\"MSBuildTaskHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2017\\\\BuildTools\\\\MSBuild\\\\15.0\\\\Bin\\\\MSBuildTaskHost.exe\"},{\"CompletionText\":\"MSchedExe.exe\",\"ListItemText\":\"MSchedExe.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MSchedExe.exe\"},{\"CompletionText\":\"msconfig.exe\",\"ListItemText\":\"msconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msconfig.exe\"},{\"CompletionText\":\"msdt.exe\",\"ListItemText\":\"msdt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msdt.exe\"},{\"CompletionText\":\"msdtc.exe\",\"ListItemText\":\"msdtc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msdtc.exe\"},{\"CompletionText\":\"msfeedssync.exe\",\"ListItemText\":\"msfeedssync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msfeedssync.exe\"},{\"CompletionText\":\"msg.exe\",\"ListItemText\":\"msg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msg.exe\"},{\"CompletionText\":\"mshta.exe\",\"ListItemText\":\"mshta.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mshta.exe\"},{\"CompletionText\":\"msiexec.exe\",\"ListItemText\":\"msiexec.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msiexec.exe\"},{\"CompletionText\":\"msinfo32.exe\",\"ListItemText\":\"msinfo32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msinfo32.exe\"},{\"CompletionText\":\"msmbw\",\"ListItemText\":\"msmbw\",\"ResultType\":2,\"ToolTip\":\"msmbw\"},{\"CompletionText\":\"mspaint.exe\",\"ListItemText\":\"mspaint.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\mspaint.exe\"},{\"CompletionText\":\"msra.exe\",\"ListItemText\":\"msra.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msra.exe\"},{\"CompletionText\":\"msrdc.exe\",\"ListItemText\":\"msrdc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msrdc.exe\"},{\"CompletionText\":\"MsSpellCheckingHost.exe\",\"ListItemText\":\"MsSpellCheckingHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MsSpellCheckingHost.exe\"},{\"CompletionText\":\"msteams.exe\",\"ListItemText\":\"msteams.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msteams.exe\"},{\"CompletionText\":\"msteamsupdate.exe\",\"ListItemText\":\"msteamsupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msteamsupdate.exe\"},{\"CompletionText\":\"msteams_autostarter.exe\",\"ListItemText\":\"msteams_autostarter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msteams_autostarter.exe\"},{\"CompletionText\":\"mstsc.exe\",\"ListItemText\":\"mstsc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mstsc.exe\"},{\"CompletionText\":\"mtstocom.exe\",\"ListItemText\":\"mtstocom.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mtstocom.exe\"},{\"CompletionText\":\"MuiUnattend.exe\",\"ListItemText\":\"MuiUnattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MuiUnattend.exe\"},{\"CompletionText\":\"MultiDigiMon.exe\",\"ListItemText\":\"MultiDigiMon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MultiDigiMon.exe\"},{\"CompletionText\":\"mv\",\"ListItemText\":\"mv\",\"ResultType\":2,\"ToolTip\":\"Move-Item\"},{\"CompletionText\":\"mvmr\",\"ListItemText\":\"mvmr\",\"ResultType\":2,\"ToolTip\":\"mvmr\"},{\"CompletionText\":\"N:\",\"ListItemText\":\"N:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nN: \\r\\n\"},{\"CompletionText\":\"nal\",\"ListItemText\":\"nal\",\"ResultType\":2,\"ToolTip\":\"New-Alias\"},{\"CompletionText\":\"Narrator.exe\",\"ListItemText\":\"Narrator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Narrator.exe\"},{\"CompletionText\":\"native2ascii.exe\",\"ListItemText\":\"native2ascii.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\native2ascii.exe\"},{\"CompletionText\":\"nbtstat.exe\",\"ListItemText\":\"nbtstat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nbtstat.exe\"},{\"CompletionText\":\"ncim\",\"ListItemText\":\"ncim\",\"ResultType\":2,\"ToolTip\":\"ncim\"},{\"CompletionText\":\"ncms\",\"ListItemText\":\"ncms\",\"ResultType\":2,\"ToolTip\":\"ncms\"},{\"CompletionText\":\"ncpa.cpl\",\"ListItemText\":\"ncpa.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ncpa.cpl\"},{\"CompletionText\":\"ncso\",\"ListItemText\":\"ncso\",\"ResultType\":2,\"ToolTip\":\"ncso\"},{\"CompletionText\":\"ndadmin.exe\",\"ListItemText\":\"ndadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ndadmin.exe\"},{\"CompletionText\":\"NDKPerfCmd.exe\",\"ListItemText\":\"NDKPerfCmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NDKPerfCmd.exe\"},{\"CompletionText\":\"NDKPing.exe\",\"ListItemText\":\"NDKPing.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NDKPing.exe\"},{\"CompletionText\":\"ndr\",\"ListItemText\":\"ndr\",\"ResultType\":2,\"ToolTip\":\"New-PSDrive\"},{\"CompletionText\":\"net.exe\",\"ListItemText\":\"net.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\net.exe\"},{\"CompletionText\":\"net1.exe\",\"ListItemText\":\"net1.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\net1.exe\"},{\"CompletionText\":\"netbtugc.exe\",\"ListItemText\":\"netbtugc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netbtugc.exe\"},{\"CompletionText\":\"netcfg.exe\",\"ListItemText\":\"netcfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netcfg.exe\"},{\"CompletionText\":\"NetCfgNotifyObjectHost.exe\",\"ListItemText\":\"NetCfgNotifyObjectHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NetCfgNotifyObjectHost.exe\"},{\"CompletionText\":\"NetEvtFwdr.exe\",\"ListItemText\":\"NetEvtFwdr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NetEvtFwdr.exe\"},{\"CompletionText\":\"NetHost.exe\",\"ListItemText\":\"NetHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NetHost.exe\"},{\"CompletionText\":\"netiougc.exe\",\"ListItemText\":\"netiougc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netiougc.exe\"},{\"CompletionText\":\"Netplwiz.exe\",\"ListItemText\":\"Netplwiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Netplwiz.exe\"},{\"CompletionText\":\"netsh.exe\",\"ListItemText\":\"netsh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netsh.exe\"},{\"CompletionText\":\"NETSTAT.EXE\",\"ListItemText\":\"NETSTAT.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NETSTAT.EXE\"},{\"CompletionText\":\"New-AdlAnalyticsAccount\",\"ListItemText\":\"New-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"New-AdlAnalyticsAccount\"},{\"CompletionText\":\"New-AdlAnalyticsComputePolicy\",\"ListItemText\":\"New-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"New-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"New-AdlCatalogCredential\",\"ListItemText\":\"New-AdlCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"New-AdlCatalogCredential\"},{\"CompletionText\":\"New-AdlCatalogSecret\",\"ListItemText\":\"New-AdlCatalogSecret\",\"ResultType\":2,\"ToolTip\":\"New-AdlCatalogSecret\"},{\"CompletionText\":\"New-AdlStore\",\"ListItemText\":\"New-AdlStore\",\"ResultType\":2,\"ToolTip\":\"New-AdlStore\"},{\"CompletionText\":\"New-AdlStoreItem\",\"ListItemText\":\"New-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"New-AdlStoreItem\"},{\"CompletionText\":\"New-Alias\",\"ListItemText\":\"New-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Alias [-Name] [-Value] [-Description ] [-Option ] [-PassThru] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-AppLockerPolicy\",\"ListItemText\":\"New-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"New-ASRFabric\",\"ListItemText\":\"New-ASRFabric\",\"ResultType\":2,\"ToolTip\":\"New-ASRFabric\"},{\"CompletionText\":\"New-AsrInMageAzureV2DiskInput\",\"ListItemText\":\"New-AsrInMageAzureV2DiskInput\",\"ResultType\":2,\"ToolTip\":\"New-AsrInMageAzureV2DiskInput\"},{\"CompletionText\":\"New-ASRInMageRcmDiskInput\",\"ListItemText\":\"New-ASRInMageRcmDiskInput\",\"ResultType\":2,\"ToolTip\":\"New-ASRInMageRcmDiskInput\"},{\"CompletionText\":\"New-ASRNetworkMapping\",\"ListItemText\":\"New-ASRNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"New-ASRNetworkMapping\"},{\"CompletionText\":\"New-ASRPolicy\",\"ListItemText\":\"New-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"New-ASRPolicy\"},{\"CompletionText\":\"New-ASRProtectableItem\",\"ListItemText\":\"New-ASRProtectableItem\",\"ResultType\":2,\"ToolTip\":\"New-ASRProtectableItem\"},{\"CompletionText\":\"New-ASRProtectionContainerMapping\",\"ListItemText\":\"New-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"New-ASRProtectionContainerMapping\"},{\"CompletionText\":\"New-ASRRecoveryPlan\",\"ListItemText\":\"New-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"New-ASRRecoveryPlan\"},{\"CompletionText\":\"New-ASRReplicationProtectedItem\",\"ListItemText\":\"New-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"New-ASRReplicationProtectedItem\"},{\"CompletionText\":\"New-ASRRP\",\"ListItemText\":\"New-ASRRP\",\"ResultType\":2,\"ToolTip\":\"New-ASRRP\"},{\"CompletionText\":\"New-ASRStorageClassificationMapping\",\"ListItemText\":\"New-ASRStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"New-ASRStorageClassificationMapping\"},{\"CompletionText\":\"New-ASRvCenter\",\"ListItemText\":\"New-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"New-ASRvCenter\"},{\"CompletionText\":\"New-ASRVMNicConfig\",\"ListItemText\":\"New-ASRVMNicConfig\",\"ResultType\":2,\"ToolTip\":\"New-ASRVMNicConfig\"},{\"CompletionText\":\"New-AutologgerConfig\",\"ListItemText\":\"New-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"New-AzActionGroupReceiver\",\"ListItemText\":\"New-AzActionGroupReceiver\",\"ResultType\":2,\"ToolTip\":\"New-AzActionGroupReceiver\\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlert\",\"ListItemText\":\"New-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlertActionGroupObject\",\"ListItemText\":\"New-AzActivityLogAlertActionGroupObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlertActionGroupObject \\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlertAlertRuleAnyOfOrLeafConditionObject\",\"ListItemText\":\"New-AzActivityLogAlertAlertRuleAnyOfOrLeafConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlertAlertRuleAnyOfOrLeafConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlertAlertRuleLeafConditionObject\",\"ListItemText\":\"New-AzActivityLogAlertAlertRuleLeafConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlertAlertRuleLeafConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzADAppCredential\",\"ListItemText\":\"New-AzADAppCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADAppCredential \\r\\n\"},{\"CompletionText\":\"New-AzADAppFederatedCredential\",\"ListItemText\":\"New-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"New-AzADApplication\",\"ListItemText\":\"New-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADApplication \\r\\n\"},{\"CompletionText\":\"New-AzADGroup\",\"ListItemText\":\"New-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADGroup \\r\\n\"},{\"CompletionText\":\"New-AzADServicePrincipal\",\"ListItemText\":\"New-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"New-AzADServicePrincipalCredential\",\"ListItemText\":\"New-AzADServicePrincipalCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzADServicePrincipalCredential\"},{\"CompletionText\":\"New-AzADSpCredential\",\"ListItemText\":\"New-AzADSpCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADSpCredential \\r\\n\"},{\"CompletionText\":\"New-AzADUser\",\"ListItemText\":\"New-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADUser \\r\\n\"},{\"CompletionText\":\"New-AzAksCluster\",\"ListItemText\":\"New-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzAksCluster\\r\\n\"},{\"CompletionText\":\"New-AzAksMaintenanceConfiguration\",\"ListItemText\":\"New-AzAksMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksMaintenanceConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzAksNodePool\",\"ListItemText\":\"New-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"New-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"New-AzAksSnapshot\",\"ListItemText\":\"New-AzAksSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksSnapshot \\r\\n\"},{\"CompletionText\":\"New-AzAksTimeInWeekObject\",\"ListItemText\":\"New-AzAksTimeInWeekObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksTimeInWeekObject \\r\\n\"},{\"CompletionText\":\"New-AzAksTimeSpanObject\",\"ListItemText\":\"New-AzAksTimeSpanObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksTimeSpanObject \\r\\n\"},{\"CompletionText\":\"New-AzAlertRuleEmail\",\"ListItemText\":\"New-AzAlertRuleEmail\",\"ResultType\":2,\"ToolTip\":\"New-AzAlertRuleEmail\\r\\n\"},{\"CompletionText\":\"New-AzAlertRuleWebhook\",\"ListItemText\":\"New-AzAlertRuleWebhook\",\"ResultType\":2,\"ToolTip\":\"New-AzAlertRuleWebhook\\r\\n\"},{\"CompletionText\":\"New-AzAlertsSuppressionRuleScope\",\"ListItemText\":\"New-AzAlertsSuppressionRuleScope\",\"ResultType\":2,\"ToolTip\":\"New-AzAlertsSuppressionRuleScope\\r\\n\"},{\"CompletionText\":\"New-AzAnalysisServicesFirewallConfig\",\"ListItemText\":\"New-AzAnalysisServicesFirewallConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzAnalysisServicesFirewallConfig\\r\\n\"},{\"CompletionText\":\"New-AzAnalysisServicesFirewallRule\",\"ListItemText\":\"New-AzAnalysisServicesFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzAnalysisServicesFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzAnalysisServicesServer\",\"ListItemText\":\"New-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"New-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"New-AzApiManagement\",\"ListItemText\":\"New-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagement\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApi\",\"ListItemText\":\"New-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiRelease\",\"ListItemText\":\"New-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiRevision\",\"ListItemText\":\"New-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiSchema\",\"ListItemText\":\"New-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiVersionSet\",\"ListItemText\":\"New-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementAuthorizationServer\",\"ListItemText\":\"New-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackend\",\"ListItemText\":\"New-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackendCredential\",\"ListItemText\":\"New-AzApiManagementBackendCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackendCredential\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackendProxy\",\"ListItemText\":\"New-AzApiManagementBackendProxy\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackendProxy\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackendServiceFabric\",\"ListItemText\":\"New-AzApiManagementBackendServiceFabric\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackendServiceFabric\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementCache\",\"ListItemText\":\"New-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementCertificate\",\"ListItemText\":\"New-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementContext\",\"ListItemText\":\"New-AzApiManagementContext\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementContext\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementCustomHostnameConfiguration\",\"ListItemText\":\"New-AzApiManagementCustomHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementCustomHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementDiagnostic\",\"ListItemText\":\"New-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementGateway\",\"ListItemText\":\"New-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementGatewayHostnameConfiguration\",\"ListItemText\":\"New-AzApiManagementGatewayHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementGatewayHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementGroup\",\"ListItemText\":\"New-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementHttpMessageDiagnostic\",\"ListItemText\":\"New-AzApiManagementHttpMessageDiagnostic\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementHttpMessageDiagnostic\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementIdentityProvider\",\"ListItemText\":\"New-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementKeyVaultObject\",\"ListItemText\":\"New-AzApiManagementKeyVaultObject\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementKeyVaultObject\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementLogger\",\"ListItemText\":\"New-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementNamedValue\",\"ListItemText\":\"New-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"New-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementOperation\",\"ListItemText\":\"New-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementPipelineDiagnosticSetting\",\"ListItemText\":\"New-AzApiManagementPipelineDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementPipelineDiagnosticSetting\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementProduct\",\"ListItemText\":\"New-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementRegion\",\"ListItemText\":\"New-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementResourceLocationObject\",\"ListItemText\":\"New-AzApiManagementResourceLocationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementResourceLocationObject\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSamplingSetting\",\"ListItemText\":\"New-AzApiManagementSamplingSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSamplingSetting\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSslSetting\",\"ListItemText\":\"New-AzApiManagementSslSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSslSetting\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSubscription\",\"ListItemText\":\"New-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSystemCertificate\",\"ListItemText\":\"New-AzApiManagementSystemCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSystemCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementUser\",\"ListItemText\":\"New-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementUserToken\",\"ListItemText\":\"New-AzApiManagementUserToken\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementUserToken\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementVirtualNetwork\",\"ListItemText\":\"New-AzApiManagementVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementVirtualNetwork\\r\\n\"},{\"CompletionText\":\"New-AzAppConfigurationStore\",\"ListItemText\":\"New-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"New-AzAppConfigurationStoreKey\",\"ListItemText\":\"New-AzAppConfigurationStoreKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAppConfigurationStoreKey \\r\\n\"},{\"CompletionText\":\"New-AzApplicationGateway\",\"ListItemText\":\"New-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"New-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"New-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"New-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"New-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"New-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"New-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayCustomError\",\"ListItemText\":\"New-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCondition\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCondition\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCondition\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCustomRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCustomRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCustomRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByVariable\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByVariable\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByVariable\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallDisabledRuleGroupConfig\",\"ListItemText\":\"New-AzApplicationGatewayFirewallDisabledRuleGroupConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallDisabledRuleGroupConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallExclusionConfig\",\"ListItemText\":\"New-AzApplicationGatewayFirewallExclusionConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallExclusionConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallMatchVariable\",\"ListItemText\":\"New-AzApplicationGatewayFirewallMatchVariable\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallMatchVariable\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusion\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusion\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusion\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleOverride\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleOverride\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleOverride\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleSet\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicySetting\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicySetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicySetting\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"New-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"New-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayHttpListener\",\"ListItemText\":\"New-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayIdentity\",\"ListItemText\":\"New-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayListener\",\"ListItemText\":\"New-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayPathRuleConfig\",\"ListItemText\":\"New-AzApplicationGatewayPathRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayPathRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayPrivateLinkIpConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayPrivateLinkIpConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayPrivateLinkIpConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"New-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayProbeHealthResponseMatch\",\"ListItemText\":\"New-AzApplicationGatewayProbeHealthResponseMatch\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayProbeHealthResponseMatch\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"New-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRule\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleActionSet\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleActionSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleActionSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleCondition\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleCondition\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleCondition\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleHeaderConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleHeaderConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleHeaderConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleUrlConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleUrlConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleUrlConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"New-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySku\",\"ListItemText\":\"New-AzApplicationGatewaySku\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySku\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"New-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"New-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySslProfile\",\"ListItemText\":\"New-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"New-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"New-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"New-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayWebApplicationFirewallConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsights\",\"ListItemText\":\"New-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsApiKey\",\"ListItemText\":\"New-AzApplicationInsightsApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsApiKey \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"New-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"New-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"New-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWebTest\",\"ListItemText\":\"New-AzApplicationInsightsWebTest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWebTest \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWebTestGeolocationObject\",\"ListItemText\":\"New-AzApplicationInsightsWebTestGeolocationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWebTestGeolocationObject \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWebTestHeaderFieldObject\",\"ListItemText\":\"New-AzApplicationInsightsWebTestHeaderFieldObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWebTestHeaderFieldObject \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWorkbook\",\"ListItemText\":\"New-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"New-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWorkbookTemplateGalleryObject\",\"ListItemText\":\"New-AzApplicationInsightsWorkbookTemplateGalleryObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWorkbookTemplateGalleryObject \\r\\n\"},{\"CompletionText\":\"New-AzApplicationSecurityGroup\",\"ListItemText\":\"New-AzApplicationSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationSecurityGroup\\r\\n\"},{\"CompletionText\":\"New-AzApplyUpdate\",\"ListItemText\":\"New-AzApplyUpdate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplyUpdate\\r\\n\"},{\"CompletionText\":\"New-AzAppServiceEnvironment\",\"ListItemText\":\"New-AzAppServiceEnvironment\",\"ResultType\":2,\"ToolTip\":\"New-AzAppServiceEnvironment\\r\\n\"},{\"CompletionText\":\"New-AzAppServiceEnvironmentInboundServices\",\"ListItemText\":\"New-AzAppServiceEnvironmentInboundServices\",\"ResultType\":2,\"ToolTip\":\"New-AzAppServiceEnvironmentInboundServices\\r\\n\"},{\"CompletionText\":\"New-AzAppServicePlan\",\"ListItemText\":\"New-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"New-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"New-AzAs\",\"ListItemText\":\"New-AzAs\",\"ResultType\":2,\"ToolTip\":\"New-AzAs\"},{\"CompletionText\":\"New-AzAttestationProvider\",\"ListItemText\":\"New-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfile\",\"ListItemText\":\"New-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfileAssignment\",\"ListItemText\":\"New-AzAutomanageConfigProfileAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfileAssignment \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfileHciAssignment\",\"ListItemText\":\"New-AzAutomanageConfigProfileHciAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfileHciAssignment \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfileHcrpAssignment\",\"ListItemText\":\"New-AzAutomanageConfigProfileHcrpAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfileHcrpAssignment \\r\\n\"},{\"CompletionText\":\"New-AzAutomationAccount\",\"ListItemText\":\"New-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"New-AzAutomationCertificate\",\"ListItemText\":\"New-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"New-AzAutomationConnection\",\"ListItemText\":\"New-AzAutomationConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationConnection\\r\\n\"},{\"CompletionText\":\"New-AzAutomationCredential\",\"ListItemText\":\"New-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"New-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"New-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"New-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"New-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"New-AzAutomationKey\",\"ListItemText\":\"New-AzAutomationKey\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationKey\\r\\n\"},{\"CompletionText\":\"New-AzAutomationModule\",\"ListItemText\":\"New-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"New-AzAutomationPython3Package\",\"ListItemText\":\"New-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"New-AzAutomationRunbook\",\"ListItemText\":\"New-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"New-AzAutomationSchedule\",\"ListItemText\":\"New-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"New-AzAutomationSoftwareUpdateConfiguration\",\"ListItemText\":\"New-AzAutomationSoftwareUpdateConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationSoftwareUpdateConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzAutomationSourceControl\",\"ListItemText\":\"New-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"New-AzAutomationUpdateManagementAzureQuery\",\"ListItemText\":\"New-AzAutomationUpdateManagementAzureQuery\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationUpdateManagementAzureQuery\\r\\n\"},{\"CompletionText\":\"New-AzAutomationVariable\",\"ListItemText\":\"New-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"New-AzAutomationWebhook\",\"ListItemText\":\"New-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleNotificationObject\",\"ListItemText\":\"New-AzAutoscaleNotificationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleNotificationObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleProfileObject\",\"ListItemText\":\"New-AzAutoscaleProfileObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleProfileObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleScaleRuleMetricDimensionObject\",\"ListItemText\":\"New-AzAutoscaleScaleRuleMetricDimensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleScaleRuleMetricDimensionObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleScaleRuleObject\",\"ListItemText\":\"New-AzAutoscaleScaleRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleScaleRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleSetting\",\"ListItemText\":\"New-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleWebhookNotificationObject\",\"ListItemText\":\"New-AzAutoscaleWebhookNotificationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleWebhookNotificationObject \\r\\n\"},{\"CompletionText\":\"New-AzAvailabilityGroupListener\",\"ListItemText\":\"New-AzAvailabilityGroupListener\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAvailabilityGroupListener \\r\\n\"},{\"CompletionText\":\"New-AzAvailabilitySet\",\"ListItemText\":\"New-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"New-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"New-AzBastion\",\"ListItemText\":\"New-AzBastion\",\"ResultType\":2,\"ToolTip\":\"New-AzBastion\\r\\n\"},{\"CompletionText\":\"New-AzBatchAccount\",\"ListItemText\":\"New-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"New-AzBatchAccountKey\",\"ListItemText\":\"New-AzBatchAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzBatchApplication\",\"ListItemText\":\"New-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"New-AzBatchApplicationPackage\",\"ListItemText\":\"New-AzBatchApplicationPackage\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchApplicationPackage\\r\\n\"},{\"CompletionText\":\"New-AzBatchCertificate\",\"ListItemText\":\"New-AzBatchCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchCertificate\\r\\n\"},{\"CompletionText\":\"New-AzBatchComputeNodeUser\",\"ListItemText\":\"New-AzBatchComputeNodeUser\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchComputeNodeUser\\r\\n\"},{\"CompletionText\":\"New-AzBatchJob\",\"ListItemText\":\"New-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchJob\\r\\n\"},{\"CompletionText\":\"New-AzBatchJobSchedule\",\"ListItemText\":\"New-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"New-AzBatchPool\",\"ListItemText\":\"New-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchPool\\r\\n\"},{\"CompletionText\":\"New-AzBatchResourceFile\",\"ListItemText\":\"New-AzBatchResourceFile\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchResourceFile\\r\\n\"},{\"CompletionText\":\"New-AzBatchTask\",\"ListItemText\":\"New-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchTask\\r\\n\"},{\"CompletionText\":\"New-AzCapacityReservation\",\"ListItemText\":\"New-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"New-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"New-AzCapacityReservationGroup\",\"ListItemText\":\"New-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"New-AzCdnCustomDomain\",\"ListItemText\":\"New-AzCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleCacheExpirationActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleCacheExpirationActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleCacheExpirationActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleCacheKeyQueryStringActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleCacheKeyQueryStringActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleCacheKeyQueryStringActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleCookiesConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleCookiesConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleCookiesConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleHttpVersionConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleHttpVersionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleHttpVersionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleIsDeviceConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleIsDeviceConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleIsDeviceConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRulePostArgsConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRulePostArgsConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRulePostArgsConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleQueryStringConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleQueryStringConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleQueryStringConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRemoteAddressConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRemoteAddressConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRemoteAddressConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestBodyConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestBodyConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestBodyConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestHeaderActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestHeaderConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestHeaderConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestHeaderConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestMethodConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestMethodConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestMethodConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestSchemeConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestSchemeConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestSchemeConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestUriConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestUriConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestUriConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleResponseHeaderActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleResponseHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleResponseHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleUrlFileExtensionConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleUrlFileExtensionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleUrlFileExtensionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleUrlFileNameConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleUrlFileNameConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleUrlFileNameConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleUrlPathConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleUrlPathConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleUrlPathConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnEndpoint\",\"ListItemText\":\"New-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzCdnHealthProbeParametersObject\",\"ListItemText\":\"New-AzCdnHealthProbeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnHealthProbeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnLoadParametersObject\",\"ListItemText\":\"New-AzCdnLoadParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnLoadParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnManagedHttpsParametersObject\",\"ListItemText\":\"New-AzCdnManagedHttpsParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnManagedHttpsParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnOrigin\",\"ListItemText\":\"New-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"New-AzCdnOriginGroup\",\"ListItemText\":\"New-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"New-AzCdnOriginGroupOverrideActionObject\",\"ListItemText\":\"New-AzCdnOriginGroupOverrideActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnOriginGroupOverrideActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnProfile\",\"ListItemText\":\"New-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"New-AzCdnPurgeParametersObject\",\"ListItemText\":\"New-AzCdnPurgeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnPurgeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnResourceReferenceObject\",\"ListItemText\":\"New-AzCdnResourceReferenceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnResourceReferenceObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnResponseBasedOriginErrorDetectionParametersObject\",\"ListItemText\":\"New-AzCdnResponseBasedOriginErrorDetectionParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnResponseBasedOriginErrorDetectionParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUrlRedirectActionObject\",\"ListItemText\":\"New-AzCdnUrlRedirectActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUrlRedirectActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUrlRewriteActionObject\",\"ListItemText\":\"New-AzCdnUrlRewriteActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUrlRewriteActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUrlSigningActionObject\",\"ListItemText\":\"New-AzCdnUrlSigningActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUrlSigningActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUserManagedHttpsParametersObject\",\"ListItemText\":\"New-AzCdnUserManagedHttpsParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUserManagedHttpsParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudService\",\"ListItemText\":\"New-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudService \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceDiagnosticsExtension\",\"ListItemText\":\"New-AzCloudServiceDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceDiagnosticsExtension \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceExtensionObject\",\"ListItemText\":\"New-AzCloudServiceExtensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceExtensionObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceLoadBalancerConfigurationObject\",\"ListItemText\":\"New-AzCloudServiceLoadBalancerConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceLoadBalancerConfigurationObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceLoadBalancerFrontendIPConfigurationObject\",\"ListItemText\":\"New-AzCloudServiceLoadBalancerFrontendIPConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceLoadBalancerFrontendIPConfigurationObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceRemoteDesktopExtensionObject\",\"ListItemText\":\"New-AzCloudServiceRemoteDesktopExtensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceRemoteDesktopExtensionObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceRoleProfilePropertiesObject\",\"ListItemText\":\"New-AzCloudServiceRoleProfilePropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceRoleProfilePropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceVaultSecretGroupObject\",\"ListItemText\":\"New-AzCloudServiceVaultSecretGroupObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceVaultSecretGroupObject \\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccount\",\"ListItemText\":\"New-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountApiProperty\",\"ListItemText\":\"New-AzCognitiveServicesAccountApiProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountApiProperty\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountCommitmentPlan\",\"ListItemText\":\"New-AzCognitiveServicesAccountCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountCommitmentPlan\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountDeployment\",\"ListItemText\":\"New-AzCognitiveServicesAccountDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountDeployment\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountKey\",\"ListItemText\":\"New-AzCognitiveServicesAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesCommitmentPlan\",\"ListItemText\":\"New-AzCognitiveServicesCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesCommitmentPlan\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesCommitmentPlanAssociation\",\"ListItemText\":\"New-AzCognitiveServicesCommitmentPlanAssociation\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesCommitmentPlanAssociation\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesObject\",\"ListItemText\":\"New-AzCognitiveServicesObject\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesObject\\r\\n\"},{\"CompletionText\":\"New-AzConfidentialLedger\",\"ListItemText\":\"New-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"New-AzConfidentialLedgerAADBasedSecurityPrincipalObject\",\"ListItemText\":\"New-AzConfidentialLedgerAADBasedSecurityPrincipalObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzConfidentialLedgerAADBasedSecurityPrincipalObject \\r\\n\"},{\"CompletionText\":\"New-AzConfidentialLedgerCertBasedSecurityPrincipalObject\",\"ListItemText\":\"New-AzConfidentialLedgerCertBasedSecurityPrincipalObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzConfidentialLedgerCertBasedSecurityPrincipalObject \\r\\n\"},{\"CompletionText\":\"New-AzConfigurationAssignment\",\"ListItemText\":\"New-AzConfigurationAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzConfigurationAssignment\\r\\n\"},{\"CompletionText\":\"New-AzConsumptionBudget\",\"ListItemText\":\"New-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"New-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"New-AzContainerGroup\",\"ListItemText\":\"New-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"New-AzContainerGroupImageRegistryCredentialObject\",\"ListItemText\":\"New-AzContainerGroupImageRegistryCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroupImageRegistryCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerGroupPortObject\",\"ListItemText\":\"New-AzContainerGroupPortObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroupPortObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerGroupVolumeObject\",\"ListItemText\":\"New-AzContainerGroupVolumeObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroupVolumeObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceEnvironmentVariableObject\",\"ListItemText\":\"New-AzContainerInstanceEnvironmentVariableObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceEnvironmentVariableObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceHttpHeaderObject\",\"ListItemText\":\"New-AzContainerInstanceHttpHeaderObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceHttpHeaderObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceInitDefinitionObject\",\"ListItemText\":\"New-AzContainerInstanceInitDefinitionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceInitDefinitionObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceObject\",\"ListItemText\":\"New-AzContainerInstanceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstancePortObject\",\"ListItemText\":\"New-AzContainerInstancePortObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstancePortObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceVolumeMountObject\",\"ListItemText\":\"New-AzContainerInstanceVolumeMountObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceVolumeMountObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerNicConfig\",\"ListItemText\":\"New-AzContainerNicConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzContainerNicConfig\\r\\n\"},{\"CompletionText\":\"New-AzContainerNicConfigIpConfig\",\"ListItemText\":\"New-AzContainerNicConfigIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzContainerNicConfigIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistry\",\"ListItemText\":\"New-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryAgentPool\",\"ListItemText\":\"New-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryExportPipeline\",\"ListItemText\":\"New-AzContainerRegistryExportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryExportPipeline \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryImportPipeline\",\"ListItemText\":\"New-AzContainerRegistryImportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryImportPipeline \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryIPRuleObject\",\"ListItemText\":\"New-AzContainerRegistryIPRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryIPRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryReplication\",\"ListItemText\":\"New-AzContainerRegistryReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryReplication \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryScopeMap\",\"ListItemText\":\"New-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryToken\",\"ListItemText\":\"New-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryWebhook\",\"ListItemText\":\"New-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBAccount\",\"ListItemText\":\"New-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBAccountKey\",\"ListItemText\":\"New-AzCosmosDBAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraClusterKey\",\"ListItemText\":\"New-AzCosmosDBCassandraClusterKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraClusterKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraColumn\",\"ListItemText\":\"New-AzCosmosDBCassandraColumn\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraColumn\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"New-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraSchema\",\"ListItemText\":\"New-AzCosmosDBCassandraSchema\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraSchema\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraTable\",\"ListItemText\":\"New-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDbClientEncryptionKey\",\"ListItemText\":\"New-AzCosmosDbClientEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDbClientEncryptionKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBDatabaseToRestore\",\"ListItemText\":\"New-AzCosmosDBDatabaseToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBDatabaseToRestore\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinCompositePath\",\"ListItemText\":\"New-AzCosmosDBGremlinCompositePath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinCompositePath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinConflictResolutionPolicy\",\"ListItemText\":\"New-AzCosmosDBGremlinConflictResolutionPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinConflictResolutionPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"New-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinDatabaseToRestore\",\"ListItemText\":\"New-AzCosmosDBGremlinDatabaseToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinDatabaseToRestore\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinGraph\",\"ListItemText\":\"New-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinIncludedPath\",\"ListItemText\":\"New-AzCosmosDBGremlinIncludedPath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinIncludedPath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinIncludedPathIndex\",\"ListItemText\":\"New-AzCosmosDBGremlinIncludedPathIndex\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinIncludedPathIndex\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinIndexingPolicy\",\"ListItemText\":\"New-AzCosmosDBGremlinIndexingPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinIndexingPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinSpatialSpec\",\"ListItemText\":\"New-AzCosmosDBGremlinSpatialSpec\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinSpatialSpec\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinUniqueKey\",\"ListItemText\":\"New-AzCosmosDBGremlinUniqueKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinUniqueKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinUniqueKeyPolicy\",\"ListItemText\":\"New-AzCosmosDBGremlinUniqueKeyPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinUniqueKeyPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBLocationObject\",\"ListItemText\":\"New-AzCosmosDBLocationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBLocationObject\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"New-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"New-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBIndex\",\"ListItemText\":\"New-AzCosmosDBMongoDBIndex\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBIndex\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBPrivilege\",\"ListItemText\":\"New-AzCosmosDBMongoDBPrivilege\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBPrivilege\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBPrivilegeResource\",\"ListItemText\":\"New-AzCosmosDBMongoDBPrivilegeResource\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBPrivilegeResource\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBRole\",\"ListItemText\":\"New-AzCosmosDBMongoDBRole\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBRole\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"New-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"New-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBPermission\",\"ListItemText\":\"New-AzCosmosDBPermission\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBPermission\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBService\",\"ListItemText\":\"New-AzCosmosDBService\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBService\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlCompositePath\",\"ListItemText\":\"New-AzCosmosDBSqlCompositePath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlCompositePath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlConflictResolutionPolicy\",\"ListItemText\":\"New-AzCosmosDBSqlConflictResolutionPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlConflictResolutionPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlContainer\",\"ListItemText\":\"New-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlDatabase\",\"ListItemText\":\"New-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlIncludedPath\",\"ListItemText\":\"New-AzCosmosDBSqlIncludedPath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlIncludedPath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlIncludedPathIndex\",\"ListItemText\":\"New-AzCosmosDBSqlIncludedPathIndex\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlIncludedPathIndex\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlIndexingPolicy\",\"ListItemText\":\"New-AzCosmosDBSqlIndexingPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlIndexingPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"New-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"New-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlSpatialSpec\",\"ListItemText\":\"New-AzCosmosDBSqlSpatialSpec\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlSpatialSpec\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"New-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlTrigger\",\"ListItemText\":\"New-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlUniqueKey\",\"ListItemText\":\"New-AzCosmosDBSqlUniqueKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlUniqueKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlUniqueKeyPolicy\",\"ListItemText\":\"New-AzCosmosDBSqlUniqueKeyPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlUniqueKeyPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"New-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBTable\",\"ListItemText\":\"New-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBTableToRestore\",\"ListItemText\":\"New-AzCosmosDBTableToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBTableToRestore\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBVirtualNetworkRule\",\"ListItemText\":\"New-AzCosmosDBVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzCustomIpPrefix\",\"ListItemText\":\"New-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"New-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"New-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeDevice\",\"ListItemText\":\"New-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeOrder\",\"ListItemText\":\"New-AzDataBoxEdgeOrder\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeOrder\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeRole\",\"ListItemText\":\"New-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeShare\",\"ListItemText\":\"New-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeStorageAccount\",\"ListItemText\":\"New-AzDataBoxEdgeStorageAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeStorageAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"New-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"New-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeTrigger\",\"ListItemText\":\"New-AzDataBoxEdgeTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeTrigger\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeUser\",\"ListItemText\":\"New-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"New-AzDatabricksAccessConnector\",\"ListItemText\":\"New-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"New-AzDatabricksVNetPeering\",\"ListItemText\":\"New-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"New-AzDatabricksWorkspace\",\"ListItemText\":\"New-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzDataCollectionRule\",\"ListItemText\":\"New-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"New-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"New-AzDataCollectionRuleAssociation\",\"ListItemText\":\"New-AzDataCollectionRuleAssociation\",\"ResultType\":2,\"ToolTip\":\"New-AzDataCollectionRuleAssociation\\r\\n\"},{\"CompletionText\":\"New-AzDataFactory\",\"ListItemText\":\"New-AzDataFactory\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactory\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryDataset\",\"ListItemText\":\"New-AzDataFactoryDataset\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryDataset\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryEncryptValue\",\"ListItemText\":\"New-AzDataFactoryEncryptValue\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryEncryptValue\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryGateway\",\"ListItemText\":\"New-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryGatewayAuthkey\",\"ListItemText\":\"New-AzDataFactoryGatewayAuthkey\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryGatewayAuthkey\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryHub\",\"ListItemText\":\"New-AzDataFactoryHub\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryHub\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryLinkedService\",\"ListItemText\":\"New-AzDataFactoryLinkedService\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryLinkedService\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryPipeline\",\"ListItemText\":\"New-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryV2\",\"ListItemText\":\"New-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2\"},{\"CompletionText\":\"New-AzDataFactoryV2Dataset\",\"ListItemText\":\"New-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2Dataset\"},{\"CompletionText\":\"New-AzDataFactoryV2IntegrationRuntimeKey\",\"ListItemText\":\"New-AzDataFactoryV2IntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2IntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryV2LinkedService\",\"ListItemText\":\"New-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2LinkedService\"},{\"CompletionText\":\"New-AzDataFactoryV2LinkedServiceEncryptedCredential\",\"ListItemText\":\"New-AzDataFactoryV2LinkedServiceEncryptedCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2LinkedServiceEncryptedCredential\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryV2Pipeline\",\"ListItemText\":\"New-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2Pipeline\"},{\"CompletionText\":\"New-AzDataFactoryV2Trigger\",\"ListItemText\":\"New-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2Trigger\"},{\"CompletionText\":\"New-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"New-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeAnalyticsCatalogCredential\",\"ListItemText\":\"New-AzDataLakeAnalyticsCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeAnalyticsCatalogCredential\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"New-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"New-AzDatalakeGen2FileSystem\",\"ListItemText\":\"New-AzDatalakeGen2FileSystem\",\"ResultType\":2,\"ToolTip\":\"New-AzDatalakeGen2FileSystem\"},{\"CompletionText\":\"New-AzDataLakeGen2Item\",\"ListItemText\":\"New-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeGen2ItemAclObject\",\"ListItemText\":\"New-AzDataLakeGen2ItemAclObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeGen2ItemAclObject\"},{\"CompletionText\":\"New-AzDataLakeGen2SasToken\",\"ListItemText\":\"New-AzDataLakeGen2SasToken\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeGen2SasToken\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeStoreAccount\",\"ListItemText\":\"New-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeStoreItem\",\"ListItemText\":\"New-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupConfigurationClientObject\",\"ListItemText\":\"New-AzDataProtectionBackupConfigurationClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupConfigurationClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupInstance\",\"ListItemText\":\"New-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupPolicy\",\"ListItemText\":\"New-AzDataProtectionBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupPolicy \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupVault\",\"ListItemText\":\"New-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupVaultStorageSettingObject\",\"ListItemText\":\"New-AzDataProtectionBackupVaultStorageSettingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupVaultStorageSettingObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionPolicyTagCriteriaClientObject\",\"ListItemText\":\"New-AzDataProtectionPolicyTagCriteriaClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionPolicyTagCriteriaClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionPolicyTriggerScheduleClientObject\",\"ListItemText\":\"New-AzDataProtectionPolicyTriggerScheduleClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionPolicyTriggerScheduleClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionResourceGuard\",\"ListItemText\":\"New-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionRestoreConfigurationClientObject\",\"ListItemText\":\"New-AzDataProtectionRestoreConfigurationClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionRestoreConfigurationClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionRetentionLifeCycleClientObject\",\"ListItemText\":\"New-AzDataProtectionRetentionLifeCycleClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionRetentionLifeCycleClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataShare\",\"ListItemText\":\"New-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShare\\r\\n\"},{\"CompletionText\":\"New-AzDataShareAccount\",\"ListItemText\":\"New-AzDataShareAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataShareDataSet\",\"ListItemText\":\"New-AzDataShareDataSet\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareDataSet\\r\\n\"},{\"CompletionText\":\"New-AzDataShareDataSetMapping\",\"ListItemText\":\"New-AzDataShareDataSetMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareDataSetMapping\\r\\n\"},{\"CompletionText\":\"New-AzDataShareInvitation\",\"ListItemText\":\"New-AzDataShareInvitation\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareInvitation\\r\\n\"},{\"CompletionText\":\"New-AzDataShareSubscription\",\"ListItemText\":\"New-AzDataShareSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareSubscription\\r\\n\"},{\"CompletionText\":\"New-AzDataShareSynchronizationSetting\",\"ListItemText\":\"New-AzDataShareSynchronizationSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareSynchronizationSetting\\r\\n\"},{\"CompletionText\":\"New-AzDataShareTrigger\",\"ListItemText\":\"New-AzDataShareTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareTrigger\\r\\n\"},{\"CompletionText\":\"New-AzDdosProtectionPlan\",\"ListItemText\":\"New-AzDdosProtectionPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzDdosProtectionPlan\\r\\n\"},{\"CompletionText\":\"New-AzDelegation\",\"ListItemText\":\"New-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"New-AzDelegation\\r\\n\"},{\"CompletionText\":\"New-AzDeployment\",\"ListItemText\":\"New-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzDeployment\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"New-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerService\",\"ListItemText\":\"New-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"New-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"New-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerStep\",\"ListItemText\":\"New-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupAllowlistCustomAlertRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupAllowlistCustomAlertRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupAllowlistCustomAlertRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupDenylistCustomAlertRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupDenylistCustomAlertRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupDenylistCustomAlertRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupThresholdCustomAlertRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupThresholdCustomAlertRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupThresholdCustomAlertRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupTimeWindowRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupTimeWindowRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupTimeWindowRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSetting\",\"ListItemText\":\"New-AzDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSettingLogSettingsObject\",\"ListItemText\":\"New-AzDiagnosticSettingLogSettingsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSettingLogSettingsObject \\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSettingMetricSettingsObject\",\"ListItemText\":\"New-AzDiagnosticSettingMetricSettingsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSettingMetricSettingsObject \\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSettingSubscriptionLogSettingsObject\",\"ListItemText\":\"New-AzDiagnosticSettingSubscriptionLogSettingsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSettingSubscriptionLogSettingsObject \\r\\n\"},{\"CompletionText\":\"New-AzDisk\",\"ListItemText\":\"New-AzDisk\",\"ResultType\":2,\"ToolTip\":\"New-AzDisk\\r\\n\"},{\"CompletionText\":\"New-AzDiskAccess\",\"ListItemText\":\"New-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"New-AzDiskConfig\",\"ListItemText\":\"New-AzDiskConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskConfig\\r\\n\"},{\"CompletionText\":\"New-AzDiskEncryptionSet\",\"ListItemText\":\"New-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"New-AzDiskEncryptionSetConfig\",\"ListItemText\":\"New-AzDiskEncryptionSetConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskEncryptionSetConfig\\r\\n\"},{\"CompletionText\":\"New-AzDiskPurchasePlanConfig\",\"ListItemText\":\"New-AzDiskPurchasePlanConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskPurchasePlanConfig\\r\\n\"},{\"CompletionText\":\"New-AzDiskUpdateConfig\",\"ListItemText\":\"New-AzDiskUpdateConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskUpdateConfig\\r\\n\"},{\"CompletionText\":\"New-AzDnsRecordConfig\",\"ListItemText\":\"New-AzDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"New-AzDnsRecordSet\",\"ListItemText\":\"New-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"New-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"New-AzDnsZone\",\"ListItemText\":\"New-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"New-AzDnsZone\\r\\n\"},{\"CompletionText\":\"New-AzEventGridChannel\",\"ListItemText\":\"New-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"New-AzEventGridDomain\",\"ListItemText\":\"New-AzEventGridDomain\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridDomain\\r\\n\"},{\"CompletionText\":\"New-AzEventGridDomainKey\",\"ListItemText\":\"New-AzEventGridDomainKey\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridDomainKey\\r\\n\"},{\"CompletionText\":\"New-AzEventGridDomainTopic\",\"ListItemText\":\"New-AzEventGridDomainTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridDomainTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerConfiguration\",\"ListItemText\":\"New-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerNamespace\",\"ListItemText\":\"New-AzEventGridPartnerNamespace\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerNamespace\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerNamespaceKey\",\"ListItemText\":\"New-AzEventGridPartnerNamespaceKey\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerNamespaceKey\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerRegistration\",\"ListItemText\":\"New-AzEventGridPartnerRegistration\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerRegistration\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerTopic\",\"ListItemText\":\"New-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"New-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"New-AzEventGridSubscription\",\"ListItemText\":\"New-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"New-AzEventGridSystemTopic\",\"ListItemText\":\"New-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"New-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"New-AzEventGridTopic\",\"ListItemText\":\"New-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridTopicKey\",\"ListItemText\":\"New-AzEventGridTopicKey\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridTopicKey\\r\\n\"},{\"CompletionText\":\"New-AzEventHub\",\"ListItemText\":\"New-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHub \\r\\n\"},{\"CompletionText\":\"New-AzEventHubApplicationGroup\",\"ListItemText\":\"New-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"New-AzEventHubAuthorizationRule\",\"ListItemText\":\"New-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"New-AzEventHubAuthorizationRuleSASToken\",\"ListItemText\":\"New-AzEventHubAuthorizationRuleSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzEventHubAuthorizationRuleSASToken\\r\\n\"},{\"CompletionText\":\"New-AzEventHubCluster\",\"ListItemText\":\"New-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"New-AzEventHubConsumerGroup\",\"ListItemText\":\"New-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"New-AzEventHubGeoDRConfiguration\",\"ListItemText\":\"New-AzEventHubGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzEventHubIPRuleConfig\",\"ListItemText\":\"New-AzEventHubIPRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubIPRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzEventHubKey\",\"ListItemText\":\"New-AzEventHubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubKey \\r\\n\"},{\"CompletionText\":\"New-AzEventHubKeyVaultPropertiesObject\",\"ListItemText\":\"New-AzEventHubKeyVaultPropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubKeyVaultPropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzEventHubNamespace\",\"ListItemText\":\"New-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"New-AzEventHubNamespaceV2\",\"ListItemText\":\"New-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"New-AzEventHubNamespaceV2\"},{\"CompletionText\":\"New-AzEventHubSchemaGroup\",\"ListItemText\":\"New-AzEventHubSchemaGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubSchemaGroup \\r\\n\"},{\"CompletionText\":\"New-AzEventHubThrottlingPolicyConfig\",\"ListItemText\":\"New-AzEventHubThrottlingPolicyConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubThrottlingPolicyConfig \\r\\n\"},{\"CompletionText\":\"New-AzEventHubVirtualNetworkRuleConfig\",\"ListItemText\":\"New-AzEventHubVirtualNetworkRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubVirtualNetworkRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteCircuit\",\"ListItemText\":\"New-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"New-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"New-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteConnection\",\"ListItemText\":\"New-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteGateway\",\"ListItemText\":\"New-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"New-AzExpressRoutePort\",\"ListItemText\":\"New-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"New-AzExpressRoutePortIdentity\",\"ListItemText\":\"New-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"New-AzExpressRoutePortLOA\",\"ListItemText\":\"New-AzExpressRoutePortLOA\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRoutePortLOA\\r\\n\"},{\"CompletionText\":\"New-AzFederatedIdentityCredentials\",\"ListItemText\":\"New-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"New-AzFirewall\",\"ListItemText\":\"New-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewall\\r\\n\"},{\"CompletionText\":\"New-AzFirewallApplicationRule\",\"ListItemText\":\"New-AzFirewallApplicationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallApplicationRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallApplicationRuleCollection\",\"ListItemText\":\"New-AzFirewallApplicationRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallApplicationRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallHubIpAddress\",\"ListItemText\":\"New-AzFirewallHubIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallHubIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzFirewallHubPublicIpAddress\",\"ListItemText\":\"New-AzFirewallHubPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallHubPublicIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNatRule\",\"ListItemText\":\"New-AzFirewallNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNatRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNatRuleCollection\",\"ListItemText\":\"New-AzFirewallNatRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNatRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNetworkRule\",\"ListItemText\":\"New-AzFirewallNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNetworkRuleCollection\",\"ListItemText\":\"New-AzFirewallNetworkRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNetworkRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicy\",\"ListItemText\":\"New-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyApplicationRule\",\"ListItemText\":\"New-AzFirewallPolicyApplicationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyApplicationRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyApplicationRuleCustomHttpHeader\",\"ListItemText\":\"New-AzFirewallPolicyApplicationRuleCustomHttpHeader\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyApplicationRuleCustomHttpHeader\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyDnsSetting\",\"ListItemText\":\"New-AzFirewallPolicyDnsSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyDnsSetting\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyExplicitProxy\",\"ListItemText\":\"New-AzFirewallPolicyExplicitProxy\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyExplicitProxy\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyFilterRuleCollection\",\"ListItemText\":\"New-AzFirewallPolicyFilterRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyFilterRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyIntrusionDetection\",\"ListItemText\":\"New-AzFirewallPolicyIntrusionDetection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyIntrusionDetection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyIntrusionDetectionBypassTraffic\",\"ListItemText\":\"New-AzFirewallPolicyIntrusionDetectionBypassTraffic\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyIntrusionDetectionBypassTraffic\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyIntrusionDetectionSignatureOverride\",\"ListItemText\":\"New-AzFirewallPolicyIntrusionDetectionSignatureOverride\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyIntrusionDetectionSignatureOverride\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyNatRule\",\"ListItemText\":\"New-AzFirewallPolicyNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyNatRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyNatRuleCollection\",\"ListItemText\":\"New-AzFirewallPolicyNatRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyNatRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyNetworkRule\",\"ListItemText\":\"New-AzFirewallPolicyNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"New-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicySnat\",\"ListItemText\":\"New-AzFirewallPolicySnat\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicySnat\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicySqlSetting\",\"ListItemText\":\"New-AzFirewallPolicySqlSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicySqlSetting\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyThreatIntelWhitelist\",\"ListItemText\":\"New-AzFirewallPolicyThreatIntelWhitelist\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyThreatIntelWhitelist\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPublicIpAddress\",\"ListItemText\":\"New-AzFirewallPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPublicIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzFirewallThreatIntelWhitelist\",\"ListItemText\":\"New-AzFirewallThreatIntelWhitelist\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallThreatIntelWhitelist\\r\\n\"},{\"CompletionText\":\"New-AzFirewallThreatIntelWhitelistObject\",\"ListItemText\":\"New-AzFirewallThreatIntelWhitelistObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallThreatIntelWhitelistObject\"},{\"CompletionText\":\"New-AzFrontDoor\",\"ListItemText\":\"New-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorBackendObject\",\"ListItemText\":\"New-AzFrontDoorBackendObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorBackendObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorBackendPoolObject\",\"ListItemText\":\"New-AzFrontDoorBackendPoolObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorBackendPoolObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorBackendPoolsSettingObject\",\"ListItemText\":\"New-AzFrontDoorBackendPoolsSettingObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorBackendPoolsSettingObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"New-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnCustomDomainTlsSettingParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnCustomDomainTlsSettingParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnCustomDomainTlsSettingParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"New-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnMigrationParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnMigrationParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnMigrationParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnMigrationWebApplicationFirewallMappingObject\",\"ListItemText\":\"New-AzFrontDoorCdnMigrationWebApplicationFirewallMappingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnMigrationWebApplicationFirewallMappingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOrigin\",\"ListItemText\":\"New-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"New-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOriginGroupHealthProbeSettingObject\",\"ListItemText\":\"New-AzFrontDoorCdnOriginGroupHealthProbeSettingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOriginGroupHealthProbeSettingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOriginGroupLoadBalancingSettingObject\",\"ListItemText\":\"New-AzFrontDoorCdnOriginGroupLoadBalancingSettingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOriginGroupLoadBalancingSettingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnProfile\",\"ListItemText\":\"New-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnProfileChangeSkuWafMappingObject\",\"ListItemText\":\"New-AzFrontDoorCdnProfileChangeSkuWafMappingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnProfileChangeSkuWafMappingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnProfileUpgradeParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnProfileUpgradeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnProfileUpgradeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnPurgeParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnPurgeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnPurgeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnResourceReferenceObject\",\"ListItemText\":\"New-AzFrontDoorCdnResourceReferenceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnResourceReferenceObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRoute\",\"ListItemText\":\"New-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRule\",\"ListItemText\":\"New-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleClientPortConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleClientPortConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleClientPortConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleCookiesConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleCookiesConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleCookiesConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleHostNameConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleHostNameConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleHostNameConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleHttpVersionConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleHttpVersionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleHttpVersionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleIsDeviceConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleIsDeviceConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleIsDeviceConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRulePostArgsConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRulePostArgsConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRulePostArgsConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleQueryStringConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleQueryStringConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleQueryStringConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRemoteAddressConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRemoteAddressConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRemoteAddressConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestBodyConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestBodyConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestBodyConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestHeaderActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestHeaderConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestHeaderConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestHeaderConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestMethodConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestMethodConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestMethodConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestSchemeConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestSchemeConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestSchemeConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestUriConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestUriConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestUriConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleResponseHeaderActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleResponseHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleResponseHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRouteConfigurationOverrideActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRouteConfigurationOverrideActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRouteConfigurationOverrideActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleServerPortConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleServerPortConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleServerPortConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleSet\",\"ListItemText\":\"New-AzFrontDoorCdnRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleSet \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleSocketAddrConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleSocketAddrConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleSocketAddrConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleSslProtocolConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleSslProtocolConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleSslProtocolConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlFileExtensionConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlFileExtensionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlFileExtensionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlFileNameConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlFileNameConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlFileNameConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlPathConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlPathConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlPathConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlRedirectActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlRedirectActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlRedirectActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlRewriteActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlRewriteActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlRewriteActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlSigningActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlSigningActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlSigningActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecret\",\"ListItemText\":\"New-AzFrontDoorCdnSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecret \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretCustomerCertificateParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretCustomerCertificateParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretCustomerCertificateParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretFirstPartyManagedCertificateParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretFirstPartyManagedCertificateParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretFirstPartyManagedCertificateParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretManagedCertificateParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretManagedCertificateParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretManagedCertificateParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretUrlSigningKeyParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretUrlSigningKeyParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretUrlSigningKeyParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"New-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallAssociationObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallAssociationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallAssociationObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorFrontendEndpointObject\",\"ListItemText\":\"New-AzFrontDoorFrontendEndpointObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorFrontendEndpointObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorHeaderActionObject\",\"ListItemText\":\"New-AzFrontDoorHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorHeaderActionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorHealthProbeSettingObject\",\"ListItemText\":\"New-AzFrontDoorHealthProbeSettingObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorHealthProbeSettingObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorLoadBalancingSettingObject\",\"ListItemText\":\"New-AzFrontDoorLoadBalancingSettingObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorLoadBalancingSettingObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRoutingRuleObject\",\"ListItemText\":\"New-AzFrontDoorRoutingRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRoutingRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngine\",\"ListItemText\":\"New-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngineActionObject\",\"ListItemText\":\"New-AzFrontDoorRulesEngineActionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngineActionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngineMatchConditionObject\",\"ListItemText\":\"New-AzFrontDoorRulesEngineMatchConditionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngineMatchConditionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngineRuleObject\",\"ListItemText\":\"New-AzFrontDoorRulesEngineRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngineRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafCustomRuleObject\",\"ListItemText\":\"New-AzFrontDoorWafCustomRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafCustomRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafManagedRuleExclusionObject\",\"ListItemText\":\"New-AzFrontDoorWafManagedRuleExclusionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafManagedRuleExclusionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafManagedRuleObject\",\"ListItemText\":\"New-AzFrontDoorWafManagedRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafManagedRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafManagedRuleOverrideObject\",\"ListItemText\":\"New-AzFrontDoorWafManagedRuleOverrideObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafManagedRuleOverrideObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafMatchConditionObject\",\"ListItemText\":\"New-AzFrontDoorWafMatchConditionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafMatchConditionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafPolicy\",\"ListItemText\":\"New-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafRuleGroupOverrideObject\",\"ListItemText\":\"New-AzFrontDoorWafRuleGroupOverrideObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafRuleGroupOverrideObject\\r\\n\"},{\"CompletionText\":\"New-AzFunctionApp\",\"ListItemText\":\"New-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"New-AzFunctionAppPlan\",\"ListItemText\":\"New-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"New-AzGallery\",\"ListItemText\":\"New-AzGallery\",\"ResultType\":2,\"ToolTip\":\"New-AzGallery\\r\\n\"},{\"CompletionText\":\"New-AzGalleryApplication\",\"ListItemText\":\"New-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"New-AzGalleryApplicationVersion\",\"ListItemText\":\"New-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"New-AzGalleryImageDefinition\",\"ListItemText\":\"New-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"New-AzGalleryImageVersion\",\"ListItemText\":\"New-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"New-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"New-AzGatewayCustomBgpIpConfigurationObject\",\"ListItemText\":\"New-AzGatewayCustomBgpIpConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzGatewayCustomBgpIpConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightCluster\",\"ListItemText\":\"New-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"New-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightClusterAutoscaleScheduleCondition\",\"ListItemText\":\"New-AzHDInsightClusterAutoscaleScheduleCondition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightClusterAutoscaleScheduleCondition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightClusterConfig\",\"ListItemText\":\"New-AzHDInsightClusterConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightClusterConfig\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightHiveJobDefinition\",\"ListItemText\":\"New-AzHDInsightHiveJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightHiveJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightIPConfiguration\",\"ListItemText\":\"New-AzHDInsightIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightIPConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightMapReduceJobDefinition\",\"ListItemText\":\"New-AzHDInsightMapReduceJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightMapReduceJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightPigJobDefinition\",\"ListItemText\":\"New-AzHDInsightPigJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightPigJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightPrivateLinkConfiguration\",\"ListItemText\":\"New-AzHDInsightPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightSqoopJobDefinition\",\"ListItemText\":\"New-AzHDInsightSqoopJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightSqoopJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightStreamingMapReduceJobDefinition\",\"ListItemText\":\"New-AzHDInsightStreamingMapReduceJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightStreamingMapReduceJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHealthcareApisService\",\"ListItemText\":\"New-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareApisWorkspace\",\"ListItemText\":\"New-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareDicomService\",\"ListItemText\":\"New-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareFhirService\",\"ListItemText\":\"New-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareIotConnector\",\"ListItemText\":\"New-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareIotConnectorFhirDestination\",\"ListItemText\":\"New-AzHealthcareIotConnectorFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareIotConnectorFhirDestination \\r\\n\"},{\"CompletionText\":\"New-AzHost\",\"ListItemText\":\"New-AzHost\",\"ResultType\":2,\"ToolTip\":\"New-AzHost\\r\\n\"},{\"CompletionText\":\"New-AzHostGroup\",\"ListItemText\":\"New-AzHostGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzHostGroup\\r\\n\"},{\"CompletionText\":\"New-AzImage\",\"ListItemText\":\"New-AzImage\",\"ResultType\":2,\"ToolTip\":\"New-AzImage\\r\\n\"},{\"CompletionText\":\"New-AzImageConfig\",\"ListItemText\":\"New-AzImageConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzImageConfig\\r\\n\"},{\"CompletionText\":\"New-AzInsightsPrivateLinkScope\",\"ListItemText\":\"New-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"New-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"New-AzInsightsPrivateLinkScopedResource\",\"ListItemText\":\"New-AzInsightsPrivateLinkScopedResource\",\"ResultType\":2,\"ToolTip\":\"New-AzInsightsPrivateLinkScopedResource\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccount\",\"ListItemText\":\"New-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountAgreement\",\"ListItemText\":\"New-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountAssembly\",\"ListItemText\":\"New-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"New-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountCertificate\",\"ListItemText\":\"New-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountMap\",\"ListItemText\":\"New-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountPartner\",\"ListItemText\":\"New-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountSchema\",\"ListItemText\":\"New-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"New-AzIotHub\",\"ListItemText\":\"New-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHub\\r\\n\"},{\"CompletionText\":\"New-AzIotHubExportDevice\",\"ListItemText\":\"New-AzIotHubExportDevice\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubExportDevice\\r\\n\"},{\"CompletionText\":\"New-AzIotHubImportDevice\",\"ListItemText\":\"New-AzIotHubImportDevice\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubImportDevice\\r\\n\"},{\"CompletionText\":\"New-AzIotHubKey\",\"ListItemText\":\"New-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"New-AzIotHubSasToken\",\"ListItemText\":\"New-AzIotHubSasToken\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubSasToken\\r\\n\"},{\"CompletionText\":\"New-AzIotSecuritySolutionRecommendationConfigurationObject\",\"ListItemText\":\"New-AzIotSecuritySolutionRecommendationConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzIotSecuritySolutionRecommendationConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzIotSecuritySolutionUserDefinedResourcesObject\",\"ListItemText\":\"New-AzIotSecuritySolutionUserDefinedResourcesObject\",\"ResultType\":2,\"ToolTip\":\"New-AzIotSecuritySolutionUserDefinedResourcesObject\\r\\n\"},{\"CompletionText\":\"New-AzIpAllocation\",\"ListItemText\":\"New-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"New-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"New-AzIpConfigurationBgpPeeringAddressObject\",\"ListItemText\":\"New-AzIpConfigurationBgpPeeringAddressObject\",\"ResultType\":2,\"ToolTip\":\"New-AzIpConfigurationBgpPeeringAddressObject\\r\\n\"},{\"CompletionText\":\"New-AzIpGroup\",\"ListItemText\":\"New-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzIpGroup\\r\\n\"},{\"CompletionText\":\"New-AzIpsecPolicy\",\"ListItemText\":\"New-AzIpsecPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzIpsecPolicy\\r\\n\"},{\"CompletionText\":\"New-AzIpsecTrafficSelectorPolicy\",\"ListItemText\":\"New-AzIpsecTrafficSelectorPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzIpsecTrafficSelectorPolicy\\r\\n\"},{\"CompletionText\":\"New-AzKeyVault\",\"ListItemText\":\"New-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVault\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultCertificateAdministratorDetail\",\"ListItemText\":\"New-AzKeyVaultCertificateAdministratorDetail\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultCertificateAdministratorDetail\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultCertificateOrganizationDetail\",\"ListItemText\":\"New-AzKeyVaultCertificateOrganizationDetail\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultCertificateOrganizationDetail\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultCertificatePolicy\",\"ListItemText\":\"New-AzKeyVaultCertificatePolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultCertificatePolicy\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultManagedHsm\",\"ListItemText\":\"New-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultNetworkRuleSetObject\",\"ListItemText\":\"New-AzKeyVaultNetworkRuleSetObject\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultNetworkRuleSetObject\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultRoleAssignment\",\"ListItemText\":\"New-AzKeyVaultRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultRoleDefinition\",\"ListItemText\":\"New-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzKustoAttachedDatabaseConfiguration\",\"ListItemText\":\"New-AzKustoAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzKustoCluster\",\"ListItemText\":\"New-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"New-AzKustoClusterPrincipalAssignment\",\"ListItemText\":\"New-AzKustoClusterPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoClusterPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzKustoDatabase\",\"ListItemText\":\"New-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"New-AzKustoDatabasePrincipalAssignment\",\"ListItemText\":\"New-AzKustoDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzKustoDataConnection\",\"ListItemText\":\"New-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"New-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"New-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzKustoPrivateEndpointConnection\",\"ListItemText\":\"New-AzKustoPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"New-AzKustoScript\",\"ListItemText\":\"New-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoScript \\r\\n\"},{\"CompletionText\":\"New-AzLoad\",\"ListItemText\":\"New-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzLoad \\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancer\",\"ListItemText\":\"New-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressConfig\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressPoolTunnelInterfaceConfig\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressPoolTunnelInterfaceConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressPoolTunnelInterfaceConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"New-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"New-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"New-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"New-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerProbeConfig\",\"ListItemText\":\"New-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerRuleConfig\",\"ListItemText\":\"New-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzLocalNetworkGateway\",\"ListItemText\":\"New-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"New-AzLogicApp\",\"ListItemText\":\"New-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"New-AzLogicApp\\r\\n\"},{\"CompletionText\":\"New-AzMaintenanceConfiguration\",\"ListItemText\":\"New-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzManagedApplication\",\"ListItemText\":\"New-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"New-AzManagedApplicationDefinition\",\"ListItemText\":\"New-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"New-AzManagedCassandraCluster\",\"ListItemText\":\"New-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"New-AzManagedCassandraDataCenter\",\"ListItemText\":\"New-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesAssignment\",\"ListItemText\":\"New-AzManagedServicesAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesAssignment \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesAuthorizationObject\",\"ListItemText\":\"New-AzManagedServicesAuthorizationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesAuthorizationObject \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesDefinition\",\"ListItemText\":\"New-AzManagedServicesDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesDefinition \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesEligibleApproverObject\",\"ListItemText\":\"New-AzManagedServicesEligibleApproverObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesEligibleApproverObject \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesEligibleAuthorizationObject\",\"ListItemText\":\"New-AzManagedServicesEligibleAuthorizationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesEligibleAuthorizationObject \\r\\n\"},{\"CompletionText\":\"New-AzManagementGroup\",\"ListItemText\":\"New-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"New-AzManagementGroupDeployment\",\"ListItemText\":\"New-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"New-AzManagementGroupHierarchySetting\",\"ListItemText\":\"New-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"New-AzManagementGroupSubscription\",\"ListItemText\":\"New-AzManagementGroupSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroupSubscription\\r\\n\"},{\"CompletionText\":\"New-AzMediaService\",\"ListItemText\":\"New-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"New-AzMediaService\\r\\n\"},{\"CompletionText\":\"New-AzMediaServiceStorageConfig\",\"ListItemText\":\"New-AzMediaServiceStorageConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzMediaServiceStorageConfig\\r\\n\"},{\"CompletionText\":\"New-AzMetricAlertRuleV2Criteria\",\"ListItemText\":\"New-AzMetricAlertRuleV2Criteria\",\"ResultType\":2,\"ToolTip\":\"New-AzMetricAlertRuleV2Criteria\\r\\n\"},{\"CompletionText\":\"New-AzMetricAlertRuleV2DimensionSelection\",\"ListItemText\":\"New-AzMetricAlertRuleV2DimensionSelection\",\"ResultType\":2,\"ToolTip\":\"New-AzMetricAlertRuleV2DimensionSelection\\r\\n\"},{\"CompletionText\":\"New-AzMetricFilter\",\"ListItemText\":\"New-AzMetricFilter\",\"ResultType\":2,\"ToolTip\":\"New-AzMetricFilter\\r\\n\"},{\"CompletionText\":\"New-AzMigrateDiskMapping\",\"ListItemText\":\"New-AzMigrateDiskMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateDiskMapping \\r\\n\"},{\"CompletionText\":\"New-AzMigrateNicMapping\",\"ListItemText\":\"New-AzMigrateNicMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateNicMapping \\r\\n\"},{\"CompletionText\":\"New-AzMigrateProject\",\"ListItemText\":\"New-AzMigrateProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateProject \\r\\n\"},{\"CompletionText\":\"New-AzMigrateReplicationPolicy\",\"ListItemText\":\"New-AzMigrateReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateReplicationPolicy \\r\\n\"},{\"CompletionText\":\"New-AzMigrateReplicationProtectionContainerMapping\",\"ListItemText\":\"New-AzMigrateReplicationProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateReplicationProtectionContainerMapping \\r\\n\"},{\"CompletionText\":\"New-AzMigrateServerReplication\",\"ListItemText\":\"New-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"New-AzMigrateTestNicMapping\",\"ListItemText\":\"New-AzMigrateTestNicMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateTestNicMapping \\r\\n\"},{\"CompletionText\":\"New-AzMlCommitmentPlan\",\"ListItemText\":\"New-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"New-AzMlWebService\",\"ListItemText\":\"New-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"New-AzMlWebService\\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspace\",\"ListItemText\":\"New-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceAksObject\",\"ListItemText\":\"New-AzMLWorkspaceAksObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceAksObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceAmlComputeObject\",\"ListItemText\":\"New-AzMLWorkspaceAmlComputeObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceAmlComputeObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"New-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"New-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCodeVersion\",\"ListItemText\":\"New-AzMLWorkspaceCodeVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCodeVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCommandJobObject\",\"ListItemText\":\"New-AzMLWorkspaceCommandJobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCommandJobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComponentContainer\",\"ListItemText\":\"New-AzMLWorkspaceComponentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComponentContainer \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComponentVersion\",\"ListItemText\":\"New-AzMLWorkspaceComponentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComponentVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCompute\",\"ListItemText\":\"New-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComputeInstanceObject\",\"ListItemText\":\"New-AzMLWorkspaceComputeInstanceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComputeInstanceObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComputeStartStopScheduleObject\",\"ListItemText\":\"New-AzMLWorkspaceComputeStartStopScheduleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComputeStartStopScheduleObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceConnection\",\"ListItemText\":\"New-AzMLWorkspaceConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceConnection \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCustomModelJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceCustomModelJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCustomModelJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCustomModelJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceCustomModelJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCustomModelJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatabricksObject\",\"ListItemText\":\"New-AzMLWorkspaceDatabricksObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatabricksObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataContainer\",\"ListItemText\":\"New-AzMLWorkspaceDataContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataContainer \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataFactoryObject\",\"ListItemText\":\"New-AzMLWorkspaceDataFactoryObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataFactoryObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataLakeAnalyticsObject\",\"ListItemText\":\"New-AzMLWorkspaceDataLakeAnalyticsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataLakeAnalyticsObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastore\",\"ListItemText\":\"New-AzMLWorkspaceDatastore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastore \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreBlobObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreBlobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreBlobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreDataLakeGen1Object\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreDataLakeGen1Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreDataLakeGen1Object \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreDataLakeGen2Object\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreDataLakeGen2Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreDataLakeGen2Object \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreFileObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreFileObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreFileObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreKeyCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreKeyCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreKeyCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreNoneCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreNoneCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreNoneCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreSasCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreSasCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreSasCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreServicePrincipalCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreServicePrincipalCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreServicePrincipalCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataVersion\",\"ListItemText\":\"New-AzMLWorkspaceDataVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceEnvironmentVersion\",\"ListItemText\":\"New-AzMLWorkspaceEnvironmentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceEnvironmentVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceHDInsightObject\",\"ListItemText\":\"New-AzMLWorkspaceHDInsightObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceHDInsightObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceJob\",\"ListItemText\":\"New-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceJobServiceObject\",\"ListItemText\":\"New-AzMLWorkspaceJobServiceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceJobServiceObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceKubernetesObject\",\"ListItemText\":\"New-AzMLWorkspaceKubernetesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceKubernetesObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceLiteralJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceLiteralJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceLiteralJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLFlowModelJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLFlowModelJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLFlowModelJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLFlowModelJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLFlowModelJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLFlowModelJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLTableJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLTableJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLTableJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLTableJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLTableJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLTableJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceModelContainer\",\"ListItemText\":\"New-AzMLWorkspaceModelContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceModelContainer \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceModelVersion\",\"ListItemText\":\"New-AzMLWorkspaceModelVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceModelVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"New-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"New-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceOnlineEndpointKey\",\"ListItemText\":\"New-AzMLWorkspaceOnlineEndpointKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceOnlineEndpointKey \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspacePipelineJobObject\",\"ListItemText\":\"New-AzMLWorkspacePipelineJobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspacePipelineJobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceQuotaPropertiesObject\",\"ListItemText\":\"New-AzMLWorkspaceQuotaPropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceQuotaPropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceSharedPrivateLinkResourceObject\",\"ListItemText\":\"New-AzMLWorkspaceSharedPrivateLinkResourceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceSharedPrivateLinkResourceObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceSweepJobObject\",\"ListItemText\":\"New-AzMLWorkspaceSweepJobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceSweepJobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceSynapseSparkObject\",\"ListItemText\":\"New-AzMLWorkspaceSynapseSparkObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceSynapseSparkObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceTritonModelJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceTritonModelJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceTritonModelJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceTritonModelJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceTritonModelJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceTritonModelJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFileJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFileJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFileJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFileJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFileJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFileJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFolderJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFolderJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFolderJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFolderJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFolderJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFolderJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceVirtualMachineObject\",\"ListItemText\":\"New-AzMLWorkspaceVirtualMachineObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceVirtualMachineObject \\r\\n\"},{\"CompletionText\":\"New-AzMonitorWorkspace\",\"ListItemText\":\"New-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFirewallRule\",\"ListItemText\":\"New-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServer\",\"ListItemText\":\"New-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServerDatabase\",\"ListItemText\":\"New-AzMySqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"New-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServerReplica\",\"ListItemText\":\"New-AzMySqlFlexibleServerReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServerReplica \\r\\n\"},{\"CompletionText\":\"New-AzMySqlReplica\",\"ListItemText\":\"New-AzMySqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlReplica \\r\\n\"},{\"CompletionText\":\"New-AzMySqlServer\",\"ListItemText\":\"New-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"New-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"New-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"New-AzNatGateway\",\"ListItemText\":\"New-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzNatGateway\\r\\n\"},{\"CompletionText\":\"New-AzNetworkInterface\",\"ListItemText\":\"New-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"New-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"New-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManager\",\"ListItemText\":\"New-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerAddressPrefixItem\",\"ListItemText\":\"New-AzNetworkManagerAddressPrefixItem\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerAddressPrefixItem\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"New-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerConnectivityGroupItem\",\"ListItemText\":\"New-AzNetworkManagerConnectivityGroupItem\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerConnectivityGroupItem\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerGroup\",\"ListItemText\":\"New-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerHub\",\"ListItemText\":\"New-AzNetworkManagerHub\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerHub\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"New-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerScope\",\"ListItemText\":\"New-AzNetworkManagerScope\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerScope\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerScopeConnection\",\"ListItemText\":\"New-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"New-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"New-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"New-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityGroupItem\",\"ListItemText\":\"New-AzNetworkManagerSecurityGroupItem\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityGroupItem\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerStaticMember\",\"ListItemText\":\"New-AzNetworkManagerStaticMember\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerStaticMember\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"New-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkProfile\",\"ListItemText\":\"New-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"New-AzNetworkSecurityGroup\",\"ListItemText\":\"New-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"New-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"New-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzNetworkVirtualAppliance\",\"ListItemText\":\"New-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcher\",\"ListItemText\":\"New-AzNetworkWatcher\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcher\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorEndpointObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorEndpointObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorEndpointObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorEndpointScopeItemObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorEndpointScopeItemObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorEndpointScopeItemObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorOutputObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorOutputObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorOutputObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorProtocolConfigurationObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorProtocolConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorProtocolConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorTestConfigurationObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorTestConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorTestConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorTestGroupObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorTestGroupObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorTestGroupObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherFlowLog\",\"ListItemText\":\"New-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile\",\"ListItemText\":\"New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"New-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherPacketCaptureV2\",\"ListItemText\":\"New-AzNetworkWatcherPacketCaptureV2\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherPacketCaptureV2\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherProtocolConfiguration\",\"ListItemText\":\"New-AzNetworkWatcherProtocolConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherProtocolConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHub\",\"ListItemText\":\"New-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"New-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"New-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"New-AzNotificationHubKey\",\"ListItemText\":\"New-AzNotificationHubKey\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubKey\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubsNamespace\",\"ListItemText\":\"New-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"New-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"New-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"New-AzNotificationHubsNamespaceKey\",\"ListItemText\":\"New-AzNotificationHubsNamespaceKey\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespaceKey\\r\\n\"},{\"CompletionText\":\"New-AzO365PolicyProperty\",\"ListItemText\":\"New-AzO365PolicyProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzO365PolicyProperty\\r\\n\"},{\"CompletionText\":\"New-AzOffice365PolicyProperty\",\"ListItemText\":\"New-AzOffice365PolicyProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzOffice365PolicyProperty\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsApplicationInsightsDataSource\",\"ListItemText\":\"New-AzOperationalInsightsApplicationInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsApplicationInsightsDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsAzureActivityLogDataSource\",\"ListItemText\":\"New-AzOperationalInsightsAzureActivityLogDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsAzureActivityLogDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsAzureAuditDataSource\",\"ListItemText\":\"New-AzOperationalInsightsAzureAuditDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsAzureAuditDataSource\"},{\"CompletionText\":\"New-AzOperationalInsightsCluster\",\"ListItemText\":\"New-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsComputerGroup\",\"ListItemText\":\"New-AzOperationalInsightsComputerGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsComputerGroup\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsCustomLogDataSource\",\"ListItemText\":\"New-AzOperationalInsightsCustomLogDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsCustomLogDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsDataExport\",\"ListItemText\":\"New-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"New-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsLinuxPerformanceObjectDataSource\",\"ListItemText\":\"New-AzOperationalInsightsLinuxPerformanceObjectDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsLinuxPerformanceObjectDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsLinuxSyslogDataSource\",\"ListItemText\":\"New-AzOperationalInsightsLinuxSyslogDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsLinuxSyslogDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsPurgeWorkspace\",\"ListItemText\":\"New-AzOperationalInsightsPurgeWorkspace\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsPurgeWorkspace\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsRestoreTable\",\"ListItemText\":\"New-AzOperationalInsightsRestoreTable\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsRestoreTable\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"New-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsSearchTable\",\"ListItemText\":\"New-AzOperationalInsightsSearchTable\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsSearchTable\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"New-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsTable\",\"ListItemText\":\"New-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsWindowsEventDataSource\",\"ListItemText\":\"New-AzOperationalInsightsWindowsEventDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsWindowsEventDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsWindowsPerformanceCounterDataSource\",\"ListItemText\":\"New-AzOperationalInsightsWindowsPerformanceCounterDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsWindowsPerformanceCounterDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsWorkspace\",\"ListItemText\":\"New-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"New-AzP2sVpnGateway\",\"ListItemText\":\"New-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"New-AzPacketCaptureFilterConfig\",\"ListItemText\":\"New-AzPacketCaptureFilterConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPacketCaptureFilterConfig\\r\\n\"},{\"CompletionText\":\"New-AzPacketCaptureScopeConfig\",\"ListItemText\":\"New-AzPacketCaptureScopeConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPacketCaptureScopeConfig\\r\\n\"},{\"CompletionText\":\"New-AzPolicyAssignment\",\"ListItemText\":\"New-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"New-AzPolicyAttestation\",\"ListItemText\":\"New-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"New-AzPolicyDefinition\",\"ListItemText\":\"New-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"New-AzPolicyExemption\",\"ListItemText\":\"New-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"New-AzPolicySetDefinition\",\"ListItemText\":\"New-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFirewallRule\",\"ListItemText\":\"New-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"New-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFlexibleServerDatabase\",\"ListItemText\":\"New-AzPostgreSqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"New-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlReplica\",\"ListItemText\":\"New-AzPostgreSqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlReplica \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlServer\",\"ListItemText\":\"New-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"New-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"New-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"New-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"New-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"New-AzPowerBIWorkspaceCollection\",\"ListItemText\":\"New-AzPowerBIWorkspaceCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzPowerBIWorkspaceCollection\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsRecordConfig\",\"ListItemText\":\"New-AzPrivateDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsRecordSet\",\"ListItemText\":\"New-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"New-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsZone\",\"ListItemText\":\"New-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsZoneConfig\",\"ListItemText\":\"New-AzPrivateDnsZoneConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsZoneConfig\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsZoneGroup\",\"ListItemText\":\"New-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"New-AzPrivateEndpoint\",\"ListItemText\":\"New-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzPrivateEndpointIpConfiguration\",\"ListItemText\":\"New-AzPrivateEndpointIpConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateEndpointIpConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkAssociation\",\"ListItemText\":\"New-AzPrivateLinkAssociation\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkAssociation\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkService\",\"ListItemText\":\"New-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkServiceConnection\",\"ListItemText\":\"New-AzPrivateLinkServiceConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkServiceConnection\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkServiceIpConfig\",\"ListItemText\":\"New-AzPrivateLinkServiceIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkServiceIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzProximityPlacementGroup\",\"ListItemText\":\"New-AzProximityPlacementGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzProximityPlacementGroup\\r\\n\"},{\"CompletionText\":\"New-AzPublicIpAddress\",\"ListItemText\":\"New-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzPublicIpPrefix\",\"ListItemText\":\"New-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"New-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"New-AzPublicIpTag\",\"ListItemText\":\"New-AzPublicIpTag\",\"ResultType\":2,\"ToolTip\":\"New-AzPublicIpTag\\r\\n\"},{\"CompletionText\":\"New-AzRadiusServer\",\"ListItemText\":\"New-AzRadiusServer\",\"ResultType\":2,\"ToolTip\":\"New-AzRadiusServer\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig\",\"ListItemText\":\"New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrFabric\",\"ListItemText\":\"New-AzRecoveryServicesAsrFabric\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrFabric\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrInMageAzureV2DiskInput\",\"ListItemText\":\"New-AzRecoveryServicesAsrInMageAzureV2DiskInput\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrInMageAzureV2DiskInput\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrInMageRcmDiskInput\",\"ListItemText\":\"New-AzRecoveryServicesAsrInMageRcmDiskInput\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrInMageRcmDiskInput\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"New-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"New-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrProtectableItem\",\"ListItemText\":\"New-AzRecoveryServicesAsrProtectableItem\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrProtectableItem\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrProtectionContainer\",\"ListItemText\":\"New-AzRecoveryServicesAsrProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrProtectionContainer\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"New-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"New-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"New-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrStorageClassificationMapping\",\"ListItemText\":\"New-AzRecoveryServicesAsrStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrStorageClassificationMapping\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"New-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrVMNicConfig\",\"ListItemText\":\"New-AzRecoveryServicesAsrVMNicConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrVMNicConfig\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrVMNicIPConfig\",\"ListItemText\":\"New-AzRecoveryServicesAsrVMNicIPConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrVMNicIPConfig\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"New-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesVault\",\"ListItemText\":\"New-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"New-AzRedisCache\",\"ListItemText\":\"New-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCache\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheFirewallRule\",\"ListItemText\":\"New-AzRedisCacheFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheKey\",\"ListItemText\":\"New-AzRedisCacheKey\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheKey\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheLink\",\"ListItemText\":\"New-AzRedisCacheLink\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheLink\\r\\n\"},{\"CompletionText\":\"New-AzRedisCachePatchSchedule\",\"ListItemText\":\"New-AzRedisCachePatchSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCachePatchSchedule\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheScheduleEntry\",\"ListItemText\":\"New-AzRedisCacheScheduleEntry\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheScheduleEntry\\r\\n\"},{\"CompletionText\":\"New-AzRedisEnterpriseCache\",\"ListItemText\":\"New-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheAccessKey\",\"ListItemText\":\"New-AzRedisEnterpriseCacheAccessKey\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisEnterpriseCacheAccessKey\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"New-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheDatabaseKey\",\"ListItemText\":\"New-AzRedisEnterpriseCacheDatabaseKey\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisEnterpriseCacheDatabaseKey\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheKey\",\"ListItemText\":\"New-AzRedisEnterpriseCacheKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRedisEnterpriseCacheKey \\r\\n\"},{\"CompletionText\":\"New-AzRelayAuthorizationRule\",\"ListItemText\":\"New-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"New-AzRelayHybridConnection\",\"ListItemText\":\"New-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"New-AzRelayKey\",\"ListItemText\":\"New-AzRelayKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayKey \\r\\n\"},{\"CompletionText\":\"New-AzRelayNamespace\",\"ListItemText\":\"New-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"New-AzRelayNetworkRuleSetIPRuleObject\",\"ListItemText\":\"New-AzRelayNetworkRuleSetIPRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayNetworkRuleSetIPRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzResource\",\"ListItemText\":\"New-AzResource\",\"ResultType\":2,\"ToolTip\":\"New-AzResource\\r\\n\"},{\"CompletionText\":\"New-AzResourceGroup\",\"ListItemText\":\"New-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"New-AzResourceGroupDeployment\",\"ListItemText\":\"New-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"New-AzResourceLock\",\"ListItemText\":\"New-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceLock\\r\\n\"},{\"CompletionText\":\"New-AzResourceManagementPrivateLink\",\"ListItemText\":\"New-AzResourceManagementPrivateLink\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceManagementPrivateLink\\r\\n\"},{\"CompletionText\":\"New-AzResourceMoverMoveCollection\",\"ListItemText\":\"New-AzResourceMoverMoveCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzResourceMoverMoveCollection \\r\\n\"},{\"CompletionText\":\"New-AzRestorePoint\",\"ListItemText\":\"New-AzRestorePoint\",\"ResultType\":2,\"ToolTip\":\"New-AzRestorePoint\\r\\n\"},{\"CompletionText\":\"New-AzRestorePointCollection\",\"ListItemText\":\"New-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"New-AzRmStorageContainer\",\"ListItemText\":\"New-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"New-AzRmStorageShare\",\"ListItemText\":\"New-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"New-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"New-AzRoleAssignment\",\"ListItemText\":\"New-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzRoleAssignmentScheduleRequest\",\"ListItemText\":\"New-AzRoleAssignmentScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRoleAssignmentScheduleRequest \\r\\n\"},{\"CompletionText\":\"New-AzRoleDefinition\",\"ListItemText\":\"New-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzRoleEligibilityScheduleRequest\",\"ListItemText\":\"New-AzRoleEligibilityScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRoleEligibilityScheduleRequest \\r\\n\"},{\"CompletionText\":\"New-AzRoleManagementPolicyAssignment\",\"ListItemText\":\"New-AzRoleManagementPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRoleManagementPolicyAssignment \\r\\n\"},{\"CompletionText\":\"New-AzRouteConfig\",\"ListItemText\":\"New-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"New-AzRouteFilter\",\"ListItemText\":\"New-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"New-AzRouteFilterRuleConfig\",\"ListItemText\":\"New-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzRouteMap\",\"ListItemText\":\"New-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMap\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRule\",\"ListItemText\":\"New-AzRouteMapRule\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRule\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRuleAction\",\"ListItemText\":\"New-AzRouteMapRuleAction\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRuleAction\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRuleActionParameter\",\"ListItemText\":\"New-AzRouteMapRuleActionParameter\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRuleActionParameter\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRuleCriterion\",\"ListItemText\":\"New-AzRouteMapRuleCriterion\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRuleCriterion\\r\\n\"},{\"CompletionText\":\"New-AzRouteServer\",\"ListItemText\":\"New-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteServer\\r\\n\"},{\"CompletionText\":\"New-AzRouteTable\",\"ListItemText\":\"New-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteTable\\r\\n\"},{\"CompletionText\":\"New-AzRoutingConfiguration\",\"ListItemText\":\"New-AzRoutingConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzRoutingConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzRoutingIntent\",\"ListItemText\":\"New-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"New-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"New-AzRoutingPolicy\",\"ListItemText\":\"New-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"New-AzScheduledQueryRule\",\"ListItemText\":\"New-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"New-AzScheduledQueryRuleConditionObject\",\"ListItemText\":\"New-AzScheduledQueryRuleConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzScheduledQueryRuleConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzScheduledQueryRuleDimensionObject\",\"ListItemText\":\"New-AzScheduledQueryRuleDimensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzScheduledQueryRuleDimensionObject \\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomation\",\"ListItemText\":\"New-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationActionObject\",\"ListItemText\":\"New-AzSecurityAutomationActionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationActionObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationRuleObject\",\"ListItemText\":\"New-AzSecurityAutomationRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationRuleSetObject\",\"ListItemText\":\"New-AzSecurityAutomationRuleSetObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationRuleSetObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationScopeObject\",\"ListItemText\":\"New-AzSecurityAutomationScopeObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationScopeObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationSourceObject\",\"ListItemText\":\"New-AzSecurityAutomationSourceObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationSourceObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityPartnerProvider\",\"ListItemText\":\"New-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"New-AzSentinelAlertRule\",\"ListItemText\":\"New-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"New-AzSentinelAlertRuleAction\",\"ListItemText\":\"New-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"New-AzSentinelAutomationRule\",\"ListItemText\":\"New-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"New-AzSentinelBookmark\",\"ListItemText\":\"New-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"New-AzSentinelBookmarkRelation\",\"ListItemText\":\"New-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"New-AzSentinelDataConnector\",\"ListItemText\":\"New-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"New-AzSentinelEntityQuery\",\"ListItemText\":\"New-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncident\",\"ListItemText\":\"New-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncidentComment\",\"ListItemText\":\"New-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncidentRelation\",\"ListItemText\":\"New-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncidentTeam\",\"ListItemText\":\"New-AzSentinelIncidentTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncidentTeam \\r\\n\"},{\"CompletionText\":\"New-AzSentinelOnboardingState\",\"ListItemText\":\"New-AzSentinelOnboardingState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelOnboardingState \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusAuthorizationRule\",\"ListItemText\":\"New-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusAuthorizationRuleSASToken\",\"ListItemText\":\"New-AzServiceBusAuthorizationRuleSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceBusAuthorizationRuleSASToken\\r\\n\"},{\"CompletionText\":\"New-AzServiceBusGeoDRConfiguration\",\"ListItemText\":\"New-AzServiceBusGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusIPRuleConfig\",\"ListItemText\":\"New-AzServiceBusIPRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusIPRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusKey\",\"ListItemText\":\"New-AzServiceBusKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusKey \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusKeyVaultPropertiesObject\",\"ListItemText\":\"New-AzServiceBusKeyVaultPropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusKeyVaultPropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusNamespace\",\"ListItemText\":\"New-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusNamespaceV2\",\"ListItemText\":\"New-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"New-AzServiceBusQueue\",\"ListItemText\":\"New-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusRule\",\"ListItemText\":\"New-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusSubscription\",\"ListItemText\":\"New-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusTopic\",\"ListItemText\":\"New-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusVirtualNetworkRuleConfig\",\"ListItemText\":\"New-AzServiceBusVirtualNetworkRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusVirtualNetworkRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzServiceEndpointPolicy\",\"ListItemText\":\"New-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"New-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"New-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricApplication\",\"ListItemText\":\"New-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricApplicationType\",\"ListItemText\":\"New-AzServiceFabricApplicationType\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricApplicationType\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricApplicationTypeVersion\",\"ListItemText\":\"New-AzServiceFabricApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricCluster\",\"ListItemText\":\"New-AzServiceFabricCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricCluster\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedCluster\",\"ListItemText\":\"New-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"New-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"New-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"New-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterService\",\"ListItemText\":\"New-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedNodeType\",\"ListItemText\":\"New-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricService\",\"ListItemText\":\"New-AzServiceFabricService\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricService\\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerAzureResourceObject\",\"ListItemText\":\"New-AzServiceLinkerAzureResourceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerAzureResourceObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerConfluentBootstrapServerObject\",\"ListItemText\":\"New-AzServiceLinkerConfluentBootstrapServerObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerConfluentBootstrapServerObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerConfluentSchemaRegistryObject\",\"ListItemText\":\"New-AzServiceLinkerConfluentSchemaRegistryObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerConfluentSchemaRegistryObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerForContainerApp\",\"ListItemText\":\"New-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"New-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerForWebApp\",\"ListItemText\":\"New-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerSecretAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerSecretAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerSecretAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerServicePrincipalSecretAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerServicePrincipalSecretAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerServicePrincipalSecretAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerSystemAssignedIdentityAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerSystemAssignedIdentityAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerSystemAssignedIdentityAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerUserAssignedIdentityAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerUserAssignedIdentityAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerUserAssignedIdentityAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzSignalR\",\"ListItemText\":\"New-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"New-AzSignalR\\r\\n\"},{\"CompletionText\":\"New-AzSignalRKey\",\"ListItemText\":\"New-AzSignalRKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSignalRKey\\r\\n\"},{\"CompletionText\":\"New-AzSnapshot\",\"ListItemText\":\"New-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"New-AzSnapshot\\r\\n\"},{\"CompletionText\":\"New-AzSnapshotConfig\",\"ListItemText\":\"New-AzSnapshotConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSnapshotConfig\\r\\n\"},{\"CompletionText\":\"New-AzSnapshotUpdateConfig\",\"ListItemText\":\"New-AzSnapshotUpdateConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSnapshotUpdateConfig\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabase\",\"ListItemText\":\"New-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseCopy\",\"ListItemText\":\"New-AzSqlDatabaseCopy\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseCopy\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"New-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseExport\",\"ListItemText\":\"New-AzSqlDatabaseExport\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseExport\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"New-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseImport\",\"ListItemText\":\"New-AzSqlDatabaseImport\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseImport\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"New-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseRestorePoint\",\"ListItemText\":\"New-AzSqlDatabaseRestorePoint\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseRestorePoint\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseSecondary\",\"ListItemText\":\"New-AzSqlDatabaseSecondary\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseSecondary\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJob\",\"ListItemText\":\"New-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJobAgent\",\"ListItemText\":\"New-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJobCredential\",\"ListItemText\":\"New-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJobTargetGroup\",\"ListItemText\":\"New-AzSqlElasticJobTargetGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJobTargetGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticPool\",\"ListItemText\":\"New-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstance\",\"ListItemText\":\"New-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstanceDatabase\",\"ListItemText\":\"New-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstanceLink\",\"ListItemText\":\"New-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstancePool\",\"ListItemText\":\"New-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstanceServerTrustCertificate\",\"ListItemText\":\"New-AzSqlInstanceServerTrustCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstanceServerTrustCertificate\\r\\n\"},{\"CompletionText\":\"New-AzSqlServer\",\"ListItemText\":\"New-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServer\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerCommunicationLink\",\"ListItemText\":\"New-AzSqlServerCommunicationLink\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerCommunicationLink\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"New-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerDnsAlias\",\"ListItemText\":\"New-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerFirewallRule\",\"ListItemText\":\"New-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"New-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerOutboundFirewallRule\",\"ListItemText\":\"New-AzSqlServerOutboundFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerOutboundFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerTrustGroup\",\"ListItemText\":\"New-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerTrustGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"New-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncAgent\",\"ListItemText\":\"New-AzSqlSyncAgent\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncAgent\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncAgentKey\",\"ListItemText\":\"New-AzSqlSyncAgentKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncAgentKey\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncGroup\",\"ListItemText\":\"New-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncMember\",\"ListItemText\":\"New-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"New-AzSqlVirtualMachineAgReplicaObject\",\"ListItemText\":\"New-AzSqlVirtualMachineAgReplicaObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVirtualMachineAgReplicaObject \\r\\n\"},{\"CompletionText\":\"New-AzSqlVirtualMachineMultiSubnetIPConfigurationObject\",\"ListItemText\":\"New-AzSqlVirtualMachineMultiSubnetIPConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVirtualMachineMultiSubnetIPConfigurationObject \\r\\n\"},{\"CompletionText\":\"New-AzSqlVM\",\"ListItemText\":\"New-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVM \\r\\n\"},{\"CompletionText\":\"New-AzSqlVMGroup\",\"ListItemText\":\"New-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"New-AzSshKey\",\"ListItemText\":\"New-AzSshKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSshKey\\r\\n\"},{\"CompletionText\":\"New-AzStackHciArcSetting\",\"ListItemText\":\"New-AzStackHciArcSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStackHciArcSetting \\r\\n\"},{\"CompletionText\":\"New-AzStackHciCluster\",\"ListItemText\":\"New-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"New-AzStackHciExtension\",\"ListItemText\":\"New-AzStackHciExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStackHciExtension \\r\\n\"},{\"CompletionText\":\"New-AzStaticRoute\",\"ListItemText\":\"New-AzStaticRoute\",\"ResultType\":2,\"ToolTip\":\"New-AzStaticRoute\\r\\n\"},{\"CompletionText\":\"New-AzStaticWebApp\",\"ListItemText\":\"New-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppBuildAppSetting\",\"ListItemText\":\"New-AzStaticWebAppBuildAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppBuildAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppBuildFunctionAppSetting\",\"ListItemText\":\"New-AzStaticWebAppBuildFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppBuildFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppCustomDomain\",\"ListItemText\":\"New-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppFunctionAppSetting\",\"ListItemText\":\"New-AzStaticWebAppFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppSetting\",\"ListItemText\":\"New-AzStaticWebAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppUserRoleInvitationLink\",\"ListItemText\":\"New-AzStaticWebAppUserRoleInvitationLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppUserRoleInvitationLink \\r\\n\"},{\"CompletionText\":\"New-AzStorageAccount\",\"ListItemText\":\"New-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountKey\",\"ListItemText\":\"New-AzStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountManagementPolicyBlobIndexMatchObject\",\"ListItemText\":\"New-AzStorageAccountManagementPolicyBlobIndexMatchObject\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountManagementPolicyBlobIndexMatchObject\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountManagementPolicyFilter\",\"ListItemText\":\"New-AzStorageAccountManagementPolicyFilter\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountManagementPolicyFilter\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountManagementPolicyRule\",\"ListItemText\":\"New-AzStorageAccountManagementPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountManagementPolicyRule\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountSASToken\",\"ListItemText\":\"New-AzStorageAccountSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobInventoryPolicyRule\",\"ListItemText\":\"New-AzStorageBlobInventoryPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobInventoryPolicyRule\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobQueryConfig\",\"ListItemText\":\"New-AzStorageBlobQueryConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobQueryConfig\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobRangeToRestore\",\"ListItemText\":\"New-AzStorageBlobRangeToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobRangeToRestore\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobSASToken\",\"ListItemText\":\"New-AzStorageBlobSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageContainer\",\"ListItemText\":\"New-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"New-AzStorageContainerSASToken\",\"ListItemText\":\"New-AzStorageContainerSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContainerSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStorageContext\",\"ListItemText\":\"New-AzStorageContext\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContext\\r\\n\"},{\"CompletionText\":\"New-AzStorageDirectory\",\"ListItemText\":\"New-AzStorageDirectory\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageDirectory\\r\\n\"},{\"CompletionText\":\"New-AzStorageEncryptionScope\",\"ListItemText\":\"New-AzStorageEncryptionScope\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageEncryptionScope\\r\\n\"},{\"CompletionText\":\"New-AzStorageFileSASToken\",\"ListItemText\":\"New-AzStorageFileSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageFileSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageLocalUserPermissionScope\",\"ListItemText\":\"New-AzStorageLocalUserPermissionScope\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageLocalUserPermissionScope\\r\\n\"},{\"CompletionText\":\"New-AzStorageLocalUserSshPassword\",\"ListItemText\":\"New-AzStorageLocalUserSshPassword\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageLocalUserSshPassword\\r\\n\"},{\"CompletionText\":\"New-AzStorageLocalUserSshPublicKey\",\"ListItemText\":\"New-AzStorageLocalUserSshPublicKey\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageLocalUserSshPublicKey\\r\\n\"},{\"CompletionText\":\"New-AzStorageMover\",\"ListItemText\":\"New-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMover \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverAzStorageContainerEndpoint\",\"ListItemText\":\"New-AzStorageMoverAzStorageContainerEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverAzStorageContainerEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverJobDefinition\",\"ListItemText\":\"New-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverNfsEndpoint\",\"ListItemText\":\"New-AzStorageMoverNfsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverNfsEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverProject\",\"ListItemText\":\"New-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"New-AzStorageObjectReplicationPolicyRule\",\"ListItemText\":\"New-AzStorageObjectReplicationPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageObjectReplicationPolicyRule\\r\\n\"},{\"CompletionText\":\"New-AzStorageQueue\",\"ListItemText\":\"New-AzStorageQueue\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageQueue\\r\\n\"},{\"CompletionText\":\"New-AzStorageQueueSASToken\",\"ListItemText\":\"New-AzStorageQueueSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageQueueSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStorageShare\",\"ListItemText\":\"New-AzStorageShare\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageShare\\r\\n\"},{\"CompletionText\":\"New-AzStorageShareSASToken\",\"ListItemText\":\"New-AzStorageShareSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageShareSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncCloudEndpoint\",\"ListItemText\":\"New-AzStorageSyncCloudEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncCloudEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncGroup\",\"ListItemText\":\"New-AzStorageSyncGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncGroup\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncServerEndpoint\",\"ListItemText\":\"New-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncService\",\"ListItemText\":\"New-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"New-AzStorageTable\",\"ListItemText\":\"New-AzStorageTable\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageTable\\r\\n\"},{\"CompletionText\":\"New-AzStorageTableSASToken\",\"ListItemText\":\"New-AzStorageTableSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageTableSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsCluster\",\"ListItemText\":\"New-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsFunction\",\"ListItemText\":\"New-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsInput\",\"ListItemText\":\"New-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsJob\",\"ListItemText\":\"New-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsOutput\",\"ListItemText\":\"New-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsTransformation\",\"ListItemText\":\"New-AzStreamAnalyticsTransformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsTransformation \\r\\n\"},{\"CompletionText\":\"New-AzSubscriptionDeployment\",\"ListItemText\":\"New-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzSubscriptionDeployment\"},{\"CompletionText\":\"New-AzSubscriptionDiagnosticSetting\",\"ListItemText\":\"New-AzSubscriptionDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSubscriptionDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"New-AzSupportContactProfileObject\",\"ListItemText\":\"New-AzSupportContactProfileObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSupportContactProfileObject\\r\\n\"},{\"CompletionText\":\"New-AzSupportTicket\",\"ListItemText\":\"New-AzSupportTicket\",\"ResultType\":2,\"ToolTip\":\"New-AzSupportTicket\\r\\n\"},{\"CompletionText\":\"New-AzSupportTicketCommunication\",\"ListItemText\":\"New-AzSupportTicketCommunication\",\"ResultType\":2,\"ToolTip\":\"New-AzSupportTicketCommunication\\r\\n\"},{\"CompletionText\":\"New-AzSynapseDataFlow\",\"ListItemText\":\"New-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseDataFlow\"},{\"CompletionText\":\"New-AzSynapseDataset\",\"ListItemText\":\"New-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseDataset\"},{\"CompletionText\":\"New-AzSynapseFirewallRule\",\"ListItemText\":\"New-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSynapseGitRepositoryConfig\",\"ListItemText\":\"New-AzSynapseGitRepositoryConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseGitRepositoryConfig\\r\\n\"},{\"CompletionText\":\"New-AzSynapseIntegrationRuntimeKey\",\"ListItemText\":\"New-AzSynapseIntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseIntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"New-AzSynapseKqlScript\",\"ListItemText\":\"New-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPool\",\"ListItemText\":\"New-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ListItemText\":\"New-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"New-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ListItemText\":\"New-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"New-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolPrincipalAssignment\",\"ListItemText\":\"New-AzSynapseKustoPoolPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzSynapseLinkConnection\",\"ListItemText\":\"New-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseLinkConnection\"},{\"CompletionText\":\"New-AzSynapseLinkedService\",\"ListItemText\":\"New-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseLinkedService\"},{\"CompletionText\":\"New-AzSynapseLinkedServiceEncryptedCredential\",\"ListItemText\":\"New-AzSynapseLinkedServiceEncryptedCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseLinkedServiceEncryptedCredential\\r\\n\"},{\"CompletionText\":\"New-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"New-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseManagedPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzSynapseManagedVirtualNetworkConfig\",\"ListItemText\":\"New-AzSynapseManagedVirtualNetworkConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseManagedVirtualNetworkConfig\\r\\n\"},{\"CompletionText\":\"New-AzSynapseNotebook\",\"ListItemText\":\"New-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseNotebook\"},{\"CompletionText\":\"New-AzSynapsePipeline\",\"ListItemText\":\"New-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapsePipeline\"},{\"CompletionText\":\"New-AzSynapseRoleAssignment\",\"ListItemText\":\"New-AzSynapseRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSparkConfiguration\",\"ListItemText\":\"New-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSparkJobDefinition\",\"ListItemText\":\"New-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSparkJobDefinition\"},{\"CompletionText\":\"New-AzSynapseSparkPool\",\"ListItemText\":\"New-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlDatabase\",\"ListItemText\":\"New-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlPool\",\"ListItemText\":\"New-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlPoolRestorePoint\",\"ListItemText\":\"New-AzSynapseSqlPoolRestorePoint\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlPoolRestorePoint\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlScript\",\"ListItemText\":\"New-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlScript\"},{\"CompletionText\":\"New-AzSynapseTrigger\",\"ListItemText\":\"New-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseTrigger\"},{\"CompletionText\":\"New-AzSynapseWorkspace\",\"ListItemText\":\"New-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"New-AzSynapseWorkspaceKey\",\"ListItemText\":\"New-AzSynapseWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseWorkspaceKey\\r\\n\"},{\"CompletionText\":\"New-AzSynapseWorkspacePackage\",\"ListItemText\":\"New-AzSynapseWorkspacePackage\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseWorkspacePackage\\r\\n\"},{\"CompletionText\":\"New-AzTag\",\"ListItemText\":\"New-AzTag\",\"ResultType\":2,\"ToolTip\":\"New-AzTag\\r\\n\"},{\"CompletionText\":\"New-AzTemplateSpec\",\"ListItemText\":\"New-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"New-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"New-AzTenantDeployment\",\"ListItemText\":\"New-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"New-AzTrafficManagerEndpoint\",\"ListItemText\":\"New-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzTrafficManagerProfile\",\"ListItemText\":\"New-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"New-AzUserAssignedIdentity\",\"ListItemText\":\"New-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"New-AzVHubRoute\",\"ListItemText\":\"New-AzVHubRoute\",\"ResultType\":2,\"ToolTip\":\"New-AzVHubRoute\\r\\n\"},{\"CompletionText\":\"New-AzVHubRouteTable\",\"ListItemText\":\"New-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"New-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"New-AzVirtualApplianceAdditionalNicProperty\",\"ListItemText\":\"New-AzVirtualApplianceAdditionalNicProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualApplianceAdditionalNicProperty\\r\\n\"},{\"CompletionText\":\"New-AzVirtualApplianceSite\",\"ListItemText\":\"New-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"New-AzVirtualApplianceSkuProperty\",\"ListItemText\":\"New-AzVirtualApplianceSkuProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualApplianceSkuProperty\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHub\",\"ListItemText\":\"New-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubBgpConnection\",\"ListItemText\":\"New-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubRoute\",\"ListItemText\":\"New-AzVirtualHubRoute\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubRoute\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubRouteTable\",\"ListItemText\":\"New-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubVnetConnection\",\"ListItemText\":\"New-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetwork\",\"ListItemText\":\"New-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGateway\",\"ListItemText\":\"New-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"New-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayIpConfig\",\"ListItemText\":\"New-AzVirtualNetworkGatewayIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"New-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayPolicyGroup\",\"ListItemText\":\"New-AzVirtualNetworkGatewayPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayPolicyGroup\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayPolicyGroupMember\",\"ListItemText\":\"New-AzVirtualNetworkGatewayPolicyGroupMember\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayPolicyGroupMember\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"New-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkTap\",\"ListItemText\":\"New-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"New-AzVirtualRouter\",\"ListItemText\":\"New-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"New-AzVirtualRouterAutoScaleConfiguration\",\"ListItemText\":\"New-AzVirtualRouterAutoScaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualRouterAutoScaleConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVirtualWan\",\"ListItemText\":\"New-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"New-AzVM\",\"ListItemText\":\"New-AzVM\",\"ResultType\":2,\"ToolTip\":\"New-AzVM\\r\\n\"},{\"CompletionText\":\"New-AzVMConfig\",\"ListItemText\":\"New-AzVMConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMConfig\\r\\n\"},{\"CompletionText\":\"New-AzVMDataDisk\",\"ListItemText\":\"New-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"New-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"New-AzVmGalleryApplication\",\"ListItemText\":\"New-AzVmGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzVmGalleryApplication\\r\\n\"},{\"CompletionText\":\"New-AzVMSqlServerAutoBackupConfig\",\"ListItemText\":\"New-AzVMSqlServerAutoBackupConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMSqlServerAutoBackupConfig\\r\\n\"},{\"CompletionText\":\"New-AzVMSqlServerAutoPatchingConfig\",\"ListItemText\":\"New-AzVMSqlServerAutoPatchingConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMSqlServerAutoPatchingConfig\\r\\n\"},{\"CompletionText\":\"New-AzVMSqlServerKeyVaultCredentialConfig\",\"ListItemText\":\"New-AzVMSqlServerKeyVaultCredentialConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMSqlServerKeyVaultCredentialConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmss\",\"ListItemText\":\"New-AzVmss\",\"ResultType\":2,\"ToolTip\":\"New-AzVmss\\r\\n\"},{\"CompletionText\":\"New-AzVmssConfig\",\"ListItemText\":\"New-AzVmssConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmssGalleryApplication\",\"ListItemText\":\"New-AzVmssGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssGalleryApplication\\r\\n\"},{\"CompletionText\":\"New-AzVmssIpConfig\",\"ListItemText\":\"New-AzVmssIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmssIpTagConfig\",\"ListItemText\":\"New-AzVmssIpTagConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssIpTagConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmssVaultCertificateConfig\",\"ListItemText\":\"New-AzVmssVaultCertificateConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssVaultCertificateConfig\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientConfiguration\",\"ListItemText\":\"New-AzVpnClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientConnectionConfiguration\",\"ListItemText\":\"New-AzVpnClientConnectionConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientConnectionConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientIpsecParameter\",\"ListItemText\":\"New-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientIpsecPolicy\",\"ListItemText\":\"New-AzVpnClientIpsecPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientIpsecPolicy\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientRevokedCertificate\",\"ListItemText\":\"New-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientRootCertificate\",\"ListItemText\":\"New-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"New-AzVpnConnection\",\"ListItemText\":\"New-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"New-AzVpnGateway\",\"ListItemText\":\"New-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"New-AzVpnGatewayNatRule\",\"ListItemText\":\"New-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"New-AzVpnServerConfiguration\",\"ListItemText\":\"New-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"New-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"New-AzVpnSite\",\"ListItemText\":\"New-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnSite\\r\\n\"},{\"CompletionText\":\"New-AzVpnSiteLink\",\"ListItemText\":\"New-AzVpnSiteLink\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnSiteLink\\r\\n\"},{\"CompletionText\":\"New-AzVpnSiteLinkConnection\",\"ListItemText\":\"New-AzVpnSiteLinkConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnSiteLinkConnection\\r\\n\"},{\"CompletionText\":\"New-AzWcfRelay\",\"ListItemText\":\"New-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"New-AzWebApp\",\"ListItemText\":\"New-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"New-AzWebApp\\r\\n\"},{\"CompletionText\":\"New-AzWebAppAzureStoragePath\",\"ListItemText\":\"New-AzWebAppAzureStoragePath\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppAzureStoragePath\\r\\n\"},{\"CompletionText\":\"New-AzWebAppBackup\",\"ListItemText\":\"New-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"New-AzWebAppCertificate\",\"ListItemText\":\"New-AzWebAppCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppCertificate\\r\\n\"},{\"CompletionText\":\"New-AzWebAppDatabaseBackupSetting\",\"ListItemText\":\"New-AzWebAppDatabaseBackupSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppDatabaseBackupSetting\\r\\n\"},{\"CompletionText\":\"New-AzWebAppSlot\",\"ListItemText\":\"New-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"New-AzWebAppSSLBinding\",\"ListItemText\":\"New-AzWebAppSSLBinding\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppSSLBinding\\r\\n\"},{\"CompletionText\":\"New-AzWebPubSub\",\"ListItemText\":\"New-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubCustomCertificate\",\"ListItemText\":\"New-AzWebPubSubCustomCertificate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubCustomCertificate \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubCustomDomain\",\"ListItemText\":\"New-AzWebPubSubCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubEventHubEndpointObject\",\"ListItemText\":\"New-AzWebPubSubEventHubEndpointObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubEventHubEndpointObject \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubEventNameFilterObject\",\"ListItemText\":\"New-AzWebPubSubEventNameFilterObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubEventNameFilterObject \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubHub\",\"ListItemText\":\"New-AzWebPubSubHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubHub \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubKey\",\"ListItemText\":\"New-AzWebPubSubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubKey \\r\\n\"},{\"CompletionText\":\"New-AzWvdApplication\",\"ListItemText\":\"New-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"New-AzWvdApplicationGroup\",\"ListItemText\":\"New-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"New-AzWvdHostPool\",\"ListItemText\":\"New-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"New-AzWvdMsixPackage\",\"ListItemText\":\"New-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"New-AzWvdRegistrationInfo\",\"ListItemText\":\"New-AzWvdRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdRegistrationInfo \\r\\n\"},{\"CompletionText\":\"New-AzWvdScalingPlan\",\"ListItemText\":\"New-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"New-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"New-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"New-AzWvdWorkspace\",\"ListItemText\":\"New-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"New-BcdEntry\",\"ListItemText\":\"New-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"New-BcdEntry\\r\\n\"},{\"CompletionText\":\"New-BcdStore\",\"ListItemText\":\"New-BcdStore\",\"ResultType\":2,\"ToolTip\":\"New-BcdStore\\r\\n\"},{\"CompletionText\":\"New-CertificateNotificationTask\",\"ListItemText\":\"New-CertificateNotificationTask\",\"ResultType\":2,\"ToolTip\":\"New-CertificateNotificationTask\\r\\n\"},{\"CompletionText\":\"New-CimInstance\",\"ListItemText\":\"New-CimInstance\",\"ResultType\":2,\"ToolTip\":\"New-CimInstance\\r\\n\"},{\"CompletionText\":\"New-CimSession\",\"ListItemText\":\"New-CimSession\",\"ResultType\":2,\"ToolTip\":\"New-CimSession\\r\\n\"},{\"CompletionText\":\"New-CimSessionOption\",\"ListItemText\":\"New-CimSessionOption\",\"ResultType\":2,\"ToolTip\":\"New-CimSessionOption\\r\\n\"},{\"CompletionText\":\"New-CIPolicy\",\"ListItemText\":\"New-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"New-CIPolicy\\r\\n\"},{\"CompletionText\":\"New-CIPolicyRule\",\"ListItemText\":\"New-CIPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-CIPolicyRule\\r\\n\"},{\"CompletionText\":\"New-DAEntryPointTableItem\",\"ListItemText\":\"New-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"New-DscChecksum\",\"ListItemText\":\"New-DscChecksum\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-DscChecksum \\r\\n\"},{\"CompletionText\":\"New-DtcDiagnosticTransaction\",\"ListItemText\":\"New-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"New-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"New-EapConfiguration\",\"ListItemText\":\"New-EapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-EapConfiguration \\r\\n\"},{\"CompletionText\":\"New-EtwTraceSession\",\"ListItemText\":\"New-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"New-Event\",\"ListItemText\":\"New-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Event [-SourceIdentifier] [[-Sender] ] [[-EventArguments] ] [[-MessageData] ] []\\r\\n\"},{\"CompletionText\":\"New-FileCatalog\",\"ListItemText\":\"New-FileCatalog\",\"ResultType\":2,\"ToolTip\":\"New-FileCatalog\\r\\n\"},{\"CompletionText\":\"New-FileShare\",\"ListItemText\":\"New-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-FileShare \\r\\n\"},{\"CompletionText\":\"New-Fixture\",\"ListItemText\":\"New-Fixture\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Fixture \\r\\n\"},{\"CompletionText\":\"New-GitPromptSettings\",\"ListItemText\":\"New-GitPromptSettings\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-GitPromptSettings \\r\\n\"},{\"CompletionText\":\"New-Guid\",\"ListItemText\":\"New-Guid\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Guid []\\r\\n\"},{\"CompletionText\":\"New-HgsGuardian\",\"ListItemText\":\"New-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-HgsGuardian \\r\\n\"},{\"CompletionText\":\"New-HgsKeyProtector\",\"ListItemText\":\"New-HgsKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-HgsKeyProtector \\r\\n\"},{\"CompletionText\":\"New-HgsTraceTarget\",\"ListItemText\":\"New-HgsTraceTarget\",\"ResultType\":2,\"ToolTip\":\"New-HgsTraceTarget\\r\\n\"},{\"CompletionText\":\"New-IscsiTargetPortal\",\"ListItemText\":\"New-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"New-IseSnippet\",\"ListItemText\":\"New-IseSnippet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-IseSnippet \\r\\n\"},{\"CompletionText\":\"New-Item\",\"ListItemText\":\"New-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Item [-Path] [-ItemType ] [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nNew-Item [[-Path] ] -Name [-ItemType ] [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-ItemProperty\",\"ListItemText\":\"New-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ItemProperty [-Path] [-Name] [-PropertyType ] [-Value ] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nNew-ItemProperty [-Name] -LiteralPath [-PropertyType ] [-Value ] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-JobTrigger\",\"ListItemText\":\"New-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"New-JobTrigger\\r\\n\"},{\"CompletionText\":\"New-LocalGroup\",\"ListItemText\":\"New-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"New-LocalGroup\\r\\n\"},{\"CompletionText\":\"New-LocalUser\",\"ListItemText\":\"New-LocalUser\",\"ResultType\":2,\"ToolTip\":\"New-LocalUser\\r\\n\"},{\"CompletionText\":\"New-MaskingSet\",\"ListItemText\":\"New-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-MaskingSet \\r\\n\"},{\"CompletionText\":\"New-Module\",\"ListItemText\":\"New-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Module [-ScriptBlock] [-Function ] [-Cmdlet ] [-ReturnResult] [-AsCustomObject] [-ArgumentList ] []\\r\\n\\r\\nNew-Module [-Name] [-ScriptBlock] [-Function ] [-Cmdlet ] [-ReturnResult] [-AsCustomObject] [-ArgumentList ] []\\r\\n\"},{\"CompletionText\":\"New-ModuleManifest\",\"ListItemText\":\"New-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ModuleManifest [-Path] [-NestedModules ] [-Guid ] [-Author ] [-CompanyName ] [-Copyright ] [-RootModule ] [-ModuleVersion ] [-Description ] [-ProcessorArchitecture ] [-PowerShellVersion ] [-ClrVersion ] [-DotNetFrameworkVersion ] [-PowerShellHostName ] [-PowerShellHostVersion ] [-RequiredModules ] [-TypesToProcess ] [-FormatsToProcess ] [-ScriptsToProcess ] [-RequiredAssemblies ] [-FileList ] [-ModuleList ] [-FunctionsToExport ] [-AliasesToExport ] [-VariablesToExport ] [-CmdletsToExport ] [-DscResourcesToExport ] [-CompatiblePSEditions ] [-PrivateData ] [-Tags ] [-ProjectUri ] [-LicenseUri ] [-IconUri ] [-ReleaseNotes ] [-Prerelease ] [-RequireLicenseAcceptance] [-ExternalModuleDependencies ] [-HelpInfoUri ] [-PassThru] [-DefaultCommandPrefix ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-MpPerformanceRecording\",\"ListItemText\":\"New-MpPerformanceRecording\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-MpPerformanceRecording \\r\\n\"},{\"CompletionText\":\"New-NetAdapterAdvancedProperty\",\"ListItemText\":\"New-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"New-NetEventSession\",\"ListItemText\":\"New-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetEventSession \\r\\n\"},{\"CompletionText\":\"New-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"New-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"New-NetFirewallHyperVProfile\",\"ListItemText\":\"New-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"New-NetFirewallHyperVRule\",\"ListItemText\":\"New-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"New-NetFirewallHyperVVMSetting\",\"ListItemText\":\"New-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"New-NetFirewallRule\",\"ListItemText\":\"New-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"New-NetIPAddress\",\"ListItemText\":\"New-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPAddress \\r\\n\"},{\"CompletionText\":\"New-NetIPHttpsConfiguration\",\"ListItemText\":\"New-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"New-NetIPsecAuthProposal\",\"ListItemText\":\"New-NetIPsecAuthProposal\",\"ResultType\":2,\"ToolTip\":\"New-NetIPsecAuthProposal\\r\\n\"},{\"CompletionText\":\"New-NetIPsecDospSetting\",\"ListItemText\":\"New-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"New-NetIPsecMainModeCryptoProposal\",\"ListItemText\":\"New-NetIPsecMainModeCryptoProposal\",\"ResultType\":2,\"ToolTip\":\"New-NetIPsecMainModeCryptoProposal\\r\\n\"},{\"CompletionText\":\"New-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"New-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecMainModeRule\",\"ListItemText\":\"New-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"New-NetIPsecPhase1AuthSet\",\"ListItemText\":\"New-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecPhase2AuthSet\",\"ListItemText\":\"New-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecQuickModeCryptoProposal\",\"ListItemText\":\"New-NetIPsecQuickModeCryptoProposal\",\"ResultType\":2,\"ToolTip\":\"New-NetIPsecQuickModeCryptoProposal\\r\\n\"},{\"CompletionText\":\"New-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"New-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecRule\",\"ListItemText\":\"New-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"New-NetLbfoTeam\",\"ListItemText\":\"New-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"New-NetNat\",\"ListItemText\":\"New-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetNat \\r\\n\"},{\"CompletionText\":\"New-NetNatTransitionConfiguration\",\"ListItemText\":\"New-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"New-NetNeighbor\",\"ListItemText\":\"New-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetNeighbor \\r\\n\"},{\"CompletionText\":\"New-NetQosPolicy\",\"ListItemText\":\"New-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"New-NetRoute\",\"ListItemText\":\"New-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetRoute \\r\\n\"},{\"CompletionText\":\"New-NetSwitchTeam\",\"ListItemText\":\"New-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"New-NetTransportFilter\",\"ListItemText\":\"New-NetTransportFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetTransportFilter \\r\\n\"},{\"CompletionText\":\"New-NetworkSwitchVlan\",\"ListItemText\":\"New-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"New-Object\",\"ListItemText\":\"New-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Object [-TypeName] [[-ArgumentList] ] [-Property ] []\\r\\n\\r\\nNew-Object [-ComObject] [-Strict] [-Property ] []\\r\\n\"},{\"CompletionText\":\"New-Partition\",\"ListItemText\":\"New-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Partition \\r\\n\"},{\"CompletionText\":\"New-PesterOption\",\"ListItemText\":\"New-PesterOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PesterOption \\r\\n\"},{\"CompletionText\":\"New-PmemDedicatedMemory\",\"ListItemText\":\"New-PmemDedicatedMemory\",\"ResultType\":2,\"ToolTip\":\"New-PmemDedicatedMemory\\r\\n\"},{\"CompletionText\":\"New-PmemDisk\",\"ListItemText\":\"New-PmemDisk\",\"ResultType\":2,\"ToolTip\":\"New-PmemDisk\\r\\n\"},{\"CompletionText\":\"New-ProvisioningRepro\",\"ListItemText\":\"New-ProvisioningRepro\",\"ResultType\":2,\"ToolTip\":\"New-ProvisioningRepro\\r\\n\"},{\"CompletionText\":\"New-PSDrive\",\"ListItemText\":\"New-PSDrive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSDrive [-Name] [-PSProvider] [-Root] [-Description ] [-Scope ] [-Persist] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-PSRoleCapabilityFile\",\"ListItemText\":\"New-PSRoleCapabilityFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSRoleCapabilityFile [-Path] [-Guid ] [-Author ] [-Description ] [-CompanyName ] [-Copyright ] [-ModulesToImport ] [-VisibleAliases ] [-VisibleCmdlets ] [-VisibleFunctions ] [-VisibleExternalCommands ] [-VisibleProviders ] [-ScriptsToProcess ] [-AliasDefinitions ] [-FunctionDefinitions ] [-VariableDefinitions ] [-EnvironmentVariables ] [-TypesToProcess ] [-FormatsToProcess ] [-AssembliesToLoad ] []\\r\\n\"},{\"CompletionText\":\"New-PSScriptFileInfo\",\"ListItemText\":\"New-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"New-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"New-PSSession\",\"ListItemText\":\"New-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSSession [[-ComputerName] ] [-Credential ] [-Name ] [-EnableNetworkAccess] [-ConfigurationName ] [-Port ] [-UseSSL] [-ApplicationName ] [-ThrottleLimit ] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nNew-PSSession [-ConnectionUri] [-Credential ] [-Name ] [-EnableNetworkAccess] [-ConfigurationName ] [-ThrottleLimit ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nNew-PSSession [-VMId] -Credential [-Name ] [-ConfigurationName ] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession -Credential -VMName [-Name ] [-ConfigurationName ] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession [[-Session] ] [-Name ] [-EnableNetworkAccess] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession -ContainerId [-Name ] [-ConfigurationName ] [-RunAsAdministrator] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession -UseWindowsPowerShell [-Name ] []\\r\\n\\r\\nNew-PSSession [-HostName] [-Name ] [-Port ] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] [-Options ] []\\r\\n\\r\\nNew-PSSession -SSHConnection [-Name ] []\\r\\n\"},{\"CompletionText\":\"New-PSSessionConfigurationFile\",\"ListItemText\":\"New-PSSessionConfigurationFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSSessionConfigurationFile [-Path] [-SchemaVersion ] [-Guid ] [-Author ] [-Description ] [-CompanyName ] [-Copyright ] [-SessionType ] [-TranscriptDirectory ] [-RunAsVirtualAccount] [-RunAsVirtualAccountGroups ] [-MountUserDrive] [-UserDriveMaximumSize ] [-GroupManagedServiceAccount ] [-ScriptsToProcess ] [-RoleDefinitions ] [-RequiredGroups ] [-LanguageMode ] [-ExecutionPolicy ] [-PowerShellVersion ] [-ModulesToImport ] [-VisibleAliases ] [-VisibleCmdlets ] [-VisibleFunctions ] [-VisibleExternalCommands ] [-VisibleProviders ] [-AliasDefinitions ] [-FunctionDefinitions ] [-VariableDefinitions ] [-EnvironmentVariables ] [-TypesToProcess ] [-FormatsToProcess ] [-AssembliesToLoad ] [-Full] []\\r\\n\"},{\"CompletionText\":\"New-PSSessionOption\",\"ListItemText\":\"New-PSSessionOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSSessionOption [-MaximumRedirection ] [-NoCompression] [-NoMachineProfile] [-Culture ] [-UICulture ] [-MaximumReceivedDataSizePerCommand ] [-MaximumReceivedObjectSize ] [-OutputBufferingMode ] [-MaxConnectionRetryCount ] [-ApplicationArguments ] [-OpenTimeout ] [-CancelTimeout ] [-IdleTimeout ] [-ProxyAccessType ] [-ProxyAuthentication ] [-ProxyCredential ] [-SkipCACheck] [-SkipCNCheck] [-SkipRevocationCheck] [-OperationTimeout ] [-NoEncryption] [-UseUTF16] [-IncludePortInSPN] []\\r\\n\"},{\"CompletionText\":\"New-PSTransportOption\",\"ListItemText\":\"New-PSTransportOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSTransportOption [-MaxIdleTimeoutSec ] [-ProcessIdleTimeoutSec ] [-MaxSessions ] [-MaxConcurrentCommandsPerSession ] [-MaxSessionsPerUser ] [-MaxMemoryPerSessionMB ] [-MaxProcessesPerSession ] [-MaxConcurrentUsers ] [-IdleTimeoutSec ] [-OutputBufferingMode ] []\\r\\n\"},{\"CompletionText\":\"New-PSWorkflowExecutionOption\",\"ListItemText\":\"New-PSWorkflowExecutionOption\",\"ResultType\":2,\"ToolTip\":\"New-PSWorkflowExecutionOption\\r\\n\"},{\"CompletionText\":\"New-PSWorkflowSession\",\"ListItemText\":\"New-PSWorkflowSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSWorkflowSession \\r\\n\"},{\"CompletionText\":\"New-ScheduledJobOption\",\"ListItemText\":\"New-ScheduledJobOption\",\"ResultType\":2,\"ToolTip\":\"New-ScheduledJobOption\\r\\n\"},{\"CompletionText\":\"New-ScheduledTask\",\"ListItemText\":\"New-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTask \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskAction\",\"ListItemText\":\"New-ScheduledTaskAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskAction \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskPrincipal\",\"ListItemText\":\"New-ScheduledTaskPrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskPrincipal \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskSettingsSet\",\"ListItemText\":\"New-ScheduledTaskSettingsSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskSettingsSet \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskTrigger\",\"ListItemText\":\"New-ScheduledTaskTrigger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskTrigger \\r\\n\"},{\"CompletionText\":\"New-ScriptFileInfo\",\"ListItemText\":\"New-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"New-SelfSignedCertificate\",\"ListItemText\":\"New-SelfSignedCertificate\",\"ResultType\":2,\"ToolTip\":\"New-SelfSignedCertificate\\r\\n\"},{\"CompletionText\":\"New-Service\",\"ListItemText\":\"New-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Service [-Name] [-BinaryPathName] [-DisplayName ] [-Description ] [-StartupType ] [-Credential ] [-SecurityDescriptorSddl ] [-DependsOn ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-SmbClientCertificateMapping\",\"ListItemText\":\"New-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"New-SmbGlobalMapping\",\"ListItemText\":\"New-SmbGlobalMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbGlobalMapping \\r\\n\"},{\"CompletionText\":\"New-SmbMapping\",\"ListItemText\":\"New-SmbMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbMapping \\r\\n\"},{\"CompletionText\":\"New-SmbMultichannelConstraint\",\"ListItemText\":\"New-SmbMultichannelConstraint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbMultichannelConstraint \\r\\n\"},{\"CompletionText\":\"New-SmbServerCertificateMapping\",\"ListItemText\":\"New-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"New-SmbShare\",\"ListItemText\":\"New-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbShare \\r\\n\"},{\"CompletionText\":\"New-StorageBusBinding\",\"ListItemText\":\"New-StorageBusBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageBusBinding \\r\\n\"},{\"CompletionText\":\"New-StorageBusCacheStore\",\"ListItemText\":\"New-StorageBusCacheStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageBusCacheStore \\r\\n\"},{\"CompletionText\":\"New-StorageFileServer\",\"ListItemText\":\"New-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageFileServer \\r\\n\"},{\"CompletionText\":\"New-StoragePool\",\"ListItemText\":\"New-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StoragePool \\r\\n\"},{\"CompletionText\":\"New-StorageSubsystemVirtualDisk\",\"ListItemText\":\"New-StorageSubsystemVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageSubsystemVirtualDisk \\r\\n\"},{\"CompletionText\":\"New-StorageTier\",\"ListItemText\":\"New-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageTier \\r\\n\"},{\"CompletionText\":\"New-TemporaryFile\",\"ListItemText\":\"New-TemporaryFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-TemporaryFile [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-TimeSpan\",\"ListItemText\":\"New-TimeSpan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-TimeSpan [[-Start] ] [[-End] ] []\\r\\n\\r\\nNew-TimeSpan [-Days ] [-Hours ] [-Minutes ] [-Seconds ] [-Milliseconds ] []\\r\\n\"},{\"CompletionText\":\"New-TlsSessionTicketKey\",\"ListItemText\":\"New-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"New-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"New-Variable\",\"ListItemText\":\"New-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Variable [-Name] [[-Value] ] [-Description ] [-Option ] [-Visibility ] [-Force] [-PassThru] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-VFD\",\"ListItemText\":\"New-VFD\",\"ResultType\":2,\"ToolTip\":\"New-VFD\\r\\n\"},{\"CompletionText\":\"New-VHD\",\"ListItemText\":\"New-VHD\",\"ResultType\":2,\"ToolTip\":\"New-VHD\\r\\n\"},{\"CompletionText\":\"New-VirtualDisk\",\"ListItemText\":\"New-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VirtualDisk \\r\\n\"},{\"CompletionText\":\"New-VirtualDiskClone\",\"ListItemText\":\"New-VirtualDiskClone\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VirtualDiskClone \\r\\n\"},{\"CompletionText\":\"New-VirtualDiskSnapshot\",\"ListItemText\":\"New-VirtualDiskSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VirtualDiskSnapshot \\r\\n\"},{\"CompletionText\":\"New-VM\",\"ListItemText\":\"New-VM\",\"ResultType\":2,\"ToolTip\":\"New-VM\\r\\n\"},{\"CompletionText\":\"New-VMGroup\",\"ListItemText\":\"New-VMGroup\",\"ResultType\":2,\"ToolTip\":\"New-VMGroup\\r\\n\"},{\"CompletionText\":\"New-VMReplicationAuthorizationEntry\",\"ListItemText\":\"New-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"New-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"New-VMResourcePool\",\"ListItemText\":\"New-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"New-VMResourcePool\\r\\n\"},{\"CompletionText\":\"New-VMSan\",\"ListItemText\":\"New-VMSan\",\"ResultType\":2,\"ToolTip\":\"New-VMSan\\r\\n\"},{\"CompletionText\":\"New-VMSwitch\",\"ListItemText\":\"New-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"New-VMSwitch\\r\\n\"},{\"CompletionText\":\"New-Volume\",\"ListItemText\":\"New-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Volume \\r\\n\"},{\"CompletionText\":\"New-VpnServerAddress\",\"ListItemText\":\"New-VpnServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VpnServerAddress \\r\\n\"},{\"CompletionText\":\"New-WindowsCustomImage\",\"ListItemText\":\"New-WindowsCustomImage\",\"ResultType\":2,\"ToolTip\":\"New-WindowsCustomImage\\r\\n\"},{\"CompletionText\":\"New-WindowsImage\",\"ListItemText\":\"New-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"New-WindowsImage\\r\\n\"},{\"CompletionText\":\"New-WinEvent\",\"ListItemText\":\"New-WinEvent\",\"ResultType\":2,\"ToolTip\":\"New-WinEvent\\r\\n\"},{\"CompletionText\":\"New-WinUserLanguageList\",\"ListItemText\":\"New-WinUserLanguageList\",\"ResultType\":2,\"ToolTip\":\"New-WinUserLanguageList\\r\\n\"},{\"CompletionText\":\"New-WSManInstance\",\"ListItemText\":\"New-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"New-WSManInstance\\r\\n\"},{\"CompletionText\":\"New-WSManSessionOption\",\"ListItemText\":\"New-WSManSessionOption\",\"ResultType\":2,\"ToolTip\":\"New-WSManSessionOption\\r\\n\"},{\"CompletionText\":\"newdev.exe\",\"ListItemText\":\"newdev.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\newdev.exe\"},{\"CompletionText\":\"nf.cmd\",\"ListItemText\":\"nf.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\nf.cmd\"},{\"CompletionText\":\"nf.ps1\",\"ListItemText\":\"nf.ps1\",\"ResultType\":2,\"ToolTip\":\"nf.ps1 \\r\\n\"},{\"CompletionText\":\"NgcIso.exe\",\"ListItemText\":\"NgcIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NgcIso.exe\"},{\"CompletionText\":\"ni\",\"ListItemText\":\"ni\",\"ResultType\":2,\"ToolTip\":\"New-Item\"},{\"CompletionText\":\"nlg\",\"ListItemText\":\"nlg\",\"ResultType\":2,\"ToolTip\":\"nlg\"},{\"CompletionText\":\"nltest.exe\",\"ListItemText\":\"nltest.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nltest.exe\"},{\"CompletionText\":\"nlu\",\"ListItemText\":\"nlu\",\"ResultType\":2,\"ToolTip\":\"nlu\"},{\"CompletionText\":\"nmbind.exe\",\"ListItemText\":\"nmbind.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nmbind.exe\"},{\"CompletionText\":\"nmo\",\"ListItemText\":\"nmo\",\"ResultType\":2,\"ToolTip\":\"New-Module\"},{\"CompletionText\":\"nmscrub.exe\",\"ListItemText\":\"nmscrub.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nmscrub.exe\"},{\"CompletionText\":\"node.exe\",\"ListItemText\":\"node.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\node.exe\"},{\"CompletionText\":\"nodevars.bat\",\"ListItemText\":\"nodevars.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\nodevars.bat\"},{\"CompletionText\":\"normalizer.exe\",\"ListItemText\":\"normalizer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\normalizer.exe\"},{\"CompletionText\":\"notepad.exe\",\"ListItemText\":\"notepad.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\notepad.exe\"},{\"CompletionText\":\"npm.cmd\",\"ListItemText\":\"npm.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\npm.cmd\"},{\"CompletionText\":\"npx.cmd\",\"ListItemText\":\"npx.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\npx.cmd\"},{\"CompletionText\":\"nslookup.exe\",\"ListItemText\":\"nslookup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nslookup.exe\"},{\"CompletionText\":\"nsmbccm\",\"ListItemText\":\"nsmbccm\",\"ResultType\":2,\"ToolTip\":\"nsmbccm\"},{\"CompletionText\":\"nsmbgm\",\"ListItemText\":\"nsmbgm\",\"ResultType\":2,\"ToolTip\":\"nsmbgm\"},{\"CompletionText\":\"nsmbm\",\"ListItemText\":\"nsmbm\",\"ResultType\":2,\"ToolTip\":\"nsmbm\"},{\"CompletionText\":\"nsmbs\",\"ListItemText\":\"nsmbs\",\"ResultType\":2,\"ToolTip\":\"nsmbs\"},{\"CompletionText\":\"nsmbscm\",\"ListItemText\":\"nsmbscm\",\"ResultType\":2,\"ToolTip\":\"nsmbscm\"},{\"CompletionText\":\"nsmbt\",\"ListItemText\":\"nsmbt\",\"ResultType\":2,\"ToolTip\":\"nsmbt\"},{\"CompletionText\":\"nsn\",\"ListItemText\":\"nsn\",\"ResultType\":2,\"ToolTip\":\"New-PSSession\"},{\"CompletionText\":\"ntoskrnl.exe\",\"ListItemText\":\"ntoskrnl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ntoskrnl.exe\"},{\"CompletionText\":\"ntprint.exe\",\"ListItemText\":\"ntprint.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ntprint.exe\"},{\"CompletionText\":\"nu.exe\",\"ListItemText\":\"nu.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu.exe\"},{\"CompletionText\":\"nu_plugin_gstat.exe\",\"ListItemText\":\"nu_plugin_gstat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu_plugin_gstat.exe\"},{\"CompletionText\":\"nu_plugin_inc.exe\",\"ListItemText\":\"nu_plugin_inc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu_plugin_inc.exe\"},{\"CompletionText\":\"nu_plugin_query.exe\",\"ListItemText\":\"nu_plugin_query.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu_plugin_query.exe\"},{\"CompletionText\":\"nv\",\"ListItemText\":\"nv\",\"ResultType\":2,\"ToolTip\":\"New-Variable\"},{\"CompletionText\":\"NvContainerRecovery.bat\",\"ListItemText\":\"NvContainerRecovery.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\NvContainerRecovery.bat\"},{\"CompletionText\":\"nvdebugdump.exe\",\"ListItemText\":\"nvdebugdump.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nvdebugdump.exe\"},{\"CompletionText\":\"nvdlisrwrapper.exe\",\"ListItemText\":\"nvdlisrwrapper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\NVIDIA Corporation\\\\NVIDIA NvDLISR\\\\nvdlisrwrapper.exe\"},{\"CompletionText\":\"nvidia-smi.exe\",\"ListItemText\":\"nvidia-smi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nvidia-smi.exe\"},{\"CompletionText\":\"nvs.cmd\",\"ListItemText\":\"nvs.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\nvs\\\\nvs.cmd\"},{\"CompletionText\":\"nvs.ps1\",\"ListItemText\":\"nvs.ps1\",\"ResultType\":2,\"ToolTip\":\"nvs.ps1 \\r\\n\"},{\"CompletionText\":\"nvspinfo.exe\",\"ListItemText\":\"nvspinfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nvspinfo.exe\"},{\"CompletionText\":\"nwsn\",\"ListItemText\":\"nwsn\",\"ResultType\":2,\"ToolTip\":\"nwsn\"},{\"CompletionText\":\"O:\",\"ListItemText\":\"O:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nO: \\r\\n\"},{\"CompletionText\":\"odbcad32.exe\",\"ListItemText\":\"odbcad32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\odbcad32.exe\"},{\"CompletionText\":\"odbcconf.exe\",\"ListItemText\":\"odbcconf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\odbcconf.exe\"},{\"CompletionText\":\"ofdeploy.exe\",\"ListItemText\":\"ofdeploy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ofdeploy.exe\"},{\"CompletionText\":\"ogv\",\"ListItemText\":\"ogv\",\"ResultType\":2,\"ToolTip\":\"Out-GridView\"},{\"CompletionText\":\"oh\",\"ListItemText\":\"oh\",\"ResultType\":2,\"ToolTip\":\"Out-Host\"},{\"CompletionText\":\"oh-my-posh.exe\",\"ListItemText\":\"oh-my-posh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\oh-my-posh\\\\bin\\\\oh-my-posh.exe\"},{\"CompletionText\":\"olk.exe\",\"ListItemText\":\"olk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\olk.exe\"},{\"CompletionText\":\"omadmclient.exe\",\"ListItemText\":\"omadmclient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\omadmclient.exe\"},{\"CompletionText\":\"omadmprc.exe\",\"ListItemText\":\"omadmprc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\omadmprc.exe\"},{\"CompletionText\":\"OneDriveSetup.exe\",\"ListItemText\":\"OneDriveSetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OneDriveSetup.exe\"},{\"CompletionText\":\"OOBE-Maintenance.exe\",\"ListItemText\":\"OOBE-Maintenance.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OOBE-Maintenance.exe\"},{\"CompletionText\":\"Open-AzSurveyLink\",\"ListItemText\":\"Open-AzSurveyLink\",\"ResultType\":2,\"ToolTip\":\"Open-AzSurveyLink\\r\\n\"},{\"CompletionText\":\"Open-NetGPO\",\"ListItemText\":\"Open-NetGPO\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOpen-NetGPO \\r\\n\"},{\"CompletionText\":\"openfiles.exe\",\"ListItemText\":\"openfiles.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\openfiles.exe\"},{\"CompletionText\":\"OpenWith.exe\",\"ListItemText\":\"OpenWith.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OpenWith.exe\"},{\"CompletionText\":\"Optimize-AppProvisionedPackages\",\"ListItemText\":\"Optimize-AppProvisionedPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-AppProvisionedPackages\"},{\"CompletionText\":\"Optimize-AppxProvisionedPackages\",\"ListItemText\":\"Optimize-AppxProvisionedPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-AppxProvisionedPackages\\r\\n\"},{\"CompletionText\":\"Optimize-ProvisionedAppPackages\",\"ListItemText\":\"Optimize-ProvisionedAppPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-ProvisionedAppPackages\"},{\"CompletionText\":\"Optimize-ProvisionedAppxPackages\",\"ListItemText\":\"Optimize-ProvisionedAppxPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-ProvisionedAppxPackages\"},{\"CompletionText\":\"Optimize-StoragePool\",\"ListItemText\":\"Optimize-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOptimize-StoragePool \\r\\n\"},{\"CompletionText\":\"Optimize-VHD\",\"ListItemText\":\"Optimize-VHD\",\"ResultType\":2,\"ToolTip\":\"Optimize-VHD\\r\\n\"},{\"CompletionText\":\"Optimize-VHDSet\",\"ListItemText\":\"Optimize-VHDSet\",\"ResultType\":2,\"ToolTip\":\"Optimize-VHDSet\\r\\n\"},{\"CompletionText\":\"Optimize-Volume\",\"ListItemText\":\"Optimize-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOptimize-Volume \\r\\n\"},{\"CompletionText\":\"Optimize-WindowsImage\",\"ListItemText\":\"Optimize-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Optimize-WindowsImage\\r\\n\"},{\"CompletionText\":\"OptionalFeatures.exe\",\"ListItemText\":\"OptionalFeatures.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OptionalFeatures.exe\"},{\"CompletionText\":\"orbd.exe\",\"ListItemText\":\"orbd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\orbd.exe\"},{\"CompletionText\":\"osk.exe\",\"ListItemText\":\"osk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\osk.exe\"},{\"CompletionText\":\"oss\",\"ListItemText\":\"oss\",\"ResultType\":2,\"ToolTip\":\"\\r\\noss [[-Width] ] [[-InputObject] ] []\\r\\n\"},{\"CompletionText\":\"Out-Default\",\"ListItemText\":\"Out-Default\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Default [-Transcript] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-File\",\"ListItemText\":\"Out-File\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-File [-FilePath] [[-Encoding] ] [-Append] [-Force] [-NoClobber] [-Width ] [-NoNewline] [-InputObject ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nOut-File [[-Encoding] ] -LiteralPath [-Append] [-Force] [-NoClobber] [-Width ] [-NoNewline] [-InputObject ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Out-GridView\",\"ListItemText\":\"Out-GridView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-GridView [-InputObject ] [-Title ] [-PassThru] []\\r\\n\\r\\nOut-GridView [-InputObject ] [-Title ] [-Wait] []\\r\\n\\r\\nOut-GridView [-InputObject ] [-Title ] [-OutputMode ] []\\r\\n\"},{\"CompletionText\":\"Out-Host\",\"ListItemText\":\"Out-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Host [-Paging] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-Null\",\"ListItemText\":\"Out-Null\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Null [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-Printer\",\"ListItemText\":\"Out-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Printer [[-Name] ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-String\",\"ListItemText\":\"Out-String\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-String [-Width ] [-NoNewline] [-InputObject ] []\\r\\n\\r\\nOut-String [-Stream] [-Width ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"P:\",\"ListItemText\":\"P:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nP: \\r\\n\"},{\"CompletionText\":\"pacjsworker.exe\",\"ListItemText\":\"pacjsworker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pacjsworker.exe\"},{\"CompletionText\":\"pack200.exe\",\"ListItemText\":\"pack200.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\pack200.exe\"},{\"CompletionText\":\"PackagedCWALauncher.exe\",\"ListItemText\":\"PackagedCWALauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PackagedCWALauncher.exe\"},{\"CompletionText\":\"PackageInspector.exe\",\"ListItemText\":\"PackageInspector.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PackageInspector.exe\"},{\"CompletionText\":\"PasswordOnWakeSettingFlyout.exe\",\"ListItemText\":\"PasswordOnWakeSettingFlyout.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PasswordOnWakeSettingFlyout.exe\"},{\"CompletionText\":\"PATHPING.EXE\",\"ListItemText\":\"PATHPING.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PATHPING.EXE\"},{\"CompletionText\":\"Pause\",\"ListItemText\":\"Pause\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPause \\r\\n\"},{\"CompletionText\":\"pbcfg\",\"ListItemText\":\"pbcfg\",\"ResultType\":2,\"ToolTip\":\"pbcfg\"},{\"CompletionText\":\"pbres\",\"ListItemText\":\"pbres\",\"ResultType\":2,\"ToolTip\":\"pbres\"},{\"CompletionText\":\"pbrush.exe\",\"ListItemText\":\"pbrush.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pbrush.exe\"},{\"CompletionText\":\"pcalua.exe\",\"ListItemText\":\"pcalua.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pcalua.exe\"},{\"CompletionText\":\"pcaui.exe\",\"ListItemText\":\"pcaui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pcaui.exe\"},{\"CompletionText\":\"pcwrun.exe\",\"ListItemText\":\"pcwrun.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pcwrun.exe\"},{\"CompletionText\":\"perfmon.exe\",\"ListItemText\":\"perfmon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\perfmon.exe\"},{\"CompletionText\":\"perfmon.msc\",\"ListItemText\":\"perfmon.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\perfmon.msc\"},{\"CompletionText\":\"pfn\",\"ListItemText\":\"pfn\",\"ResultType\":2,\"ToolTip\":\"pfn\"},{\"CompletionText\":\"phoneactivate.exe\",\"ListItemText\":\"phoneactivate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\phoneactivate.exe\"},{\"CompletionText\":\"PickerHost.exe\",\"ListItemText\":\"PickerHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PickerHost.exe\"},{\"CompletionText\":\"PinEnrollmentBroker.exe\",\"ListItemText\":\"PinEnrollmentBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PinEnrollmentBroker.exe\"},{\"CompletionText\":\"pinentry-basic.exe\",\"ListItemText\":\"pinentry-basic.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\pinentry-basic.exe\"},{\"CompletionText\":\"PING.EXE\",\"ListItemText\":\"PING.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PING.EXE\"},{\"CompletionText\":\"pip.exe\",\"ListItemText\":\"pip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\Scripts\\\\pip.exe\"},{\"CompletionText\":\"pip3.10.exe\",\"ListItemText\":\"pip3.10.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip3.10.exe\"},{\"CompletionText\":\"pip3.12.exe\",\"ListItemText\":\"pip3.12.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\Scripts\\\\pip3.12.exe\"},{\"CompletionText\":\"pip3.9.exe\",\"ListItemText\":\"pip3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip3.9.exe\"},{\"CompletionText\":\"pip3.exe\",\"ListItemText\":\"pip3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\Scripts\\\\pip3.exe\"},{\"CompletionText\":\"PkgMgr.exe\",\"ListItemText\":\"PkgMgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PkgMgr.exe\"},{\"CompletionText\":\"PktMon.exe\",\"ListItemText\":\"PktMon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PktMon.exe\"},{\"CompletionText\":\"plasrv.exe\",\"ListItemText\":\"plasrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\plasrv.exe\"},{\"CompletionText\":\"PnPUnattend.exe\",\"ListItemText\":\"PnPUnattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PnPUnattend.exe\"},{\"CompletionText\":\"pnputil.exe\",\"ListItemText\":\"pnputil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pnputil.exe\"},{\"CompletionText\":\"poetry.exe\",\"ListItemText\":\"poetry.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\Python\\\\Scripts\\\\poetry.exe\"},{\"CompletionText\":\"policytool.exe\",\"ListItemText\":\"policytool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\policytool.exe\"},{\"CompletionText\":\"Pop-Location\",\"ListItemText\":\"Pop-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPop-Location [-PassThru] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"popd\",\"ListItemText\":\"popd\",\"ResultType\":2,\"ToolTip\":\"Pop-Location\"},{\"CompletionText\":\"poqexec.exe\",\"ListItemText\":\"poqexec.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\poqexec.exe\"},{\"CompletionText\":\"pospaymentsworker.exe\",\"ListItemText\":\"pospaymentsworker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pospaymentsworker.exe\"},{\"CompletionText\":\"powercfg.cpl\",\"ListItemText\":\"powercfg.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\powercfg.cpl\"},{\"CompletionText\":\"powercfg.exe\",\"ListItemText\":\"powercfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\powercfg.exe\"},{\"CompletionText\":\"powershell.exe\",\"ListItemText\":\"powershell.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\"},{\"CompletionText\":\"powershell_ise.exe\",\"ListItemText\":\"powershell_ise.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell_ise.exe\"},{\"CompletionText\":\"PresentationHost.exe\",\"ListItemText\":\"PresentationHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PresentationHost.exe\"},{\"CompletionText\":\"PresentationSettings.exe\",\"ListItemText\":\"PresentationSettings.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PresentationSettings.exe\"},{\"CompletionText\":\"prevhost.exe\",\"ListItemText\":\"prevhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\prevhost.exe\"},{\"CompletionText\":\"print.exe\",\"ListItemText\":\"print.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\print.exe\"},{\"CompletionText\":\"PrintBrmUi.exe\",\"ListItemText\":\"PrintBrmUi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PrintBrmUi.exe\"},{\"CompletionText\":\"printfilterpipelinesvc.exe\",\"ListItemText\":\"printfilterpipelinesvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\printfilterpipelinesvc.exe\"},{\"CompletionText\":\"PrintIsolationHost.exe\",\"ListItemText\":\"PrintIsolationHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PrintIsolationHost.exe\"},{\"CompletionText\":\"printmanagement.msc\",\"ListItemText\":\"printmanagement.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\printmanagement.msc\"},{\"CompletionText\":\"printui.exe\",\"ListItemText\":\"printui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\printui.exe\"},{\"CompletionText\":\"prompt\",\"ListItemText\":\"prompt\",\"ResultType\":2,\"ToolTip\":\"\\r\\nprompt \\r\\n\"},{\"CompletionText\":\"proquota.exe\",\"ListItemText\":\"proquota.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\proquota.exe\"},{\"CompletionText\":\"Protect-CmsMessage\",\"ListItemText\":\"Protect-CmsMessage\",\"ResultType\":2,\"ToolTip\":\"Protect-CmsMessage\\r\\n\"},{\"CompletionText\":\"provlaunch.exe\",\"ListItemText\":\"provlaunch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\provlaunch.exe\"},{\"CompletionText\":\"provtool.exe\",\"ListItemText\":\"provtool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\provtool.exe\"},{\"CompletionText\":\"ProximityUxHost.exe\",\"ListItemText\":\"ProximityUxHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ProximityUxHost.exe\"},{\"CompletionText\":\"prproc.exe\",\"ListItemText\":\"prproc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\prproc.exe\"},{\"CompletionText\":\"ps\",\"ListItemText\":\"ps\",\"ResultType\":2,\"ToolTip\":\"Get-Process\"},{\"CompletionText\":\"PSConsoleHostReadLine\",\"ListItemText\":\"PSConsoleHostReadLine\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPSConsoleHostReadLine \\r\\n\"},{\"CompletionText\":\"psr.exe\",\"ListItemText\":\"psr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\psr.exe\"},{\"CompletionText\":\"Publish-AzApiManagementTenantGitConfiguration\",\"ListItemText\":\"Publish-AzApiManagementTenantGitConfiguration\",\"ResultType\":2,\"ToolTip\":\"Publish-AzApiManagementTenantGitConfiguration\\r\\n\"},{\"CompletionText\":\"Publish-AzAutomationRunbook\",\"ListItemText\":\"Publish-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Publish-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Publish-AzBicepModule\",\"ListItemText\":\"Publish-AzBicepModule\",\"ResultType\":2,\"ToolTip\":\"Publish-AzBicepModule\\r\\n\"},{\"CompletionText\":\"Publish-AzVMDscConfiguration\",\"ListItemText\":\"Publish-AzVMDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Publish-AzVMDscConfiguration\\r\\n\"},{\"CompletionText\":\"Publish-AzWebApp\",\"ListItemText\":\"Publish-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Publish-AzWebApp\\r\\n\"},{\"CompletionText\":\"Publish-BCFileContent\",\"ListItemText\":\"Publish-BCFileContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-BCFileContent \\r\\n\"},{\"CompletionText\":\"Publish-BCWebContent\",\"ListItemText\":\"Publish-BCWebContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-BCWebContent \\r\\n\"},{\"CompletionText\":\"Publish-DscConfiguration\",\"ListItemText\":\"Publish-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Publish-DscConfiguration\\r\\n\"},{\"CompletionText\":\"Publish-Module\",\"ListItemText\":\"Publish-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Module \\r\\n\"},{\"CompletionText\":\"Publish-PSResource\",\"ListItemText\":\"Publish-PSResource\",\"ResultType\":2,\"ToolTip\":\"Publish-PSResource\\r\\n\"},{\"CompletionText\":\"Publish-Script\",\"ListItemText\":\"Publish-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Script \\r\\n\"},{\"CompletionText\":\"pumo\",\"ListItemText\":\"pumo\",\"ResultType\":2,\"ToolTip\":\"pumo\"},{\"CompletionText\":\"Push-Location\",\"ListItemText\":\"Push-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPush-Location [[-Path] ] [-PassThru] [-StackName ] []\\r\\n\\r\\nPush-Location [-LiteralPath ] [-PassThru] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"pushd\",\"ListItemText\":\"pushd\",\"ResultType\":2,\"ToolTip\":\"Push-Location\"},{\"CompletionText\":\"pwd\",\"ListItemText\":\"pwd\",\"ResultType\":2,\"ToolTip\":\"Get-Location\"},{\"CompletionText\":\"pwlauncher.exe\",\"ListItemText\":\"pwlauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pwlauncher.exe\"},{\"CompletionText\":\"pwsh-preview.exe\",\"ListItemText\":\"pwsh-preview.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh-preview.exe\"},{\"CompletionText\":\"pwsh.exe\",\"ListItemText\":\"pwsh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\WindowsApps\\\\Microsoft.PowerShell_7.4.2.0_x64__8wekyb3d8bbwe\\\\pwsh.exe\"},{\"CompletionText\":\"py.exe\",\"ListItemText\":\"py.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\py.exe\"},{\"CompletionText\":\"pygmentize.exe\",\"ListItemText\":\"pygmentize.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pygmentize.exe\"},{\"CompletionText\":\"python.exe\",\"ListItemText\":\"python.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\python.exe\"},{\"CompletionText\":\"python3.12.exe\",\"ListItemText\":\"python3.12.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\python3.12.exe\"},{\"CompletionText\":\"python3.9.exe\",\"ListItemText\":\"python3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python3.9.exe\"},{\"CompletionText\":\"python3.exe\",\"ListItemText\":\"python3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python3.exe\"},{\"CompletionText\":\"pythonw.exe\",\"ListItemText\":\"pythonw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\pythonw.exe\"},{\"CompletionText\":\"pythonw3.9.exe\",\"ListItemText\":\"pythonw3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw3.9.exe\"},{\"CompletionText\":\"pythonw3.exe\",\"ListItemText\":\"pythonw3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw3.exe\"},{\"CompletionText\":\"pyw.exe\",\"ListItemText\":\"pyw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\pyw.exe\"},{\"CompletionText\":\"Q:\",\"ListItemText\":\"Q:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nQ: \\r\\n\"},{\"CompletionText\":\"qappsrv.exe\",\"ListItemText\":\"qappsrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\qappsrv.exe\"},{\"CompletionText\":\"qprocess.exe\",\"ListItemText\":\"qprocess.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\qprocess.exe\"},{\"CompletionText\":\"query.exe\",\"ListItemText\":\"query.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\query.exe\"},{\"CompletionText\":\"quser.exe\",\"ListItemText\":\"quser.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\quser.exe\"},{\"CompletionText\":\"qwinsta.exe\",\"ListItemText\":\"qwinsta.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\qwinsta.exe\"},{\"CompletionText\":\"r\",\"ListItemText\":\"r\",\"ResultType\":2,\"ToolTip\":\"Invoke-History\"},{\"CompletionText\":\"R:\",\"ListItemText\":\"R:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nR: \\r\\n\"},{\"CompletionText\":\"rasautou.exe\",\"ListItemText\":\"rasautou.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rasautou.exe\"},{\"CompletionText\":\"rasdial.exe\",\"ListItemText\":\"rasdial.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rasdial.exe\"},{\"CompletionText\":\"raserver.exe\",\"ListItemText\":\"raserver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\raserver.exe\"},{\"CompletionText\":\"rasphone.exe\",\"ListItemText\":\"rasphone.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rasphone.exe\"},{\"CompletionText\":\"rbp\",\"ListItemText\":\"rbp\",\"ResultType\":2,\"ToolTip\":\"Remove-PSBreakpoint\"},{\"CompletionText\":\"rcie\",\"ListItemText\":\"rcie\",\"ResultType\":2,\"ToolTip\":\"rcie\"},{\"CompletionText\":\"rcim\",\"ListItemText\":\"rcim\",\"ResultType\":2,\"ToolTip\":\"rcim\"},{\"CompletionText\":\"rcjb\",\"ListItemText\":\"rcjb\",\"ResultType\":2,\"ToolTip\":\"Receive-Job\"},{\"CompletionText\":\"rcms\",\"ListItemText\":\"rcms\",\"ResultType\":2,\"ToolTip\":\"rcms\"},{\"CompletionText\":\"rcsn\",\"ListItemText\":\"rcsn\",\"ResultType\":2,\"ToolTip\":\"Receive-PSSession\"},{\"CompletionText\":\"rd\",\"ListItemText\":\"rd\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"rdpclip.exe\",\"ListItemText\":\"rdpclip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpclip.exe\"},{\"CompletionText\":\"rdpinit.exe\",\"ListItemText\":\"rdpinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpinit.exe\"},{\"CompletionText\":\"rdpinput.exe\",\"ListItemText\":\"rdpinput.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpinput.exe\"},{\"CompletionText\":\"RdpSa.exe\",\"ListItemText\":\"RdpSa.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RdpSa.exe\"},{\"CompletionText\":\"RdpSaProxy.exe\",\"ListItemText\":\"RdpSaProxy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RdpSaProxy.exe\"},{\"CompletionText\":\"RdpSaUacHelper.exe\",\"ListItemText\":\"RdpSaUacHelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RdpSaUacHelper.exe\"},{\"CompletionText\":\"rdpshell.exe\",\"ListItemText\":\"rdpshell.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpshell.exe\"},{\"CompletionText\":\"rdpsign.exe\",\"ListItemText\":\"rdpsign.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpsign.exe\"},{\"CompletionText\":\"rdr\",\"ListItemText\":\"rdr\",\"ResultType\":2,\"ToolTip\":\"Remove-PSDrive\"},{\"CompletionText\":\"rdrleakdiag.exe\",\"ListItemText\":\"rdrleakdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdrleakdiag.exe\"},{\"CompletionText\":\"Reactivate-AzBatchTask\",\"ListItemText\":\"Reactivate-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Reactivate-AzBatchTask\"},{\"CompletionText\":\"Read-Host\",\"ListItemText\":\"Read-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRead-Host [[-Prompt] ] [-MaskInput] []\\r\\n\\r\\nRead-Host [[-Prompt] ] [-AsSecureString] []\\r\\n\"},{\"CompletionText\":\"Read-PrinterNfcTag\",\"ListItemText\":\"Read-PrinterNfcTag\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRead-PrinterNfcTag \\r\\n\"},{\"CompletionText\":\"readCloudDataSettings.exe\",\"ListItemText\":\"readCloudDataSettings.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\readCloudDataSettings.exe\"},{\"CompletionText\":\"ReAgentc.exe\",\"ListItemText\":\"ReAgentc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ReAgentc.exe\"},{\"CompletionText\":\"recdisc.exe\",\"ListItemText\":\"recdisc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\recdisc.exe\"},{\"CompletionText\":\"Receive-DtcDiagnosticTransaction\",\"ListItemText\":\"Receive-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Receive-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"Receive-Job\",\"ListItemText\":\"Receive-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReceive-Job [-Job] [[-Location] ] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Job] [[-ComputerName] ] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Job] [[-Session] ] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Name] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-InstanceId] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Id] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\"},{\"CompletionText\":\"Receive-PSSession\",\"ListItemText\":\"Receive-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReceive-PSSession [-Session] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-Id] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ComputerName] -Name [-ApplicationName ] [-ConfigurationName ] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ComputerName] -InstanceId [-ApplicationName ] [-ConfigurationName ] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ConnectionUri] -Name [-ConfigurationName ] [-AllowRedirection] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ConnectionUri] -InstanceId [-ConfigurationName ] [-AllowRedirection] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-InstanceId] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-Name] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"recover.exe\",\"ListItemText\":\"recover.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\recover.exe\"},{\"CompletionText\":\"RecoveryDrive.exe\",\"ListItemText\":\"RecoveryDrive.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RecoveryDrive.exe\"},{\"CompletionText\":\"RefreshEnv.cmd\",\"ListItemText\":\"RefreshEnv.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\RefreshEnv.cmd\"},{\"CompletionText\":\"refsutil.exe\",\"ListItemText\":\"refsutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\refsutil.exe\"},{\"CompletionText\":\"reg.exe\",\"ListItemText\":\"reg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\reg.exe\"},{\"CompletionText\":\"regedit.exe\",\"ListItemText\":\"regedit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\regedit.exe\"},{\"CompletionText\":\"regedt32.exe\",\"ListItemText\":\"regedt32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\regedt32.exe\"},{\"CompletionText\":\"regini.exe\",\"ListItemText\":\"regini.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\regini.exe\"},{\"CompletionText\":\"Register-ArgumentCompleter\",\"ListItemText\":\"Register-ArgumentCompleter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ArgumentCompleter -CommandName -ScriptBlock [-Native] []\\r\\n\\r\\nRegister-ArgumentCompleter -ParameterName -ScriptBlock [-CommandName ] []\\r\\n\"},{\"CompletionText\":\"Register-AzAutomationDscNode\",\"ListItemText\":\"Register-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Register-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Register-AzAutomationScheduledRunbook\",\"ListItemText\":\"Register-AzAutomationScheduledRunbook\",\"ResultType\":2,\"ToolTip\":\"Register-AzAutomationScheduledRunbook\\r\\n\"},{\"CompletionText\":\"Register-AzMigrateProjectTool\",\"ListItemText\":\"Register-AzMigrateProjectTool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzMigrateProjectTool \\r\\n\"},{\"CompletionText\":\"Register-AzModule\",\"ListItemText\":\"Register-AzModule\",\"ResultType\":2,\"ToolTip\":\"Register-AzModule\\r\\n\"},{\"CompletionText\":\"Register-AzProviderFeature\",\"ListItemText\":\"Register-AzProviderFeature\",\"ResultType\":2,\"ToolTip\":\"Register-AzProviderFeature\\r\\n\"},{\"CompletionText\":\"Register-AzProviderPreviewFeature\",\"ListItemText\":\"Register-AzProviderPreviewFeature\",\"ResultType\":2,\"ToolTip\":\"Register-AzProviderPreviewFeature\\r\\n\"},{\"CompletionText\":\"Register-AzRecoveryServicesBackupContainer\",\"ListItemText\":\"Register-AzRecoveryServicesBackupContainer\",\"ResultType\":2,\"ToolTip\":\"Register-AzRecoveryServicesBackupContainer\\r\\n\"},{\"CompletionText\":\"Register-AzResourceProvider\",\"ListItemText\":\"Register-AzResourceProvider\",\"ResultType\":2,\"ToolTip\":\"Register-AzResourceProvider\\r\\n\"},{\"CompletionText\":\"Register-AzStackHCI\",\"ListItemText\":\"Register-AzStackHCI\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzStackHCI \\r\\n\"},{\"CompletionText\":\"Register-AzStaticWebAppUserProvidedFunctionApp\",\"ListItemText\":\"Register-AzStaticWebAppUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzStaticWebAppUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Register-AzStorageSyncServer\",\"ListItemText\":\"Register-AzStorageSyncServer\",\"ResultType\":2,\"ToolTip\":\"Register-AzStorageSyncServer\\r\\n\"},{\"CompletionText\":\"Register-AzWvdApplicationGroup\",\"ListItemText\":\"Register-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Register-CimIndicationEvent\",\"ListItemText\":\"Register-CimIndicationEvent\",\"ResultType\":2,\"ToolTip\":\"Register-CimIndicationEvent\\r\\n\"},{\"CompletionText\":\"Register-CimProvider.exe\",\"ListItemText\":\"Register-CimProvider.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Register-CimProvider.exe\"},{\"CompletionText\":\"Register-ClusteredScheduledTask\",\"ListItemText\":\"Register-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Register-DnsClient\",\"ListItemText\":\"Register-DnsClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-DnsClient \\r\\n\"},{\"CompletionText\":\"Register-EngineEvent\",\"ListItemText\":\"Register-EngineEvent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-EngineEvent [-SourceIdentifier] [[-Action] ] [-MessageData ] [-SupportEvent] [-Forward] [-MaxTriggerCount ] []\\r\\n\"},{\"CompletionText\":\"Register-IscsiSession\",\"ListItemText\":\"Register-IscsiSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-IscsiSession \\r\\n\"},{\"CompletionText\":\"Register-ObjectEvent\",\"ListItemText\":\"Register-ObjectEvent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ObjectEvent [-InputObject] [-EventName] [[-SourceIdentifier] ] [[-Action] ] [-MessageData ] [-SupportEvent] [-Forward] [-MaxTriggerCount ] []\\r\\n\"},{\"CompletionText\":\"Register-PackageSource\",\"ListItemText\":\"Register-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Register-PackageSource\\r\\n\"},{\"CompletionText\":\"Register-PSRepository\",\"ListItemText\":\"Register-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-PSRepository \\r\\n\"},{\"CompletionText\":\"Register-PSResourceRepository\",\"ListItemText\":\"Register-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Register-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Register-PSSessionConfiguration\",\"ListItemText\":\"Register-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-PSSessionConfiguration [-Name] [-ProcessorArchitecture ] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRegister-PSSessionConfiguration [-Name] [-AssemblyName] [-ConfigurationTypeName] [-ProcessorArchitecture ] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRegister-PSSessionConfiguration [-Name] -Path [-ProcessorArchitecture ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-TransportOption ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Register-ScheduledJob\",\"ListItemText\":\"Register-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Register-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Register-ScheduledTask\",\"ListItemText\":\"Register-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Register-StorageSubsystem\",\"ListItemText\":\"Register-StorageSubsystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-StorageSubsystem \\r\\n\"},{\"CompletionText\":\"RegisterManifest.ps1\",\"ListItemText\":\"RegisterManifest.ps1\",\"ResultType\":2,\"ToolTip\":\"RegisterManifest.ps1 [[-Path] ] [-Unregister] []\\r\\n\"},{\"CompletionText\":\"RegisterMicrosoftUpdate.ps1\",\"ListItemText\":\"RegisterMicrosoftUpdate.ps1\",\"ResultType\":2,\"ToolTip\":\"RegisterMicrosoftUpdate.ps1 [[-TestHook] ]\\r\\n\"},{\"CompletionText\":\"regsvr32.exe\",\"ListItemText\":\"regsvr32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\regsvr32.exe\"},{\"CompletionText\":\"rekeywiz.exe\",\"ListItemText\":\"rekeywiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rekeywiz.exe\"},{\"CompletionText\":\"relog.exe\",\"ListItemText\":\"relog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\relog.exe\"},{\"CompletionText\":\"RelPost.exe\",\"ListItemText\":\"RelPost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RelPost.exe\"},{\"CompletionText\":\"RemoteAppLifetimeManager.exe\",\"ListItemText\":\"RemoteAppLifetimeManager.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RemoteAppLifetimeManager.exe\"},{\"CompletionText\":\"RemotePosWorker.exe\",\"ListItemText\":\"RemotePosWorker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RemotePosWorker.exe\"},{\"CompletionText\":\"Remove-AdlAnalyticsAccount\",\"ListItemText\":\"Remove-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsAccount\"},{\"CompletionText\":\"Remove-AdlAnalyticsComputePolicy\",\"ListItemText\":\"Remove-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"Remove-AdlAnalyticsDataSource\",\"ListItemText\":\"Remove-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Remove-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Remove-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Remove-AdlCatalogCredential\",\"ListItemText\":\"Remove-AdlCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlCatalogCredential\"},{\"CompletionText\":\"Remove-AdlCatalogItemAclEntry\",\"ListItemText\":\"Remove-AdlCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlCatalogItemAclEntry\"},{\"CompletionText\":\"Remove-AdlCatalogSecret\",\"ListItemText\":\"Remove-AdlCatalogSecret\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlCatalogSecret\"},{\"CompletionText\":\"Remove-AdlStore\",\"ListItemText\":\"Remove-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStore\"},{\"CompletionText\":\"Remove-AdlStoreFirewallRule\",\"ListItemText\":\"Remove-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreFirewallRule\"},{\"CompletionText\":\"Remove-AdlStoreItem\",\"ListItemText\":\"Remove-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreItem\"},{\"CompletionText\":\"Remove-AdlStoreItemAcl\",\"ListItemText\":\"Remove-AdlStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreItemAcl\"},{\"CompletionText\":\"Remove-AdlStoreItemAclEntry\",\"ListItemText\":\"Remove-AdlStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreItemAclEntry\"},{\"CompletionText\":\"Remove-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Remove-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Remove-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Remove-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Remove-Alias\",\"ListItemText\":\"Remove-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Alias [-Name] [-Scope ] [-Force] []\\r\\n\"},{\"CompletionText\":\"Remove-AppPackage\",\"ListItemText\":\"Remove-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppPackage\"},{\"CompletionText\":\"Remove-AppPackageAutoUpdateSettings\",\"ListItemText\":\"Remove-AppPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Remove-AppPackageAutoUpdateSettings\"},{\"CompletionText\":\"Remove-AppPackageVolume\",\"ListItemText\":\"Remove-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Remove-AppPackageVolume\"},{\"CompletionText\":\"Remove-AppProvisionedPackage\",\"ListItemText\":\"Remove-AppProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppProvisionedPackage\"},{\"CompletionText\":\"Remove-AppProvisionedSharedPackageContainer\",\"ListItemText\":\"Remove-AppProvisionedSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AppProvisionedSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AppSharedPackageContainer\",\"ListItemText\":\"Remove-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AppxPackage\",\"ListItemText\":\"Remove-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxPackage\\r\\n\"},{\"CompletionText\":\"Remove-AppxPackageAutoUpdateSettings\",\"ListItemText\":\"Remove-AppxPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxPackageAutoUpdateSettings\\r\\n\"},{\"CompletionText\":\"Remove-AppxProvisionedPackage\",\"ListItemText\":\"Remove-AppxProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxProvisionedPackage\\r\\n\"},{\"CompletionText\":\"Remove-AppxVolume\",\"ListItemText\":\"Remove-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxVolume\\r\\n\"},{\"CompletionText\":\"Remove-ASRFabric\",\"ListItemText\":\"Remove-ASRFabric\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRFabric\"},{\"CompletionText\":\"Remove-ASRNetworkMapping\",\"ListItemText\":\"Remove-ASRNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRNetworkMapping\"},{\"CompletionText\":\"Remove-ASRPolicy\",\"ListItemText\":\"Remove-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRPolicy\"},{\"CompletionText\":\"Remove-ASRProtectionContainerMapping\",\"ListItemText\":\"Remove-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRProtectionContainerMapping\"},{\"CompletionText\":\"Remove-ASRRecoveryPlan\",\"ListItemText\":\"Remove-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRRecoveryPlan\"},{\"CompletionText\":\"Remove-ASRReplicationProtectedItem\",\"ListItemText\":\"Remove-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRReplicationProtectedItem\"},{\"CompletionText\":\"Remove-ASRReplicationProtectedItemDisk\",\"ListItemText\":\"Remove-ASRReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRReplicationProtectedItemDisk\"},{\"CompletionText\":\"Remove-ASRRP\",\"ListItemText\":\"Remove-ASRRP\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRRP\"},{\"CompletionText\":\"Remove-ASRServicesProvider\",\"ListItemText\":\"Remove-ASRServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRServicesProvider\"},{\"CompletionText\":\"Remove-ASRStorageClassificationMapping\",\"ListItemText\":\"Remove-ASRStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRStorageClassificationMapping\"},{\"CompletionText\":\"Remove-ASRvCenter\",\"ListItemText\":\"Remove-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRvCenter\"},{\"CompletionText\":\"Remove-AutologgerConfig\",\"ListItemText\":\"Remove-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Remove-AzAccount\",\"ListItemText\":\"Remove-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAccount\"},{\"CompletionText\":\"Remove-AzActionGroup\",\"ListItemText\":\"Remove-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzActivityLogAlert\",\"ListItemText\":\"Remove-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"Remove-AzADAppCredential\",\"ListItemText\":\"Remove-AzADAppCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADAppCredential \\r\\n\"},{\"CompletionText\":\"Remove-AzADAppFederatedCredential\",\"ListItemText\":\"Remove-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"Remove-AzADApplication\",\"ListItemText\":\"Remove-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADApplication \\r\\n\"},{\"CompletionText\":\"Remove-AzADAppPermission\",\"ListItemText\":\"Remove-AzADAppPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADAppPermission \\r\\n\"},{\"CompletionText\":\"Remove-AzADGroup\",\"ListItemText\":\"Remove-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzADGroupMember\",\"ListItemText\":\"Remove-AzADGroupMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADGroupMember \\r\\n\"},{\"CompletionText\":\"Remove-AzADServicePrincipal\",\"ListItemText\":\"Remove-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"Remove-AzADServicePrincipalCredential\",\"ListItemText\":\"Remove-AzADServicePrincipalCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzADServicePrincipalCredential\"},{\"CompletionText\":\"Remove-AzADSpCredential\",\"ListItemText\":\"Remove-AzADSpCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADSpCredential \\r\\n\"},{\"CompletionText\":\"Remove-AzADUser\",\"ListItemText\":\"Remove-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADUser \\r\\n\"},{\"CompletionText\":\"Remove-AzAksCluster\",\"ListItemText\":\"Remove-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAksCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzAksMaintenanceConfiguration\",\"ListItemText\":\"Remove-AzAksMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAksMaintenanceConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzAksNodePool\",\"ListItemText\":\"Remove-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"Remove-AzAksSnapshot\",\"ListItemText\":\"Remove-AzAksSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAksSnapshot \\r\\n\"},{\"CompletionText\":\"Remove-AzAlertRule\",\"ListItemText\":\"Remove-AzAlertRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAlertRule\\r\\n\"},{\"CompletionText\":\"Remove-AzAlertsSuppressionRule\",\"ListItemText\":\"Remove-AzAlertsSuppressionRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAlertsSuppressionRule\\r\\n\"},{\"CompletionText\":\"Remove-AzAnalysisServicesServer\",\"ListItemText\":\"Remove-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagement\",\"ListItemText\":\"Remove-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApi\",\"ListItemText\":\"Remove-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiFromGateway\",\"ListItemText\":\"Remove-AzApiManagementApiFromGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiFromGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiFromProduct\",\"ListItemText\":\"Remove-AzApiManagementApiFromProduct\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiFromProduct\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiRelease\",\"ListItemText\":\"Remove-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiRevision\",\"ListItemText\":\"Remove-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiSchema\",\"ListItemText\":\"Remove-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiVersionSet\",\"ListItemText\":\"Remove-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementAuthorizationServer\",\"ListItemText\":\"Remove-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementBackend\",\"ListItemText\":\"Remove-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementCache\",\"ListItemText\":\"Remove-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementCertificate\",\"ListItemText\":\"Remove-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementDiagnostic\",\"ListItemText\":\"Remove-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementGateway\",\"ListItemText\":\"Remove-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementGatewayHostnameConfiguration\",\"ListItemText\":\"Remove-AzApiManagementGatewayHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementGatewayHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementGroup\",\"ListItemText\":\"Remove-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementIdentityProvider\",\"ListItemText\":\"Remove-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementLogger\",\"ListItemText\":\"Remove-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementNamedValue\",\"ListItemText\":\"Remove-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"Remove-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementOperation\",\"ListItemText\":\"Remove-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementPolicy\",\"ListItemText\":\"Remove-AzApiManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementProduct\",\"ListItemText\":\"Remove-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementProductFromGroup\",\"ListItemText\":\"Remove-AzApiManagementProductFromGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementProductFromGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementRegion\",\"ListItemText\":\"Remove-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementSubscription\",\"ListItemText\":\"Remove-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementUser\",\"ListItemText\":\"Remove-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementUserFromGroup\",\"ListItemText\":\"Remove-AzApiManagementUserFromGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementUserFromGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAppConfigurationStore\",\"ListItemText\":\"Remove-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGateway\",\"ListItemText\":\"Remove-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"Remove-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayCustomError\",\"ListItemText\":\"Remove-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"Remove-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Remove-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Remove-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Remove-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Remove-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayIdentity\",\"ListItemText\":\"Remove-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayListener\",\"ListItemText\":\"Remove-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Remove-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Remove-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Remove-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Remove-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"Remove-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Remove-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslProfilePolicy\",\"ListItemText\":\"Remove-AzApplicationGatewaySslProfilePolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslProfilePolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Remove-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsights\",\"ListItemText\":\"Remove-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsApiKey\",\"ListItemText\":\"Remove-AzApplicationInsightsApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsApiKey \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"Remove-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"Remove-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"Remove-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsWebTest\",\"ListItemText\":\"Remove-AzApplicationInsightsWebTest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsWebTest \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsWorkbook\",\"ListItemText\":\"Remove-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"Remove-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationSecurityGroup\",\"ListItemText\":\"Remove-AzApplicationSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationSecurityGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAppServiceEnvironment\",\"ListItemText\":\"Remove-AzAppServiceEnvironment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAppServiceEnvironment\\r\\n\"},{\"CompletionText\":\"Remove-AzAppServicePlan\",\"ListItemText\":\"Remove-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"Remove-AzAs\",\"ListItemText\":\"Remove-AzAs\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAs\"},{\"CompletionText\":\"Remove-AzAttestationPolicySigner\",\"ListItemText\":\"Remove-AzAttestationPolicySigner\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAttestationPolicySigner\\r\\n\"},{\"CompletionText\":\"Remove-AzAttestationProvider\",\"ListItemText\":\"Remove-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfile\",\"ListItemText\":\"Remove-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfileAssignment\",\"ListItemText\":\"Remove-AzAutomanageConfigProfileAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfileAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfileHciAssignment\",\"ListItemText\":\"Remove-AzAutomanageConfigProfileHciAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfileHciAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfileHcrpAssignment\",\"ListItemText\":\"Remove-AzAutomanageConfigProfileHcrpAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfileHcrpAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationAccount\",\"ListItemText\":\"Remove-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationCertificate\",\"ListItemText\":\"Remove-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationConnection\",\"ListItemText\":\"Remove-AzAutomationConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationConnectionType\",\"ListItemText\":\"Remove-AzAutomationConnectionType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationConnectionType\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationCredential\",\"ListItemText\":\"Remove-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationDscConfiguration\",\"ListItemText\":\"Remove-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationDscNodeConfiguration\",\"ListItemText\":\"Remove-AzAutomationDscNodeConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationDscNodeConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"Remove-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"Remove-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationHybridWorkerGroup\",\"ListItemText\":\"Remove-AzAutomationHybridWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationHybridWorkerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationModule\",\"ListItemText\":\"Remove-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationPython3Package\",\"ListItemText\":\"Remove-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationRunbook\",\"ListItemText\":\"Remove-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationSchedule\",\"ListItemText\":\"Remove-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationSoftwareUpdateConfiguration\",\"ListItemText\":\"Remove-AzAutomationSoftwareUpdateConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationSoftwareUpdateConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationSourceControl\",\"ListItemText\":\"Remove-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationVariable\",\"ListItemText\":\"Remove-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationWebhook\",\"ListItemText\":\"Remove-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"Remove-AzAutoscaleSetting\",\"ListItemText\":\"Remove-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzAvailabilityGroupListener\",\"ListItemText\":\"Remove-AzAvailabilityGroupListener\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAvailabilityGroupListener \\r\\n\"},{\"CompletionText\":\"Remove-AzAvailabilitySet\",\"ListItemText\":\"Remove-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"Remove-AzBastion\",\"ListItemText\":\"Remove-AzBastion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBastion\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchAccount\",\"ListItemText\":\"Remove-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchApplication\",\"ListItemText\":\"Remove-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchApplicationPackage\",\"ListItemText\":\"Remove-AzBatchApplicationPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchApplicationPackage\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchCertificate\",\"ListItemText\":\"Remove-AzBatchCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchComputeNode\",\"ListItemText\":\"Remove-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchComputeNodeUser\",\"ListItemText\":\"Remove-AzBatchComputeNodeUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchComputeNodeUser\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchJob\",\"ListItemText\":\"Remove-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchJobSchedule\",\"ListItemText\":\"Remove-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchNodeFile\",\"ListItemText\":\"Remove-AzBatchNodeFile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchNodeFile\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchPool\",\"ListItemText\":\"Remove-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchPool\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchTask\",\"ListItemText\":\"Remove-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Remove-AzCapacityReservation\",\"ListItemText\":\"Remove-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"Remove-AzCapacityReservationGroup\",\"ListItemText\":\"Remove-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzCdnCustomDomain\",\"ListItemText\":\"Remove-AzCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnEndpoint\",\"ListItemText\":\"Remove-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnOrigin\",\"ListItemText\":\"Remove-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnOriginGroup\",\"ListItemText\":\"Remove-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnProfile\",\"ListItemText\":\"Remove-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"Remove-AzCloudService\",\"ListItemText\":\"Remove-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCloudService \\r\\n\"},{\"CompletionText\":\"Remove-AzCloudServiceRoleInstance\",\"ListItemText\":\"Remove-AzCloudServiceRoleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCloudServiceRoleInstance \\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccount\",\"ListItemText\":\"Remove-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccountCommitmentPlan\",\"ListItemText\":\"Remove-AzCognitiveServicesAccountCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccountCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccountDeployment\",\"ListItemText\":\"Remove-AzCognitiveServicesAccountDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccountDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccountNetworkRule\",\"ListItemText\":\"Remove-AzCognitiveServicesAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesCommitmentPlan\",\"ListItemText\":\"Remove-AzCognitiveServicesCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesCommitmentPlanAssociation\",\"ListItemText\":\"Remove-AzCognitiveServicesCommitmentPlanAssociation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesCommitmentPlanAssociation\\r\\n\"},{\"CompletionText\":\"Remove-AzConfidentialLedger\",\"ListItemText\":\"Remove-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"Remove-AzConfigurationAssignment\",\"ListItemText\":\"Remove-AzConfigurationAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzConfigurationAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzConsumptionBudget\",\"ListItemText\":\"Remove-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"Remove-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerGroup\",\"ListItemText\":\"Remove-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerInstanceSubnetServiceAssociationLink\",\"ListItemText\":\"Remove-AzContainerInstanceSubnetServiceAssociationLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerInstanceSubnetServiceAssociationLink \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistry\",\"ListItemText\":\"Remove-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryAgentPool\",\"ListItemText\":\"Remove-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryExportPipeline\",\"ListItemText\":\"Remove-AzContainerRegistryExportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryExportPipeline \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryImportPipeline\",\"ListItemText\":\"Remove-AzContainerRegistryImportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryImportPipeline \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryManifest\",\"ListItemText\":\"Remove-AzContainerRegistryManifest\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContainerRegistryManifest\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryReplication\",\"ListItemText\":\"Remove-AzContainerRegistryReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryReplication \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryRepository\",\"ListItemText\":\"Remove-AzContainerRegistryRepository\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContainerRegistryRepository\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryScopeMap\",\"ListItemText\":\"Remove-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryTag\",\"ListItemText\":\"Remove-AzContainerRegistryTag\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContainerRegistryTag\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryToken\",\"ListItemText\":\"Remove-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryWebhook\",\"ListItemText\":\"Remove-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Remove-AzContext\",\"ListItemText\":\"Remove-AzContext\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContext\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBAccount\",\"ListItemText\":\"Remove-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"Remove-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBCassandraTable\",\"ListItemText\":\"Remove-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"Remove-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBGremlinGraph\",\"ListItemText\":\"Remove-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBService\",\"ListItemText\":\"Remove-AzCosmosDBService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBService\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlContainer\",\"ListItemText\":\"Remove-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlDatabase\",\"ListItemText\":\"Remove-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"Remove-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"Remove-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"Remove-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlTrigger\",\"ListItemText\":\"Remove-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"Remove-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBTable\",\"ListItemText\":\"Remove-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"Remove-AzCustomIpPrefix\",\"ListItemText\":\"Remove-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"Remove-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeDevice\",\"ListItemText\":\"Remove-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeOrder\",\"ListItemText\":\"Remove-AzDataBoxEdgeOrder\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeOrder\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeRole\",\"ListItemText\":\"Remove-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeShare\",\"ListItemText\":\"Remove-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeStorageAccount\",\"ListItemText\":\"Remove-AzDataBoxEdgeStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"Remove-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"Remove-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeTrigger\",\"ListItemText\":\"Remove-AzDataBoxEdgeTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeUser\",\"ListItemText\":\"Remove-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"Remove-AzDatabricksAccessConnector\",\"ListItemText\":\"Remove-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"Remove-AzDatabricksVNetPeering\",\"ListItemText\":\"Remove-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"Remove-AzDatabricksWorkspace\",\"ListItemText\":\"Remove-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzDataCollectionRule\",\"ListItemText\":\"Remove-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataCollectionRuleAssociation\",\"ListItemText\":\"Remove-AzDataCollectionRuleAssociation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataCollectionRuleAssociation\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactory\",\"ListItemText\":\"Remove-AzDataFactory\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactory\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryDataset\",\"ListItemText\":\"Remove-AzDataFactoryDataset\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryDataset\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryGateway\",\"ListItemText\":\"Remove-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryHub\",\"ListItemText\":\"Remove-AzDataFactoryHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryHub\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryLinkedService\",\"ListItemText\":\"Remove-AzDataFactoryLinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryLinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryPipeline\",\"ListItemText\":\"Remove-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2\",\"ListItemText\":\"Remove-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2DataFlow\",\"ListItemText\":\"Remove-AzDataFactoryV2DataFlow\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2DataFlow\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2Dataset\",\"ListItemText\":\"Remove-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2Dataset\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Remove-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2IntegrationRuntimeNode\",\"ListItemText\":\"Remove-AzDataFactoryV2IntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2IntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2LinkedService\",\"ListItemText\":\"Remove-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2LinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Remove-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2Trigger\",\"ListItemText\":\"Remove-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2TriggerSubscription\",\"ListItemText\":\"Remove-AzDataFactoryV2TriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2TriggerSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsCatalogCredential\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsCatalogCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsCatalogItemAclEntry\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeGen2AclRecursive\",\"ListItemText\":\"Remove-AzDataLakeGen2AclRecursive\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeGen2AclRecursive\\r\\n\"},{\"CompletionText\":\"Remove-AzDatalakeGen2FileSystem\",\"ListItemText\":\"Remove-AzDatalakeGen2FileSystem\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDatalakeGen2FileSystem\"},{\"CompletionText\":\"Remove-AzDataLakeGen2Item\",\"ListItemText\":\"Remove-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreAccount\",\"ListItemText\":\"Remove-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Remove-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreItem\",\"ListItemText\":\"Remove-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreItemAcl\",\"ListItemText\":\"Remove-AzDataLakeStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreItemAcl\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreItemAclEntry\",\"ListItemText\":\"Remove-AzDataLakeStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreItemAclEntry\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Remove-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Remove-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionBackupInstance\",\"ListItemText\":\"Remove-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionBackupPolicy\",\"ListItemText\":\"Remove-AzDataProtectionBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionBackupPolicy \\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionBackupVault\",\"ListItemText\":\"Remove-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionResourceGuard\",\"ListItemText\":\"Remove-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"Remove-AzDataShare\",\"ListItemText\":\"Remove-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShare\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareAccount\",\"ListItemText\":\"Remove-AzDataShareAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareDataSet\",\"ListItemText\":\"Remove-AzDataShareDataSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareDataSet\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareDataSetMapping\",\"ListItemText\":\"Remove-AzDataShareDataSetMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareDataSetMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareInvitation\",\"ListItemText\":\"Remove-AzDataShareInvitation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareInvitation\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareSubscription\",\"ListItemText\":\"Remove-AzDataShareSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareSynchronizationSetting\",\"ListItemText\":\"Remove-AzDataShareSynchronizationSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareSynchronizationSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareTrigger\",\"ListItemText\":\"Remove-AzDataShareTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzDdosProtectionPlan\",\"ListItemText\":\"Remove-AzDdosProtectionPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDdosProtectionPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzDelegation\",\"ListItemText\":\"Remove-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDelegation\\r\\n\"},{\"CompletionText\":\"Remove-AzDeployment\",\"ListItemText\":\"Remove-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"Remove-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerRollout\",\"ListItemText\":\"Remove-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerService\",\"ListItemText\":\"Remove-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"Remove-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"Remove-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerStep\",\"ListItemText\":\"Remove-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentScript\",\"ListItemText\":\"Remove-AzDeploymentScript\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentScript\\r\\n\"},{\"CompletionText\":\"Remove-AzDeviceSecurityGroup\",\"ListItemText\":\"Remove-AzDeviceSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeviceSecurityGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzDiagnosticSetting\",\"ListItemText\":\"Remove-AzDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzDisk\",\"ListItemText\":\"Remove-AzDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzDiskAccess\",\"ListItemText\":\"Remove-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Remove-AzDiskEncryptionSet\",\"ListItemText\":\"Remove-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"Remove-AzDnsRecordConfig\",\"ListItemText\":\"Remove-AzDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzDnsRecordSet\",\"ListItemText\":\"Remove-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Remove-AzDnsZone\",\"ListItemText\":\"Remove-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDnsZone\\r\\n\"},{\"CompletionText\":\"Remove-AzEnvironment\",\"ListItemText\":\"Remove-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridChannel\",\"ListItemText\":\"Remove-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridDomain\",\"ListItemText\":\"Remove-AzEventGridDomain\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridDomain\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridDomainTopic\",\"ListItemText\":\"Remove-AzEventGridDomainTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridDomainTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Remove-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerNamespace\",\"ListItemText\":\"Remove-AzEventGridPartnerNamespace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerNamespace\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerRegistration\",\"ListItemText\":\"Remove-AzEventGridPartnerRegistration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerRegistration\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerTopic\",\"ListItemText\":\"Remove-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"Remove-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridSubscription\",\"ListItemText\":\"Remove-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridSystemTopic\",\"ListItemText\":\"Remove-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"Remove-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridTopic\",\"ListItemText\":\"Remove-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventHub\",\"ListItemText\":\"Remove-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHub \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubApplicationGroup\",\"ListItemText\":\"Remove-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubAuthorizationRule\",\"ListItemText\":\"Remove-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubCluster\",\"ListItemText\":\"Remove-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubConsumerGroup\",\"ListItemText\":\"Remove-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubGeoDRConfiguration\",\"ListItemText\":\"Remove-AzEventHubGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubNamespace\",\"ListItemText\":\"Remove-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubNamespaceV2\",\"ListItemText\":\"Remove-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventHubNamespaceV2\"},{\"CompletionText\":\"Remove-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubSchemaGroup\",\"ListItemText\":\"Remove-AzEventHubSchemaGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubSchemaGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuit\",\"ListItemText\":\"Remove-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"Remove-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Remove-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Remove-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteConnection\",\"ListItemText\":\"Remove-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCrossConnectionPeering\",\"ListItemText\":\"Remove-AzExpressRouteCrossConnectionPeering\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCrossConnectionPeering\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteGateway\",\"ListItemText\":\"Remove-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRoutePort\",\"ListItemText\":\"Remove-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRoutePortAuthorization\",\"ListItemText\":\"Remove-AzExpressRoutePortAuthorization\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRoutePortAuthorization\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRoutePortIdentity\",\"ListItemText\":\"Remove-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"Remove-AzFederatedIdentityCredentials\",\"ListItemText\":\"Remove-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"Remove-AzFirewall\",\"ListItemText\":\"Remove-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFirewall\\r\\n\"},{\"CompletionText\":\"Remove-AzFirewallPolicy\",\"ListItemText\":\"Remove-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"Remove-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoor\",\"ListItemText\":\"Remove-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"Remove-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"Remove-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnOrigin\",\"ListItemText\":\"Remove-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"Remove-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnProfile\",\"ListItemText\":\"Remove-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnRoute\",\"ListItemText\":\"Remove-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnRule\",\"ListItemText\":\"Remove-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnRuleSet\",\"ListItemText\":\"Remove-AzFrontDoorCdnRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnRuleSet \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnSecret\",\"ListItemText\":\"Remove-AzFrontDoorCdnSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnSecret \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"Remove-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorContent\",\"ListItemText\":\"Remove-AzFrontDoorContent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoorContent\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorRulesEngine\",\"ListItemText\":\"Remove-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorWafPolicy\",\"ListItemText\":\"Remove-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzFunctionApp\",\"ListItemText\":\"Remove-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Remove-AzFunctionAppPlan\",\"ListItemText\":\"Remove-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"Remove-AzFunctionAppSetting\",\"ListItemText\":\"Remove-AzFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzGallery\",\"ListItemText\":\"Remove-AzGallery\",\"ResultType\":2,\"ToolTip\":\"Remove-AzGallery\\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryApplication\",\"ListItemText\":\"Remove-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryApplicationVersion\",\"ListItemText\":\"Remove-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryImageDefinition\",\"ListItemText\":\"Remove-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryImageVersion\",\"ListItemText\":\"Remove-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"Remove-AzHDInsightCluster\",\"ListItemText\":\"Remove-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"Remove-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzHDInsightPersistedScriptAction\",\"ListItemText\":\"Remove-AzHDInsightPersistedScriptAction\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHDInsightPersistedScriptAction\\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareApisService\",\"ListItemText\":\"Remove-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareApisWorkspace\",\"ListItemText\":\"Remove-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareDicomService\",\"ListItemText\":\"Remove-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareFhirService\",\"ListItemText\":\"Remove-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareIotConnector\",\"ListItemText\":\"Remove-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareIotConnectorFhirDestination\",\"ListItemText\":\"Remove-AzHealthcareIotConnectorFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareIotConnectorFhirDestination \\r\\n\"},{\"CompletionText\":\"Remove-AzHost\",\"ListItemText\":\"Remove-AzHost\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHost\\r\\n\"},{\"CompletionText\":\"Remove-AzHostGroup\",\"ListItemText\":\"Remove-AzHostGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHostGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzImage\",\"ListItemText\":\"Remove-AzImage\",\"ResultType\":2,\"ToolTip\":\"Remove-AzImage\\r\\n\"},{\"CompletionText\":\"Remove-AzImageDataDisk\",\"ListItemText\":\"Remove-AzImageDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzImageDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzInsightsPrivateLinkScope\",\"ListItemText\":\"Remove-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"Remove-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"Remove-AzInsightsPrivateLinkScopedResource\",\"ListItemText\":\"Remove-AzInsightsPrivateLinkScopedResource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzInsightsPrivateLinkScopedResource\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccount\",\"ListItemText\":\"Remove-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountAgreement\",\"ListItemText\":\"Remove-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountAssembly\",\"ListItemText\":\"Remove-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"Remove-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountCertificate\",\"ListItemText\":\"Remove-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountMap\",\"ListItemText\":\"Remove-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountPartner\",\"ListItemText\":\"Remove-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountReceivedIcn\",\"ListItemText\":\"Remove-AzIntegrationAccountReceivedIcn\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountReceivedIcn\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountSchema\",\"ListItemText\":\"Remove-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHub\",\"ListItemText\":\"Remove-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHub\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubCertificate\",\"ListItemText\":\"Remove-AzIotHubCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubConfiguration\",\"ListItemText\":\"Remove-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubDCL\",\"ListItemText\":\"Remove-AzIotHubDCL\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDCL\"},{\"CompletionText\":\"Remove-AzIotHubDeployment\",\"ListItemText\":\"Remove-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubDevice\",\"ListItemText\":\"Remove-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubDeviceChildren\",\"ListItemText\":\"Remove-AzIotHubDeviceChildren\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDeviceChildren\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubEHCG\",\"ListItemText\":\"Remove-AzIotHubEHCG\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubEHCG\"},{\"CompletionText\":\"Remove-AzIotHubEventHubConsumerGroup\",\"ListItemText\":\"Remove-AzIotHubEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubEventHubConsumerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubKey\",\"ListItemText\":\"Remove-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubMessageEnrichment\",\"ListItemText\":\"Remove-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubModule\",\"ListItemText\":\"Remove-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubMsgEnrich\",\"ListItemText\":\"Remove-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Remove-AzIotHubRoute\",\"ListItemText\":\"Remove-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubRoutingEndpoint\",\"ListItemText\":\"Remove-AzIotHubRoutingEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubRoutingEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzIotSecuritySolution\",\"ListItemText\":\"Remove-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Remove-AzIpAllocation\",\"ListItemText\":\"Remove-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"Remove-AzIpGroup\",\"ListItemText\":\"Remove-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIpGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Remove-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVault\",\"ListItemText\":\"Remove-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultAccessPolicy\",\"ListItemText\":\"Remove-AzKeyVaultAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificate\",\"ListItemText\":\"Remove-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificateContact\",\"ListItemText\":\"Remove-AzKeyVaultCertificateContact\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificateContact\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificateIssuer\",\"ListItemText\":\"Remove-AzKeyVaultCertificateIssuer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificateIssuer\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificateOperation\",\"ListItemText\":\"Remove-AzKeyVaultCertificateOperation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificateOperation\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultKey\",\"ListItemText\":\"Remove-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultManagedHsm\",\"ListItemText\":\"Remove-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Remove-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultManagedStorageSasDefinition\",\"ListItemText\":\"Remove-AzKeyVaultManagedStorageSasDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultManagedStorageSasDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultNetworkRule\",\"ListItemText\":\"Remove-AzKeyVaultNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultRoleAssignment\",\"ListItemText\":\"Remove-AzKeyVaultRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultRoleDefinition\",\"ListItemText\":\"Remove-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultSecret\",\"ListItemText\":\"Remove-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Remove-AzKustoAttachedDatabaseConfiguration\",\"ListItemText\":\"Remove-AzKustoAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoCluster\",\"ListItemText\":\"Remove-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoClusterLanguageExtension\",\"ListItemText\":\"Remove-AzKustoClusterLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoClusterLanguageExtension \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoClusterPrincipalAssignment\",\"ListItemText\":\"Remove-AzKustoClusterPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoClusterPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDatabase\",\"ListItemText\":\"Remove-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDatabasePrincipal\",\"ListItemText\":\"Remove-AzKustoDatabasePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDatabasePrincipal \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDatabasePrincipalAssignment\",\"ListItemText\":\"Remove-AzKustoDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDataConnection\",\"ListItemText\":\"Remove-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"Remove-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzKustoPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoScript\",\"ListItemText\":\"Remove-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoScript \\r\\n\"},{\"CompletionText\":\"Remove-AzLoad\",\"ListItemText\":\"Remove-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzLoad \\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancer\",\"ListItemText\":\"Remove-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"Remove-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"Remove-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Remove-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Remove-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Remove-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Remove-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Remove-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Remove-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLocalNetworkGateway\",\"ListItemText\":\"Remove-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzLogicApp\",\"ListItemText\":\"Remove-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Remove-AzLogProfile\",\"ListItemText\":\"Remove-AzLogProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLogProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzMaintenanceConfiguration\",\"ListItemText\":\"Remove-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedApplication\",\"ListItemText\":\"Remove-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedApplicationDefinition\",\"ListItemText\":\"Remove-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedCassandraCluster\",\"ListItemText\":\"Remove-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedCassandraDataCenter\",\"ListItemText\":\"Remove-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedServicesAssignment\",\"ListItemText\":\"Remove-AzManagedServicesAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzManagedServicesAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzManagedServicesDefinition\",\"ListItemText\":\"Remove-AzManagedServicesDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzManagedServicesDefinition \\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroup\",\"ListItemText\":\"Remove-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroupDeployment\",\"ListItemText\":\"Remove-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroupHierarchySetting\",\"ListItemText\":\"Remove-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroupSubscription\",\"ListItemText\":\"Remove-AzManagementGroupSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroupSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzMediaService\",\"ListItemText\":\"Remove-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMediaService\\r\\n\"},{\"CompletionText\":\"Remove-AzMetricAlertRuleV2\",\"ListItemText\":\"Remove-AzMetricAlertRuleV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMetricAlertRuleV2\\r\\n\"},{\"CompletionText\":\"Remove-AzMigrateProject\",\"ListItemText\":\"Remove-AzMigrateProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMigrateProject \\r\\n\"},{\"CompletionText\":\"Remove-AzMigrateServerReplication\",\"ListItemText\":\"Remove-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Remove-AzMlCommitmentPlan\",\"ListItemText\":\"Remove-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzMlWebService\",\"ListItemText\":\"Remove-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspace\",\"ListItemText\":\"Remove-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"Remove-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"Remove-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceCodeVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceCodeVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceCodeVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceComponentContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceComponentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceComponentContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceComponentVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceComponentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceComponentVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceCompute\",\"ListItemText\":\"Remove-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceConnection\",\"ListItemText\":\"Remove-AzMLWorkspaceConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceDataContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceDataContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceDataContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceDatastore\",\"ListItemText\":\"Remove-AzMLWorkspaceDatastore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceDatastore \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceDataVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceDataVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceDataVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceEnvironmentContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceEnvironmentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceEnvironmentContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceEnvironmentVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceEnvironmentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceEnvironmentVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceJob\",\"ListItemText\":\"Remove-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceModelContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceModelContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceModelContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceModelVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceModelVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceModelVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"Remove-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"Remove-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzMonitorWorkspace\",\"ListItemText\":\"Remove-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFirewallRule\",\"ListItemText\":\"Remove-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFlexibleServer\",\"ListItemText\":\"Remove-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFlexibleServerDatabase\",\"ListItemText\":\"Remove-AzMySqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"Remove-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlServer\",\"ListItemText\":\"Remove-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"Remove-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Remove-AzNatGateway\",\"ListItemText\":\"Remove-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNatGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkInterface\",\"ListItemText\":\"Remove-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Remove-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Remove-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManager\",\"ListItemText\":\"Remove-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"Remove-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerGroup\",\"ListItemText\":\"Remove-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"Remove-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerScopeConnection\",\"ListItemText\":\"Remove-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"Remove-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"Remove-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"Remove-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerStaticMember\",\"ListItemText\":\"Remove-AzNetworkManagerStaticMember\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerStaticMember\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"Remove-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkProfile\",\"ListItemText\":\"Remove-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkSecurityGroup\",\"ListItemText\":\"Remove-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Remove-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkVirtualAppliance\",\"ListItemText\":\"Remove-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcher\",\"ListItemText\":\"Remove-AzNetworkWatcher\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcher\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Remove-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcherFlowLog\",\"ListItemText\":\"Remove-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"Remove-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHub\",\"ListItemText\":\"Remove-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"Remove-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"Remove-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"Remove-AzNotificationHubsNamespace\",\"ListItemText\":\"Remove-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"Remove-AzOperationalInsightsCluster\",\"ListItemText\":\"Remove-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsDataExport\",\"ListItemText\":\"Remove-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsDataSource\",\"ListItemText\":\"Remove-AzOperationalInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsDataSource\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsLinkedService\",\"ListItemText\":\"Remove-AzOperationalInsightsLinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsLinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"Remove-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"Remove-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"Remove-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsTable\",\"ListItemText\":\"Remove-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Remove-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Remove-AzP2sVpnGateway\",\"ListItemText\":\"Remove-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyAssignment\",\"ListItemText\":\"Remove-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyAttestation\",\"ListItemText\":\"Remove-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyDefinition\",\"ListItemText\":\"Remove-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyExemption\",\"ListItemText\":\"Remove-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyRemediation\",\"ListItemText\":\"Remove-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicySetDefinition\",\"ListItemText\":\"Remove-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFirewallRule\",\"ListItemText\":\"Remove-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Remove-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFlexibleServerDatabase\",\"ListItemText\":\"Remove-AzPostgreSqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"Remove-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlServer\",\"ListItemText\":\"Remove-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"Remove-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Remove-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Remove-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Remove-AzPowerBIWorkspaceCollection\",\"ListItemText\":\"Remove-AzPowerBIWorkspaceCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPowerBIWorkspaceCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsRecordConfig\",\"ListItemText\":\"Remove-AzPrivateDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsRecordSet\",\"ListItemText\":\"Remove-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"Remove-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsZone\",\"ListItemText\":\"Remove-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsZoneGroup\",\"ListItemText\":\"Remove-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateEndpoint\",\"ListItemText\":\"Remove-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateLinkAssociation\",\"ListItemText\":\"Remove-AzPrivateLinkAssociation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateLinkAssociation\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateLinkService\",\"ListItemText\":\"Remove-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Remove-AzProximityPlacementGroup\",\"ListItemText\":\"Remove-AzProximityPlacementGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzProximityPlacementGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzPublicIpAddress\",\"ListItemText\":\"Remove-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"Remove-AzPublicIpPrefix\",\"ListItemText\":\"Remove-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrFabric\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrFabric\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrFabric\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrProtectionContainer\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrProtectionContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItemDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrServicesProvider\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrServicesProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrStorageClassificationMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrStorageClassificationMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"Remove-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesResourceGuardMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesResourceGuardMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesResourceGuardMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesVault\",\"ListItemText\":\"Remove-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCache\",\"ListItemText\":\"Remove-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCacheDiagnostic\",\"ListItemText\":\"Remove-AzRedisCacheDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheDiagnostic\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCacheDiagnostics\",\"ListItemText\":\"Remove-AzRedisCacheDiagnostics\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheDiagnostics\"},{\"CompletionText\":\"Remove-AzRedisCacheFirewallRule\",\"ListItemText\":\"Remove-AzRedisCacheFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCacheLink\",\"ListItemText\":\"Remove-AzRedisCacheLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheLink\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCachePatchSchedule\",\"ListItemText\":\"Remove-AzRedisCachePatchSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCachePatchSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisEnterpriseCache\",\"ListItemText\":\"Remove-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Remove-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Remove-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzRelayAuthorizationRule\",\"ListItemText\":\"Remove-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzRelayHybridConnection\",\"ListItemText\":\"Remove-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzRelayNamespace\",\"ListItemText\":\"Remove-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"Remove-AzResource\",\"ListItemText\":\"Remove-AzResource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResource\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceGroup\",\"ListItemText\":\"Remove-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceGroupDeployment\",\"ListItemText\":\"Remove-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceLock\",\"ListItemText\":\"Remove-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceLock\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceManagementPrivateLink\",\"ListItemText\":\"Remove-AzResourceManagementPrivateLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceManagementPrivateLink\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceMoverMoveCollection\",\"ListItemText\":\"Remove-AzResourceMoverMoveCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzResourceMoverMoveCollection \\r\\n\"},{\"CompletionText\":\"Remove-AzResourceMoverMoveResource\",\"ListItemText\":\"Remove-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzResourceMoverMoveResource \\r\\n\"},{\"CompletionText\":\"Remove-AzRestorePoint\",\"ListItemText\":\"Remove-AzRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRestorePoint\\r\\n\"},{\"CompletionText\":\"Remove-AzRestorePointCollection\",\"ListItemText\":\"Remove-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageContainer\",\"ListItemText\":\"Remove-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Remove-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageContainerLegalHold\",\"ListItemText\":\"Remove-AzRmStorageContainerLegalHold\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageContainerLegalHold\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageShare\",\"ListItemText\":\"Remove-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Remove-AzRoleAssignment\",\"ListItemText\":\"Remove-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzRoleDefinition\",\"ListItemText\":\"Remove-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzRoleManagementPolicy\",\"ListItemText\":\"Remove-AzRoleManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRoleManagementPolicy \\r\\n\"},{\"CompletionText\":\"Remove-AzRoleManagementPolicyAssignment\",\"ListItemText\":\"Remove-AzRoleManagementPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRoleManagementPolicyAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzRouteConfig\",\"ListItemText\":\"Remove-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteFilter\",\"ListItemText\":\"Remove-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteFilterRuleConfig\",\"ListItemText\":\"Remove-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteMap\",\"ListItemText\":\"Remove-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteMap\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteServer\",\"ListItemText\":\"Remove-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteServer\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteServerPeer\",\"ListItemText\":\"Remove-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteTable\",\"ListItemText\":\"Remove-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteTable\\r\\n\"},{\"CompletionText\":\"Remove-AzRoutingIntent\",\"ListItemText\":\"Remove-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"Remove-AzRoutingPolicy\",\"ListItemText\":\"Remove-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzScheduledQueryRule\",\"ListItemText\":\"Remove-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityAssessment\",\"ListItemText\":\"Remove-AzSecurityAssessment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityAssessment\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityAssessmentMetadata\",\"ListItemText\":\"Remove-AzSecurityAssessmentMetadata\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityAssessmentMetadata\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityAutomation\",\"ListItemText\":\"Remove-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityContact\",\"ListItemText\":\"Remove-AzSecurityContact\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityContact\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityPartnerProvider\",\"ListItemText\":\"Remove-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Remove-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityWorkspaceSetting\",\"ListItemText\":\"Remove-AzSecurityWorkspaceSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityWorkspaceSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelAlertRule\",\"ListItemText\":\"Remove-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelAlertRuleAction\",\"ListItemText\":\"Remove-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelAutomationRule\",\"ListItemText\":\"Remove-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelBookmark\",\"ListItemText\":\"Remove-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelBookmarkRelation\",\"ListItemText\":\"Remove-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelDataConnector\",\"ListItemText\":\"Remove-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelEntityQuery\",\"ListItemText\":\"Remove-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelIncident\",\"ListItemText\":\"Remove-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelIncidentComment\",\"ListItemText\":\"Remove-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelIncidentRelation\",\"ListItemText\":\"Remove-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelOnboardingState\",\"ListItemText\":\"Remove-AzSentinelOnboardingState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelOnboardingState \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusAuthorizationRule\",\"ListItemText\":\"Remove-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusGeoDRConfiguration\",\"ListItemText\":\"Remove-AzServiceBusGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusMigration\",\"ListItemText\":\"Remove-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusNamespace\",\"ListItemText\":\"Remove-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusNamespaceV2\",\"ListItemText\":\"Remove-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"Remove-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusQueue\",\"ListItemText\":\"Remove-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusRule\",\"ListItemText\":\"Remove-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusSubscription\",\"ListItemText\":\"Remove-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusTopic\",\"ListItemText\":\"Remove-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceEndpointPolicy\",\"ListItemText\":\"Remove-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Remove-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricApplication\",\"ListItemText\":\"Remove-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricApplicationType\",\"ListItemText\":\"Remove-AzServiceFabricApplicationType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricApplicationType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricApplicationTypeVersion\",\"ListItemText\":\"Remove-AzServiceFabricApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricClientCertificate\",\"ListItemText\":\"Remove-AzServiceFabricClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricClientCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedCluster\",\"ListItemText\":\"Remove-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterClientCertificate\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterClientCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterService\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Remove-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedNodeTypeVMExtension\",\"ListItemText\":\"Remove-AzServiceFabricManagedNodeTypeVMExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedNodeTypeVMExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricNode\",\"ListItemText\":\"Remove-AzServiceFabricNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricNode\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricNodeType\",\"ListItemText\":\"Remove-AzServiceFabricNodeType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricNodeType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricService\",\"ListItemText\":\"Remove-AzServiceFabricService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricService\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricSetting\",\"ListItemText\":\"Remove-AzServiceFabricSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Remove-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Remove-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceLinkerForWebApp\",\"ListItemText\":\"Remove-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Remove-AzSignalR\",\"ListItemText\":\"Remove-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSignalR\\r\\n\"},{\"CompletionText\":\"Remove-AzSnapshot\",\"ListItemText\":\"Remove-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSnapshot\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabase\",\"ListItemText\":\"Remove-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseAudit\",\"ListItemText\":\"Remove-AzSqlDatabaseAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseAudit\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"Remove-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Remove-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseFromFailoverGroup\",\"ListItemText\":\"Remove-AzSqlDatabaseFromFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseFromFailoverGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Remove-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Remove-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseRestorePoint\",\"ListItemText\":\"Remove-AzSqlDatabaseRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseRestorePoint\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseSecondary\",\"ListItemText\":\"Remove-AzSqlDatabaseSecondary\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseSecondary\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseSensitivityClassification\",\"ListItemText\":\"Remove-AzSqlDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseServerAuditing\",\"ListItemText\":\"Remove-AzSqlDatabaseServerAuditing\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseServerAuditing\"},{\"CompletionText\":\"Remove-AzSqlElasticJob\",\"ListItemText\":\"Remove-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobAgent\",\"ListItemText\":\"Remove-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobCredential\",\"ListItemText\":\"Remove-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobStep\",\"ListItemText\":\"Remove-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobTarget\",\"ListItemText\":\"Remove-AzSqlElasticJobTarget\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobTarget\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobTargetGroup\",\"ListItemText\":\"Remove-AzSqlElasticJobTargetGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobTargetGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticPool\",\"ListItemText\":\"Remove-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstance\",\"ListItemText\":\"Remove-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceActiveDirectoryAdministrator\",\"ListItemText\":\"Remove-AzSqlInstanceActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceDatabase\",\"ListItemText\":\"Remove-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Remove-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceDatabaseSensitivityClassification\",\"ListItemText\":\"Remove-AzSqlInstanceDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceKeyVaultKey\",\"ListItemText\":\"Remove-AzSqlInstanceKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceLink\",\"ListItemText\":\"Remove-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstancePool\",\"ListItemText\":\"Remove-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceServerTrustCertificate\",\"ListItemText\":\"Remove-AzSqlInstanceServerTrustCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceServerTrustCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServer\",\"ListItemText\":\"Remove-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServer\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerActiveDirectoryAdministrator\",\"ListItemText\":\"Remove-AzSqlServerActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerAudit\",\"ListItemText\":\"Remove-AzSqlServerAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerAudit\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerCommunicationLink\",\"ListItemText\":\"Remove-AzSqlServerCommunicationLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerCommunicationLink\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"Remove-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerDnsAlias\",\"ListItemText\":\"Remove-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerFirewallRule\",\"ListItemText\":\"Remove-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"Remove-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerKeyVaultKey\",\"ListItemText\":\"Remove-AzSqlServerKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerMSSupportAudit\",\"ListItemText\":\"Remove-AzSqlServerMSSupportAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerMSSupportAudit\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerOutboundFirewallRule\",\"ListItemText\":\"Remove-AzSqlServerOutboundFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerOutboundFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerTrustGroup\",\"ListItemText\":\"Remove-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerTrustGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"Remove-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlSyncAgent\",\"ListItemText\":\"Remove-AzSqlSyncAgent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlSyncAgent\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlSyncGroup\",\"ListItemText\":\"Remove-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlSyncMember\",\"ListItemText\":\"Remove-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlVirtualCluster\",\"ListItemText\":\"Remove-AzSqlVirtualCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlVirtualCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlVM\",\"ListItemText\":\"Remove-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSqlVM \\r\\n\"},{\"CompletionText\":\"Remove-AzSqlVMGroup\",\"ListItemText\":\"Remove-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzSshkey\",\"ListItemText\":\"Remove-AzSshkey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSshkey\\r\\n\"},{\"CompletionText\":\"Remove-AzStackHciArcSetting\",\"ListItemText\":\"Remove-AzStackHciArcSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHciArcSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHciCluster\",\"ListItemText\":\"Remove-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHciExtension\",\"ListItemText\":\"Remove-AzStackHciExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHciExtension \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHCIRemoteSupport\",\"ListItemText\":\"Remove-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHCIVMAttestation\",\"ListItemText\":\"Remove-AzStackHCIVMAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHCIVMAttestation \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebApp\",\"ListItemText\":\"Remove-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppAttachedRepository\",\"ListItemText\":\"Remove-AzStaticWebAppAttachedRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppAttachedRepository \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppBuild\",\"ListItemText\":\"Remove-AzStaticWebAppBuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppBuild \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppCustomDomain\",\"ListItemText\":\"Remove-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppUser\",\"ListItemText\":\"Remove-AzStaticWebAppUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppUser \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageAccount\",\"ListItemText\":\"Remove-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageAccountManagementPolicy\",\"ListItemText\":\"Remove-AzStorageAccountManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageAccountManagementPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageAccountNetworkRule\",\"ListItemText\":\"Remove-AzStorageAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageBlob\",\"ListItemText\":\"Remove-AzStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageBlob\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageBlobImmutabilityPolicy\",\"ListItemText\":\"Remove-AzStorageBlobImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageBlobImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageBlobInventoryPolicy\",\"ListItemText\":\"Remove-AzStorageBlobInventoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageBlobInventoryPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageContainer\",\"ListItemText\":\"Remove-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageCORSRule\",\"ListItemText\":\"Remove-AzStorageCORSRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageCORSRule\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageDirectory\",\"ListItemText\":\"Remove-AzStorageDirectory\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageDirectory\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageFile\",\"ListItemText\":\"Remove-AzStorageFile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageFile\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageLocalUser\",\"ListItemText\":\"Remove-AzStorageLocalUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageLocalUser\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMover\",\"ListItemText\":\"Remove-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMover \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMoverEndpoint\",\"ListItemText\":\"Remove-AzStorageMoverEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMoverEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMoverJobDefinition\",\"ListItemText\":\"Remove-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMoverProject\",\"ListItemText\":\"Remove-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageObjectReplicationPolicy\",\"ListItemText\":\"Remove-AzStorageObjectReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageObjectReplicationPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageQueue\",\"ListItemText\":\"Remove-AzStorageQueue\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageQueue\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageShare\",\"ListItemText\":\"Remove-AzStorageShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageShare\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncCloudEndpoint\",\"ListItemText\":\"Remove-AzStorageSyncCloudEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncCloudEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncGroup\",\"ListItemText\":\"Remove-AzStorageSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncServerEndpoint\",\"ListItemText\":\"Remove-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncService\",\"ListItemText\":\"Remove-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageTable\",\"ListItemText\":\"Remove-AzStorageTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageTable\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsCluster\",\"ListItemText\":\"Remove-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsFunction\",\"ListItemText\":\"Remove-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsInput\",\"ListItemText\":\"Remove-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsJob\",\"ListItemText\":\"Remove-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsOutput\",\"ListItemText\":\"Remove-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Remove-AzSubscriptionDeployment\",\"ListItemText\":\"Remove-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSubscriptionDeployment\"},{\"CompletionText\":\"Remove-AzSubscriptionDiagnosticSetting\",\"ListItemText\":\"Remove-AzSubscriptionDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSubscriptionDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseDataFlow\",\"ListItemText\":\"Remove-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseDataFlow\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseDataset\",\"ListItemText\":\"Remove-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseDataset\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseFirewallRule\",\"ListItemText\":\"Remove-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Remove-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseIntegrationRuntimeNode\",\"ListItemText\":\"Remove-AzSynapseIntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseIntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKqlScript\",\"ListItemText\":\"Remove-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPool\",\"ListItemText\":\"Remove-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ListItemText\":\"Remove-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"Remove-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ListItemText\":\"Remove-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"Remove-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolLanguageExtension\",\"ListItemText\":\"Remove-AzSynapseKustoPoolLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolLanguageExtension \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolPrincipalAssignment\",\"ListItemText\":\"Remove-AzSynapseKustoPoolPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseLinkConnection\",\"ListItemText\":\"Remove-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseLinkedService\",\"ListItemText\":\"Remove-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseLinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"Remove-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseManagedPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseNotebook\",\"ListItemText\":\"Remove-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapsePipeline\",\"ListItemText\":\"Remove-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseRoleAssignment\",\"ListItemText\":\"Remove-AzSynapseRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSparkConfiguration\",\"ListItemText\":\"Remove-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSparkJobDefinition\",\"ListItemText\":\"Remove-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSparkJobDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSparkPool\",\"ListItemText\":\"Remove-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlActiveDirectoryAdministrator\",\"ListItemText\":\"Remove-AzSynapseSqlActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlAudit\",\"ListItemText\":\"Remove-AzSynapseSqlAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlAudit\"},{\"CompletionText\":\"Remove-AzSynapseSqlDatabase\",\"ListItemText\":\"Remove-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlPool\",\"ListItemText\":\"Remove-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlPoolAudit\",\"ListItemText\":\"Remove-AzSynapseSqlPoolAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPoolAudit\"},{\"CompletionText\":\"Remove-AzSynapseSqlPoolRestorePoint\",\"ListItemText\":\"Remove-AzSynapseSqlPoolRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPoolRestorePoint\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlPoolSensitivityClassification\",\"ListItemText\":\"Remove-AzSynapseSqlPoolSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPoolSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlScript\",\"ListItemText\":\"Remove-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseTrigger\",\"ListItemText\":\"Remove-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseTriggerSubscription\",\"ListItemText\":\"Remove-AzSynapseTriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseTriggerSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseWorkspace\",\"ListItemText\":\"Remove-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseWorkspaceKey\",\"ListItemText\":\"Remove-AzSynapseWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseWorkspaceKey\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseWorkspacePackage\",\"ListItemText\":\"Remove-AzSynapseWorkspacePackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseWorkspacePackage\\r\\n\"},{\"CompletionText\":\"Remove-AzTag\",\"ListItemText\":\"Remove-AzTag\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTag\\r\\n\"},{\"CompletionText\":\"Remove-AzTemplateSpec\",\"ListItemText\":\"Remove-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Remove-AzTenantDeployment\",\"ListItemText\":\"Remove-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerCustomHeaderFromEndpoint\",\"ListItemText\":\"Remove-AzTrafficManagerCustomHeaderFromEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerCustomHeaderFromEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerCustomHeaderFromProfile\",\"ListItemText\":\"Remove-AzTrafficManagerCustomHeaderFromProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerCustomHeaderFromProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerEndpoint\",\"ListItemText\":\"Remove-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerEndpointConfig\",\"ListItemText\":\"Remove-AzTrafficManagerEndpointConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerEndpointConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerExpectedStatusCodeRange\",\"ListItemText\":\"Remove-AzTrafficManagerExpectedStatusCodeRange\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerExpectedStatusCodeRange\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerIpAddressRange\",\"ListItemText\":\"Remove-AzTrafficManagerIpAddressRange\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerIpAddressRange\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerProfile\",\"ListItemText\":\"Remove-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzUserAssignedIdentity\",\"ListItemText\":\"Remove-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Remove-AzVHubRouteTable\",\"ListItemText\":\"Remove-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualApplianceSite\",\"ListItemText\":\"Remove-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHub\",\"ListItemText\":\"Remove-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHubBgpConnection\",\"ListItemText\":\"Remove-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHubRouteTable\",\"ListItemText\":\"Remove-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHubVnetConnection\",\"ListItemText\":\"Remove-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetwork\",\"ListItemText\":\"Remove-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGateway\",\"ListItemText\":\"Remove-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayDefaultSite\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayDefaultSite\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayDefaultSite\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayIpConfig\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayIpConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayIpConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkPeering\",\"ListItemText\":\"Remove-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Remove-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkTap\",\"ListItemText\":\"Remove-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualRouter\",\"ListItemText\":\"Remove-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualRouterPeer\",\"ListItemText\":\"Remove-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualWan\",\"ListItemText\":\"Remove-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"Remove-AzVM\",\"ListItemText\":\"Remove-AzVM\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVM\\r\\n\"},{\"CompletionText\":\"Remove-AzVMAccessExtension\",\"ListItemText\":\"Remove-AzVMAccessExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMAccessExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMAEMExtension\",\"ListItemText\":\"Remove-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMBackup\",\"ListItemText\":\"Remove-AzVMBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzVMChefExtension\",\"ListItemText\":\"Remove-AzVMChefExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMChefExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMCustomScriptExtension\",\"ListItemText\":\"Remove-AzVMCustomScriptExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMCustomScriptExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDataDisk\",\"ListItemText\":\"Remove-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDiagnosticsExtension\",\"ListItemText\":\"Remove-AzVMDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDiskEncryptionExtension\",\"ListItemText\":\"Remove-AzVMDiskEncryptionExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDiskEncryptionExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDscExtension\",\"ListItemText\":\"Remove-AzVMDscExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDscExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMExtension\",\"ListItemText\":\"Remove-AzVMExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmGalleryApplication\",\"ListItemText\":\"Remove-AzVmGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmGalleryApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzVMNetworkInterface\",\"ListItemText\":\"Remove-AzVMNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMNetworkInterface\\r\\n\"},{\"CompletionText\":\"Remove-AzVMRunCommand\",\"ListItemText\":\"Remove-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzVMRunCommand \\r\\n\"},{\"CompletionText\":\"Remove-AzVMSecret\",\"ListItemText\":\"Remove-AzVMSecret\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMSecret\\r\\n\"},{\"CompletionText\":\"Remove-AzVMSqlServerExtension\",\"ListItemText\":\"Remove-AzVMSqlServerExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMSqlServerExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmss\",\"ListItemText\":\"Remove-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmss\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssDataDisk\",\"ListItemText\":\"Remove-AzVmssDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssDiagnosticsExtension\",\"ListItemText\":\"Remove-AzVmssDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssExtension\",\"ListItemText\":\"Remove-AzVmssExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssGalleryApplication\",\"ListItemText\":\"Remove-AzVmssGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssGalleryApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssNetworkInterfaceConfiguration\",\"ListItemText\":\"Remove-AzVmssNetworkInterfaceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssNetworkInterfaceConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssRunCommand\",\"ListItemText\":\"Remove-AzVmssRunCommand\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssRunCommand\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssVMDataDisk\",\"ListItemText\":\"Remove-AzVmssVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssVMDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssVMRunCommand\",\"ListItemText\":\"Remove-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzVmssVMRunCommand \\r\\n\"},{\"CompletionText\":\"Remove-AzVpnClientIpsecParameter\",\"ListItemText\":\"Remove-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnClientRevokedCertificate\",\"ListItemText\":\"Remove-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnClientRootCertificate\",\"ListItemText\":\"Remove-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnConnection\",\"ListItemText\":\"Remove-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnGateway\",\"ListItemText\":\"Remove-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnGatewayNatRule\",\"ListItemText\":\"Remove-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnServerConfiguration\",\"ListItemText\":\"Remove-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"Remove-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnSite\",\"ListItemText\":\"Remove-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnSite\\r\\n\"},{\"CompletionText\":\"Remove-AzWcfRelay\",\"ListItemText\":\"Remove-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"Remove-AzWebApp\",\"ListItemText\":\"Remove-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebApp\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppAccessRestrictionRule\",\"ListItemText\":\"Remove-AzWebAppAccessRestrictionRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppAccessRestrictionRule\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppBackup\",\"ListItemText\":\"Remove-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppCertificate\",\"ListItemText\":\"Remove-AzWebAppCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppContinuousWebJob\",\"ListItemText\":\"Remove-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSlot\",\"ListItemText\":\"Remove-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Remove-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSlotTriggeredWebJob\",\"ListItemText\":\"Remove-AzWebAppSlotTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppSlotTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSSLBinding\",\"ListItemText\":\"Remove-AzWebAppSSLBinding\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppSSLBinding\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppTrafficRouting\",\"ListItemText\":\"Remove-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppTriggeredWebJob\",\"ListItemText\":\"Remove-AzWebAppTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSub\",\"ListItemText\":\"Remove-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSubCustomCertificate\",\"ListItemText\":\"Remove-AzWebPubSubCustomCertificate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSubCustomCertificate \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSubCustomDomain\",\"ListItemText\":\"Remove-AzWebPubSubCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSubCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSubHub\",\"ListItemText\":\"Remove-AzWebPubSubHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSubHub \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdApplication\",\"ListItemText\":\"Remove-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdApplicationGroup\",\"ListItemText\":\"Remove-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdHostPool\",\"ListItemText\":\"Remove-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdMsixPackage\",\"ListItemText\":\"Remove-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdRegistrationInfo\",\"ListItemText\":\"Remove-AzWvdRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdRegistrationInfo \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdScalingPlan\",\"ListItemText\":\"Remove-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"Remove-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdSessionHost\",\"ListItemText\":\"Remove-AzWvdSessionHost\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdSessionHost \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdUserSession\",\"ListItemText\":\"Remove-AzWvdUserSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdUserSession \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdWorkspace\",\"ListItemText\":\"Remove-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-BCDataCacheExtension\",\"ListItemText\":\"Remove-BCDataCacheExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-BCDataCacheExtension \\r\\n\"},{\"CompletionText\":\"Remove-BcdElement\",\"ListItemText\":\"Remove-BcdElement\",\"ResultType\":2,\"ToolTip\":\"Remove-BcdElement\\r\\n\"},{\"CompletionText\":\"Remove-BcdEntry\",\"ListItemText\":\"Remove-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-BcdEntry\\r\\n\"},{\"CompletionText\":\"Remove-BitLockerKeyProtector\",\"ListItemText\":\"Remove-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"Remove-BitsTransfer\",\"ListItemText\":\"Remove-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Remove-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Remove-CertificateEnrollmentPolicyServer\",\"ListItemText\":\"Remove-CertificateEnrollmentPolicyServer\",\"ResultType\":2,\"ToolTip\":\"Remove-CertificateEnrollmentPolicyServer\\r\\n\"},{\"CompletionText\":\"Remove-CertificateNotificationTask\",\"ListItemText\":\"Remove-CertificateNotificationTask\",\"ResultType\":2,\"ToolTip\":\"Remove-CertificateNotificationTask\\r\\n\"},{\"CompletionText\":\"Remove-CimInstance\",\"ListItemText\":\"Remove-CimInstance\",\"ResultType\":2,\"ToolTip\":\"Remove-CimInstance\\r\\n\"},{\"CompletionText\":\"Remove-CimSession\",\"ListItemText\":\"Remove-CimSession\",\"ResultType\":2,\"ToolTip\":\"Remove-CimSession\\r\\n\"},{\"CompletionText\":\"Remove-CIPolicyRule\",\"ListItemText\":\"Remove-CIPolicyRule\",\"ResultType\":2,\"ToolTip\":\"Remove-CIPolicyRule\\r\\n\"},{\"CompletionText\":\"Remove-DAEntryPointTableItem\",\"ListItemText\":\"Remove-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Remove-DnsClientDohServerAddress\",\"ListItemText\":\"Remove-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Remove-DnsClientNrptRule\",\"ListItemText\":\"Remove-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Remove-DscConfigurationDocument\",\"ListItemText\":\"Remove-DscConfigurationDocument\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DscConfigurationDocument \\r\\n\"},{\"CompletionText\":\"Remove-DtcClusterTMMapping\",\"ListItemText\":\"Remove-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Remove-EtwTraceProvider\",\"ListItemText\":\"Remove-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Remove-EtwTraceSession\",\"ListItemText\":\"Remove-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"Remove-EtwTraceSession\"},{\"CompletionText\":\"Remove-Event\",\"ListItemText\":\"Remove-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Event [-SourceIdentifier] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Event [-EventIdentifier] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-FileShare\",\"ListItemText\":\"Remove-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-FileShare \\r\\n\"},{\"CompletionText\":\"Remove-GitBranch\",\"ListItemText\":\"Remove-GitBranch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-GitBranch \\r\\n\"},{\"CompletionText\":\"Remove-HgsClientHostKey\",\"ListItemText\":\"Remove-HgsClientHostKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HgsClientHostKey \\r\\n\"},{\"CompletionText\":\"Remove-HgsGuardian\",\"ListItemText\":\"Remove-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Remove-HnsEndpoint\",\"ListItemText\":\"Remove-HnsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-HnsNamespace\",\"ListItemText\":\"Remove-HnsNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsNamespace \\r\\n\"},{\"CompletionText\":\"Remove-HnsNetwork\",\"ListItemText\":\"Remove-HnsNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsNetwork \\r\\n\"},{\"CompletionText\":\"Remove-HnsPolicyList\",\"ListItemText\":\"Remove-HnsPolicyList\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsPolicyList \\r\\n\"},{\"CompletionText\":\"Remove-InitiatorId\",\"ListItemText\":\"Remove-InitiatorId\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-InitiatorId \\r\\n\"},{\"CompletionText\":\"Remove-InitiatorIdFromMaskingSet\",\"ListItemText\":\"Remove-InitiatorIdFromMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-InitiatorIdFromMaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-IscsiTargetPortal\",\"ListItemText\":\"Remove-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"Remove-Item\",\"ListItemText\":\"Remove-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Item [-Path] [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\\r\\nRemove-Item -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Remove-ItemProperty\",\"ListItemText\":\"Remove-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-ItemProperty [-Path] [-Name] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-ItemProperty [-Name] -LiteralPath [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-Job\",\"ListItemText\":\"Remove-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Job [-Id] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Job] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-InstanceId] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Name] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Filter] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-State] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Command ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-JobTrigger\",\"ListItemText\":\"Remove-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-JobTrigger\\r\\n\"},{\"CompletionText\":\"Remove-LocalGroup\",\"ListItemText\":\"Remove-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-LocalGroup\\r\\n\"},{\"CompletionText\":\"Remove-LocalGroupMember\",\"ListItemText\":\"Remove-LocalGroupMember\",\"ResultType\":2,\"ToolTip\":\"Remove-LocalGroupMember\\r\\n\"},{\"CompletionText\":\"Remove-LocalUser\",\"ListItemText\":\"Remove-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Remove-LocalUser\\r\\n\"},{\"CompletionText\":\"Remove-MaskingSet\",\"ListItemText\":\"Remove-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-Module\",\"ListItemText\":\"Remove-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Module [-Name] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Module [-FullyQualifiedName] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Module [-ModuleInfo] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-MpPreference\",\"ListItemText\":\"Remove-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpPreference \\r\\n\"},{\"CompletionText\":\"Remove-MpThreat\",\"ListItemText\":\"Remove-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpThreat \\r\\n\"},{\"CompletionText\":\"Remove-NetAdapterAdvancedProperty\",\"ListItemText\":\"Remove-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Remove-NetEventNetworkAdapter\",\"ListItemText\":\"Remove-NetEventNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Remove-NetEventPacketCaptureProvider\",\"ListItemText\":\"Remove-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventProvider\",\"ListItemText\":\"Remove-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventSession\",\"ListItemText\":\"Remove-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventSession \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVFPProvider\",\"ListItemText\":\"Remove-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVmNetworkAdapter\",\"ListItemText\":\"Remove-NetEventVmNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVmNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVmSwitch\",\"ListItemText\":\"Remove-NetEventVmSwitch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVmSwitch \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVmSwitchProvider\",\"ListItemText\":\"Remove-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventWFPCaptureProvider\",\"ListItemText\":\"Remove-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"Remove-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallHyperVProfile\",\"ListItemText\":\"Remove-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallHyperVRule\",\"ListItemText\":\"Remove-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallHyperVVMSetting\",\"ListItemText\":\"Remove-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallRule\",\"ListItemText\":\"Remove-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-NetIPAddress\",\"ListItemText\":\"Remove-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetIPHttpsCertBinding\",\"ListItemText\":\"Remove-NetIPHttpsCertBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPHttpsCertBinding \\r\\n\"},{\"CompletionText\":\"Remove-NetIPHttpsConfiguration\",\"ListItemText\":\"Remove-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecDospSetting\",\"ListItemText\":\"Remove-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Remove-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecMainModeRule\",\"ListItemText\":\"Remove-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecMainModeSA\",\"ListItemText\":\"Remove-NetIPsecMainModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecMainModeSA \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Remove-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Remove-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Remove-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecQuickModeSA\",\"ListItemText\":\"Remove-NetIPsecQuickModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecQuickModeSA \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecRule\",\"ListItemText\":\"Remove-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Remove-NetLbfoTeam\",\"ListItemText\":\"Remove-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Remove-NetLbfoTeamMember\",\"ListItemText\":\"Remove-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Remove-NetLbfoTeamNic\",\"ListItemText\":\"Remove-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Remove-NetNat\",\"ListItemText\":\"Remove-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNat \\r\\n\"},{\"CompletionText\":\"Remove-NetNatExternalAddress\",\"ListItemText\":\"Remove-NetNatExternalAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNatExternalAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetNatStaticMapping\",\"ListItemText\":\"Remove-NetNatStaticMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNatStaticMapping \\r\\n\"},{\"CompletionText\":\"Remove-NetNatTransitionConfiguration\",\"ListItemText\":\"Remove-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-NetNeighbor\",\"ListItemText\":\"Remove-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNeighbor \\r\\n\"},{\"CompletionText\":\"Remove-NetQosPolicy\",\"ListItemText\":\"Remove-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"Remove-NetRoute\",\"ListItemText\":\"Remove-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetRoute \\r\\n\"},{\"CompletionText\":\"Remove-NetSwitchTeam\",\"ListItemText\":\"Remove-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"Remove-NetSwitchTeamMember\",\"ListItemText\":\"Remove-NetSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetSwitchTeamMember \\r\\n\"},{\"CompletionText\":\"Remove-NetTransportFilter\",\"ListItemText\":\"Remove-NetTransportFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetTransportFilter \\r\\n\"},{\"CompletionText\":\"Remove-NetworkSwitchEthernetPortIPAddress\",\"ListItemText\":\"Remove-NetworkSwitchEthernetPortIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetworkSwitchEthernetPortIPAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetworkSwitchVlan\",\"ListItemText\":\"Remove-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Remove-OdbcDsn\",\"ListItemText\":\"Remove-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Remove-Partition\",\"ListItemText\":\"Remove-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Partition \\r\\n\"},{\"CompletionText\":\"Remove-PartitionAccessPath\",\"ListItemText\":\"Remove-PartitionAccessPath\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PartitionAccessPath \\r\\n\"},{\"CompletionText\":\"Remove-PhysicalDisk\",\"ListItemText\":\"Remove-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Remove-PmemDedicatedMemory\",\"ListItemText\":\"Remove-PmemDedicatedMemory\",\"ResultType\":2,\"ToolTip\":\"Remove-PmemDedicatedMemory\\r\\n\"},{\"CompletionText\":\"Remove-PmemDisk\",\"ListItemText\":\"Remove-PmemDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-PmemDisk\\r\\n\"},{\"CompletionText\":\"Remove-PoshGitFromProfile\",\"ListItemText\":\"Remove-PoshGitFromProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PoshGitFromProfile \\r\\n\"},{\"CompletionText\":\"Remove-Printer\",\"ListItemText\":\"Remove-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Printer \\r\\n\"},{\"CompletionText\":\"Remove-PrinterDriver\",\"ListItemText\":\"Remove-PrinterDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PrinterDriver \\r\\n\"},{\"CompletionText\":\"Remove-PrinterPort\",\"ListItemText\":\"Remove-PrinterPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PrinterPort \\r\\n\"},{\"CompletionText\":\"Remove-PrintJob\",\"ListItemText\":\"Remove-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PrintJob \\r\\n\"},{\"CompletionText\":\"Remove-ProvisionedAppPackage\",\"ListItemText\":\"Remove-ProvisionedAppPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisionedAppPackage\"},{\"CompletionText\":\"Remove-ProvisionedAppSharedPackageContainer\",\"ListItemText\":\"Remove-ProvisionedAppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisionedAppSharedPackageContainer\"},{\"CompletionText\":\"Remove-ProvisionedAppxPackage\",\"ListItemText\":\"Remove-ProvisionedAppxPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisionedAppxPackage\"},{\"CompletionText\":\"Remove-ProvisioningPackage\",\"ListItemText\":\"Remove-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisioningPackage\"},{\"CompletionText\":\"Remove-PSBreakpoint\",\"ListItemText\":\"Remove-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSBreakpoint [-Breakpoint] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSBreakpoint [-Id] [-Runspace ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-PSDrive\",\"ListItemText\":\"Remove-PSDrive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSDrive [-Name] [-PSProvider ] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSDrive [-LiteralName] [-PSProvider ] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-PSReadLineKeyHandler\",\"ListItemText\":\"Remove-PSReadLineKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSReadLineKeyHandler [-Chord] [-ViMode ] []\\r\\n\"},{\"CompletionText\":\"Remove-PSSession\",\"ListItemText\":\"Remove-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSSession [-Id] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession [-Session] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -ContainerId [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -VMId [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -VMName [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -InstanceId [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -Name [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession [-ComputerName] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-Service\",\"ListItemText\":\"Remove-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Service [-Name] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Service [-InputObject ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-SmbBandwidthLimit\",\"ListItemText\":\"Remove-SmbBandwidthLimit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbBandwidthLimit \\r\\n\"},{\"CompletionText\":\"Remove-SmbClientCertificateMapping\",\"ListItemText\":\"Remove-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"Remove-SMBComponent\",\"ListItemText\":\"Remove-SMBComponent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SMBComponent \\r\\n\"},{\"CompletionText\":\"Remove-SmbGlobalMapping\",\"ListItemText\":\"Remove-SmbGlobalMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbGlobalMapping \\r\\n\"},{\"CompletionText\":\"Remove-SmbMapping\",\"ListItemText\":\"Remove-SmbMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbMapping \\r\\n\"},{\"CompletionText\":\"Remove-SmbMultichannelConstraint\",\"ListItemText\":\"Remove-SmbMultichannelConstraint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbMultichannelConstraint \\r\\n\"},{\"CompletionText\":\"Remove-SmbServerCertificateMapping\",\"ListItemText\":\"Remove-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"Remove-SmbShare\",\"ListItemText\":\"Remove-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbShare \\r\\n\"},{\"CompletionText\":\"Remove-StorageBusBinding\",\"ListItemText\":\"Remove-StorageBusBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageBusBinding \\r\\n\"},{\"CompletionText\":\"Remove-StorageFaultDomain\",\"ListItemText\":\"Remove-StorageFaultDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageFaultDomain \\r\\n\"},{\"CompletionText\":\"Remove-StorageFileServer\",\"ListItemText\":\"Remove-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageFileServer \\r\\n\"},{\"CompletionText\":\"Remove-StorageHealthIntent\",\"ListItemText\":\"Remove-StorageHealthIntent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageHealthIntent \\r\\n\"},{\"CompletionText\":\"Remove-StorageHealthSetting\",\"ListItemText\":\"Remove-StorageHealthSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageHealthSetting \\r\\n\"},{\"CompletionText\":\"Remove-StoragePool\",\"ListItemText\":\"Remove-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StoragePool \\r\\n\"},{\"CompletionText\":\"Remove-StorageTier\",\"ListItemText\":\"Remove-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageTier \\r\\n\"},{\"CompletionText\":\"Remove-TargetPortFromMaskingSet\",\"ListItemText\":\"Remove-TargetPortFromMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-TargetPortFromMaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-TrustedProvisioningCertificate\",\"ListItemText\":\"Remove-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-TrustedProvisioningCertificate\"},{\"CompletionText\":\"Remove-TypeData\",\"ListItemText\":\"Remove-TypeData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-TypeData -TypeData [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-TypeData [-TypeName] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-TypeData -Path [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-Variable\",\"ListItemText\":\"Remove-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Variable [-Name] [-Include ] [-Exclude ] [-Force] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-VHDSnapshot\",\"ListItemText\":\"Remove-VHDSnapshot\",\"ResultType\":2,\"ToolTip\":\"Remove-VHDSnapshot\\r\\n\"},{\"CompletionText\":\"Remove-VirtualDisk\",\"ListItemText\":\"Remove-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Remove-VirtualDiskFromMaskingSet\",\"ListItemText\":\"Remove-VirtualDiskFromMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VirtualDiskFromMaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-VM\",\"ListItemText\":\"Remove-VM\",\"ResultType\":2,\"ToolTip\":\"Remove-VM\\r\\n\"},{\"CompletionText\":\"Remove-VMAssignableDevice\",\"ListItemText\":\"Remove-VMAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-VMAssignableDevice\\r\\n\"},{\"CompletionText\":\"Remove-VMCheckpoint\",\"ListItemText\":\"Remove-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-VMCheckpoint\"},{\"CompletionText\":\"Remove-VMDirectVirtualDisk\",\"ListItemText\":\"Remove-VMDirectVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VMDirectVirtualDisk \\r\\n\"},{\"CompletionText\":\"Remove-VMDvdDrive\",\"ListItemText\":\"Remove-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Remove-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Remove-VMFibreChannelHba\",\"ListItemText\":\"Remove-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Remove-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Remove-VMGpuPartitionAdapter\",\"ListItemText\":\"Remove-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Remove-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Remove-VMGroup\",\"ListItemText\":\"Remove-VMGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-VMGroup\\r\\n\"},{\"CompletionText\":\"Remove-VMGroupMember\",\"ListItemText\":\"Remove-VMGroupMember\",\"ResultType\":2,\"ToolTip\":\"Remove-VMGroupMember\\r\\n\"},{\"CompletionText\":\"Remove-VMHardDiskDrive\",\"ListItemText\":\"Remove-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Remove-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Remove-VMHostAssignableDevice\",\"ListItemText\":\"Remove-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Remove-VMKeyStorageDrive\",\"ListItemText\":\"Remove-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Remove-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Remove-VMMigrationNetwork\",\"ListItemText\":\"Remove-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Remove-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapter\",\"ListItemText\":\"Remove-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterAcl\",\"ListItemText\":\"Remove-VMNetworkAdapterAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterAcl\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterExtendedAcl\",\"ListItemText\":\"Remove-VMNetworkAdapterExtendedAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterExtendedAcl\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Remove-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterTeamMapping\",\"ListItemText\":\"Remove-VMNetworkAdapterTeamMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterTeamMapping\\r\\n\"},{\"CompletionText\":\"Remove-VMPmemController\",\"ListItemText\":\"Remove-VMPmemController\",\"ResultType\":2,\"ToolTip\":\"Remove-VMPmemController\\r\\n\"},{\"CompletionText\":\"Remove-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Remove-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Remove-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Remove-VMReplication\",\"ListItemText\":\"Remove-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Remove-VMReplication\\r\\n\"},{\"CompletionText\":\"Remove-VMReplicationAuthorizationEntry\",\"ListItemText\":\"Remove-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"Remove-VMResourcePool\",\"ListItemText\":\"Remove-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Remove-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Remove-VMSan\",\"ListItemText\":\"Remove-VMSan\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSan\\r\\n\"},{\"CompletionText\":\"Remove-VMSavedState\",\"ListItemText\":\"Remove-VMSavedState\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSavedState\\r\\n\"},{\"CompletionText\":\"Remove-VMScsiController\",\"ListItemText\":\"Remove-VMScsiController\",\"ResultType\":2,\"ToolTip\":\"Remove-VMScsiController\\r\\n\"},{\"CompletionText\":\"Remove-VMSnapshot\",\"ListItemText\":\"Remove-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Remove-VMStoragePath\",\"ListItemText\":\"Remove-VMStoragePath\",\"ResultType\":2,\"ToolTip\":\"Remove-VMStoragePath\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitch\",\"ListItemText\":\"Remove-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitch\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Remove-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Remove-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitchTeamMember\",\"ListItemText\":\"Remove-VMSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitchTeamMember\\r\\n\"},{\"CompletionText\":\"Remove-VpnConnection\",\"ListItemText\":\"Remove-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnection \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionRoute\",\"ListItemText\":\"Remove-VpnConnectionRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionRoute \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionTriggerApplication\",\"ListItemText\":\"Remove-VpnConnectionTriggerApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionTriggerApplication \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionTriggerDnsConfiguration\",\"ListItemText\":\"Remove-VpnConnectionTriggerDnsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionTriggerDnsConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionTriggerTrustedNetwork\",\"ListItemText\":\"Remove-VpnConnectionTriggerTrustedNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionTriggerTrustedNetwork \\r\\n\"},{\"CompletionText\":\"Remove-WindowsCapability\",\"ListItemText\":\"Remove-WindowsCapability\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsCapability\\r\\n\"},{\"CompletionText\":\"Remove-WindowsDriver\",\"ListItemText\":\"Remove-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Remove-WindowsImage\",\"ListItemText\":\"Remove-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsImage\\r\\n\"},{\"CompletionText\":\"Remove-WindowsPackage\",\"ListItemText\":\"Remove-WindowsPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsPackage\\r\\n\"},{\"CompletionText\":\"Remove-WSManInstance\",\"ListItemText\":\"Remove-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"Remove-WSManInstance\\r\\n\"},{\"CompletionText\":\"ren\",\"ListItemText\":\"ren\",\"ResultType\":2,\"ToolTip\":\"Rename-Item\"},{\"CompletionText\":\"Rename-AzContext\",\"ListItemText\":\"Rename-AzContext\",\"ResultType\":2,\"ToolTip\":\"Rename-AzContext\\r\\n\"},{\"CompletionText\":\"Rename-AzStorageDirectory\",\"ListItemText\":\"Rename-AzStorageDirectory\",\"ResultType\":2,\"ToolTip\":\"Rename-AzStorageDirectory\\r\\n\"},{\"CompletionText\":\"Rename-AzStorageFile\",\"ListItemText\":\"Rename-AzStorageFile\",\"ResultType\":2,\"ToolTip\":\"Rename-AzStorageFile\\r\\n\"},{\"CompletionText\":\"Rename-Computer\",\"ListItemText\":\"Rename-Computer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-Computer [-NewName] [-ComputerName ] [-PassThru] [-DomainCredential ] [-LocalCredential ] [-Force] [-Restart] [-WsmanAuthentication ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Rename-DAEntryPointTableItem\",\"ListItemText\":\"Rename-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Rename-Item\",\"ListItemText\":\"Rename-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-Item [-Path] [-NewName] [-Force] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRename-Item [-NewName] -LiteralPath [-Force] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Rename-ItemProperty\",\"ListItemText\":\"Rename-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-ItemProperty [-Path] [-Name] [-NewName] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRename-ItemProperty [-Name] [-NewName] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Rename-LocalGroup\",\"ListItemText\":\"Rename-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Rename-LocalGroup\\r\\n\"},{\"CompletionText\":\"Rename-LocalUser\",\"ListItemText\":\"Rename-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Rename-LocalUser\\r\\n\"},{\"CompletionText\":\"Rename-MaskingSet\",\"ListItemText\":\"Rename-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-MaskingSet \\r\\n\"},{\"CompletionText\":\"Rename-NetAdapter\",\"ListItemText\":\"Rename-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetAdapter \\r\\n\"},{\"CompletionText\":\"Rename-NetFirewallHyperVRule\",\"ListItemText\":\"Rename-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Rename-NetFirewallRule\",\"ListItemText\":\"Rename-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Rename-NetIPHttpsConfiguration\",\"ListItemText\":\"Rename-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Rename-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecMainModeRule\",\"ListItemText\":\"Rename-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Rename-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Rename-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Rename-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecRule\",\"ListItemText\":\"Rename-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Rename-NetLbfoTeam\",\"ListItemText\":\"Rename-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Rename-NetSwitchTeam\",\"ListItemText\":\"Rename-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"Rename-Printer\",\"ListItemText\":\"Rename-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-Printer \\r\\n\"},{\"CompletionText\":\"Rename-VM\",\"ListItemText\":\"Rename-VM\",\"ResultType\":2,\"ToolTip\":\"Rename-VM\\r\\n\"},{\"CompletionText\":\"Rename-VMCheckpoint\",\"ListItemText\":\"Rename-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Rename-VMCheckpoint\"},{\"CompletionText\":\"Rename-VMGroup\",\"ListItemText\":\"Rename-VMGroup\",\"ResultType\":2,\"ToolTip\":\"Rename-VMGroup\\r\\n\"},{\"CompletionText\":\"Rename-VMNetworkAdapter\",\"ListItemText\":\"Rename-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Rename-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Rename-VMResourcePool\",\"ListItemText\":\"Rename-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Rename-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Rename-VMSan\",\"ListItemText\":\"Rename-VMSan\",\"ResultType\":2,\"ToolTip\":\"Rename-VMSan\\r\\n\"},{\"CompletionText\":\"Rename-VMSnapshot\",\"ListItemText\":\"Rename-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Rename-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Rename-VMSwitch\",\"ListItemText\":\"Rename-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Rename-VMSwitch\\r\\n\"},{\"CompletionText\":\"Repair-AzVmssServiceFabricUD\",\"ListItemText\":\"Repair-AzVmssServiceFabricUD\",\"ResultType\":2,\"ToolTip\":\"Repair-AzVmssServiceFabricUD\"},{\"CompletionText\":\"Repair-AzVmssServiceFabricUpdateDomain\",\"ListItemText\":\"Repair-AzVmssServiceFabricUpdateDomain\",\"ResultType\":2,\"ToolTip\":\"Repair-AzVmssServiceFabricUpdateDomain\\r\\n\"},{\"CompletionText\":\"repair-bde.exe\",\"ListItemText\":\"repair-bde.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\repair-bde.exe\"},{\"CompletionText\":\"Repair-FileIntegrity\",\"ListItemText\":\"Repair-FileIntegrity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRepair-FileIntegrity \\r\\n\"},{\"CompletionText\":\"Repair-VirtualDisk\",\"ListItemText\":\"Repair-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRepair-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Repair-VM\",\"ListItemText\":\"Repair-VM\",\"ResultType\":2,\"ToolTip\":\"Repair-VM\\r\\n\"},{\"CompletionText\":\"Repair-Volume\",\"ListItemText\":\"Repair-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRepair-Volume \\r\\n\"},{\"CompletionText\":\"Repair-WindowsImage\",\"ListItemText\":\"Repair-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Repair-WindowsImage\\r\\n\"},{\"CompletionText\":\"replace.exe\",\"ListItemText\":\"replace.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\replace.exe\"},{\"CompletionText\":\"Reset-AppPackage\",\"ListItemText\":\"Reset-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Reset-AppPackage\"},{\"CompletionText\":\"Reset-AppSharedPackageContainer\",\"ListItemText\":\"Reset-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Reset-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Reset-AppxPackage\",\"ListItemText\":\"Reset-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Reset-AppxPackage\\r\\n\"},{\"CompletionText\":\"Reset-AzAttestationPolicy\",\"ListItemText\":\"Reset-AzAttestationPolicy\",\"ResultType\":2,\"ToolTip\":\"Reset-AzAttestationPolicy\\r\\n\"},{\"CompletionText\":\"Reset-AzBatchComputeNode\",\"ListItemText\":\"Reset-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Reset-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Reset-AzHubRouter\",\"ListItemText\":\"Reset-AzHubRouter\",\"ResultType\":2,\"ToolTip\":\"Reset-AzHubRouter\\r\\n\"},{\"CompletionText\":\"Reset-AzP2sVpnGateway\",\"ListItemText\":\"Reset-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Reset-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKey\",\"ListItemText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKey\",\"ResultType\":2,\"ToolTip\":\"Reset-AzPowerBIWorkspaceCollectionAccessKey\\r\\n\"},{\"CompletionText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKeys\",\"ListItemText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKeys\",\"ResultType\":2,\"ToolTip\":\"Reset-AzPowerBIWorkspaceCollectionAccessKeys\"},{\"CompletionText\":\"Reset-AzRedisCache\",\"ListItemText\":\"Reset-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Reset-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Reset-AzStaticWebAppApiKey\",\"ListItemText\":\"Reset-AzStaticWebAppApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-AzStaticWebAppApiKey \\r\\n\"},{\"CompletionText\":\"Reset-AzStorageSyncServerCertificate\",\"ListItemText\":\"Reset-AzStorageSyncServerCertificate\",\"ResultType\":2,\"ToolTip\":\"Reset-AzStorageSyncServerCertificate\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSparkSessionTimeout\",\"ListItemText\":\"Reset-AzSynapseSparkSessionTimeout\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSparkSessionTimeout\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Reset-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlAuditSetting\",\"ListItemText\":\"Reset-AzSynapseSqlAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlAuditSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Reset-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlPoolAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlPoolAuditSetting\",\"ListItemText\":\"Reset-AzSynapseSqlPoolAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlPoolAuditSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Reset-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlPoolVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Reset-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzVirtualNetworkGateway\",\"ListItemText\":\"Reset-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Reset-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Reset-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Reset-AzVirtualNetworkGatewayConnectionSharedKey\",\"ListItemText\":\"Reset-AzVirtualNetworkGatewayConnectionSharedKey\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVirtualNetworkGatewayConnectionSharedKey\\r\\n\"},{\"CompletionText\":\"Reset-AzVpnGateway\",\"ListItemText\":\"Reset-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Reset-AzVpnSiteLinkConnection\",\"ListItemText\":\"Reset-AzVpnSiteLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVpnSiteLinkConnection\\r\\n\"},{\"CompletionText\":\"Reset-AzWebAppPublishingProfile\",\"ListItemText\":\"Reset-AzWebAppPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Reset-AzWebAppPublishingProfile\\r\\n\"},{\"CompletionText\":\"Reset-AzWebAppSlotPublishingProfile\",\"ListItemText\":\"Reset-AzWebAppSlotPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Reset-AzWebAppSlotPublishingProfile\\r\\n\"},{\"CompletionText\":\"Reset-BC\",\"ListItemText\":\"Reset-BC\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-BC \\r\\n\"},{\"CompletionText\":\"Reset-DAClientExperienceConfiguration\",\"ListItemText\":\"Reset-DAClientExperienceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-DAClientExperienceConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-DAEntryPointTableItem\",\"ListItemText\":\"Reset-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Reset-DtcLog\",\"ListItemText\":\"Reset-DtcLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-DtcLog \\r\\n\"},{\"CompletionText\":\"Reset-LapsPassword\",\"ListItemText\":\"Reset-LapsPassword\",\"ResultType\":2,\"ToolTip\":\"Reset-LapsPassword\\r\\n\"},{\"CompletionText\":\"Reset-NCSIPolicyConfiguration\",\"ListItemText\":\"Reset-NCSIPolicyConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NCSIPolicyConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-Net6to4Configuration\",\"ListItemText\":\"Reset-Net6to4Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-Net6to4Configuration \\r\\n\"},{\"CompletionText\":\"Reset-NetAdapterAdvancedProperty\",\"ListItemText\":\"Reset-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Reset-NetDnsTransitionConfiguration\",\"ListItemText\":\"Reset-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-NetIPHttpsConfiguration\",\"ListItemText\":\"Reset-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-NetIsatapConfiguration\",\"ListItemText\":\"Reset-NetIsatapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetIsatapConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-NetTeredoConfiguration\",\"ListItemText\":\"Reset-NetTeredoConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetTeredoConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-PhysicalDisk\",\"ListItemText\":\"Reset-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Reset-SmbClientConfiguration\",\"ListItemText\":\"Reset-SmbClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-SmbClientConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-SmbServerConfiguration\",\"ListItemText\":\"Reset-SmbServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-SmbServerConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-StorageReliabilityCounter\",\"ListItemText\":\"Reset-StorageReliabilityCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-StorageReliabilityCounter \\r\\n\"},{\"CompletionText\":\"Reset-VMReplicationStatistics\",\"ListItemText\":\"Reset-VMReplicationStatistics\",\"ResultType\":2,\"ToolTip\":\"Reset-VMReplicationStatistics\\r\\n\"},{\"CompletionText\":\"Reset-VMResourceMetering\",\"ListItemText\":\"Reset-VMResourceMetering\",\"ResultType\":2,\"ToolTip\":\"Reset-VMResourceMetering\\r\\n\"},{\"CompletionText\":\"Reset-WinhttpProxy\",\"ListItemText\":\"Reset-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"reset.exe\",\"ListItemText\":\"reset.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\reset.exe\"},{\"CompletionText\":\"ResetEngine.exe\",\"ListItemText\":\"ResetEngine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ResetEngine.exe\"},{\"CompletionText\":\"Resize-AzVirtualNetworkGateway\",\"ListItemText\":\"Resize-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Resize-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Resize-Partition\",\"ListItemText\":\"Resize-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResize-Partition \\r\\n\"},{\"CompletionText\":\"Resize-StorageTier\",\"ListItemText\":\"Resize-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResize-StorageTier \\r\\n\"},{\"CompletionText\":\"Resize-VHD\",\"ListItemText\":\"Resize-VHD\",\"ResultType\":2,\"ToolTip\":\"Resize-VHD\\r\\n\"},{\"CompletionText\":\"Resize-VirtualDisk\",\"ListItemText\":\"Resize-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResize-VirtualDisk \\r\\n\"},{\"CompletionText\":\"resmon.exe\",\"ListItemText\":\"resmon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\resmon.exe\"},{\"CompletionText\":\"Resolve-AzError\",\"ListItemText\":\"Resolve-AzError\",\"ResultType\":2,\"ToolTip\":\"Resolve-AzError\\r\\n\"},{\"CompletionText\":\"Resolve-AzResourceMoverMoveCollectionDependency\",\"ListItemText\":\"Resolve-AzResourceMoverMoveCollectionDependency\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResolve-AzResourceMoverMoveCollectionDependency \\r\\n\"},{\"CompletionText\":\"Resolve-DnsName\",\"ListItemText\":\"Resolve-DnsName\",\"ResultType\":2,\"ToolTip\":\"Resolve-DnsName\\r\\n\"},{\"CompletionText\":\"Resolve-Error\",\"ListItemText\":\"Resolve-Error\",\"ResultType\":2,\"ToolTip\":\"Resolve-Error\"},{\"CompletionText\":\"Resolve-Path\",\"ListItemText\":\"Resolve-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResolve-Path [-Path] [-Relative] [-RelativeBasePath ] [-Credential ] []\\r\\n\\r\\nResolve-Path -LiteralPath [-Relative] [-RelativeBasePath ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Restart-ASRJob\",\"ListItemText\":\"Restart-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Restart-ASRJob\"},{\"CompletionText\":\"Restart-AzAnalysisServicesInstance\",\"ListItemText\":\"Restart-AzAnalysisServicesInstance\",\"ResultType\":2,\"ToolTip\":\"Restart-AzAnalysisServicesInstance\\r\\n\"},{\"CompletionText\":\"Restart-AzAsInstance\",\"ListItemText\":\"Restart-AzAsInstance\",\"ResultType\":2,\"ToolTip\":\"Restart-AzAsInstance\"},{\"CompletionText\":\"Restart-AzBatchComputeNode\",\"ListItemText\":\"Restart-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Restart-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Restart-AzCloudService\",\"ListItemText\":\"Restart-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzCloudService \\r\\n\"},{\"CompletionText\":\"Restart-AzCloudServiceRoleInstance\",\"ListItemText\":\"Restart-AzCloudServiceRoleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzCloudServiceRoleInstance \\r\\n\"},{\"CompletionText\":\"Restart-AzContainerGroup\",\"ListItemText\":\"Restart-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Restart-AzDeploymentManagerRollout\",\"ListItemText\":\"Restart-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Restart-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Restart-AzFunctionApp\",\"ListItemText\":\"Restart-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Restart-AzHDInsightHost\",\"ListItemText\":\"Restart-AzHDInsightHost\",\"ResultType\":2,\"ToolTip\":\"Restart-AzHDInsightHost\\r\\n\"},{\"CompletionText\":\"Restart-AzHost\",\"ListItemText\":\"Restart-AzHost\",\"ResultType\":2,\"ToolTip\":\"Restart-AzHost\\r\\n\"},{\"CompletionText\":\"Restart-AzMigrateServerReplication\",\"ListItemText\":\"Restart-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Restart-AzMLWorkspaceCompute\",\"ListItemText\":\"Restart-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Restart-AzMySqlFlexibleServer\",\"ListItemText\":\"Restart-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restart-AzMySqlServer\",\"ListItemText\":\"Restart-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Restart-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Restart-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restart-AzPostgreSqlServer\",\"ListItemText\":\"Restart-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Restart-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Restart-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Restart-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Restart-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Restart-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Restart-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Restart-AzSignalR\",\"ListItemText\":\"Restart-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Restart-AzSignalR\\r\\n\"},{\"CompletionText\":\"Restart-AzureAsInstance\",\"ListItemText\":\"Restart-AzureAsInstance\",\"ResultType\":2,\"ToolTip\":\"Restart-AzureAsInstance\"},{\"CompletionText\":\"Restart-AzVM\",\"ListItemText\":\"Restart-AzVM\",\"ResultType\":2,\"ToolTip\":\"Restart-AzVM\\r\\n\"},{\"CompletionText\":\"Restart-AzVmss\",\"ListItemText\":\"Restart-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Restart-AzVmss\\r\\n\"},{\"CompletionText\":\"Restart-AzWebApp\",\"ListItemText\":\"Restart-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Restart-AzWebApp\\r\\n\"},{\"CompletionText\":\"Restart-AzWebAppSlot\",\"ListItemText\":\"Restart-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Restart-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Restart-AzWebPubSub\",\"ListItemText\":\"Restart-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Restart-Computer\",\"ListItemText\":\"Restart-Computer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-Computer [[-ComputerName] ] [[-Credential] ] [-WsmanAuthentication ] [-Force] [-Wait] [-Timeout ] [-For ] [-Delay ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Restart-NetAdapter\",\"ListItemText\":\"Restart-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-NetAdapter \\r\\n\"},{\"CompletionText\":\"Restart-PcsvDevice\",\"ListItemText\":\"Restart-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Restart-PrintJob\",\"ListItemText\":\"Restart-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-PrintJob \\r\\n\"},{\"CompletionText\":\"Restart-Service\",\"ListItemText\":\"Restart-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-Service [-InputObject] [-Force] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRestart-Service [-Name] [-Force] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRestart-Service -DisplayName [-Force] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Restart-VM\",\"ListItemText\":\"Restart-VM\",\"ResultType\":2,\"ToolTip\":\"Restart-VM\\r\\n\"},{\"CompletionText\":\"Restore-AdlStoreDeletedItem\",\"ListItemText\":\"Restore-AdlStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AdlStoreDeletedItem\"},{\"CompletionText\":\"Restore-AzApiManagement\",\"ListItemText\":\"Restore-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Restore-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Restore-AzCosmosDBAccount\",\"ListItemText\":\"Restore-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Restore-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Restore-AzDataLakeGen2DeletedItem\",\"ListItemText\":\"Restore-AzDataLakeGen2DeletedItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AzDataLakeGen2DeletedItem\\r\\n\"},{\"CompletionText\":\"Restore-AzDataLakeStoreDeletedItem\",\"ListItemText\":\"Restore-AzDataLakeStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AzDataLakeStoreDeletedItem\\r\\n\"},{\"CompletionText\":\"Restore-AzDeletedWebApp\",\"ListItemText\":\"Restore-AzDeletedWebApp\",\"ResultType\":2,\"ToolTip\":\"Restore-AzDeletedWebApp\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVault\",\"ListItemText\":\"Restore-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultCertificate\",\"ListItemText\":\"Restore-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultKey\",\"ListItemText\":\"Restore-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Restore-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultSecret\",\"ListItemText\":\"Restore-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Restore-AzMySqlFlexibleServer\",\"ListItemText\":\"Restore-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restore-AzMySqlServer\",\"ListItemText\":\"Restore-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Restore-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Restore-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Restore-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Restore-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Restore-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restore-AzPostgreSqlServer\",\"ListItemText\":\"Restore-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Restore-AzRecoveryServicesBackupItem\",\"ListItemText\":\"Restore-AzRecoveryServicesBackupItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AzRecoveryServicesBackupItem\\r\\n\"},{\"CompletionText\":\"Restore-AzRmStorageShare\",\"ListItemText\":\"Restore-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Restore-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Restore-AzSqlDatabase\",\"ListItemText\":\"Restore-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Restore-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Restore-AzSqlInstanceDatabase\",\"ListItemText\":\"Restore-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Restore-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Restore-AzStorageBlobRange\",\"ListItemText\":\"Restore-AzStorageBlobRange\",\"ResultType\":2,\"ToolTip\":\"Restore-AzStorageBlobRange\\r\\n\"},{\"CompletionText\":\"Restore-AzStorageContainer\",\"ListItemText\":\"Restore-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Restore-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"Restore-AzSynapseSqlPool\",\"ListItemText\":\"Restore-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Restore-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Restore-AzWebAppBackup\",\"ListItemText\":\"Restore-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"Restore-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"Restore-AzWebAppSnapshot\",\"ListItemText\":\"Restore-AzWebAppSnapshot\",\"ResultType\":2,\"ToolTip\":\"Restore-AzWebAppSnapshot\\r\\n\"},{\"CompletionText\":\"Restore-DscConfiguration\",\"ListItemText\":\"Restore-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Restore-NetworkSwitchConfiguration\",\"ListItemText\":\"Restore-NetworkSwitchConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-NetworkSwitchConfiguration \\r\\n\"},{\"CompletionText\":\"Restore-VMCheckpoint\",\"ListItemText\":\"Restore-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Restore-VMCheckpoint\"},{\"CompletionText\":\"Restore-VMSnapshot\",\"ListItemText\":\"Restore-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Restore-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Resume-ASRJob\",\"ListItemText\":\"Resume-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Resume-ASRJob\"},{\"CompletionText\":\"Resume-AzAnalysisServicesServer\",\"ListItemText\":\"Resume-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Resume-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Resume-AzAs\",\"ListItemText\":\"Resume-AzAs\",\"ResultType\":2,\"ToolTip\":\"Resume-AzAs\"},{\"CompletionText\":\"Resume-AzAutomationJob\",\"ListItemText\":\"Resume-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Resume-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Resume-AzDataFactoryPipeline\",\"ListItemText\":\"Resume-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Resume-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Resume-AzDataProtectionBackupInstanceProtection\",\"ListItemText\":\"Resume-AzDataProtectionBackupInstanceProtection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-AzDataProtectionBackupInstanceProtection \\r\\n\"},{\"CompletionText\":\"Resume-AzMigrateServerReplication\",\"ListItemText\":\"Resume-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Resume-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Resume-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Resume-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Resume-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Resume-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Resume-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Resume-AzSqlDatabase\",\"ListItemText\":\"Resume-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Resume-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Resume-AzSynapseSqlPool\",\"ListItemText\":\"Resume-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Resume-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Resume-BitLocker\",\"ListItemText\":\"Resume-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-BitLocker \\r\\n\"},{\"CompletionText\":\"Resume-BitsTransfer\",\"ListItemText\":\"Resume-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Resume-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Resume-PrintJob\",\"ListItemText\":\"Resume-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-PrintJob \\r\\n\"},{\"CompletionText\":\"Resume-ProvisioningSession\",\"ListItemText\":\"Resume-ProvisioningSession\",\"ResultType\":2,\"ToolTip\":\"Resume-ProvisioningSession\\r\\n\"},{\"CompletionText\":\"Resume-Service\",\"ListItemText\":\"Resume-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-Service [-InputObject] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nResume-Service [-Name] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nResume-Service -DisplayName [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Resume-StorageBusDisk\",\"ListItemText\":\"Resume-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Resume-VM\",\"ListItemText\":\"Resume-VM\",\"ResultType\":2,\"ToolTip\":\"Resume-VM\\r\\n\"},{\"CompletionText\":\"Resume-VMReplication\",\"ListItemText\":\"Resume-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Resume-VMReplication\\r\\n\"},{\"CompletionText\":\"Revoke-AzDataShareSubscriptionAccess\",\"ListItemText\":\"Revoke-AzDataShareSubscriptionAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzDataShareSubscriptionAccess\\r\\n\"},{\"CompletionText\":\"Revoke-AzDiskAccess\",\"ListItemText\":\"Revoke-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Revoke-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Revoke-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Revoke-AzSnapshotAccess\",\"ListItemText\":\"Revoke-AzSnapshotAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzSnapshotAccess\\r\\n\"},{\"CompletionText\":\"Revoke-AzStorageAccountUserDelegationKeys\",\"ListItemText\":\"Revoke-AzStorageAccountUserDelegationKeys\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzStorageAccountUserDelegationKeys\\r\\n\"},{\"CompletionText\":\"Revoke-FileShareAccess\",\"ListItemText\":\"Revoke-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Revoke-HgsKeyProtectorAccess\",\"ListItemText\":\"Revoke-HgsKeyProtectorAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-HgsKeyProtectorAccess \\r\\n\"},{\"CompletionText\":\"Revoke-SmbClientAccessToServer\",\"ListItemText\":\"Revoke-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Revoke-SmbShareAccess\",\"ListItemText\":\"Revoke-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Revoke-VMConnectAccess\",\"ListItemText\":\"Revoke-VMConnectAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-VMConnectAccess\\r\\n\"},{\"CompletionText\":\"rg.exe\",\"ListItemText\":\"rg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WinGet\\\\Packages\\\\BurntSushi.ripgrep.MSVC_Microsoft.Winget.Source_8wekyb3d8bbwe\\\\ripgrep-13.0.0-x86_64-pc-windows-msvc\\\\rg.exe\"},{\"CompletionText\":\"ri\",\"ListItemText\":\"ri\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"rjb\",\"ListItemText\":\"rjb\",\"ResultType\":2,\"ToolTip\":\"Remove-Job\"},{\"CompletionText\":\"rksmba\",\"ListItemText\":\"rksmba\",\"ResultType\":2,\"ToolTip\":\"rksmba\"},{\"CompletionText\":\"rksmbclas\",\"ListItemText\":\"rksmbclas\",\"ResultType\":2,\"ToolTip\":\"rksmbclas\"},{\"CompletionText\":\"rlg\",\"ListItemText\":\"rlg\",\"ResultType\":2,\"ToolTip\":\"rlg\"},{\"CompletionText\":\"rlgm\",\"ListItemText\":\"rlgm\",\"ResultType\":2,\"ToolTip\":\"rlgm\"},{\"CompletionText\":\"rlu\",\"ListItemText\":\"rlu\",\"ResultType\":2,\"ToolTip\":\"rlu\"},{\"CompletionText\":\"rm\",\"ListItemText\":\"rm\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"RMActivate.exe\",\"ListItemText\":\"RMActivate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate.exe\"},{\"CompletionText\":\"RMActivate_isv.exe\",\"ListItemText\":\"RMActivate_isv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate_isv.exe\"},{\"CompletionText\":\"RMActivate_ssp.exe\",\"ListItemText\":\"RMActivate_ssp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate_ssp.exe\"},{\"CompletionText\":\"RMActivate_ssp_isv.exe\",\"ListItemText\":\"RMActivate_ssp_isv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate_ssp_isv.exe\"},{\"CompletionText\":\"RmClient.exe\",\"ListItemText\":\"RmClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RmClient.exe\"},{\"CompletionText\":\"rmdir\",\"ListItemText\":\"rmdir\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"rmic.exe\",\"ListItemText\":\"rmic.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\rmic.exe\"},{\"CompletionText\":\"rmid.exe\",\"ListItemText\":\"rmid.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\rmid.exe\"},{\"CompletionText\":\"rmiregistry.exe\",\"ListItemText\":\"rmiregistry.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\rmiregistry.exe\"},{\"CompletionText\":\"rmo\",\"ListItemText\":\"rmo\",\"ResultType\":2,\"ToolTip\":\"Remove-Module\"},{\"CompletionText\":\"rmttpmvscmgrsvr.exe\",\"ListItemText\":\"rmttpmvscmgrsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rmttpmvscmgrsvr.exe\"},{\"CompletionText\":\"rni\",\"ListItemText\":\"rni\",\"ResultType\":2,\"ToolTip\":\"Rename-Item\"},{\"CompletionText\":\"rnlg\",\"ListItemText\":\"rnlg\",\"ResultType\":2,\"ToolTip\":\"rnlg\"},{\"CompletionText\":\"rnlu\",\"ListItemText\":\"rnlu\",\"ResultType\":2,\"ToolTip\":\"rnlu\"},{\"CompletionText\":\"rnp\",\"ListItemText\":\"rnp\",\"ResultType\":2,\"ToolTip\":\"Rename-ItemProperty\"},{\"CompletionText\":\"Robocopy.exe\",\"ListItemText\":\"Robocopy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Robocopy.exe\"},{\"CompletionText\":\"ROUTE.EXE\",\"ListItemText\":\"ROUTE.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ROUTE.EXE\"},{\"CompletionText\":\"rp\",\"ListItemText\":\"rp\",\"ResultType\":2,\"ToolTip\":\"Remove-ItemProperty\"},{\"CompletionText\":\"RpcPing.exe\",\"ListItemText\":\"RpcPing.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RpcPing.exe\"},{\"CompletionText\":\"rrinstaller.exe\",\"ListItemText\":\"rrinstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rrinstaller.exe\"},{\"CompletionText\":\"rsmbb\",\"ListItemText\":\"rsmbb\",\"ResultType\":2,\"ToolTip\":\"rsmbb\"},{\"CompletionText\":\"rsmbc\",\"ListItemText\":\"rsmbc\",\"ResultType\":2,\"ToolTip\":\"rsmbc\"},{\"CompletionText\":\"rsmbcc\",\"ListItemText\":\"rsmbcc\",\"ResultType\":2,\"ToolTip\":\"rsmbcc\"},{\"CompletionText\":\"rsmbccm\",\"ListItemText\":\"rsmbccm\",\"ResultType\":2,\"ToolTip\":\"rsmbccm\"},{\"CompletionText\":\"rsmbgm\",\"ListItemText\":\"rsmbgm\",\"ResultType\":2,\"ToolTip\":\"rsmbgm\"},{\"CompletionText\":\"rsmbm\",\"ListItemText\":\"rsmbm\",\"ResultType\":2,\"ToolTip\":\"rsmbm\"},{\"CompletionText\":\"rsmbs\",\"ListItemText\":\"rsmbs\",\"ResultType\":2,\"ToolTip\":\"rsmbs\"},{\"CompletionText\":\"rsmbsc\",\"ListItemText\":\"rsmbsc\",\"ResultType\":2,\"ToolTip\":\"rsmbsc\"},{\"CompletionText\":\"rsmbscm\",\"ListItemText\":\"rsmbscm\",\"ResultType\":2,\"ToolTip\":\"rsmbscm\"},{\"CompletionText\":\"rsmbt\",\"ListItemText\":\"rsmbt\",\"ResultType\":2,\"ToolTip\":\"rsmbt\"},{\"CompletionText\":\"rsn\",\"ListItemText\":\"rsn\",\"ResultType\":2,\"ToolTip\":\"Remove-PSSession\"},{\"CompletionText\":\"rsop.msc\",\"ListItemText\":\"rsop.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rsop.msc\"},{\"CompletionText\":\"rstrui.exe\",\"ListItemText\":\"rstrui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rstrui.exe\"},{\"CompletionText\":\"rtcfg\",\"ListItemText\":\"rtcfg\",\"ResultType\":2,\"ToolTip\":\"rtcfg\"},{\"CompletionText\":\"runas.exe\",\"ListItemText\":\"runas.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\runas.exe\"},{\"CompletionText\":\"rundll32.exe\",\"ListItemText\":\"rundll32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rundll32.exe\"},{\"CompletionText\":\"runexehelper.exe\",\"ListItemText\":\"runexehelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\runexehelper.exe\"},{\"CompletionText\":\"RunLegacyCPLElevated.exe\",\"ListItemText\":\"RunLegacyCPLElevated.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RunLegacyCPLElevated.exe\"},{\"CompletionText\":\"runonce.exe\",\"ListItemText\":\"runonce.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\runonce.exe\"},{\"CompletionText\":\"RuntimeBroker.exe\",\"ListItemText\":\"RuntimeBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RuntimeBroker.exe\"},{\"CompletionText\":\"rv\",\"ListItemText\":\"rv\",\"ResultType\":2,\"ToolTip\":\"Remove-Variable\"},{\"CompletionText\":\"rvpa\",\"ListItemText\":\"rvpa\",\"ResultType\":2,\"ToolTip\":\"Resolve-Path\"},{\"CompletionText\":\"rwinsta.exe\",\"ListItemText\":\"rwinsta.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rwinsta.exe\"},{\"CompletionText\":\"S:\",\"ListItemText\":\"S:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nS: \\r\\n\"},{\"CompletionText\":\"sacfg\",\"ListItemText\":\"sacfg\",\"ResultType\":2,\"ToolTip\":\"sacfg\"},{\"CompletionText\":\"SafeGetCommand\",\"ListItemText\":\"SafeGetCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSafeGetCommand \\r\\n\"},{\"CompletionText\":\"sajb\",\"ListItemText\":\"sajb\",\"ResultType\":2,\"ToolTip\":\"Start-Job\"},{\"CompletionText\":\"sal\",\"ListItemText\":\"sal\",\"ResultType\":2,\"ToolTip\":\"Set-Alias\"},{\"CompletionText\":\"saps\",\"ListItemText\":\"saps\",\"ResultType\":2,\"ToolTip\":\"Start-Process\"},{\"CompletionText\":\"sasv\",\"ListItemText\":\"sasv\",\"ResultType\":2,\"ToolTip\":\"Start-Service\"},{\"CompletionText\":\"Save-AzApiManagementTenantGitConfiguration\",\"ListItemText\":\"Save-AzApiManagementTenantGitConfiguration\",\"ResultType\":2,\"ToolTip\":\"Save-AzApiManagementTenantGitConfiguration\\r\\n\"},{\"CompletionText\":\"Save-AzContext\",\"ListItemText\":\"Save-AzContext\",\"ResultType\":2,\"ToolTip\":\"Save-AzContext\\r\\n\"},{\"CompletionText\":\"Save-AzDataFactoryLog\",\"ListItemText\":\"Save-AzDataFactoryLog\",\"ResultType\":2,\"ToolTip\":\"Save-AzDataFactoryLog\\r\\n\"},{\"CompletionText\":\"Save-AzDeploymentScriptLog\",\"ListItemText\":\"Save-AzDeploymentScriptLog\",\"ResultType\":2,\"ToolTip\":\"Save-AzDeploymentScriptLog\\r\\n\"},{\"CompletionText\":\"Save-AzDeploymentTemplate\",\"ListItemText\":\"Save-AzDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzManagementGroupDeploymentTemplate\",\"ListItemText\":\"Save-AzManagementGroupDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzManagementGroupDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzProfile\",\"ListItemText\":\"Save-AzProfile\",\"ResultType\":2,\"ToolTip\":\"Save-AzProfile\"},{\"CompletionText\":\"Save-AzResourceGroupDeploymentTemplate\",\"ListItemText\":\"Save-AzResourceGroupDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzResourceGroupDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzSubscriptionDeploymentTemplate\",\"ListItemText\":\"Save-AzSubscriptionDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzSubscriptionDeploymentTemplate\"},{\"CompletionText\":\"Save-AzTenantDeploymentTemplate\",\"ListItemText\":\"Save-AzTenantDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzTenantDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzVhd\",\"ListItemText\":\"Save-AzVhd\",\"ResultType\":2,\"ToolTip\":\"Save-AzVhd\\r\\n\"},{\"CompletionText\":\"Save-AzVMImage\",\"ListItemText\":\"Save-AzVMImage\",\"ResultType\":2,\"ToolTip\":\"Save-AzVMImage\\r\\n\"},{\"CompletionText\":\"Save-EtwTraceSession\",\"ListItemText\":\"Save-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Save-Help\",\"ListItemText\":\"Save-Help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Help [-DestinationPath] [[-Module] ] [[-UICulture] ] [-FullyQualifiedModule ] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] []\\r\\n\\r\\nSave-Help [[-Module] ] [[-UICulture] ] -LiteralPath [-FullyQualifiedModule ] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] []\\r\\n\"},{\"CompletionText\":\"Save-Module\",\"ListItemText\":\"Save-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Module \\r\\n\"},{\"CompletionText\":\"Save-NetGPO\",\"ListItemText\":\"Save-NetGPO\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-NetGPO \\r\\n\"},{\"CompletionText\":\"Save-NetworkSwitchConfiguration\",\"ListItemText\":\"Save-NetworkSwitchConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-NetworkSwitchConfiguration \\r\\n\"},{\"CompletionText\":\"Save-Package\",\"ListItemText\":\"Save-Package\",\"ResultType\":2,\"ToolTip\":\"Save-Package\\r\\n\"},{\"CompletionText\":\"Save-PSResource\",\"ListItemText\":\"Save-PSResource\",\"ResultType\":2,\"ToolTip\":\"Save-PSResource\\r\\n\"},{\"CompletionText\":\"Save-Script\",\"ListItemText\":\"Save-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Script \\r\\n\"},{\"CompletionText\":\"Save-SoftwareInventory\",\"ListItemText\":\"Save-SoftwareInventory\",\"ResultType\":2,\"ToolTip\":\"Save-SoftwareInventory\\r\\n\"},{\"CompletionText\":\"Save-StorageDataCollection\",\"ListItemText\":\"Save-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Save-VM\",\"ListItemText\":\"Save-VM\",\"ResultType\":2,\"ToolTip\":\"Save-VM\\r\\n\"},{\"CompletionText\":\"Save-WindowsImage\",\"ListItemText\":\"Save-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Save-WindowsImage\\r\\n\"},{\"CompletionText\":\"savm\",\"ListItemText\":\"savm\",\"ResultType\":2,\"ToolTip\":\"savm\"},{\"CompletionText\":\"sbp\",\"ListItemText\":\"sbp\",\"ResultType\":2,\"ToolTip\":\"Set-PSBreakpoint\"},{\"CompletionText\":\"sc.exe\",\"ListItemText\":\"sc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sc.exe\"},{\"CompletionText\":\"scalar.exe\",\"ListItemText\":\"scalar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\scalar.exe\"},{\"CompletionText\":\"scb\",\"ListItemText\":\"scb\",\"ResultType\":2,\"ToolTip\":\"Set-Clipboard\"},{\"CompletionText\":\"scdaemon.exe\",\"ListItemText\":\"scdaemon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\scdaemon.exe\"},{\"CompletionText\":\"schemagen.exe\",\"ListItemText\":\"schemagen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\schemagen.exe\"},{\"CompletionText\":\"schtasks.exe\",\"ListItemText\":\"schtasks.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\schtasks.exe\"},{\"CompletionText\":\"scim\",\"ListItemText\":\"scim\",\"ResultType\":2,\"ToolTip\":\"scim\"},{\"CompletionText\":\"scp.exe\",\"ListItemText\":\"scp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\scp.exe\"},{\"CompletionText\":\"scrcons.exe\",\"ListItemText\":\"scrcons.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\scrcons.exe\"},{\"CompletionText\":\"ScriptRunner.exe\",\"ListItemText\":\"ScriptRunner.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ScriptRunner.exe\"},{\"CompletionText\":\"sdbinst.exe\",\"ListItemText\":\"sdbinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdbinst.exe\"},{\"CompletionText\":\"sdchange.exe\",\"ListItemText\":\"sdchange.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdchange.exe\"},{\"CompletionText\":\"sdclt.exe\",\"ListItemText\":\"sdclt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdclt.exe\"},{\"CompletionText\":\"sdiagnhost.exe\",\"ListItemText\":\"sdiagnhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdiagnhost.exe\"},{\"CompletionText\":\"Search-AzDataProtectionBackupInstanceInAzGraph\",\"ListItemText\":\"Search-AzDataProtectionBackupInstanceInAzGraph\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSearch-AzDataProtectionBackupInstanceInAzGraph \\r\\n\"},{\"CompletionText\":\"Search-AzDataProtectionJobInAzGraph\",\"ListItemText\":\"Search-AzDataProtectionJobInAzGraph\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSearch-AzDataProtectionJobInAzGraph \\r\\n\"},{\"CompletionText\":\"SearchFilterHost.exe\",\"ListItemText\":\"SearchFilterHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SearchFilterHost.exe\"},{\"CompletionText\":\"SearchIndexer.exe\",\"ListItemText\":\"SearchIndexer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SearchIndexer.exe\"},{\"CompletionText\":\"SearchProtocolHost.exe\",\"ListItemText\":\"SearchProtocolHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SearchProtocolHost.exe\"},{\"CompletionText\":\"SecEdit.exe\",\"ListItemText\":\"SecEdit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecEdit.exe\"},{\"CompletionText\":\"secinit.exe\",\"ListItemText\":\"secinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\secinit.exe\"},{\"CompletionText\":\"secpol.msc\",\"ListItemText\":\"secpol.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\secpol.msc\"},{\"CompletionText\":\"SecureBootEncodeUEFI.exe\",\"ListItemText\":\"SecureBootEncodeUEFI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecureBootEncodeUEFI.exe\"},{\"CompletionText\":\"securekernel.exe\",\"ListItemText\":\"securekernel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\securekernel.exe\"},{\"CompletionText\":\"SecurityHealthHost.exe\",\"ListItemText\":\"SecurityHealthHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecurityHealthHost.exe\"},{\"CompletionText\":\"SecurityHealthService.exe\",\"ListItemText\":\"SecurityHealthService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecurityHealthService.exe\"},{\"CompletionText\":\"SecurityHealthSystray.exe\",\"ListItemText\":\"SecurityHealthSystray.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecurityHealthSystray.exe\"},{\"CompletionText\":\"select\",\"ListItemText\":\"select\",\"ResultType\":2,\"ToolTip\":\"Select-Object\"},{\"CompletionText\":\"Select-AzContext\",\"ListItemText\":\"Select-AzContext\",\"ResultType\":2,\"ToolTip\":\"Select-AzContext\\r\\n\"},{\"CompletionText\":\"Select-AzSubscription\",\"ListItemText\":\"Select-AzSubscription\",\"ResultType\":2,\"ToolTip\":\"Select-AzSubscription\"},{\"CompletionText\":\"Select-Object\",\"ListItemText\":\"Select-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSelect-Object [[-Property] ] [-InputObject ] [-ExcludeProperty ] [-ExpandProperty ] [-Unique] [-CaseInsensitive] [-Last ] [-First ] [-Skip ] [-Wait] []\\r\\n\\r\\nSelect-Object [[-Property] ] [-InputObject ] [-ExcludeProperty ] [-ExpandProperty ] [-Unique] [-CaseInsensitive] [-Skip ] [-SkipLast ] []\\r\\n\\r\\nSelect-Object [-InputObject ] [-Unique] [-CaseInsensitive] [-Wait] [-Index ] []\\r\\n\\r\\nSelect-Object [-InputObject ] [-Unique] [-CaseInsensitive] [-SkipIndex ] []\\r\\n\"},{\"CompletionText\":\"Select-String\",\"ListItemText\":\"Select-String\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSelect-String [-Pattern] [-Path] [-Culture ] [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -InputObject [-Culture ] [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -InputObject -Raw [-Culture ] [-SimpleMatch] [-CaseSensitive] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] [-Path] -Raw [-Culture ] [-SimpleMatch] [-CaseSensitive] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -LiteralPath [-Culture ] [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -LiteralPath -Raw [-Culture ] [-SimpleMatch] [-CaseSensitive] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\"},{\"CompletionText\":\"Select-Xml\",\"ListItemText\":\"Select-Xml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSelect-Xml [-XPath] [-Xml] [-Namespace ] []\\r\\n\\r\\nSelect-Xml [-XPath] [-Path] [-Namespace ] []\\r\\n\\r\\nSelect-Xml [-XPath] -LiteralPath [-Namespace ] []\\r\\n\\r\\nSelect-Xml [-XPath] -Content [-Namespace ] []\\r\\n\"},{\"CompletionText\":\"Send-AzIotHubD2CMessage\",\"ListItemText\":\"Send-AzIotHubD2CMessage\",\"ResultType\":2,\"ToolTip\":\"Send-AzIotHubD2CMessage\"},{\"CompletionText\":\"Send-AzIotHubDevice2CloudMessage\",\"ListItemText\":\"Send-AzIotHubDevice2CloudMessage\",\"ResultType\":2,\"ToolTip\":\"Send-AzIotHubDevice2CloudMessage\\r\\n\"},{\"CompletionText\":\"Send-AzWvdUserSessionMessage\",\"ListItemText\":\"Send-AzWvdUserSessionMessage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-AzWvdUserSessionMessage \\r\\n\"},{\"CompletionText\":\"Send-Completions\",\"ListItemText\":\"Send-Completions\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-Completions \\r\\n\"},{\"CompletionText\":\"Send-DtcDiagnosticTransaction\",\"ListItemText\":\"Send-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Send-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"Send-EtwTraceSession\",\"ListItemText\":\"Send-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Send-Feedback\",\"ListItemText\":\"Send-Feedback\",\"ResultType\":2,\"ToolTip\":\"Send-Feedback\\r\\n\"},{\"CompletionText\":\"Send-MailMessage\",\"ListItemText\":\"Send-MailMessage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-MailMessage [-To] [[-Subject] ] [[-Body] ] [[-SmtpServer] ] -From [-Attachments ] [-Bcc ] [-BodyAsHtml] [-Encoding ] [-Cc ] [-DeliveryNotificationOption ] [-Priority ] [-ReplyTo ] [-Credential ] [-UseSsl] [-Port ] []\\r\\n\"},{\"CompletionText\":\"SensorDataService.exe\",\"ListItemText\":\"SensorDataService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SensorDataService.exe\"},{\"CompletionText\":\"SensorRuntimeBroker.exe\",\"ListItemText\":\"SensorRuntimeBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SensorRuntimeBroker.exe\"},{\"CompletionText\":\"serialver.exe\",\"ListItemText\":\"serialver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\serialver.exe\"},{\"CompletionText\":\"servertool.exe\",\"ListItemText\":\"servertool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\servertool.exe\"},{\"CompletionText\":\"services.exe\",\"ListItemText\":\"services.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\services.exe\"},{\"CompletionText\":\"services.msc\",\"ListItemText\":\"services.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\services.msc\"},{\"CompletionText\":\"sessionmsg.exe\",\"ListItemText\":\"sessionmsg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sessionmsg.exe\"},{\"CompletionText\":\"set\",\"ListItemText\":\"set\",\"ResultType\":2,\"ToolTip\":\"Set-Variable\"},{\"CompletionText\":\"Set-Acl\",\"ListItemText\":\"Set-Acl\",\"ResultType\":2,\"ToolTip\":\"Set-Acl\\r\\n\"},{\"CompletionText\":\"Set-AdlAnalyticsAccount\",\"ListItemText\":\"Set-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AdlAnalyticsAccount\"},{\"CompletionText\":\"Set-AdlAnalyticsDataSource\",\"ListItemText\":\"Set-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Set-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Set-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Set-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Set-AdlCatalogCredential\",\"ListItemText\":\"Set-AdlCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AdlCatalogCredential\"},{\"CompletionText\":\"Set-AdlCatalogItemAclEntry\",\"ListItemText\":\"Set-AdlCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AdlCatalogItemAclEntry\"},{\"CompletionText\":\"Set-AdlCatalogSecret\",\"ListItemText\":\"Set-AdlCatalogSecret\",\"ResultType\":2,\"ToolTip\":\"Set-AdlCatalogSecret\"},{\"CompletionText\":\"Set-AdlStore\",\"ListItemText\":\"Set-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStore\"},{\"CompletionText\":\"Set-AdlStoreFirewallRule\",\"ListItemText\":\"Set-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreFirewallRule\"},{\"CompletionText\":\"Set-AdlStoreItemAcl\",\"ListItemText\":\"Set-AdlStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemAcl\"},{\"CompletionText\":\"Set-AdlStoreItemAclEntry\",\"ListItemText\":\"Set-AdlStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemAclEntry\"},{\"CompletionText\":\"Set-AdlStoreItemExpiry\",\"ListItemText\":\"Set-AdlStoreItemExpiry\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemExpiry\"},{\"CompletionText\":\"Set-AdlStoreItemOwner\",\"ListItemText\":\"Set-AdlStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemOwner\"},{\"CompletionText\":\"Set-AdlStoreItemPermission\",\"ListItemText\":\"Set-AdlStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemPermission\"},{\"CompletionText\":\"Set-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Set-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Set-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Set-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Set-Alias\",\"ListItemText\":\"Set-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Alias [-Name] [-Value] [-Description ] [-Option ] [-PassThru] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-AppBackgroundTaskResourcePolicy\",\"ListItemText\":\"Set-AppBackgroundTaskResourcePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AppBackgroundTaskResourcePolicy\\r\\n\"},{\"CompletionText\":\"Set-AppLockerPolicy\",\"ListItemText\":\"Set-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"Set-AppPackageAutoUpdateSettings\",\"ListItemText\":\"Set-AppPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AppPackageAutoUpdateSettings\"},{\"CompletionText\":\"Set-AppPackageDefaultVolume\",\"ListItemText\":\"Set-AppPackageDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Set-AppPackageDefaultVolume\"},{\"CompletionText\":\"Set-AppPackageProvisionedDataFile\",\"ListItemText\":\"Set-AppPackageProvisionedDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-AppPackageProvisionedDataFile\"},{\"CompletionText\":\"Set-AppxDefaultVolume\",\"ListItemText\":\"Set-AppxDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Set-AppxDefaultVolume\\r\\n\"},{\"CompletionText\":\"Set-AppxPackageAutoUpdateSettings\",\"ListItemText\":\"Set-AppxPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AppxPackageAutoUpdateSettings\\r\\n\"},{\"CompletionText\":\"Set-AppXProvisionedDataFile\",\"ListItemText\":\"Set-AppXProvisionedDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-AppXProvisionedDataFile\\r\\n\"},{\"CompletionText\":\"Set-ASRAlertSetting\",\"ListItemText\":\"Set-ASRAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Set-ASRAlertSetting\"},{\"CompletionText\":\"Set-ASRNotificationSetting\",\"ListItemText\":\"Set-ASRNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Set-ASRNotificationSetting\"},{\"CompletionText\":\"Set-ASRReplicationProtectedItem\",\"ListItemText\":\"Set-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Set-ASRReplicationProtectedItem\"},{\"CompletionText\":\"Set-ASRVaultContext\",\"ListItemText\":\"Set-ASRVaultContext\",\"ResultType\":2,\"ToolTip\":\"Set-ASRVaultContext\"},{\"CompletionText\":\"Set-ASRVaultSettings\",\"ListItemText\":\"Set-ASRVaultSettings\",\"ResultType\":2,\"ToolTip\":\"Set-ASRVaultSettings\"},{\"CompletionText\":\"Set-AssignedAccess\",\"ListItemText\":\"Set-AssignedAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AssignedAccess \\r\\n\"},{\"CompletionText\":\"Set-AuthenticodeSignature\",\"ListItemText\":\"Set-AuthenticodeSignature\",\"ResultType\":2,\"ToolTip\":\"Set-AuthenticodeSignature\\r\\n\"},{\"CompletionText\":\"Set-AutologgerConfig\",\"ListItemText\":\"Set-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AutologgerConfig\"},{\"CompletionText\":\"Set-AzActionGroup\",\"ListItemText\":\"Set-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Set-AzADApplication\",\"ListItemText\":\"Set-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzADApplication\"},{\"CompletionText\":\"Set-AzADServicePrincipal\",\"ListItemText\":\"Set-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"Set-AzADServicePrincipal\"},{\"CompletionText\":\"Set-AzADUser\",\"ListItemText\":\"Set-AzADUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzADUser\"},{\"CompletionText\":\"Set-AzAdvisorConfiguration\",\"ListItemText\":\"Set-AzAdvisorConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzAdvisorConfiguration \\r\\n\"},{\"CompletionText\":\"Set-AzAksCluster\",\"ListItemText\":\"Set-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"Set-AzAksCluster\\r\\n\"},{\"CompletionText\":\"Set-AzAksClusterCredential\",\"ListItemText\":\"Set-AzAksClusterCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzAksClusterCredential\\r\\n\"},{\"CompletionText\":\"Set-AzAlertsSuppressionRule\",\"ListItemText\":\"Set-AzAlertsSuppressionRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzAlertsSuppressionRule\\r\\n\"},{\"CompletionText\":\"Set-AzAnalysisServicesServer\",\"ListItemText\":\"Set-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Set-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagement\",\"ListItemText\":\"Set-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApi\",\"ListItemText\":\"Set-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApiRevision\",\"ListItemText\":\"Set-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApiSchema\",\"ListItemText\":\"Set-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApiVersionSet\",\"ListItemText\":\"Set-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementAuthorizationServer\",\"ListItemText\":\"Set-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementBackend\",\"ListItemText\":\"Set-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementCertificate\",\"ListItemText\":\"Set-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementDiagnostic\",\"ListItemText\":\"Set-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementGroup\",\"ListItemText\":\"Set-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementIdentityProvider\",\"ListItemText\":\"Set-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementLogger\",\"ListItemText\":\"Set-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementNamedValue\",\"ListItemText\":\"Set-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"Set-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementOperation\",\"ListItemText\":\"Set-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementPolicy\",\"ListItemText\":\"Set-AzApiManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementProduct\",\"ListItemText\":\"Set-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementSubscription\",\"ListItemText\":\"Set-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementTenantAccess\",\"ListItemText\":\"Set-AzApiManagementTenantAccess\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementTenantAccess\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementUser\",\"ListItemText\":\"Set-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGateway\",\"ListItemText\":\"Set-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Set-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Set-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Set-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Set-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Set-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"Set-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayCustomError\",\"ListItemText\":\"Set-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"Set-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Set-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Set-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Set-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Set-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayIdentity\",\"ListItemText\":\"Set-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayListener\",\"ListItemText\":\"Set-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Set-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Set-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Set-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Set-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySku\",\"ListItemText\":\"Set-AzApplicationGatewaySku\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySku\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Set-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"Set-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Set-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslProfilePolicy\",\"ListItemText\":\"Set-AzApplicationGatewaySslProfilePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslProfilePolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Set-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Set-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Set-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayWebApplicationFirewallConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"Set-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"Set-AzApplicationInsightsDailyCap\",\"ListItemText\":\"Set-AzApplicationInsightsDailyCap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzApplicationInsightsDailyCap \\r\\n\"},{\"CompletionText\":\"Set-AzApplicationInsightsPricingPlan\",\"ListItemText\":\"Set-AzApplicationInsightsPricingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzApplicationInsightsPricingPlan \\r\\n\"},{\"CompletionText\":\"Set-AzAppServicePlan\",\"ListItemText\":\"Set-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"Set-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"Set-AzAs\",\"ListItemText\":\"Set-AzAs\",\"ResultType\":2,\"ToolTip\":\"Set-AzAs\"},{\"CompletionText\":\"Set-AzAttestationPolicy\",\"ListItemText\":\"Set-AzAttestationPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzAttestationPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationAccount\",\"ListItemText\":\"Set-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationCertificate\",\"ListItemText\":\"Set-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationConnectionFieldValue\",\"ListItemText\":\"Set-AzAutomationConnectionFieldValue\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationConnectionFieldValue\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationCredential\",\"ListItemText\":\"Set-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationDscNode\",\"ListItemText\":\"Set-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"Set-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationModule\",\"ListItemText\":\"Set-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationPython3Package\",\"ListItemText\":\"Set-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationRunbook\",\"ListItemText\":\"Set-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationSchedule\",\"ListItemText\":\"Set-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationVariable\",\"ListItemText\":\"Set-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationWebhook\",\"ListItemText\":\"Set-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"Set-AzBastion\",\"ListItemText\":\"Set-AzBastion\",\"ResultType\":2,\"ToolTip\":\"Set-AzBastion\\r\\n\"},{\"CompletionText\":\"Set-AzBatchAccount\",\"ListItemText\":\"Set-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"Set-AzBatchApplication\",\"ListItemText\":\"Set-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"Set-AzBatchComputeNodeUser\",\"ListItemText\":\"Set-AzBatchComputeNodeUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchComputeNodeUser\\r\\n\"},{\"CompletionText\":\"Set-AzBatchJob\",\"ListItemText\":\"Set-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Set-AzBatchJobSchedule\",\"ListItemText\":\"Set-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Set-AzBatchPool\",\"ListItemText\":\"Set-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchPool\\r\\n\"},{\"CompletionText\":\"Set-AzBatchTask\",\"ListItemText\":\"Set-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Set-AzCloudServiceUpdateDomain\",\"ListItemText\":\"Set-AzCloudServiceUpdateDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzCloudServiceUpdateDomain \\r\\n\"},{\"CompletionText\":\"Set-AzCognitiveServicesAccount\",\"ListItemText\":\"Set-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"Set-AzConsumptionBudget\",\"ListItemText\":\"Set-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"Set-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"Set-AzContext\",\"ListItemText\":\"Set-AzContext\",\"ResultType\":2,\"ToolTip\":\"Set-AzContext\\r\\n\"},{\"CompletionText\":\"Set-AzCurrentStorageAccount\",\"ListItemText\":\"Set-AzCurrentStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzCurrentStorageAccount\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"Set-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeRole\",\"ListItemText\":\"Set-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeShare\",\"ListItemText\":\"Set-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"Set-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeUser\",\"ListItemText\":\"Set-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"Set-AzDataCollectionRule\",\"ListItemText\":\"Set-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryGateway\",\"ListItemText\":\"Set-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryPipelineActivePeriod\",\"ListItemText\":\"Set-AzDataFactoryPipelineActivePeriod\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryPipelineActivePeriod\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactorySliceStatus\",\"ListItemText\":\"Set-AzDataFactorySliceStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactorySliceStatus\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2\",\"ListItemText\":\"Set-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2DataFlow\",\"ListItemText\":\"Set-AzDataFactoryV2DataFlow\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2DataFlow\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2Dataset\",\"ListItemText\":\"Set-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2Dataset\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Set-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2LinkedService\",\"ListItemText\":\"Set-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2LinkedService\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Set-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2Trigger\",\"ListItemText\":\"Set-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Set-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsCatalogCredential\",\"ListItemText\":\"Set-AzDataLakeAnalyticsCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsCatalogCredential\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ListItemText\":\"Set-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsCatalogItemAclEntry\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Set-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Set-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeGen2AclRecursive\",\"ListItemText\":\"Set-AzDataLakeGen2AclRecursive\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeGen2AclRecursive\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeGen2ItemAclObject\",\"ListItemText\":\"Set-AzDataLakeGen2ItemAclObject\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeGen2ItemAclObject\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreAccount\",\"ListItemText\":\"Set-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Set-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemAcl\",\"ListItemText\":\"Set-AzDataLakeStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemAcl\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemAclEntry\",\"ListItemText\":\"Set-AzDataLakeStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemAclEntry\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemExpiry\",\"ListItemText\":\"Set-AzDataLakeStoreItemExpiry\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemExpiry\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemOwner\",\"ListItemText\":\"Set-AzDataLakeStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemOwner\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemPermission\",\"ListItemText\":\"Set-AzDataLakeStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemPermission\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Set-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Set-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataProtectionMSIPermission\",\"ListItemText\":\"Set-AzDataProtectionMSIPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzDataProtectionMSIPermission \\r\\n\"},{\"CompletionText\":\"Set-AzDataShare\",\"ListItemText\":\"Set-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataShare\\r\\n\"},{\"CompletionText\":\"Set-AzDefault\",\"ListItemText\":\"Set-AzDefault\",\"ResultType\":2,\"ToolTip\":\"Set-AzDefault\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"Set-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerService\",\"ListItemText\":\"Set-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"Set-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"Set-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerStep\",\"ListItemText\":\"Set-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"Set-AzDeviceSecurityGroup\",\"ListItemText\":\"Set-AzDeviceSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeviceSecurityGroup\\r\\n\"},{\"CompletionText\":\"Set-AzDiskDiskEncryptionKey\",\"ListItemText\":\"Set-AzDiskDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDiskImageReference\",\"ListItemText\":\"Set-AzDiskImageReference\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskImageReference\\r\\n\"},{\"CompletionText\":\"Set-AzDiskKeyEncryptionKey\",\"ListItemText\":\"Set-AzDiskKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDiskSecurityProfile\",\"ListItemText\":\"Set-AzDiskSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskSecurityProfile\\r\\n\"},{\"CompletionText\":\"Set-AzDiskUpdateDiskEncryptionKey\",\"ListItemText\":\"Set-AzDiskUpdateDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskUpdateDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDiskUpdateKeyEncryptionKey\",\"ListItemText\":\"Set-AzDiskUpdateKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskUpdateKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDnsRecordSet\",\"ListItemText\":\"Set-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Set-AzDnsZone\",\"ListItemText\":\"Set-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"Set-AzDnsZone\\r\\n\"},{\"CompletionText\":\"Set-AzDtlAllowedVMSizesPolicy\",\"ListItemText\":\"Set-AzDtlAllowedVMSizesPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlAllowedVMSizesPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlAutoShutdownPolicy\",\"ListItemText\":\"Set-AzDtlAutoShutdownPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlAutoShutdownPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlAutoStartPolicy\",\"ListItemText\":\"Set-AzDtlAutoStartPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlAutoStartPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlVMsPerLabPolicy\",\"ListItemText\":\"Set-AzDtlVMsPerLabPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlVMsPerLabPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlVMsPerUserPolicy\",\"ListItemText\":\"Set-AzDtlVMsPerUserPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlVMsPerUserPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzEnvironment\",\"ListItemText\":\"Set-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Set-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Set-AzEventGridTopic\",\"ListItemText\":\"Set-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"Set-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"Set-AzEventHub\",\"ListItemText\":\"Set-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHub \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubApplicationGroup\",\"ListItemText\":\"Set-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubAuthorizationRule\",\"ListItemText\":\"Set-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubCluster\",\"ListItemText\":\"Set-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubConsumerGroup\",\"ListItemText\":\"Set-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubGeoDRConfigurationBreakPair\",\"ListItemText\":\"Set-AzEventHubGeoDRConfigurationBreakPair\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubGeoDRConfigurationBreakPair \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubGeoDRConfigurationFailOver\",\"ListItemText\":\"Set-AzEventHubGeoDRConfigurationFailOver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubGeoDRConfigurationFailOver \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubNamespace\",\"ListItemText\":\"Set-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubNamespaceV2\",\"ListItemText\":\"Set-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Set-AzEventHubNamespaceV2\"},{\"CompletionText\":\"Set-AzEventHubNetworkRuleSet\",\"ListItemText\":\"Set-AzEventHubNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCircuit\",\"ListItemText\":\"Set-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Set-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Set-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteConnection\",\"ListItemText\":\"Set-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCrossConnection\",\"ListItemText\":\"Set-AzExpressRouteCrossConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCrossConnection\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteGateway\",\"ListItemText\":\"Set-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRoutePort\",\"ListItemText\":\"Set-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRoutePortIdentity\",\"ListItemText\":\"Set-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"Set-AzFirewall\",\"ListItemText\":\"Set-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"Set-AzFirewall\\r\\n\"},{\"CompletionText\":\"Set-AzFirewallPolicy\",\"ListItemText\":\"Set-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"Set-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"Set-AzFrontDoor\",\"ListItemText\":\"Set-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"Set-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"Set-AzFrontDoorRulesEngine\",\"ListItemText\":\"Set-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"Set-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"Set-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightClusterDiskEncryptionKey\",\"ListItemText\":\"Set-AzHDInsightClusterDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightClusterDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightClusterSize\",\"ListItemText\":\"Set-AzHDInsightClusterSize\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightClusterSize\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightDefaultStorage\",\"ListItemText\":\"Set-AzHDInsightDefaultStorage\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightDefaultStorage\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightGatewayCredential\",\"ListItemText\":\"Set-AzHDInsightGatewayCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightGatewayCredential\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightPersistedScriptAction\",\"ListItemText\":\"Set-AzHDInsightPersistedScriptAction\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightPersistedScriptAction\\r\\n\"},{\"CompletionText\":\"Set-AzImageOsDisk\",\"ListItemText\":\"Set-AzImageOsDisk\",\"ResultType\":2,\"ToolTip\":\"Set-AzImageOsDisk\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccount\",\"ListItemText\":\"Set-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountAgreement\",\"ListItemText\":\"Set-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountAssembly\",\"ListItemText\":\"Set-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"Set-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountCertificate\",\"ListItemText\":\"Set-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountGeneratedIcn\",\"ListItemText\":\"Set-AzIntegrationAccountGeneratedIcn\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountGeneratedIcn\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountMap\",\"ListItemText\":\"Set-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountPartner\",\"ListItemText\":\"Set-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountReceivedIcn\",\"ListItemText\":\"Set-AzIntegrationAccountReceivedIcn\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountReceivedIcn\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountSchema\",\"ListItemText\":\"Set-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"Set-AzIotHub\",\"ListItemText\":\"Set-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHub\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubConfiguration\",\"ListItemText\":\"Set-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDeployment\",\"ListItemText\":\"Set-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDevice\",\"ListItemText\":\"Set-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDeviceParent\",\"ListItemText\":\"Set-AzIotHubDeviceParent\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDeviceParent\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDistributedTracing\",\"ListItemText\":\"Set-AzIotHubDistributedTracing\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDistributedTracing\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubEdgeModule\",\"ListItemText\":\"Set-AzIotHubEdgeModule\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubEdgeModule\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubMessageEnrichment\",\"ListItemText\":\"Set-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubModule\",\"ListItemText\":\"Set-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubMsgEnrich\",\"ListItemText\":\"Set-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Set-AzIotHubRoute\",\"ListItemText\":\"Set-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubTracing\",\"ListItemText\":\"Set-AzIotHubTracing\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubTracing\"},{\"CompletionText\":\"Set-AzIotHubVC\",\"ListItemText\":\"Set-AzIotHubVC\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubVC\"},{\"CompletionText\":\"Set-AzIotHubVerifiedCertificate\",\"ListItemText\":\"Set-AzIotHubVerifiedCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubVerifiedCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzIotSecuritySolution\",\"ListItemText\":\"Set-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Set-AzIpAllocation\",\"ListItemText\":\"Set-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"Set-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"Set-AzIpGroup\",\"ListItemText\":\"Set-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzIpGroup\\r\\n\"},{\"CompletionText\":\"Set-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Set-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultAccessPolicy\",\"ListItemText\":\"Set-AzKeyVaultAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultCertificateAttribute\",\"ListItemText\":\"Set-AzKeyVaultCertificateAttribute\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultCertificateAttribute\"},{\"CompletionText\":\"Set-AzKeyVaultCertificateIssuer\",\"ListItemText\":\"Set-AzKeyVaultCertificateIssuer\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultCertificateIssuer\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultCertificatePolicy\",\"ListItemText\":\"Set-AzKeyVaultCertificatePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultCertificatePolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultKey\",\"ListItemText\":\"Set-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultKey\"},{\"CompletionText\":\"Set-AzKeyVaultKeyAttribute\",\"ListItemText\":\"Set-AzKeyVaultKeyAttribute\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultKeyAttribute\"},{\"CompletionText\":\"Set-AzKeyVaultKeyRotationPolicy\",\"ListItemText\":\"Set-AzKeyVaultKeyRotationPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultKeyRotationPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultManagedStorageSasDefinition\",\"ListItemText\":\"Set-AzKeyVaultManagedStorageSasDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultManagedStorageSasDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultRoleDefinition\",\"ListItemText\":\"Set-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultRoleDefinition\"},{\"CompletionText\":\"Set-AzKeyVaultSecret\",\"ListItemText\":\"Set-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultSecretAttribute\",\"ListItemText\":\"Set-AzKeyVaultSecretAttribute\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultSecretAttribute\"},{\"CompletionText\":\"Set-AzLoadBalancer\",\"ListItemText\":\"Set-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"Set-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Set-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Set-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Set-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Set-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Set-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Set-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLocalNetworkGateway\",\"ListItemText\":\"Set-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"Set-AzLogicApp\",\"ListItemText\":\"Set-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Set-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Set-AzManagedApplication\",\"ListItemText\":\"Set-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"Set-AzManagedApplicationDefinition\",\"ListItemText\":\"Set-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzMarketplaceTerms\",\"ListItemText\":\"Set-AzMarketplaceTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzMarketplaceTerms \\r\\n\"},{\"CompletionText\":\"Set-AzMediaService\",\"ListItemText\":\"Set-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"Set-AzMediaService\\r\\n\"},{\"CompletionText\":\"Set-AzMediaServiceKey\",\"ListItemText\":\"Set-AzMediaServiceKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzMediaServiceKey\\r\\n\"},{\"CompletionText\":\"Set-AzMigrateDiskMapping\",\"ListItemText\":\"Set-AzMigrateDiskMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzMigrateDiskMapping \\r\\n\"},{\"CompletionText\":\"Set-AzMigrateServerReplication\",\"ListItemText\":\"Set-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Set-AzNatGateway\",\"ListItemText\":\"Set-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzNatGateway\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkInterface\",\"ListItemText\":\"Set-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Set-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Set-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManager\",\"ListItemText\":\"Set-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"Set-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerGroup\",\"ListItemText\":\"Set-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"Set-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerScopeConnection\",\"ListItemText\":\"Set-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"Set-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"Set-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"Set-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"Set-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkProfile\",\"ListItemText\":\"Set-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkSecurityGroup\",\"ListItemText\":\"Set-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Set-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkWatcherConfigFlowLog\",\"ListItemText\":\"Set-AzNetworkWatcherConfigFlowLog\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkWatcherConfigFlowLog\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Set-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkWatcherFlowLog\",\"ListItemText\":\"Set-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHub\",\"ListItemText\":\"Set-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"Set-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"Set-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"Set-AzNotificationHubsNamespace\",\"ListItemText\":\"Set-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"Set-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"Set-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"Set-AzOperationalInsightsDataSource\",\"ListItemText\":\"Set-AzOperationalInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsDataSource\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsIntelligencePack\",\"ListItemText\":\"Set-AzOperationalInsightsIntelligencePack\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsIntelligencePack\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsLinkedService\",\"ListItemText\":\"Set-AzOperationalInsightsLinkedService\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsLinkedService\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"Set-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"Set-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"Set-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Set-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyAssignment\",\"ListItemText\":\"Set-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyAttestation\",\"ListItemText\":\"Set-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyDefinition\",\"ListItemText\":\"Set-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyExemption\",\"ListItemText\":\"Set-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"Set-AzPolicySetDefinition\",\"ListItemText\":\"Set-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsRecordSet\",\"ListItemText\":\"Set-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"Set-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsZone\",\"ListItemText\":\"Set-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsZoneGroup\",\"ListItemText\":\"Set-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateEndpoint\",\"ListItemText\":\"Set-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateEndpointConnection\",\"ListItemText\":\"Set-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateLinkService\",\"ListItemText\":\"Set-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Set-AzPublicIpAddress\",\"ListItemText\":\"Set-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"Set-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"Set-AzPublicIpPrefix\",\"ListItemText\":\"Set-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Set-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrAlertSetting\",\"ListItemText\":\"Set-AzRecoveryServicesAsrAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrAlertSetting\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrNotificationSetting\",\"ListItemText\":\"Set-AzRecoveryServicesAsrNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrNotificationSetting\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"Set-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrVaultContext\",\"ListItemText\":\"Set-AzRecoveryServicesAsrVaultContext\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrVaultContext\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrVaultSettings\",\"ListItemText\":\"Set-AzRecoveryServicesAsrVaultSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrVaultSettings\"},{\"CompletionText\":\"Set-AzRecoveryServicesBackupProperty\",\"ListItemText\":\"Set-AzRecoveryServicesBackupProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesBackupProperty\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"Set-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesResourceGuardMapping\",\"ListItemText\":\"Set-AzRecoveryServicesResourceGuardMapping\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesResourceGuardMapping\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesVaultContext\",\"ListItemText\":\"Set-AzRecoveryServicesVaultContext\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesVaultContext\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesVaultProperty\",\"ListItemText\":\"Set-AzRecoveryServicesVaultProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesVaultProperty\\r\\n\"},{\"CompletionText\":\"Set-AzRedisCache\",\"ListItemText\":\"Set-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Set-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Set-AzRedisCacheDiagnostic\",\"ListItemText\":\"Set-AzRedisCacheDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzRedisCacheDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzRedisCacheDiagnostics\",\"ListItemText\":\"Set-AzRedisCacheDiagnostics\",\"ResultType\":2,\"ToolTip\":\"Set-AzRedisCacheDiagnostics\"},{\"CompletionText\":\"Set-AzRelayAuthorizationRule\",\"ListItemText\":\"Set-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Set-AzRelayHybridConnection\",\"ListItemText\":\"Set-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"Set-AzRelayNamespaceNetworkRuleSet\",\"ListItemText\":\"Set-AzRelayNamespaceNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzRelayNamespaceNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Set-AzResource\",\"ListItemText\":\"Set-AzResource\",\"ResultType\":2,\"ToolTip\":\"Set-AzResource\\r\\n\"},{\"CompletionText\":\"Set-AzResourceGroup\",\"ListItemText\":\"Set-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Set-AzResourceLock\",\"ListItemText\":\"Set-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"Set-AzResourceLock\\r\\n\"},{\"CompletionText\":\"Set-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Set-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzRoleAssignment\",\"ListItemText\":\"Set-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"Set-AzRoleDefinition\",\"ListItemText\":\"Set-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzRouteConfig\",\"ListItemText\":\"Set-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Set-AzRouteFilter\",\"ListItemText\":\"Set-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"Set-AzRouteFilterRuleConfig\",\"ListItemText\":\"Set-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzRouteTable\",\"ListItemText\":\"Set-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteTable\\r\\n\"},{\"CompletionText\":\"Set-AzRoutingIntent\",\"ListItemText\":\"Set-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"Set-AzRoutingPolicy\",\"ListItemText\":\"Set-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAlert\",\"ListItemText\":\"Set-AzSecurityAlert\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAlert\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAssessment\",\"ListItemText\":\"Set-AzSecurityAssessment\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAssessment\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAssessmentMetadata\",\"ListItemText\":\"Set-AzSecurityAssessmentMetadata\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAssessmentMetadata\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAutomation\",\"ListItemText\":\"Set-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAutomation\"},{\"CompletionText\":\"Set-AzSecurityAutoProvisioningSetting\",\"ListItemText\":\"Set-AzSecurityAutoProvisioningSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAutoProvisioningSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityContact\",\"ListItemText\":\"Set-AzSecurityContact\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityContact\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityPartnerProvider\",\"ListItemText\":\"Set-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityPricing\",\"ListItemText\":\"Set-AzSecurityPricing\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityPricing\\r\\n\"},{\"CompletionText\":\"Set-AzSecuritySetting\",\"ListItemText\":\"Set-AzSecuritySetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecuritySetting\\r\\n\"},{\"CompletionText\":\"Set-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Set-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityWorkspaceSetting\",\"ListItemText\":\"Set-AzSecurityWorkspaceSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityWorkspaceSetting\\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusAuthorizationRule\",\"ListItemText\":\"Set-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusGeoDRConfigurationBreakPair\",\"ListItemText\":\"Set-AzServiceBusGeoDRConfigurationBreakPair\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusGeoDRConfigurationBreakPair \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusGeoDRConfigurationFailOver\",\"ListItemText\":\"Set-AzServiceBusGeoDRConfigurationFailOver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusGeoDRConfigurationFailOver \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusNamespace\",\"ListItemText\":\"Set-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusNamespaceV2\",\"ListItemText\":\"Set-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"Set-AzServiceBusNetworkRuleSet\",\"ListItemText\":\"Set-AzServiceBusNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusQueue\",\"ListItemText\":\"Set-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusRule\",\"ListItemText\":\"Set-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusSubscription\",\"ListItemText\":\"Set-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusTopic\",\"ListItemText\":\"Set-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"Set-AzServiceEndpointPolicy\",\"ListItemText\":\"Set-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Set-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedCluster\",\"ListItemText\":\"Set-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterService\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Set-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricSetting\",\"ListItemText\":\"Set-AzServiceFabricSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricSetting\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricUpgradeType\",\"ListItemText\":\"Set-AzServiceFabricUpgradeType\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricUpgradeType\\r\\n\"},{\"CompletionText\":\"Set-AzSignalRUpstream\",\"ListItemText\":\"Set-AzSignalRUpstream\",\"ResultType\":2,\"ToolTip\":\"Set-AzSignalRUpstream\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotDiskEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotImageReference\",\"ListItemText\":\"Set-AzSnapshotImageReference\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotImageReference\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotKeyEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotUpdateDiskEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotUpdateDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotUpdateDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotUpdateKeyEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotUpdateKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotUpdateKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabase\",\"ListItemText\":\"Set-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseAdvisorAutoExecuteStatus\",\"ListItemText\":\"Set-AzSqlDatabaseAdvisorAutoExecuteStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseAdvisorAutoExecuteStatus\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseAudit\",\"ListItemText\":\"Set-AzSqlDatabaseAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseAudit\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseDataMaskingPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseDataMaskingPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseDataMaskingPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"Set-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Set-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseGeoBackupPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseGeoBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseGeoBackupPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Set-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseLongTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseLongTermRetentionPolicy\"},{\"CompletionText\":\"Set-AzSqlDatabaseRecommendedActionState\",\"ListItemText\":\"Set-AzSqlDatabaseRecommendedActionState\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseRecommendedActionState\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseSecondary\",\"ListItemText\":\"Set-AzSqlDatabaseSecondary\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseSecondary\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseSensitivityClassification\",\"ListItemText\":\"Set-AzSqlDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseServerAuditingPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseServerAuditingPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseServerAuditingPolicy\"},{\"CompletionText\":\"Set-AzSqlDatabaseTransparentDataEncryption\",\"ListItemText\":\"Set-AzSqlDatabaseTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Set-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJob\",\"ListItemText\":\"Set-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJobAgent\",\"ListItemText\":\"Set-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJobCredential\",\"ListItemText\":\"Set-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJobStep\",\"ListItemText\":\"Set-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticPool\",\"ListItemText\":\"Set-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticPoolAdvisorAutoExecuteStatus\",\"ListItemText\":\"Set-AzSqlElasticPoolAdvisorAutoExecuteStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticPoolAdvisorAutoExecuteStatus\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticPoolRecommendedActionState\",\"ListItemText\":\"Set-AzSqlElasticPoolRecommendedActionState\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticPoolRecommendedActionState\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInformationProtectionPolicy\",\"ListItemText\":\"Set-AzSqlInformationProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInformationProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstance\",\"ListItemText\":\"Set-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceActiveDirectoryAdministrator\",\"ListItemText\":\"Set-AzSqlInstanceActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabase\",\"ListItemText\":\"Set-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseSensitivityClassification\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDtc\",\"ListItemText\":\"Set-AzSqlInstanceDtc\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDtc\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceLink\",\"ListItemText\":\"Set-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceLink\"},{\"CompletionText\":\"Set-AzSqlInstancePool\",\"ListItemText\":\"Set-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceTDEProtector\",\"ListItemText\":\"Set-AzSqlInstanceTDEProtector\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceTDEProtector\"},{\"CompletionText\":\"Set-AzSqlInstanceTransparentDataEncryptionProtector\",\"ListItemText\":\"Set-AzSqlInstanceTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServer\",\"ListItemText\":\"Set-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServer\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerActiveDirectoryAdministrator\",\"ListItemText\":\"Set-AzSqlServerActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerAdvisorAutoExecuteStatus\",\"ListItemText\":\"Set-AzSqlServerAdvisorAutoExecuteStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerAdvisorAutoExecuteStatus\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerAudit\",\"ListItemText\":\"Set-AzSqlServerAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerAudit\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerConfigurationOption\",\"ListItemText\":\"Set-AzSqlServerConfigurationOption\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerConfigurationOption\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"Set-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerDnsAlias\",\"ListItemText\":\"Set-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerFirewallRule\",\"ListItemText\":\"Set-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"Set-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerMSSupportAudit\",\"ListItemText\":\"Set-AzSqlServerMSSupportAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerMSSupportAudit\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerRecommendedActionState\",\"ListItemText\":\"Set-AzSqlServerRecommendedActionState\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerRecommendedActionState\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerTransparentDataEncryptionProtector\",\"ListItemText\":\"Set-AzSqlServerTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerTrustGroup\",\"ListItemText\":\"Set-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerTrustGroup\"},{\"CompletionText\":\"Set-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"Set-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Set-AzStackHCI\",\"ListItemText\":\"Set-AzStackHCI\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzStackHCI \\r\\n\"},{\"CompletionText\":\"Set-AzStorageAccount\",\"ListItemText\":\"Set-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"Set-AzStorageAccountManagementPolicy\",\"ListItemText\":\"Set-AzStorageAccountManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageAccountManagementPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobContent\",\"ListItemText\":\"Set-AzStorageBlobContent\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobContent\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobImmutabilityPolicy\",\"ListItemText\":\"Set-AzStorageBlobImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobInventoryPolicy\",\"ListItemText\":\"Set-AzStorageBlobInventoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobInventoryPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobLegalHold\",\"ListItemText\":\"Set-AzStorageBlobLegalHold\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobLegalHold\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobTag\",\"ListItemText\":\"Set-AzStorageBlobTag\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobTag\\r\\n\"},{\"CompletionText\":\"Set-AzStorageContainerAcl\",\"ListItemText\":\"Set-AzStorageContainerAcl\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageContainerAcl\\r\\n\"},{\"CompletionText\":\"Set-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageCORSRule\",\"ListItemText\":\"Set-AzStorageCORSRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageCORSRule\\r\\n\"},{\"CompletionText\":\"Set-AzStorageFileContent\",\"ListItemText\":\"Set-AzStorageFileContent\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageFileContent\\r\\n\"},{\"CompletionText\":\"Set-AzStorageLocalUser\",\"ListItemText\":\"Set-AzStorageLocalUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageLocalUser\\r\\n\"},{\"CompletionText\":\"Set-AzStorageObjectReplicationPolicy\",\"ListItemText\":\"Set-AzStorageObjectReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageObjectReplicationPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageServiceLoggingProperty\",\"ListItemText\":\"Set-AzStorageServiceLoggingProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageServiceLoggingProperty\\r\\n\"},{\"CompletionText\":\"Set-AzStorageServiceMetricsProperty\",\"ListItemText\":\"Set-AzStorageServiceMetricsProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageServiceMetricsProperty\\r\\n\"},{\"CompletionText\":\"Set-AzStorageShareQuota\",\"ListItemText\":\"Set-AzStorageShareQuota\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageShareQuota\\r\\n\"},{\"CompletionText\":\"Set-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageSyncServerEndpoint\",\"ListItemText\":\"Set-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"Set-AzStorageSyncService\",\"ListItemText\":\"Set-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"Set-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseDataFlow\",\"ListItemText\":\"Set-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseDataFlow\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseDataset\",\"ListItemText\":\"Set-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseDataset\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Set-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseKqlScript\",\"ListItemText\":\"Set-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseKqlScript\"},{\"CompletionText\":\"Set-AzSynapseLinkConnection\",\"ListItemText\":\"Set-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseLinkConnectionLinkTable\",\"ListItemText\":\"Set-AzSynapseLinkConnectionLinkTable\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseLinkConnectionLinkTable\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseLinkedService\",\"ListItemText\":\"Set-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseLinkedService\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseManagedIdentitySqlControlSetting\",\"ListItemText\":\"Set-AzSynapseManagedIdentitySqlControlSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseManagedIdentitySqlControlSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"Set-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseManagedPrivateEndpoint\"},{\"CompletionText\":\"Set-AzSynapseNotebook\",\"ListItemText\":\"Set-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Set-AzSynapsePipeline\",\"ListItemText\":\"Set-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSparkConfiguration\",\"ListItemText\":\"Set-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSparkConfiguration\"},{\"CompletionText\":\"Set-AzSynapseSparkJobDefinition\",\"ListItemText\":\"Set-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSparkJobDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlActiveDirectoryAdministrator\",\"ListItemText\":\"Set-AzSynapseSqlActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlAudit\",\"ListItemText\":\"Set-AzSynapseSqlAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlAudit\"},{\"CompletionText\":\"Set-AzSynapseSqlAuditSetting\",\"ListItemText\":\"Set-AzSynapseSqlAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlAuditSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolAudit\",\"ListItemText\":\"Set-AzSynapseSqlPoolAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolAudit\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolAuditSetting\",\"ListItemText\":\"Set-AzSynapseSqlPoolAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolAuditSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolSensitivityClassification\",\"ListItemText\":\"Set-AzSynapseSqlPoolSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolTransparentDataEncryption\",\"ListItemText\":\"Set-AzSynapseSqlPoolTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Set-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlScript\",\"ListItemText\":\"Set-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseTrigger\",\"ListItemText\":\"Set-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Set-AzTemplateSpec\",\"ListItemText\":\"Set-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Set-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Set-AzTrafficManagerEndpoint\",\"ListItemText\":\"Set-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Set-AzTrafficManagerProfile\",\"ListItemText\":\"Set-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualHub\",\"ListItemText\":\"Set-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetwork\",\"ListItemText\":\"Set-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGateway\",\"ListItemText\":\"Set-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Set-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGatewayConnectionSharedKey\",\"ListItemText\":\"Set-AzVirtualNetworkGatewayConnectionSharedKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGatewayConnectionSharedKey\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGatewayDefaultSite\",\"ListItemText\":\"Set-AzVirtualNetworkGatewayDefaultSite\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGatewayDefaultSite\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkPeering\",\"ListItemText\":\"Set-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Set-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkTap\",\"ListItemText\":\"Set-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"Set-AzVM\",\"ListItemText\":\"Set-AzVM\",\"ResultType\":2,\"ToolTip\":\"Set-AzVM\\r\\n\"},{\"CompletionText\":\"Set-AzVMAccessExtension\",\"ListItemText\":\"Set-AzVMAccessExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMAccessExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMADDomainExtension\",\"ListItemText\":\"Set-AzVMADDomainExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMADDomainExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMAEMExtension\",\"ListItemText\":\"Set-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMBackupExtension\",\"ListItemText\":\"Set-AzVMBackupExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMBackupExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMBginfoExtension\",\"ListItemText\":\"Set-AzVMBginfoExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMBginfoExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMBootDiagnostic\",\"ListItemText\":\"Set-AzVMBootDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMBootDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzVMChefExtension\",\"ListItemText\":\"Set-AzVMChefExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMChefExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMCustomScriptExtension\",\"ListItemText\":\"Set-AzVMCustomScriptExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMCustomScriptExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMDataDisk\",\"ListItemText\":\"Set-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"Set-AzVMDiagnosticsExtension\",\"ListItemText\":\"Set-AzVMDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMDiskEncryptionExtension\",\"ListItemText\":\"Set-AzVMDiskEncryptionExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDiskEncryptionExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMDscExtension\",\"ListItemText\":\"Set-AzVMDscExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDscExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMExtension\",\"ListItemText\":\"Set-AzVMExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMOperatingSystem\",\"ListItemText\":\"Set-AzVMOperatingSystem\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMOperatingSystem\\r\\n\"},{\"CompletionText\":\"Set-AzVMOSDisk\",\"ListItemText\":\"Set-AzVMOSDisk\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMOSDisk\\r\\n\"},{\"CompletionText\":\"Set-AzVMPlan\",\"ListItemText\":\"Set-AzVMPlan\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMPlan\\r\\n\"},{\"CompletionText\":\"Set-AzVMRunCommand\",\"ListItemText\":\"Set-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzVMRunCommand \\r\\n\"},{\"CompletionText\":\"Set-AzVmSecurityProfile\",\"ListItemText\":\"Set-AzVmSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmSecurityProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVMSourceImage\",\"ListItemText\":\"Set-AzVMSourceImage\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMSourceImage\\r\\n\"},{\"CompletionText\":\"Set-AzVMSqlServerExtension\",\"ListItemText\":\"Set-AzVMSqlServerExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMSqlServerExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVmss\",\"ListItemText\":\"Set-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmss\\r\\n\"},{\"CompletionText\":\"Set-AzVmssBootDiagnostic\",\"ListItemText\":\"Set-AzVmssBootDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssBootDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzVmssDiskEncryptionExtension\",\"ListItemText\":\"Set-AzVmssDiskEncryptionExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssDiskEncryptionExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVmssOrchestrationServiceState\",\"ListItemText\":\"Set-AzVmssOrchestrationServiceState\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssOrchestrationServiceState\\r\\n\"},{\"CompletionText\":\"Set-AzVmssOsProfile\",\"ListItemText\":\"Set-AzVmssOsProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssOsProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVmssRollingUpgradePolicy\",\"ListItemText\":\"Set-AzVmssRollingUpgradePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssRollingUpgradePolicy\\r\\n\"},{\"CompletionText\":\"Set-AzVmssSecurityProfile\",\"ListItemText\":\"Set-AzVmssSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssSecurityProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVmssStorageProfile\",\"ListItemText\":\"Set-AzVmssStorageProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssStorageProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVmssUefi\",\"ListItemText\":\"Set-AzVmssUefi\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssUefi\\r\\n\"},{\"CompletionText\":\"Set-AzVmssVM\",\"ListItemText\":\"Set-AzVmssVM\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssVM\\r\\n\"},{\"CompletionText\":\"Set-AzVmssVMRunCommand\",\"ListItemText\":\"Set-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzVmssVMRunCommand \\r\\n\"},{\"CompletionText\":\"Set-AzVmUefi\",\"ListItemText\":\"Set-AzVmUefi\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmUefi\\r\\n\"},{\"CompletionText\":\"Set-AzVpnClientIpsecParameter\",\"ListItemText\":\"Set-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"Set-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"Set-AzWcfRelay\",\"ListItemText\":\"Set-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"Set-AzWebApp\",\"ListItemText\":\"Set-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Set-AzWebApp\\r\\n\"},{\"CompletionText\":\"Set-AzWebAppSlot\",\"ListItemText\":\"Set-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Set-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Set-AzWebAppSlotConfigName\",\"ListItemText\":\"Set-AzWebAppSlotConfigName\",\"ResultType\":2,\"ToolTip\":\"Set-AzWebAppSlotConfigName\\r\\n\"},{\"CompletionText\":\"Set-BCAuthentication\",\"ListItemText\":\"Set-BCAuthentication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCAuthentication \\r\\n\"},{\"CompletionText\":\"Set-BCCache\",\"ListItemText\":\"Set-BCCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCCache \\r\\n\"},{\"CompletionText\":\"Set-BCDataCacheEntryMaxAge\",\"ListItemText\":\"Set-BCDataCacheEntryMaxAge\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCDataCacheEntryMaxAge \\r\\n\"},{\"CompletionText\":\"Set-BcdBootDefault\",\"ListItemText\":\"Set-BcdBootDefault\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootDefault\\r\\n\"},{\"CompletionText\":\"Set-BcdBootDisplayOrder\",\"ListItemText\":\"Set-BcdBootDisplayOrder\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootDisplayOrder\\r\\n\"},{\"CompletionText\":\"Set-BcdBootSequence\",\"ListItemText\":\"Set-BcdBootSequence\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootSequence\\r\\n\"},{\"CompletionText\":\"Set-BcdBootTimeout\",\"ListItemText\":\"Set-BcdBootTimeout\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootTimeout\\r\\n\"},{\"CompletionText\":\"Set-BcdBootToolsDisplayOrder\",\"ListItemText\":\"Set-BcdBootToolsDisplayOrder\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootToolsDisplayOrder\\r\\n\"},{\"CompletionText\":\"Set-BcdDebugSettings\",\"ListItemText\":\"Set-BcdDebugSettings\",\"ResultType\":2,\"ToolTip\":\"Set-BcdDebugSettings\\r\\n\"},{\"CompletionText\":\"Set-BcdElement\",\"ListItemText\":\"Set-BcdElement\",\"ResultType\":2,\"ToolTip\":\"Set-BcdElement\\r\\n\"},{\"CompletionText\":\"Set-BcdHypervisorSettings\",\"ListItemText\":\"Set-BcdHypervisorSettings\",\"ResultType\":2,\"ToolTip\":\"Set-BcdHypervisorSettings\\r\\n\"},{\"CompletionText\":\"Set-BCMinSMBLatency\",\"ListItemText\":\"Set-BCMinSMBLatency\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCMinSMBLatency \\r\\n\"},{\"CompletionText\":\"Set-BCSecretKey\",\"ListItemText\":\"Set-BCSecretKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCSecretKey \\r\\n\"},{\"CompletionText\":\"Set-BitsTransfer\",\"ListItemText\":\"Set-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Set-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Set-CertificateAutoEnrollmentPolicy\",\"ListItemText\":\"Set-CertificateAutoEnrollmentPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-CertificateAutoEnrollmentPolicy\\r\\n\"},{\"CompletionText\":\"Set-CimInstance\",\"ListItemText\":\"Set-CimInstance\",\"ResultType\":2,\"ToolTip\":\"Set-CimInstance\\r\\n\"},{\"CompletionText\":\"Set-CIPolicyIdInfo\",\"ListItemText\":\"Set-CIPolicyIdInfo\",\"ResultType\":2,\"ToolTip\":\"Set-CIPolicyIdInfo\\r\\n\"},{\"CompletionText\":\"Set-CIPolicySetting\",\"ListItemText\":\"Set-CIPolicySetting\",\"ResultType\":2,\"ToolTip\":\"Set-CIPolicySetting\\r\\n\"},{\"CompletionText\":\"Set-CIPolicyVersion\",\"ListItemText\":\"Set-CIPolicyVersion\",\"ResultType\":2,\"ToolTip\":\"Set-CIPolicyVersion\\r\\n\"},{\"CompletionText\":\"Set-Clipboard\",\"ListItemText\":\"Set-Clipboard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Clipboard [-Value] [-Append] [-PassThru] [-AsOSC52] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-ClusteredScheduledTask\",\"ListItemText\":\"Set-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Set-Content\",\"ListItemText\":\"Set-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Content [-Path] [-Value] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\\r\\nSet-Content [-Value] -LiteralPath [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Set-Culture\",\"ListItemText\":\"Set-Culture\",\"ResultType\":2,\"ToolTip\":\"Set-Culture\\r\\n\"},{\"CompletionText\":\"Set-DAClientExperienceConfiguration\",\"ListItemText\":\"Set-DAClientExperienceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DAClientExperienceConfiguration \\r\\n\"},{\"CompletionText\":\"Set-DAEntryPointTableItem\",\"ListItemText\":\"Set-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Set-Date\",\"ListItemText\":\"Set-Date\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Date [-Date] [-DisplayHint ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-Date [-Adjust] [-DisplayHint ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-DeliveryOptimizationStatus\",\"ListItemText\":\"Set-DeliveryOptimizationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DeliveryOptimizationStatus \\r\\n\"},{\"CompletionText\":\"Set-Disk\",\"ListItemText\":\"Set-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Disk \\r\\n\"},{\"CompletionText\":\"Set-DnsClient\",\"ListItemText\":\"Set-DnsClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClient \\r\\n\"},{\"CompletionText\":\"Set-DnsClientDohServerAddress\",\"ListItemText\":\"Set-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Set-DnsClientGlobalSetting\",\"ListItemText\":\"Set-DnsClientGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientGlobalSetting \\r\\n\"},{\"CompletionText\":\"Set-DnsClientNrptGlobal\",\"ListItemText\":\"Set-DnsClientNrptGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientNrptGlobal \\r\\n\"},{\"CompletionText\":\"Set-DnsClientNrptRule\",\"ListItemText\":\"Set-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Set-DnsClientServerAddress\",\"ListItemText\":\"Set-DnsClientServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientServerAddress \\r\\n\"},{\"CompletionText\":\"Set-DODownloadMode\",\"ListItemText\":\"Set-DODownloadMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DODownloadMode \\r\\n\"},{\"CompletionText\":\"Set-DOMaxBackgroundBandwidth\",\"ListItemText\":\"Set-DOMaxBackgroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOMaxBackgroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DOMaxForegroundBandwidth\",\"ListItemText\":\"Set-DOMaxForegroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOMaxForegroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DOPercentageMaxBackgroundBandwidth\",\"ListItemText\":\"Set-DOPercentageMaxBackgroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOPercentageMaxBackgroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DOPercentageMaxForegroundBandwidth\",\"ListItemText\":\"Set-DOPercentageMaxForegroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOPercentageMaxForegroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DscLocalConfigurationManager\",\"ListItemText\":\"Set-DscLocalConfigurationManager\",\"ResultType\":2,\"ToolTip\":\"Set-DscLocalConfigurationManager\\r\\n\"},{\"CompletionText\":\"Set-DtcAdvancedHostSetting\",\"ListItemText\":\"Set-DtcAdvancedHostSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcAdvancedHostSetting \\r\\n\"},{\"CompletionText\":\"Set-DtcAdvancedSetting\",\"ListItemText\":\"Set-DtcAdvancedSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcAdvancedSetting \\r\\n\"},{\"CompletionText\":\"Set-DtcClusterDefault\",\"ListItemText\":\"Set-DtcClusterDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcClusterDefault \\r\\n\"},{\"CompletionText\":\"Set-DtcClusterTMMapping\",\"ListItemText\":\"Set-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Set-DtcDefault\",\"ListItemText\":\"Set-DtcDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcDefault \\r\\n\"},{\"CompletionText\":\"Set-DtcLog\",\"ListItemText\":\"Set-DtcLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcLog \\r\\n\"},{\"CompletionText\":\"Set-DtcNetworkSetting\",\"ListItemText\":\"Set-DtcNetworkSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcNetworkSetting \\r\\n\"},{\"CompletionText\":\"Set-DtcTransaction\",\"ListItemText\":\"Set-DtcTransaction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcTransaction \\r\\n\"},{\"CompletionText\":\"Set-DtcTransactionsTraceSession\",\"ListItemText\":\"Set-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Set-DtcTransactionsTraceSetting\",\"ListItemText\":\"Set-DtcTransactionsTraceSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcTransactionsTraceSetting \\r\\n\"},{\"CompletionText\":\"Set-DynamicParameterVariables\",\"ListItemText\":\"Set-DynamicParameterVariables\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DynamicParameterVariables \\r\\n\"},{\"CompletionText\":\"Set-EtwTraceProvider\",\"ListItemText\":\"Set-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Set-EtwTraceSession\",\"ListItemText\":\"Set-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"Set-EtwTraceSession\"},{\"CompletionText\":\"Set-ExecutionPolicy\",\"ListItemText\":\"Set-ExecutionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-ExecutionPolicy\\r\\n\"},{\"CompletionText\":\"Set-FileIntegrity\",\"ListItemText\":\"Set-FileIntegrity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-FileIntegrity \\r\\n\"},{\"CompletionText\":\"Set-FileShare\",\"ListItemText\":\"Set-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-FileShare \\r\\n\"},{\"CompletionText\":\"Set-FileStorageTier\",\"ListItemText\":\"Set-FileStorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-FileStorageTier \\r\\n\"},{\"CompletionText\":\"Set-HgsClientConfiguration\",\"ListItemText\":\"Set-HgsClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-HgsClientConfiguration \\r\\n\"},{\"CompletionText\":\"Set-HgsClientHostKey\",\"ListItemText\":\"Set-HgsClientHostKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-HgsClientHostKey \\r\\n\"},{\"CompletionText\":\"Set-HVCIOptions\",\"ListItemText\":\"Set-HVCIOptions\",\"ResultType\":2,\"ToolTip\":\"Set-HVCIOptions\\r\\n\"},{\"CompletionText\":\"Set-InitiatorPort\",\"ListItemText\":\"Set-InitiatorPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-InitiatorPort \\r\\n\"},{\"CompletionText\":\"Set-IscsiChapSecret\",\"ListItemText\":\"Set-IscsiChapSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-IscsiChapSecret \\r\\n\"},{\"CompletionText\":\"Set-Item\",\"ListItemText\":\"Set-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Item [-Path] [[-Value] ] [-Force] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-Item [[-Value] ] -LiteralPath [-Force] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-ItemProperty\",\"ListItemText\":\"Set-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ItemProperty [-Path] [-Name] [-Value] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-ItemProperty [-Path] -InputObject [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-ItemProperty [-Name] [-Value] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-ItemProperty -LiteralPath -InputObject [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-JobTrigger\",\"ListItemText\":\"Set-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Set-JobTrigger\\r\\n\"},{\"CompletionText\":\"Set-KdsConfiguration\",\"ListItemText\":\"Set-KdsConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-KdsConfiguration\\r\\n\"},{\"CompletionText\":\"Set-LapsADAuditing\",\"ListItemText\":\"Set-LapsADAuditing\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADAuditing\\r\\n\"},{\"CompletionText\":\"Set-LapsADComputerSelfPermission\",\"ListItemText\":\"Set-LapsADComputerSelfPermission\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADComputerSelfPermission\\r\\n\"},{\"CompletionText\":\"Set-LapsADPasswordExpirationTime\",\"ListItemText\":\"Set-LapsADPasswordExpirationTime\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADPasswordExpirationTime\\r\\n\"},{\"CompletionText\":\"Set-LapsADReadPasswordPermission\",\"ListItemText\":\"Set-LapsADReadPasswordPermission\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADReadPasswordPermission\\r\\n\"},{\"CompletionText\":\"Set-LapsADResetPasswordPermission\",\"ListItemText\":\"Set-LapsADResetPasswordPermission\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADResetPasswordPermission\\r\\n\"},{\"CompletionText\":\"Set-LocalGroup\",\"ListItemText\":\"Set-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Set-LocalGroup\\r\\n\"},{\"CompletionText\":\"Set-LocalUser\",\"ListItemText\":\"Set-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Set-LocalUser\\r\\n\"},{\"CompletionText\":\"Set-Location\",\"ListItemText\":\"Set-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Location [[-Path] ] [-PassThru] []\\r\\n\\r\\nSet-Location -LiteralPath [-PassThru] []\\r\\n\\r\\nSet-Location [-PassThru] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"Set-LogProperties\",\"ListItemText\":\"Set-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-LogProperties \\r\\n\"},{\"CompletionText\":\"Set-MappedKeyHandler\",\"ListItemText\":\"Set-MappedKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MappedKeyHandler [[-Chord] ] [[-Sequence] ]\\r\\n\"},{\"CompletionText\":\"Set-MappedKeyHandlers\",\"ListItemText\":\"Set-MappedKeyHandlers\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MappedKeyHandlers \\r\\n\"},{\"CompletionText\":\"Set-MarkdownOption\",\"ListItemText\":\"Set-MarkdownOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MarkdownOption [-Header1Color ] [-Header2Color ] [-Header3Color ] [-Header4Color ] [-Header5Color ] [-Header6Color ] [-Code ] [-ImageAltTextForegroundColor ] [-LinkForegroundColor ] [-ItalicsForegroundColor ] [-BoldForegroundColor ] [-PassThru] []\\r\\n\\r\\nSet-MarkdownOption -Theme [-PassThru] []\\r\\n\\r\\nSet-MarkdownOption [-InputObject] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Set-MMAgent\",\"ListItemText\":\"Set-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MMAgent \\r\\n\"},{\"CompletionText\":\"Set-MpPreference\",\"ListItemText\":\"Set-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MpPreference \\r\\n\"},{\"CompletionText\":\"Set-NCSIPolicyConfiguration\",\"ListItemText\":\"Set-NCSIPolicyConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NCSIPolicyConfiguration \\r\\n\"},{\"CompletionText\":\"Set-Net6to4Configuration\",\"ListItemText\":\"Set-Net6to4Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Net6to4Configuration \\r\\n\"},{\"CompletionText\":\"Set-NetAdapter\",\"ListItemText\":\"Set-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapter \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterAdvancedProperty\",\"ListItemText\":\"Set-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterBinding\",\"ListItemText\":\"Set-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterChecksumOffload\",\"ListItemText\":\"Set-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterDataPathConfiguration\",\"ListItemText\":\"Set-NetAdapterDataPathConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterDataPathConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Set-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterIPsecOffload\",\"ListItemText\":\"Set-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterLso\",\"ListItemText\":\"Set-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterPacketDirect\",\"ListItemText\":\"Set-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterPowerManagement\",\"ListItemText\":\"Set-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterQos\",\"ListItemText\":\"Set-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterRdma\",\"ListItemText\":\"Set-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterRsc\",\"ListItemText\":\"Set-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterRss\",\"ListItemText\":\"Set-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterSriov\",\"ListItemText\":\"Set-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterUso\",\"ListItemText\":\"Set-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterVmq\",\"ListItemText\":\"Set-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Set-NetConnectionProfile\",\"ListItemText\":\"Set-NetConnectionProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetConnectionProfile \\r\\n\"},{\"CompletionText\":\"Set-NetDnsTransitionConfiguration\",\"ListItemText\":\"Set-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetEventPacketCaptureProvider\",\"ListItemText\":\"Set-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventProvider\",\"ListItemText\":\"Set-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventSession\",\"ListItemText\":\"Set-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventSession \\r\\n\"},{\"CompletionText\":\"Set-NetEventVFPProvider\",\"ListItemText\":\"Set-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventVmSwitchProvider\",\"ListItemText\":\"Set-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventWFPCaptureProvider\",\"ListItemText\":\"Set-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallAddressFilter\",\"ListItemText\":\"Set-NetFirewallAddressFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallAddressFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallApplicationFilter\",\"ListItemText\":\"Set-NetFirewallApplicationFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallApplicationFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallHyperVProfile\",\"ListItemText\":\"Set-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallHyperVRule\",\"ListItemText\":\"Set-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallHyperVVMSetting\",\"ListItemText\":\"Set-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallInterfaceFilter\",\"ListItemText\":\"Set-NetFirewallInterfaceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallInterfaceFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallInterfaceTypeFilter\",\"ListItemText\":\"Set-NetFirewallInterfaceTypeFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallInterfaceTypeFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallPortFilter\",\"ListItemText\":\"Set-NetFirewallPortFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallPortFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallProfile\",\"ListItemText\":\"Set-NetFirewallProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallProfile \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallRule\",\"ListItemText\":\"Set-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallSecurityFilter\",\"ListItemText\":\"Set-NetFirewallSecurityFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallSecurityFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallServiceFilter\",\"ListItemText\":\"Set-NetFirewallServiceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallServiceFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallSetting\",\"ListItemText\":\"Set-NetFirewallSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallSetting \\r\\n\"},{\"CompletionText\":\"Set-NetIPAddress\",\"ListItemText\":\"Set-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPAddress \\r\\n\"},{\"CompletionText\":\"Set-NetIPHttpsConfiguration\",\"ListItemText\":\"Set-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetIPInterface\",\"ListItemText\":\"Set-NetIPInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPInterface \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecDospSetting\",\"ListItemText\":\"Set-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Set-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecMainModeRule\",\"ListItemText\":\"Set-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Set-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Set-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Set-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecRule\",\"ListItemText\":\"Set-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Set-NetIPv4Protocol\",\"ListItemText\":\"Set-NetIPv4Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPv4Protocol \\r\\n\"},{\"CompletionText\":\"Set-NetIPv6Protocol\",\"ListItemText\":\"Set-NetIPv6Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPv6Protocol \\r\\n\"},{\"CompletionText\":\"Set-NetIsatapConfiguration\",\"ListItemText\":\"Set-NetIsatapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIsatapConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetLbfoTeam\",\"ListItemText\":\"Set-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Set-NetLbfoTeamMember\",\"ListItemText\":\"Set-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Set-NetLbfoTeamNic\",\"ListItemText\":\"Set-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Set-NetNat\",\"ListItemText\":\"Set-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNat \\r\\n\"},{\"CompletionText\":\"Set-NetNatGlobal\",\"ListItemText\":\"Set-NetNatGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNatGlobal \\r\\n\"},{\"CompletionText\":\"Set-NetNatTransitionConfiguration\",\"ListItemText\":\"Set-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetNeighbor\",\"ListItemText\":\"Set-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNeighbor \\r\\n\"},{\"CompletionText\":\"Set-NetOffloadGlobalSetting\",\"ListItemText\":\"Set-NetOffloadGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetOffloadGlobalSetting \\r\\n\"},{\"CompletionText\":\"Set-NetQosPolicy\",\"ListItemText\":\"Set-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"Set-NetRoute\",\"ListItemText\":\"Set-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetRoute \\r\\n\"},{\"CompletionText\":\"Set-NetTCPSetting\",\"ListItemText\":\"Set-NetTCPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetTCPSetting \\r\\n\"},{\"CompletionText\":\"Set-NetTeredoConfiguration\",\"ListItemText\":\"Set-NetTeredoConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetTeredoConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetUDPSetting\",\"ListItemText\":\"Set-NetUDPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetUDPSetting \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchEthernetPortIPAddress\",\"ListItemText\":\"Set-NetworkSwitchEthernetPortIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchEthernetPortIPAddress \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchPortMode\",\"ListItemText\":\"Set-NetworkSwitchPortMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchPortMode \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchPortProperty\",\"ListItemText\":\"Set-NetworkSwitchPortProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchPortProperty \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchVlanProperty\",\"ListItemText\":\"Set-NetworkSwitchVlanProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchVlanProperty \\r\\n\"},{\"CompletionText\":\"Set-NonRemovableAppsPolicy\",\"ListItemText\":\"Set-NonRemovableAppsPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-NonRemovableAppsPolicy\\r\\n\"},{\"CompletionText\":\"Set-OdbcDriver\",\"ListItemText\":\"Set-OdbcDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-OdbcDriver \\r\\n\"},{\"CompletionText\":\"Set-OdbcDsn\",\"ListItemText\":\"Set-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Set-PackageSource\",\"ListItemText\":\"Set-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Set-PackageSource\\r\\n\"},{\"CompletionText\":\"Set-Partition\",\"ListItemText\":\"Set-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Partition \\r\\n\"},{\"CompletionText\":\"Set-PcsvDeviceBootConfiguration\",\"ListItemText\":\"Set-PcsvDeviceBootConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PcsvDeviceBootConfiguration \\r\\n\"},{\"CompletionText\":\"Set-PcsvDeviceNetworkConfiguration\",\"ListItemText\":\"Set-PcsvDeviceNetworkConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PcsvDeviceNetworkConfiguration \\r\\n\"},{\"CompletionText\":\"Set-PcsvDeviceUserPassword\",\"ListItemText\":\"Set-PcsvDeviceUserPassword\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PcsvDeviceUserPassword \\r\\n\"},{\"CompletionText\":\"Set-PhysicalDisk\",\"ListItemText\":\"Set-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Set-PreferredLanguage\",\"ListItemText\":\"Set-PreferredLanguage\",\"ResultType\":2,\"ToolTip\":\"Set-PreferredLanguage\"},{\"CompletionText\":\"Set-PrintConfiguration\",\"ListItemText\":\"Set-PrintConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PrintConfiguration \\r\\n\"},{\"CompletionText\":\"Set-Printer\",\"ListItemText\":\"Set-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Printer \\r\\n\"},{\"CompletionText\":\"Set-PrinterProperty\",\"ListItemText\":\"Set-PrinterProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PrinterProperty \\r\\n\"},{\"CompletionText\":\"Set-ProcessMitigation\",\"ListItemText\":\"Set-ProcessMitigation\",\"ResultType\":2,\"ToolTip\":\"Set-ProcessMitigation\\r\\n\"},{\"CompletionText\":\"Set-ProvisionedAppPackageDataFile\",\"ListItemText\":\"Set-ProvisionedAppPackageDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-ProvisionedAppPackageDataFile\"},{\"CompletionText\":\"Set-ProvisionedAppXDataFile\",\"ListItemText\":\"Set-ProvisionedAppXDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-ProvisionedAppXDataFile\"},{\"CompletionText\":\"Set-PSBreakpoint\",\"ListItemText\":\"Set-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSBreakpoint [-Script] [-Line] [[-Column] ] [-Action ] [-Runspace ] []\\r\\n\\r\\nSet-PSBreakpoint [[-Script] ] -Command [-Action ] [-Runspace ] []\\r\\n\\r\\nSet-PSBreakpoint [[-Script] ] -Variable [-Action ] [-Mode ] [-Runspace ] []\\r\\n\"},{\"CompletionText\":\"Set-PSDebug\",\"ListItemText\":\"Set-PSDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSDebug [-Trace ] [-Step] [-Strict] []\\r\\n\\r\\nSet-PSDebug [-Off] []\\r\\n\"},{\"CompletionText\":\"Set-PSReadLineKeyHandler\",\"ListItemText\":\"Set-PSReadLineKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSReadLineKeyHandler [-Chord] [-ScriptBlock] [-BriefDescription ] [-Description ] [-ViMode ] []\\r\\n\\r\\nSet-PSReadLineKeyHandler [-Chord] [-Function] [-ViMode ] []\\r\\n\"},{\"CompletionText\":\"Set-PSReadLineOption\",\"ListItemText\":\"Set-PSReadLineOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSReadLineOption [-EditMode ] [-ContinuationPrompt ] [-HistoryNoDuplicates] [-AddToHistoryHandler ] [-CommandValidationHandler ] [-HistorySearchCursorMovesToEnd] [-MaximumHistoryCount ] [-MaximumKillRingCount ] [-ShowToolTips] [-ExtraPromptLineCount ] [-DingTone ] [-DingDuration ] [-BellStyle ] [-CompletionQueryItems ] [-WordDelimiters ] [-HistorySearchCaseSensitive] [-HistorySaveStyle ] [-HistorySavePath ] [-AnsiEscapeTimeout ] [-PromptText ] [-ViModeIndicator ] [-ViModeChangeHandler ] [-PredictionSource ] [-PredictionViewStyle ] [-Colors ] [-TerminateOrphanedConsoleApps] []\\r\\n\"},{\"CompletionText\":\"Set-PSRepository\",\"ListItemText\":\"Set-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSRepository \\r\\n\"},{\"CompletionText\":\"Set-PSResourceRepository\",\"ListItemText\":\"Set-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Set-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Set-PSSessionConfiguration\",\"ListItemText\":\"Set-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSSessionConfiguration [-Name] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-PSSessionConfiguration [-Name] [-AssemblyName] [-ConfigurationTypeName] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-PSSessionConfiguration [-Name] -Path [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-TransportOption ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-ResiliencySetting\",\"ListItemText\":\"Set-ResiliencySetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ResiliencySetting \\r\\n\"},{\"CompletionText\":\"Set-RuleOption\",\"ListItemText\":\"Set-RuleOption\",\"ResultType\":2,\"ToolTip\":\"Set-RuleOption\\r\\n\"},{\"CompletionText\":\"Set-ScheduledJob\",\"ListItemText\":\"Set-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Set-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Set-ScheduledJobOption\",\"ListItemText\":\"Set-ScheduledJobOption\",\"ResultType\":2,\"ToolTip\":\"Set-ScheduledJobOption\\r\\n\"},{\"CompletionText\":\"Set-ScheduledTask\",\"ListItemText\":\"Set-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Set-SecureBootUEFI\",\"ListItemText\":\"Set-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Set-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"Set-Service\",\"ListItemText\":\"Set-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Service [-Name] [-DisplayName ] [-Credential ] [-Description ] [-StartupType ] [-SecurityDescriptorSddl ] [-Status ] [-Force] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-Service [-InputObject] [-DisplayName ] [-Credential ] [-Description ] [-StartupType ] [-SecurityDescriptorSddl ] [-Status ] [-Force] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-SmbBandwidthLimit\",\"ListItemText\":\"Set-SmbBandwidthLimit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbBandwidthLimit \\r\\n\"},{\"CompletionText\":\"Set-SmbClientCertificateMapping\",\"ListItemText\":\"Set-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"Set-SmbClientConfiguration\",\"ListItemText\":\"Set-SmbClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbClientConfiguration \\r\\n\"},{\"CompletionText\":\"Set-SmbPathAcl\",\"ListItemText\":\"Set-SmbPathAcl\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbPathAcl \\r\\n\"},{\"CompletionText\":\"Set-SmbServerCertificateMapping\",\"ListItemText\":\"Set-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"Set-SmbServerConfiguration\",\"ListItemText\":\"Set-SmbServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbServerConfiguration \\r\\n\"},{\"CompletionText\":\"Set-SmbShare\",\"ListItemText\":\"Set-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbShare \\r\\n\"},{\"CompletionText\":\"Set-StorageBusCache\",\"ListItemText\":\"Set-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Set-StorageBusProfile\",\"ListItemText\":\"Set-StorageBusProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageBusProfile \\r\\n\"},{\"CompletionText\":\"Set-StorageFileServer\",\"ListItemText\":\"Set-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageFileServer \\r\\n\"},{\"CompletionText\":\"Set-StorageHealthSetting\",\"ListItemText\":\"Set-StorageHealthSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageHealthSetting \\r\\n\"},{\"CompletionText\":\"Set-StoragePool\",\"ListItemText\":\"Set-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StoragePool \\r\\n\"},{\"CompletionText\":\"Set-StorageProvider\",\"ListItemText\":\"Set-StorageProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageProvider \\r\\n\"},{\"CompletionText\":\"Set-StorageSetting\",\"ListItemText\":\"Set-StorageSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageSetting \\r\\n\"},{\"CompletionText\":\"Set-StorageSubSystem\",\"ListItemText\":\"Set-StorageSubSystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageSubSystem \\r\\n\"},{\"CompletionText\":\"Set-StorageTier\",\"ListItemText\":\"Set-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageTier \\r\\n\"},{\"CompletionText\":\"Set-StrictMode\",\"ListItemText\":\"Set-StrictMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StrictMode -Version []\\r\\n\\r\\nSet-StrictMode -Off []\\r\\n\"},{\"CompletionText\":\"Set-SystemLanguage\",\"ListItemText\":\"Set-SystemLanguage\",\"ResultType\":2,\"ToolTip\":\"Set-SystemLanguage\"},{\"CompletionText\":\"Set-SystemPreferredUILanguage\",\"ListItemText\":\"Set-SystemPreferredUILanguage\",\"ResultType\":2,\"ToolTip\":\"Set-SystemPreferredUILanguage\\r\\n\"},{\"CompletionText\":\"Set-TestInconclusive\",\"ListItemText\":\"Set-TestInconclusive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-TestInconclusive \\r\\n\"},{\"CompletionText\":\"Set-TimeZone\",\"ListItemText\":\"Set-TimeZone\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-TimeZone [-Name] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-TimeZone -Id [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-TimeZone [-InputObject] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-TpmOwnerAuth\",\"ListItemText\":\"Set-TpmOwnerAuth\",\"ResultType\":2,\"ToolTip\":\"Set-TpmOwnerAuth\\r\\n\"},{\"CompletionText\":\"Set-TraceSource\",\"ListItemText\":\"Set-TraceSource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-TraceSource [-Name] [[-Option] ] [-ListenerOption ] [-FilePath ] [-Force] [-Debugger] [-PSHost] [-PassThru] []\\r\\n\\r\\nSet-TraceSource [-Name] [-RemoveListener ] []\\r\\n\\r\\nSet-TraceSource [-Name] [-RemoveFileListener ] []\\r\\n\"},{\"CompletionText\":\"Set-Variable\",\"ListItemText\":\"Set-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Variable [-Name] [[-Value] ] [-Include ] [-Exclude ] [-Description ] [-Option ] [-Force] [-Visibility ] [-PassThru] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-VHD\",\"ListItemText\":\"Set-VHD\",\"ResultType\":2,\"ToolTip\":\"Set-VHD\\r\\n\"},{\"CompletionText\":\"Set-VirtualDisk\",\"ListItemText\":\"Set-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Set-VM\",\"ListItemText\":\"Set-VM\",\"ResultType\":2,\"ToolTip\":\"Set-VM\\r\\n\"},{\"CompletionText\":\"Set-VMBios\",\"ListItemText\":\"Set-VMBios\",\"ResultType\":2,\"ToolTip\":\"Set-VMBios\\r\\n\"},{\"CompletionText\":\"Set-VMComPort\",\"ListItemText\":\"Set-VMComPort\",\"ResultType\":2,\"ToolTip\":\"Set-VMComPort\\r\\n\"},{\"CompletionText\":\"Set-VMDvdDrive\",\"ListItemText\":\"Set-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Set-VMFibreChannelHba\",\"ListItemText\":\"Set-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Set-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Set-VMFirmware\",\"ListItemText\":\"Set-VMFirmware\",\"ResultType\":2,\"ToolTip\":\"Set-VMFirmware\\r\\n\"},{\"CompletionText\":\"Set-VMFloppyDiskDrive\",\"ListItemText\":\"Set-VMFloppyDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMFloppyDiskDrive\\r\\n\"},{\"CompletionText\":\"Set-VMGpuPartitionAdapter\",\"ListItemText\":\"Set-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Set-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Set-VMHardDiskDrive\",\"ListItemText\":\"Set-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Set-VMHost\",\"ListItemText\":\"Set-VMHost\",\"ResultType\":2,\"ToolTip\":\"Set-VMHost\\r\\n\"},{\"CompletionText\":\"Set-VMHostCluster\",\"ListItemText\":\"Set-VMHostCluster\",\"ResultType\":2,\"ToolTip\":\"Set-VMHostCluster\\r\\n\"},{\"CompletionText\":\"Set-VMHostPartitionableGpu\",\"ListItemText\":\"Set-VMHostPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Set-VMHostPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Set-VMKeyProtector\",\"ListItemText\":\"Set-VMKeyProtector\",\"ResultType\":2,\"ToolTip\":\"Set-VMKeyProtector\\r\\n\"},{\"CompletionText\":\"Set-VMKeyStorageDrive\",\"ListItemText\":\"Set-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Set-VMMemory\",\"ListItemText\":\"Set-VMMemory\",\"ResultType\":2,\"ToolTip\":\"Set-VMMemory\\r\\n\"},{\"CompletionText\":\"Set-VMMigrationNetwork\",\"ListItemText\":\"Set-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Set-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapter\",\"ListItemText\":\"Set-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterFailoverConfiguration\",\"ListItemText\":\"Set-VMNetworkAdapterFailoverConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterFailoverConfiguration\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterIsolation\",\"ListItemText\":\"Set-VMNetworkAdapterIsolation\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterIsolation\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterRdma\",\"ListItemText\":\"Set-VMNetworkAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterRdma\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Set-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterTeamMapping\",\"ListItemText\":\"Set-VMNetworkAdapterTeamMapping\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterTeamMapping\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterVlan\",\"ListItemText\":\"Set-VMNetworkAdapterVlan\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterVlan\\r\\n\"},{\"CompletionText\":\"Set-VMPartitionableGpu\",\"ListItemText\":\"Set-VMPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Set-VMPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Set-VMProcessor\",\"ListItemText\":\"Set-VMProcessor\",\"ResultType\":2,\"ToolTip\":\"Set-VMProcessor\\r\\n\"},{\"CompletionText\":\"Set-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Set-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Set-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Set-VMReplication\",\"ListItemText\":\"Set-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Set-VMReplication\\r\\n\"},{\"CompletionText\":\"Set-VMReplicationAuthorizationEntry\",\"ListItemText\":\"Set-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"Set-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"Set-VMReplicationServer\",\"ListItemText\":\"Set-VMReplicationServer\",\"ResultType\":2,\"ToolTip\":\"Set-VMReplicationServer\\r\\n\"},{\"CompletionText\":\"Set-VMResourcePool\",\"ListItemText\":\"Set-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Set-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Set-VMSan\",\"ListItemText\":\"Set-VMSan\",\"ResultType\":2,\"ToolTip\":\"Set-VMSan\\r\\n\"},{\"CompletionText\":\"Set-VMSecurity\",\"ListItemText\":\"Set-VMSecurity\",\"ResultType\":2,\"ToolTip\":\"Set-VMSecurity\\r\\n\"},{\"CompletionText\":\"Set-VMSecurityPolicy\",\"ListItemText\":\"Set-VMSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-VMSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Set-VMStorageSettings\",\"ListItemText\":\"Set-VMStorageSettings\",\"ResultType\":2,\"ToolTip\":\"Set-VMStorageSettings\\r\\n\"},{\"CompletionText\":\"Set-VMSwitch\",\"ListItemText\":\"Set-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitch\\r\\n\"},{\"CompletionText\":\"Set-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Set-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Set-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Set-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Set-VMSwitchTeam\",\"ListItemText\":\"Set-VMSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitchTeam\\r\\n\"},{\"CompletionText\":\"Set-VMVideo\",\"ListItemText\":\"Set-VMVideo\",\"ResultType\":2,\"ToolTip\":\"Set-VMVideo\\r\\n\"},{\"CompletionText\":\"Set-Volume\",\"ListItemText\":\"Set-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Volume \\r\\n\"},{\"CompletionText\":\"Set-VolumeScrubPolicy\",\"ListItemText\":\"Set-VolumeScrubPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VolumeScrubPolicy \\r\\n\"},{\"CompletionText\":\"Set-VpnConnection\",\"ListItemText\":\"Set-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnection \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionIPsecConfiguration\",\"ListItemText\":\"Set-VpnConnectionIPsecConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionIPsecConfiguration \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionProxy\",\"ListItemText\":\"Set-VpnConnectionProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionProxy \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionTriggerDnsConfiguration\",\"ListItemText\":\"Set-VpnConnectionTriggerDnsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionTriggerDnsConfiguration \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionTriggerTrustedNetwork\",\"ListItemText\":\"Set-VpnConnectionTriggerTrustedNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionTriggerTrustedNetwork \\r\\n\"},{\"CompletionText\":\"Set-WheaMemoryPolicy\",\"ListItemText\":\"Set-WheaMemoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-WheaMemoryPolicy\\r\\n\"},{\"CompletionText\":\"Set-WinAcceptLanguageFromLanguageListOptOut\",\"ListItemText\":\"Set-WinAcceptLanguageFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Set-WinAcceptLanguageFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Set-WinCultureFromLanguageListOptOut\",\"ListItemText\":\"Set-WinCultureFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Set-WinCultureFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Set-WinDefaultInputMethodOverride\",\"ListItemText\":\"Set-WinDefaultInputMethodOverride\",\"ResultType\":2,\"ToolTip\":\"Set-WinDefaultInputMethodOverride\\r\\n\"},{\"CompletionText\":\"Set-WindowsEdition\",\"ListItemText\":\"Set-WindowsEdition\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsEdition\\r\\n\"},{\"CompletionText\":\"Set-WindowsProductKey\",\"ListItemText\":\"Set-WindowsProductKey\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsProductKey\\r\\n\"},{\"CompletionText\":\"Set-WindowsReservedStorageState\",\"ListItemText\":\"Set-WindowsReservedStorageState\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsReservedStorageState\\r\\n\"},{\"CompletionText\":\"Set-WindowsSearchSetting\",\"ListItemText\":\"Set-WindowsSearchSetting\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsSearchSetting\\r\\n\"},{\"CompletionText\":\"Set-WinHomeLocation\",\"ListItemText\":\"Set-WinHomeLocation\",\"ResultType\":2,\"ToolTip\":\"Set-WinHomeLocation\\r\\n\"},{\"CompletionText\":\"Set-WinhttpProxy\",\"ListItemText\":\"Set-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"Set-WinLanguageBarOption\",\"ListItemText\":\"Set-WinLanguageBarOption\",\"ResultType\":2,\"ToolTip\":\"Set-WinLanguageBarOption\\r\\n\"},{\"CompletionText\":\"Set-WinSystemLocale\",\"ListItemText\":\"Set-WinSystemLocale\",\"ResultType\":2,\"ToolTip\":\"Set-WinSystemLocale\\r\\n\"},{\"CompletionText\":\"Set-WinUILanguageOverride\",\"ListItemText\":\"Set-WinUILanguageOverride\",\"ResultType\":2,\"ToolTip\":\"Set-WinUILanguageOverride\\r\\n\"},{\"CompletionText\":\"Set-WinUserLanguageList\",\"ListItemText\":\"Set-WinUserLanguageList\",\"ResultType\":2,\"ToolTip\":\"Set-WinUserLanguageList\\r\\n\"},{\"CompletionText\":\"Set-WSManInstance\",\"ListItemText\":\"Set-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"Set-WSManInstance\\r\\n\"},{\"CompletionText\":\"Set-WSManQuickConfig\",\"ListItemText\":\"Set-WSManQuickConfig\",\"ResultType\":2,\"ToolTip\":\"Set-WSManQuickConfig\\r\\n\"},{\"CompletionText\":\"sethc.exe\",\"ListItemText\":\"sethc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sethc.exe\"},{\"CompletionText\":\"setspn.exe\",\"ListItemText\":\"setspn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setspn.exe\"},{\"CompletionText\":\"Setup\",\"ListItemText\":\"Setup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSetup \\r\\n\"},{\"CompletionText\":\"setupcl.exe\",\"ListItemText\":\"setupcl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setupcl.exe\"},{\"CompletionText\":\"setupugc.exe\",\"ListItemText\":\"setupugc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setupugc.exe\"},{\"CompletionText\":\"setx.exe\",\"ListItemText\":\"setx.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setx.exe\"},{\"CompletionText\":\"sfc.exe\",\"ListItemText\":\"sfc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sfc.exe\"},{\"CompletionText\":\"sftp.exe\",\"ListItemText\":\"sftp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\sftp.exe\"},{\"CompletionText\":\"shcm\",\"ListItemText\":\"shcm\",\"ResultType\":2,\"ToolTip\":\"Show-Command\"},{\"CompletionText\":\"ShellAppRuntime.exe\",\"ListItemText\":\"ShellAppRuntime.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ShellAppRuntime.exe\"},{\"CompletionText\":\"Should\",\"ListItemText\":\"Should\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShould \\r\\n\"},{\"CompletionText\":\"Show-Command\",\"ListItemText\":\"Show-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-Command [[-Name] ] [-Height ] [-Width ] [-NoCommonParameter] [-ErrorPopup] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Show-Markdown\",\"ListItemText\":\"Show-Markdown\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-Markdown [-Path] [-UseBrowser] []\\r\\n\\r\\nShow-Markdown -InputObject [-UseBrowser] []\\r\\n\\r\\nShow-Markdown -LiteralPath [-UseBrowser] []\\r\\n\"},{\"CompletionText\":\"Show-NetFirewallRule\",\"ListItemText\":\"Show-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Show-NetIPsecRule\",\"ListItemText\":\"Show-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Show-StorageHistory\",\"ListItemText\":\"Show-StorageHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-StorageHistory \\r\\n\"},{\"CompletionText\":\"Show-VirtualDisk\",\"ListItemText\":\"Show-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Show-WindowsDeveloperLicenseRegistration\",\"ListItemText\":\"Show-WindowsDeveloperLicenseRegistration\",\"ResultType\":2,\"ToolTip\":\"Show-WindowsDeveloperLicenseRegistration\\r\\n\"},{\"CompletionText\":\"shrpubw.exe\",\"ListItemText\":\"shrpubw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\shrpubw.exe\"},{\"CompletionText\":\"shutdown.exe\",\"ListItemText\":\"shutdown.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\shutdown.exe\"},{\"CompletionText\":\"si\",\"ListItemText\":\"si\",\"ResultType\":2,\"ToolTip\":\"Set-Item\"},{\"CompletionText\":\"sigverif.exe\",\"ListItemText\":\"sigverif.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sigverif.exe\"},{\"CompletionText\":\"SIHClient.exe\",\"ListItemText\":\"SIHClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SIHClient.exe\"},{\"CompletionText\":\"sihost.exe\",\"ListItemText\":\"sihost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sihost.exe\"},{\"CompletionText\":\"sl\",\"ListItemText\":\"sl\",\"ResultType\":2,\"ToolTip\":\"Set-Location\"},{\"CompletionText\":\"Slack.exe\",\"ListItemText\":\"Slack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\Slack.exe\"},{\"CompletionText\":\"slcm\",\"ListItemText\":\"slcm\",\"ResultType\":2,\"ToolTip\":\"slcm\"},{\"CompletionText\":\"sleep\",\"ListItemText\":\"sleep\",\"ResultType\":2,\"ToolTip\":\"Start-Sleep\"},{\"CompletionText\":\"slg\",\"ListItemText\":\"slg\",\"ResultType\":2,\"ToolTip\":\"slg\"},{\"CompletionText\":\"SlideToShutDown.exe\",\"ListItemText\":\"SlideToShutDown.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SlideToShutDown.exe\"},{\"CompletionText\":\"slmgr.vbs\",\"ListItemText\":\"slmgr.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\slmgr.vbs\"},{\"CompletionText\":\"sls\",\"ListItemText\":\"sls\",\"ResultType\":2,\"ToolTip\":\"Select-String\"},{\"CompletionText\":\"slu\",\"ListItemText\":\"slu\",\"ResultType\":2,\"ToolTip\":\"slu\"},{\"CompletionText\":\"slui.exe\",\"ListItemText\":\"slui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\slui.exe\"},{\"CompletionText\":\"smartscreen.exe\",\"ListItemText\":\"smartscreen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\smartscreen.exe\"},{\"CompletionText\":\"smss.exe\",\"ListItemText\":\"smss.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\smss.exe\"},{\"CompletionText\":\"SndVol.exe\",\"ListItemText\":\"SndVol.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SndVol.exe\"},{\"CompletionText\":\"SnippingTool.exe\",\"ListItemText\":\"SnippingTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\SnippingTool.exe\"},{\"CompletionText\":\"snmptrap.exe\",\"ListItemText\":\"snmptrap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\snmptrap.exe\"},{\"CompletionText\":\"sort\",\"ListItemText\":\"sort\",\"ResultType\":2,\"ToolTip\":\"Sort-Object\"},{\"CompletionText\":\"Sort-Object\",\"ListItemText\":\"Sort-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSort-Object [[-Property] ] [-Stable] [-Descending] [-Unique] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\\r\\nSort-Object [[-Property] ] -Top [-Descending] [-Unique] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\\r\\nSort-Object [[-Property] ] -Bottom [-Descending] [-Unique] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\"},{\"CompletionText\":\"sort.exe\",\"ListItemText\":\"sort.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sort.exe\"},{\"CompletionText\":\"sp\",\"ListItemText\":\"sp\",\"ResultType\":2,\"ToolTip\":\"Set-ItemProperty\"},{\"CompletionText\":\"SpaceAgent.exe\",\"ListItemText\":\"SpaceAgent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SpaceAgent.exe\"},{\"CompletionText\":\"spaceman.exe\",\"ListItemText\":\"spaceman.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\spaceman.exe\"},{\"CompletionText\":\"spaceutil.exe\",\"ListItemText\":\"spaceutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\spaceutil.exe\"},{\"CompletionText\":\"SpatialAudioLicenseSrv.exe\",\"ListItemText\":\"SpatialAudioLicenseSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SpatialAudioLicenseSrv.exe\"},{\"CompletionText\":\"Spectrum.exe\",\"ListItemText\":\"Spectrum.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Spectrum.exe\"},{\"CompletionText\":\"spjb\",\"ListItemText\":\"spjb\",\"ResultType\":2,\"ToolTip\":\"Stop-Job\"},{\"CompletionText\":\"Split-Path\",\"ListItemText\":\"Split-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSplit-Path [-Path] [-Parent] [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -Leaf [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -LeafBase [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -Extension [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -Qualifier [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -NoQualifier [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -IsAbsolute [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path -LiteralPath [-Resolve] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Split-WindowsImage\",\"ListItemText\":\"Split-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Split-WindowsImage\\r\\n\"},{\"CompletionText\":\"splwow64.exe\",\"ListItemText\":\"splwow64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\splwow64.exe\"},{\"CompletionText\":\"spoolsv.exe\",\"ListItemText\":\"spoolsv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\spoolsv.exe\"},{\"CompletionText\":\"SppExtComObj.Exe\",\"ListItemText\":\"SppExtComObj.Exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SppExtComObj.Exe\"},{\"CompletionText\":\"spps\",\"ListItemText\":\"spps\",\"ResultType\":2,\"ToolTip\":\"Stop-Process\"},{\"CompletionText\":\"sppsvc.exe\",\"ListItemText\":\"sppsvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sppsvc.exe\"},{\"CompletionText\":\"spsv\",\"ListItemText\":\"spsv\",\"ResultType\":2,\"ToolTip\":\"Stop-Service\"},{\"CompletionText\":\"spvm\",\"ListItemText\":\"spvm\",\"ResultType\":2,\"ToolTip\":\"spvm\"},{\"CompletionText\":\"srdelayed.exe\",\"ListItemText\":\"srdelayed.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\srdelayed.exe\"},{\"CompletionText\":\"SrTasks.exe\",\"ListItemText\":\"SrTasks.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SrTasks.exe\"},{\"CompletionText\":\"ssh-add.exe\",\"ListItemText\":\"ssh-add.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-add.exe\"},{\"CompletionText\":\"ssh-agent.exe\",\"ListItemText\":\"ssh-agent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-agent.exe\"},{\"CompletionText\":\"ssh-keygen.exe\",\"ListItemText\":\"ssh-keygen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-keygen.exe\"},{\"CompletionText\":\"ssh-keyscan.exe\",\"ListItemText\":\"ssh-keyscan.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-keyscan.exe\"},{\"CompletionText\":\"ssh.exe\",\"ListItemText\":\"ssh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh.exe\"},{\"CompletionText\":\"ssmbb\",\"ListItemText\":\"ssmbb\",\"ResultType\":2,\"ToolTip\":\"ssmbb\"},{\"CompletionText\":\"ssmbcc\",\"ListItemText\":\"ssmbcc\",\"ResultType\":2,\"ToolTip\":\"ssmbcc\"},{\"CompletionText\":\"ssmbccm\",\"ListItemText\":\"ssmbccm\",\"ResultType\":2,\"ToolTip\":\"ssmbccm\"},{\"CompletionText\":\"ssmbp\",\"ListItemText\":\"ssmbp\",\"ResultType\":2,\"ToolTip\":\"ssmbp\"},{\"CompletionText\":\"ssmbs\",\"ListItemText\":\"ssmbs\",\"ResultType\":2,\"ToolTip\":\"ssmbs\"},{\"CompletionText\":\"ssmbsc\",\"ListItemText\":\"ssmbsc\",\"ResultType\":2,\"ToolTip\":\"ssmbsc\"},{\"CompletionText\":\"ssmbscm\",\"ListItemText\":\"ssmbscm\",\"ResultType\":2,\"ToolTip\":\"ssmbscm\"},{\"CompletionText\":\"starship.exe\",\"ListItemText\":\"starship.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\starship\\\\bin\\\\starship.exe\"},{\"CompletionText\":\"start\",\"ListItemText\":\"start\",\"ResultType\":2,\"ToolTip\":\"Start-Process\"},{\"CompletionText\":\"Start-AppBackgroundTask\",\"ListItemText\":\"Start-AppBackgroundTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AppBackgroundTask \\r\\n\"},{\"CompletionText\":\"Start-AppvVirtualProcess\",\"ListItemText\":\"Start-AppvVirtualProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AppvVirtualProcess \\r\\n\"},{\"CompletionText\":\"Start-ASRApplyRecoveryPoint\",\"ListItemText\":\"Start-ASRApplyRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Start-ASRApplyRecoveryPoint\"},{\"CompletionText\":\"Start-ASRCancelFailover\",\"ListItemText\":\"Start-ASRCancelFailover\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCancelFailover\"},{\"CompletionText\":\"Start-ASRCancelFailoverJob\",\"ListItemText\":\"Start-ASRCancelFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCancelFailoverJob\"},{\"CompletionText\":\"Start-ASRCommitFailover\",\"ListItemText\":\"Start-ASRCommitFailover\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCommitFailover\"},{\"CompletionText\":\"Start-ASRCommitFailoverJob\",\"ListItemText\":\"Start-ASRCommitFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCommitFailoverJob\"},{\"CompletionText\":\"Start-ASRFO\",\"ListItemText\":\"Start-ASRFO\",\"ResultType\":2,\"ToolTip\":\"Start-ASRFO\"},{\"CompletionText\":\"Start-ASRPFO\",\"ListItemText\":\"Start-ASRPFO\",\"ResultType\":2,\"ToolTip\":\"Start-ASRPFO\"},{\"CompletionText\":\"Start-ASRPlannedFailoverJob\",\"ListItemText\":\"Start-ASRPlannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRPlannedFailoverJob\"},{\"CompletionText\":\"Start-ASRResynchronizeReplicationJob\",\"ListItemText\":\"Start-ASRResynchronizeReplicationJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRResynchronizeReplicationJob\"},{\"CompletionText\":\"Start-ASRResyncJob\",\"ListItemText\":\"Start-ASRResyncJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRResyncJob\"},{\"CompletionText\":\"Start-ASRSwitchAppliance\",\"ListItemText\":\"Start-ASRSwitchAppliance\",\"ResultType\":2,\"ToolTip\":\"Start-ASRSwitchAppliance\"},{\"CompletionText\":\"Start-ASRSwitchProcessServerJob\",\"ListItemText\":\"Start-ASRSwitchProcessServerJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRSwitchProcessServerJob\"},{\"CompletionText\":\"Start-ASRTestFailoverCleanupJob\",\"ListItemText\":\"Start-ASRTestFailoverCleanupJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTestFailoverCleanupJob\"},{\"CompletionText\":\"Start-ASRTestFailoverJob\",\"ListItemText\":\"Start-ASRTestFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTestFailoverJob\"},{\"CompletionText\":\"Start-ASRTFO\",\"ListItemText\":\"Start-ASRTFO\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTFO\"},{\"CompletionText\":\"Start-ASRTFOCleanupJob\",\"ListItemText\":\"Start-ASRTFOCleanupJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTFOCleanupJob\"},{\"CompletionText\":\"Start-ASRUnplannedFailoverJob\",\"ListItemText\":\"Start-ASRUnplannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRUnplannedFailoverJob\"},{\"CompletionText\":\"Start-AutologgerConfig\",\"ListItemText\":\"Start-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Start-AzAksCluster\",\"ListItemText\":\"Start-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzAksCluster \\r\\n\"},{\"CompletionText\":\"Start-AzAksDashboard\",\"ListItemText\":\"Start-AzAksDashboard\",\"ResultType\":2,\"ToolTip\":\"Start-AzAksDashboard\\r\\n\"},{\"CompletionText\":\"Start-AzAksManagedClusterCommand\",\"ListItemText\":\"Start-AzAksManagedClusterCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzAksManagedClusterCommand \\r\\n\"},{\"CompletionText\":\"Start-AzApplicationGateway\",\"ListItemText\":\"Start-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Start-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationDscCompilationJob\",\"ListItemText\":\"Start-AzAutomationDscCompilationJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationDscCompilationJob\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationDscNodeConfigurationDeployment\",\"ListItemText\":\"Start-AzAutomationDscNodeConfigurationDeployment\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationDscNodeConfigurationDeployment\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationRunbook\",\"ListItemText\":\"Start-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationSourceControlSyncJob\",\"ListItemText\":\"Start-AzAutomationSourceControlSyncJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationSourceControlSyncJob\\r\\n\"},{\"CompletionText\":\"Start-AzBatchComputeNodeServiceLogUpload\",\"ListItemText\":\"Start-AzBatchComputeNodeServiceLogUpload\",\"ResultType\":2,\"ToolTip\":\"Start-AzBatchComputeNodeServiceLogUpload\\r\\n\"},{\"CompletionText\":\"Start-AzBatchPoolResize\",\"ListItemText\":\"Start-AzBatchPoolResize\",\"ResultType\":2,\"ToolTip\":\"Start-AzBatchPoolResize\\r\\n\"},{\"CompletionText\":\"Start-AzCdnEndpoint\",\"ListItemText\":\"Start-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Start-AzCloudService\",\"ListItemText\":\"Start-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzCloudService \\r\\n\"},{\"CompletionText\":\"Start-AzContainerGroup\",\"ListItemText\":\"Start-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Start-AzDataFactoryV2DataFlowDebugSession\",\"ListItemText\":\"Start-AzDataFactoryV2DataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataFactoryV2DataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Start-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Start-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Start-AzDataFactoryV2Trigger\",\"ListItemText\":\"Start-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Start-AzDataProtectionBackupInstanceRestore\",\"ListItemText\":\"Start-AzDataProtectionBackupInstanceRestore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzDataProtectionBackupInstanceRestore \\r\\n\"},{\"CompletionText\":\"Start-AzDataShareSubscriptionSynchronization\",\"ListItemText\":\"Start-AzDataShareSubscriptionSynchronization\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataShareSubscriptionSynchronization\\r\\n\"},{\"CompletionText\":\"Start-AzFrontDoorCdnProfilePrepareMigration\",\"ListItemText\":\"Start-AzFrontDoorCdnProfilePrepareMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzFrontDoorCdnProfilePrepareMigration \\r\\n\"},{\"CompletionText\":\"Start-AzFunctionApp\",\"ListItemText\":\"Start-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Start-AzHDInsightJob\",\"ListItemText\":\"Start-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Start-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Start-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Start-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Start-AzKustoCluster\",\"ListItemText\":\"Start-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Start-AzLogicApp\",\"ListItemText\":\"Start-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Start-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Start-AzMigrateServerMigration\",\"ListItemText\":\"Start-AzMigrateServerMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMigrateServerMigration \\r\\n\"},{\"CompletionText\":\"Start-AzMigrateTestMigration\",\"ListItemText\":\"Start-AzMigrateTestMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMigrateTestMigration \\r\\n\"},{\"CompletionText\":\"Start-AzMigrateTestMigrationCleanup\",\"ListItemText\":\"Start-AzMigrateTestMigrationCleanup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMigrateTestMigrationCleanup \\r\\n\"},{\"CompletionText\":\"Start-AzMLWorkspaceCompute\",\"ListItemText\":\"Start-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Start-AzMySqlFlexibleServer\",\"ListItemText\":\"Start-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Start-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Start-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Start-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Start-AzNetworkWatcherResourceTroubleshooting\",\"ListItemText\":\"Start-AzNetworkWatcherResourceTroubleshooting\",\"ResultType\":2,\"ToolTip\":\"Start-AzNetworkWatcherResourceTroubleshooting\\r\\n\"},{\"CompletionText\":\"Start-AzPolicyComplianceScan\",\"ListItemText\":\"Start-AzPolicyComplianceScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzPolicyComplianceScan\\r\\n\"},{\"CompletionText\":\"Start-AzPolicyRemediation\",\"ListItemText\":\"Start-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Start-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Start-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Start-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrApplyRecoveryPoint\",\"ListItemText\":\"Start-AzRecoveryServicesAsrApplyRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrApplyRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrCancelFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrCancelFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrCancelFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrCommitFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrCommitFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrCommitFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrPlannedFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrPlannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrPlannedFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrResynchronizeReplicationJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrResynchronizeReplicationJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrResynchronizeReplicationJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrSwitchAppliance\",\"ListItemText\":\"Start-AzRecoveryServicesAsrSwitchAppliance\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrSwitchAppliance\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrSwitchProcessServerJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrSwitchProcessServerJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrSwitchProcessServerJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrTestFailoverCleanupJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrTestFailoverCleanupJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrTestFailoverCleanupJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrTestFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrTestFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrTestFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrUnplannedFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrUnplannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrUnplannedFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzServiceBusMigration\",\"ListItemText\":\"Start-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Start-AzSqlDatabaseExecuteIndexRecommendation\",\"ListItemText\":\"Start-AzSqlDatabaseExecuteIndexRecommendation\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlDatabaseExecuteIndexRecommendation\\r\\n\"},{\"CompletionText\":\"Start-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Start-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Start-AzSqlElasticJob\",\"ListItemText\":\"Start-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Start-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Start-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Start-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Start-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Start-AzSqlSyncGroupSync\",\"ListItemText\":\"Start-AzSqlSyncGroupSync\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlSyncGroupSync\\r\\n\"},{\"CompletionText\":\"Start-AzSqlVMAssessment\",\"ListItemText\":\"Start-AzSqlVMAssessment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzSqlVMAssessment \\r\\n\"},{\"CompletionText\":\"Start-AzStorageBlobCopy\",\"ListItemText\":\"Start-AzStorageBlobCopy\",\"ResultType\":2,\"ToolTip\":\"Start-AzStorageBlobCopy\\r\\n\"},{\"CompletionText\":\"Start-AzStorageBlobIncrementalCopy\",\"ListItemText\":\"Start-AzStorageBlobIncrementalCopy\",\"ResultType\":2,\"ToolTip\":\"Start-AzStorageBlobIncrementalCopy\\r\\n\"},{\"CompletionText\":\"Start-AzStorageFileCopy\",\"ListItemText\":\"Start-AzStorageFileCopy\",\"ResultType\":2,\"ToolTip\":\"Start-AzStorageFileCopy\\r\\n\"},{\"CompletionText\":\"Start-AzStorageMoverJobDefinition\",\"ListItemText\":\"Start-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Start-AzStreamAnalyticsJob\",\"ListItemText\":\"Start-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Start-AzSynapseDataFlowDebugSession\",\"ListItemText\":\"Start-AzSynapseDataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseDataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Start-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseKustoPool\",\"ListItemText\":\"Start-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Start-AzSynapseLinkConnection\",\"ListItemText\":\"Start-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseSparkSession\",\"ListItemText\":\"Start-AzSynapseSparkSession\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseSparkSession\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ListItemText\":\"Start-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseSqlPoolVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseTrigger\",\"ListItemText\":\"Start-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Start-AzTenantBackfill\",\"ListItemText\":\"Start-AzTenantBackfill\",\"ResultType\":2,\"ToolTip\":\"Start-AzTenantBackfill\\r\\n\"},{\"CompletionText\":\"Start-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ListItemText\":\"Start-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVirtualNetworkGatewayConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzVirtualNetworkGatewayPacketCapture\",\"ListItemText\":\"Start-AzVirtualNetworkGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVirtualNetworkGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzVM\",\"ListItemText\":\"Start-AzVM\",\"ResultType\":2,\"ToolTip\":\"Start-AzVM\\r\\n\"},{\"CompletionText\":\"Start-AzVmss\",\"ListItemText\":\"Start-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Start-AzVmss\\r\\n\"},{\"CompletionText\":\"Start-AzVmssRollingExtensionUpgrade\",\"ListItemText\":\"Start-AzVmssRollingExtensionUpgrade\",\"ResultType\":2,\"ToolTip\":\"Start-AzVmssRollingExtensionUpgrade\\r\\n\"},{\"CompletionText\":\"Start-AzVmssRollingOSUpgrade\",\"ListItemText\":\"Start-AzVmssRollingOSUpgrade\",\"ResultType\":2,\"ToolTip\":\"Start-AzVmssRollingOSUpgrade\\r\\n\"},{\"CompletionText\":\"Start-AzVpnConnectionPacketCapture\",\"ListItemText\":\"Start-AzVpnConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVpnConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzVpnGatewayPacketCapture\",\"ListItemText\":\"Start-AzVpnGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVpnGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzWebApp\",\"ListItemText\":\"Start-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Start-AzWebApp\\r\\n\"},{\"CompletionText\":\"Start-AzWebAppContinuousWebJob\",\"ListItemText\":\"Start-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Start-AzWebAppSlot\",\"ListItemText\":\"Start-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Start-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Start-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Start-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Start-AzWebAppSlotTriggeredWebJob\",\"ListItemText\":\"Start-AzWebAppSlotTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppSlotTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Start-AzWebAppTriggeredWebJob\",\"ListItemText\":\"Start-AzWebAppTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Start-BitsTransfer\",\"ListItemText\":\"Start-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Start-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Start-CopyAzureStorageBlob\",\"ListItemText\":\"Start-CopyAzureStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Start-CopyAzureStorageBlob\"},{\"CompletionText\":\"Start-DscConfiguration\",\"ListItemText\":\"Start-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Start-DscConfiguration\\r\\n\"},{\"CompletionText\":\"Start-Dtc\",\"ListItemText\":\"Start-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Dtc \\r\\n\"},{\"CompletionText\":\"Start-DtcDiagnosticResourceManager\",\"ListItemText\":\"Start-DtcDiagnosticResourceManager\",\"ResultType\":2,\"ToolTip\":\"Start-DtcDiagnosticResourceManager\\r\\n\"},{\"CompletionText\":\"Start-DtcTransactionsTraceSession\",\"ListItemText\":\"Start-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Start-EtwTraceSession\",\"ListItemText\":\"Start-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Start-Job\",\"ListItemText\":\"Start-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Job [-ScriptBlock] [[-InitializationScript] ] [-Name ] [-Credential ] [-Authentication ] [-WorkingDirectory ] [-RunAs32] [-PSVersion ] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nStart-Job [-DefinitionName] [[-DefinitionPath] ] [[-Type] ] [-WorkingDirectory ] []\\r\\n\\r\\nStart-Job [-FilePath] [[-InitializationScript] ] [-Name ] [-Credential ] [-Authentication ] [-WorkingDirectory ] [-RunAs32] [-PSVersion ] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nStart-Job [[-InitializationScript] ] -LiteralPath [-Name ] [-Credential ] [-Authentication ] [-WorkingDirectory ] [-RunAs32] [-PSVersion ] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nStart-Job [-WorkingDirectory ] [-ConnectingTimeout ] [-Options ] []\\r\\n\"},{\"CompletionText\":\"Start-MpRollback\",\"ListItemText\":\"Start-MpRollback\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpRollback \\r\\n\"},{\"CompletionText\":\"Start-MpScan\",\"ListItemText\":\"Start-MpScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpScan \\r\\n\"},{\"CompletionText\":\"Start-MpWDOScan\",\"ListItemText\":\"Start-MpWDOScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpWDOScan \\r\\n\"},{\"CompletionText\":\"Start-NetEventSession\",\"ListItemText\":\"Start-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-NetEventSession \\r\\n\"},{\"CompletionText\":\"Start-OSUninstall\",\"ListItemText\":\"Start-OSUninstall\",\"ResultType\":2,\"ToolTip\":\"Start-OSUninstall\\r\\n\"},{\"CompletionText\":\"Start-PcsvDevice\",\"ListItemText\":\"Start-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Start-Process\",\"ListItemText\":\"Start-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Process [-FilePath] [[-ArgumentList] ] [-Credential ] [-WorkingDirectory ] [-LoadUserProfile] [-NoNewWindow] [-PassThru] [-RedirectStandardError ] [-RedirectStandardInput ] [-RedirectStandardOutput ] [-WindowStyle ] [-Wait] [-UseNewEnvironment] [-Environment ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStart-Process [-FilePath] [[-ArgumentList] ] [-WorkingDirectory ] [-PassThru] [-Verb ] [-WindowStyle ] [-Wait] [-Environment ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Start-ScheduledTask\",\"ListItemText\":\"Start-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Start-Service\",\"ListItemText\":\"Start-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Service [-InputObject] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStart-Service [-Name] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStart-Service -DisplayName [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Start-Sleep\",\"ListItemText\":\"Start-Sleep\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Sleep [-Seconds] []\\r\\n\\r\\nStart-Sleep -Milliseconds []\\r\\n\\r\\nStart-Sleep [-Duration] []\\r\\n\"},{\"CompletionText\":\"start-ssh-agent.cmd\",\"ListItemText\":\"start-ssh-agent.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\start-ssh-agent.cmd\"},{\"CompletionText\":\"start-ssh-pageant.cmd\",\"ListItemText\":\"start-ssh-pageant.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\start-ssh-pageant.cmd\"},{\"CompletionText\":\"Start-StorageDiagnosticLog\",\"ListItemText\":\"Start-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-StorageDiagnosticLog \\r\\n\"},{\"CompletionText\":\"Start-ThreadJob\",\"ListItemText\":\"Start-ThreadJob\",\"ResultType\":2,\"ToolTip\":\"Start-ThreadJob\\r\\n\"},{\"CompletionText\":\"Start-Trace\",\"ListItemText\":\"Start-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Trace \\r\\n\"},{\"CompletionText\":\"Start-Transcript\",\"ListItemText\":\"Start-Transcript\",\"ResultType\":2,\"ToolTip\":\"Start-Transcript\\r\\n\"},{\"CompletionText\":\"Start-VM\",\"ListItemText\":\"Start-VM\",\"ResultType\":2,\"ToolTip\":\"Start-VM\\r\\n\"},{\"CompletionText\":\"Start-VMFailover\",\"ListItemText\":\"Start-VMFailover\",\"ResultType\":2,\"ToolTip\":\"Start-VMFailover\\r\\n\"},{\"CompletionText\":\"Start-VMInitialReplication\",\"ListItemText\":\"Start-VMInitialReplication\",\"ResultType\":2,\"ToolTip\":\"Start-VMInitialReplication\\r\\n\"},{\"CompletionText\":\"Start-VMTrace\",\"ListItemText\":\"Start-VMTrace\",\"ResultType\":2,\"ToolTip\":\"Start-VMTrace\\r\\n\"},{\"CompletionText\":\"Stop-AdlJob\",\"ListItemText\":\"Stop-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AdlJob\"},{\"CompletionText\":\"Stop-ASRJob\",\"ListItemText\":\"Stop-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Stop-ASRJob\"},{\"CompletionText\":\"Stop-AzAksCluster\",\"ListItemText\":\"Stop-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzAksCluster \\r\\n\"},{\"CompletionText\":\"Stop-AzAksDashboard\",\"ListItemText\":\"Stop-AzAksDashboard\",\"ResultType\":2,\"ToolTip\":\"Stop-AzAksDashboard\\r\\n\"},{\"CompletionText\":\"Stop-AzApplicationGateway\",\"ListItemText\":\"Stop-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Stop-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Stop-AzAutomationDscNodeConfigurationDeployment\",\"ListItemText\":\"Stop-AzAutomationDscNodeConfigurationDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzAutomationDscNodeConfigurationDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzAutomationJob\",\"ListItemText\":\"Stop-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchCertificateDeletion\",\"ListItemText\":\"Stop-AzBatchCertificateDeletion\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchCertificateDeletion\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchJob\",\"ListItemText\":\"Stop-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchJobSchedule\",\"ListItemText\":\"Stop-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchPoolResize\",\"ListItemText\":\"Stop-AzBatchPoolResize\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchPoolResize\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchTask\",\"ListItemText\":\"Stop-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Stop-AzCdnEndpoint\",\"ListItemText\":\"Stop-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Stop-AzCloudService\",\"ListItemText\":\"Stop-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzCloudService \\r\\n\"},{\"CompletionText\":\"Stop-AzContainerGroup\",\"ListItemText\":\"Stop-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2DataFlowDebugSession\",\"ListItemText\":\"Stop-AzDataFactoryV2DataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2DataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Stop-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2PipelineRun\",\"ListItemText\":\"Stop-AzDataFactoryV2PipelineRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2PipelineRun\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2Trigger\",\"ListItemText\":\"Stop-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2TriggerRun\",\"ListItemText\":\"Stop-AzDataFactoryV2TriggerRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2TriggerRun\\r\\n\"},{\"CompletionText\":\"Stop-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Stop-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Stop-AzDataProtectionBackupInstanceProtection\",\"ListItemText\":\"Stop-AzDataProtectionBackupInstanceProtection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzDataProtectionBackupInstanceProtection \\r\\n\"},{\"CompletionText\":\"Stop-AzDataShareSubscriptionSynchronization\",\"ListItemText\":\"Stop-AzDataShareSubscriptionSynchronization\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataShareSubscriptionSynchronization\\r\\n\"},{\"CompletionText\":\"Stop-AzDeployment\",\"ListItemText\":\"Stop-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzDeploymentManagerRollout\",\"ListItemText\":\"Stop-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Stop-AzFrontDoorCdnProfileMigration\",\"ListItemText\":\"Stop-AzFrontDoorCdnProfileMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzFrontDoorCdnProfileMigration \\r\\n\"},{\"CompletionText\":\"Stop-AzFunctionApp\",\"ListItemText\":\"Stop-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Stop-AzHDInsightJob\",\"ListItemText\":\"Stop-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Stop-AzKeyVaultCertificateOperation\",\"ListItemText\":\"Stop-AzKeyVaultCertificateOperation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzKeyVaultCertificateOperation\\r\\n\"},{\"CompletionText\":\"Stop-AzKustoCluster\",\"ListItemText\":\"Stop-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Stop-AzLogicAppRun\",\"ListItemText\":\"Stop-AzLogicAppRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzLogicAppRun\\r\\n\"},{\"CompletionText\":\"Stop-AzManagementGroupDeployment\",\"ListItemText\":\"Stop-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzMarketplaceTerms\",\"ListItemText\":\"Stop-AzMarketplaceTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMarketplaceTerms \\r\\n\"},{\"CompletionText\":\"Stop-AzMLWorkspaceCompute\",\"ListItemText\":\"Stop-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Stop-AzMLWorkspaceJob\",\"ListItemText\":\"Stop-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"Stop-AzMySqlFlexibleServer\",\"ListItemText\":\"Stop-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Stop-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Stop-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Stop-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Stop-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"Stop-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzPolicyRemediation\",\"ListItemText\":\"Stop-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Stop-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Stop-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Stop-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Stop-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Stop-AzRecoveryServicesBackupJob\",\"ListItemText\":\"Stop-AzRecoveryServicesBackupJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzRecoveryServicesBackupJob\\r\\n\"},{\"CompletionText\":\"Stop-AzResourceGroupDeployment\",\"ListItemText\":\"Stop-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzRoleAssignmentScheduleRequest\",\"ListItemText\":\"Stop-AzRoleAssignmentScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzRoleAssignmentScheduleRequest \\r\\n\"},{\"CompletionText\":\"Stop-AzRoleEligibilityScheduleRequest\",\"ListItemText\":\"Stop-AzRoleEligibilityScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzRoleEligibilityScheduleRequest \\r\\n\"},{\"CompletionText\":\"Stop-AzServiceBusMigration\",\"ListItemText\":\"Stop-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Stop-AzSqlDatabaseActivity\",\"ListItemText\":\"Stop-AzSqlDatabaseActivity\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlDatabaseActivity\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlDatabaseExecuteIndexRecommendation\",\"ListItemText\":\"Stop-AzSqlDatabaseExecuteIndexRecommendation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlDatabaseExecuteIndexRecommendation\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlElasticJob\",\"ListItemText\":\"Stop-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlElasticPoolActivity\",\"ListItemText\":\"Stop-AzSqlElasticPoolActivity\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlElasticPoolActivity\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Stop-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlInstanceOperation\",\"ListItemText\":\"Stop-AzSqlInstanceOperation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlInstanceOperation\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlSyncGroupSync\",\"ListItemText\":\"Stop-AzSqlSyncGroupSync\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlSyncGroupSync\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ListItemText\":\"Stop-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ResultType\":2,\"ToolTip\":\"Stop-AzStorageAccountHierarchicalNamespaceUpgrade\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageBlobCopy\",\"ListItemText\":\"Stop-AzStorageBlobCopy\",\"ResultType\":2,\"ToolTip\":\"Stop-AzStorageBlobCopy\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageFileCopy\",\"ListItemText\":\"Stop-AzStorageFileCopy\",\"ResultType\":2,\"ToolTip\":\"Stop-AzStorageFileCopy\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageMoverJobDefinition\",\"ListItemText\":\"Stop-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Stop-AzStreamAnalyticsJob\",\"ListItemText\":\"Stop-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Stop-AzSubscriptionDeployment\",\"ListItemText\":\"Stop-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSubscriptionDeployment\"},{\"CompletionText\":\"Stop-AzSynapseDataFlowDebugSession\",\"ListItemText\":\"Stop-AzSynapseDataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseDataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Stop-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseKustoPool\",\"ListItemText\":\"Stop-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseLinkConnection\",\"ListItemText\":\"Stop-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapsePipelineRun\",\"ListItemText\":\"Stop-AzSynapsePipelineRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapsePipelineRun\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseSparkJob\",\"ListItemText\":\"Stop-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseSparkSession\",\"ListItemText\":\"Stop-AzSynapseSparkSession\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseSparkSession\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseSparkStatement\",\"ListItemText\":\"Stop-AzSynapseSparkStatement\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseSparkStatement\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseTrigger\",\"ListItemText\":\"Stop-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseTriggerRun\",\"ListItemText\":\"Stop-AzSynapseTriggerRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseTriggerRun\\r\\n\"},{\"CompletionText\":\"Stop-AzTenantDeployment\",\"ListItemText\":\"Stop-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ListItemText\":\"Stop-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVirtualNetworkGatewayConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzVirtualNetworkGatewayPacketCapture\",\"ListItemText\":\"Stop-AzVirtualNetworkGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVirtualNetworkGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzVM\",\"ListItemText\":\"Stop-AzVM\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVM\\r\\n\"},{\"CompletionText\":\"Stop-AzVmss\",\"ListItemText\":\"Stop-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVmss\\r\\n\"},{\"CompletionText\":\"Stop-AzVmssRollingUpgrade\",\"ListItemText\":\"Stop-AzVmssRollingUpgrade\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVmssRollingUpgrade\\r\\n\"},{\"CompletionText\":\"Stop-AzVpnConnectionPacketCapture\",\"ListItemText\":\"Stop-AzVpnConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVpnConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzVpnGatewayPacketCapture\",\"ListItemText\":\"Stop-AzVpnGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVpnGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzWebApp\",\"ListItemText\":\"Stop-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Stop-AzWebApp\\r\\n\"},{\"CompletionText\":\"Stop-AzWebAppContinuousWebJob\",\"ListItemText\":\"Stop-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Stop-AzWebAppSlot\",\"ListItemText\":\"Stop-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Stop-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Stop-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Stop-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Stop-ComputeProcess\",\"ListItemText\":\"Stop-ComputeProcess\",\"ResultType\":2,\"ToolTip\":\"Stop-ComputeProcess\\r\\n\"},{\"CompletionText\":\"Stop-Computer\",\"ListItemText\":\"Stop-Computer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Computer [[-ComputerName] ] [[-Credential] ] [-WsmanAuthentication ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-CopyAzureStorageBlob\",\"ListItemText\":\"Stop-CopyAzureStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Stop-CopyAzureStorageBlob\"},{\"CompletionText\":\"Stop-DscConfiguration\",\"ListItemText\":\"Stop-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Stop-Dtc\",\"ListItemText\":\"Stop-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Dtc \\r\\n\"},{\"CompletionText\":\"Stop-DtcDiagnosticResourceManager\",\"ListItemText\":\"Stop-DtcDiagnosticResourceManager\",\"ResultType\":2,\"ToolTip\":\"Stop-DtcDiagnosticResourceManager\\r\\n\"},{\"CompletionText\":\"Stop-DtcTransactionsTraceSession\",\"ListItemText\":\"Stop-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Stop-EtwTraceSession\",\"ListItemText\":\"Stop-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Stop-Job\",\"ListItemText\":\"Stop-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Job [-Id] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-Job] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-Name] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-InstanceId] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-State] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-Filter] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-NetEventSession\",\"ListItemText\":\"Stop-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-NetEventSession \\r\\n\"},{\"CompletionText\":\"Stop-PcsvDevice\",\"ListItemText\":\"Stop-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Stop-Process\",\"ListItemText\":\"Stop-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Process [-Id] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Process -Name [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Process [-InputObject] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-ScheduledTask\",\"ListItemText\":\"Stop-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Stop-Service\",\"ListItemText\":\"Stop-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Service [-InputObject] [-Force] [-NoWait] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Service [-Name] [-Force] [-NoWait] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Service -DisplayName [-Force] [-NoWait] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-StorageDiagnosticLog\",\"ListItemText\":\"Stop-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-StorageDiagnosticLog \\r\\n\"},{\"CompletionText\":\"Stop-StorageJob\",\"ListItemText\":\"Stop-StorageJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-StorageJob \\r\\n\"},{\"CompletionText\":\"Stop-Trace\",\"ListItemText\":\"Stop-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Trace \\r\\n\"},{\"CompletionText\":\"Stop-Transcript\",\"ListItemText\":\"Stop-Transcript\",\"ResultType\":2,\"ToolTip\":\"Stop-Transcript\\r\\n\"},{\"CompletionText\":\"Stop-VM\",\"ListItemText\":\"Stop-VM\",\"ResultType\":2,\"ToolTip\":\"Stop-VM\\r\\n\"},{\"CompletionText\":\"Stop-VMFailover\",\"ListItemText\":\"Stop-VMFailover\",\"ResultType\":2,\"ToolTip\":\"Stop-VMFailover\\r\\n\"},{\"CompletionText\":\"Stop-VMInitialReplication\",\"ListItemText\":\"Stop-VMInitialReplication\",\"ResultType\":2,\"ToolTip\":\"Stop-VMInitialReplication\\r\\n\"},{\"CompletionText\":\"Stop-VMReplication\",\"ListItemText\":\"Stop-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Stop-VMReplication\\r\\n\"},{\"CompletionText\":\"Stop-VMTrace\",\"ListItemText\":\"Stop-VMTrace\",\"ResultType\":2,\"ToolTip\":\"Stop-VMTrace\\r\\n\"},{\"CompletionText\":\"stordiag.exe\",\"ListItemText\":\"stordiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\stordiag.exe\"},{\"CompletionText\":\"stz\",\"ListItemText\":\"stz\",\"ResultType\":2,\"ToolTip\":\"Set-TimeZone\"},{\"CompletionText\":\"Submit-AdlJob\",\"ListItemText\":\"Submit-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Submit-AdlJob\"},{\"CompletionText\":\"Submit-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Submit-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Submit-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Submit-AzHDInsightScriptAction\",\"ListItemText\":\"Submit-AzHDInsightScriptAction\",\"ResultType\":2,\"ToolTip\":\"Submit-AzHDInsightScriptAction\\r\\n\"},{\"CompletionText\":\"Submit-AzSynapseSparkJob\",\"ListItemText\":\"Submit-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Submit-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"subst.exe\",\"ListItemText\":\"subst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\subst.exe\"},{\"CompletionText\":\"Suspend-AzAnalysisServicesServer\",\"ListItemText\":\"Suspend-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Suspend-AzAs\",\"ListItemText\":\"Suspend-AzAs\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzAs\"},{\"CompletionText\":\"Suspend-AzAutomationJob\",\"ListItemText\":\"Suspend-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Suspend-AzDataFactoryPipeline\",\"ListItemText\":\"Suspend-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Suspend-AzDataProtectionBackupInstanceBackup\",\"ListItemText\":\"Suspend-AzDataProtectionBackupInstanceBackup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-AzDataProtectionBackupInstanceBackup \\r\\n\"},{\"CompletionText\":\"Suspend-AzMigrateServerReplication\",\"ListItemText\":\"Suspend-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Suspend-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Suspend-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Suspend-AzSqlDatabase\",\"ListItemText\":\"Suspend-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Suspend-AzSynapseSqlPool\",\"ListItemText\":\"Suspend-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Suspend-BitLocker\",\"ListItemText\":\"Suspend-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-BitLocker \\r\\n\"},{\"CompletionText\":\"Suspend-BitsTransfer\",\"ListItemText\":\"Suspend-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Suspend-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Suspend-PrintJob\",\"ListItemText\":\"Suspend-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-PrintJob \\r\\n\"},{\"CompletionText\":\"Suspend-Service\",\"ListItemText\":\"Suspend-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-Service [-InputObject] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSuspend-Service [-Name] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSuspend-Service -DisplayName [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Suspend-StorageBusDisk\",\"ListItemText\":\"Suspend-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Suspend-VM\",\"ListItemText\":\"Suspend-VM\",\"ResultType\":2,\"ToolTip\":\"Suspend-VM\\r\\n\"},{\"CompletionText\":\"Suspend-VMReplication\",\"ListItemText\":\"Suspend-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Suspend-VMReplication\\r\\n\"},{\"CompletionText\":\"sv\",\"ListItemText\":\"sv\",\"ResultType\":2,\"ToolTip\":\"Set-Variable\"},{\"CompletionText\":\"svchost.exe\",\"ListItemText\":\"svchost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\svchost.exe\"},{\"CompletionText\":\"Swap-AzWebAppSlot\",\"ListItemText\":\"Swap-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Swap-AzWebAppSlot\"},{\"CompletionText\":\"Switch-AzCloudService\",\"ListItemText\":\"Switch-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSwitch-AzCloudService \\r\\n\"},{\"CompletionText\":\"Switch-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Switch-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Switch-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Switch-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Switch-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Switch-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Switch-AzWebAppSlot\",\"ListItemText\":\"Switch-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Switch-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Switch-Certificate\",\"ListItemText\":\"Switch-Certificate\",\"ResultType\":2,\"ToolTip\":\"Switch-Certificate\\r\\n\"},{\"CompletionText\":\"sxstrace.exe\",\"ListItemText\":\"sxstrace.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sxstrace.exe\"},{\"CompletionText\":\"Sync-AzAnalysisServicesInstance\",\"ListItemText\":\"Sync-AzAnalysisServicesInstance\",\"ResultType\":2,\"ToolTip\":\"Sync-AzAnalysisServicesInstance\\r\\n\"},{\"CompletionText\":\"Sync-AzApiManagementKeyVaultSecret\",\"ListItemText\":\"Sync-AzApiManagementKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Sync-AzApiManagementKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Sync-AzAsInstance\",\"ListItemText\":\"Sync-AzAsInstance\",\"ResultType\":2,\"ToolTip\":\"Sync-AzAsInstance\"},{\"CompletionText\":\"Sync-AzDataFactoryV2IntegrationRuntimeCredential\",\"ListItemText\":\"Sync-AzDataFactoryV2IntegrationRuntimeCredential\",\"ResultType\":2,\"ToolTip\":\"Sync-AzDataFactoryV2IntegrationRuntimeCredential\\r\\n\"},{\"CompletionText\":\"Sync-AzDataProtectionBackupInstance\",\"ListItemText\":\"Sync-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSync-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Sync-AzMediaServiceStorageKey\",\"ListItemText\":\"Sync-AzMediaServiceStorageKey\",\"ResultType\":2,\"ToolTip\":\"Sync-AzMediaServiceStorageKey\\r\\n\"},{\"CompletionText\":\"Sync-AzMediaServiceStorageKeys\",\"ListItemText\":\"Sync-AzMediaServiceStorageKeys\",\"ResultType\":2,\"ToolTip\":\"Sync-AzMediaServiceStorageKeys\"},{\"CompletionText\":\"Sync-AzMLWorkspaceKey\",\"ListItemText\":\"Sync-AzMLWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSync-AzMLWorkspaceKey \\r\\n\"},{\"CompletionText\":\"Sync-AzSynapseIntegrationRuntimeCredential\",\"ListItemText\":\"Sync-AzSynapseIntegrationRuntimeCredential\",\"ResultType\":2,\"ToolTip\":\"Sync-AzSynapseIntegrationRuntimeCredential\\r\\n\"},{\"CompletionText\":\"Sync-AzureAsInstance\",\"ListItemText\":\"Sync-AzureAsInstance\",\"ResultType\":2,\"ToolTip\":\"Sync-AzureAsInstance\"},{\"CompletionText\":\"Sync-AzVirtualNetworkPeering\",\"ListItemText\":\"Sync-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Sync-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Sync-NetIPsecRule\",\"ListItemText\":\"Sync-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSync-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"SyncAppvPublishingServer.exe\",\"ListItemText\":\"SyncAppvPublishingServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SyncAppvPublishingServer.exe\"},{\"CompletionText\":\"SyncAppvPublishingServer.vbs\",\"ListItemText\":\"SyncAppvPublishingServer.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SyncAppvPublishingServer.vbs\"},{\"CompletionText\":\"SyncHost.exe\",\"ListItemText\":\"SyncHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SyncHost.exe\"},{\"CompletionText\":\"sysdm.cpl\",\"ListItemText\":\"sysdm.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sysdm.cpl\"},{\"CompletionText\":\"SysResetErr.exe\",\"ListItemText\":\"SysResetErr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SysResetErr.exe\"},{\"CompletionText\":\"systeminfo.exe\",\"ListItemText\":\"systeminfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\systeminfo.exe\"},{\"CompletionText\":\"SystemPropertiesAdvanced.exe\",\"ListItemText\":\"SystemPropertiesAdvanced.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesAdvanced.exe\"},{\"CompletionText\":\"SystemPropertiesComputerName.exe\",\"ListItemText\":\"SystemPropertiesComputerName.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesComputerName.exe\"},{\"CompletionText\":\"SystemPropertiesDataExecutionPrevention.exe\",\"ListItemText\":\"SystemPropertiesDataExecutionPrevention.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesDataExecutionPrevention.exe\"},{\"CompletionText\":\"SystemPropertiesHardware.exe\",\"ListItemText\":\"SystemPropertiesHardware.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesHardware.exe\"},{\"CompletionText\":\"SystemPropertiesPerformance.exe\",\"ListItemText\":\"SystemPropertiesPerformance.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesPerformance.exe\"},{\"CompletionText\":\"SystemPropertiesProtection.exe\",\"ListItemText\":\"SystemPropertiesProtection.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesProtection.exe\"},{\"CompletionText\":\"SystemPropertiesRemote.exe\",\"ListItemText\":\"SystemPropertiesRemote.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesRemote.exe\"},{\"CompletionText\":\"systemreset.exe\",\"ListItemText\":\"systemreset.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\systemreset.exe\"},{\"CompletionText\":\"SystemSettingsAdminFlows.exe\",\"ListItemText\":\"SystemSettingsAdminFlows.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemSettingsAdminFlows.exe\"},{\"CompletionText\":\"SystemSettingsBroker.exe\",\"ListItemText\":\"SystemSettingsBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemSettingsBroker.exe\"},{\"CompletionText\":\"SystemSettingsRemoveDevice.exe\",\"ListItemText\":\"SystemSettingsRemoveDevice.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemSettingsRemoveDevice.exe\"},{\"CompletionText\":\"SystemUWPLauncher.exe\",\"ListItemText\":\"SystemUWPLauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemUWPLauncher.exe\"},{\"CompletionText\":\"systray.exe\",\"ListItemText\":\"systray.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\systray.exe\"},{\"CompletionText\":\"T:\",\"ListItemText\":\"T:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nT: \\r\\n\"},{\"CompletionText\":\"tabcal.exe\",\"ListItemText\":\"tabcal.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tabcal.exe\"},{\"CompletionText\":\"TabExpansion\",\"ListItemText\":\"TabExpansion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTabExpansion \\r\\n\"},{\"CompletionText\":\"TabExpansion2\",\"ListItemText\":\"TabExpansion2\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTabExpansion2 [-inputScript] [[-cursorColumn] ] [[-options] ] []\\r\\n\\r\\nTabExpansion2 [-ast] [-tokens] [-positionOfCursor] [[-options] ] []\\r\\n\"},{\"CompletionText\":\"TabletPC.cpl\",\"ListItemText\":\"TabletPC.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TabletPC.cpl\"},{\"CompletionText\":\"takeown.exe\",\"ListItemText\":\"takeown.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\takeown.exe\"},{\"CompletionText\":\"TapiUnattend.exe\",\"ListItemText\":\"TapiUnattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TapiUnattend.exe\"},{\"CompletionText\":\"tar.exe\",\"ListItemText\":\"tar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tar.exe\"},{\"CompletionText\":\"taskhostw.exe\",\"ListItemText\":\"taskhostw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\taskhostw.exe\"},{\"CompletionText\":\"taskkill.exe\",\"ListItemText\":\"taskkill.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\taskkill.exe\"},{\"CompletionText\":\"tasklist.exe\",\"ListItemText\":\"tasklist.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tasklist.exe\"},{\"CompletionText\":\"Taskmgr.exe\",\"ListItemText\":\"Taskmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Taskmgr.exe\"},{\"CompletionText\":\"taskschd.msc\",\"ListItemText\":\"taskschd.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\taskschd.msc\"},{\"CompletionText\":\"tcblaunch.exe\",\"ListItemText\":\"tcblaunch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tcblaunch.exe\"},{\"CompletionText\":\"tcfg\",\"ListItemText\":\"tcfg\",\"ResultType\":2,\"ToolTip\":\"tcfg\"},{\"CompletionText\":\"tcmsetup.exe\",\"ListItemText\":\"tcmsetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tcmsetup.exe\"},{\"CompletionText\":\"TCPSVCS.EXE\",\"ListItemText\":\"TCPSVCS.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TCPSVCS.EXE\"},{\"CompletionText\":\"tee\",\"ListItemText\":\"tee\",\"ResultType\":2,\"ToolTip\":\"Tee-Object\"},{\"CompletionText\":\"Tee-Object\",\"ListItemText\":\"Tee-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTee-Object [-FilePath] [-InputObject ] [-Append] [-Encoding ] []\\r\\n\\r\\nTee-Object -LiteralPath [-InputObject ] [-Encoding ] []\\r\\n\\r\\nTee-Object -Variable [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"telephon.cpl\",\"ListItemText\":\"telephon.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\telephon.cpl\"},{\"CompletionText\":\"test-64bit\",\"ListItemText\":\"test-64bit\",\"ResultType\":2,\"ToolTip\":\"\\r\\ntest-64bit \\r\\n\"},{\"CompletionText\":\"Test-AdlAnalyticsAccount\",\"ListItemText\":\"Test-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Test-AdlAnalyticsAccount\"},{\"CompletionText\":\"Test-AdlCatalogItem\",\"ListItemText\":\"Test-AdlCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Test-AdlCatalogItem\"},{\"CompletionText\":\"Test-AdlStore\",\"ListItemText\":\"Test-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Test-AdlStore\"},{\"CompletionText\":\"Test-AdlStoreItem\",\"ListItemText\":\"Test-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Test-AdlStoreItem\"},{\"CompletionText\":\"Test-AppLockerPolicy\",\"ListItemText\":\"Test-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"Test-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"Test-AzActionGroup\",\"ListItemText\":\"Test-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Test-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Test-AzAnalysisServicesServer\",\"ListItemText\":\"Test-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Test-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Test-AzAppConfigurationStoreNameAvailability\",\"ListItemText\":\"Test-AzAppConfigurationStoreNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzAppConfigurationStoreNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzAs\",\"ListItemText\":\"Test-AzAs\",\"ResultType\":2,\"ToolTip\":\"Test-AzAs\"},{\"CompletionText\":\"Test-AzBatchAutoScale\",\"ListItemText\":\"Test-AzBatchAutoScale\",\"ResultType\":2,\"ToolTip\":\"Test-AzBatchAutoScale\\r\\n\"},{\"CompletionText\":\"Test-AzCdnEndpointCustomDomain\",\"ListItemText\":\"Test-AzCdnEndpointCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzCdnEndpointCustomDomain \\r\\n\"},{\"CompletionText\":\"Test-AzCdnNameAvailability\",\"ListItemText\":\"Test-AzCdnNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzCdnNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzCdnProbe\",\"ListItemText\":\"Test-AzCdnProbe\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzCdnProbe \\r\\n\"},{\"CompletionText\":\"Test-AzConfidentialLedgerNameAvailability\",\"ListItemText\":\"Test-AzConfidentialLedgerNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzConfidentialLedgerNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzContainerRegistryNameAvailability\",\"ListItemText\":\"Test-AzContainerRegistryNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzContainerRegistryNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzContainerRegistryWebhook\",\"ListItemText\":\"Test-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Test-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeAnalyticsCatalogItem\",\"ListItemText\":\"Test-AzDataLakeAnalyticsCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeAnalyticsCatalogItem\\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeStoreAccount\",\"ListItemText\":\"Test-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeStoreItem\",\"ListItemText\":\"Test-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Test-AzDataProtectionBackupInstanceReadiness\",\"ListItemText\":\"Test-AzDataProtectionBackupInstanceReadiness\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzDataProtectionBackupInstanceReadiness \\r\\n\"},{\"CompletionText\":\"Test-AzDataProtectionBackupInstanceRestore\",\"ListItemText\":\"Test-AzDataProtectionBackupInstanceRestore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzDataProtectionBackupInstanceRestore \\r\\n\"},{\"CompletionText\":\"Test-AzDeployment\",\"ListItemText\":\"Test-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzDnsAvailability\",\"ListItemText\":\"Test-AzDnsAvailability\",\"ResultType\":2,\"ToolTip\":\"Test-AzDnsAvailability\\r\\n\"},{\"CompletionText\":\"Test-AzEventHubName\",\"ListItemText\":\"Test-AzEventHubName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzEventHubName \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnEndpointCustomDomain\",\"ListItemText\":\"Test-AzFrontDoorCdnEndpointCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnEndpointCustomDomain \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnEndpointNameAvailability\",\"ListItemText\":\"Test-AzFrontDoorCdnEndpointNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnEndpointNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnProfileHostNameAvailability\",\"ListItemText\":\"Test-AzFrontDoorCdnProfileHostNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnProfileHostNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnProfileMigration\",\"ListItemText\":\"Test-AzFrontDoorCdnProfileMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnProfileMigration \\r\\n\"},{\"CompletionText\":\"Test-AzHealthcareServiceNameAvailability\",\"ListItemText\":\"Test-AzHealthcareServiceNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzHealthcareServiceNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzIotHubRoute\",\"ListItemText\":\"Test-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Test-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Test-AzKustoAttachedDatabaseConfigurationNameAvailability\",\"ListItemText\":\"Test-AzKustoAttachedDatabaseConfigurationNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoAttachedDatabaseConfigurationNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoClusterNameAvailability\",\"ListItemText\":\"Test-AzKustoClusterNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoClusterNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoClusterPrincipalAssignmentNameAvailability\",\"ListItemText\":\"Test-AzKustoClusterPrincipalAssignmentNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoClusterPrincipalAssignmentNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoDatabaseNameAvailability\",\"ListItemText\":\"Test-AzKustoDatabaseNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoDatabaseNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoDatabasePrincipalAssignmentNameAvailability\",\"ListItemText\":\"Test-AzKustoDatabasePrincipalAssignmentNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoDatabasePrincipalAssignmentNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoDataConnectionNameAvailability\",\"ListItemText\":\"Test-AzKustoDataConnectionNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoDataConnectionNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoManagedPrivateEndpointNameAvailability\",\"ListItemText\":\"Test-AzKustoManagedPrivateEndpointNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoManagedPrivateEndpointNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoScriptNameAvailability\",\"ListItemText\":\"Test-AzKustoScriptNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoScriptNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzLogicApp\",\"ListItemText\":\"Test-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Test-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Test-AzManagementGroupDeployment\",\"ListItemText\":\"Test-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzMySqlFlexibleServerConnect\",\"ListItemText\":\"Test-AzMySqlFlexibleServerConnect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzMySqlFlexibleServerConnect \\r\\n\"},{\"CompletionText\":\"Test-AzNetworkWatcherConnectivity\",\"ListItemText\":\"Test-AzNetworkWatcherConnectivity\",\"ResultType\":2,\"ToolTip\":\"Test-AzNetworkWatcherConnectivity\\r\\n\"},{\"CompletionText\":\"Test-AzNetworkWatcherIPFlow\",\"ListItemText\":\"Test-AzNetworkWatcherIPFlow\",\"ResultType\":2,\"ToolTip\":\"Test-AzNetworkWatcherIPFlow\\r\\n\"},{\"CompletionText\":\"Test-AzPostgreSqlFlexibleServerConnect\",\"ListItemText\":\"Test-AzPostgreSqlFlexibleServerConnect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzPostgreSqlFlexibleServerConnect \\r\\n\"},{\"CompletionText\":\"Test-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Test-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Test-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Test-AzPrivateIPAddressAvailability\",\"ListItemText\":\"Test-AzPrivateIPAddressAvailability\",\"ResultType\":2,\"ToolTip\":\"Test-AzPrivateIPAddressAvailability\\r\\n\"},{\"CompletionText\":\"Test-AzPrivateLinkServiceVisibility\",\"ListItemText\":\"Test-AzPrivateLinkServiceVisibility\",\"ResultType\":2,\"ToolTip\":\"Test-AzPrivateLinkServiceVisibility\\r\\n\"},{\"CompletionText\":\"Test-AzRecoveryServicesDSMove\",\"ListItemText\":\"Test-AzRecoveryServicesDSMove\",\"ResultType\":2,\"ToolTip\":\"Test-AzRecoveryServicesDSMove\\r\\n\"},{\"CompletionText\":\"Test-AzRelayName\",\"ListItemText\":\"Test-AzRelayName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzRelayName \\r\\n\"},{\"CompletionText\":\"Test-AzResourceGroupDeployment\",\"ListItemText\":\"Test-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzSentinelDataConnectorCheckRequirement\",\"ListItemText\":\"Test-AzSentinelDataConnectorCheckRequirement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzSentinelDataConnectorCheckRequirement \\r\\n\"},{\"CompletionText\":\"Test-AzServiceBusName\",\"ListItemText\":\"Test-AzServiceBusName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceBusName \\r\\n\"},{\"CompletionText\":\"Test-AzServiceBusNameAvailability\",\"ListItemText\":\"Test-AzServiceBusNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Test-AzServiceBusNameAvailability\\r\\n\"},{\"CompletionText\":\"Test-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Test-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Test-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Test-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Test-AzServiceLinkerForWebApp\",\"ListItemText\":\"Test-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Test-AzSignalR\",\"ListItemText\":\"Test-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Test-AzSignalR\"},{\"CompletionText\":\"Test-AzSignalRName\",\"ListItemText\":\"Test-AzSignalRName\",\"ResultType\":2,\"ToolTip\":\"Test-AzSignalRName\\r\\n\"},{\"CompletionText\":\"Test-AzStaticWebAppCustomDomain\",\"ListItemText\":\"Test-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"Test-AzStreamAnalyticsFunction\",\"ListItemText\":\"Test-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Test-AzStreamAnalyticsInput\",\"ListItemText\":\"Test-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Test-AzStreamAnalyticsOutput\",\"ListItemText\":\"Test-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Test-AzSubscriptionDeployment\",\"ListItemText\":\"Test-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzSubscriptionDeployment\"},{\"CompletionText\":\"Test-AzSynapseSparkPool\",\"ListItemText\":\"Test-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Test-AzSynapseSqlDatabase\",\"ListItemText\":\"Test-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Test-AzSynapseSqlPool\",\"ListItemText\":\"Test-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Test-AzSynapseWorkspace\",\"ListItemText\":\"Test-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Test-AzTenantDeployment\",\"ListItemText\":\"Test-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzVMAEMExtension\",\"ListItemText\":\"Test-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Test-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Test-AzWebPubSubNameAvailability\",\"ListItemText\":\"Test-AzWebPubSubNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzWebPubSubNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-Certificate\",\"ListItemText\":\"Test-Certificate\",\"ResultType\":2,\"ToolTip\":\"Test-Certificate\\r\\n\"},{\"CompletionText\":\"Test-Connection\",\"ListItemText\":\"Test-Connection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Connection [-TargetName] [-Ping] [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-MaxHops ] [-Count ] [-Delay ] [-BufferSize ] [-DontFragment] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -Repeat [-Ping] [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-MaxHops ] [-Delay ] [-BufferSize ] [-DontFragment] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -Traceroute [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-MaxHops ] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -MtuSize [-IPv4] [-IPv6] [-ResolveDestination] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -TcpPort [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-Count ] [-Delay ] [-Repeat] [-Quiet] [-TimeoutSeconds ] [-Detailed] []\\r\\n\"},{\"CompletionText\":\"Test-DscConfiguration\",\"ListItemText\":\"Test-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Test-DscConfiguration\\r\\n\"},{\"CompletionText\":\"Test-Dtc\",\"ListItemText\":\"Test-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Dtc \\r\\n\"},{\"CompletionText\":\"Test-FileCatalog\",\"ListItemText\":\"Test-FileCatalog\",\"ResultType\":2,\"ToolTip\":\"Test-FileCatalog\\r\\n\"},{\"CompletionText\":\"Test-HgsClientConfiguration\",\"ListItemText\":\"Test-HgsClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-HgsClientConfiguration \\r\\n\"},{\"CompletionText\":\"Test-HgsTraceTarget\",\"ListItemText\":\"Test-HgsTraceTarget\",\"ResultType\":2,\"ToolTip\":\"Test-HgsTraceTarget\\r\\n\"},{\"CompletionText\":\"Test-Json\",\"ListItemText\":\"Test-Json\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Json [-Json] []\\r\\n\\r\\nTest-Json [-Json] [-Schema] []\\r\\n\\r\\nTest-Json [-Json] [-SchemaFile] []\\r\\n\\r\\nTest-Json [-Path] []\\r\\n\\r\\nTest-Json [-Path] [-Schema] []\\r\\n\\r\\nTest-Json [-Path] [-SchemaFile] []\\r\\n\\r\\nTest-Json [-LiteralPath] []\\r\\n\\r\\nTest-Json [-LiteralPath] [-Schema] []\\r\\n\\r\\nTest-Json [-LiteralPath] [-SchemaFile] []\\r\\n\"},{\"CompletionText\":\"Test-KdsRootKey\",\"ListItemText\":\"Test-KdsRootKey\",\"ResultType\":2,\"ToolTip\":\"Test-KdsRootKey\\r\\n\"},{\"CompletionText\":\"Test-ModuleManifest\",\"ListItemText\":\"Test-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-ModuleManifest [-Path] []\\r\\n\"},{\"CompletionText\":\"Test-NetConnection\",\"ListItemText\":\"Test-NetConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-NetConnection \\r\\n\"},{\"CompletionText\":\"Test-Path\",\"ListItemText\":\"Test-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Path [-Path] [-Filter ] [-Include ] [-Exclude ] [-PathType ] [-IsValid] [-Credential ] [-OlderThan ] [-NewerThan ] []\\r\\n\\r\\nTest-Path -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-PathType ] [-IsValid] [-Credential ] [-OlderThan ] [-NewerThan ] []\\r\\n\"},{\"CompletionText\":\"Test-PSScriptFileInfo\",\"ListItemText\":\"Test-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"Test-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"Test-PSSessionConfigurationFile\",\"ListItemText\":\"Test-PSSessionConfigurationFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-PSSessionConfigurationFile [-Path] []\\r\\n\"},{\"CompletionText\":\"Test-ScriptFileInfo\",\"ListItemText\":\"Test-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"Test-VHD\",\"ListItemText\":\"Test-VHD\",\"ResultType\":2,\"ToolTip\":\"Test-VHD\\r\\n\"},{\"CompletionText\":\"Test-VMNetworkAdapter\",\"ListItemText\":\"Test-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Test-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Test-VMReplicationConnection\",\"ListItemText\":\"Test-VMReplicationConnection\",\"ResultType\":2,\"ToolTip\":\"Test-VMReplicationConnection\\r\\n\"},{\"CompletionText\":\"Test-WSMan\",\"ListItemText\":\"Test-WSMan\",\"ResultType\":2,\"ToolTip\":\"Test-WSMan\\r\\n\"},{\"CompletionText\":\"textual.exe\",\"ListItemText\":\"textual.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\textual.exe\"},{\"CompletionText\":\"tgit\",\"ListItemText\":\"tgit\",\"ResultType\":2,\"ToolTip\":\"\\r\\ntgit \\r\\n\"},{\"CompletionText\":\"ThumbnailExtractionHost.exe\",\"ListItemText\":\"ThumbnailExtractionHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ThumbnailExtractionHost.exe\"},{\"CompletionText\":\"tid\",\"ListItemText\":\"tid\",\"ResultType\":2,\"ToolTip\":\"tid\"},{\"CompletionText\":\"TieringEngineService.exe\",\"ListItemText\":\"TieringEngineService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TieringEngineService.exe\"},{\"CompletionText\":\"tig.exe\",\"ListItemText\":\"tig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\tig.exe\"},{\"CompletionText\":\"timedate.cpl\",\"ListItemText\":\"timedate.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\timedate.cpl\"},{\"CompletionText\":\"timeout.exe\",\"ListItemText\":\"timeout.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\timeout.exe\"},{\"CompletionText\":\"tnameserv.exe\",\"ListItemText\":\"tnameserv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\tnameserv.exe\"},{\"CompletionText\":\"TNC\",\"ListItemText\":\"TNC\",\"ResultType\":2,\"ToolTip\":\"TNC\"},{\"CompletionText\":\"TokenBrokerCookies.exe\",\"ListItemText\":\"TokenBrokerCookies.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TokenBrokerCookies.exe\"},{\"CompletionText\":\"tpm.msc\",\"ListItemText\":\"tpm.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tpm.msc\"},{\"CompletionText\":\"TpmInit.exe\",\"ListItemText\":\"TpmInit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TpmInit.exe\"},{\"CompletionText\":\"TpmTool.exe\",\"ListItemText\":\"TpmTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TpmTool.exe\"},{\"CompletionText\":\"tpmvscmgr.exe\",\"ListItemText\":\"tpmvscmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tpmvscmgr.exe\"},{\"CompletionText\":\"tpmvscmgrsvr.exe\",\"ListItemText\":\"tpmvscmgrsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tpmvscmgrsvr.exe\"},{\"CompletionText\":\"Trace-Command\",\"ListItemText\":\"Trace-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTrace-Command [-Name] [-Expression] [[-Option] ] [-InputObject ] [-ListenerOption ] [-FilePath ] [-Force] [-Debugger] [-PSHost] []\\r\\n\\r\\nTrace-Command [-Name] [-Command] [[-Option] ] [-InputObject ] [-ArgumentList ] [-ListenerOption ] [-FilePath ] [-Force] [-Debugger] [-PSHost] []\\r\\n\"},{\"CompletionText\":\"tracerpt.exe\",\"ListItemText\":\"tracerpt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tracerpt.exe\"},{\"CompletionText\":\"TRACERT.EXE\",\"ListItemText\":\"TRACERT.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TRACERT.EXE\"},{\"CompletionText\":\"Tracker.exe\",\"ListItemText\":\"Tracker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2017\\\\BuildTools\\\\MSBuild\\\\15.0\\\\Bin\\\\Tracker.exe\"},{\"CompletionText\":\"tree.com\",\"ListItemText\":\"tree.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tree.com\"},{\"CompletionText\":\"ts-node-cwd.cmd\",\"ListItemText\":\"ts-node-cwd.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-cwd.cmd\"},{\"CompletionText\":\"ts-node-cwd.ps1\",\"ListItemText\":\"ts-node-cwd.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-cwd.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node-esm.cmd\",\"ListItemText\":\"ts-node-esm.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-esm.cmd\"},{\"CompletionText\":\"ts-node-esm.ps1\",\"ListItemText\":\"ts-node-esm.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-esm.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node-script.cmd\",\"ListItemText\":\"ts-node-script.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-script.cmd\"},{\"CompletionText\":\"ts-node-script.ps1\",\"ListItemText\":\"ts-node-script.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-script.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node-transpile-only.cmd\",\"ListItemText\":\"ts-node-transpile-only.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-transpile-only.cmd\"},{\"CompletionText\":\"ts-node-transpile-only.ps1\",\"ListItemText\":\"ts-node-transpile-only.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-transpile-only.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node.cmd\",\"ListItemText\":\"ts-node.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node.cmd\"},{\"CompletionText\":\"ts-node.ps1\",\"ListItemText\":\"ts-node.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node.ps1 \\r\\n\"},{\"CompletionText\":\"ts-script.cmd\",\"ListItemText\":\"ts-script.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-script.cmd\"},{\"CompletionText\":\"ts-script.ps1\",\"ListItemText\":\"ts-script.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-script.ps1 \\r\\n\"},{\"CompletionText\":\"tscon.exe\",\"ListItemText\":\"tscon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tscon.exe\"},{\"CompletionText\":\"tsdiscon.exe\",\"ListItemText\":\"tsdiscon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tsdiscon.exe\"},{\"CompletionText\":\"tskill.exe\",\"ListItemText\":\"tskill.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tskill.exe\"},{\"CompletionText\":\"TSTheme.exe\",\"ListItemText\":\"TSTheme.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TSTheme.exe\"},{\"CompletionText\":\"TSWbPrxy.exe\",\"ListItemText\":\"TSWbPrxy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TSWbPrxy.exe\"},{\"CompletionText\":\"ttdinject.exe\",\"ListItemText\":\"ttdinject.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ttdinject.exe\"},{\"CompletionText\":\"tttracer.exe\",\"ListItemText\":\"tttracer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tttracer.exe\"},{\"CompletionText\":\"type\",\"ListItemText\":\"type\",\"ResultType\":2,\"ToolTip\":\"Get-Content\"},{\"CompletionText\":\"typeperf.exe\",\"ListItemText\":\"typeperf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\typeperf.exe\"},{\"CompletionText\":\"tzsync.exe\",\"ListItemText\":\"tzsync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tzsync.exe\"},{\"CompletionText\":\"tzutil.exe\",\"ListItemText\":\"tzutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tzutil.exe\"},{\"CompletionText\":\"U:\",\"ListItemText\":\"U:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nU: \\r\\n\"},{\"CompletionText\":\"ubuntu.exe\",\"ListItemText\":\"ubuntu.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ubuntu.exe\"},{\"CompletionText\":\"UCPDMgr.exe\",\"ListItemText\":\"UCPDMgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UCPDMgr.exe\"},{\"CompletionText\":\"ucsvc.exe\",\"ListItemText\":\"ucsvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ucsvc.exe\"},{\"CompletionText\":\"udres\",\"ListItemText\":\"udres\",\"ResultType\":2,\"ToolTip\":\"udres\"},{\"CompletionText\":\"udsmbmc\",\"ListItemText\":\"udsmbmc\",\"ResultType\":2,\"ToolTip\":\"udsmbmc\"},{\"CompletionText\":\"UevAgentPolicyGenerator.exe\",\"ListItemText\":\"UevAgentPolicyGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevAgentPolicyGenerator.exe\"},{\"CompletionText\":\"UevAppMonitor.exe\",\"ListItemText\":\"UevAppMonitor.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevAppMonitor.exe\"},{\"CompletionText\":\"UevTemplateBaselineGenerator.exe\",\"ListItemText\":\"UevTemplateBaselineGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevTemplateBaselineGenerator.exe\"},{\"CompletionText\":\"UevTemplateConfigItemGenerator.exe\",\"ListItemText\":\"UevTemplateConfigItemGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevTemplateConfigItemGenerator.exe\"},{\"CompletionText\":\"UIMgrBroker.exe\",\"ListItemText\":\"UIMgrBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UIMgrBroker.exe\"},{\"CompletionText\":\"ulsmba\",\"ListItemText\":\"ulsmba\",\"ResultType\":2,\"ToolTip\":\"ulsmba\"},{\"CompletionText\":\"ulsmbclas\",\"ListItemText\":\"ulsmbclas\",\"ResultType\":2,\"ToolTip\":\"ulsmbclas\"},{\"CompletionText\":\"Unblock-File\",\"ListItemText\":\"Unblock-File\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-File [-Path] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUnblock-File -LiteralPath [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Unblock-FileShareAccess\",\"ListItemText\":\"Unblock-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Unblock-SmbClientAccessToServer\",\"ListItemText\":\"Unblock-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Unblock-SmbShareAccess\",\"ListItemText\":\"Unblock-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Unblock-Tpm\",\"ListItemText\":\"Unblock-Tpm\",\"ResultType\":2,\"ToolTip\":\"Unblock-Tpm\\r\\n\"},{\"CompletionText\":\"Undo-AzCognitiveServicesAccountRemoval\",\"ListItemText\":\"Undo-AzCognitiveServicesAccountRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzCognitiveServicesAccountRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultCertificateRemoval\",\"ListItemText\":\"Undo-AzKeyVaultCertificateRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultCertificateRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultKeyRemoval\",\"ListItemText\":\"Undo-AzKeyVaultKeyRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultKeyRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultManagedHsmRemoval\",\"ListItemText\":\"Undo-AzKeyVaultManagedHsmRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultManagedHsmRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultManagedStorageAccountRemoval\",\"ListItemText\":\"Undo-AzKeyVaultManagedStorageAccountRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultManagedStorageAccountRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultManagedStorageSasDefinitionRemoval\",\"ListItemText\":\"Undo-AzKeyVaultManagedStorageSasDefinitionRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultManagedStorageSasDefinitionRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultRemoval\",\"ListItemText\":\"Undo-AzKeyVaultRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultSecretRemoval\",\"ListItemText\":\"Undo-AzKeyVaultSecretRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultSecretRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzRecoveryServicesBackupItemDeletion\",\"ListItemText\":\"Undo-AzRecoveryServicesBackupItemDeletion\",\"ResultType\":2,\"ToolTip\":\"Undo-AzRecoveryServicesBackupItemDeletion\\r\\n\"},{\"CompletionText\":\"Undo-DtcDiagnosticTransaction\",\"ListItemText\":\"Undo-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Undo-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"unins000.exe\",\"ListItemText\":\"unins000.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git LFS\\\\unins000.exe\"},{\"CompletionText\":\"Uninstall-AzureRm\",\"ListItemText\":\"Uninstall-AzureRm\",\"ResultType\":2,\"ToolTip\":\"Uninstall-AzureRm\\r\\n\"},{\"CompletionText\":\"Uninstall-Dtc\",\"ListItemText\":\"Uninstall-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Dtc \\r\\n\"},{\"CompletionText\":\"Uninstall-Language\",\"ListItemText\":\"Uninstall-Language\",\"ResultType\":2,\"ToolTip\":\"Uninstall-Language\\r\\n\"},{\"CompletionText\":\"Uninstall-Module\",\"ListItemText\":\"Uninstall-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Module \\r\\n\"},{\"CompletionText\":\"Uninstall-Package\",\"ListItemText\":\"Uninstall-Package\",\"ResultType\":2,\"ToolTip\":\"Uninstall-Package\\r\\n\"},{\"CompletionText\":\"Uninstall-ProvisioningPackage\",\"ListItemText\":\"Uninstall-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Uninstall-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Uninstall-PSResource\",\"ListItemText\":\"Uninstall-PSResource\",\"ResultType\":2,\"ToolTip\":\"Uninstall-PSResource\\r\\n\"},{\"CompletionText\":\"Uninstall-Script\",\"ListItemText\":\"Uninstall-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Script \\r\\n\"},{\"CompletionText\":\"Uninstall-TrustedProvisioningCertificate\",\"ListItemText\":\"Uninstall-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Uninstall-TrustedProvisioningCertificate\\r\\n\"},{\"CompletionText\":\"Unlock-BitLocker\",\"ListItemText\":\"Unlock-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnlock-BitLocker \\r\\n\"},{\"CompletionText\":\"unlodctr.exe\",\"ListItemText\":\"unlodctr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\unlodctr.exe\"},{\"CompletionText\":\"unpack200.exe\",\"ListItemText\":\"unpack200.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\unpack200.exe\"},{\"CompletionText\":\"Unprotect-CmsMessage\",\"ListItemText\":\"Unprotect-CmsMessage\",\"ResultType\":2,\"ToolTip\":\"Unprotect-CmsMessage\\r\\n\"},{\"CompletionText\":\"Unregister-AppBackgroundTask\",\"ListItemText\":\"Unregister-AppBackgroundTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AppBackgroundTask \\r\\n\"},{\"CompletionText\":\"Unregister-AzAutomationDscNode\",\"ListItemText\":\"Unregister-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Unregister-AzAutomationScheduledRunbook\",\"ListItemText\":\"Unregister-AzAutomationScheduledRunbook\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzAutomationScheduledRunbook\\r\\n\"},{\"CompletionText\":\"Unregister-AzProviderFeature\",\"ListItemText\":\"Unregister-AzProviderFeature\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzProviderFeature\\r\\n\"},{\"CompletionText\":\"Unregister-AzProviderPreviewFeature\",\"ListItemText\":\"Unregister-AzProviderPreviewFeature\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzProviderPreviewFeature\\r\\n\"},{\"CompletionText\":\"Unregister-AzRecoveryServicesBackupContainer\",\"ListItemText\":\"Unregister-AzRecoveryServicesBackupContainer\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzRecoveryServicesBackupContainer\\r\\n\"},{\"CompletionText\":\"Unregister-AzRecoveryServicesBackupManagementServer\",\"ListItemText\":\"Unregister-AzRecoveryServicesBackupManagementServer\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzRecoveryServicesBackupManagementServer\\r\\n\"},{\"CompletionText\":\"Unregister-AzResourceProvider\",\"ListItemText\":\"Unregister-AzResourceProvider\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzResourceProvider\\r\\n\"},{\"CompletionText\":\"Unregister-AzStackHCI\",\"ListItemText\":\"Unregister-AzStackHCI\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStackHCI \\r\\n\"},{\"CompletionText\":\"Unregister-AzStaticWebAppBuildUserProvidedFunctionApp\",\"ListItemText\":\"Unregister-AzStaticWebAppBuildUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStaticWebAppBuildUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Unregister-AzStaticWebAppUserProvidedFunctionApp\",\"ListItemText\":\"Unregister-AzStaticWebAppUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStaticWebAppUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Unregister-AzStorageMoverAgent\",\"ListItemText\":\"Unregister-AzStorageMoverAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStorageMoverAgent \\r\\n\"},{\"CompletionText\":\"Unregister-AzStorageSyncServer\",\"ListItemText\":\"Unregister-AzStorageSyncServer\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzStorageSyncServer\\r\\n\"},{\"CompletionText\":\"Unregister-AzWvdApplicationGroup\",\"ListItemText\":\"Unregister-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Unregister-ClusteredScheduledTask\",\"ListItemText\":\"Unregister-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Unregister-Event\",\"ListItemText\":\"Unregister-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-Event [-SourceIdentifier] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUnregister-Event [-SubscriptionId] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Unregister-IscsiSession\",\"ListItemText\":\"Unregister-IscsiSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-IscsiSession \\r\\n\"},{\"CompletionText\":\"Unregister-PackageSource\",\"ListItemText\":\"Unregister-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Unregister-PackageSource\\r\\n\"},{\"CompletionText\":\"Unregister-PSRepository\",\"ListItemText\":\"Unregister-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-PSRepository \\r\\n\"},{\"CompletionText\":\"Unregister-PSResourceRepository\",\"ListItemText\":\"Unregister-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Unregister-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Unregister-PSSessionConfiguration\",\"ListItemText\":\"Unregister-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-PSSessionConfiguration [-Name] [-Force] [-NoServiceRestart] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Unregister-ScheduledJob\",\"ListItemText\":\"Unregister-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Unregister-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Unregister-ScheduledTask\",\"ListItemText\":\"Unregister-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Unregister-StorageSubsystem\",\"ListItemText\":\"Unregister-StorageSubsystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-StorageSubsystem \\r\\n\"},{\"CompletionText\":\"Unregister-WindowsDeveloperLicense\",\"ListItemText\":\"Unregister-WindowsDeveloperLicense\",\"ResultType\":2,\"ToolTip\":\"Unregister-WindowsDeveloperLicense\\r\\n\"},{\"CompletionText\":\"unregmp2.exe\",\"ListItemText\":\"unregmp2.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\unregmp2.exe\"},{\"CompletionText\":\"unsecapp.exe\",\"ListItemText\":\"unsecapp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\unsecapp.exe\"},{\"CompletionText\":\"upcfg\",\"ListItemText\":\"upcfg\",\"ResultType\":2,\"ToolTip\":\"upcfg\"},{\"CompletionText\":\"Update-AdlAnalyticsComputePolicy\",\"ListItemText\":\"Update-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"Update-AllBranches\",\"ListItemText\":\"Update-AllBranches\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AllBranches \\r\\n\"},{\"CompletionText\":\"Update-ASRMobilityService\",\"ListItemText\":\"Update-ASRMobilityService\",\"ResultType\":2,\"ToolTip\":\"Update-ASRMobilityService\"},{\"CompletionText\":\"Update-ASRPolicy\",\"ListItemText\":\"Update-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"Update-ASRPolicy\"},{\"CompletionText\":\"Update-ASRProtectionContainerMapping\",\"ListItemText\":\"Update-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Update-ASRProtectionContainerMapping\"},{\"CompletionText\":\"Update-ASRProtectionDirection\",\"ListItemText\":\"Update-ASRProtectionDirection\",\"ResultType\":2,\"ToolTip\":\"Update-ASRProtectionDirection\"},{\"CompletionText\":\"Update-ASRRecoveryPlan\",\"ListItemText\":\"Update-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Update-ASRRecoveryPlan\"},{\"CompletionText\":\"Update-ASRServicesProvider\",\"ListItemText\":\"Update-ASRServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Update-ASRServicesProvider\"},{\"CompletionText\":\"Update-ASRvCenter\",\"ListItemText\":\"Update-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"Update-ASRvCenter\"},{\"CompletionText\":\"Update-AutologgerConfig\",\"ListItemText\":\"Update-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Update-AzActivityLogAlert\",\"ListItemText\":\"Update-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"Update-AzADAppFederatedCredential\",\"ListItemText\":\"Update-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"Update-AzADApplication\",\"ListItemText\":\"Update-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADApplication \\r\\n\"},{\"CompletionText\":\"Update-AzADGroup\",\"ListItemText\":\"Update-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADGroup \\r\\n\"},{\"CompletionText\":\"Update-AzADServicePrincipal\",\"ListItemText\":\"Update-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"Update-AzADUser\",\"ListItemText\":\"Update-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADUser \\r\\n\"},{\"CompletionText\":\"Update-AzAksNodePool\",\"ListItemText\":\"Update-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"Update-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementApiRelease\",\"ListItemText\":\"Update-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementCache\",\"ListItemText\":\"Update-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementGateway\",\"ListItemText\":\"Update-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementRegion\",\"ListItemText\":\"Update-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"Update-AzAppConfigurationStore\",\"ListItemText\":\"Update-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsights\",\"ListItemText\":\"Update-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"Update-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"Update-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsWebTestTag\",\"ListItemText\":\"Update-AzApplicationInsightsWebTestTag\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsWebTestTag \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsWorkbook\",\"ListItemText\":\"Update-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"Update-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"Update-AzAttestationProvider\",\"ListItemText\":\"Update-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"Update-AzAutomanageConfigProfile\",\"ListItemText\":\"Update-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"Update-AzAutomationSourceControl\",\"ListItemText\":\"Update-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"Update-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"Update-AzAutoscaleSetting\",\"ListItemText\":\"Update-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"Update-AzAvailabilitySet\",\"ListItemText\":\"Update-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"Update-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"Update-AzCapacityReservation\",\"ListItemText\":\"Update-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"Update-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"Update-AzCapacityReservationGroup\",\"ListItemText\":\"Update-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"Update-AzCdnEndpoint\",\"ListItemText\":\"Update-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzCdnOrigin\",\"ListItemText\":\"Update-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"Update-AzCdnOriginGroup\",\"ListItemText\":\"Update-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Update-AzCdnProfile\",\"ListItemText\":\"Update-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"Update-AzCloudService\",\"ListItemText\":\"Update-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCloudService \\r\\n\"},{\"CompletionText\":\"Update-AzCognitiveServicesAccountNetworkRuleSet\",\"ListItemText\":\"Update-AzCognitiveServicesAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzCognitiveServicesAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Update-AzConfidentialLedger\",\"ListItemText\":\"Update-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"Update-AzConfig\",\"ListItemText\":\"Update-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Update-AzConfig\\r\\n\"},{\"CompletionText\":\"Update-AzContainerGroup\",\"ListItemText\":\"Update-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistry\",\"ListItemText\":\"Update-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryAgentPool\",\"ListItemText\":\"Update-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryCredential\",\"ListItemText\":\"Update-AzContainerRegistryCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryCredential \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryManifest\",\"ListItemText\":\"Update-AzContainerRegistryManifest\",\"ResultType\":2,\"ToolTip\":\"Update-AzContainerRegistryManifest\\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryRepository\",\"ListItemText\":\"Update-AzContainerRegistryRepository\",\"ResultType\":2,\"ToolTip\":\"Update-AzContainerRegistryRepository\\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryScopeMap\",\"ListItemText\":\"Update-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryTag\",\"ListItemText\":\"Update-AzContainerRegistryTag\",\"ResultType\":2,\"ToolTip\":\"Update-AzContainerRegistryTag\\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryToken\",\"ListItemText\":\"Update-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryWebhook\",\"ListItemText\":\"Update-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBAccount\",\"ListItemText\":\"Update-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBAccountFailoverPriority\",\"ListItemText\":\"Update-AzCosmosDBAccountFailoverPriority\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBAccountFailoverPriority\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBAccountRegion\",\"ListItemText\":\"Update-AzCosmosDBAccountRegion\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBAccountRegion\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"Update-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraKeyspaceThroughput\",\"ListItemText\":\"Update-AzCosmosDBCassandraKeyspaceThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraKeyspaceThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraTable\",\"ListItemText\":\"Update-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraTableThroughput\",\"ListItemText\":\"Update-AzCosmosDBCassandraTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraTableThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDbClientEncryptionKey\",\"ListItemText\":\"Update-AzCosmosDbClientEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDbClientEncryptionKey\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"Update-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinDatabaseThroughput\",\"ListItemText\":\"Update-AzCosmosDBGremlinDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinGraph\",\"ListItemText\":\"Update-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinGraphThroughput\",\"ListItemText\":\"Update-AzCosmosDBGremlinGraphThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinGraphThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"Update-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBCollectionThroughput\",\"ListItemText\":\"Update-AzCosmosDBMongoDBCollectionThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBCollectionThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"Update-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBDatabaseThroughput\",\"ListItemText\":\"Update-AzCosmosDBMongoDBDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"Update-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"Update-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlContainer\",\"ListItemText\":\"Update-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlContainerThroughput\",\"ListItemText\":\"Update-AzCosmosDBSqlContainerThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlContainerThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlDatabase\",\"ListItemText\":\"Update-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlDatabaseThroughput\",\"ListItemText\":\"Update-AzCosmosDBSqlDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"Update-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"Update-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"Update-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlTrigger\",\"ListItemText\":\"Update-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"Update-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBTable\",\"ListItemText\":\"Update-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBTableThroughput\",\"ListItemText\":\"Update-AzCosmosDBTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBTableThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCustomIpPrefix\",\"ListItemText\":\"Update-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Update-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"Update-AzDatabricksAccessConnector\",\"ListItemText\":\"Update-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"Update-AzDatabricksVNetPeering\",\"ListItemText\":\"Update-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"Update-AzDatabricksWorkspace\",\"ListItemText\":\"Update-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzDataCollectionRule\",\"ListItemText\":\"Update-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Update-AzDataFactoryV2\",\"ListItemText\":\"Update-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Update-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Update-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Update-AzDataFactoryV2IntegrationRuntimeNode\",\"ListItemText\":\"Update-AzDataFactoryV2IntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataFactoryV2IntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Update-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"Update-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"Update-AzDataLakeGen2AclRecursive\",\"ListItemText\":\"Update-AzDataLakeGen2AclRecursive\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataLakeGen2AclRecursive\\r\\n\"},{\"CompletionText\":\"Update-AzDataLakeGen2Item\",\"ListItemText\":\"Update-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Update-AzDataProtectionBackupInstanceAssociatedPolicy\",\"ListItemText\":\"Update-AzDataProtectionBackupInstanceAssociatedPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDataProtectionBackupInstanceAssociatedPolicy \\r\\n\"},{\"CompletionText\":\"Update-AzDataProtectionBackupVault\",\"ListItemText\":\"Update-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"Update-AzDataProtectionResourceGuard\",\"ListItemText\":\"Update-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"Update-AzDisk\",\"ListItemText\":\"Update-AzDisk\",\"ResultType\":2,\"ToolTip\":\"Update-AzDisk\\r\\n\"},{\"CompletionText\":\"Update-AzDiskEncryptionSet\",\"ListItemText\":\"Update-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridChannel\",\"ListItemText\":\"Update-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Update-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridPartnerTopic\",\"ListItemText\":\"Update-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"Update-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridSubscription\",\"ListItemText\":\"Update-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridSystemTopic\",\"ListItemText\":\"Update-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"Update-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Update-AzFederatedIdentityCredentials\",\"ListItemText\":\"Update-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"Update-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnCustomDomainValidationToken\",\"ListItemText\":\"Update-AzFrontDoorCdnCustomDomainValidationToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnCustomDomainValidationToken \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"Update-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnOrigin\",\"ListItemText\":\"Update-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"Update-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnProfile\",\"ListItemText\":\"Update-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnProfileSku\",\"ListItemText\":\"Update-AzFrontDoorCdnProfileSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnProfileSku \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnRoute\",\"ListItemText\":\"Update-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnRule\",\"ListItemText\":\"Update-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"Update-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorWafPolicy\",\"ListItemText\":\"Update-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"Update-AzFunctionApp\",\"ListItemText\":\"Update-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Update-AzFunctionAppPlan\",\"ListItemText\":\"Update-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"Update-AzFunctionAppSetting\",\"ListItemText\":\"Update-AzFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Update-AzGallery\",\"ListItemText\":\"Update-AzGallery\",\"ResultType\":2,\"ToolTip\":\"Update-AzGallery\\r\\n\"},{\"CompletionText\":\"Update-AzGalleryApplication\",\"ListItemText\":\"Update-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"Update-AzGalleryApplicationVersion\",\"ListItemText\":\"Update-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"Update-AzGalleryImageDefinition\",\"ListItemText\":\"Update-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzGalleryImageVersion\",\"ListItemText\":\"Update-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"Update-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareApisService\",\"ListItemText\":\"Update-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareApisWorkspace\",\"ListItemText\":\"Update-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareDicomService\",\"ListItemText\":\"Update-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareFhirService\",\"ListItemText\":\"Update-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareIotConnector\",\"ListItemText\":\"Update-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"Update-AzImage\",\"ListItemText\":\"Update-AzImage\",\"ResultType\":2,\"ToolTip\":\"Update-AzImage\\r\\n\"},{\"CompletionText\":\"Update-AzInsightsPrivateLinkScope\",\"ListItemText\":\"Update-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"Update-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"Update-AzIotHub\",\"ListItemText\":\"Update-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotHub\\r\\n\"},{\"CompletionText\":\"Update-AzIotHubDeviceTwin\",\"ListItemText\":\"Update-AzIotHubDeviceTwin\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotHubDeviceTwin\\r\\n\"},{\"CompletionText\":\"Update-AzIotHubModuleTwin\",\"ListItemText\":\"Update-AzIotHubModuleTwin\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotHubModuleTwin\\r\\n\"},{\"CompletionText\":\"Update-AzIotSecuritySolution\",\"ListItemText\":\"Update-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVault\",\"ListItemText\":\"Update-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultCertificate\",\"ListItemText\":\"Update-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultKey\",\"ListItemText\":\"Update-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultManagedHsm\",\"ListItemText\":\"Update-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Update-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultManagedStorageAccountKey\",\"ListItemText\":\"Update-AzKeyVaultManagedStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultManagedStorageAccountKey\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultNetworkRuleSet\",\"ListItemText\":\"Update-AzKeyVaultNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultSecret\",\"ListItemText\":\"Update-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Update-AzKustoCluster\",\"ListItemText\":\"Update-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Update-AzKustoDatabase\",\"ListItemText\":\"Update-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"Update-AzKustoDataConnection\",\"ListItemText\":\"Update-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"Update-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"Update-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzKustoScript\",\"ListItemText\":\"Update-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoScript \\r\\n\"},{\"CompletionText\":\"Update-AzLoad\",\"ListItemText\":\"Update-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzLoad \\r\\n\"},{\"CompletionText\":\"Update-AzMaintenanceConfiguration\",\"ListItemText\":\"Update-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"Update-AzManagedCassandraCluster\",\"ListItemText\":\"Update-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"Update-AzManagedCassandraDataCenter\",\"ListItemText\":\"Update-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"Update-AzManagementGroup\",\"ListItemText\":\"Update-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"Update-AzManagementGroupHierarchySetting\",\"ListItemText\":\"Update-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"Update-AzMlCommitmentPlan\",\"ListItemText\":\"Update-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Update-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Update-AzMLServiceQuota\",\"ListItemText\":\"Update-AzMLServiceQuota\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLServiceQuota \\r\\n\"},{\"CompletionText\":\"Update-AzMlWebService\",\"ListItemText\":\"Update-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Update-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspace\",\"ListItemText\":\"Update-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"Update-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"Update-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceCompute\",\"ListItemText\":\"Update-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"Update-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"Update-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzMonitorWorkspace\",\"ListItemText\":\"Update-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlConfiguration\",\"ListItemText\":\"Update-AzMySqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFirewallRule\",\"ListItemText\":\"Update-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFlexibleServer\",\"ListItemText\":\"Update-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFlexibleServerConfiguration\",\"ListItemText\":\"Update-AzMySqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"Update-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlServer\",\"ListItemText\":\"Update-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlServerConfigurationsList\",\"ListItemText\":\"Update-AzMySqlServerConfigurationsList\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlServerConfigurationsList \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"Update-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Update-AzNetworkVirtualAppliance\",\"ListItemText\":\"Update-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"Update-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsCluster\",\"ListItemText\":\"Update-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsDataExport\",\"ListItemText\":\"Update-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsTable\",\"ListItemText\":\"Update-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsWorkspaceSharedKey\",\"ListItemText\":\"Update-AzOperationalInsightsWorkspaceSharedKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsWorkspaceSharedKey\\r\\n\"},{\"CompletionText\":\"Update-AzP2sVpnGateway\",\"ListItemText\":\"Update-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Update-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlConfiguration\",\"ListItemText\":\"Update-AzPostgreSqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFirewallRule\",\"ListItemText\":\"Update-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Update-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFlexibleServerConfiguration\",\"ListItemText\":\"Update-AzPostgreSqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"Update-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlServer\",\"ListItemText\":\"Update-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"Update-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Update-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Update-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Update-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrMobilityService\",\"ListItemText\":\"Update-AzRecoveryServicesAsrMobilityService\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrMobilityService\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"Update-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"Update-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"Update-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrProtectionDirection\",\"ListItemText\":\"Update-AzRecoveryServicesAsrProtectionDirection\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrProtectionDirection\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Update-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrServicesProvider\",\"ListItemText\":\"Update-AzRecoveryServicesAsrServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrServicesProvider\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"Update-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesVault\",\"ListItemText\":\"Update-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Update-AzRedisEnterpriseCache\",\"ListItemText\":\"Update-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Update-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Update-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"Update-AzRelayNamespace\",\"ListItemText\":\"Update-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"Update-AzResourceMoverMoveResource\",\"ListItemText\":\"Update-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"Update-AzResourceMoverMoveResource\"},{\"CompletionText\":\"Update-AzRestorePointCollection\",\"ListItemText\":\"Update-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"Update-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"Update-AzRmStorageContainer\",\"ListItemText\":\"Update-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Update-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"Update-AzRmStorageShare\",\"ListItemText\":\"Update-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Update-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Update-AzRoleManagementPolicy\",\"ListItemText\":\"Update-AzRoleManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRoleManagementPolicy \\r\\n\"},{\"CompletionText\":\"Update-AzRouteMap\",\"ListItemText\":\"Update-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"Update-AzRouteMap\\r\\n\"},{\"CompletionText\":\"Update-AzRouteServer\",\"ListItemText\":\"Update-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"Update-AzRouteServer\\r\\n\"},{\"CompletionText\":\"Update-AzRouteServerPeer\",\"ListItemText\":\"Update-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Update-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Update-AzScheduledQueryRule\",\"ListItemText\":\"Update-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelAlertRule\",\"ListItemText\":\"Update-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelAlertRuleAction\",\"ListItemText\":\"Update-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelAutomationRule\",\"ListItemText\":\"Update-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelBookmark\",\"ListItemText\":\"Update-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelBookmarkRelation\",\"ListItemText\":\"Update-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelDataConnector\",\"ListItemText\":\"Update-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelEntityQuery\",\"ListItemText\":\"Update-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelIncident\",\"ListItemText\":\"Update-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelIncidentComment\",\"ListItemText\":\"Update-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelIncidentRelation\",\"ListItemText\":\"Update-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelSetting\",\"ListItemText\":\"Update-AzSentinelSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelSetting \\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricApplication\",\"ListItemText\":\"Update-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricDurability\",\"ListItemText\":\"Update-AzServiceFabricDurability\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricDurability\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricNodeType\",\"ListItemText\":\"Update-AzServiceFabricNodeType\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricNodeType\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricReliability\",\"ListItemText\":\"Update-AzServiceFabricReliability\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricReliability\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricVmImage\",\"ListItemText\":\"Update-AzServiceFabricVmImage\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricVmImage\\r\\n\"},{\"CompletionText\":\"Update-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Update-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Update-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Update-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Update-AzServiceLinkerForWebApp\",\"ListItemText\":\"Update-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Update-AzSignalR\",\"ListItemText\":\"Update-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Update-AzSignalR\\r\\n\"},{\"CompletionText\":\"Update-AzSignalRNetworkAcl\",\"ListItemText\":\"Update-AzSignalRNetworkAcl\",\"ResultType\":2,\"ToolTip\":\"Update-AzSignalRNetworkAcl\\r\\n\"},{\"CompletionText\":\"Update-AzSnapshot\",\"ListItemText\":\"Update-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"Update-AzSnapshot\\r\\n\"},{\"CompletionText\":\"Update-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Update-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Update-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Update-AzSqlInstanceLink\",\"ListItemText\":\"Update-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"Update-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlServerAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlServerAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlServerAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlServerVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlServerVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlServerVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlSyncGroup\",\"ListItemText\":\"Update-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"Update-AzSqlSyncMember\",\"ListItemText\":\"Update-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"Update-AzSqlSyncSchema\",\"ListItemText\":\"Update-AzSqlSyncSchema\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlSyncSchema\\r\\n\"},{\"CompletionText\":\"Update-AzSqlVM\",\"ListItemText\":\"Update-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSqlVM \\r\\n\"},{\"CompletionText\":\"Update-AzSqlVMGroup\",\"ListItemText\":\"Update-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"Update-AzSshKey\",\"ListItemText\":\"Update-AzSshKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzSshKey\\r\\n\"},{\"CompletionText\":\"Update-AzStackHciCluster\",\"ListItemText\":\"Update-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"Update-AzStaticWebApp\",\"ListItemText\":\"Update-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"Update-AzStaticWebAppUser\",\"ListItemText\":\"Update-AzStaticWebAppUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStaticWebAppUser \\r\\n\"},{\"CompletionText\":\"Update-AzStorageAccountNetworkRuleSet\",\"ListItemText\":\"Update-AzStorageAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Update-AzStorageBlobServiceProperty\",\"ListItemText\":\"Update-AzStorageBlobServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageBlobServiceProperty\\r\\n\"},{\"CompletionText\":\"Update-AzStorageEncryptionScope\",\"ListItemText\":\"Update-AzStorageEncryptionScope\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageEncryptionScope\\r\\n\"},{\"CompletionText\":\"Update-AzStorageFileServiceProperty\",\"ListItemText\":\"Update-AzStorageFileServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageFileServiceProperty\\r\\n\"},{\"CompletionText\":\"Update-AzStorageMover\",\"ListItemText\":\"Update-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMover \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverAgent\",\"ListItemText\":\"Update-AzStorageMoverAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverAgent \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverAzStorageContainerEndpoint\",\"ListItemText\":\"Update-AzStorageMoverAzStorageContainerEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverAzStorageContainerEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverJobDefinition\",\"ListItemText\":\"Update-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverNfsEndpoint\",\"ListItemText\":\"Update-AzStorageMoverNfsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverNfsEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverProject\",\"ListItemText\":\"Update-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"Update-AzStorageServiceProperty\",\"ListItemText\":\"Update-AzStorageServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageServiceProperty\\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsCluster\",\"ListItemText\":\"Update-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsFunction\",\"ListItemText\":\"Update-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsInput\",\"ListItemText\":\"Update-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsJob\",\"ListItemText\":\"Update-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsOutput\",\"ListItemText\":\"Update-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsTransformation\",\"ListItemText\":\"Update-AzStreamAnalyticsTransformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsTransformation \\r\\n\"},{\"CompletionText\":\"Update-AzSupportTicket\",\"ListItemText\":\"Update-AzSupportTicket\",\"ResultType\":2,\"ToolTip\":\"Update-AzSupportTicket\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseFirewallRule\",\"ListItemText\":\"Update-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Update-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseIntegrationRuntimeNode\",\"ListItemText\":\"Update-AzSynapseIntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseIntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseKustoPool\",\"ListItemText\":\"Update-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Update-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"Update-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"Update-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"Update-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"Update-AzSynapseLinkConnectionLandingZoneCredential\",\"ListItemText\":\"Update-AzSynapseLinkConnectionLandingZoneCredential\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseLinkConnectionLandingZoneCredential\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseManagedVirtualNetworkConfig\",\"ListItemText\":\"Update-AzSynapseManagedVirtualNetworkConfig\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseManagedVirtualNetworkConfig\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSparkPool\",\"ListItemText\":\"Update-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlDatabase\",\"ListItemText\":\"Update-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlPool\",\"ListItemText\":\"Update-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlPoolAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlPoolVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseWorkspace\",\"ListItemText\":\"Update-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Update-AzTag\",\"ListItemText\":\"Update-AzTag\",\"ResultType\":2,\"ToolTip\":\"Update-AzTag\\r\\n\"},{\"CompletionText\":\"Update-AzUserAssignedIdentity\",\"ListItemText\":\"Update-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Update-AzVHubRouteTable\",\"ListItemText\":\"Update-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualApplianceSite\",\"ListItemText\":\"Update-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualHub\",\"ListItemText\":\"Update-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualHubBgpConnection\",\"ListItemText\":\"Update-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualHubVnetConnection\",\"ListItemText\":\"Update-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"Update-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualRouter\",\"ListItemText\":\"Update-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualRouterPeer\",\"ListItemText\":\"Update-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualWan\",\"ListItemText\":\"Update-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"Update-AzVM\",\"ListItemText\":\"Update-AzVM\",\"ResultType\":2,\"ToolTip\":\"Update-AzVM\\r\\n\"},{\"CompletionText\":\"Update-AzVmss\",\"ListItemText\":\"Update-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Update-AzVmss\\r\\n\"},{\"CompletionText\":\"Update-AzVmssInstance\",\"ListItemText\":\"Update-AzVmssInstance\",\"ResultType\":2,\"ToolTip\":\"Update-AzVmssInstance\\r\\n\"},{\"CompletionText\":\"Update-AzVmssVM\",\"ListItemText\":\"Update-AzVmssVM\",\"ResultType\":2,\"ToolTip\":\"Update-AzVmssVM\\r\\n\"},{\"CompletionText\":\"Update-AzVpnConnection\",\"ListItemText\":\"Update-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"Update-AzVpnGateway\",\"ListItemText\":\"Update-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Update-AzVpnGatewayNatRule\",\"ListItemText\":\"Update-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Update-AzVpnServerConfiguration\",\"ListItemText\":\"Update-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Update-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"Update-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"Update-AzVpnSite\",\"ListItemText\":\"Update-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnSite\\r\\n\"},{\"CompletionText\":\"Update-AzWebAppAccessRestrictionConfig\",\"ListItemText\":\"Update-AzWebAppAccessRestrictionConfig\",\"ResultType\":2,\"ToolTip\":\"Update-AzWebAppAccessRestrictionConfig\\r\\n\"},{\"CompletionText\":\"Update-AzWebAppTrafficRouting\",\"ListItemText\":\"Update-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Update-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Update-AzWebPubSub\",\"ListItemText\":\"Update-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Update-AzWvdApplication\",\"ListItemText\":\"Update-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"Update-AzWvdApplicationGroup\",\"ListItemText\":\"Update-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Update-AzWvdDesktop\",\"ListItemText\":\"Update-AzWvdDesktop\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdDesktop \\r\\n\"},{\"CompletionText\":\"Update-AzWvdHostPool\",\"ListItemText\":\"Update-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"Update-AzWvdMsixPackage\",\"ListItemText\":\"Update-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"Update-AzWvdScalingPlan\",\"ListItemText\":\"Update-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"Update-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"Update-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"Update-AzWvdSessionHost\",\"ListItemText\":\"Update-AzWvdSessionHost\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdSessionHost \\r\\n\"},{\"CompletionText\":\"Update-AzWvdWorkspace\",\"ListItemText\":\"Update-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"Update-Disk\",\"ListItemText\":\"Update-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Disk \\r\\n\"},{\"CompletionText\":\"Update-DscConfiguration\",\"ListItemText\":\"Update-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Update-EtwTraceSession\",\"ListItemText\":\"Update-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Update-FormatData\",\"ListItemText\":\"Update-FormatData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-FormatData [[-AppendPath] ] [-PrependPath ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Update-Help\",\"ListItemText\":\"Update-Help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Help [[-Module] ] [[-SourcePath] ] [[-UICulture] ] [-FullyQualifiedModule ] [-Recurse] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUpdate-Help [[-Module] ] [[-UICulture] ] [-FullyQualifiedModule ] [-LiteralPath ] [-Recurse] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Update-HostStorageCache\",\"ListItemText\":\"Update-HostStorageCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-HostStorageCache \\r\\n\"},{\"CompletionText\":\"Update-IscsiTarget\",\"ListItemText\":\"Update-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Update-IscsiTargetPortal\",\"ListItemText\":\"Update-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"Update-LapsADSchema\",\"ListItemText\":\"Update-LapsADSchema\",\"ResultType\":2,\"ToolTip\":\"Update-LapsADSchema\\r\\n\"},{\"CompletionText\":\"Update-List\",\"ListItemText\":\"Update-List\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-List [[-Property] ] [-Add ] [-Remove ] [-InputObject ] []\\r\\n\\r\\nUpdate-List [[-Property] ] -Replace [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Update-Module\",\"ListItemText\":\"Update-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Module \\r\\n\"},{\"CompletionText\":\"Update-ModuleManifest\",\"ListItemText\":\"Update-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ModuleManifest \\r\\n\"},{\"CompletionText\":\"Update-MpSignature\",\"ListItemText\":\"Update-MpSignature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-MpSignature \\r\\n\"},{\"CompletionText\":\"Update-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"Update-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"Update-NetIPsecRule\",\"ListItemText\":\"Update-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Update-PSModuleManifest\",\"ListItemText\":\"Update-PSModuleManifest\",\"ResultType\":2,\"ToolTip\":\"Update-PSModuleManifest\\r\\n\"},{\"CompletionText\":\"Update-PSResource\",\"ListItemText\":\"Update-PSResource\",\"ResultType\":2,\"ToolTip\":\"Update-PSResource\\r\\n\"},{\"CompletionText\":\"Update-PSScriptFileInfo\",\"ListItemText\":\"Update-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"Update-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"Update-Script\",\"ListItemText\":\"Update-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Script \\r\\n\"},{\"CompletionText\":\"Update-ScriptFileInfo\",\"ListItemText\":\"Update-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"Update-SmbMultichannelConnection\",\"ListItemText\":\"Update-SmbMultichannelConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-SmbMultichannelConnection \\r\\n\"},{\"CompletionText\":\"Update-StorageBusCache\",\"ListItemText\":\"Update-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Update-StorageFirmware\",\"ListItemText\":\"Update-StorageFirmware\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StorageFirmware \\r\\n\"},{\"CompletionText\":\"Update-StoragePool\",\"ListItemText\":\"Update-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StoragePool \\r\\n\"},{\"CompletionText\":\"Update-StorageProviderCache\",\"ListItemText\":\"Update-StorageProviderCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StorageProviderCache \\r\\n\"},{\"CompletionText\":\"Update-TypeData\",\"ListItemText\":\"Update-TypeData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-TypeData [[-AppendPath] ] [-PrependPath ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUpdate-TypeData -TypeName [-MemberType ] [-MemberName ] [-Value ] [-SecondValue ] [-TypeConverter ] [-TypeAdapter ] [-SerializationMethod ] [-TargetTypeForDeserialization ] [-SerializationDepth ] [-DefaultDisplayProperty ] [-InheritPropertySerializationSet ] [-StringSerializationSource ] [-DefaultDisplayPropertySet ] [-DefaultKeyPropertySet ] [-PropertySerializationSet ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUpdate-TypeData [-TypeData] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Update-VMVersion\",\"ListItemText\":\"Update-VMVersion\",\"ResultType\":2,\"ToolTip\":\"Update-VMVersion\\r\\n\"},{\"CompletionText\":\"Update-WIMBootEntry\",\"ListItemText\":\"Update-WIMBootEntry\",\"ResultType\":2,\"ToolTip\":\"Update-WIMBootEntry\\r\\n\"},{\"CompletionText\":\"upfc.exe\",\"ListItemText\":\"upfc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\upfc.exe\"},{\"CompletionText\":\"UpgradeResultsUI.exe\",\"ListItemText\":\"UpgradeResultsUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UpgradeResultsUI.exe\"},{\"CompletionText\":\"upmo\",\"ListItemText\":\"upmo\",\"ResultType\":2,\"ToolTip\":\"upmo\"},{\"CompletionText\":\"upnpcont.exe\",\"ListItemText\":\"upnpcont.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\upnpcont.exe\"},{\"CompletionText\":\"UPPrinterInstaller.exe\",\"ListItemText\":\"UPPrinterInstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UPPrinterInstaller.exe\"},{\"CompletionText\":\"Use-AzHDInsightCluster\",\"ListItemText\":\"Use-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"Use-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"Use-AzSqlDatabaseServerAuditingPolicy\",\"ListItemText\":\"Use-AzSqlDatabaseServerAuditingPolicy\",\"ResultType\":2,\"ToolTip\":\"Use-AzSqlDatabaseServerAuditingPolicy\"},{\"CompletionText\":\"Use-WindowsUnattend\",\"ListItemText\":\"Use-WindowsUnattend\",\"ResultType\":2,\"ToolTip\":\"Use-WindowsUnattend\\r\\n\"},{\"CompletionText\":\"UserAccountBroker.exe\",\"ListItemText\":\"UserAccountBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UserAccountBroker.exe\"},{\"CompletionText\":\"UserAccountControlSettings.exe\",\"ListItemText\":\"UserAccountControlSettings.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UserAccountControlSettings.exe\"},{\"CompletionText\":\"UserDataSource.exe\",\"ListItemText\":\"UserDataSource.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UserDataSource.exe\"},{\"CompletionText\":\"userinit.exe\",\"ListItemText\":\"userinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\userinit.exe\"},{\"CompletionText\":\"UsoClient.exe\",\"ListItemText\":\"UsoClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UsoClient.exe\"},{\"CompletionText\":\"UtcDecoderHost.exe\",\"ListItemText\":\"UtcDecoderHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UtcDecoderHost.exe\"},{\"CompletionText\":\"Utilman.exe\",\"ListItemText\":\"Utilman.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Utilman.exe\"},{\"CompletionText\":\"V:\",\"ListItemText\":\"V:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nV: \\r\\n\"},{\"CompletionText\":\"Validate-AzDataShare\",\"ListItemText\":\"Validate-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Validate-AzDataShare\"},{\"CompletionText\":\"VaultCmd.exe\",\"ListItemText\":\"VaultCmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VaultCmd.exe\"},{\"CompletionText\":\"vds.exe\",\"ListItemText\":\"vds.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vds.exe\"},{\"CompletionText\":\"vdsldr.exe\",\"ListItemText\":\"vdsldr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vdsldr.exe\"},{\"CompletionText\":\"verclsid.exe\",\"ListItemText\":\"verclsid.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\verclsid.exe\"},{\"CompletionText\":\"verifier.exe\",\"ListItemText\":\"verifier.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\verifier.exe\"},{\"CompletionText\":\"verifiergui.exe\",\"ListItemText\":\"verifiergui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\verifiergui.exe\"},{\"CompletionText\":\"vfpctrl.exe\",\"ListItemText\":\"vfpctrl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vfpctrl.exe\"},{\"CompletionText\":\"virtmgmt.msc\",\"ListItemText\":\"virtmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\virtmgmt.msc\"},{\"CompletionText\":\"vmcompute.exe\",\"ListItemText\":\"vmcompute.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmcompute.exe\"},{\"CompletionText\":\"vmconnect.exe\",\"ListItemText\":\"vmconnect.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmconnect.exe\"},{\"CompletionText\":\"vmms.exe\",\"ListItemText\":\"vmms.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmms.exe\"},{\"CompletionText\":\"vmplatformca.exe\",\"ListItemText\":\"vmplatformca.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmplatformca.exe\"},{\"CompletionText\":\"vmsp.exe\",\"ListItemText\":\"vmsp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmsp.exe\"},{\"CompletionText\":\"vmwp.exe\",\"ListItemText\":\"vmwp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmwp.exe\"},{\"CompletionText\":\"VoiceAccess.exe\",\"ListItemText\":\"VoiceAccess.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VoiceAccess.exe\"},{\"CompletionText\":\"vsce.cmd\",\"ListItemText\":\"vsce.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\vsce.cmd\"},{\"CompletionText\":\"vsce.ps1\",\"ListItemText\":\"vsce.ps1\",\"ResultType\":2,\"ToolTip\":\"vsce.ps1 \\r\\n\"},{\"CompletionText\":\"vscode-bisect.cmd\",\"ListItemText\":\"vscode-bisect.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\vscode-bisect.cmd\"},{\"CompletionText\":\"vscode-bisect.ps1\",\"ListItemText\":\"vscode-bisect.ps1\",\"ResultType\":2,\"ToolTip\":\"vscode-bisect.ps1 \\r\\n\"},{\"CompletionText\":\"VsGraphicsDesktopEngine.exe\",\"ListItemText\":\"VsGraphicsDesktopEngine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VsGraphicsDesktopEngine.exe\"},{\"CompletionText\":\"VsGraphicsRemoteEngine.exe\",\"ListItemText\":\"VsGraphicsRemoteEngine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VsGraphicsRemoteEngine.exe\"},{\"CompletionText\":\"vssadmin.exe\",\"ListItemText\":\"vssadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vssadmin.exe\"},{\"CompletionText\":\"VSSVC.exe\",\"ListItemText\":\"VSSVC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VSSVC.exe\"},{\"CompletionText\":\"vulkaninfo-1-999-0-0-0.exe\",\"ListItemText\":\"vulkaninfo-1-999-0-0-0.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vulkaninfo-1-999-0-0-0.exe\"},{\"CompletionText\":\"vulkaninfo.exe\",\"ListItemText\":\"vulkaninfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vulkaninfo.exe\"},{\"CompletionText\":\"w32tm.exe\",\"ListItemText\":\"w32tm.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\w32tm.exe\"},{\"CompletionText\":\"W:\",\"ListItemText\":\"W:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nW: \\r\\n\"},{\"CompletionText\":\"Wait-AdlJob\",\"ListItemText\":\"Wait-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AdlJob\"},{\"CompletionText\":\"Wait-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Wait-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Wait-AzHDInsightJob\",\"ListItemText\":\"Wait-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Wait-AzRecoveryServicesBackupJob\",\"ListItemText\":\"Wait-AzRecoveryServicesBackupJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzRecoveryServicesBackupJob\\r\\n\"},{\"CompletionText\":\"Wait-AzSynapseSparkJob\",\"ListItemText\":\"Wait-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"Wait-Debugger\",\"ListItemText\":\"Wait-Debugger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Debugger []\\r\\n\"},{\"CompletionText\":\"Wait-Event\",\"ListItemText\":\"Wait-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Event [[-SourceIdentifier] ] [-Timeout ] []\\r\\n\"},{\"CompletionText\":\"Wait-Job\",\"ListItemText\":\"Wait-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Job [-Id] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-Job] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-Name] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-InstanceId] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-State] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-Filter] [-Any] [-Timeout ] [-Force] []\\r\\n\"},{\"CompletionText\":\"Wait-Process\",\"ListItemText\":\"Wait-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Process [-Name] [[-Timeout] ] [-Any] [-PassThru] []\\r\\n\\r\\nWait-Process [-Id] [[-Timeout] ] [-Any] [-PassThru] []\\r\\n\\r\\nWait-Process [[-Timeout] ] -InputObject [-Any] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Wait-VM\",\"ListItemText\":\"Wait-VM\",\"ResultType\":2,\"ToolTip\":\"Wait-VM\\r\\n\"},{\"CompletionText\":\"waitfor.exe\",\"ListItemText\":\"waitfor.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\waitfor.exe\"},{\"CompletionText\":\"WallpaperHost.exe\",\"ListItemText\":\"WallpaperHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WallpaperHost.exe\"},{\"CompletionText\":\"wbadmin.exe\",\"ListItemText\":\"wbadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wbadmin.exe\"},{\"CompletionText\":\"wbemtest.exe\",\"ListItemText\":\"wbemtest.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\wbemtest.exe\"},{\"CompletionText\":\"wbengine.exe\",\"ListItemText\":\"wbengine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wbengine.exe\"},{\"CompletionText\":\"WdfPerfEnhancedVerifier.cmd\",\"ListItemText\":\"WdfPerfEnhancedVerifier.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\WdfPerfEnhancedVerifier.cmd\"},{\"CompletionText\":\"wecutil.exe\",\"ListItemText\":\"wecutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wecutil.exe\"},{\"CompletionText\":\"WerFault.exe\",\"ListItemText\":\"WerFault.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WerFault.exe\"},{\"CompletionText\":\"WerFaultSecure.exe\",\"ListItemText\":\"WerFaultSecure.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WerFaultSecure.exe\"},{\"CompletionText\":\"wermgr.exe\",\"ListItemText\":\"wermgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wermgr.exe\"},{\"CompletionText\":\"wevtutil.exe\",\"ListItemText\":\"wevtutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wevtutil.exe\"},{\"CompletionText\":\"wextract.exe\",\"ListItemText\":\"wextract.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wextract.exe\"},{\"CompletionText\":\"WF.msc\",\"ListItemText\":\"WF.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WF.msc\"},{\"CompletionText\":\"WFS.exe\",\"ListItemText\":\"WFS.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WFS.exe\"},{\"CompletionText\":\"where\",\"ListItemText\":\"where\",\"ResultType\":2,\"ToolTip\":\"Where-Object\"},{\"CompletionText\":\"Where-Object\",\"ListItemText\":\"Where-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWhere-Object [-Property] [[-Value] ] [-InputObject ] [-EQ] []\\r\\n\\r\\nWhere-Object [-FilterScript] [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CEQ [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -GT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CGT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -LT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CLT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -GE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CGE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -LE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CLE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Like [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CLike [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotLike [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotLike [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Match [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CMatch [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotMatch [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotMatch [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Contains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CContains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotContains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotContains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -In [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CIn [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotIn [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotIn [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Is [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -IsNot [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] -Not [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"where.exe\",\"ListItemText\":\"where.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\where.exe\"},{\"CompletionText\":\"whoami.exe\",\"ListItemText\":\"whoami.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\whoami.exe\"},{\"CompletionText\":\"wiaacmgr.exe\",\"ListItemText\":\"wiaacmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wiaacmgr.exe\"},{\"CompletionText\":\"wiawow64.exe\",\"ListItemText\":\"wiawow64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wiawow64.exe\"},{\"CompletionText\":\"wifitask.exe\",\"ListItemText\":\"wifitask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wifitask.exe\"},{\"CompletionText\":\"wimserv.exe\",\"ListItemText\":\"wimserv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wimserv.exe\"},{\"CompletionText\":\"WinBioDataModelOOBE.exe\",\"ListItemText\":\"WinBioDataModelOOBE.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WinBioDataModelOOBE.exe\"},{\"CompletionText\":\"Windows.Media.BackgroundPlayback.exe\",\"ListItemText\":\"Windows.Media.BackgroundPlayback.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Windows.Media.BackgroundPlayback.exe\"},{\"CompletionText\":\"Windows.WARP.JITService.exe\",\"ListItemText\":\"Windows.WARP.JITService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Windows.WARP.JITService.exe\"},{\"CompletionText\":\"WindowsActionDialog.exe\",\"ListItemText\":\"WindowsActionDialog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WindowsActionDialog.exe\"},{\"CompletionText\":\"WindowsPackageManagerServer.exe\",\"ListItemText\":\"WindowsPackageManagerServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\WindowsPackageManagerServer.exe\"},{\"CompletionText\":\"WindowsUpdateElevatedInstaller.exe\",\"ListItemText\":\"WindowsUpdateElevatedInstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WindowsUpdateElevatedInstaller.exe\"},{\"CompletionText\":\"winget.exe\",\"ListItemText\":\"winget.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\winget.exe\"},{\"CompletionText\":\"winhlp32.exe\",\"ListItemText\":\"winhlp32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\winhlp32.exe\"},{\"CompletionText\":\"wininit.exe\",\"ListItemText\":\"wininit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wininit.exe\"},{\"CompletionText\":\"winload.exe\",\"ListItemText\":\"winload.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winload.exe\"},{\"CompletionText\":\"winlogon.exe\",\"ListItemText\":\"winlogon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winlogon.exe\"},{\"CompletionText\":\"WinMgmt.exe\",\"ListItemText\":\"WinMgmt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WinMgmt.exe\"},{\"CompletionText\":\"winresume.exe\",\"ListItemText\":\"winresume.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winresume.exe\"},{\"CompletionText\":\"winrm.cmd\",\"ListItemText\":\"winrm.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrm.cmd\"},{\"CompletionText\":\"winrm.vbs\",\"ListItemText\":\"winrm.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrm.vbs\"},{\"CompletionText\":\"winrs.exe\",\"ListItemText\":\"winrs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrs.exe\"},{\"CompletionText\":\"winrshost.exe\",\"ListItemText\":\"winrshost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrshost.exe\"},{\"CompletionText\":\"WinRTNetMUAHostServer.exe\",\"ListItemText\":\"WinRTNetMUAHostServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WinRTNetMUAHostServer.exe\"},{\"CompletionText\":\"WinSAT.exe\",\"ListItemText\":\"WinSAT.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WinSAT.exe\"},{\"CompletionText\":\"winver.exe\",\"ListItemText\":\"winver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winver.exe\"},{\"CompletionText\":\"wjb\",\"ListItemText\":\"wjb\",\"ResultType\":2,\"ToolTip\":\"Wait-Job\"},{\"CompletionText\":\"wkspbroker.exe\",\"ListItemText\":\"wkspbroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wkspbroker.exe\"},{\"CompletionText\":\"wksprt.exe\",\"ListItemText\":\"wksprt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wksprt.exe\"},{\"CompletionText\":\"wlanext.exe\",\"ListItemText\":\"wlanext.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wlanext.exe\"},{\"CompletionText\":\"wlrmdr.exe\",\"ListItemText\":\"wlrmdr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wlrmdr.exe\"},{\"CompletionText\":\"WMIADAP.exe\",\"ListItemText\":\"WMIADAP.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WMIADAP.exe\"},{\"CompletionText\":\"WmiApSrv.exe\",\"ListItemText\":\"WmiApSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WmiApSrv.exe\"},{\"CompletionText\":\"WMIC.exe\",\"ListItemText\":\"WMIC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WMIC.exe\"},{\"CompletionText\":\"WmiMgmt.msc\",\"ListItemText\":\"WmiMgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WmiMgmt.msc\"},{\"CompletionText\":\"WmiPrvSE.exe\",\"ListItemText\":\"WmiPrvSE.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WmiPrvSE.exe\"},{\"CompletionText\":\"WMPDMC.exe\",\"ListItemText\":\"WMPDMC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WMPDMC.exe\"},{\"CompletionText\":\"WorkFolders.exe\",\"ListItemText\":\"WorkFolders.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WorkFolders.exe\"},{\"CompletionText\":\"wowreg32.exe\",\"ListItemText\":\"wowreg32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wowreg32.exe\"},{\"CompletionText\":\"wpa.exe\",\"ListItemText\":\"wpa.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpa.exe\"},{\"CompletionText\":\"wpaexporter.exe\",\"ListItemText\":\"wpaexporter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpaexporter.exe\"},{\"CompletionText\":\"wpbbin.exe\",\"ListItemText\":\"wpbbin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wpbbin.exe\"},{\"CompletionText\":\"WpcMon.exe\",\"ListItemText\":\"WpcMon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WpcMon.exe\"},{\"CompletionText\":\"WpcTok.exe\",\"ListItemText\":\"WpcTok.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WpcTok.exe\"},{\"CompletionText\":\"WPDShextAutoplay.exe\",\"ListItemText\":\"WPDShextAutoplay.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WPDShextAutoplay.exe\"},{\"CompletionText\":\"wpnpinst.exe\",\"ListItemText\":\"wpnpinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wpnpinst.exe\"},{\"CompletionText\":\"wpr.exe\",\"ListItemText\":\"wpr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wpr.exe\"},{\"CompletionText\":\"WPRUI.exe\",\"ListItemText\":\"WPRUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\WPRUI.exe\"},{\"CompletionText\":\"write\",\"ListItemText\":\"write\",\"ResultType\":2,\"ToolTip\":\"Write-Output\"},{\"CompletionText\":\"Write-Debug\",\"ListItemText\":\"Write-Debug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Debug [-Message] []\\r\\n\"},{\"CompletionText\":\"Write-DtcTransactionsTraceSession\",\"ListItemText\":\"Write-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Write-Error\",\"ListItemText\":\"Write-Error\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Error [-Message] [-Category ] [-ErrorId ] [-TargetObject ] [-RecommendedAction ] [-CategoryActivity ] [-CategoryReason ] [-CategoryTargetName ] [-CategoryTargetType ] []\\r\\n\\r\\nWrite-Error [-Exception] [-Message ] [-Category ] [-ErrorId ] [-TargetObject ] [-RecommendedAction ] [-CategoryActivity ] [-CategoryReason ] [-CategoryTargetName ] [-CategoryTargetType ] []\\r\\n\\r\\nWrite-Error [-ErrorRecord] [-RecommendedAction ] [-CategoryActivity ] [-CategoryReason ] [-CategoryTargetName ] [-CategoryTargetType ] []\\r\\n\"},{\"CompletionText\":\"Write-FileSystemCache\",\"ListItemText\":\"Write-FileSystemCache\",\"ResultType\":2,\"ToolTip\":\"Write-FileSystemCache\"},{\"CompletionText\":\"Write-GitBranchName\",\"ListItemText\":\"Write-GitBranchName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitBranchName \\r\\n\"},{\"CompletionText\":\"Write-GitBranchStatus\",\"ListItemText\":\"Write-GitBranchStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitBranchStatus \\r\\n\"},{\"CompletionText\":\"Write-GitIndexStatus\",\"ListItemText\":\"Write-GitIndexStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitIndexStatus \\r\\n\"},{\"CompletionText\":\"Write-GitStashCount\",\"ListItemText\":\"Write-GitStashCount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitStashCount \\r\\n\"},{\"CompletionText\":\"Write-GitStatus\",\"ListItemText\":\"Write-GitStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitStatus \\r\\n\"},{\"CompletionText\":\"Write-GitWorkingDirStatus\",\"ListItemText\":\"Write-GitWorkingDirStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitWorkingDirStatus \\r\\n\"},{\"CompletionText\":\"Write-GitWorkingDirStatusSummary\",\"ListItemText\":\"Write-GitWorkingDirStatusSummary\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitWorkingDirStatusSummary \\r\\n\"},{\"CompletionText\":\"Write-Host\",\"ListItemText\":\"Write-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Host [[-Object] ] [-NoNewline] [-Separator ] [-ForegroundColor ] [-BackgroundColor ] []\\r\\n\"},{\"CompletionText\":\"Write-Information\",\"ListItemText\":\"Write-Information\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Information [-MessageData] [[-Tags] ] []\\r\\n\"},{\"CompletionText\":\"Write-Output\",\"ListItemText\":\"Write-Output\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Output [-InputObject] [-NoEnumerate] []\\r\\n\"},{\"CompletionText\":\"Write-PrinterNfcTag\",\"ListItemText\":\"Write-PrinterNfcTag\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-PrinterNfcTag \\r\\n\"},{\"CompletionText\":\"Write-Progress\",\"ListItemText\":\"Write-Progress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Progress [[-Activity] ] [[-Status] ] [[-Id] ] [-PercentComplete ] [-SecondsRemaining ] [-CurrentOperation ] [-ParentId ] [-Completed] [-SourceId ] []\\r\\n\"},{\"CompletionText\":\"Write-Prompt\",\"ListItemText\":\"Write-Prompt\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Prompt \\r\\n\"},{\"CompletionText\":\"Write-VcsStatus\",\"ListItemText\":\"Write-VcsStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-VcsStatus \\r\\n\"},{\"CompletionText\":\"Write-Verbose\",\"ListItemText\":\"Write-Verbose\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Verbose [-Message] []\\r\\n\"},{\"CompletionText\":\"Write-VolumeCache\",\"ListItemText\":\"Write-VolumeCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-VolumeCache \\r\\n\"},{\"CompletionText\":\"Write-Warning\",\"ListItemText\":\"Write-Warning\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Warning [-Message] []\\r\\n\"},{\"CompletionText\":\"write.exe\",\"ListItemText\":\"write.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\write.exe\"},{\"CompletionText\":\"wscadminui.exe\",\"ListItemText\":\"wscadminui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wscadminui.exe\"},{\"CompletionText\":\"WSCollect.exe\",\"ListItemText\":\"WSCollect.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WSCollect.exe\"},{\"CompletionText\":\"wscript.exe\",\"ListItemText\":\"wscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wscript.exe\"},{\"CompletionText\":\"wscui.cpl\",\"ListItemText\":\"wscui.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wscui.cpl\"},{\"CompletionText\":\"wsgen.exe\",\"ListItemText\":\"wsgen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\wsgen.exe\"},{\"CompletionText\":\"wsimport.exe\",\"ListItemText\":\"wsimport.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\wsimport.exe\"},{\"CompletionText\":\"wsl.exe\",\"ListItemText\":\"wsl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wsl.exe\"},{\"CompletionText\":\"wslconfig.exe\",\"ListItemText\":\"wslconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wslconfig.exe\"},{\"CompletionText\":\"wslg.exe\",\"ListItemText\":\"wslg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wslg.exe\"},{\"CompletionText\":\"WSManHTTPConfig.exe\",\"ListItemText\":\"WSManHTTPConfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WSManHTTPConfig.exe\"},{\"CompletionText\":\"wsmprovhost.exe\",\"ListItemText\":\"wsmprovhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wsmprovhost.exe\"},{\"CompletionText\":\"wsqmcons.exe\",\"ListItemText\":\"wsqmcons.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wsqmcons.exe\"},{\"CompletionText\":\"WSReset.exe\",\"ListItemText\":\"WSReset.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WSReset.exe\"},{\"CompletionText\":\"wt.exe\",\"ListItemText\":\"wt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wt.exe\"},{\"CompletionText\":\"wuapihost.exe\",\"ListItemText\":\"wuapihost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wuapihost.exe\"},{\"CompletionText\":\"wuauclt.exe\",\"ListItemText\":\"wuauclt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wuauclt.exe\"},{\"CompletionText\":\"WUDFCompanionHost.exe\",\"ListItemText\":\"WUDFCompanionHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WUDFCompanionHost.exe\"},{\"CompletionText\":\"WUDFHost.exe\",\"ListItemText\":\"WUDFHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WUDFHost.exe\"},{\"CompletionText\":\"wusa.exe\",\"ListItemText\":\"wusa.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wusa.exe\"},{\"CompletionText\":\"WWAHost.exe\",\"ListItemText\":\"WWAHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WWAHost.exe\"},{\"CompletionText\":\"X:\",\"ListItemText\":\"X:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nX: \\r\\n\"},{\"CompletionText\":\"XblGameSaveTask.exe\",\"ListItemText\":\"XblGameSaveTask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\XblGameSaveTask.exe\"},{\"CompletionText\":\"xbootmgr.exe\",\"ListItemText\":\"xbootmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\xbootmgr.exe\"},{\"CompletionText\":\"xbootmgrsleep.exe\",\"ListItemText\":\"xbootmgrsleep.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\xbootmgrsleep.exe\"},{\"CompletionText\":\"xcopy.exe\",\"ListItemText\":\"xcopy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\xcopy.exe\"},{\"CompletionText\":\"xjc.exe\",\"ListItemText\":\"xjc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\xjc.exe\"},{\"CompletionText\":\"xperf.exe\",\"ListItemText\":\"xperf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\xperf.exe\"},{\"CompletionText\":\"xwizard.exe\",\"ListItemText\":\"xwizard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\xwizard.exe\"},{\"CompletionText\":\"Y:\",\"ListItemText\":\"Y:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nY: \\r\\n\"},{\"CompletionText\":\"yarn.cmd\",\"ListItemText\":\"yarn.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yarn.cmd\"},{\"CompletionText\":\"yarn.ps1\",\"ListItemText\":\"yarn.ps1\",\"ResultType\":2,\"ToolTip\":\"yarn.ps1 \\r\\n\"},{\"CompletionText\":\"yarnpkg.cmd\",\"ListItemText\":\"yarnpkg.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yarnpkg.cmd\"},{\"CompletionText\":\"yarnpkg.ps1\",\"ListItemText\":\"yarnpkg.ps1\",\"ResultType\":2,\"ToolTip\":\"yarnpkg.ps1 \\r\\n\"},{\"CompletionText\":\"yo-complete.cmd\",\"ListItemText\":\"yo-complete.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yo-complete.cmd\"},{\"CompletionText\":\"yo-complete.ps1\",\"ListItemText\":\"yo-complete.ps1\",\"ResultType\":2,\"ToolTip\":\"yo-complete.ps1 \\r\\n\"},{\"CompletionText\":\"yo.cmd\",\"ListItemText\":\"yo.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yo.cmd\"},{\"CompletionText\":\"yo.ps1\",\"ListItemText\":\"yo.ps1\",\"ResultType\":2,\"ToolTip\":\"yo.ps1 \\r\\n\"},{\"CompletionText\":\"Z:\",\"ListItemText\":\"Z:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nZ: \\r\\n\"},{\"CompletionText\":\"__VSCode-Escape-Value\",\"ListItemText\":\"__VSCode-Escape-Value\",\"ResultType\":2,\"ToolTip\":\"\\r\\n__VSCode-Escape-Value [[-value] ]\\r\\n\"},{\"CompletionText\":\"Defender\\\\Add-MpPreference\",\"ListItemText\":\"Add-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-MpPreference \\r\\n\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\bash.exe\",\"ListItemText\":\"bash.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\bash.exe\"},{\"CompletionText\":\"Az.Sql\\\\Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"'C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code-tunnel.exe'\",\"ListItemText\":\"code-tunnel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code-tunnel.exe\"},{\"CompletionText\":\"'C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code.cmd'\",\"ListItemText\":\"code.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code.cmd\"},{\"CompletionText\":\"Microsoft.PowerShell.Archive\\\\Compress-Archive\",\"ListItemText\":\"Compress-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCompress-Archive \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Disable-PhysicalDiskIndication\",\"ListItemText\":\"Disable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Disable-PhysicalDiskIndication\"},{\"CompletionText\":\"PSDiagnostics\\\\Disable-PSTrace\",\"ListItemText\":\"Disable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSTrace \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Disable-PSWSManCombinedTrace\",\"ListItemText\":\"Disable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Disable-StorageDiagnosticLog\",\"ListItemText\":\"Disable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Disable-StorageDiagnosticLog\"},{\"CompletionText\":\"PSDiagnostics\\\\Disable-WSManTrace\",\"ListItemText\":\"Disable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-WSManTrace \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Enable-PhysicalDiskIndication\",\"ListItemText\":\"Enable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Enable-PhysicalDiskIndication\"},{\"CompletionText\":\"PSDiagnostics\\\\Enable-PSTrace\",\"ListItemText\":\"Enable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSTrace \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Enable-PSWSManCombinedTrace\",\"ListItemText\":\"Enable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Enable-StorageDiagnosticLog\",\"ListItemText\":\"Enable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Enable-StorageDiagnosticLog\"},{\"CompletionText\":\"PSDiagnostics\\\\Enable-WSManTrace\",\"ListItemText\":\"Enable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-WSManTrace \\r\\n\"},{\"CompletionText\":\"Microsoft.PowerShell.Archive\\\\Expand-Archive\",\"ListItemText\":\"Expand-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-Archive \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Export-VMCheckpoint\",\"ListItemText\":\"Export-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Export-VMCheckpoint\"},{\"CompletionText\":\"PowerShellGet\\\\fimo\",\"ListItemText\":\"fimo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\fimo\"},{\"CompletionText\":\"PowerShellGet\\\\Find-Command\",\"ListItemText\":\"Find-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Command \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-DscResource\",\"ListItemText\":\"Find-DscResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-DscResource \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-Module\",\"ListItemText\":\"Find-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-RoleCapability\",\"ListItemText\":\"Find-RoleCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-RoleCapability \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-Script\",\"ListItemText\":\"Find-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Script \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Flush-Volume\",\"ListItemText\":\"Flush-Volume\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Flush-Volume\"},{\"CompletionText\":\"CimCmdlets\\\\gcai\",\"ListItemText\":\"gcai\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcai\"},{\"CompletionText\":\"CimCmdlets\\\\gcim\",\"ListItemText\":\"gcim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcim\"},{\"CompletionText\":\"CimCmdlets\\\\gcls\",\"ListItemText\":\"gcls\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcls\"},{\"CompletionText\":\"CimCmdlets\\\\gcms\",\"ListItemText\":\"gcms\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcms\"},{\"CompletionText\":\"Az.Sql\\\\Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-DiskSNV\",\"ListItemText\":\"Get-DiskSNV\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-DiskSNV\"},{\"CompletionText\":\"PowerShellGet\\\\Get-InstalledModule\",\"ListItemText\":\"Get-InstalledModule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledModule \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Get-InstalledScript\",\"ListItemText\":\"Get-InstalledScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledScript \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Get-LogProperties\",\"ListItemText\":\"Get-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LogProperties \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpComputerStatus\",\"ListItemText\":\"Get-MpComputerStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpComputerStatus \\r\\n\"},{\"CompletionText\":\"DefenderPerformance\\\\Get-MpPerformanceReport\",\"ListItemText\":\"Get-MpPerformanceReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPerformanceReport \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpPreference\",\"ListItemText\":\"Get-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPreference \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpThreat\",\"ListItemText\":\"Get-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreat \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpThreatCatalog\",\"ListItemText\":\"Get-MpThreatCatalog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatCatalog \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpThreatDetection\",\"ListItemText\":\"Get-MpThreatDetection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatDetection \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-PhysicalDiskSNV\",\"ListItemText\":\"Get-PhysicalDiskSNV\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-PhysicalDiskSNV\"},{\"CompletionText\":\"PowerShellGet\\\\Get-PSRepository\",\"ListItemText\":\"Get-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSRepository \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-StorageEnclosureSNV\",\"ListItemText\":\"Get-StorageEnclosureSNV\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-StorageEnclosureSNV\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-VMCheckpoint\",\"ListItemText\":\"Get-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-VMCheckpoint\"},{\"CompletionText\":\"'C:\\\\Program Files\\\\Git\\\\cmd\\\\git-lfs.exe'\",\"ListItemText\":\"git-lfs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-lfs.exe\"},{\"CompletionText\":\"Hyper-V\\\\gvm\",\"ListItemText\":\"gvm\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\gvm\"},{\"CompletionText\":\"VMDirectStorage\\\\gvm\",\"ListItemText\":\"gvm\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\gvm\"},{\"CompletionText\":\"Hyper-V\\\\gvmr\",\"ListItemText\":\"gvmr\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\gvmr\"},{\"CompletionText\":\"VMDirectStorage\\\\gvmr\",\"ListItemText\":\"gvmr\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\gvmr\"},{\"CompletionText\":\"Hyper-V\\\\gvmrs\",\"ListItemText\":\"gvmrs\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\gvmrs\"},{\"CompletionText\":\"VMDirectStorage\\\\gvmrs\",\"ListItemText\":\"gvmrs\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\gvmrs\"},{\"CompletionText\":\"CimCmdlets\\\\icim\",\"ListItemText\":\"icim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\icim\"},{\"CompletionText\":\"VMDirectStorage\\\\Initialize-Volume\",\"ListItemText\":\"Initialize-Volum" + }, + { + "type": "output", + "data": "e\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Initialize-Volume\"},{\"CompletionText\":\"PowerShellGet\\\\inmo\",\"ListItemText\":\"inmo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\inmo\"},{\"CompletionText\":\"PowerShellGet\\\\Install-Module\",\"ListItemText\":\"Install-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Install-Script\",\"ListItemText\":\"Install-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Script \\r\\n\"},{\"CompletionText\":\"C:\\\\WINDOWS\\\\system32\\\\klist.exe\",\"ListItemText\":\"klist.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\klist.exe\"},{\"CompletionText\":\"Hyper-V\\\\mvmr\",\"ListItemText\":\"mvmr\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\mvmr\"},{\"CompletionText\":\"VMDirectStorage\\\\mvmr\",\"ListItemText\":\"mvmr\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\mvmr\"},{\"CompletionText\":\"CimCmdlets\\\\ncim\",\"ListItemText\":\"ncim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\ncim\"},{\"CompletionText\":\"CimCmdlets\\\\ncms\",\"ListItemText\":\"ncms\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\ncms\"},{\"CompletionText\":\"CimCmdlets\\\\ncso\",\"ListItemText\":\"ncso\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\ncso\"},{\"CompletionText\":\"DefenderPerformance\\\\New-MpPerformanceRecording\",\"ListItemText\":\"New-MpPerformanceRecording\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-MpPerformanceRecording \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\New-ScriptFileInfo\",\"ListItemText\":\"New-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"C:\\\\WINDOWS\\\\system32\\\\notepad.exe\",\"ListItemText\":\"notepad.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\notepad.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\notepad.exe\",\"ListItemText\":\"notepad.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\notepad.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip.exe\",\"ListItemText\":\"pip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip.exe\",\"ListItemText\":\"pip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip3.exe\",\"ListItemText\":\"pip3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip3.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip3.exe\",\"ListItemText\":\"pip3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip3.exe\"},{\"CompletionText\":\"PSReadLine\\\\PSConsoleHostReadLine\",\"ListItemText\":\"PSConsoleHostReadLine\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPSConsoleHostReadLine \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Publish-Module\",\"ListItemText\":\"Publish-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Publish-Script\",\"ListItemText\":\"Publish-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Script \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\pumo\",\"ListItemText\":\"pumo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\pumo\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh.exe\",\"ListItemText\":\"pwsh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\python.exe\",\"ListItemText\":\"python.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\python.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python.exe\",\"ListItemText\":\"python.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\pythonw.exe\",\"ListItemText\":\"pythonw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\pythonw.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw.exe\",\"ListItemText\":\"pythonw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw.exe\"},{\"CompletionText\":\"CimCmdlets\\\\rcie\",\"ListItemText\":\"rcie\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\rcie\"},{\"CompletionText\":\"CimCmdlets\\\\rcim\",\"ListItemText\":\"rcim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\rcim\"},{\"CompletionText\":\"CimCmdlets\\\\rcms\",\"ListItemText\":\"rcms\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\rcms\"},{\"CompletionText\":\"PowerShellGet\\\\Register-PSRepository\",\"ListItemText\":\"Register-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-PSRepository \\r\\n\"},{\"CompletionText\":\"Defender\\\\Remove-MpPreference\",\"ListItemText\":\"Remove-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpPreference \\r\\n\"},{\"CompletionText\":\"Defender\\\\Remove-MpThreat\",\"ListItemText\":\"Remove-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpThreat \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Remove-VMCheckpoint\",\"ListItemText\":\"Remove-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Remove-VMCheckpoint\"},{\"CompletionText\":\"VMDirectStorage\\\\Rename-VMCheckpoint\",\"ListItemText\":\"Rename-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Rename-VMCheckpoint\"},{\"CompletionText\":\"VMDirectStorage\\\\Restore-VMCheckpoint\",\"ListItemText\":\"Restore-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Restore-VMCheckpoint\"},{\"CompletionText\":\"PowerShellGet\\\\Save-Module\",\"ListItemText\":\"Save-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Save-Script\",\"ListItemText\":\"Save-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Script \\r\\n\"},{\"CompletionText\":\"Hyper-V\\\\savm\",\"ListItemText\":\"savm\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\savm\"},{\"CompletionText\":\"VMDirectStorage\\\\savm\",\"ListItemText\":\"savm\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\savm\"},{\"CompletionText\":\"CimCmdlets\\\\scim\",\"ListItemText\":\"scim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\scim\"},{\"CompletionText\":\"PSDiagnostics\\\\Set-LogProperties\",\"ListItemText\":\"Set-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-LogProperties \\r\\n\"},{\"CompletionText\":\"Defender\\\\Set-MpPreference\",\"ListItemText\":\"Set-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MpPreference \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Set-PSRepository\",\"ListItemText\":\"Set-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSRepository \\r\\n\"},{\"CompletionText\":\"Hyper-V\\\\spvm\",\"ListItemText\":\"spvm\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\spvm\"},{\"CompletionText\":\"VMDirectStorage\\\\spvm\",\"ListItemText\":\"spvm\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\spvm\"},{\"CompletionText\":\"Defender\\\\Start-MpRollback\",\"ListItemText\":\"Start-MpRollback\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpRollback \\r\\n\"},{\"CompletionText\":\"Defender\\\\Start-MpScan\",\"ListItemText\":\"Start-MpScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpScan \\r\\n\"},{\"CompletionText\":\"Defender\\\\Start-MpWDOScan\",\"ListItemText\":\"Start-MpWDOScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpWDOScan \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Start-Trace\",\"ListItemText\":\"Start-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Trace \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Stop-Trace\",\"ListItemText\":\"Stop-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Trace \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Test-ScriptFileInfo\",\"ListItemText\":\"Test-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Uninstall-Module\",\"ListItemText\":\"Uninstall-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Uninstall-Script\",\"ListItemText\":\"Uninstall-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Script \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Unregister-PSRepository\",\"ListItemText\":\"Unregister-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-PSRepository \\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"PSDesiredStateConfiguration\\\\Update-DscConfiguration\",\"ListItemText\":\"Update-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-DscConfiguration\\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-Module\",\"ListItemText\":\"Update-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-ModuleManifest\",\"ListItemText\":\"Update-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ModuleManifest \\r\\n\"},{\"CompletionText\":\"Defender\\\\Update-MpSignature\",\"ListItemText\":\"Update-MpSignature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-MpSignature \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-Script\",\"ListItemText\":\"Update-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Script \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-ScriptFileInfo\",\"ListItemText\":\"Update-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\upmo\",\"ListItemText\":\"upmo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\upmo\"},{\"CompletionText\":\"'C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpr.exe'\",\"ListItemText\":\"wpr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpr.exe\"},{\"CompletionText\":\"VMDirectStorage\\\\Write-FileSystemCache\",\"ListItemText\":\"Write-FileSystemCache\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Write-FileSystemCache\"},{\"CompletionText\":\"C:\\\\WINDOWS\\\\system32\\\\write.exe\",\"ListItemText\":\"write.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\write.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wsl.exe\",\"ListItemText\":\"wsl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wsl.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslconfig.exe\",\"ListItemText\":\"wslconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslconfig.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslg.exe\",\"ListItemText\":\"wslg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslg.exe\"}]\u0007\u001b]633;A\u0007\u001b]633;P;Cwd=C:\\x5cGithub\\x5cTyriar\\x5cxterm.js\u0007\u001b]633;B\u0007\u001b[34m\r\n\u001b[38;2;17;17;17m\u001b[44m11:25:16 \u001b[34m\u001b[41mî‚° \u001b[38;2;17;17;17mxterm.js\u001b[39m \u001b[31m\u001b[43mî‚° \u001b[38;2;17;17;17mî‚  base64 \u001b[33m\u001b[46mî‚° \u001b[38;2;17;17;17m$? \u001b[36m\u001b[49mî‚° \u001b[mis \u001b[38;5;208m\u001b[1m v5.5.0\u001b[m via \u001b[32m\u001b[1m v20.14.0 \r\nâ¯\u001b[m " + }, + { + "type": "promptInputChange", + "data": "|" + }, + { + "type": "input", + "data": "g" + }, + { + "type": "output", + "data": "\u001b[93mg\u001b[97m\u001b[2m\u001b[3mit diff\u001b[9;4H" + }, + { + "type": "promptInputChange", + "data": "g|[it diff]" + }, + { + "type": "sendText", + "data": "\u001b[24~e" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "output", + "data": "\u001b]633;Completions;;;1;{\"CompletionText\":\"$Global:\",\"ListItemText\":\"Global:\",\"ResultType\":9,\"ToolTip\":\"Global:\"}\u0007" + }, + { + "type": "input", + "data": "e" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\bge\u001b[97m\u001b[2m\u001b[3mt-Content\u001b[9;5H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "ge|[t-Cont]" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "t" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget\u001b[97m\u001b[2m\u001b[3m-Content\u001b[9;6H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get|[-Cont]" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "-" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-\u001b[97m\u001b[2m\u001b[3mContent\u001b[9;7H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get-|[Cont]" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "c" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-c\u001b[97m\u001b[2m\u001b[3montent\u001b[9;8H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get-c|[ont]" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "o" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-co\u001b[97m\u001b[2m\u001b[3mntent\u001b[9;9H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get-co|[nt]" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "n" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-con\u001b[97m\u001b[2m\u001b[3mtent\u001b[9;10H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get-con|[t]" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "t" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-cont\u001b[97m\u001b[2m\u001b[3ment\r\u001b[?25h\u001b[m" + }, + { + "type": "promptInputChange", + "data": "get-conte|nt" + }, + { + "type": "input", + "data": "e" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-conte\u001b[97m\u001b[2m\u001b[3mnt\u001b[10;2H\u001b[?25h" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "n" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-conten\u001b[97m\u001b[2m\u001b[3mt\b\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get-conten|t" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "t" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-content\u001b[97m\u001b[2m\u001b[3m -ReadCount\u001b[10;4H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "get-content| -ReadC" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "command", + "id": "workbench.action.terminal.acceptSelectedSuggestion" + }, + { + "type": "sendText", + "data": "Get-Content" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content\u001b[97m\u001b[2m\u001b[3m -ReadCount\u001b[10;4H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "Get-Content| -ReadC" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": " " + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[97m\u001b[2m\u001b[3m-ReadCount\u001b[10;5H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "Get-Content |-ReadC" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "input", + "data": "-" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[m-\u001b[97m\u001b[2m\u001b[3mReadCount\u001b[10;6H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "Get-Content -|ReadC" + }, + { + "type": "sendText", + "data": "\u001b[24~e" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "output", + "data": "\u001b]633;Completions;12;1;13;[{\"CompletionText\":\"-ReadCount\",\"ListItemText\":\"ReadCount\",\"ResultType\":7,\"ToolTip\":\"[long] ReadCount\"},{\"CompletionText\":\"-TotalCount\",\"ListItemText\":\"TotalCount\",\"ResultType\":7,\"ToolTip\":\"[long] TotalCount\"},{\"CompletionText\":\"-Tail\",\"ListItemText\":\"Tail\",\"ResultType\":7,\"ToolTip\":\"[int] Tail\"},{\"CompletionText\":\"-Path\",\"ListItemText\":\"Path\",\"ResultType\":7,\"ToolTip\":\"[string[]] Path\"},{\"CompletionText\":\"-LiteralPath\",\"ListItemText\":\"LiteralPath\",\"ResultType\":7,\"ToolTip\":\"[string[]] LiteralPath\"},{\"CompletionText\":\"-Filter\",\"ListItemText\":\"Filter\",\"ResultType\":7,\"ToolTip\":\"[string] Filter\"},{\"CompletionText\":\"-Include\",\"ListItemText\":\"Include\",\"ResultType\":7,\"ToolTip\":\"[string[]] Include\"},{\"CompletionText\":\"-Exclude\",\"ListItemText\":\"Exclude\",\"ResultType\":7,\"ToolTip\":\"[string[]] Exclude\"},{\"CompletionText\":\"-Force\",\"ListItemText\":\"Force\",\"ResultType\":7,\"ToolTip\":\"[switch] Force\"},{\"CompletionText\":\"-Credential\",\"ListItemText\":\"Credential\",\"ResultType\":7,\"ToolTip\":\"[pscredential] Credential\"},{\"CompletionText\":\"-Delimiter\",\"ListItemText\":\"Delimiter\",\"ResultType\":7,\"ToolTip\":\"[string] Delimiter\"},{\"CompletionText\":\"-Wait\",\"ListItemText\":\"Wait\",\"ResultType\":7,\"ToolTip\":\"[switch] Wait\"},{\"CompletionText\":\"-Raw\",\"ListItemText\":\"Raw\",\"ResultType\":7,\"ToolTip\":\"[switch] Raw\"},{\"CompletionText\":\"-Encoding\",\"ListItemText\":\"Encoding\",\"ResultType\":7,\"ToolTip\":\"[Encoding] Encoding\"},{\"CompletionText\":\"-AsByteStream\",\"ListItemText\":\"AsByteStream\",\"ResultType\":7,\"ToolTip\":\"[switch] AsByteStream\"},{\"CompletionText\":\"-Stream\",\"ListItemText\":\"Stream\",\"ResultType\":7,\"ToolTip\":\"[string] Stream\"},{\"CompletionText\":\"-Verbose\",\"ListItemText\":\"Verbose\",\"ResultType\":7,\"ToolTip\":\"[switch] Verbose\"},{\"CompletionText\":\"-Debug\",\"ListItemText\":\"Debug\",\"ResultType\":7,\"ToolTip\":\"[switch] Debug\"},{\"CompletionText\":\"-ErrorAction\",\"ListItemText\":\"ErrorAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] ErrorAction\"},{\"CompletionText\":\"-WarningAction\",\"ListItemText\":\"WarningAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] WarningAction\"},{\"CompletionText\":\"-InformationAction\",\"ListItemText\":\"InformationAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] InformationAction\"},{\"CompletionText\":\"-ProgressAction\",\"ListItemText\":\"ProgressAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] ProgressAction\"},{\"CompletionText\":\"-ErrorVariable\",\"ListItemText\":\"ErrorVariable\",\"ResultType\":7,\"ToolTip\":\"[string] ErrorVariable\"},{\"CompletionText\":\"-WarningVariable\",\"ListItemText\":\"WarningVariable\",\"ResultType\":7,\"ToolTip\":\"[string] WarningVariable\"},{\"CompletionText\":\"-InformationVariable\",\"ListItemText\":\"InformationVariable\",\"ResultType\":7,\"ToolTip\":\"[string] InformationVariable\"},{\"CompletionText\":\"-OutVariable\",\"ListItemText\":\"OutVariable\",\"ResultType\":7,\"ToolTip\":\"[string] OutVariable\"},{\"CompletionText\":\"-OutBuffer\",\"ListItemText\":\"OutBuffer\",\"ResultType\":7,\"ToolTip\":\"[int] OutBuffer\"},{\"CompletionText\":\"-PipelineVariable\",\"ListItemText\":\"PipelineVariable\",\"ResultType\":7,\"ToolTip\":\"[string] PipelineVariable\"}]\u0007" + }, + { + "type": "input", + "data": "r" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[90m-r\u001b[97m\u001b[2m\u001b[3meadCount\u001b[10;7H\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "Get-Content -r|eadC" + }, + { + "type": "output", + "data": "\u001b[m" + }, + { + "type": "command", + "id": "workbench.action.terminal.acceptSelectedSuggestion" + }, + { + "type": "sendText", + "data": "-ReadCount" + }, + { + "type": "output", + "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[90m-ReadCount\u001b[?25h" + }, + { + "type": "promptInputChange", + "data": "Get-Content -ReadCount|" + }, + { + "type": "output", + "data": "\u001b[m" + } +] diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts index 90c2efa5e75a0..83950c2998034 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts @@ -25,6 +25,7 @@ import { events as macos_bash_echo_simple } from 'vs/workbench/contrib/terminalC import { events as macos_bash_echo_multiline } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/macos_bash_echo_multiline'; import { events as windows11_pwsh_getcontent_delete_ghost } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_delete_ghost'; import { events as windows11_pwsh_getcontent_file } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_file'; +import { events as windows11_pwsh_getcontent_wrapped } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped'; import { events as windows11_pwsh_input_ls_complete_ls } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_input_ls_complete_ls'; import { events as windows11_pwsh_namespace_completion } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_namespace_completion'; import { events as windows11_pwsh_type_before_prompt } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_type_before_prompt'; @@ -36,6 +37,7 @@ const recordedTestCases: { name: string; events: RecordedSessionEvent[] }[] = [ { name: 'macos_bash_echo_multiline', events: macos_bash_echo_multiline as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_getcontent_delete_ghost', events: windows11_pwsh_getcontent_delete_ghost as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_getcontent_file', events: windows11_pwsh_getcontent_file as any as RecordedSessionEvent[] }, + { name: 'windows11_pwsh_getcontent_wrapped', events: windows11_pwsh_getcontent_wrapped as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_input_ls_complete_ls', events: windows11_pwsh_input_ls_complete_ls as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_namespace_completion', events: windows11_pwsh_namespace_completion as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_type_before_prompt', events: windows11_pwsh_type_before_prompt as any as RecordedSessionEvent[] }, From f399d09afa5327af98b793ad973746a04c235847 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:39:47 -0700 Subject: [PATCH 314/755] Delete recorded test --- .../windows11_pwsh_getcontent_wrapped.ts | 312 ------------------ .../terminalSuggestAddon.integrationTest.ts | 2 - 2 files changed, 314 deletions(-) delete mode 100644 src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts deleted file mode 100644 index d6a5df03dcc38..0000000000000 --- a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped.ts +++ /dev/null @@ -1,312 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -/* eslint-disable */ -export const events = [ - { - "type": "resize", - "cols": 10, - "rows": 21 - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[2J\u001b[m\u001b[H\u001b]0;C:\\Program Files\\WindowsApps\\Microsoft.PowerShell_7.4.2.0_x64__8wekyb3d8bbwe\\pwsh.exe\u0007\u001b[?25h" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\u001b[H\u001b[?25h" - }, - { - "type": "output", - "data": "\u001b]633;P;IsWindows=True\u0007" - }, - { - "type": "output", - "data": "\u001b]633;P;ContinuationPrompt=\\x1b[38\\x3b5\\x3b8m∙\\x1b[0m \u0007" - }, - { - "type": "output", - "data": "\u001b]633;CompletionsPwshCommands;commands;[{\"CompletionText\":\"%\",\"ListItemText\":\"%\",\"ResultType\":2,\"ToolTip\":\"ForEach-Object\"},{\"CompletionText\":\"?\",\"ListItemText\":\"?\",\"ResultType\":2,\"ToolTip\":\"Where-Object\"},{\"CompletionText\":\"A:\",\"ListItemText\":\"A:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nA: \\r\\n\"},{\"CompletionText\":\"ac\",\"ListItemText\":\"ac\",\"ResultType\":2,\"ToolTip\":\"Add-Content\"},{\"CompletionText\":\"Add-AdlAnalyticsDataSource\",\"ListItemText\":\"Add-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Add-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Add-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Add-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Add-AdlStoreFirewallRule\",\"ListItemText\":\"Add-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreFirewallRule\"},{\"CompletionText\":\"Add-AdlStoreItemContent\",\"ListItemText\":\"Add-AdlStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreItemContent\"},{\"CompletionText\":\"Add-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Add-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Add-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Add-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Add-AppPackage\",\"ListItemText\":\"Add-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppPackage\"},{\"CompletionText\":\"Add-AppPackageVolume\",\"ListItemText\":\"Add-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Add-AppPackageVolume\"},{\"CompletionText\":\"Add-AppProvisionedPackage\",\"ListItemText\":\"Add-AppProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppProvisionedPackage\"},{\"CompletionText\":\"Add-AppProvisionedSharedPackageContainer\",\"ListItemText\":\"Add-AppProvisionedSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Add-AppProvisionedSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Add-AppSharedPackageContainer\",\"ListItemText\":\"Add-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Add-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Add-AppxPackage\",\"ListItemText\":\"Add-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppxPackage\\r\\n\"},{\"CompletionText\":\"Add-AppxProvisionedPackage\",\"ListItemText\":\"Add-AppxProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AppxProvisionedPackage\\r\\n\"},{\"CompletionText\":\"Add-AppxVolume\",\"ListItemText\":\"Add-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Add-AppxVolume\\r\\n\"},{\"CompletionText\":\"Add-ASRReplicationProtectedItemDisk\",\"ListItemText\":\"Add-ASRReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Add-ASRReplicationProtectedItemDisk\"},{\"CompletionText\":\"Add-AzAccount\",\"ListItemText\":\"Add-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Add-AzAccount\"},{\"CompletionText\":\"Add-AzADAppPermission\",\"ListItemText\":\"Add-AzADAppPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzADAppPermission \\r\\n\"},{\"CompletionText\":\"Add-AzADGroupMember\",\"ListItemText\":\"Add-AzADGroupMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzADGroupMember \\r\\n\"},{\"CompletionText\":\"Add-AzAnalysisServicesAccount\",\"ListItemText\":\"Add-AzAnalysisServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Add-AzAnalysisServicesAccount\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementApiToGateway\",\"ListItemText\":\"Add-AzApiManagementApiToGateway\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementApiToGateway\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementApiToProduct\",\"ListItemText\":\"Add-AzApiManagementApiToProduct\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementApiToProduct\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementProductToGroup\",\"ListItemText\":\"Add-AzApiManagementProductToGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementProductToGroup\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementRegion\",\"ListItemText\":\"Add-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"Add-AzApiManagementUserToGroup\",\"ListItemText\":\"Add-AzApiManagementUserToGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzApiManagementUserToGroup\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Add-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Add-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Add-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Add-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Add-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Add-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayCustomError\",\"ListItemText\":\"Add-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Add-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Add-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Add-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Add-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Add-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayListener\",\"ListItemText\":\"Add-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Add-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Add-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Add-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Add-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Add-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Add-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Add-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Add-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Add-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Add-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Add-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Add-AzAttestationPolicySigner\",\"ListItemText\":\"Add-AzAttestationPolicySigner\",\"ResultType\":2,\"ToolTip\":\"Add-AzAttestationPolicySigner\\r\\n\"},{\"CompletionText\":\"Add-AzCognitiveServicesAccountNetworkRule\",\"ListItemText\":\"Add-AzCognitiveServicesAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzCognitiveServicesAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzContainerInstanceOutput\",\"ListItemText\":\"Add-AzContainerInstanceOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzContainerInstanceOutput \\r\\n\"},{\"CompletionText\":\"Add-AzDataFactoryV2DataFlowDebugSessionPackage\",\"ListItemText\":\"Add-AzDataFactoryV2DataFlowDebugSessionPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataFactoryV2DataFlowDebugSessionPackage\\r\\n\"},{\"CompletionText\":\"Add-AzDataFactoryV2TriggerSubscription\",\"ListItemText\":\"Add-AzDataFactoryV2TriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataFactoryV2TriggerSubscription\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Add-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Add-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Add-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreItemContent\",\"ListItemText\":\"Add-AzDataLakeStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreItemContent\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Add-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Add-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Add-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzDelegation\",\"ListItemText\":\"Add-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"Add-AzDelegation\\r\\n\"},{\"CompletionText\":\"Add-AzDnsRecordConfig\",\"ListItemText\":\"Add-AzDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Add-AzEnvironment\",\"ListItemText\":\"Add-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Add-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"Add-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Add-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Add-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRouteCrossConnectionPeering\",\"ListItemText\":\"Add-AzExpressRouteCrossConnectionPeering\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRouteCrossConnectionPeering\\r\\n\"},{\"CompletionText\":\"Add-AzExpressRoutePortAuthorization\",\"ListItemText\":\"Add-AzExpressRoutePortAuthorization\",\"ResultType\":2,\"ToolTip\":\"Add-AzExpressRoutePortAuthorization\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightClusterIdentity\",\"ListItemText\":\"Add-AzHDInsightClusterIdentity\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightClusterIdentity\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightComponentVersion\",\"ListItemText\":\"Add-AzHDInsightComponentVersion\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightComponentVersion\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightConfigValue\",\"ListItemText\":\"Add-AzHDInsightConfigValue\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightConfigValue\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightMetastore\",\"ListItemText\":\"Add-AzHDInsightMetastore\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightMetastore\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightScriptAction\",\"ListItemText\":\"Add-AzHDInsightScriptAction\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightScriptAction\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightSecurityProfile\",\"ListItemText\":\"Add-AzHDInsightSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightSecurityProfile\\r\\n\"},{\"CompletionText\":\"Add-AzHDInsightStorage\",\"ListItemText\":\"Add-AzHDInsightStorage\",\"ResultType\":2,\"ToolTip\":\"Add-AzHDInsightStorage\\r\\n\"},{\"CompletionText\":\"Add-AzImageDataDisk\",\"ListItemText\":\"Add-AzImageDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzImageDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubCertificate\",\"ListItemText\":\"Add-AzIotHubCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubConfiguration\",\"ListItemText\":\"Add-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubDCL\",\"ListItemText\":\"Add-AzIotHubDCL\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDCL\"},{\"CompletionText\":\"Add-AzIotHubDeployment\",\"ListItemText\":\"Add-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubDevice\",\"ListItemText\":\"Add-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubDeviceChildren\",\"ListItemText\":\"Add-AzIotHubDeviceChildren\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubDeviceChildren\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubEHCG\",\"ListItemText\":\"Add-AzIotHubEHCG\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubEHCG\"},{\"CompletionText\":\"Add-AzIotHubEventHubConsumerGroup\",\"ListItemText\":\"Add-AzIotHubEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubEventHubConsumerGroup\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubKey\",\"ListItemText\":\"Add-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubMessageEnrichment\",\"ListItemText\":\"Add-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubModule\",\"ListItemText\":\"Add-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubMsgEnrich\",\"ListItemText\":\"Add-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Add-AzIotHubRoute\",\"ListItemText\":\"Add-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Add-AzIotHubRoutingEndpoint\",\"ListItemText\":\"Add-AzIotHubRoutingEndpoint\",\"ResultType\":2,\"ToolTip\":\"Add-AzIotHubRoutingEndpoint\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultCertificate\",\"ListItemText\":\"Add-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultCertificateContact\",\"ListItemText\":\"Add-AzKeyVaultCertificateContact\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultCertificateContact\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultKey\",\"ListItemText\":\"Add-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Add-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Add-AzKeyVaultNetworkRule\",\"ListItemText\":\"Add-AzKeyVaultNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzKeyVaultNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzKustoClusterLanguageExtension\",\"ListItemText\":\"Add-AzKustoClusterLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzKustoClusterLanguageExtension \\r\\n\"},{\"CompletionText\":\"Add-AzKustoDatabasePrincipal\",\"ListItemText\":\"Add-AzKustoDatabasePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzKustoDatabasePrincipal \\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"Add-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Add-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Add-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Add-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Add-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Add-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Add-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzLogProfile\",\"ListItemText\":\"Add-AzLogProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzLogProfile\\r\\n\"},{\"CompletionText\":\"Add-AzMetricAlertRule\",\"ListItemText\":\"Add-AzMetricAlertRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzMetricAlertRule\\r\\n\"},{\"CompletionText\":\"Add-AzMetricAlertRuleV2\",\"ListItemText\":\"Add-AzMetricAlertRuleV2\",\"ResultType\":2,\"ToolTip\":\"Add-AzMetricAlertRuleV2\\r\\n\"},{\"CompletionText\":\"Add-AzMlWebServiceRegionalProperty\",\"ListItemText\":\"Add-AzMlWebServiceRegionalProperty\",\"ResultType\":2,\"ToolTip\":\"Add-AzMlWebServiceRegionalProperty\\r\\n\"},{\"CompletionText\":\"Add-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Add-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Add-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Add-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Add-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Add-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzPrivateDnsRecordConfig\",\"ListItemText\":\"Add-AzPrivateDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzPrivateDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Add-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ListItemText\":\"Add-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzRecoveryServicesAsrReplicationProtectedItemDisk\\r\\n\"},{\"CompletionText\":\"Add-AzResourceMoverMoveResource\",\"ListItemText\":\"Add-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzResourceMoverMoveResource \\r\\n\"},{\"CompletionText\":\"Add-AzRmStorageContainerLegalHold\",\"ListItemText\":\"Add-AzRmStorageContainerLegalHold\",\"ResultType\":2,\"ToolTip\":\"Add-AzRmStorageContainerLegalHold\\r\\n\"},{\"CompletionText\":\"Add-AzRouteConfig\",\"ListItemText\":\"Add-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Add-AzRouteFilterRuleConfig\",\"ListItemText\":\"Add-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Add-AzRouteServerPeer\",\"ListItemText\":\"Add-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Add-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Add-AzRoutingPolicy\",\"ListItemText\":\"Add-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Add-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Add-AzSecurityAdaptiveNetworkHardening\",\"ListItemText\":\"Add-AzSecurityAdaptiveNetworkHardening\",\"ResultType\":2,\"ToolTip\":\"Add-AzSecurityAdaptiveNetworkHardening\\r\\n\"},{\"CompletionText\":\"Add-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Add-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Add-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Add-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Add-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricClientCertificate\",\"ListItemText\":\"Add-AzServiceFabricClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricClientCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedClusterClientCertificate\",\"ListItemText\":\"Add-AzServiceFabricManagedClusterClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedClusterClientCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedClusterNetworkSecurityRule\",\"ListItemText\":\"Add-AzServiceFabricManagedClusterNetworkSecurityRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedClusterNetworkSecurityRule\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedNodeTypeVMExtension\",\"ListItemText\":\"Add-AzServiceFabricManagedNodeTypeVMExtension\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedNodeTypeVMExtension\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricManagedNodeTypeVMSecret\",\"ListItemText\":\"Add-AzServiceFabricManagedNodeTypeVMSecret\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricManagedNodeTypeVMSecret\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricNode\",\"ListItemText\":\"Add-AzServiceFabricNode\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricNode\\r\\n\"},{\"CompletionText\":\"Add-AzServiceFabricNodeType\",\"ListItemText\":\"Add-AzServiceFabricNodeType\",\"ResultType\":2,\"ToolTip\":\"Add-AzServiceFabricNodeType\\r\\n\"},{\"CompletionText\":\"Add-AzSqlDatabaseToFailoverGroup\",\"ListItemText\":\"Add-AzSqlDatabaseToFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlDatabaseToFailoverGroup\\r\\n\"},{\"CompletionText\":\"Add-AzSqlElasticJobStep\",\"ListItemText\":\"Add-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Add-AzSqlElasticJobTarget\",\"ListItemText\":\"Add-AzSqlElasticJobTarget\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlElasticJobTarget\\r\\n\"},{\"CompletionText\":\"Add-AzSqlInstanceKeyVaultKey\",\"ListItemText\":\"Add-AzSqlInstanceKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlInstanceKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Add-AzSqlManagedInstanceTransparentDataEncryptionCertificate\",\"ListItemText\":\"Add-AzSqlManagedInstanceTransparentDataEncryptionCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlManagedInstanceTransparentDataEncryptionCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzSqlServerKeyVaultKey\",\"ListItemText\":\"Add-AzSqlServerKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlServerKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Add-AzSqlServerTransparentDataEncryptionCertificate\",\"ListItemText\":\"Add-AzSqlServerTransparentDataEncryptionCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzSqlServerTransparentDataEncryptionCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzStackHCIVMAttestation\",\"ListItemText\":\"Add-AzStackHCIVMAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzStackHCIVMAttestation \\r\\n\"},{\"CompletionText\":\"Add-AzStorageAccountManagementPolicyAction\",\"ListItemText\":\"Add-AzStorageAccountManagementPolicyAction\",\"ResultType\":2,\"ToolTip\":\"Add-AzStorageAccountManagementPolicyAction\\r\\n\"},{\"CompletionText\":\"Add-AzStorageAccountNetworkRule\",\"ListItemText\":\"Add-AzStorageAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzStorageAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Add-AzSynapseDataFlowDebugSessionPackage\",\"ListItemText\":\"Add-AzSynapseDataFlowDebugSessionPackage\",\"ResultType\":2,\"ToolTip\":\"Add-AzSynapseDataFlowDebugSessionPackage\\r\\n\"},{\"CompletionText\":\"Add-AzSynapseKustoPoolLanguageExtension\",\"ListItemText\":\"Add-AzSynapseKustoPoolLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-AzSynapseKustoPoolLanguageExtension \\r\\n\"},{\"CompletionText\":\"Add-AzSynapseTriggerSubscription\",\"ListItemText\":\"Add-AzSynapseTriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Add-AzSynapseTriggerSubscription\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerCustomHeaderToEndpoint\",\"ListItemText\":\"Add-AzTrafficManagerCustomHeaderToEndpoint\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerCustomHeaderToEndpoint\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerCustomHeaderToProfile\",\"ListItemText\":\"Add-AzTrafficManagerCustomHeaderToProfile\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerCustomHeaderToProfile\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerEndpointConfig\",\"ListItemText\":\"Add-AzTrafficManagerEndpointConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerEndpointConfig\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerExpectedStatusCodeRange\",\"ListItemText\":\"Add-AzTrafficManagerExpectedStatusCodeRange\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerExpectedStatusCodeRange\\r\\n\"},{\"CompletionText\":\"Add-AzTrafficManagerIpAddressRange\",\"ListItemText\":\"Add-AzTrafficManagerIpAddressRange\",\"ResultType\":2,\"ToolTip\":\"Add-AzTrafficManagerIpAddressRange\\r\\n\"},{\"CompletionText\":\"Add-AzVhd\",\"ListItemText\":\"Add-AzVhd\",\"ResultType\":2,\"ToolTip\":\"Add-AzVhd\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualHubRoute\",\"ListItemText\":\"Add-AzVirtualHubRoute\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualHubRoute\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualHubRouteTable\",\"ListItemText\":\"Add-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualNetworkGatewayIpConfig\",\"ListItemText\":\"Add-AzVirtualNetworkGatewayIpConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualNetworkGatewayIpConfig\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualNetworkPeering\",\"ListItemText\":\"Add-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Add-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Add-AzVirtualRouterPeer\",\"ListItemText\":\"Add-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Add-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Add-AzVMAdditionalUnattendContent\",\"ListItemText\":\"Add-AzVMAdditionalUnattendContent\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMAdditionalUnattendContent\\r\\n\"},{\"CompletionText\":\"Add-AzVMDataDisk\",\"ListItemText\":\"Add-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzVmGalleryApplication\",\"ListItemText\":\"Add-AzVmGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmGalleryApplication\\r\\n\"},{\"CompletionText\":\"Add-AzVMNetworkInterface\",\"ListItemText\":\"Add-AzVMNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMNetworkInterface\\r\\n\"},{\"CompletionText\":\"Add-AzVMSecret\",\"ListItemText\":\"Add-AzVMSecret\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMSecret\\r\\n\"},{\"CompletionText\":\"Add-AzVmssAdditionalUnattendContent\",\"ListItemText\":\"Add-AzVmssAdditionalUnattendContent\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssAdditionalUnattendContent\\r\\n\"},{\"CompletionText\":\"Add-AzVmssDataDisk\",\"ListItemText\":\"Add-AzVmssDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzVmssDiagnosticsExtension\",\"ListItemText\":\"Add-AzVmssDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Add-AzVmssExtension\",\"ListItemText\":\"Add-AzVmssExtension\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssExtension\\r\\n\"},{\"CompletionText\":\"Add-AzVmssGalleryApplication\",\"ListItemText\":\"Add-AzVmssGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssGalleryApplication\\r\\n\"},{\"CompletionText\":\"Add-AzVMSshPublicKey\",\"ListItemText\":\"Add-AzVMSshPublicKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzVMSshPublicKey\\r\\n\"},{\"CompletionText\":\"Add-AzVmssNetworkInterfaceConfiguration\",\"ListItemText\":\"Add-AzVmssNetworkInterfaceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssNetworkInterfaceConfiguration\\r\\n\"},{\"CompletionText\":\"Add-AzVmssRunCommand\",\"ListItemText\":\"Add-AzVmssRunCommand\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssRunCommand\\r\\n\"},{\"CompletionText\":\"Add-AzVmssSecret\",\"ListItemText\":\"Add-AzVmssSecret\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssSecret\\r\\n\"},{\"CompletionText\":\"Add-AzVmssSshPublicKey\",\"ListItemText\":\"Add-AzVmssSshPublicKey\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssSshPublicKey\\r\\n\"},{\"CompletionText\":\"Add-AzVmssVMDataDisk\",\"ListItemText\":\"Add-AzVmssVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssVMDataDisk\\r\\n\"},{\"CompletionText\":\"Add-AzVmssWinRMListener\",\"ListItemText\":\"Add-AzVmssWinRMListener\",\"ResultType\":2,\"ToolTip\":\"Add-AzVmssWinRMListener\\r\\n\"},{\"CompletionText\":\"Add-AzVpnClientRevokedCertificate\",\"ListItemText\":\"Add-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzVpnClientRootCertificate\",\"ListItemText\":\"Add-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"Add-AzWebAppAccessRestrictionRule\",\"ListItemText\":\"Add-AzWebAppAccessRestrictionRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzWebAppAccessRestrictionRule\\r\\n\"},{\"CompletionText\":\"Add-AzWebAppTrafficRouting\",\"ListItemText\":\"Add-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Add-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Add-AzWebtestAlertRule\",\"ListItemText\":\"Add-AzWebtestAlertRule\",\"ResultType\":2,\"ToolTip\":\"Add-AzWebtestAlertRule\\r\\n\"},{\"CompletionText\":\"Add-BCDataCacheExtension\",\"ListItemText\":\"Add-BCDataCacheExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-BCDataCacheExtension \\r\\n\"},{\"CompletionText\":\"Add-BitLockerKeyProtector\",\"ListItemText\":\"Add-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"Add-BitsFile\",\"ListItemText\":\"Add-BitsFile\",\"ResultType\":2,\"ToolTip\":\"Add-BitsFile\\r\\n\"},{\"CompletionText\":\"Add-CertificateEnrollmentPolicyServer\",\"ListItemText\":\"Add-CertificateEnrollmentPolicyServer\",\"ResultType\":2,\"ToolTip\":\"Add-CertificateEnrollmentPolicyServer\\r\\n\"},{\"CompletionText\":\"Add-Content\",\"ListItemText\":\"Add-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Content [-Path] [-Value] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\\r\\nAdd-Content [-Value] -LiteralPath [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Add-DnsClientDohServerAddress\",\"ListItemText\":\"Add-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Add-DnsClientNrptRule\",\"ListItemText\":\"Add-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Add-DtcClusterTMMapping\",\"ListItemText\":\"Add-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Add-EtwTraceProvider\",\"ListItemText\":\"Add-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Add-History\",\"ListItemText\":\"Add-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-History [[-InputObject] ] [-Passthru] []\\r\\n\"},{\"CompletionText\":\"Add-InitiatorIdToMaskingSet\",\"ListItemText\":\"Add-InitiatorIdToMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-InitiatorIdToMaskingSet \\r\\n\"},{\"CompletionText\":\"Add-JobTrigger\",\"ListItemText\":\"Add-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Add-JobTrigger\\r\\n\"},{\"CompletionText\":\"Add-KdsRootKey\",\"ListItemText\":\"Add-KdsRootKey\",\"ResultType\":2,\"ToolTip\":\"Add-KdsRootKey\\r\\n\"},{\"CompletionText\":\"Add-LocalGroupMember\",\"ListItemText\":\"Add-LocalGroupMember\",\"ResultType\":2,\"ToolTip\":\"Add-LocalGroupMember\\r\\n\"},{\"CompletionText\":\"Add-Member\",\"ListItemText\":\"Add-Member\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Member -InputObject -TypeName [-PassThru] []\\r\\n\\r\\nAdd-Member [-MemberType] [-Name] [[-Value] ] [[-SecondValue] ] -InputObject [-TypeName ] [-Force] [-PassThru] []\\r\\n\\r\\nAdd-Member [-NotePropertyName] [-NotePropertyValue] -InputObject [-TypeName ] [-Force] [-PassThru] []\\r\\n\\r\\nAdd-Member [-NotePropertyMembers] -InputObject [-TypeName ] [-Force] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Add-MpPreference\",\"ListItemText\":\"Add-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-MpPreference \\r\\n\"},{\"CompletionText\":\"Add-NetEventNetworkAdapter\",\"ListItemText\":\"Add-NetEventNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Add-NetEventPacketCaptureProvider\",\"ListItemText\":\"Add-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventProvider\",\"ListItemText\":\"Add-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventVFPProvider\",\"ListItemText\":\"Add-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventVmNetworkAdapter\",\"ListItemText\":\"Add-NetEventVmNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVmNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Add-NetEventVmSwitch\",\"ListItemText\":\"Add-NetEventVmSwitch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVmSwitch \\r\\n\"},{\"CompletionText\":\"Add-NetEventVmSwitchProvider\",\"ListItemText\":\"Add-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Add-NetEventWFPCaptureProvider\",\"ListItemText\":\"Add-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Add-NetIPHttpsCertBinding\",\"ListItemText\":\"Add-NetIPHttpsCertBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetIPHttpsCertBinding \\r\\n\"},{\"CompletionText\":\"Add-NetLbfoTeamMember\",\"ListItemText\":\"Add-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Add-NetLbfoTeamNic\",\"ListItemText\":\"Add-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Add-NetNatExternalAddress\",\"ListItemText\":\"Add-NetNatExternalAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetNatExternalAddress \\r\\n\"},{\"CompletionText\":\"Add-NetNatStaticMapping\",\"ListItemText\":\"Add-NetNatStaticMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetNatStaticMapping \\r\\n\"},{\"CompletionText\":\"Add-NetSwitchTeamMember\",\"ListItemText\":\"Add-NetSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-NetSwitchTeamMember \\r\\n\"},{\"CompletionText\":\"Add-OdbcDsn\",\"ListItemText\":\"Add-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Add-PartitionAccessPath\",\"ListItemText\":\"Add-PartitionAccessPath\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PartitionAccessPath \\r\\n\"},{\"CompletionText\":\"Add-PhysicalDisk\",\"ListItemText\":\"Add-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Add-PoshGitToProfile\",\"ListItemText\":\"Add-PoshGitToProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PoshGitToProfile \\r\\n\"},{\"CompletionText\":\"Add-Printer\",\"ListItemText\":\"Add-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Printer \\r\\n\"},{\"CompletionText\":\"Add-PrinterDriver\",\"ListItemText\":\"Add-PrinterDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PrinterDriver \\r\\n\"},{\"CompletionText\":\"Add-PrinterPort\",\"ListItemText\":\"Add-PrinterPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-PrinterPort \\r\\n\"},{\"CompletionText\":\"Add-ProvisionedAppPackage\",\"ListItemText\":\"Add-ProvisionedAppPackage\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisionedAppPackage\"},{\"CompletionText\":\"Add-ProvisionedAppSharedPackageContainer\",\"ListItemText\":\"Add-ProvisionedAppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisionedAppSharedPackageContainer\"},{\"CompletionText\":\"Add-ProvisionedAppxPackage\",\"ListItemText\":\"Add-ProvisionedAppxPackage\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisionedAppxPackage\"},{\"CompletionText\":\"Add-ProvisioningPackage\",\"ListItemText\":\"Add-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Add-ProvisioningPackage\"},{\"CompletionText\":\"Add-SignerRule\",\"ListItemText\":\"Add-SignerRule\",\"ResultType\":2,\"ToolTip\":\"Add-SignerRule\\r\\n\"},{\"CompletionText\":\"Add-StorageFaultDomain\",\"ListItemText\":\"Add-StorageFaultDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-StorageFaultDomain \\r\\n\"},{\"CompletionText\":\"Add-TargetPortToMaskingSet\",\"ListItemText\":\"Add-TargetPortToMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-TargetPortToMaskingSet \\r\\n\"},{\"CompletionText\":\"Add-TrustedProvisioningCertificate\",\"ListItemText\":\"Add-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Add-TrustedProvisioningCertificate\"},{\"CompletionText\":\"Add-Type\",\"ListItemText\":\"Add-Type\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-Type [-TypeDefinition] [-Language ] [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type [-Name] [-MemberDefinition] [-Namespace ] [-UsingNamespace ] [-Language ] [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type [-Path] [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type -LiteralPath [-ReferencedAssemblies ] [-OutputAssembly ] [-OutputType ] [-PassThru] [-IgnoreWarnings] [-CompilerOptions ] []\\r\\n\\r\\nAdd-Type -AssemblyName [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Add-VirtualDiskToMaskingSet\",\"ListItemText\":\"Add-VirtualDiskToMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VirtualDiskToMaskingSet \\r\\n\"},{\"CompletionText\":\"Add-VMAssignableDevice\",\"ListItemText\":\"Add-VMAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Add-VMAssignableDevice\\r\\n\"},{\"CompletionText\":\"Add-VMDirectVirtualDisk\",\"ListItemText\":\"Add-VMDirectVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VMDirectVirtualDisk \\r\\n\"},{\"CompletionText\":\"Add-VMDvdDrive\",\"ListItemText\":\"Add-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Add-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Add-VMFibreChannelHba\",\"ListItemText\":\"Add-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Add-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Add-VMGpuPartitionAdapter\",\"ListItemText\":\"Add-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Add-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Add-VMGroupMember\",\"ListItemText\":\"Add-VMGroupMember\",\"ResultType\":2,\"ToolTip\":\"Add-VMGroupMember\\r\\n\"},{\"CompletionText\":\"Add-VMHardDiskDrive\",\"ListItemText\":\"Add-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Add-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Add-VMHostAssignableDevice\",\"ListItemText\":\"Add-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Add-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Add-VMKeyStorageDrive\",\"ListItemText\":\"Add-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Add-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Add-VMMigrationNetwork\",\"ListItemText\":\"Add-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Add-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapter\",\"ListItemText\":\"Add-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapterAcl\",\"ListItemText\":\"Add-VMNetworkAdapterAcl\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapterAcl\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapterExtendedAcl\",\"ListItemText\":\"Add-VMNetworkAdapterExtendedAcl\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapterExtendedAcl\\r\\n\"},{\"CompletionText\":\"Add-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Add-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Add-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Add-VMPmemController\",\"ListItemText\":\"Add-VMPmemController\",\"ResultType\":2,\"ToolTip\":\"Add-VMPmemController\\r\\n\"},{\"CompletionText\":\"Add-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Add-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Add-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Add-VMScsiController\",\"ListItemText\":\"Add-VMScsiController\",\"ResultType\":2,\"ToolTip\":\"Add-VMScsiController\\r\\n\"},{\"CompletionText\":\"Add-VMStoragePath\",\"ListItemText\":\"Add-VMStoragePath\",\"ResultType\":2,\"ToolTip\":\"Add-VMStoragePath\\r\\n\"},{\"CompletionText\":\"Add-VMSwitch\",\"ListItemText\":\"Add-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitch\\r\\n\"},{\"CompletionText\":\"Add-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Add-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Add-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Add-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Add-VMSwitchTeamMember\",\"ListItemText\":\"Add-VMSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"Add-VMSwitchTeamMember\\r\\n\"},{\"CompletionText\":\"Add-VpnConnection\",\"ListItemText\":\"Add-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnection \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionRoute\",\"ListItemText\":\"Add-VpnConnectionRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionRoute \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionTriggerApplication\",\"ListItemText\":\"Add-VpnConnectionTriggerApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionTriggerApplication \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionTriggerDnsConfiguration\",\"ListItemText\":\"Add-VpnConnectionTriggerDnsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionTriggerDnsConfiguration \\r\\n\"},{\"CompletionText\":\"Add-VpnConnectionTriggerTrustedNetwork\",\"ListItemText\":\"Add-VpnConnectionTriggerTrustedNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-VpnConnectionTriggerTrustedNetwork \\r\\n\"},{\"CompletionText\":\"Add-WindowsCapability\",\"ListItemText\":\"Add-WindowsCapability\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsCapability\\r\\n\"},{\"CompletionText\":\"Add-WindowsDriver\",\"ListItemText\":\"Add-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Add-WindowsImage\",\"ListItemText\":\"Add-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsImage\\r\\n\"},{\"CompletionText\":\"Add-WindowsPackage\",\"ListItemText\":\"Add-WindowsPackage\",\"ResultType\":2,\"ToolTip\":\"Add-WindowsPackage\\r\\n\"},{\"CompletionText\":\"AfterAll\",\"ListItemText\":\"AfterAll\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAfterAll \\r\\n\"},{\"CompletionText\":\"AfterEach\",\"ListItemText\":\"AfterEach\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAfterEach \\r\\n\"},{\"CompletionText\":\"agentactivationruntimestarter.exe\",\"ListItemText\":\"agentactivationruntimestarter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\agentactivationruntimestarter.exe\"},{\"CompletionText\":\"AgentService.exe\",\"ListItemText\":\"AgentService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AgentService.exe\"},{\"CompletionText\":\"AggregatorHost.exe\",\"ListItemText\":\"AggregatorHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AggregatorHost.exe\"},{\"CompletionText\":\"aitstatic.exe\",\"ListItemText\":\"aitstatic.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\aitstatic.exe\"},{\"CompletionText\":\"alg.exe\",\"ListItemText\":\"alg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\alg.exe\"},{\"CompletionText\":\"algm\",\"ListItemText\":\"algm\",\"ResultType\":2,\"ToolTip\":\"algm\"},{\"CompletionText\":\"AppHostRegistrationVerifier.exe\",\"ListItemText\":\"AppHostRegistrationVerifier.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppHostRegistrationVerifier.exe\"},{\"CompletionText\":\"appidcertstorecheck.exe\",\"ListItemText\":\"appidcertstorecheck.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appidcertstorecheck.exe\"},{\"CompletionText\":\"appidpolicyconverter.exe\",\"ListItemText\":\"appidpolicyconverter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appidpolicyconverter.exe\"},{\"CompletionText\":\"appidtel.exe\",\"ListItemText\":\"appidtel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appidtel.exe\"},{\"CompletionText\":\"AppInstallerBackgroundUpdate.exe\",\"ListItemText\":\"AppInstallerBackgroundUpdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppInstallerBackgroundUpdate.exe\"},{\"CompletionText\":\"appletviewer.exe\",\"ListItemText\":\"appletviewer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\appletviewer.exe\"},{\"CompletionText\":\"ApplicationFrameHost.exe\",\"ListItemText\":\"ApplicationFrameHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApplicationFrameHost.exe\"},{\"CompletionText\":\"Apply-WindowsUnattend\",\"ListItemText\":\"Apply-WindowsUnattend\",\"ResultType\":2,\"ToolTip\":\"Apply-WindowsUnattend\"},{\"CompletionText\":\"ApplySettingsTemplateCatalog.exe\",\"ListItemText\":\"ApplySettingsTemplateCatalog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApplySettingsTemplateCatalog.exe\"},{\"CompletionText\":\"ApplyTrustOffline.exe\",\"ListItemText\":\"ApplyTrustOffline.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApplyTrustOffline.exe\"},{\"CompletionText\":\"Approve-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Approve-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nApprove-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Approve-AzPrivateEndpointConnection\",\"ListItemText\":\"Approve-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Approve-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Approve-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Approve-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nApprove-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"ApproveChildRequest.exe\",\"ListItemText\":\"ApproveChildRequest.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ApproveChildRequest.exe\"},{\"CompletionText\":\"AppVClient.exe\",\"ListItemText\":\"AppVClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVClient.exe\"},{\"CompletionText\":\"AppVDllSurrogate.exe\",\"ListItemText\":\"AppVDllSurrogate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVDllSurrogate.exe\"},{\"CompletionText\":\"appverif.exe\",\"ListItemText\":\"appverif.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appverif.exe\"},{\"CompletionText\":\"AppVNice.exe\",\"ListItemText\":\"AppVNice.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVNice.exe\"},{\"CompletionText\":\"AppVShNotify.exe\",\"ListItemText\":\"AppVShNotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AppVShNotify.exe\"},{\"CompletionText\":\"appwiz.cpl\",\"ListItemText\":\"appwiz.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\appwiz.cpl\"},{\"CompletionText\":\"ARP.EXE\",\"ListItemText\":\"ARP.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ARP.EXE\"},{\"CompletionText\":\"aslr-manager.ps1\",\"ListItemText\":\"aslr-manager.ps1\",\"ResultType\":2,\"ToolTip\":\"aslr-manager.ps1 [-Action] [-paths] []\\r\\n\"},{\"CompletionText\":\"Assert-MockCalled\",\"ListItemText\":\"Assert-MockCalled\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAssert-MockCalled \\r\\n\"},{\"CompletionText\":\"Assert-VerifiableMocks\",\"ListItemText\":\"Assert-VerifiableMocks\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAssert-VerifiableMocks \\r\\n\"},{\"CompletionText\":\"AssignedAccessGuard.exe\",\"ListItemText\":\"AssignedAccessGuard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AssignedAccessGuard.exe\"},{\"CompletionText\":\"AsusDownloadAgent.exe\",\"ListItemText\":\"AsusDownloadAgent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AsusDownloadAgent.exe\"},{\"CompletionText\":\"AsusDownLoadLicense.exe\",\"ListItemText\":\"AsusDownLoadLicense.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AsusDownLoadLicense.exe\"},{\"CompletionText\":\"AsusUpdateCheck.exe\",\"ListItemText\":\"AsusUpdateCheck.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AsusUpdateCheck.exe\"},{\"CompletionText\":\"at.exe\",\"ListItemText\":\"at.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\at.exe\"},{\"CompletionText\":\"AtBroker.exe\",\"ListItemText\":\"AtBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AtBroker.exe\"},{\"CompletionText\":\"attrib.exe\",\"ListItemText\":\"attrib.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\attrib.exe\"},{\"CompletionText\":\"audiodg.exe\",\"ListItemText\":\"audiodg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\audiodg.exe\"},{\"CompletionText\":\"auditpol.exe\",\"ListItemText\":\"auditpol.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\auditpol.exe\"},{\"CompletionText\":\"AuthHost.exe\",\"ListItemText\":\"AuthHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AuthHost.exe\"},{\"CompletionText\":\"autochk.exe\",\"ListItemText\":\"autochk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\autochk.exe\"},{\"CompletionText\":\"AxInstUI.exe\",\"ListItemText\":\"AxInstUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\AxInstUI.exe\"},{\"CompletionText\":\"az.cmd\",\"ListItemText\":\"az.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Microsoft SDKs\\\\Azure\\\\CLI2\\\\wbin\\\\az.cmd\"},{\"CompletionText\":\"azman.msc\",\"ListItemText\":\"azman.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\azman.msc\"},{\"CompletionText\":\"azps.ps1\",\"ListItemText\":\"azps.ps1\",\"ResultType\":2,\"ToolTip\":\"azps.ps1 \\r\\n\"},{\"CompletionText\":\"AzureVpn.exe\",\"ListItemText\":\"AzureVpn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\AzureVpn.exe\"},{\"CompletionText\":\"B:\",\"ListItemText\":\"B:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nB: \\r\\n\"},{\"CompletionText\":\"baaupdate.exe\",\"ListItemText\":\"baaupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\baaupdate.exe\"},{\"CompletionText\":\"backgroundTaskHost.exe\",\"ListItemText\":\"backgroundTaskHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\backgroundTaskHost.exe\"},{\"CompletionText\":\"BackgroundTransferHost.exe\",\"ListItemText\":\"BackgroundTransferHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BackgroundTransferHost.exe\"},{\"CompletionText\":\"Backup-AzApiManagement\",\"ListItemText\":\"Backup-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Backup-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Backup-AzDataProtectionBackupInstanceAdhoc\",\"ListItemText\":\"Backup-AzDataProtectionBackupInstanceAdhoc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBackup-AzDataProtectionBackupInstanceAdhoc \\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVault\",\"ListItemText\":\"Backup-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultCertificate\",\"ListItemText\":\"Backup-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultKey\",\"ListItemText\":\"Backup-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Backup-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Backup-AzKeyVaultSecret\",\"ListItemText\":\"Backup-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Backup-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Backup-AzRecoveryServicesBackupItem\",\"ListItemText\":\"Backup-AzRecoveryServicesBackupItem\",\"ResultType\":2,\"ToolTip\":\"Backup-AzRecoveryServicesBackupItem\\r\\n\"},{\"CompletionText\":\"Backup-BitLockerKeyProtector\",\"ListItemText\":\"Backup-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBackup-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"BackupToAAD-BitLockerKeyProtector\",\"ListItemText\":\"BackupToAAD-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBackupToAAD-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"bash.exe\",\"ListItemText\":\"bash.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bash.exe\"},{\"CompletionText\":\"bcdboot.exe\",\"ListItemText\":\"bcdboot.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bcdboot.exe\"},{\"CompletionText\":\"bcdedit.exe\",\"ListItemText\":\"bcdedit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bcdedit.exe\"},{\"CompletionText\":\"bdechangepin.exe\",\"ListItemText\":\"bdechangepin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bdechangepin.exe\"},{\"CompletionText\":\"BdeHdCfg.exe\",\"ListItemText\":\"BdeHdCfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BdeHdCfg.exe\"},{\"CompletionText\":\"BdeUISrv.exe\",\"ListItemText\":\"BdeUISrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BdeUISrv.exe\"},{\"CompletionText\":\"bdeunlock.exe\",\"ListItemText\":\"bdeunlock.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bdeunlock.exe\"},{\"CompletionText\":\"BeforeAll\",\"ListItemText\":\"BeforeAll\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBeforeAll \\r\\n\"},{\"CompletionText\":\"BeforeEach\",\"ListItemText\":\"BeforeEach\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBeforeEach \\r\\n\"},{\"CompletionText\":\"bfsvc.exe\",\"ListItemText\":\"bfsvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\bfsvc.exe\"},{\"CompletionText\":\"BioIso.exe\",\"ListItemText\":\"BioIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BioIso.exe\"},{\"CompletionText\":\"BitLockerDeviceEncryption.exe\",\"ListItemText\":\"BitLockerDeviceEncryption.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BitLockerDeviceEncryption.exe\"},{\"CompletionText\":\"BitLockerWizard.exe\",\"ListItemText\":\"BitLockerWizard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BitLockerWizard.exe\"},{\"CompletionText\":\"BitLockerWizardElev.exe\",\"ListItemText\":\"BitLockerWizardElev.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\BitLockerWizardElev.exe\"},{\"CompletionText\":\"bitsadmin.exe\",\"ListItemText\":\"bitsadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bitsadmin.exe\"},{\"CompletionText\":\"Block-FileShareAccess\",\"ListItemText\":\"Block-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBlock-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Block-SmbClientAccessToServer\",\"ListItemText\":\"Block-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBlock-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Block-SmbShareAccess\",\"ListItemText\":\"Block-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nBlock-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"blsmba\",\"ListItemText\":\"blsmba\",\"ResultType\":2,\"ToolTip\":\"blsmba\"},{\"CompletionText\":\"blsmbclas\",\"ListItemText\":\"blsmbclas\",\"ResultType\":2,\"ToolTip\":\"blsmbclas\"},{\"CompletionText\":\"bootim.exe\",\"ListItemText\":\"bootim.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bootim.exe\"},{\"CompletionText\":\"bootsect.exe\",\"ListItemText\":\"bootsect.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bootsect.exe\"},{\"CompletionText\":\"bridgeunattend.exe\",\"ListItemText\":\"bridgeunattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bridgeunattend.exe\"},{\"CompletionText\":\"browserexport.exe\",\"ListItemText\":\"browserexport.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\browserexport.exe\"},{\"CompletionText\":\"browser_broker.exe\",\"ListItemText\":\"browser_broker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\browser_broker.exe\"},{\"CompletionText\":\"bthprops.cpl\",\"ListItemText\":\"bthprops.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bthprops.cpl\"},{\"CompletionText\":\"bthudtask.exe\",\"ListItemText\":\"bthudtask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\bthudtask.exe\"},{\"CompletionText\":\"ByteCodeGenerator.exe\",\"ListItemText\":\"ByteCodeGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ByteCodeGenerator.exe\"},{\"CompletionText\":\"c\",\"ListItemText\":\"c\",\"ResultType\":2,\"ToolTip\":\"code-insiders.cmd\"},{\"CompletionText\":\"C:\",\"ListItemText\":\"C:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nC: \\r\\n\"},{\"CompletionText\":\"cacls.exe\",\"ListItemText\":\"cacls.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cacls.exe\"},{\"CompletionText\":\"calc.exe\",\"ListItemText\":\"calc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\calc.exe\"},{\"CompletionText\":\"CameraSettingsUIHost.exe\",\"ListItemText\":\"CameraSettingsUIHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CameraSettingsUIHost.exe\"},{\"CompletionText\":\"CastSrv.exe\",\"ListItemText\":\"CastSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CastSrv.exe\"},{\"CompletionText\":\"cat\",\"ListItemText\":\"cat\",\"ResultType\":2,\"ToolTip\":\"Get-Content\"},{\"CompletionText\":\"CCG.exe\",\"ListItemText\":\"CCG.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CCG.exe\"},{\"CompletionText\":\"cd\",\"ListItemText\":\"cd\",\"ResultType\":2,\"ToolTip\":\"Set-Location\"},{\"CompletionText\":\"cd..\",\"ListItemText\":\"cd..\",\"ResultType\":2,\"ToolTip\":\"\\r\\ncd.. \\r\\n\"},{\"CompletionText\":\"cd\\\\\",\"ListItemText\":\"cd\\\\\",\"ResultType\":2,\"ToolTip\":\"\\r\\ncd\\\\ \\r\\n\"},{\"CompletionText\":\"cd~\",\"ListItemText\":\"cd~\",\"ResultType\":2,\"ToolTip\":\"\\r\\ncd~ \\r\\n\"},{\"CompletionText\":\"CertEnrollCtrl.exe\",\"ListItemText\":\"CertEnrollCtrl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CertEnrollCtrl.exe\"},{\"CompletionText\":\"certlm.msc\",\"ListItemText\":\"certlm.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certlm.msc\"},{\"CompletionText\":\"certmgr.msc\",\"ListItemText\":\"certmgr.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certmgr.msc\"},{\"CompletionText\":\"certreq.exe\",\"ListItemText\":\"certreq.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certreq.exe\"},{\"CompletionText\":\"certutil.exe\",\"ListItemText\":\"certutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\certutil.exe\"},{\"CompletionText\":\"cfy\",\"ListItemText\":\"cfy\",\"ResultType\":2,\"ToolTip\":\"cfy\"},{\"CompletionText\":\"change.exe\",\"ListItemText\":\"change.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\change.exe\"},{\"CompletionText\":\"changepk.exe\",\"ListItemText\":\"changepk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\changepk.exe\"},{\"CompletionText\":\"charmap.exe\",\"ListItemText\":\"charmap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\charmap.exe\"},{\"CompletionText\":\"chcp.com\",\"ListItemText\":\"chcp.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chcp.com\"},{\"CompletionText\":\"chdir\",\"ListItemText\":\"chdir\",\"ResultType\":2,\"ToolTip\":\"Set-Location\"},{\"CompletionText\":\"CheckNetIsolation.exe\",\"ListItemText\":\"CheckNetIsolation.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CheckNetIsolation.exe\"},{\"CompletionText\":\"Checkpoint-VM\",\"ListItemText\":\"Checkpoint-VM\",\"ResultType\":2,\"ToolTip\":\"Checkpoint-VM\\r\\n\"},{\"CompletionText\":\"chglogon.exe\",\"ListItemText\":\"chglogon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chglogon.exe\"},{\"CompletionText\":\"chgport.exe\",\"ListItemText\":\"chgport.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chgport.exe\"},{\"CompletionText\":\"chgusr.exe\",\"ListItemText\":\"chgusr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chgusr.exe\"},{\"CompletionText\":\"chkdsk.exe\",\"ListItemText\":\"chkdsk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chkdsk.exe\"},{\"CompletionText\":\"chkntfs.exe\",\"ListItemText\":\"chkntfs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\chkntfs.exe\"},{\"CompletionText\":\"choco.exe\",\"ListItemText\":\"choco.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\choco.exe\"},{\"CompletionText\":\"choice.exe\",\"ListItemText\":\"choice.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\choice.exe\"},{\"CompletionText\":\"CIDiag.exe\",\"ListItemText\":\"CIDiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CIDiag.exe\"},{\"CompletionText\":\"cipher.exe\",\"ListItemText\":\"cipher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cipher.exe\"},{\"CompletionText\":\"CiTool.exe\",\"ListItemText\":\"CiTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CiTool.exe\"},{\"CompletionText\":\"clc\",\"ListItemText\":\"clc\",\"ResultType\":2,\"ToolTip\":\"Clear-Content\"},{\"CompletionText\":\"cleanmgr.exe\",\"ListItemText\":\"cleanmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cleanmgr.exe\"},{\"CompletionText\":\"clear\",\"ListItemText\":\"clear\",\"ResultType\":2,\"ToolTip\":\"Clear-Host\"},{\"CompletionText\":\"Clear-AssignedAccess\",\"ListItemText\":\"Clear-AssignedAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AssignedAccess \\r\\n\"},{\"CompletionText\":\"Clear-AzAppConfigurationDeletedStore\",\"ListItemText\":\"Clear-AzAppConfigurationDeletedStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AzAppConfigurationDeletedStore \\r\\n\"},{\"CompletionText\":\"Clear-AzCdnEndpointContent\",\"ListItemText\":\"Clear-AzCdnEndpointContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AzCdnEndpointContent \\r\\n\"},{\"CompletionText\":\"Clear-AzConfig\",\"ListItemText\":\"Clear-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Clear-AzConfig\\r\\n\"},{\"CompletionText\":\"Clear-AzContext\",\"ListItemText\":\"Clear-AzContext\",\"ResultType\":2,\"ToolTip\":\"Clear-AzContext\\r\\n\"},{\"CompletionText\":\"Clear-AzDefault\",\"ListItemText\":\"Clear-AzDefault\",\"ResultType\":2,\"ToolTip\":\"Clear-AzDefault\\r\\n\"},{\"CompletionText\":\"Clear-AzFrontDoorCdnEndpointContent\",\"ListItemText\":\"Clear-AzFrontDoorCdnEndpointContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-AzFrontDoorCdnEndpointContent \\r\\n\"},{\"CompletionText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Clear-AzSqlServerVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlServerVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlServerVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Clear-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Clear-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlAdvancedThreatProtectionSetting\"},{\"CompletionText\":\"Clear-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Clear-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlPoolAdvancedThreatProtectionSetting\"},{\"CompletionText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlPoolVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSynapseSqlVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Clear-BCCache\",\"ListItemText\":\"Clear-BCCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-BCCache \\r\\n\"},{\"CompletionText\":\"Clear-BitLockerAutoUnlock\",\"ListItemText\":\"Clear-BitLockerAutoUnlock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-BitLockerAutoUnlock \\r\\n\"},{\"CompletionText\":\"Clear-Content\",\"ListItemText\":\"Clear-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Content [-Path] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\\r\\nClear-Content -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Clear-Disk\",\"ListItemText\":\"Clear-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Disk \\r\\n\"},{\"CompletionText\":\"Clear-DnsClientCache\",\"ListItemText\":\"Clear-DnsClientCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-DnsClientCache \\r\\n\"},{\"CompletionText\":\"Clear-FileStorageTier\",\"ListItemText\":\"Clear-FileStorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-FileStorageTier \\r\\n\"},{\"CompletionText\":\"Clear-History\",\"ListItemText\":\"Clear-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-History [[-Id] ] [[-Count] ] [-Newest] [-WhatIf] [-Confirm] []\\r\\n\\r\\nClear-History [[-Count] ] [-CommandLine ] [-Newest] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-Host\",\"ListItemText\":\"Clear-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Host \\r\\n\"},{\"CompletionText\":\"Clear-Item\",\"ListItemText\":\"Clear-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Item [-Path] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nClear-Item -LiteralPath [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-ItemProperty\",\"ListItemText\":\"Clear-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-ItemProperty [-Path] [-Name] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nClear-ItemProperty [-Name] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-KdsCache\",\"ListItemText\":\"Clear-KdsCache\",\"ResultType\":2,\"ToolTip\":\"Clear-KdsCache\\r\\n\"},{\"CompletionText\":\"Clear-PcsvDeviceLog\",\"ListItemText\":\"Clear-PcsvDeviceLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-PcsvDeviceLog \\r\\n\"},{\"CompletionText\":\"Clear-RecycleBin\",\"ListItemText\":\"Clear-RecycleBin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-RecycleBin [[-DriveLetter] ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-StorageBusDisk\",\"ListItemText\":\"Clear-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Clear-StorageDiagnosticInfo\",\"ListItemText\":\"Clear-StorageDiagnosticInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-StorageDiagnosticInfo \\r\\n\"},{\"CompletionText\":\"Clear-Tpm\",\"ListItemText\":\"Clear-Tpm\",\"ResultType\":2,\"ToolTip\":\"Clear-Tpm\\r\\n\"},{\"CompletionText\":\"Clear-Variable\",\"ListItemText\":\"Clear-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClear-Variable [-Name] [-Include ] [-Exclude ] [-Force] [-PassThru] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Clear-WindowsCorruptMountPoint\",\"ListItemText\":\"Clear-WindowsCorruptMountPoint\",\"ResultType\":2,\"ToolTip\":\"Clear-WindowsCorruptMountPoint\\r\\n\"},{\"CompletionText\":\"clhsdb.exe\",\"ListItemText\":\"clhsdb.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\clhsdb.exe\"},{\"CompletionText\":\"clhy\",\"ListItemText\":\"clhy\",\"ResultType\":2,\"ToolTip\":\"Clear-History\"},{\"CompletionText\":\"cli\",\"ListItemText\":\"cli\",\"ResultType\":2,\"ToolTip\":\"Clear-Item\"},{\"CompletionText\":\"cliconfg.exe\",\"ListItemText\":\"cliconfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cliconfg.exe\"},{\"CompletionText\":\"clip.exe\",\"ListItemText\":\"clip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\clip.exe\"},{\"CompletionText\":\"clipchamp.exe\",\"ListItemText\":\"clipchamp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\clipchamp.exe\"},{\"CompletionText\":\"ClipDLS.exe\",\"ListItemText\":\"ClipDLS.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ClipDLS.exe\"},{\"CompletionText\":\"ClipRenew.exe\",\"ListItemText\":\"ClipRenew.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ClipRenew.exe\"},{\"CompletionText\":\"ClipUp.exe\",\"ListItemText\":\"ClipUp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ClipUp.exe\"},{\"CompletionText\":\"Close-AzStorageFileHandle\",\"ListItemText\":\"Close-AzStorageFileHandle\",\"ResultType\":2,\"ToolTip\":\"Close-AzStorageFileHandle\\r\\n\"},{\"CompletionText\":\"Close-SmbOpenFile\",\"ListItemText\":\"Close-SmbOpenFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClose-SmbOpenFile \\r\\n\"},{\"CompletionText\":\"Close-SmbSession\",\"ListItemText\":\"Close-SmbSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nClose-SmbSession \\r\\n\"},{\"CompletionText\":\"CloudExperienceHostBroker.exe\",\"ListItemText\":\"CloudExperienceHostBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CloudExperienceHostBroker.exe\"},{\"CompletionText\":\"CloudNotifications.exe\",\"ListItemText\":\"CloudNotifications.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CloudNotifications.exe\"},{\"CompletionText\":\"clp\",\"ListItemText\":\"clp\",\"ResultType\":2,\"ToolTip\":\"Clear-ItemProperty\"},{\"CompletionText\":\"cls\",\"ListItemText\":\"cls\",\"ResultType\":2,\"ToolTip\":\"Clear-Host\"},{\"CompletionText\":\"clv\",\"ListItemText\":\"clv\",\"ResultType\":2,\"ToolTip\":\"Clear-Variable\"},{\"CompletionText\":\"cmd.exe\",\"ListItemText\":\"cmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmd.exe\"},{\"CompletionText\":\"cmdkey.exe\",\"ListItemText\":\"cmdkey.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmdkey.exe\"},{\"CompletionText\":\"cmdl32.exe\",\"ListItemText\":\"cmdl32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmdl32.exe\"},{\"CompletionText\":\"cmmon32.exe\",\"ListItemText\":\"cmmon32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmmon32.exe\"},{\"CompletionText\":\"cmpcfg\",\"ListItemText\":\"cmpcfg\",\"ResultType\":2,\"ToolTip\":\"cmpcfg\"},{\"CompletionText\":\"cmstp.exe\",\"ListItemText\":\"cmstp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cmstp.exe\"},{\"CompletionText\":\"cnsn\",\"ListItemText\":\"cnsn\",\"ResultType\":2,\"ToolTip\":\"Connect-PSSession\"},{\"CompletionText\":\"code-exploration.cmd\",\"ListItemText\":\"code-exploration.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Exploration\\\\bin\\\\code-exploration.cmd\"},{\"CompletionText\":\"code-insiders.cmd\",\"ListItemText\":\"code-insiders.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Insiders\\\\bin\\\\code-insiders.cmd\"},{\"CompletionText\":\"code-tunnel-exploration.exe\",\"ListItemText\":\"code-tunnel-exploration.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Exploration\\\\bin\\\\code-tunnel-exploration.exe\"},{\"CompletionText\":\"code-tunnel-insiders.exe\",\"ListItemText\":\"code-tunnel-insiders.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code Insiders\\\\bin\\\\code-tunnel-insiders.exe\"},{\"CompletionText\":\"code-tunnel.exe\",\"ListItemText\":\"code-tunnel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Microsoft VS Code\\\\bin\\\\code-tunnel.exe\"},{\"CompletionText\":\"code.cmd\",\"ListItemText\":\"code.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Microsoft VS Code\\\\bin\\\\code.cmd\"},{\"CompletionText\":\"cofire.exe\",\"ListItemText\":\"cofire.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cofire.exe\"},{\"CompletionText\":\"colorcpl.exe\",\"ListItemText\":\"colorcpl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\colorcpl.exe\"},{\"CompletionText\":\"com.docker.cli.exe\",\"ListItemText\":\"com.docker.cli.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\com.docker.cli.exe\"},{\"CompletionText\":\"comexp.msc\",\"ListItemText\":\"comexp.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\comexp.msc\"},{\"CompletionText\":\"comp.exe\",\"ListItemText\":\"comp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\comp.exe\"},{\"CompletionText\":\"compact.exe\",\"ListItemText\":\"compact.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\compact.exe\"},{\"CompletionText\":\"compare\",\"ListItemText\":\"compare\",\"ResultType\":2,\"ToolTip\":\"Compare-Object\"},{\"CompletionText\":\"Compare-Object\",\"ListItemText\":\"Compare-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCompare-Object [-ReferenceObject] [-DifferenceObject] [-SyncWindow ] [-Property ] [-ExcludeDifferent] [-IncludeEqual] [-PassThru] [-Culture ] [-CaseSensitive] []\\r\\n\"},{\"CompletionText\":\"Compare-VM\",\"ListItemText\":\"Compare-VM\",\"ResultType\":2,\"ToolTip\":\"Compare-VM\\r\\n\"},{\"CompletionText\":\"CompatTelRunner.exe\",\"ListItemText\":\"CompatTelRunner.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CompatTelRunner.exe\"},{\"CompletionText\":\"Complete-AzServiceBusMigration\",\"ListItemText\":\"Complete-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nComplete-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Complete-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Complete-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Complete-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Complete-BitsTransfer\",\"ListItemText\":\"Complete-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Complete-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Complete-DtcDiagnosticTransaction\",\"ListItemText\":\"Complete-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Complete-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"Complete-VMFailover\",\"ListItemText\":\"Complete-VMFailover\",\"ResultType\":2,\"ToolTip\":\"Complete-VMFailover\\r\\n\"},{\"CompletionText\":\"compmgmt.msc\",\"ListItemText\":\"compmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\compmgmt.msc\"},{\"CompletionText\":\"CompMgmtLauncher.exe\",\"ListItemText\":\"CompMgmtLauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CompMgmtLauncher.exe\"},{\"CompletionText\":\"CompPkgSrv.exe\",\"ListItemText\":\"CompPkgSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CompPkgSrv.exe\"},{\"CompletionText\":\"Compress-Archive\",\"ListItemText\":\"Compress-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCompress-Archive \\r\\n\"},{\"CompletionText\":\"ComputerDefaults.exe\",\"ListItemText\":\"ComputerDefaults.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ComputerDefaults.exe\"},{\"CompletionText\":\"Configuration\",\"ListItemText\":\"Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConfiguration \\r\\n\"},{\"CompletionText\":\"Confirm-AzSecurityAutomation\",\"ListItemText\":\"Confirm-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Confirm-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"Confirm-SecureBootUEFI\",\"ListItemText\":\"Confirm-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Confirm-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"conhost.exe\",\"ListItemText\":\"conhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\conhost.exe\"},{\"CompletionText\":\"Connect-AzAccount\",\"ListItemText\":\"Connect-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Connect-AzAccount\\r\\n\"},{\"CompletionText\":\"Connect-AzContainerRegistry\",\"ListItemText\":\"Connect-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"Connect-AzContainerRegistry\\r\\n\"},{\"CompletionText\":\"Connect-IscsiTarget\",\"ListItemText\":\"Connect-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConnect-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Connect-PSSession\",\"ListItemText\":\"Connect-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConnect-PSSession -Name [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-Session] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-ComputerName] [-ApplicationName ] [-ConfigurationName ] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession -ComputerName -InstanceId [-ApplicationName ] [-ConfigurationName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-ConnectionUri] [-ConfigurationName ] [-AllowRedirection] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-ConnectionUri] -InstanceId [-ConfigurationName ] [-AllowRedirection] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession -InstanceId [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nConnect-PSSession [-Id] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Connect-VirtualDisk\",\"ListItemText\":\"Connect-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConnect-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Connect-VMNetworkAdapter\",\"ListItemText\":\"Connect-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Connect-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Connect-VMSan\",\"ListItemText\":\"Connect-VMSan\",\"ResultType\":2,\"ToolTip\":\"Connect-VMSan\\r\\n\"},{\"CompletionText\":\"Connect-WSMan\",\"ListItemText\":\"Connect-WSMan\",\"ResultType\":2,\"ToolTip\":\"Connect-WSMan\\r\\n\"},{\"CompletionText\":\"consent.exe\",\"ListItemText\":\"consent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\consent.exe\"},{\"CompletionText\":\"Context\",\"ListItemText\":\"Context\",\"ResultType\":2,\"ToolTip\":\"\\r\\nContext \\r\\n\"},{\"CompletionText\":\"control.exe\",\"ListItemText\":\"control.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\control.exe\"},{\"CompletionText\":\"Convert-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Convert-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Convert-AzSqlDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Convert-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Convert-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Convert-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Convert-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ListItemText\":\"Convert-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Convert-AzSynapseSqlPoolVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Convert-Path\",\"ListItemText\":\"Convert-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvert-Path [-Path] []\\r\\n\\r\\nConvert-Path -LiteralPath []\\r\\n\"},{\"CompletionText\":\"Convert-VHD\",\"ListItemText\":\"Convert-VHD\",\"ResultType\":2,\"ToolTip\":\"Convert-VHD\\r\\n\"},{\"CompletionText\":\"convert.exe\",\"ListItemText\":\"convert.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\convert.exe\"},{\"CompletionText\":\"ConvertFrom-CIPolicy\",\"ListItemText\":\"ConvertFrom-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"ConvertFrom-CIPolicy\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Csv\",\"ListItemText\":\"ConvertFrom-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Csv [-InputObject] [[-Delimiter] ] [-Header ] []\\r\\n\\r\\nConvertFrom-Csv [-InputObject] -UseCulture [-Header ] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Json\",\"ListItemText\":\"ConvertFrom-Json\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Json [-InputObject] [-AsHashtable] [-Depth ] [-NoEnumerate] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Markdown\",\"ListItemText\":\"ConvertFrom-Markdown\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Markdown [-Path] [-AsVT100EncodedString] []\\r\\n\\r\\nConvertFrom-Markdown -LiteralPath [-AsVT100EncodedString] []\\r\\n\\r\\nConvertFrom-Markdown -InputObject [-AsVT100EncodedString] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-SddlString\",\"ListItemText\":\"ConvertFrom-SddlString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-SddlString [-Sddl] [-Type ] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-SecureString\",\"ListItemText\":\"ConvertFrom-SecureString\",\"ResultType\":2,\"ToolTip\":\"ConvertFrom-SecureString\\r\\n\"},{\"CompletionText\":\"ConvertFrom-StringData\",\"ListItemText\":\"ConvertFrom-StringData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-StringData [-StringData] [[-Delimiter] ] []\\r\\n\"},{\"CompletionText\":\"ConvertFrom-Yaml\",\"ListItemText\":\"ConvertFrom-Yaml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertFrom-Yaml \\r\\n\"},{\"CompletionText\":\"ConvertTo-AzVMManagedDisk\",\"ListItemText\":\"ConvertTo-AzVMManagedDisk\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-AzVMManagedDisk\\r\\n\"},{\"CompletionText\":\"ConvertTo-Csv\",\"ListItemText\":\"ConvertTo-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Csv [-InputObject] [[-Delimiter] ] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] []\\r\\n\\r\\nConvertTo-Csv [-InputObject] [-UseCulture] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-HgsKeyProtector\",\"ListItemText\":\"ConvertTo-HgsKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-HgsKeyProtector \\r\\n\"},{\"CompletionText\":\"ConvertTo-Html\",\"ListItemText\":\"ConvertTo-Html\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Html [[-Property] ] [[-Head] ] [[-Title] ] [[-Body] ] [-InputObject ] [-As ] [-CssUri ] [-PostContent ] [-PreContent ] [-Meta ] [-Charset ] [-Transitional] []\\r\\n\\r\\nConvertTo-Html [[-Property] ] [-InputObject ] [-As ] [-Fragment] [-PostContent ] [-PreContent ] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-Json\",\"ListItemText\":\"ConvertTo-Json\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Json [-InputObject] [-Depth ] [-Compress] [-EnumsAsStrings] [-AsArray] [-EscapeHandling ] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-ProcessMitigationPolicy\",\"ListItemText\":\"ConvertTo-ProcessMitigationPolicy\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-ProcessMitigationPolicy\\r\\n\"},{\"CompletionText\":\"ConvertTo-SecureString\",\"ListItemText\":\"ConvertTo-SecureString\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-SecureString\\r\\n\"},{\"CompletionText\":\"ConvertTo-TpmOwnerAuth\",\"ListItemText\":\"ConvertTo-TpmOwnerAuth\",\"ResultType\":2,\"ToolTip\":\"ConvertTo-TpmOwnerAuth\\r\\n\"},{\"CompletionText\":\"ConvertTo-Xml\",\"ListItemText\":\"ConvertTo-Xml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Xml [-InputObject] [-Depth ] [-NoTypeInformation] [-As ] []\\r\\n\"},{\"CompletionText\":\"ConvertTo-Yaml\",\"ListItemText\":\"ConvertTo-Yaml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nConvertTo-Yaml \\r\\n\"},{\"CompletionText\":\"convertvhd.exe\",\"ListItemText\":\"convertvhd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\convertvhd.exe\"},{\"CompletionText\":\"copy\",\"ListItemText\":\"copy\",\"ResultType\":2,\"ToolTip\":\"Copy-Item\"},{\"CompletionText\":\"Copy-AzRecoveryServicesVault\",\"ListItemText\":\"Copy-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Copy-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Copy-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Copy-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Copy-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Copy-AzStorageBlob\",\"ListItemText\":\"Copy-AzStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Copy-AzStorageBlob\\r\\n\"},{\"CompletionText\":\"Copy-BcdEntry\",\"ListItemText\":\"Copy-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"Copy-BcdEntry\\r\\n\"},{\"CompletionText\":\"Copy-Item\",\"ListItemText\":\"Copy-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-Item [-Path] [[-Destination] ] [-Container] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] [-FromSession ] [-ToSession ] []\\r\\n\\r\\nCopy-Item [[-Destination] ] -LiteralPath [-Container] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] [-FromSession ] [-ToSession ] []\\r\\n\"},{\"CompletionText\":\"Copy-ItemProperty\",\"ListItemText\":\"Copy-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-ItemProperty [-Path] [-Destination] [-Name] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nCopy-ItemProperty [-Destination] [-Name] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Copy-NetFirewallRule\",\"ListItemText\":\"Copy-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Copy-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecMainModeRule\",\"ListItemText\":\"Copy-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Copy-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Copy-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Copy-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Copy-NetIPsecRule\",\"ListItemText\":\"Copy-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCopy-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Copy-UserInternationalSettingsToSystem\",\"ListItemText\":\"Copy-UserInternationalSettingsToSystem\",\"ResultType\":2,\"ToolTip\":\"Copy-UserInternationalSettingsToSystem\\r\\n\"},{\"CompletionText\":\"Copy-VMFile\",\"ListItemText\":\"Copy-VMFile\",\"ResultType\":2,\"ToolTip\":\"Copy-VMFile\\r\\n\"},{\"CompletionText\":\"coredpussvr.exe\",\"ListItemText\":\"coredpussvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\coredpussvr.exe\"},{\"CompletionText\":\"corepack.cmd\",\"ListItemText\":\"corepack.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\corepack.cmd\"},{\"CompletionText\":\"cp\",\"ListItemText\":\"cp\",\"ResultType\":2,\"ToolTip\":\"Copy-Item\"},{\"CompletionText\":\"cpi\",\"ListItemText\":\"cpi\",\"ResultType\":2,\"ToolTip\":\"Copy-Item\"},{\"CompletionText\":\"cpp\",\"ListItemText\":\"cpp\",\"ResultType\":2,\"ToolTip\":\"Copy-ItemProperty\"},{\"CompletionText\":\"createdump.exe\",\"ListItemText\":\"createdump.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\WindowsApps\\\\Microsoft.PowerShell_7.4.2.0_x64__8wekyb3d8bbwe\\\\createdump.exe\"},{\"CompletionText\":\"CredentialEnrollmentManager.exe\",\"ListItemText\":\"CredentialEnrollmentManager.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CredentialEnrollmentManager.exe\"},{\"CompletionText\":\"CredentialUIBroker.exe\",\"ListItemText\":\"CredentialUIBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CredentialUIBroker.exe\"},{\"CompletionText\":\"credwiz.exe\",\"ListItemText\":\"credwiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\credwiz.exe\"},{\"CompletionText\":\"cscript.exe\",\"ListItemText\":\"cscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cscript.exe\"},{\"CompletionText\":\"csrss.exe\",\"ListItemText\":\"csrss.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\csrss.exe\"},{\"CompletionText\":\"cssmbo\",\"ListItemText\":\"cssmbo\",\"ResultType\":2,\"ToolTip\":\"cssmbo\"},{\"CompletionText\":\"cssmbse\",\"ListItemText\":\"cssmbse\",\"ResultType\":2,\"ToolTip\":\"cssmbse\"},{\"CompletionText\":\"ctfmon.exe\",\"ListItemText\":\"ctfmon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ctfmon.exe\"},{\"CompletionText\":\"cttune.exe\",\"ListItemText\":\"cttune.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cttune.exe\"},{\"CompletionText\":\"cttunesvr.exe\",\"ListItemText\":\"cttunesvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\cttunesvr.exe\"},{\"CompletionText\":\"cty\",\"ListItemText\":\"cty\",\"ResultType\":2,\"ToolTip\":\"cty\"},{\"CompletionText\":\"curl.exe\",\"ListItemText\":\"curl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\curl.exe\"},{\"CompletionText\":\"CustomInstallExec.exe\",\"ListItemText\":\"CustomInstallExec.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CustomInstallExec.exe\"},{\"CompletionText\":\"CustomShellHost.exe\",\"ListItemText\":\"CustomShellHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\CustomShellHost.exe\"},{\"CompletionText\":\"cvpa\",\"ListItemText\":\"cvpa\",\"ResultType\":2,\"ToolTip\":\"Convert-Path\"},{\"CompletionText\":\"d3dconfig.exe\",\"ListItemText\":\"d3dconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\d3dconfig.exe\"},{\"CompletionText\":\"D:\",\"ListItemText\":\"D:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nD: \\r\\n\"},{\"CompletionText\":\"dasHost.exe\",\"ListItemText\":\"dasHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dasHost.exe\"},{\"CompletionText\":\"DataExchangeHost.exe\",\"ListItemText\":\"DataExchangeHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DataExchangeHost.exe\"},{\"CompletionText\":\"DataStoreCacheDumpTool.exe\",\"ListItemText\":\"DataStoreCacheDumpTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DataStoreCacheDumpTool.exe\"},{\"CompletionText\":\"dbp\",\"ListItemText\":\"dbp\",\"ResultType\":2,\"ToolTip\":\"Disable-PSBreakpoint\"},{\"CompletionText\":\"dccw.exe\",\"ListItemText\":\"dccw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dccw.exe\"},{\"CompletionText\":\"dcomcnfg.exe\",\"ListItemText\":\"dcomcnfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dcomcnfg.exe\"},{\"CompletionText\":\"ddodiag.exe\",\"ListItemText\":\"ddodiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ddodiag.exe\"},{\"CompletionText\":\"debian.exe\",\"ListItemText\":\"debian.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\debian.exe\"},{\"CompletionText\":\"Debug-FileShare\",\"ListItemText\":\"Debug-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-FileShare \\r\\n\"},{\"CompletionText\":\"Debug-Job\",\"ListItemText\":\"Debug-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Job [-Job] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Job [-Name] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Job [-Id] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Job [-InstanceId] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Debug-MMAppPrelaunch\",\"ListItemText\":\"Debug-MMAppPrelaunch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-MMAppPrelaunch \\r\\n\"},{\"CompletionText\":\"Debug-Process\",\"ListItemText\":\"Debug-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Process [-Name] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Process [-Id] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Process -InputObject [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Debug-Runspace\",\"ListItemText\":\"Debug-Runspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Runspace [-Runspace] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Runspace [-Name] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Runspace [-Id] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDebug-Runspace [-InstanceId] [-BreakAll] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Debug-StorageSubSystem\",\"ListItemText\":\"Debug-StorageSubSystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-StorageSubSystem \\r\\n\"},{\"CompletionText\":\"Debug-VM\",\"ListItemText\":\"Debug-VM\",\"ResultType\":2,\"ToolTip\":\"Debug-VM\\r\\n\"},{\"CompletionText\":\"Debug-Volume\",\"ListItemText\":\"Debug-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDebug-Volume \\r\\n\"},{\"CompletionText\":\"Defrag.exe\",\"ListItemText\":\"Defrag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Defrag.exe\"},{\"CompletionText\":\"del\",\"ListItemText\":\"del\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"Delete-DeliveryOptimizationCache\",\"ListItemText\":\"Delete-DeliveryOptimizationCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDelete-DeliveryOptimizationCache \\r\\n\"},{\"CompletionText\":\"Deny-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Deny-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDeny-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Deny-AzPrivateEndpointConnection\",\"ListItemText\":\"Deny-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Deny-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Deny-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Deny-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDeny-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Deploy-AzNetworkManagerCommit\",\"ListItemText\":\"Deploy-AzNetworkManagerCommit\",\"ResultType\":2,\"ToolTip\":\"Deploy-AzNetworkManagerCommit\\r\\n\"},{\"CompletionText\":\"deploymentcsphelper.exe\",\"ListItemText\":\"deploymentcsphelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\deploymentcsphelper.exe\"},{\"CompletionText\":\"Describe\",\"ListItemText\":\"Describe\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDescribe \\r\\n\"},{\"CompletionText\":\"desk.cpl\",\"ListItemText\":\"desk.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\desk.cpl\"},{\"CompletionText\":\"desktopimgdownldr.exe\",\"ListItemText\":\"desktopimgdownldr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\desktopimgdownldr.exe\"},{\"CompletionText\":\"DeviceCensus.exe\",\"ListItemText\":\"DeviceCensus.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceCensus.exe\"},{\"CompletionText\":\"DeviceCredentialDeployment.exe\",\"ListItemText\":\"DeviceCredentialDeployment.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceCredentialDeployment.exe\"},{\"CompletionText\":\"DeviceEject.exe\",\"ListItemText\":\"DeviceEject.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceEject.exe\"},{\"CompletionText\":\"DeviceEnroller.exe\",\"ListItemText\":\"DeviceEnroller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceEnroller.exe\"},{\"CompletionText\":\"DevicePairingWizard.exe\",\"ListItemText\":\"DevicePairingWizard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DevicePairingWizard.exe\"},{\"CompletionText\":\"DeviceProperties.exe\",\"ListItemText\":\"DeviceProperties.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DeviceProperties.exe\"},{\"CompletionText\":\"devmgmt.msc\",\"ListItemText\":\"devmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\devmgmt.msc\"},{\"CompletionText\":\"DevModeRunAsUserConfig.msc\",\"ListItemText\":\"DevModeRunAsUserConfig.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DevModeRunAsUserConfig.msc\"},{\"CompletionText\":\"DFDWiz.exe\",\"ListItemText\":\"DFDWiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DFDWiz.exe\"},{\"CompletionText\":\"dfrgui.exe\",\"ListItemText\":\"dfrgui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dfrgui.exe\"},{\"CompletionText\":\"dialer.exe\",\"ListItemText\":\"dialer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dialer.exe\"},{\"CompletionText\":\"diff\",\"ListItemText\":\"diff\",\"ResultType\":2,\"ToolTip\":\"Compare-Object\"},{\"CompletionText\":\"dir\",\"ListItemText\":\"dir\",\"ResultType\":2,\"ToolTip\":\"Get-ChildItem\"},{\"CompletionText\":\"directxdatabaseupdater.exe\",\"ListItemText\":\"directxdatabaseupdater.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\directxdatabaseupdater.exe\"},{\"CompletionText\":\"dirmngr.exe\",\"ListItemText\":\"dirmngr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\dirmngr.exe\"},{\"CompletionText\":\"dirmngr_ldap.exe\",\"ListItemText\":\"dirmngr_ldap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\dirmngr_ldap.exe\"},{\"CompletionText\":\"Disable-AppBackgroundTaskDiagnosticLog\",\"ListItemText\":\"Disable-AppBackgroundTaskDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Disable-AppBackgroundTaskDiagnosticLog\\r\\n\"},{\"CompletionText\":\"Disable-AzAdvisorRecommendation\",\"ListItemText\":\"Disable-AzAdvisorRecommendation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzAdvisorRecommendation \\r\\n\"},{\"CompletionText\":\"Disable-AzAksAddOn\",\"ListItemText\":\"Disable-AzAksAddOn\",\"ResultType\":2,\"ToolTip\":\"Disable-AzAksAddOn\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchAutoScale\",\"ListItemText\":\"Disable-AzBatchAutoScale\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchAutoScale\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchComputeNodeScheduling\",\"ListItemText\":\"Disable-AzBatchComputeNodeScheduling\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchComputeNodeScheduling\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchJob\",\"ListItemText\":\"Disable-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Disable-AzBatchJobSchedule\",\"ListItemText\":\"Disable-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Disable-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Disable-AzCdnCustomDomainCustomHttps\",\"ListItemText\":\"Disable-AzCdnCustomDomainCustomHttps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzCdnCustomDomainCustomHttps \\r\\n\"},{\"CompletionText\":\"Disable-AzContextAutosave\",\"ListItemText\":\"Disable-AzContextAutosave\",\"ResultType\":2,\"ToolTip\":\"Disable-AzContextAutosave\\r\\n\"},{\"CompletionText\":\"Disable-AzDataCollection\",\"ListItemText\":\"Disable-AzDataCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzDataCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzFrontDoorCustomDomainHttps\",\"ListItemText\":\"Disable-AzFrontDoorCustomDomainHttps\",\"ResultType\":2,\"ToolTip\":\"Disable-AzFrontDoorCustomDomainHttps\\r\\n\"},{\"CompletionText\":\"Disable-AzHDInsightAzureMonitor\",\"ListItemText\":\"Disable-AzHDInsightAzureMonitor\",\"ResultType\":2,\"ToolTip\":\"Disable-AzHDInsightAzureMonitor\\r\\n\"},{\"CompletionText\":\"Disable-AzHDInsightMonitoring\",\"ListItemText\":\"Disable-AzHDInsightMonitoring\",\"ResultType\":2,\"ToolTip\":\"Disable-AzHDInsightMonitoring\\r\\n\"},{\"CompletionText\":\"Disable-AzIotSecurityAnalyticsAggregatedAlert\",\"ListItemText\":\"Disable-AzIotSecurityAnalyticsAggregatedAlert\",\"ResultType\":2,\"ToolTip\":\"Disable-AzIotSecurityAnalyticsAggregatedAlert\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsIISLogCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsIISLogCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsIISLogCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsLinuxCustomLogCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsLinuxCustomLogCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsLinuxCustomLogCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsLinuxPerformanceCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsLinuxPerformanceCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsLinuxPerformanceCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzOperationalInsightsLinuxSyslogCollection\",\"ListItemText\":\"Disable-AzOperationalInsightsLinuxSyslogCollection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzOperationalInsightsLinuxSyslogCollection\\r\\n\"},{\"CompletionText\":\"Disable-AzRecoveryServicesBackupAutoProtection\",\"ListItemText\":\"Disable-AzRecoveryServicesBackupAutoProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzRecoveryServicesBackupAutoProtection\\r\\n\"},{\"CompletionText\":\"Disable-AzRecoveryServicesBackupProtection\",\"ListItemText\":\"Disable-AzRecoveryServicesBackupProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzRecoveryServicesBackupProtection\\r\\n\"},{\"CompletionText\":\"Disable-AzRecoveryServicesBackupRPMountScript\",\"ListItemText\":\"Disable-AzRecoveryServicesBackupRPMountScript\",\"ResultType\":2,\"ToolTip\":\"Disable-AzRecoveryServicesBackupRPMountScript\\r\\n\"},{\"CompletionText\":\"Disable-AzSecurityAdvancedThreatProtection\",\"ListItemText\":\"Disable-AzSecurityAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSecurityAdvancedThreatProtection\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlDatabaseLedgerDigestUpload\",\"ListItemText\":\"Disable-AzSqlDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlDatabaseSensitivityRecommendation\",\"ListItemText\":\"Disable-AzSqlDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Disable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceAdvancedDataSecurity\",\"ListItemText\":\"Disable-AzSqlInstanceAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ListItemText\":\"Disable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ListItemText\":\"Disable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlInstanceDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Disable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlServerActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Disable-AzSqlServerAdvancedDataSecurity\",\"ListItemText\":\"Disable-AzSqlServerAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSqlServerAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Disable-AzStackHCIAttestation\",\"ListItemText\":\"Disable-AzStackHCIAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzStackHCIAttestation \\r\\n\"},{\"CompletionText\":\"Disable-AzStackHCIRemoteSupport\",\"ListItemText\":\"Disable-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Disable-AzStorageBlobDeleteRetentionPolicy\",\"ListItemText\":\"Disable-AzStorageBlobDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageBlobDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageBlobLastAccessTimeTracking\",\"ListItemText\":\"Disable-AzStorageBlobLastAccessTimeTracking\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageBlobLastAccessTimeTracking\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageBlobRestorePolicy\",\"ListItemText\":\"Disable-AzStorageBlobRestorePolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageBlobRestorePolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageContainerDeleteRetentionPolicy\",\"ListItemText\":\"Disable-AzStorageContainerDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageContainerDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageDeleteRetentionPolicy\",\"ListItemText\":\"Disable-AzStorageDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Disable-AzStorageSoftDelete\",\"ListItemText\":\"Disable-AzStorageSoftDelete\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageSoftDelete\"},{\"CompletionText\":\"Disable-AzStorageStaticWebsite\",\"ListItemText\":\"Disable-AzStorageStaticWebsite\",\"ResultType\":2,\"ToolTip\":\"Disable-AzStorageStaticWebsite\\r\\n\"},{\"CompletionText\":\"Disable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Disable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Disable-AzSynapseSqlAdvancedDataSecurity\",\"ListItemText\":\"Disable-AzSynapseSqlAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseSqlAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Disable-AzSynapseSqlAdvancedThreatProtection\",\"ListItemText\":\"Disable-AzSynapseSqlAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseSqlAdvancedThreatProtection\"},{\"CompletionText\":\"Disable-AzSynapseSqlPoolSensitivityRecommendation\",\"ListItemText\":\"Disable-AzSynapseSqlPoolSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Disable-AzSynapseSqlPoolSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Disable-AzTrafficManagerEndpoint\",\"ListItemText\":\"Disable-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Disable-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Disable-AzTrafficManagerProfile\",\"ListItemText\":\"Disable-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Disable-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Disable-AzureRmAlias\",\"ListItemText\":\"Disable-AzureRmAlias\",\"ResultType\":2,\"ToolTip\":\"Disable-AzureRmAlias\\r\\n\"},{\"CompletionText\":\"Disable-AzVMDiskEncryption\",\"ListItemText\":\"Disable-AzVMDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Disable-AzVMDiskEncryption\\r\\n\"},{\"CompletionText\":\"Disable-AzVmssDiskEncryption\",\"ListItemText\":\"Disable-AzVmssDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Disable-AzVmssDiskEncryption\\r\\n\"},{\"CompletionText\":\"Disable-BC\",\"ListItemText\":\"Disable-BC\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BC \\r\\n\"},{\"CompletionText\":\"Disable-BcdElementBootDebug\",\"ListItemText\":\"Disable-BcdElementBootDebug\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementBootDebug\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementBootEms\",\"ListItemText\":\"Disable-BcdElementBootEms\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementBootEms\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementDebug\",\"ListItemText\":\"Disable-BcdElementDebug\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementDebug\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementEms\",\"ListItemText\":\"Disable-BcdElementEms\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementEms\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementEventLogging\",\"ListItemText\":\"Disable-BcdElementEventLogging\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementEventLogging\\r\\n\"},{\"CompletionText\":\"Disable-BcdElementHypervisorDebug\",\"ListItemText\":\"Disable-BcdElementHypervisorDebug\",\"ResultType\":2,\"ToolTip\":\"Disable-BcdElementHypervisorDebug\\r\\n\"},{\"CompletionText\":\"Disable-BCDowngrading\",\"ListItemText\":\"Disable-BCDowngrading\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BCDowngrading \\r\\n\"},{\"CompletionText\":\"Disable-BCServeOnBattery\",\"ListItemText\":\"Disable-BCServeOnBattery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BCServeOnBattery \\r\\n\"},{\"CompletionText\":\"Disable-BitLocker\",\"ListItemText\":\"Disable-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BitLocker \\r\\n\"},{\"CompletionText\":\"Disable-BitLockerAutoUnlock\",\"ListItemText\":\"Disable-BitLockerAutoUnlock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-BitLockerAutoUnlock \\r\\n\"},{\"CompletionText\":\"Disable-DAManualEntryPointSelection\",\"ListItemText\":\"Disable-DAManualEntryPointSelection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-DAManualEntryPointSelection \\r\\n\"},{\"CompletionText\":\"Disable-DeliveryOptimizationVerboseLogs\",\"ListItemText\":\"Disable-DeliveryOptimizationVerboseLogs\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-DeliveryOptimizationVerboseLogs \\r\\n\"},{\"CompletionText\":\"Disable-DscDebug\",\"ListItemText\":\"Disable-DscDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-DscDebug \\r\\n\"},{\"CompletionText\":\"Disable-ExperimentalFeature\",\"ListItemText\":\"Disable-ExperimentalFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-ExperimentalFeature [-Name] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-JobTrigger\",\"ListItemText\":\"Disable-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Disable-JobTrigger\\r\\n\"},{\"CompletionText\":\"Disable-LocalUser\",\"ListItemText\":\"Disable-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Disable-LocalUser\\r\\n\"},{\"CompletionText\":\"Disable-MMAgent\",\"ListItemText\":\"Disable-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-MMAgent \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapter\",\"ListItemText\":\"Disable-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapter \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterBinding\",\"ListItemText\":\"Disable-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterChecksumOffload\",\"ListItemText\":\"Disable-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Disable-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterIPsecOffload\",\"ListItemText\":\"Disable-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterLso\",\"ListItemText\":\"Disable-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterPacketDirect\",\"ListItemText\":\"Disable-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterPowerManagement\",\"ListItemText\":\"Disable-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterQos\",\"ListItemText\":\"Disable-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterRdma\",\"ListItemText\":\"Disable-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterRsc\",\"ListItemText\":\"Disable-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterRss\",\"ListItemText\":\"Disable-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterSriov\",\"ListItemText\":\"Disable-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterUso\",\"ListItemText\":\"Disable-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Disable-NetAdapterVmq\",\"ListItemText\":\"Disable-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Disable-NetDnsTransitionConfiguration\",\"ListItemText\":\"Disable-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Disable-NetFirewallHyperVRule\",\"ListItemText\":\"Disable-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Disable-NetFirewallRule\",\"ListItemText\":\"Disable-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Disable-NetIPHttpsProfile\",\"ListItemText\":\"Disable-NetIPHttpsProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetIPHttpsProfile \\r\\n\"},{\"CompletionText\":\"Disable-NetIPsecMainModeRule\",\"ListItemText\":\"Disable-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Disable-NetIPsecRule\",\"ListItemText\":\"Disable-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Disable-NetNatTransitionConfiguration\",\"ListItemText\":\"Disable-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Disable-NetworkSwitchEthernetPort\",\"ListItemText\":\"Disable-NetworkSwitchEthernetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetworkSwitchEthernetPort \\r\\n\"},{\"CompletionText\":\"Disable-NetworkSwitchFeature\",\"ListItemText\":\"Disable-NetworkSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetworkSwitchFeature \\r\\n\"},{\"CompletionText\":\"Disable-NetworkSwitchVlan\",\"ListItemText\":\"Disable-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Disable-OdbcPerfCounter\",\"ListItemText\":\"Disable-OdbcPerfCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-OdbcPerfCounter \\r\\n\"},{\"CompletionText\":\"Disable-PhysicalDiskIdentification\",\"ListItemText\":\"Disable-PhysicalDiskIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PhysicalDiskIdentification \\r\\n\"},{\"CompletionText\":\"Disable-PhysicalDiskIndication\",\"ListItemText\":\"Disable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"Disable-PhysicalDiskIndication\"},{\"CompletionText\":\"Disable-PnpDevice\",\"ListItemText\":\"Disable-PnpDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PnpDevice \\r\\n\"},{\"CompletionText\":\"Disable-PSBreakpoint\",\"ListItemText\":\"Disable-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSBreakpoint [-Breakpoint] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisable-PSBreakpoint [-Id] [-PassThru] [-Runspace ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-PSRemoting\",\"ListItemText\":\"Disable-PSRemoting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSRemoting [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-PSSessionConfiguration\",\"ListItemText\":\"Disable-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSSessionConfiguration [[-Name] ] [-Force] [-NoServiceRestart] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disable-PSTrace\",\"ListItemText\":\"Disable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSTrace \\r\\n\"},{\"CompletionText\":\"Disable-PSWSManCombinedTrace\",\"ListItemText\":\"Disable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"Disable-RunspaceDebug\",\"ListItemText\":\"Disable-RunspaceDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-RunspaceDebug [[-RunspaceName] ] []\\r\\n\\r\\nDisable-RunspaceDebug [-Runspace] []\\r\\n\\r\\nDisable-RunspaceDebug [-RunspaceId] []\\r\\n\\r\\nDisable-RunspaceDebug [-RunspaceInstanceId] []\\r\\n\\r\\nDisable-RunspaceDebug [[-ProcessName] ] [[-AppDomainName] ] []\\r\\n\"},{\"CompletionText\":\"Disable-ScheduledJob\",\"ListItemText\":\"Disable-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Disable-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Disable-ScheduledTask\",\"ListItemText\":\"Disable-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Disable-SmbDelegation\",\"ListItemText\":\"Disable-SmbDelegation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-SmbDelegation \\r\\n\"},{\"CompletionText\":\"Disable-StorageBusCache\",\"ListItemText\":\"Disable-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Disable-StorageBusDisk\",\"ListItemText\":\"Disable-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Disable-StorageDataCollection\",\"ListItemText\":\"Disable-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Disable-StorageDiagnosticLog\",\"ListItemText\":\"Disable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Disable-StorageDiagnosticLog\"},{\"CompletionText\":\"Disable-StorageEnclosureIdentification\",\"ListItemText\":\"Disable-StorageEnclosureIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageEnclosureIdentification \\r\\n\"},{\"CompletionText\":\"Disable-StorageEnclosurePower\",\"ListItemText\":\"Disable-StorageEnclosurePower\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageEnclosurePower \\r\\n\"},{\"CompletionText\":\"Disable-StorageHighAvailability\",\"ListItemText\":\"Disable-StorageHighAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageHighAvailability \\r\\n\"},{\"CompletionText\":\"Disable-StorageMaintenanceMode\",\"ListItemText\":\"Disable-StorageMaintenanceMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-StorageMaintenanceMode \\r\\n\"},{\"CompletionText\":\"Disable-TlsCipherSuite\",\"ListItemText\":\"Disable-TlsCipherSuite\",\"ResultType\":2,\"ToolTip\":\"Disable-TlsCipherSuite\\r\\n\"},{\"CompletionText\":\"Disable-TlsEccCurve\",\"ListItemText\":\"Disable-TlsEccCurve\",\"ResultType\":2,\"ToolTip\":\"Disable-TlsEccCurve\\r\\n\"},{\"CompletionText\":\"Disable-TlsSessionTicketKey\",\"ListItemText\":\"Disable-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"Disable-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"Disable-TpmAutoProvisioning\",\"ListItemText\":\"Disable-TpmAutoProvisioning\",\"ResultType\":2,\"ToolTip\":\"Disable-TpmAutoProvisioning\\r\\n\"},{\"CompletionText\":\"Disable-VMConsoleSupport\",\"ListItemText\":\"Disable-VMConsoleSupport\",\"ResultType\":2,\"ToolTip\":\"Disable-VMConsoleSupport\\r\\n\"},{\"CompletionText\":\"Disable-VMEventing\",\"ListItemText\":\"Disable-VMEventing\",\"ResultType\":2,\"ToolTip\":\"Disable-VMEventing\\r\\n\"},{\"CompletionText\":\"Disable-VMIntegrationService\",\"ListItemText\":\"Disable-VMIntegrationService\",\"ResultType\":2,\"ToolTip\":\"Disable-VMIntegrationService\\r\\n\"},{\"CompletionText\":\"Disable-VMMigration\",\"ListItemText\":\"Disable-VMMigration\",\"ResultType\":2,\"ToolTip\":\"Disable-VMMigration\\r\\n\"},{\"CompletionText\":\"Disable-VMRemoteFXPhysicalVideoAdapter\",\"ListItemText\":\"Disable-VMRemoteFXPhysicalVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Disable-VMRemoteFXPhysicalVideoAdapter\\r\\n\"},{\"CompletionText\":\"Disable-VMResourceMetering\",\"ListItemText\":\"Disable-VMResourceMetering\",\"ResultType\":2,\"ToolTip\":\"Disable-VMResourceMetering\\r\\n\"},{\"CompletionText\":\"Disable-VMSwitchExtension\",\"ListItemText\":\"Disable-VMSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Disable-VMSwitchExtension\\r\\n\"},{\"CompletionText\":\"Disable-VMTPM\",\"ListItemText\":\"Disable-VMTPM\",\"ResultType\":2,\"ToolTip\":\"Disable-VMTPM\\r\\n\"},{\"CompletionText\":\"Disable-WdacBidTrace\",\"ListItemText\":\"Disable-WdacBidTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-WdacBidTrace \\r\\n\"},{\"CompletionText\":\"Disable-WindowsErrorReporting\",\"ListItemText\":\"Disable-WindowsErrorReporting\",\"ResultType\":2,\"ToolTip\":\"Disable-WindowsErrorReporting\\r\\n\"},{\"CompletionText\":\"Disable-WindowsOptionalFeature\",\"ListItemText\":\"Disable-WindowsOptionalFeature\",\"ResultType\":2,\"ToolTip\":\"Disable-WindowsOptionalFeature\\r\\n\"},{\"CompletionText\":\"Disable-WSManCredSSP\",\"ListItemText\":\"Disable-WSManCredSSP\",\"ResultType\":2,\"ToolTip\":\"Disable-WSManCredSSP\\r\\n\"},{\"CompletionText\":\"Disable-WSManTrace\",\"ListItemText\":\"Disable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-WSManTrace \\r\\n\"},{\"CompletionText\":\"Disconnect-AzAccount\",\"ListItemText\":\"Disconnect-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Disconnect-AzAccount\\r\\n\"},{\"CompletionText\":\"Disconnect-AzP2sVpnGatewayVpnConnection\",\"ListItemText\":\"Disconnect-AzP2sVpnGatewayVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Disconnect-AzP2sVpnGatewayVpnConnection\\r\\n\"},{\"CompletionText\":\"Disconnect-AzVirtualNetworkGatewayVpnConnection\",\"ListItemText\":\"Disconnect-AzVirtualNetworkGatewayVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Disconnect-AzVirtualNetworkGatewayVpnConnection\\r\\n\"},{\"CompletionText\":\"Disconnect-AzWvdUserSession\",\"ListItemText\":\"Disconnect-AzWvdUserSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-AzWvdUserSession \\r\\n\"},{\"CompletionText\":\"Disconnect-IscsiTarget\",\"ListItemText\":\"Disconnect-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Disconnect-PSSession\",\"ListItemText\":\"Disconnect-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-PSSession [-Session] [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisconnect-PSSession -Name [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisconnect-PSSession [-Id] [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nDisconnect-PSSession -InstanceId [-IdleTimeoutSec ] [-OutputBufferingMode ] [-ThrottleLimit ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Disconnect-VirtualDisk\",\"ListItemText\":\"Disconnect-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisconnect-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Disconnect-VMNetworkAdapter\",\"ListItemText\":\"Disconnect-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Disconnect-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Disconnect-VMSan\",\"ListItemText\":\"Disconnect-VMSan\",\"ResultType\":2,\"ToolTip\":\"Disconnect-VMSan\\r\\n\"},{\"CompletionText\":\"Disconnect-WSMan\",\"ListItemText\":\"Disconnect-WSMan\",\"ResultType\":2,\"ToolTip\":\"Disconnect-WSMan\\r\\n\"},{\"CompletionText\":\"diskmgmt.msc\",\"ListItemText\":\"diskmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskmgmt.msc\"},{\"CompletionText\":\"diskpart.exe\",\"ListItemText\":\"diskpart.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskpart.exe\"},{\"CompletionText\":\"diskperf.exe\",\"ListItemText\":\"diskperf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskperf.exe\"},{\"CompletionText\":\"diskraid.exe\",\"ListItemText\":\"diskraid.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskraid.exe\"},{\"CompletionText\":\"DiskSnapshot.exe\",\"ListItemText\":\"DiskSnapshot.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DiskSnapshot.exe\"},{\"CompletionText\":\"diskusage.exe\",\"ListItemText\":\"diskusage.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\diskusage.exe\"},{\"CompletionText\":\"Dism.exe\",\"ListItemText\":\"Dism.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Dism.exe\"},{\"CompletionText\":\"Dismount-AppPackageVolume\",\"ListItemText\":\"Dismount-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Dismount-AppPackageVolume\"},{\"CompletionText\":\"Dismount-AppxVolume\",\"ListItemText\":\"Dismount-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Dismount-AppxVolume\\r\\n\"},{\"CompletionText\":\"Dismount-DiskImage\",\"ListItemText\":\"Dismount-DiskImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDismount-DiskImage \\r\\n\"},{\"CompletionText\":\"Dismount-VHD\",\"ListItemText\":\"Dismount-VHD\",\"ResultType\":2,\"ToolTip\":\"Dismount-VHD\\r\\n\"},{\"CompletionText\":\"Dismount-VMHostAssignableDevice\",\"ListItemText\":\"Dismount-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Dismount-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Dismount-WindowsImage\",\"ListItemText\":\"Dismount-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Dismount-WindowsImage\\r\\n\"},{\"CompletionText\":\"dispdiag.exe\",\"ListItemText\":\"dispdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dispdiag.exe\"},{\"CompletionText\":\"DisplaySwitch.exe\",\"ListItemText\":\"DisplaySwitch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DisplaySwitch.exe\"},{\"CompletionText\":\"djoin.exe\",\"ListItemText\":\"djoin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\djoin.exe\"},{\"CompletionText\":\"dllhost.exe\",\"ListItemText\":\"dllhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dllhost.exe\"},{\"CompletionText\":\"dllhst3g.exe\",\"ListItemText\":\"dllhst3g.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dllhst3g.exe\"},{\"CompletionText\":\"dlu\",\"ListItemText\":\"dlu\",\"ResultType\":2,\"ToolTip\":\"dlu\"},{\"CompletionText\":\"dmcertinst.exe\",\"ListItemText\":\"dmcertinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dmcertinst.exe\"},{\"CompletionText\":\"dmcfghost.exe\",\"ListItemText\":\"dmcfghost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dmcfghost.exe\"},{\"CompletionText\":\"dmclient.exe\",\"ListItemText\":\"dmclient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dmclient.exe\"},{\"CompletionText\":\"DmNotificationBroker.exe\",\"ListItemText\":\"DmNotificationBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DmNotificationBroker.exe\"},{\"CompletionText\":\"DmOmaCpMo.exe\",\"ListItemText\":\"DmOmaCpMo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DmOmaCpMo.exe\"},{\"CompletionText\":\"dnscacheugc.exe\",\"ListItemText\":\"dnscacheugc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dnscacheugc.exe\"},{\"CompletionText\":\"dnsn\",\"ListItemText\":\"dnsn\",\"ResultType\":2,\"ToolTip\":\"Disconnect-PSSession\"},{\"CompletionText\":\"docker-compose.exe\",\"ListItemText\":\"docker-compose.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-compose.exe\"},{\"CompletionText\":\"docker-credential-desktop.exe\",\"ListItemText\":\"docker-credential-desktop.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-credential-desktop.exe\"},{\"CompletionText\":\"docker-credential-ecr-login.exe\",\"ListItemText\":\"docker-credential-ecr-login.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-credential-ecr-login.exe\"},{\"CompletionText\":\"docker-credential-wincred.exe\",\"ListItemText\":\"docker-credential-wincred.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-credential-wincred.exe\"},{\"CompletionText\":\"docker-index.exe\",\"ListItemText\":\"docker-index.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker-index.exe\"},{\"CompletionText\":\"docker.exe\",\"ListItemText\":\"docker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker.exe\"},{\"CompletionText\":\"doskey.exe\",\"ListItemText\":\"doskey.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\doskey.exe\"},{\"CompletionText\":\"dotnet.exe\",\"ListItemText\":\"dotnet.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\dotnet\\\\dotnet.exe\"},{\"CompletionText\":\"dpapimig.exe\",\"ListItemText\":\"dpapimig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dpapimig.exe\"},{\"CompletionText\":\"DpiScaling.exe\",\"ListItemText\":\"DpiScaling.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DpiScaling.exe\"},{\"CompletionText\":\"dpnsvr.exe\",\"ListItemText\":\"dpnsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dpnsvr.exe\"},{\"CompletionText\":\"driverquery.exe\",\"ListItemText\":\"driverquery.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\driverquery.exe\"},{\"CompletionText\":\"drvinst.exe\",\"ListItemText\":\"drvinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\drvinst.exe\"},{\"CompletionText\":\"dsmbd\",\"ListItemText\":\"dsmbd\",\"ResultType\":2,\"ToolTip\":\"dsmbd\"},{\"CompletionText\":\"DsmUserTask.exe\",\"ListItemText\":\"DsmUserTask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DsmUserTask.exe\"},{\"CompletionText\":\"dsregcmd.exe\",\"ListItemText\":\"dsregcmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dsregcmd.exe\"},{\"CompletionText\":\"dstokenclean.exe\",\"ListItemText\":\"dstokenclean.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dstokenclean.exe\"},{\"CompletionText\":\"dtdump.exe\",\"ListItemText\":\"dtdump.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dtdump.exe\"},{\"CompletionText\":\"DuckDuckGo.exe\",\"ListItemText\":\"DuckDuckGo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\DuckDuckGo.exe\"},{\"CompletionText\":\"dusmtask.exe\",\"ListItemText\":\"dusmtask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dusmtask.exe\"},{\"CompletionText\":\"dvdplay.exe\",\"ListItemText\":\"dvdplay.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dvdplay.exe\"},{\"CompletionText\":\"dwm.exe\",\"ListItemText\":\"dwm.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dwm.exe\"},{\"CompletionText\":\"DWWIN.EXE\",\"ListItemText\":\"DWWIN.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DWWIN.EXE\"},{\"CompletionText\":\"DXCap.exe\",\"ListItemText\":\"DXCap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DXCap.exe\"},{\"CompletionText\":\"DXCpl.exe\",\"ListItemText\":\"DXCpl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\DXCpl.exe\"},{\"CompletionText\":\"dxdiag.exe\",\"ListItemText\":\"dxdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dxdiag.exe\"},{\"CompletionText\":\"dxgiadaptercache.exe\",\"ListItemText\":\"dxgiadaptercache.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\dxgiadaptercache.exe\"},{\"CompletionText\":\"Dxpserver.exe\",\"ListItemText\":\"Dxpserver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Dxpserver.exe\"},{\"CompletionText\":\"E:\",\"ListItemText\":\"E:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nE: \\r\\n\"},{\"CompletionText\":\"Eap3Host.exe\",\"ListItemText\":\"Eap3Host.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Eap3Host.exe\"},{\"CompletionText\":\"EaseOfAccessDialog.exe\",\"ListItemText\":\"EaseOfAccessDialog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EaseOfAccessDialog.exe\"},{\"CompletionText\":\"easinvoker.exe\",\"ListItemText\":\"easinvoker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\easinvoker.exe\"},{\"CompletionText\":\"EASPolicyManagerBrokerHost.exe\",\"ListItemText\":\"EASPolicyManagerBrokerHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EASPolicyManagerBrokerHost.exe\"},{\"CompletionText\":\"ebp\",\"ListItemText\":\"ebp\",\"ResultType\":2,\"ToolTip\":\"Enable-PSBreakpoint\"},{\"CompletionText\":\"echo\",\"ListItemText\":\"echo\",\"ResultType\":2,\"ToolTip\":\"Write-Output\"},{\"CompletionText\":\"Edit-ASRRecoveryPlan\",\"ListItemText\":\"Edit-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Edit-ASRRecoveryPlan\"},{\"CompletionText\":\"Edit-ASRRP\",\"ListItemText\":\"Edit-ASRRP\",\"ResultType\":2,\"ToolTip\":\"Edit-ASRRP\"},{\"CompletionText\":\"Edit-AzDataProtectionPolicyRetentionRuleClientObject\",\"ListItemText\":\"Edit-AzDataProtectionPolicyRetentionRuleClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEdit-AzDataProtectionPolicyRetentionRuleClientObject \\r\\n\"},{\"CompletionText\":\"Edit-AzDataProtectionPolicyTagClientObject\",\"ListItemText\":\"Edit-AzDataProtectionPolicyTagClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEdit-AzDataProtectionPolicyTagClientObject \\r\\n\"},{\"CompletionText\":\"Edit-AzDataProtectionPolicyTriggerClientObject\",\"ListItemText\":\"Edit-AzDataProtectionPolicyTriggerClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEdit-AzDataProtectionPolicyTriggerClientObject \\r\\n\"},{\"CompletionText\":\"Edit-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Edit-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Edit-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Edit-AzWebAppBackupConfiguration\",\"ListItemText\":\"Edit-AzWebAppBackupConfiguration\",\"ResultType\":2,\"ToolTip\":\"Edit-AzWebAppBackupConfiguration\\r\\n\"},{\"CompletionText\":\"Edit-CIPolicyRule\",\"ListItemText\":\"Edit-CIPolicyRule\",\"ResultType\":2,\"ToolTip\":\"Edit-CIPolicyRule\\r\\n\"},{\"CompletionText\":\"EDPCleanup.exe\",\"ListItemText\":\"EDPCleanup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EDPCleanup.exe\"},{\"CompletionText\":\"edpnotify.exe\",\"ListItemText\":\"edpnotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\edpnotify.exe\"},{\"CompletionText\":\"EduPrintProv.exe\",\"ListItemText\":\"EduPrintProv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EduPrintProv.exe\"},{\"CompletionText\":\"efsui.exe\",\"ListItemText\":\"efsui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\efsui.exe\"},{\"CompletionText\":\"EhStorAuthn.exe\",\"ListItemText\":\"EhStorAuthn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EhStorAuthn.exe\"},{\"CompletionText\":\"elu\",\"ListItemText\":\"elu\",\"ResultType\":2,\"ToolTip\":\"elu\"},{\"CompletionText\":\"Enable-AdlStoreKeyVault\",\"ListItemText\":\"Enable-AdlStoreKeyVault\",\"ResultType\":2,\"ToolTip\":\"Enable-AdlStoreKeyVault\"},{\"CompletionText\":\"Enable-AppBackgroundTaskDiagnosticLog\",\"ListItemText\":\"Enable-AppBackgroundTaskDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Enable-AppBackgroundTaskDiagnosticLog\\r\\n\"},{\"CompletionText\":\"Enable-AzAdvisorRecommendation\",\"ListItemText\":\"Enable-AzAdvisorRecommendation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzAdvisorRecommendation \\r\\n\"},{\"CompletionText\":\"Enable-AzAksAddOn\",\"ListItemText\":\"Enable-AzAksAddOn\",\"ResultType\":2,\"ToolTip\":\"Enable-AzAksAddOn\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchAutoScale\",\"ListItemText\":\"Enable-AzBatchAutoScale\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchAutoScale\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchComputeNodeScheduling\",\"ListItemText\":\"Enable-AzBatchComputeNodeScheduling\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchComputeNodeScheduling\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchJob\",\"ListItemText\":\"Enable-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchJobSchedule\",\"ListItemText\":\"Enable-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Enable-AzBatchTask\",\"ListItemText\":\"Enable-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Enable-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Enable-AzCdnCustomDomainCustomHttps\",\"ListItemText\":\"Enable-AzCdnCustomDomainCustomHttps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzCdnCustomDomainCustomHttps \\r\\n\"},{\"CompletionText\":\"Enable-AzContextAutosave\",\"ListItemText\":\"Enable-AzContextAutosave\",\"ResultType\":2,\"ToolTip\":\"Enable-AzContextAutosave\\r\\n\"},{\"CompletionText\":\"Enable-AzDataCollection\",\"ListItemText\":\"Enable-AzDataCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzDataCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzDataLakeStoreKeyVault\",\"ListItemText\":\"Enable-AzDataLakeStoreKeyVault\",\"ResultType\":2,\"ToolTip\":\"Enable-AzDataLakeStoreKeyVault\\r\\n\"},{\"CompletionText\":\"Enable-AzEventGridPartnerTopic\",\"ListItemText\":\"Enable-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Enable-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Enable-AzFrontDoorCdnProfileMigration\",\"ListItemText\":\"Enable-AzFrontDoorCdnProfileMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzFrontDoorCdnProfileMigration \\r\\n\"},{\"CompletionText\":\"Enable-AzFrontDoorCustomDomainHttps\",\"ListItemText\":\"Enable-AzFrontDoorCustomDomainHttps\",\"ResultType\":2,\"ToolTip\":\"Enable-AzFrontDoorCustomDomainHttps\\r\\n\"},{\"CompletionText\":\"Enable-AzHDInsightAzureMonitor\",\"ListItemText\":\"Enable-AzHDInsightAzureMonitor\",\"ResultType\":2,\"ToolTip\":\"Enable-AzHDInsightAzureMonitor\\r\\n\"},{\"CompletionText\":\"Enable-AzHDInsightMonitoring\",\"ListItemText\":\"Enable-AzHDInsightMonitoring\",\"ResultType\":2,\"ToolTip\":\"Enable-AzHDInsightMonitoring\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsIISLogCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsIISLogCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsIISLogCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsLinuxCustomLogCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsLinuxCustomLogCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsLinuxCustomLogCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsLinuxPerformanceCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsLinuxPerformanceCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsLinuxPerformanceCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzOperationalInsightsLinuxSyslogCollection\",\"ListItemText\":\"Enable-AzOperationalInsightsLinuxSyslogCollection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzOperationalInsightsLinuxSyslogCollection\\r\\n\"},{\"CompletionText\":\"Enable-AzRecoveryServicesBackupAutoProtection\",\"ListItemText\":\"Enable-AzRecoveryServicesBackupAutoProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzRecoveryServicesBackupAutoProtection\\r\\n\"},{\"CompletionText\":\"Enable-AzRecoveryServicesBackupProtection\",\"ListItemText\":\"Enable-AzRecoveryServicesBackupProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzRecoveryServicesBackupProtection\\r\\n\"},{\"CompletionText\":\"Enable-AzSecurityAdvancedThreatProtection\",\"ListItemText\":\"Enable-AzSecurityAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSecurityAdvancedThreatProtection\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlDatabaseLedgerDigestUpload\",\"ListItemText\":\"Enable-AzSqlDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlDatabaseSensitivityRecommendation\",\"ListItemText\":\"Enable-AzSqlDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Enable-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceAdvancedDataSecurity\",\"ListItemText\":\"Enable-AzSqlInstanceAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ListItemText\":\"Enable-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ListItemText\":\"Enable-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlInstanceDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Enable-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlServerActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Enable-AzSqlServerAdvancedDataSecurity\",\"ListItemText\":\"Enable-AzSqlServerAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSqlServerAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Enable-AzStackHCIAttestation\",\"ListItemText\":\"Enable-AzStackHCIAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzStackHCIAttestation \\r\\n\"},{\"CompletionText\":\"Enable-AzStackHCIRemoteSupport\",\"ListItemText\":\"Enable-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Enable-AzStorageBlobDeleteRetentionPolicy\",\"ListItemText\":\"Enable-AzStorageBlobDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageBlobDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageBlobLastAccessTimeTracking\",\"ListItemText\":\"Enable-AzStorageBlobLastAccessTimeTracking\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageBlobLastAccessTimeTracking\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageBlobRestorePolicy\",\"ListItemText\":\"Enable-AzStorageBlobRestorePolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageBlobRestorePolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageContainerDeleteRetentionPolicy\",\"ListItemText\":\"Enable-AzStorageContainerDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageContainerDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageDeleteRetentionPolicy\",\"ListItemText\":\"Enable-AzStorageDeleteRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageDeleteRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Enable-AzStorageSoftDelete\",\"ListItemText\":\"Enable-AzStorageSoftDelete\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageSoftDelete\"},{\"CompletionText\":\"Enable-AzStorageStaticWebsite\",\"ListItemText\":\"Enable-AzStorageStaticWebsite\",\"ResultType\":2,\"ToolTip\":\"Enable-AzStorageStaticWebsite\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Enable-AzSynapseActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseSqlAdvancedDataSecurity\",\"ListItemText\":\"Enable-AzSynapseSqlAdvancedDataSecurity\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseSqlAdvancedDataSecurity\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseSqlAdvancedThreatProtection\",\"ListItemText\":\"Enable-AzSynapseSqlAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseSqlAdvancedThreatProtection\"},{\"CompletionText\":\"Enable-AzSynapseSqlPoolSensitivityRecommendation\",\"ListItemText\":\"Enable-AzSynapseSqlPoolSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseSqlPoolSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Enable-AzSynapseWorkspace\",\"ListItemText\":\"Enable-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Enable-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Enable-AzTrafficManagerEndpoint\",\"ListItemText\":\"Enable-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Enable-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Enable-AzTrafficManagerProfile\",\"ListItemText\":\"Enable-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Enable-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Enable-AzureRmAlias\",\"ListItemText\":\"Enable-AzureRmAlias\",\"ResultType\":2,\"ToolTip\":\"Enable-AzureRmAlias\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementBootDebug\",\"ListItemText\":\"Enable-BcdElementBootDebug\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementBootDebug\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementBootEms\",\"ListItemText\":\"Enable-BcdElementBootEms\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementBootEms\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementDebug\",\"ListItemText\":\"Enable-BcdElementDebug\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementDebug\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementEms\",\"ListItemText\":\"Enable-BcdElementEms\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementEms\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementEventLogging\",\"ListItemText\":\"Enable-BcdElementEventLogging\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementEventLogging\\r\\n\"},{\"CompletionText\":\"Enable-BcdElementHypervisorDebug\",\"ListItemText\":\"Enable-BcdElementHypervisorDebug\",\"ResultType\":2,\"ToolTip\":\"Enable-BcdElementHypervisorDebug\\r\\n\"},{\"CompletionText\":\"Enable-BCDistributed\",\"ListItemText\":\"Enable-BCDistributed\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCDistributed \\r\\n\"},{\"CompletionText\":\"Enable-BCDowngrading\",\"ListItemText\":\"Enable-BCDowngrading\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCDowngrading \\r\\n\"},{\"CompletionText\":\"Enable-BCHostedClient\",\"ListItemText\":\"Enable-BCHostedClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCHostedClient \\r\\n\"},{\"CompletionText\":\"Enable-BCHostedServer\",\"ListItemText\":\"Enable-BCHostedServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCHostedServer \\r\\n\"},{\"CompletionText\":\"Enable-BCLocal\",\"ListItemText\":\"Enable-BCLocal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCLocal \\r\\n\"},{\"CompletionText\":\"Enable-BCServeOnBattery\",\"ListItemText\":\"Enable-BCServeOnBattery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BCServeOnBattery \\r\\n\"},{\"CompletionText\":\"Enable-BitLocker\",\"ListItemText\":\"Enable-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BitLocker \\r\\n\"},{\"CompletionText\":\"Enable-BitLockerAutoUnlock\",\"ListItemText\":\"Enable-BitLockerAutoUnlock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-BitLockerAutoUnlock \\r\\n\"},{\"CompletionText\":\"Enable-DAManualEntryPointSelection\",\"ListItemText\":\"Enable-DAManualEntryPointSelection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-DAManualEntryPointSelection \\r\\n\"},{\"CompletionText\":\"Enable-DeliveryOptimizationVerboseLogs\",\"ListItemText\":\"Enable-DeliveryOptimizationVerboseLogs\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-DeliveryOptimizationVerboseLogs \\r\\n\"},{\"CompletionText\":\"Enable-DscDebug\",\"ListItemText\":\"Enable-DscDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-DscDebug \\r\\n\"},{\"CompletionText\":\"Enable-ExperimentalFeature\",\"ListItemText\":\"Enable-ExperimentalFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-ExperimentalFeature [-Name] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-JobTrigger\",\"ListItemText\":\"Enable-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Enable-JobTrigger\\r\\n\"},{\"CompletionText\":\"Enable-LocalUser\",\"ListItemText\":\"Enable-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Enable-LocalUser\\r\\n\"},{\"CompletionText\":\"Enable-MMAgent\",\"ListItemText\":\"Enable-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-MMAgent \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapter\",\"ListItemText\":\"Enable-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapter \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterBinding\",\"ListItemText\":\"Enable-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterChecksumOffload\",\"ListItemText\":\"Enable-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Enable-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterIPsecOffload\",\"ListItemText\":\"Enable-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterLso\",\"ListItemText\":\"Enable-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterPacketDirect\",\"ListItemText\":\"Enable-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterPowerManagement\",\"ListItemText\":\"Enable-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterQos\",\"ListItemText\":\"Enable-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterRdma\",\"ListItemText\":\"Enable-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterRsc\",\"ListItemText\":\"Enable-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterRss\",\"ListItemText\":\"Enable-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterSriov\",\"ListItemText\":\"Enable-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterUso\",\"ListItemText\":\"Enable-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Enable-NetAdapterVmq\",\"ListItemText\":\"Enable-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Enable-NetDnsTransitionConfiguration\",\"ListItemText\":\"Enable-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Enable-NetFirewallHyperVRule\",\"ListItemText\":\"Enable-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Enable-NetFirewallRule\",\"ListItemText\":\"Enable-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Enable-NetIPHttpsProfile\",\"ListItemText\":\"Enable-NetIPHttpsProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetIPHttpsProfile \\r\\n\"},{\"CompletionText\":\"Enable-NetIPsecMainModeRule\",\"ListItemText\":\"Enable-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Enable-NetIPsecRule\",\"ListItemText\":\"Enable-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Enable-NetNatTransitionConfiguration\",\"ListItemText\":\"Enable-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Enable-NetworkSwitchEthernetPort\",\"ListItemText\":\"Enable-NetworkSwitchEthernetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetworkSwitchEthernetPort \\r\\n\"},{\"CompletionText\":\"Enable-NetworkSwitchFeature\",\"ListItemText\":\"Enable-NetworkSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetworkSwitchFeature \\r\\n\"},{\"CompletionText\":\"Enable-NetworkSwitchVlan\",\"ListItemText\":\"Enable-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Enable-OdbcPerfCounter\",\"ListItemText\":\"Enable-OdbcPerfCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-OdbcPerfCounter \\r\\n\"},{\"CompletionText\":\"Enable-PhysicalDiskIdentification\",\"ListItemText\":\"Enable-PhysicalDiskIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PhysicalDiskIdentification \\r\\n\"},{\"CompletionText\":\"Enable-PhysicalDiskIndication\",\"ListItemText\":\"Enable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"Enable-PhysicalDiskIndication\"},{\"CompletionText\":\"Enable-PnpDevice\",\"ListItemText\":\"Enable-PnpDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PnpDevice \\r\\n\"},{\"CompletionText\":\"Enable-PSBreakpoint\",\"ListItemText\":\"Enable-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSBreakpoint [-Breakpoint] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nEnable-PSBreakpoint [-Id] [-PassThru] [-Runspace ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-PSRemoting\",\"ListItemText\":\"Enable-PSRemoting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSRemoting [-Force] [-SkipNetworkProfileCheck] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-PSSessionConfiguration\",\"ListItemText\":\"Enable-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSSessionConfiguration [[-Name] ] [-Force] [-SecurityDescriptorSddl ] [-SkipNetworkProfileCheck] [-NoServiceRestart] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Enable-PSTrace\",\"ListItemText\":\"Enable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSTrace \\r\\n\"},{\"CompletionText\":\"Enable-PSWSManCombinedTrace\",\"ListItemText\":\"Enable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"Enable-RunspaceDebug\",\"ListItemText\":\"Enable-RunspaceDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-RunspaceDebug [[-RunspaceName] ] [-BreakAll] []\\r\\n\\r\\nEnable-RunspaceDebug [-Runspace] [-BreakAll] []\\r\\n\\r\\nEnable-RunspaceDebug [-RunspaceId] [-BreakAll] []\\r\\n\\r\\nEnable-RunspaceDebug [-RunspaceInstanceId] []\\r\\n\\r\\nEnable-RunspaceDebug [[-ProcessName] ] [[-AppDomainName] ] []\\r\\n\"},{\"CompletionText\":\"Enable-ScheduledJob\",\"ListItemText\":\"Enable-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Enable-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Enable-ScheduledTask\",\"ListItemText\":\"Enable-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Enable-SmbDelegation\",\"ListItemText\":\"Enable-SmbDelegation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-SmbDelegation \\r\\n\"},{\"CompletionText\":\"Enable-StorageBusCache\",\"ListItemText\":\"Enable-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Enable-StorageBusDisk\",\"ListItemText\":\"Enable-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Enable-StorageDataCollection\",\"ListItemText\":\"Enable-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Enable-StorageDiagnosticLog\",\"ListItemText\":\"Enable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"Enable-StorageDiagnosticLog\"},{\"CompletionText\":\"Enable-StorageEnclosureIdentification\",\"ListItemText\":\"Enable-StorageEnclosureIdentification\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageEnclosureIdentification \\r\\n\"},{\"CompletionText\":\"Enable-StorageEnclosurePower\",\"ListItemText\":\"Enable-StorageEnclosurePower\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageEnclosurePower \\r\\n\"},{\"CompletionText\":\"Enable-StorageHighAvailability\",\"ListItemText\":\"Enable-StorageHighAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageHighAvailability \\r\\n\"},{\"CompletionText\":\"Enable-StorageMaintenanceMode\",\"ListItemText\":\"Enable-StorageMaintenanceMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-StorageMaintenanceMode \\r\\n\"},{\"CompletionText\":\"Enable-TlsCipherSuite\",\"ListItemText\":\"Enable-TlsCipherSuite\",\"ResultType\":2,\"ToolTip\":\"Enable-TlsCipherSuite\\r\\n\"},{\"CompletionText\":\"Enable-TlsEccCurve\",\"ListItemText\":\"Enable-TlsEccCurve\",\"ResultType\":2,\"ToolTip\":\"Enable-TlsEccCurve\\r\\n\"},{\"CompletionText\":\"Enable-TlsSessionTicketKey\",\"ListItemText\":\"Enable-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"Enable-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"Enable-TpmAutoProvisioning\",\"ListItemText\":\"Enable-TpmAutoProvisioning\",\"ResultType\":2,\"ToolTip\":\"Enable-TpmAutoProvisioning\\r\\n\"},{\"CompletionText\":\"Enable-VMConsoleSupport\",\"ListItemText\":\"Enable-VMConsoleSupport\",\"ResultType\":2,\"ToolTip\":\"Enable-VMConsoleSupport\\r\\n\"},{\"CompletionText\":\"Enable-VMEventing\",\"ListItemText\":\"Enable-VMEventing\",\"ResultType\":2,\"ToolTip\":\"Enable-VMEventing\\r\\n\"},{\"CompletionText\":\"Enable-VMIntegrationService\",\"ListItemText\":\"Enable-VMIntegrationService\",\"ResultType\":2,\"ToolTip\":\"Enable-VMIntegrationService\\r\\n\"},{\"CompletionText\":\"Enable-VMMigration\",\"ListItemText\":\"Enable-VMMigration\",\"ResultType\":2,\"ToolTip\":\"Enable-VMMigration\\r\\n\"},{\"CompletionText\":\"Enable-VMRemoteFXPhysicalVideoAdapter\",\"ListItemText\":\"Enable-VMRemoteFXPhysicalVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Enable-VMRemoteFXPhysicalVideoAdapter\\r\\n\"},{\"CompletionText\":\"Enable-VMReplication\",\"ListItemText\":\"Enable-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Enable-VMReplication\\r\\n\"},{\"CompletionText\":\"Enable-VMResourceMetering\",\"ListItemText\":\"Enable-VMResourceMetering\",\"ResultType\":2,\"ToolTip\":\"Enable-VMResourceMetering\\r\\n\"},{\"CompletionText\":\"Enable-VMSwitchExtension\",\"ListItemText\":\"Enable-VMSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Enable-VMSwitchExtension\\r\\n\"},{\"CompletionText\":\"Enable-VMTPM\",\"ListItemText\":\"Enable-VMTPM\",\"ResultType\":2,\"ToolTip\":\"Enable-VMTPM\\r\\n\"},{\"CompletionText\":\"Enable-WdacBidTrace\",\"ListItemText\":\"Enable-WdacBidTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-WdacBidTrace \\r\\n\"},{\"CompletionText\":\"Enable-WindowsErrorReporting\",\"ListItemText\":\"Enable-WindowsErrorReporting\",\"ResultType\":2,\"ToolTip\":\"Enable-WindowsErrorReporting\\r\\n\"},{\"CompletionText\":\"Enable-WindowsOptionalFeature\",\"ListItemText\":\"Enable-WindowsOptionalFeature\",\"ResultType\":2,\"ToolTip\":\"Enable-WindowsOptionalFeature\\r\\n\"},{\"CompletionText\":\"Enable-WSManCredSSP\",\"ListItemText\":\"Enable-WSManCredSSP\",\"ResultType\":2,\"ToolTip\":\"Enable-WSManCredSSP\\r\\n\"},{\"CompletionText\":\"Enable-WSManTrace\",\"ListItemText\":\"Enable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-WSManTrace \\r\\n\"},{\"CompletionText\":\"Enter-PSHostProcess\",\"ListItemText\":\"Enter-PSHostProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnter-PSHostProcess [-Id] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess [-Process] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess [-Name] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess [-HostProcessInfo] [[-AppDomainName] ] []\\r\\n\\r\\nEnter-PSHostProcess -CustomPipeName []\\r\\n\"},{\"CompletionText\":\"Enter-PSSession\",\"ListItemText\":\"Enter-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnter-PSSession [-ComputerName] [-EnableNetworkAccess] [-Credential ] [-ConfigurationName ] [-Port ] [-UseSSL] [-ApplicationName ] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nEnter-PSSession [-HostName] [-Options ] [-Port ] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] []\\r\\n\\r\\nEnter-PSSession [[-Session] ] []\\r\\n\\r\\nEnter-PSSession [[-ConnectionUri] ] [-EnableNetworkAccess] [-Credential ] [-ConfigurationName ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nEnter-PSSession [-InstanceId ] []\\r\\n\\r\\nEnter-PSSession [[-Id] ] []\\r\\n\\r\\nEnter-PSSession [-Name ] []\\r\\n\\r\\nEnter-PSSession [-VMId] [-Credential] [-ConfigurationName ] []\\r\\n\\r\\nEnter-PSSession [-VMName] [-Credential] [-ConfigurationName ] []\\r\\n\\r\\nEnter-PSSession [-ContainerId] [-ConfigurationName ] [-RunAsAdministrator] []\\r\\n\"},{\"CompletionText\":\"env\",\"ListItemText\":\"env\",\"ResultType\":2,\"ToolTip\":\"\\r\\nenv \\r\\n\"},{\"CompletionText\":\"EoAExperiences.exe\",\"ListItemText\":\"EoAExperiences.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\EoAExperiences.exe\"},{\"CompletionText\":\"epal\",\"ListItemText\":\"epal\",\"ResultType\":2,\"ToolTip\":\"Export-Alias\"},{\"CompletionText\":\"epcsv\",\"ListItemText\":\"epcsv\",\"ResultType\":2,\"ToolTip\":\"Export-Csv\"},{\"CompletionText\":\"erase\",\"ListItemText\":\"erase\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"esentutl.exe\",\"ListItemText\":\"esentutl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\esentutl.exe\"},{\"CompletionText\":\"esimtool.exe\",\"ListItemText\":\"esimtool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\esimtool.exe\"},{\"CompletionText\":\"esmbd\",\"ListItemText\":\"esmbd\",\"ResultType\":2,\"ToolTip\":\"esmbd\"},{\"CompletionText\":\"etsn\",\"ListItemText\":\"etsn\",\"ResultType\":2,\"ToolTip\":\"Enter-PSSession\"},{\"CompletionText\":\"eudcedit.exe\",\"ListItemText\":\"eudcedit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eudcedit.exe\"},{\"CompletionText\":\"eventcreate.exe\",\"ListItemText\":\"eventcreate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eventcreate.exe\"},{\"CompletionText\":\"eventvwr.exe\",\"ListItemText\":\"eventvwr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eventvwr.exe\"},{\"CompletionText\":\"eventvwr.msc\",\"ListItemText\":\"eventvwr.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\eventvwr.msc\"},{\"CompletionText\":\"Exit-PSHostProcess\",\"ListItemText\":\"Exit-PSHostProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExit-PSHostProcess []\\r\\n\"},{\"CompletionText\":\"Exit-PSSession\",\"ListItemText\":\"Exit-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExit-PSSession []\\r\\n\"},{\"CompletionText\":\"Expand-Archive\",\"ListItemText\":\"Expand-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-Archive \\r\\n\"},{\"CompletionText\":\"Expand-AzWvdMsixImage\",\"ListItemText\":\"Expand-AzWvdMsixImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-AzWvdMsixImage \\r\\n\"},{\"CompletionText\":\"Expand-GitCommand\",\"ListItemText\":\"Expand-GitCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-GitCommand \\r\\n\"},{\"CompletionText\":\"Expand-WindowsCustomDataImage\",\"ListItemText\":\"Expand-WindowsCustomDataImage\",\"ResultType\":2,\"ToolTip\":\"Expand-WindowsCustomDataImage\\r\\n\"},{\"CompletionText\":\"Expand-WindowsImage\",\"ListItemText\":\"Expand-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Expand-WindowsImage\\r\\n\"},{\"CompletionText\":\"expand.exe\",\"ListItemText\":\"expand.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\expand.exe\"},{\"CompletionText\":\"explorer.exe\",\"ListItemText\":\"explorer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\explorer.exe\"},{\"CompletionText\":\"Export-AdlStoreChildItemProperties\",\"ListItemText\":\"Export-AdlStoreChildItemProperties\",\"ResultType\":2,\"ToolTip\":\"Export-AdlStoreChildItemProperties\"},{\"CompletionText\":\"Export-AdlStoreItem\",\"ListItemText\":\"Export-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Export-AdlStoreItem\"},{\"CompletionText\":\"Export-Alias\",\"ListItemText\":\"Export-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-Alias [-Path] [[-Name] ] [-PassThru] [-As ] [-Append] [-Force] [-NoClobber] [-Description ] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nExport-Alias [[-Name] ] -LiteralPath [-PassThru] [-As ] [-Append] [-Force] [-NoClobber] [-Description ] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Export-AzAnalysisServicesInstanceLog\",\"ListItemText\":\"Export-AzAnalysisServicesInstanceLog\",\"ResultType\":2,\"ToolTip\":\"Export-AzAnalysisServicesInstanceLog\\r\\n\"},{\"CompletionText\":\"Export-AzApiManagementApi\",\"ListItemText\":\"Export-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Export-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Export-AzAsInstanceLog\",\"ListItemText\":\"Export-AzAsInstanceLog\",\"ResultType\":2,\"ToolTip\":\"Export-AzAsInstanceLog\"},{\"CompletionText\":\"Export-AzAutomationDscConfiguration\",\"ListItemText\":\"Export-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Export-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Export-AzAutomationDscNodeReportContent\",\"ListItemText\":\"Export-AzAutomationDscNodeReportContent\",\"ResultType\":2,\"ToolTip\":\"Export-AzAutomationDscNodeReportContent\\r\\n\"},{\"CompletionText\":\"Export-AzAutomationRunbook\",\"ListItemText\":\"Export-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Export-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Export-AzConfig\",\"ListItemText\":\"Export-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Export-AzConfig\\r\\n\"},{\"CompletionText\":\"Export-AzDataLakeStoreChildItemProperties\",\"ListItemText\":\"Export-AzDataLakeStoreChildItemProperties\",\"ResultType\":2,\"ToolTip\":\"Export-AzDataLakeStoreChildItemProperties\"},{\"CompletionText\":\"Export-AzDataLakeStoreChildItemProperty\",\"ListItemText\":\"Export-AzDataLakeStoreChildItemProperty\",\"ResultType\":2,\"ToolTip\":\"Export-AzDataLakeStoreChildItemProperty\\r\\n\"},{\"CompletionText\":\"Export-AzDataLakeStoreItem\",\"ListItemText\":\"Export-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Export-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Export-AzKeyVaultSecurityDomain\",\"ListItemText\":\"Export-AzKeyVaultSecurityDomain\",\"ResultType\":2,\"ToolTip\":\"Export-AzKeyVaultSecurityDomain\\r\\n\"},{\"CompletionText\":\"Export-AzLogAnalyticRequestRateByInterval\",\"ListItemText\":\"Export-AzLogAnalyticRequestRateByInterval\",\"ResultType\":2,\"ToolTip\":\"Export-AzLogAnalyticRequestRateByInterval\\r\\n\"},{\"CompletionText\":\"Export-AzLogAnalyticThrottledRequest\",\"ListItemText\":\"Export-AzLogAnalyticThrottledRequest\",\"ResultType\":2,\"ToolTip\":\"Export-AzLogAnalyticThrottledRequest\\r\\n\"},{\"CompletionText\":\"Export-AzMlWebService\",\"ListItemText\":\"Export-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Export-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Export-AzRedisCache\",\"ListItemText\":\"Export-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Export-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Export-AzRedisEnterpriseCache\",\"ListItemText\":\"Export-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Export-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Export-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"Export-AzRedisEnterpriseCacheDatabase\"},{\"CompletionText\":\"Export-AzResourceGroup\",\"ListItemText\":\"Export-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Export-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseKqlScript\",\"ListItemText\":\"Export-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseNotebook\",\"ListItemText\":\"Export-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseSparkConfiguration\",\"ListItemText\":\"Export-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"Export-AzSynapseSqlScript\",\"ListItemText\":\"Export-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Export-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Export-AzTemplateSpec\",\"ListItemText\":\"Export-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Export-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Export-AzureAsInstanceLog\",\"ListItemText\":\"Export-AzureAsInstanceLog\",\"ResultType\":2,\"ToolTip\":\"Export-AzureAsInstanceLog\"},{\"CompletionText\":\"Export-BCCachePackage\",\"ListItemText\":\"Export-BCCachePackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-BCCachePackage \\r\\n\"},{\"CompletionText\":\"Export-BcdStore\",\"ListItemText\":\"Export-BcdStore\",\"ResultType\":2,\"ToolTip\":\"Export-BcdStore\\r\\n\"},{\"CompletionText\":\"Export-BCSecretKey\",\"ListItemText\":\"Export-BCSecretKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-BCSecretKey \\r\\n\"},{\"CompletionText\":\"Export-BinaryMiLog\",\"ListItemText\":\"Export-BinaryMiLog\",\"ResultType\":2,\"ToolTip\":\"Export-BinaryMiLog\\r\\n\"},{\"CompletionText\":\"Export-Certificate\",\"ListItemText\":\"Export-Certificate\",\"ResultType\":2,\"ToolTip\":\"Export-Certificate\\r\\n\"},{\"CompletionText\":\"Export-Clixml\",\"ListItemText\":\"Export-Clixml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-Clixml [-Path] -InputObject [-Depth ] [-Force] [-NoClobber] [-Encoding ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nExport-Clixml -LiteralPath -InputObject [-Depth ] [-Force] [-NoClobber] [-Encoding ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Export-Counter\",\"ListItemText\":\"Export-Counter\",\"ResultType\":2,\"ToolTip\":\"Export-Counter\\r\\n\"},{\"CompletionText\":\"Export-Csv\",\"ListItemText\":\"Export-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-Csv [[-Path] ] [[-Delimiter] ] -InputObject [-LiteralPath ] [-Force] [-NoClobber] [-Encoding ] [-Append] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] [-WhatIf] [-Confirm] []\\r\\n\\r\\nExport-Csv [[-Path] ] -InputObject [-LiteralPath ] [-Force] [-NoClobber] [-Encoding ] [-Append] [-UseCulture] [-IncludeTypeInformation] [-NoTypeInformation] [-QuoteFields ] [-UseQuotes ] [-NoHeader] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Export-FormatData\",\"ListItemText\":\"Export-FormatData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-FormatData -InputObject -Path [-Force] [-NoClobber] [-IncludeScriptBlock] []\\r\\n\\r\\nExport-FormatData -InputObject -LiteralPath [-Force] [-NoClobber] [-IncludeScriptBlock] []\\r\\n\"},{\"CompletionText\":\"Export-HgsGuardian\",\"ListItemText\":\"Export-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Export-ModuleMember\",\"ListItemText\":\"Export-ModuleMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-ModuleMember [[-Function] ] [-Cmdlet ] [-Variable ] [-Alias ] []\\r\\n\"},{\"CompletionText\":\"Export-ODataEndpointProxy\",\"ListItemText\":\"Export-ODataEndpointProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-ODataEndpointProxy \\r\\n\"},{\"CompletionText\":\"Export-PfxCertificate\",\"ListItemText\":\"Export-PfxCertificate\",\"ResultType\":2,\"ToolTip\":\"Export-PfxCertificate\\r\\n\"},{\"CompletionText\":\"Export-ProvisioningPackage\",\"ListItemText\":\"Export-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Export-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Export-PSSession\",\"ListItemText\":\"Export-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-PSSession [-Session] [-OutputModule] [[-CommandName] ] [[-FormatTypeName] ] [-Force] [-Encoding ] [-AllowClobber] [-ArgumentList ] [-CommandType ] [-Module ] [-FullyQualifiedModule ] [-Certificate ] []\\r\\n\"},{\"CompletionText\":\"Export-ScheduledTask\",\"ListItemText\":\"Export-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Export-StartLayout\",\"ListItemText\":\"Export-StartLayout\",\"ResultType\":2,\"ToolTip\":\"Export-StartLayout\\r\\n\"},{\"CompletionText\":\"Export-StartLayoutEdgeAssets\",\"ListItemText\":\"Export-StartLayoutEdgeAssets\",\"ResultType\":2,\"ToolTip\":\"Export-StartLayoutEdgeAssets\\r\\n\"},{\"CompletionText\":\"Export-TlsSessionTicketKey\",\"ListItemText\":\"Export-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"Export-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"Export-Trace\",\"ListItemText\":\"Export-Trace\",\"ResultType\":2,\"ToolTip\":\"Export-Trace\\r\\n\"},{\"CompletionText\":\"Export-VM\",\"ListItemText\":\"Export-VM\",\"ResultType\":2,\"ToolTip\":\"Export-VM\\r\\n\"},{\"CompletionText\":\"Export-VMCheckpoint\",\"ListItemText\":\"Export-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Export-VMCheckpoint\"},{\"CompletionText\":\"Export-VMSnapshot\",\"ListItemText\":\"Export-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Export-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Export-WindowsCapabilitySource\",\"ListItemText\":\"Export-WindowsCapabilitySource\",\"ResultType\":2,\"ToolTip\":\"Export-WindowsCapabilitySource\\r\\n\"},{\"CompletionText\":\"Export-WindowsDriver\",\"ListItemText\":\"Export-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Export-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Export-WindowsImage\",\"ListItemText\":\"Export-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Export-WindowsImage\\r\\n\"},{\"CompletionText\":\"Export-WinhttpProxy\",\"ListItemText\":\"Export-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExport-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"exsn\",\"ListItemText\":\"exsn\",\"ResultType\":2,\"ToolTip\":\"Exit-PSSession\"},{\"CompletionText\":\"extcheck.exe\",\"ListItemText\":\"extcheck.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\extcheck.exe\"},{\"CompletionText\":\"extension-admin.exe\",\"ListItemText\":\"extension-admin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\extension-admin.exe\"},{\"CompletionText\":\"extrac32.exe\",\"ListItemText\":\"extrac32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\extrac32.exe\"},{\"CompletionText\":\"F:\",\"ListItemText\":\"F:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nF: \\r\\n\"},{\"CompletionText\":\"fc\",\"ListItemText\":\"fc\",\"ResultType\":2,\"ToolTip\":\"Format-Custom\"},{\"CompletionText\":\"fc.exe\",\"ListItemText\":\"fc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fc.exe\"},{\"CompletionText\":\"fclip.exe\",\"ListItemText\":\"fclip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fclip.exe\"},{\"CompletionText\":\"fdres\",\"ListItemText\":\"fdres\",\"ResultType\":2,\"ToolTip\":\"fdres\"},{\"CompletionText\":\"fhmanagew.exe\",\"ListItemText\":\"fhmanagew.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fhmanagew.exe\"},{\"CompletionText\":\"fhx\",\"ListItemText\":\"fhx\",\"ResultType\":2,\"ToolTip\":\"Format-Hex\"},{\"CompletionText\":\"FileDialogBroker.exe\",\"ListItemText\":\"FileDialogBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FileDialogBroker.exe\"},{\"CompletionText\":\"FileHistory.exe\",\"ListItemText\":\"FileHistory.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FileHistory.exe\"},{\"CompletionText\":\"fimo\",\"ListItemText\":\"fimo\",\"ResultType\":2,\"ToolTip\":\"fimo\"},{\"CompletionText\":\"Find-AzDataProtectionRestorableTimeRange\",\"ListItemText\":\"Find-AzDataProtectionRestorableTimeRange\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-AzDataProtectionRestorableTimeRange \\r\\n\"},{\"CompletionText\":\"Find-Command\",\"ListItemText\":\"Find-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Command \\r\\n\"},{\"CompletionText\":\"Find-DSCResource\",\"ListItemText\":\"Find-DSCResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-DSCResource \\r\\n\"},{\"CompletionText\":\"Find-LapsADExtendedRights\",\"ListItemText\":\"Find-LapsADExtendedRights\",\"ResultType\":2,\"ToolTip\":\"Find-LapsADExtendedRights\\r\\n\"},{\"CompletionText\":\"Find-Module\",\"ListItemText\":\"Find-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Module \\r\\n\"},{\"CompletionText\":\"Find-NetIPsecRule\",\"ListItemText\":\"Find-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Find-NetRoute\",\"ListItemText\":\"Find-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-NetRoute \\r\\n\"},{\"CompletionText\":\"Find-Package\",\"ListItemText\":\"Find-Package\",\"ResultType\":2,\"ToolTip\":\"Find-Package\\r\\n\"},{\"CompletionText\":\"Find-PackageProvider\",\"ListItemText\":\"Find-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Find-PackageProvider\\r\\n\"},{\"CompletionText\":\"Find-PSResource\",\"ListItemText\":\"Find-PSResource\",\"ResultType\":2,\"ToolTip\":\"Find-PSResource\\r\\n\"},{\"CompletionText\":\"Find-RoleCapability\",\"ListItemText\":\"Find-RoleCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-RoleCapability \\r\\n\"},{\"CompletionText\":\"Find-Script\",\"ListItemText\":\"Find-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Script \\r\\n\"},{\"CompletionText\":\"find.exe\",\"ListItemText\":\"find.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\find.exe\"},{\"CompletionText\":\"findstr.exe\",\"ListItemText\":\"findstr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\findstr.exe\"},{\"CompletionText\":\"finger.exe\",\"ListItemText\":\"finger.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\finger.exe\"},{\"CompletionText\":\"Firewall.cpl\",\"ListItemText\":\"Firewall.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Firewall.cpl\"},{\"CompletionText\":\"fixmapi.exe\",\"ListItemText\":\"fixmapi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fixmapi.exe\"},{\"CompletionText\":\"fl\",\"ListItemText\":\"fl\",\"ResultType\":2,\"ToolTip\":\"Format-List\"},{\"CompletionText\":\"fleet.cmd\",\"ListItemText\":\"fleet.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\JetBrains\\\\Toolbox\\\\scripts\\\\fleet.cmd\"},{\"CompletionText\":\"fltMC.exe\",\"ListItemText\":\"fltMC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fltMC.exe\"},{\"CompletionText\":\"Flush-EtwTraceSession\",\"ListItemText\":\"Flush-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFlush-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Flush-Volume\",\"ListItemText\":\"Flush-Volume\",\"ResultType\":2,\"ToolTip\":\"Flush-Volume\"},{\"CompletionText\":\"fodhelper.exe\",\"ListItemText\":\"fodhelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fodhelper.exe\"},{\"CompletionText\":\"Fondue.exe\",\"ListItemText\":\"Fondue.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Fondue.exe\"},{\"CompletionText\":\"fontdrvhost.exe\",\"ListItemText\":\"fontdrvhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fontdrvhost.exe\"},{\"CompletionText\":\"fontview.exe\",\"ListItemText\":\"fontview.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fontview.exe\"},{\"CompletionText\":\"foreach\",\"ListItemText\":\"foreach\",\"ResultType\":2,\"ToolTip\":\"ForEach-Object\"},{\"CompletionText\":\"ForEach-Object\",\"ListItemText\":\"ForEach-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nForEach-Object [-Process] [-InputObject ] [-Begin ] [-End ] [-RemainingScripts ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nForEach-Object [-MemberName] [-InputObject ] [-ArgumentList ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nForEach-Object -Parallel [-InputObject ] [-ThrottleLimit ] [-TimeoutSeconds ] [-AsJob] [-UseNewRunspace] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"forfiles.exe\",\"ListItemText\":\"forfiles.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\forfiles.exe\"},{\"CompletionText\":\"Format-Custom\",\"ListItemText\":\"Format-Custom\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Custom [[-Property] ] [-Depth ] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Format-GitBranchName\",\"ListItemText\":\"Format-GitBranchName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-GitBranchName \\r\\n\"},{\"CompletionText\":\"Format-Hex\",\"ListItemText\":\"Format-Hex\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Hex [-Path] [-Count ] [-Offset ] []\\r\\n\\r\\nFormat-Hex -LiteralPath [-Count ] [-Offset ] []\\r\\n\\r\\nFormat-Hex -InputObject [-Encoding ] [-Count ] [-Offset ] [-Raw] []\\r\\n\"},{\"CompletionText\":\"Format-List\",\"ListItemText\":\"Format-List\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-List [[-Property] ] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Format-SecureBootUEFI\",\"ListItemText\":\"Format-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Format-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"Format-Table\",\"ListItemText\":\"Format-Table\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Table [[-Property] ] [-AutoSize] [-RepeatHeader] [-HideTableHeaders] [-Wrap] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Format-Volume\",\"ListItemText\":\"Format-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Volume \\r\\n\"},{\"CompletionText\":\"Format-Wide\",\"ListItemText\":\"Format-Wide\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFormat-Wide [[-Property] ] [-AutoSize] [-Column ] [-GroupBy ] [-View ] [-ShowError] [-DisplayError] [-Force] [-Expand ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"format.com\",\"ListItemText\":\"format.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\format.com\"},{\"CompletionText\":\"fsavailux.exe\",\"ListItemText\":\"fsavailux.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsavailux.exe\"},{\"CompletionText\":\"FsIso.exe\",\"ListItemText\":\"FsIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FsIso.exe\"},{\"CompletionText\":\"fsmgmt.msc\",\"ListItemText\":\"fsmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsmgmt.msc\"},{\"CompletionText\":\"fsquirt.exe\",\"ListItemText\":\"fsquirt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsquirt.exe\"},{\"CompletionText\":\"fsutil.exe\",\"ListItemText\":\"fsutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fsutil.exe\"},{\"CompletionText\":\"ft\",\"ListItemText\":\"ft\",\"ResultType\":2,\"ToolTip\":\"Format-Table\"},{\"CompletionText\":\"ftp.exe\",\"ListItemText\":\"ftp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ftp.exe\"},{\"CompletionText\":\"fvenotify.exe\",\"ListItemText\":\"fvenotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fvenotify.exe\"},{\"CompletionText\":\"fveprompt.exe\",\"ListItemText\":\"fveprompt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\fveprompt.exe\"},{\"CompletionText\":\"fw\",\"ListItemText\":\"fw\",\"ResultType\":2,\"ToolTip\":\"Format-Wide\"},{\"CompletionText\":\"FXSCOVER.exe\",\"ListItemText\":\"FXSCOVER.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FXSCOVER.exe\"},{\"CompletionText\":\"FXSSVC.exe\",\"ListItemText\":\"FXSSVC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FXSSVC.exe\"},{\"CompletionText\":\"FXSUNATD.exe\",\"ListItemText\":\"FXSUNATD.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\FXSUNATD.exe\"},{\"CompletionText\":\"G:\",\"ListItemText\":\"G:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nG: \\r\\n\"},{\"CompletionText\":\"gal\",\"ListItemText\":\"gal\",\"ResultType\":2,\"ToolTip\":\"Get-Alias\"},{\"CompletionText\":\"GameBarElevatedFT_Alias.exe\",\"ListItemText\":\"GameBarElevatedFT_Alias.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\GameBarElevatedFT_Alias.exe\"},{\"CompletionText\":\"GameBarPresenceWriter.exe\",\"ListItemText\":\"GameBarPresenceWriter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GameBarPresenceWriter.exe\"},{\"CompletionText\":\"GameInputSvc.exe\",\"ListItemText\":\"GameInputSvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GameInputSvc.exe\"},{\"CompletionText\":\"GamePanel.exe\",\"ListItemText\":\"GamePanel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GamePanel.exe\"},{\"CompletionText\":\"gatherNetworkInfo.vbs\",\"ListItemText\":\"gatherNetworkInfo.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gatherNetworkInfo.vbs\"},{\"CompletionText\":\"gbp\",\"ListItemText\":\"gbp\",\"ResultType\":2,\"ToolTip\":\"Get-PSBreakpoint\"},{\"CompletionText\":\"gc\",\"ListItemText\":\"gc\",\"ResultType\":2,\"ToolTip\":\"Get-Content\"},{\"CompletionText\":\"gcai\",\"ListItemText\":\"gcai\",\"ResultType\":2,\"ToolTip\":\"gcai\"},{\"CompletionText\":\"gcb\",\"ListItemText\":\"gcb\",\"ResultType\":2,\"ToolTip\":\"Get-Clipboard\"},{\"CompletionText\":\"gcfg\",\"ListItemText\":\"gcfg\",\"ResultType\":2,\"ToolTip\":\"gcfg\"},{\"CompletionText\":\"gcfgs\",\"ListItemText\":\"gcfgs\",\"ResultType\":2,\"ToolTip\":\"gcfgs\"},{\"CompletionText\":\"gci\",\"ListItemText\":\"gci\",\"ResultType\":2,\"ToolTip\":\"Get-ChildItem\"},{\"CompletionText\":\"gcim\",\"ListItemText\":\"gcim\",\"ResultType\":2,\"ToolTip\":\"gcim\"},{\"CompletionText\":\"gcls\",\"ListItemText\":\"gcls\",\"ResultType\":2,\"ToolTip\":\"gcls\"},{\"CompletionText\":\"gcm\",\"ListItemText\":\"gcm\",\"ResultType\":2,\"ToolTip\":\"Get-Command\"},{\"CompletionText\":\"gcms\",\"ListItemText\":\"gcms\",\"ResultType\":2,\"ToolTip\":\"gcms\"},{\"CompletionText\":\"gcs\",\"ListItemText\":\"gcs\",\"ResultType\":2,\"ToolTip\":\"Get-PSCallStack\"},{\"CompletionText\":\"gdr\",\"ListItemText\":\"gdr\",\"ResultType\":2,\"ToolTip\":\"Get-PSDrive\"},{\"CompletionText\":\"GenValObj.exe\",\"ListItemText\":\"GenValObj.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\GenValObj.exe\"},{\"CompletionText\":\"gerr\",\"ListItemText\":\"gerr\",\"ResultType\":2,\"ToolTip\":\"Get-Error\"},{\"CompletionText\":\"Get-Acl\",\"ListItemText\":\"Get-Acl\",\"ResultType\":2,\"ToolTip\":\"Get-Acl\\r\\n\"},{\"CompletionText\":\"Get-AdlAnalyticsAccount\",\"ListItemText\":\"Get-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsAccount\"},{\"CompletionText\":\"Get-AdlAnalyticsComputePolicy\",\"ListItemText\":\"Get-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"Get-AdlAnalyticsDataSource\",\"ListItemText\":\"Get-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Get-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Get-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Get-AdlCatalogItem\",\"ListItemText\":\"Get-AdlCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlCatalogItem\"},{\"CompletionText\":\"Get-AdlCatalogItemAclEntry\",\"ListItemText\":\"Get-AdlCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AdlCatalogItemAclEntry\"},{\"CompletionText\":\"Get-AdlJob\",\"ListItemText\":\"Get-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Get-AdlJob\"},{\"CompletionText\":\"Get-AdlJobPipeline\",\"ListItemText\":\"Get-AdlJobPipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AdlJobPipeline\"},{\"CompletionText\":\"Get-AdlJobRecurrence\",\"ListItemText\":\"Get-AdlJobRecurrence\",\"ResultType\":2,\"ToolTip\":\"Get-AdlJobRecurrence\"},{\"CompletionText\":\"Get-AdlStore\",\"ListItemText\":\"Get-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStore\"},{\"CompletionText\":\"Get-AdlStoreChildItem\",\"ListItemText\":\"Get-AdlStoreChildItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreChildItem\"},{\"CompletionText\":\"Get-AdlStoreChildItemSummary\",\"ListItemText\":\"Get-AdlStoreChildItemSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreChildItemSummary\"},{\"CompletionText\":\"Get-AdlStoreDeletedItem\",\"ListItemText\":\"Get-AdlStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreDeletedItem\"},{\"CompletionText\":\"Get-AdlStoreFirewallRule\",\"ListItemText\":\"Get-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreFirewallRule\"},{\"CompletionText\":\"Get-AdlStoreItem\",\"ListItemText\":\"Get-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItem\"},{\"CompletionText\":\"Get-AdlStoreItemAclEntry\",\"ListItemText\":\"Get-AdlStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemAclEntry\"},{\"CompletionText\":\"Get-AdlStoreItemContent\",\"ListItemText\":\"Get-AdlStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemContent\"},{\"CompletionText\":\"Get-AdlStoreItemOwner\",\"ListItemText\":\"Get-AdlStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemOwner\"},{\"CompletionText\":\"Get-AdlStoreItemPermission\",\"ListItemText\":\"Get-AdlStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreItemPermission\"},{\"CompletionText\":\"Get-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Get-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Get-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Get-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Get-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Get-Alias\",\"ListItemText\":\"Get-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Alias [[-Name] ] [-Exclude ] [-Scope ] []\\r\\n\\r\\nGet-Alias [-Exclude ] [-Scope ] [-Definition ] []\\r\\n\"},{\"CompletionText\":\"Get-AppBackgroundTask\",\"ListItemText\":\"Get-AppBackgroundTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppBackgroundTask \\r\\n\"},{\"CompletionText\":\"Get-AppLockerFileInformation\",\"ListItemText\":\"Get-AppLockerFileInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AppLockerFileInformation\\r\\n\"},{\"CompletionText\":\"Get-AppLockerPolicy\",\"ListItemText\":\"Get-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"Get-AppPackage\",\"ListItemText\":\"Get-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackage\"},{\"CompletionText\":\"Get-AppPackageAutoUpdateSettings\",\"ListItemText\":\"Get-AppPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageAutoUpdateSettings\"},{\"CompletionText\":\"Get-AppPackageDefaultVolume\",\"ListItemText\":\"Get-AppPackageDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageDefaultVolume\"},{\"CompletionText\":\"Get-AppPackageLastError\",\"ListItemText\":\"Get-AppPackageLastError\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageLastError\"},{\"CompletionText\":\"Get-AppPackageLog\",\"ListItemText\":\"Get-AppPackageLog\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageLog\"},{\"CompletionText\":\"Get-AppPackageManifest\",\"ListItemText\":\"Get-AppPackageManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageManifest\"},{\"CompletionText\":\"Get-AppPackageVolume\",\"ListItemText\":\"Get-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppPackageVolume\"},{\"CompletionText\":\"Get-AppProvisionedPackage\",\"ListItemText\":\"Get-AppProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppProvisionedPackage\"},{\"CompletionText\":\"Get-AppProvisionedSharedPackageContainer\",\"ListItemText\":\"Get-AppProvisionedSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AppProvisionedSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Get-AppSharedPackageContainer\",\"ListItemText\":\"Get-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Get-AppvVirtualProcess\",\"ListItemText\":\"Get-AppvVirtualProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppvVirtualProcess \\r\\n\"},{\"CompletionText\":\"Get-AppxDefaultVolume\",\"ListItemText\":\"Get-AppxDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppxDefaultVolume\\r\\n\"},{\"CompletionText\":\"Get-AppxLastError\",\"ListItemText\":\"Get-AppxLastError\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppxLastError \\r\\n\"},{\"CompletionText\":\"Get-AppxLog\",\"ListItemText\":\"Get-AppxLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AppxLog \\r\\n\"},{\"CompletionText\":\"Get-AppxPackage\",\"ListItemText\":\"Get-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppxPackage\\r\\n\"},{\"CompletionText\":\"Get-AppxPackageAutoUpdateSettings\",\"ListItemText\":\"Get-AppxPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AppxPackageAutoUpdateSettings\\r\\n\"},{\"CompletionText\":\"Get-AppxPackageManifest\",\"ListItemText\":\"Get-AppxPackageManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AppxPackageManifest\\r\\n\"},{\"CompletionText\":\"Get-AppxProvisionedPackage\",\"ListItemText\":\"Get-AppxProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AppxProvisionedPackage\\r\\n\"},{\"CompletionText\":\"Get-AppxVolume\",\"ListItemText\":\"Get-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Get-AppxVolume\\r\\n\"},{\"CompletionText\":\"Get-ASRAlertSetting\",\"ListItemText\":\"Get-ASRAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Get-ASRAlertSetting\"},{\"CompletionText\":\"Get-ASREvent\",\"ListItemText\":\"Get-ASREvent\",\"ResultType\":2,\"ToolTip\":\"Get-ASREvent\"},{\"CompletionText\":\"Get-ASRFabric\",\"ListItemText\":\"Get-ASRFabric\",\"ResultType\":2,\"ToolTip\":\"Get-ASRFabric\"},{\"CompletionText\":\"Get-ASRJob\",\"ListItemText\":\"Get-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Get-ASRJob\"},{\"CompletionText\":\"Get-ASRNetwork\",\"ListItemText\":\"Get-ASRNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-ASRNetwork\"},{\"CompletionText\":\"Get-ASRNetworkMapping\",\"ListItemText\":\"Get-ASRNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Get-ASRNetworkMapping\"},{\"CompletionText\":\"Get-ASRNotificationSetting\",\"ListItemText\":\"Get-ASRNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Get-ASRNotificationSetting\"},{\"CompletionText\":\"Get-ASRPolicy\",\"ListItemText\":\"Get-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-ASRPolicy\"},{\"CompletionText\":\"Get-ASRProtectableItem\",\"ListItemText\":\"Get-ASRProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Get-ASRProtectableItem\"},{\"CompletionText\":\"Get-ASRProtectionContainer\",\"ListItemText\":\"Get-ASRProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"Get-ASRProtectionContainer\"},{\"CompletionText\":\"Get-ASRProtectionContainerMapping\",\"ListItemText\":\"Get-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Get-ASRProtectionContainerMapping\"},{\"CompletionText\":\"Get-ASRRecoveryPlan\",\"ListItemText\":\"Get-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Get-ASRRecoveryPlan\"},{\"CompletionText\":\"Get-ASRRecoveryPoint\",\"ListItemText\":\"Get-ASRRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Get-ASRRecoveryPoint\"},{\"CompletionText\":\"Get-ASRReplicationProtectedItem\",\"ListItemText\":\"Get-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Get-ASRReplicationProtectedItem\"},{\"CompletionText\":\"Get-ASRRP\",\"ListItemText\":\"Get-ASRRP\",\"ResultType\":2,\"ToolTip\":\"Get-ASRRP\"},{\"CompletionText\":\"Get-ASRServicesProvider\",\"ListItemText\":\"Get-ASRServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Get-ASRServicesProvider\"},{\"CompletionText\":\"Get-ASRStorageClassification\",\"ListItemText\":\"Get-ASRStorageClassification\",\"ResultType\":2,\"ToolTip\":\"Get-ASRStorageClassification\"},{\"CompletionText\":\"Get-ASRStorageClassificationMapping\",\"ListItemText\":\"Get-ASRStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Get-ASRStorageClassificationMapping\"},{\"CompletionText\":\"Get-ASRvCenter\",\"ListItemText\":\"Get-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"Get-ASRvCenter\"},{\"CompletionText\":\"Get-AssignedAccess\",\"ListItemText\":\"Get-AssignedAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AssignedAccess \\r\\n\"},{\"CompletionText\":\"Get-AuthenticodeSignature\",\"ListItemText\":\"Get-AuthenticodeSignature\",\"ResultType\":2,\"ToolTip\":\"Get-AuthenticodeSignature\\r\\n\"},{\"CompletionText\":\"Get-AutologgerConfig\",\"ListItemText\":\"Get-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Get-AzAccessToken\",\"ListItemText\":\"Get-AzAccessToken\",\"ResultType\":2,\"ToolTip\":\"Get-AzAccessToken\\r\\n\"},{\"CompletionText\":\"Get-AzActionGroup\",\"ListItemText\":\"Get-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Get-AzActivityLog\",\"ListItemText\":\"Get-AzActivityLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzActivityLog\\r\\n\"},{\"CompletionText\":\"Get-AzActivityLogAlert\",\"ListItemText\":\"Get-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"Get-AzADAppCredential\",\"ListItemText\":\"Get-AzADAppCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADAppCredential \\r\\n\"},{\"CompletionText\":\"Get-AzADAppFederatedCredential\",\"ListItemText\":\"Get-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"Get-AzADApplication\",\"ListItemText\":\"Get-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADApplication \\r\\n\"},{\"CompletionText\":\"Get-AzADAppPermission\",\"ListItemText\":\"Get-AzADAppPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADAppPermission \\r\\n\"},{\"CompletionText\":\"Get-AzADGroup\",\"ListItemText\":\"Get-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADGroup \\r\\n\"},{\"CompletionText\":\"Get-AzADGroupMember\",\"ListItemText\":\"Get-AzADGroupMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADGroupMember \\r\\n\"},{\"CompletionText\":\"Get-AzADOrganization\",\"ListItemText\":\"Get-AzADOrganization\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADOrganization \\r\\n\"},{\"CompletionText\":\"Get-AzADServicePrincipal\",\"ListItemText\":\"Get-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"Get-AzADServicePrincipalCredential\",\"ListItemText\":\"Get-AzADServicePrincipalCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzADServicePrincipalCredential\"},{\"CompletionText\":\"Get-AzADSpCredential\",\"ListItemText\":\"Get-AzADSpCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADSpCredential \\r\\n\"},{\"CompletionText\":\"Get-AzADUser\",\"ListItemText\":\"Get-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzADUser \\r\\n\"},{\"CompletionText\":\"Get-AzAdvisorConfiguration\",\"ListItemText\":\"Get-AzAdvisorConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAdvisorConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzAdvisorRecommendation\",\"ListItemText\":\"Get-AzAdvisorRecommendation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAdvisorRecommendation \\r\\n\"},{\"CompletionText\":\"Get-AzAksCluster\",\"ListItemText\":\"Get-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzAksCluster\\r\\n\"},{\"CompletionText\":\"Get-AzAksClusterUpgradeProfile\",\"ListItemText\":\"Get-AzAksClusterUpgradeProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzAksClusterUpgradeProfile\"},{\"CompletionText\":\"Get-AzAksMaintenanceConfiguration\",\"ListItemText\":\"Get-AzAksMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksMaintenanceConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzAksManagedClusterCommandResult\",\"ListItemText\":\"Get-AzAksManagedClusterCommandResult\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksManagedClusterCommandResult \\r\\n\"},{\"CompletionText\":\"Get-AzAksManagedClusterOSOption\",\"ListItemText\":\"Get-AzAksManagedClusterOSOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksManagedClusterOSOption \\r\\n\"},{\"CompletionText\":\"Get-AzAksManagedClusterOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzAksManagedClusterOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksManagedClusterOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzAksNodePool\",\"ListItemText\":\"Get-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"Get-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"Get-AzAksNodePoolUpgradeProfile\",\"ListItemText\":\"Get-AzAksNodePoolUpgradeProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksNodePoolUpgradeProfile \\r\\n\"},{\"CompletionText\":\"Get-AzAksSnapshot\",\"ListItemText\":\"Get-AzAksSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksSnapshot \\r\\n\"},{\"CompletionText\":\"Get-AzAksUpgradeProfile\",\"ListItemText\":\"Get-AzAksUpgradeProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksUpgradeProfile \\r\\n\"},{\"CompletionText\":\"Get-AzAksVersion\",\"ListItemText\":\"Get-AzAksVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAksVersion \\r\\n\"},{\"CompletionText\":\"Get-AzAlertHistory\",\"ListItemText\":\"Get-AzAlertHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzAlertHistory\\r\\n\"},{\"CompletionText\":\"Get-AzAlertRule\",\"ListItemText\":\"Get-AzAlertRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAlertRule\\r\\n\"},{\"CompletionText\":\"Get-AzAlertsSuppressionRule\",\"ListItemText\":\"Get-AzAlertsSuppressionRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAlertsSuppressionRule\\r\\n\"},{\"CompletionText\":\"Get-AzAllowedConnection\",\"ListItemText\":\"Get-AzAllowedConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzAllowedConnection\\r\\n\"},{\"CompletionText\":\"Get-AzAnalysisServicesServer\",\"ListItemText\":\"Get-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagement\",\"ListItemText\":\"Get-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApi\",\"ListItemText\":\"Get-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiRelease\",\"ListItemText\":\"Get-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiRevision\",\"ListItemText\":\"Get-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiSchema\",\"ListItemText\":\"Get-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementApiVersionSet\",\"ListItemText\":\"Get-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementAuthorizationServer\",\"ListItemText\":\"Get-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementAuthorizationServerClientSecret\",\"ListItemText\":\"Get-AzApiManagementAuthorizationServerClientSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementAuthorizationServerClientSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementBackend\",\"ListItemText\":\"Get-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementCache\",\"ListItemText\":\"Get-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementCertificate\",\"ListItemText\":\"Get-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementDiagnostic\",\"ListItemText\":\"Get-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGateway\",\"ListItemText\":\"Get-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGatewayHostnameConfiguration\",\"ListItemText\":\"Get-AzApiManagementGatewayHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGatewayHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGatewayKey\",\"ListItemText\":\"Get-AzApiManagementGatewayKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGatewayKey\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementGroup\",\"ListItemText\":\"Get-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementIdentityProvider\",\"ListItemText\":\"Get-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementIdentityProviderClientSecret\",\"ListItemText\":\"Get-AzApiManagementIdentityProviderClientSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementIdentityProviderClientSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementLogger\",\"ListItemText\":\"Get-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementNamedValue\",\"ListItemText\":\"Get-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementNamedValueSecretValue\",\"ListItemText\":\"Get-AzApiManagementNamedValueSecretValue\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementNamedValueSecretValue\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementNetworkStatus\",\"ListItemText\":\"Get-AzApiManagementNetworkStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementNetworkStatus\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"Get-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementOpenIdConnectProviderClientSecret\",\"ListItemText\":\"Get-AzApiManagementOpenIdConnectProviderClientSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementOpenIdConnectProviderClientSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementOperation\",\"ListItemText\":\"Get-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementPolicy\",\"ListItemText\":\"Get-AzApiManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementProduct\",\"ListItemText\":\"Get-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementSsoToken\",\"ListItemText\":\"Get-AzApiManagementSsoToken\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementSsoToken\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementSubscription\",\"ListItemText\":\"Get-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementSubscriptionKey\",\"ListItemText\":\"Get-AzApiManagementSubscriptionKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementSubscriptionKey\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantAccess\",\"ListItemText\":\"Get-AzApiManagementTenantAccess\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantAccess\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantAccessSecret\",\"ListItemText\":\"Get-AzApiManagementTenantAccessSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantAccessSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantGitAccess\",\"ListItemText\":\"Get-AzApiManagementTenantGitAccess\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantGitAccess\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantGitAccessSecret\",\"ListItemText\":\"Get-AzApiManagementTenantGitAccessSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantGitAccessSecret\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementTenantSyncState\",\"ListItemText\":\"Get-AzApiManagementTenantSyncState\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementTenantSyncState\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementUser\",\"ListItemText\":\"Get-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"Get-AzApiManagementUserSsoUrl\",\"ListItemText\":\"Get-AzApiManagementUserSsoUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzApiManagementUserSsoUrl\\r\\n\"},{\"CompletionText\":\"Get-AzAppConfigurationDeletedStore\",\"ListItemText\":\"Get-AzAppConfigurationDeletedStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAppConfigurationDeletedStore \\r\\n\"},{\"CompletionText\":\"Get-AzAppConfigurationStore\",\"ListItemText\":\"Get-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"Get-AzAppConfigurationStoreKey\",\"ListItemText\":\"Get-AzAppConfigurationStoreKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAppConfigurationStoreKey \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGateway\",\"ListItemText\":\"Get-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Get-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableServerVariableAndHeader\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableSslOption\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableSslOption\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableSslOption\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableSslOptions\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableSslOptions\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableSslOptions\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableWafRuleSet\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableWafRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableWafRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayAvailableWafRuleSets\",\"ListItemText\":\"Get-AzApplicationGatewayAvailableWafRuleSets\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayAvailableWafRuleSets\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Get-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendHealth\",\"ListItemText\":\"Get-AzApplicationGatewayBackendHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendHealth\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Get-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Get-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Get-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Get-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"Get-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayCustomError\",\"ListItemText\":\"Get-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"Get-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Get-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Get-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Get-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Get-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayIdentity\",\"ListItemText\":\"Get-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayListener\",\"ListItemText\":\"Get-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Get-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Get-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Get-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Get-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySku\",\"ListItemText\":\"Get-AzApplicationGatewaySku\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySku\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Get-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"Get-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslPredefinedPolicy\",\"ListItemText\":\"Get-AzApplicationGatewaySslPredefinedPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslPredefinedPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Get-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewaySslProfilePolicy\",\"ListItemText\":\"Get-AzApplicationGatewaySslProfilePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewaySslProfilePolicy\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Get-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Get-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Get-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayWafDynamicManifest\",\"ListItemText\":\"Get-AzApplicationGatewayWafDynamicManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayWafDynamicManifest\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ListItemText\":\"Get-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationGatewayWebApplicationFirewallConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsights\",\"ListItemText\":\"Get-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsApiKey\",\"ListItemText\":\"Get-AzApplicationInsightsApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsApiKey \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"Get-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"Get-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"Get-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWebTest\",\"ListItemText\":\"Get-AzApplicationInsightsWebTest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWebTest \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWorkbook\",\"ListItemText\":\"Get-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWorkbookRevision\",\"ListItemText\":\"Get-AzApplicationInsightsWorkbookRevision\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWorkbookRevision \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"Get-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzApplicationSecurityGroup\",\"ListItemText\":\"Get-AzApplicationSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplicationSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzApplyUpdate\",\"ListItemText\":\"Get-AzApplyUpdate\",\"ResultType\":2,\"ToolTip\":\"Get-AzApplyUpdate\\r\\n\"},{\"CompletionText\":\"Get-AzAppServiceEnvironment\",\"ListItemText\":\"Get-AzAppServiceEnvironment\",\"ResultType\":2,\"ToolTip\":\"Get-AzAppServiceEnvironment\\r\\n\"},{\"CompletionText\":\"Get-AzAppServicePlan\",\"ListItemText\":\"Get-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"Get-AzAs\",\"ListItemText\":\"Get-AzAs\",\"ResultType\":2,\"ToolTip\":\"Get-AzAs\"},{\"CompletionText\":\"Get-AzAttestationDefaultProvider\",\"ListItemText\":\"Get-AzAttestationDefaultProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAttestationDefaultProvider \\r\\n\"},{\"CompletionText\":\"Get-AzAttestationPolicy\",\"ListItemText\":\"Get-AzAttestationPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzAttestationPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzAttestationPolicySigners\",\"ListItemText\":\"Get-AzAttestationPolicySigners\",\"ResultType\":2,\"ToolTip\":\"Get-AzAttestationPolicySigners\\r\\n\"},{\"CompletionText\":\"Get-AzAttestationProvider\",\"ListItemText\":\"Get-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"Get-AzAutoApprovedPrivateLinkService\",\"ListItemText\":\"Get-AzAutoApprovedPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutoApprovedPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageBestPractice\",\"ListItemText\":\"Get-AzAutomanageBestPractice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageBestPractice \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfile\",\"ListItemText\":\"Get-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfileAssignment\",\"ListItemText\":\"Get-AzAutomanageConfigProfileAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfileAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfileHciAssignment\",\"ListItemText\":\"Get-AzAutomanageConfigProfileHciAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfileHciAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageConfigProfileHcrpAssignment\",\"ListItemText\":\"Get-AzAutomanageConfigProfileHcrpAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageConfigProfileHcrpAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageHciReport\",\"ListItemText\":\"Get-AzAutomanageHciReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageHciReport \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageHcrpReport\",\"ListItemText\":\"Get-AzAutomanageHcrpReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageHcrpReport \\r\\n\"},{\"CompletionText\":\"Get-AzAutomanageReport\",\"ListItemText\":\"Get-AzAutomanageReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutomanageReport \\r\\n\"},{\"CompletionText\":\"Get-AzAutomationAccount\",\"ListItemText\":\"Get-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationCertificate\",\"ListItemText\":\"Get-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationConnection\",\"ListItemText\":\"Get-AzAutomationConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationConnection\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationCredential\",\"ListItemText\":\"Get-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscCompilationJob\",\"ListItemText\":\"Get-AzAutomationDscCompilationJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscCompilationJob\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscCompilationJobOutput\",\"ListItemText\":\"Get-AzAutomationDscCompilationJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscCompilationJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscConfiguration\",\"ListItemText\":\"Get-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNode\",\"ListItemText\":\"Get-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeConfiguration\",\"ListItemText\":\"Get-AzAutomationDscNodeConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeConfigurationDeployment\",\"ListItemText\":\"Get-AzAutomationDscNodeConfigurationDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeConfigurationDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeConfigurationDeploymentSchedule\",\"ListItemText\":\"Get-AzAutomationDscNodeConfigurationDeploymentSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeConfigurationDeploymentSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscNodeReport\",\"ListItemText\":\"Get-AzAutomationDscNodeReport\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscNodeReport\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationDscOnboardingMetaconfig\",\"ListItemText\":\"Get-AzAutomationDscOnboardingMetaconfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationDscOnboardingMetaconfig\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"Get-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"Get-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationHybridWorkerGroup\",\"ListItemText\":\"Get-AzAutomationHybridWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationHybridWorkerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationJob\",\"ListItemText\":\"Get-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationJobOutput\",\"ListItemText\":\"Get-AzAutomationJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationJobOutputRecord\",\"ListItemText\":\"Get-AzAutomationJobOutputRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationJobOutputRecord\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationModule\",\"ListItemText\":\"Get-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationPython3Package\",\"ListItemText\":\"Get-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationRegistrationInfo\",\"ListItemText\":\"Get-AzAutomationRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationRegistrationInfo\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationRunbook\",\"ListItemText\":\"Get-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSchedule\",\"ListItemText\":\"Get-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationScheduledRunbook\",\"ListItemText\":\"Get-AzAutomationScheduledRunbook\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationScheduledRunbook\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSoftwareUpdateConfiguration\",\"ListItemText\":\"Get-AzAutomationSoftwareUpdateConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSoftwareUpdateConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSoftwareUpdateMachineRun\",\"ListItemText\":\"Get-AzAutomationSoftwareUpdateMachineRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSoftwareUpdateMachineRun\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSoftwareUpdateRun\",\"ListItemText\":\"Get-AzAutomationSoftwareUpdateRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSoftwareUpdateRun\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSourceControl\",\"ListItemText\":\"Get-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSourceControlSyncJob\",\"ListItemText\":\"Get-AzAutomationSourceControlSyncJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSourceControlSyncJob\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationSourceControlSyncJobOutput\",\"ListItemText\":\"Get-AzAutomationSourceControlSyncJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationSourceControlSyncJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationVariable\",\"ListItemText\":\"Get-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"Get-AzAutomationWebhook\",\"ListItemText\":\"Get-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"Get-AzAutoscaleHistory\",\"ListItemText\":\"Get-AzAutoscaleHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzAutoscaleHistory\\r\\n\"},{\"CompletionText\":\"Get-AzAutoscalePredictiveMetric\",\"ListItemText\":\"Get-AzAutoscalePredictiveMetric\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutoscalePredictiveMetric \\r\\n\"},{\"CompletionText\":\"Get-AzAutoscaleSetting\",\"ListItemText\":\"Get-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"Get-AzAvailabilityGroupListener\",\"ListItemText\":\"Get-AzAvailabilityGroupListener\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzAvailabilityGroupListener \\r\\n\"},{\"CompletionText\":\"Get-AzAvailabilitySet\",\"ListItemText\":\"Get-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"Get-AzAvailablePrivateEndpointType\",\"ListItemText\":\"Get-AzAvailablePrivateEndpointType\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailablePrivateEndpointType\\r\\n\"},{\"CompletionText\":\"Get-AzAvailableServiceAlias\",\"ListItemText\":\"Get-AzAvailableServiceAlias\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailableServiceAlias\\r\\n\"},{\"CompletionText\":\"Get-AzAvailableServiceDelegation\",\"ListItemText\":\"Get-AzAvailableServiceDelegation\",\"ResultType\":2,\"ToolTip\":\"Get-AzAvailableServiceDelegation\\r\\n\"},{\"CompletionText\":\"Get-AzBastion\",\"ListItemText\":\"Get-AzBastion\",\"ResultType\":2,\"ToolTip\":\"Get-AzBastion\\r\\n\"},{\"CompletionText\":\"Get-AzBatchAccount\",\"ListItemText\":\"Get-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"Get-AzBatchAccountKey\",\"ListItemText\":\"Get-AzBatchAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzBatchAccountKeys\",\"ListItemText\":\"Get-AzBatchAccountKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchAccountKeys\"},{\"CompletionText\":\"Get-AzBatchApplication\",\"ListItemText\":\"Get-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"Get-AzBatchApplicationPackage\",\"ListItemText\":\"Get-AzBatchApplicationPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchApplicationPackage\\r\\n\"},{\"CompletionText\":\"Get-AzBatchCertificate\",\"ListItemText\":\"Get-AzBatchCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzBatchComputeNode\",\"ListItemText\":\"Get-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Get-AzBatchComputeNodeExtension\",\"ListItemText\":\"Get-AzBatchComputeNodeExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchComputeNodeExtension\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJob\",\"ListItemText\":\"Get-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobPreparationAndReleaseTaskStatus\",\"ListItemText\":\"Get-AzBatchJobPreparationAndReleaseTaskStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobPreparationAndReleaseTaskStatus\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobSchedule\",\"ListItemText\":\"Get-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobStatistic\",\"ListItemText\":\"Get-AzBatchJobStatistic\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobStatistic\\r\\n\"},{\"CompletionText\":\"Get-AzBatchJobStatistics\",\"ListItemText\":\"Get-AzBatchJobStatistics\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchJobStatistics\"},{\"CompletionText\":\"Get-AzBatchLocationQuota\",\"ListItemText\":\"Get-AzBatchLocationQuota\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchLocationQuota\\r\\n\"},{\"CompletionText\":\"Get-AzBatchLocationQuotas\",\"ListItemText\":\"Get-AzBatchLocationQuotas\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchLocationQuotas\"},{\"CompletionText\":\"Get-AzBatchNodeFile\",\"ListItemText\":\"Get-AzBatchNodeFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchNodeFile\\r\\n\"},{\"CompletionText\":\"Get-AzBatchNodeFileContent\",\"ListItemText\":\"Get-AzBatchNodeFileContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchNodeFileContent\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPool\",\"ListItemText\":\"Get-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPool\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolNodeCount\",\"ListItemText\":\"Get-AzBatchPoolNodeCount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolNodeCount\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolNodeCounts\",\"ListItemText\":\"Get-AzBatchPoolNodeCounts\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolNodeCounts\"},{\"CompletionText\":\"Get-AzBatchPoolStatistic\",\"ListItemText\":\"Get-AzBatchPoolStatistic\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolStatistic\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolStatistics\",\"ListItemText\":\"Get-AzBatchPoolStatistics\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolStatistics\"},{\"CompletionText\":\"Get-AzBatchPoolUsageMetric\",\"ListItemText\":\"Get-AzBatchPoolUsageMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolUsageMetric\\r\\n\"},{\"CompletionText\":\"Get-AzBatchPoolUsageMetrics\",\"ListItemText\":\"Get-AzBatchPoolUsageMetrics\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchPoolUsageMetrics\"},{\"CompletionText\":\"Get-AzBatchRemoteDesktopProtocolFile\",\"ListItemText\":\"Get-AzBatchRemoteDesktopProtocolFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchRemoteDesktopProtocolFile\\r\\n\"},{\"CompletionText\":\"Get-AzBatchRemoteLoginSetting\",\"ListItemText\":\"Get-AzBatchRemoteLoginSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchRemoteLoginSetting\\r\\n\"},{\"CompletionText\":\"Get-AzBatchRemoteLoginSettings\",\"ListItemText\":\"Get-AzBatchRemoteLoginSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchRemoteLoginSettings\"},{\"CompletionText\":\"Get-AzBatchSubscriptionQuotas\",\"ListItemText\":\"Get-AzBatchSubscriptionQuotas\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSubscriptionQuotas\"},{\"CompletionText\":\"Get-AzBatchSubtask\",\"ListItemText\":\"Get-AzBatchSubtask\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSubtask\\r\\n\"},{\"CompletionText\":\"Get-AzBatchSupportedImage\",\"ListItemText\":\"Get-AzBatchSupportedImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSupportedImage\\r\\n\"},{\"CompletionText\":\"Get-AzBatchSupportedVirtualMachineSku\",\"ListItemText\":\"Get-AzBatchSupportedVirtualMachineSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSupportedVirtualMachineSku\\r\\n\"},{\"CompletionText\":\"Get-AzBatchSupportedVMSku\",\"ListItemText\":\"Get-AzBatchSupportedVMSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchSupportedVMSku\"},{\"CompletionText\":\"Get-AzBatchTask\",\"ListItemText\":\"Get-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Get-AzBatchTaskCount\",\"ListItemText\":\"Get-AzBatchTaskCount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTaskCount\\r\\n\"},{\"CompletionText\":\"Get-AzBatchTaskCounts\",\"ListItemText\":\"Get-AzBatchTaskCounts\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTaskCounts\"},{\"CompletionText\":\"Get-AzBatchTaskSlotCount\",\"ListItemText\":\"Get-AzBatchTaskSlotCount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBatchTaskSlotCount\\r\\n\"},{\"CompletionText\":\"Get-AzBgpServiceCommunity\",\"ListItemText\":\"Get-AzBgpServiceCommunity\",\"ResultType\":2,\"ToolTip\":\"Get-AzBgpServiceCommunity\\r\\n\"},{\"CompletionText\":\"Get-AzBillingAccount\",\"ListItemText\":\"Get-AzBillingAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingAccount\\r\\n\"},{\"CompletionText\":\"Get-AzBillingInvoice\",\"ListItemText\":\"Get-AzBillingInvoice\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingInvoice\\r\\n\"},{\"CompletionText\":\"Get-AzBillingPeriod\",\"ListItemText\":\"Get-AzBillingPeriod\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingPeriod\\r\\n\"},{\"CompletionText\":\"Get-AzBillingProfile\",\"ListItemText\":\"Get-AzBillingProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzBillingProfile\\r\\n\"},{\"CompletionText\":\"Get-AzCapacityReservation\",\"ListItemText\":\"Get-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"Get-AzCapacityReservationGroup\",\"ListItemText\":\"Get-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"Get-AzCdnCustomDomain\",\"ListItemText\":\"Get-AzCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzCdnEdgeNode\",\"ListItemText\":\"Get-AzCdnEdgeNode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnEdgeNode \\r\\n\"},{\"CompletionText\":\"Get-AzCdnEndpoint\",\"ListItemText\":\"Get-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzCdnEndpointResourceUsage\",\"ListItemText\":\"Get-AzCdnEndpointResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnEndpointResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzCdnOrigin\",\"ListItemText\":\"Get-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"Get-AzCdnOriginGroup\",\"ListItemText\":\"Get-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Get-AzCdnProfile\",\"ListItemText\":\"Get-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"Get-AzCdnProfileResourceUsage\",\"ListItemText\":\"Get-AzCdnProfileResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnProfileResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzCdnProfileSupportedOptimizationType\",\"ListItemText\":\"Get-AzCdnProfileSupportedOptimizationType\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnProfileSupportedOptimizationType \\r\\n\"},{\"CompletionText\":\"Get-AzCdnSubscriptionResourceUsage\",\"ListItemText\":\"Get-AzCdnSubscriptionResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCdnSubscriptionResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzCloudService\",\"ListItemText\":\"Get-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudService \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceInstanceView\",\"ListItemText\":\"Get-AzCloudServiceInstanceView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceInstanceView \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceNetworkInterface\",\"ListItemText\":\"Get-AzCloudServiceNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceNetworkInterface \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceOSFamily\",\"ListItemText\":\"Get-AzCloudServiceOSFamily\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceOSFamily \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceOSVersion\",\"ListItemText\":\"Get-AzCloudServiceOSVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceOSVersion \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServicePublicIPAddress\",\"ListItemText\":\"Get-AzCloudServicePublicIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServicePublicIPAddress \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceRoleInstance\",\"ListItemText\":\"Get-AzCloudServiceRoleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceRoleInstance \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceRoleInstanceRemoteDesktopFile\",\"ListItemText\":\"Get-AzCloudServiceRoleInstanceRemoteDesktopFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceRoleInstanceRemoteDesktopFile \\r\\n\"},{\"CompletionText\":\"Get-AzCloudServiceRoleInstanceView\",\"ListItemText\":\"Get-AzCloudServiceRoleInstanceView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzCloudServiceRoleInstanceView \\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccount\",\"ListItemText\":\"Get-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountCommitmentPlan\",\"ListItemText\":\"Get-AzCognitiveServicesAccountCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountDeployment\",\"ListItemText\":\"Get-AzCognitiveServicesAccountDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountKey\",\"ListItemText\":\"Get-AzCognitiveServicesAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountModel\",\"ListItemText\":\"Get-AzCognitiveServicesAccountModel\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountModel\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountNetworkRuleSet\",\"ListItemText\":\"Get-AzCognitiveServicesAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountSku\",\"ListItemText\":\"Get-AzCognitiveServicesAccountSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountSku\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountSkus\",\"ListItemText\":\"Get-AzCognitiveServicesAccountSkus\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountSkus\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountType\",\"ListItemText\":\"Get-AzCognitiveServicesAccountType\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountType\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesAccountUsage\",\"ListItemText\":\"Get-AzCognitiveServicesAccountUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesAccountUsage\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesCommitmentPlan\",\"ListItemText\":\"Get-AzCognitiveServicesCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesCommitmentPlanAssociation\",\"ListItemText\":\"Get-AzCognitiveServicesCommitmentPlanAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesCommitmentPlanAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzCognitiveServicesCommitmentTier\",\"ListItemText\":\"Get-AzCognitiveServicesCommitmentTier\",\"ResultType\":2,\"ToolTip\":\"Get-AzCognitiveServicesCommitmentTier\\r\\n\"},{\"CompletionText\":\"Get-AzComputeResourceSku\",\"ListItemText\":\"Get-AzComputeResourceSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzComputeResourceSku\\r\\n\"},{\"CompletionText\":\"Get-AzConfidentialLedger\",\"ListItemText\":\"Get-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"Get-AzConfig\",\"ListItemText\":\"Get-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzConfig\\r\\n\"},{\"CompletionText\":\"Get-AzConfigurationAssignment\",\"ListItemText\":\"Get-AzConfigurationAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzConfigurationAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionBudget\",\"ListItemText\":\"Get-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionMarketplace\",\"ListItemText\":\"Get-AzConsumptionMarketplace\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionMarketplace\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionPriceSheet\",\"ListItemText\":\"Get-AzConsumptionPriceSheet\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionPriceSheet\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionReservationDetail\",\"ListItemText\":\"Get-AzConsumptionReservationDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionReservationDetail\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionReservationSummary\",\"ListItemText\":\"Get-AzConsumptionReservationSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionReservationSummary\\r\\n\"},{\"CompletionText\":\"Get-AzConsumptionUsageDetail\",\"ListItemText\":\"Get-AzConsumptionUsageDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzConsumptionUsageDetail\\r\\n\"},{\"CompletionText\":\"Get-AzContainerGroup\",\"ListItemText\":\"Get-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Get-AzContainerGroupOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzContainerGroupOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerGroupOutboundNetworkDependencyEndpoint\"},{\"CompletionText\":\"Get-AzContainerInstanceCachedImage\",\"ListItemText\":\"Get-AzContainerInstanceCachedImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceCachedImage \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceCapability\",\"ListItemText\":\"Get-AzContainerInstanceCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceCapability \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceContainerGroupOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzContainerInstanceContainerGroupOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceContainerGroupOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceLog\",\"ListItemText\":\"Get-AzContainerInstanceLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceLog \\r\\n\"},{\"CompletionText\":\"Get-AzContainerInstanceUsage\",\"ListItemText\":\"Get-AzContainerInstanceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerInstanceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistry\",\"ListItemText\":\"Get-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryAgentPool\",\"ListItemText\":\"Get-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryAgentPoolQueueStatus\",\"ListItemText\":\"Get-AzContainerRegistryAgentPoolQueueStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryAgentPoolQueueStatus \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryCredential\",\"ListItemText\":\"Get-AzContainerRegistryCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryCredential \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryExportPipeline\",\"ListItemText\":\"Get-AzContainerRegistryExportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryExportPipeline \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryImportPipeline\",\"ListItemText\":\"Get-AzContainerRegistryImportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryImportPipeline \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryManifest\",\"ListItemText\":\"Get-AzContainerRegistryManifest\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerRegistryManifest\\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryReplication\",\"ListItemText\":\"Get-AzContainerRegistryReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryReplication \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryRepository\",\"ListItemText\":\"Get-AzContainerRegistryRepository\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerRegistryRepository\\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryScopeMap\",\"ListItemText\":\"Get-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryTag\",\"ListItemText\":\"Get-AzContainerRegistryTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzContainerRegistryTag\\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryToken\",\"ListItemText\":\"Get-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryUsage\",\"ListItemText\":\"Get-AzContainerRegistryUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryUsage \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryWebhook\",\"ListItemText\":\"Get-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryWebhookCallbackConfig\",\"ListItemText\":\"Get-AzContainerRegistryWebhookCallbackConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryWebhookCallbackConfig \\r\\n\"},{\"CompletionText\":\"Get-AzContainerRegistryWebhookEvent\",\"ListItemText\":\"Get-AzContainerRegistryWebhookEvent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzContainerRegistryWebhookEvent \\r\\n\"},{\"CompletionText\":\"Get-AzContext\",\"ListItemText\":\"Get-AzContext\",\"ResultType\":2,\"ToolTip\":\"Get-AzContext\\r\\n\"},{\"CompletionText\":\"Get-AzContextAutosaveSetting\",\"ListItemText\":\"Get-AzContextAutosaveSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzContextAutosaveSetting\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBAccount\",\"ListItemText\":\"Get-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBAccountKey\",\"ListItemText\":\"Get-AzCosmosDBAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"Get-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraKeyspaceThroughput\",\"ListItemText\":\"Get-AzCosmosDBCassandraKeyspaceThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraKeyspaceThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraTable\",\"ListItemText\":\"Get-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBCassandraTableThroughput\",\"ListItemText\":\"Get-AzCosmosDBCassandraTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBCassandraTableThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDbClientEncryptionKey\",\"ListItemText\":\"Get-AzCosmosDbClientEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDbClientEncryptionKey\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"Get-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinDatabaseThroughput\",\"ListItemText\":\"Get-AzCosmosDBGremlinDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinGraph\",\"ListItemText\":\"Get-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinGraphBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBGremlinGraphBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinGraphBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinGraphThroughput\",\"ListItemText\":\"Get-AzCosmosDBGremlinGraphThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinGraphThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinRestorableDatabase\",\"ListItemText\":\"Get-AzCosmosDBGremlinRestorableDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinRestorableDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinRestorableGraph\",\"ListItemText\":\"Get-AzCosmosDBGremlinRestorableGraph\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinRestorableGraph\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBGremlinRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBGremlinRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBGremlinRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBLocation\",\"ListItemText\":\"Get-AzCosmosDBLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBLocation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"Get-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBCollectionBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBMongoDBCollectionBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBCollectionBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBCollectionThroughput\",\"ListItemText\":\"Get-AzCosmosDBMongoDBCollectionThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBCollectionThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"Get-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBDatabaseThroughput\",\"ListItemText\":\"Get-AzCosmosDBMongoDBDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRestorableCollection\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRestorableCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRestorableCollection\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRestorableDatabase\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRestorableDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRestorableDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"Get-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"Get-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBRestorableDatabaseAccount\",\"ListItemText\":\"Get-AzCosmosDBRestorableDatabaseAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBRestorableDatabaseAccount\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBService\",\"ListItemText\":\"Get-AzCosmosDBService\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBService\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlContainer\",\"ListItemText\":\"Get-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlContainerBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBSqlContainerBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlContainerBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlContainerThroughput\",\"ListItemText\":\"Get-AzCosmosDBSqlContainerThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlContainerThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlDatabase\",\"ListItemText\":\"Get-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlDatabaseThroughput\",\"ListItemText\":\"Get-AzCosmosDBSqlDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRestorableContainer\",\"ListItemText\":\"Get-AzCosmosDBSqlRestorableContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRestorableContainer\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRestorableDatabase\",\"ListItemText\":\"Get-AzCosmosDBSqlRestorableDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRestorableDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBSqlRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"Get-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"Get-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"Get-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlTrigger\",\"ListItemText\":\"Get-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"Get-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTable\",\"ListItemText\":\"Get-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableBackupInformation\",\"ListItemText\":\"Get-AzCosmosDBTableBackupInformation\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableBackupInformation\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableRestorableResource\",\"ListItemText\":\"Get-AzCosmosDBTableRestorableResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableRestorableResource\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableRestorableTable\",\"ListItemText\":\"Get-AzCosmosDBTableRestorableTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableRestorableTable\\r\\n\"},{\"CompletionText\":\"Get-AzCosmosDBTableThroughput\",\"ListItemText\":\"Get-AzCosmosDBTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Get-AzCosmosDBTableThroughput\\r\\n\"},{\"CompletionText\":\"Get-AzCustomIpPrefix\",\"ListItemText\":\"Get-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Get-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"Get-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeDevice\",\"ListItemText\":\"Get-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeJob\",\"ListItemText\":\"Get-AzDataBoxEdgeJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeJob\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeOrder\",\"ListItemText\":\"Get-AzDataBoxEdgeOrder\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeOrder\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeRole\",\"ListItemText\":\"Get-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeShare\",\"ListItemText\":\"Get-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeStorageAccount\",\"ListItemText\":\"Get-AzDataBoxEdgeStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"Get-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"Get-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeTrigger\",\"ListItemText\":\"Get-AzDataBoxEdgeTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzDataBoxEdgeUser\",\"ListItemText\":\"Get-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksAccessConnector\",\"ListItemText\":\"Get-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksOutboundNetworkDependenciesEndpoint\",\"ListItemText\":\"Get-AzDatabricksOutboundNetworkDependenciesEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksOutboundNetworkDependenciesEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksVNetPeering\",\"ListItemText\":\"Get-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"Get-AzDatabricksWorkspace\",\"ListItemText\":\"Get-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzDataCollectionRule\",\"ListItemText\":\"Get-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataCollectionRuleAssociation\",\"ListItemText\":\"Get-AzDataCollectionRuleAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataCollectionRuleAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactory\",\"ListItemText\":\"Get-AzDataFactory\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactory\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryActivityWindow\",\"ListItemText\":\"Get-AzDataFactoryActivityWindow\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryActivityWindow\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryDataset\",\"ListItemText\":\"Get-AzDataFactoryDataset\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryDataset\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryGateway\",\"ListItemText\":\"Get-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryGatewayAuthkey\",\"ListItemText\":\"Get-AzDataFactoryGatewayAuthkey\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryGatewayAuthkey\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryHub\",\"ListItemText\":\"Get-AzDataFactoryHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryHub\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryLinkedService\",\"ListItemText\":\"Get-AzDataFactoryLinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryLinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryPipeline\",\"ListItemText\":\"Get-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryRun\",\"ListItemText\":\"Get-AzDataFactoryRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactorySlice\",\"ListItemText\":\"Get-AzDataFactorySlice\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactorySlice\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2\",\"ListItemText\":\"Get-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2ActivityRun\",\"ListItemText\":\"Get-AzDataFactoryV2ActivityRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2ActivityRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2DataFlow\",\"ListItemText\":\"Get-AzDataFactoryV2DataFlow\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2DataFlow\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2DataFlowDebugSession\",\"ListItemText\":\"Get-AzDataFactoryV2DataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2DataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2Dataset\",\"ListItemText\":\"Get-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2Dataset\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeKey\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeMetric\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeMetric\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeNode\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2IntegrationRuntimeOutboundNetworkDependenciesEndpoint\",\"ListItemText\":\"Get-AzDataFactoryV2IntegrationRuntimeOutboundNetworkDependenciesEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2IntegrationRuntimeOutboundNetworkDependenciesEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2LinkedService\",\"ListItemText\":\"Get-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2LinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Get-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2PipelineRun\",\"ListItemText\":\"Get-AzDataFactoryV2PipelineRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2PipelineRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2Trigger\",\"ListItemText\":\"Get-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2TriggerRun\",\"ListItemText\":\"Get-AzDataFactoryV2TriggerRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2TriggerRun\\r\\n\"},{\"CompletionText\":\"Get-AzDataFactoryV2TriggerSubscriptionStatus\",\"ListItemText\":\"Get-AzDataFactoryV2TriggerSubscriptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataFactoryV2TriggerSubscriptionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Get-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsCatalogItem\",\"ListItemText\":\"Get-AzDataLakeAnalyticsCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsCatalogItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ListItemText\":\"Get-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsCatalogItemAclEntry\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"Get-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Get-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Get-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Get-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsJobPipeline\",\"ListItemText\":\"Get-AzDataLakeAnalyticsJobPipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsJobPipeline\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeAnalyticsJobRecurrence\",\"ListItemText\":\"Get-AzDataLakeAnalyticsJobRecurrence\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeAnalyticsJobRecurrence\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeGen2ChildItem\",\"ListItemText\":\"Get-AzDataLakeGen2ChildItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2ChildItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeGen2DeletedItem\",\"ListItemText\":\"Get-AzDataLakeGen2DeletedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2DeletedItem\\r\\n\"},{\"CompletionText\":\"Get-AzDatalakeGen2FileSystem\",\"ListItemText\":\"Get-AzDatalakeGen2FileSystem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDatalakeGen2FileSystem\"},{\"CompletionText\":\"Get-AzDataLakeGen2Item\",\"ListItemText\":\"Get-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeGen2ItemContent\",\"ListItemText\":\"Get-AzDataLakeGen2ItemContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeGen2ItemContent\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreAccount\",\"ListItemText\":\"Get-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreChildItem\",\"ListItemText\":\"Get-AzDataLakeStoreChildItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreChildItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreChildItemSummary\",\"ListItemText\":\"Get-AzDataLakeStoreChildItemSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreChildItemSummary\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreDeletedItem\",\"ListItemText\":\"Get-AzDataLakeStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreDeletedItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Get-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItem\",\"ListItemText\":\"Get-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemAclEntry\",\"ListItemText\":\"Get-AzDataLakeStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemAclEntry\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemContent\",\"ListItemText\":\"Get-AzDataLakeStoreItemContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemContent\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemOwner\",\"ListItemText\":\"Get-AzDataLakeStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemOwner\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreItemPermission\",\"ListItemText\":\"Get-AzDataLakeStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreItemPermission\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Get-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Get-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Get-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionBackupInstance\",\"ListItemText\":\"Get-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionBackupPolicy\",\"ListItemText\":\"Get-AzDataProtectionBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionBackupPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionBackupVault\",\"ListItemText\":\"Get-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionJob\",\"ListItemText\":\"Get-AzDataProtectionJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionJob \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionOperation\",\"ListItemText\":\"Get-AzDataProtectionOperation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionOperation \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionOperationStatus\",\"ListItemText\":\"Get-AzDataProtectionOperationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionOperationStatus \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionPolicyTemplate\",\"ListItemText\":\"Get-AzDataProtectionPolicyTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionPolicyTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionRecoveryPoint\",\"ListItemText\":\"Get-AzDataProtectionRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionRecoveryPoint \\r\\n\"},{\"CompletionText\":\"Get-AzDataProtectionResourceGuard\",\"ListItemText\":\"Get-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"Get-AzDataShare\",\"ListItemText\":\"Get-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShare\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareAccount\",\"ListItemText\":\"Get-AzDataShareAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareAccount\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareDataSet\",\"ListItemText\":\"Get-AzDataShareDataSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareDataSet\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareDataSetMapping\",\"ListItemText\":\"Get-AzDataShareDataSetMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareDataSetMapping\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareInvitation\",\"ListItemText\":\"Get-AzDataShareInvitation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareInvitation\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareProviderShareSubscription\",\"ListItemText\":\"Get-AzDataShareProviderShareSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareProviderShareSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareReceivedInvitation\",\"ListItemText\":\"Get-AzDataShareReceivedInvitation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareReceivedInvitation\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSourceDataSet\",\"ListItemText\":\"Get-AzDataShareSourceDataSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSourceDataSet\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSubscription\",\"ListItemText\":\"Get-AzDataShareSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSubscriptionSynchronization\",\"ListItemText\":\"Get-AzDataShareSubscriptionSynchronization\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSubscriptionSynchronization\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSubscriptionSynchronizationDetail\",\"ListItemText\":\"Get-AzDataShareSubscriptionSynchronizationDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSubscriptionSynchronizationDetail\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSynchronization\",\"ListItemText\":\"Get-AzDataShareSynchronization\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSynchronization\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSynchronizationDetail\",\"ListItemText\":\"Get-AzDataShareSynchronizationDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSynchronizationDetail\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareSynchronizationSetting\",\"ListItemText\":\"Get-AzDataShareSynchronizationSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareSynchronizationSetting\\r\\n\"},{\"CompletionText\":\"Get-AzDataShareTrigger\",\"ListItemText\":\"Get-AzDataShareTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzDataShareTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzDdosProtectionPlan\",\"ListItemText\":\"Get-AzDdosProtectionPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzDdosProtectionPlan\\r\\n\"},{\"CompletionText\":\"Get-AzDefault\",\"ListItemText\":\"Get-AzDefault\",\"ResultType\":2,\"ToolTip\":\"Get-AzDefault\\r\\n\"},{\"CompletionText\":\"Get-AzDelegation\",\"ListItemText\":\"Get-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDelegation\\r\\n\"},{\"CompletionText\":\"Get-AzDeletedWebApp\",\"ListItemText\":\"Get-AzDeletedWebApp\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeletedWebApp\\r\\n\"},{\"CompletionText\":\"Get-AzDenyAssignment\",\"ListItemText\":\"Get-AzDenyAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzDenyAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzDeployment\",\"ListItemText\":\"Get-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"Get-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerRollout\",\"ListItemText\":\"Get-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerService\",\"ListItemText\":\"Get-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"Get-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"Get-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentManagerStep\",\"ListItemText\":\"Get-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentOperation\",\"ListItemText\":\"Get-AzDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentScript\",\"ListItemText\":\"Get-AzDeploymentScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentScript\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentScriptLog\",\"ListItemText\":\"Get-AzDeploymentScriptLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentScriptLog\\r\\n\"},{\"CompletionText\":\"Get-AzDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzDeviceSecurityGroup\",\"ListItemText\":\"Get-AzDeviceSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzDeviceSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzDiagnosticSetting\",\"ListItemText\":\"Get-AzDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Get-AzDiagnosticSettingCategory\",\"ListItemText\":\"Get-AzDiagnosticSettingCategory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzDiagnosticSettingCategory \\r\\n\"},{\"CompletionText\":\"Get-AzDiscoveredSecuritySolution\",\"ListItemText\":\"Get-AzDiscoveredSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiscoveredSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzDisk\",\"ListItemText\":\"Get-AzDisk\",\"ResultType\":2,\"ToolTip\":\"Get-AzDisk\\r\\n\"},{\"CompletionText\":\"Get-AzDiskAccess\",\"ListItemText\":\"Get-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Get-AzDiskEncryptionSet\",\"ListItemText\":\"Get-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"Get-AzDiskEncryptionSetAssociatedResource\",\"ListItemText\":\"Get-AzDiskEncryptionSetAssociatedResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzDiskEncryptionSetAssociatedResource\\r\\n\"},{\"CompletionText\":\"Get-AzDnsRecordSet\",\"ListItemText\":\"Get-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Get-AzDnsZone\",\"ListItemText\":\"Get-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"Get-AzDnsZone\\r\\n\"},{\"CompletionText\":\"Get-AzDomain\",\"ListItemText\":\"Get-AzDomain\",\"ResultType\":2,\"ToolTip\":\"Get-AzDomain\"},{\"CompletionText\":\"Get-AzDtlAllowedVMSizesPolicy\",\"ListItemText\":\"Get-AzDtlAllowedVMSizesPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlAllowedVMSizesPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlAutoShutdownPolicy\",\"ListItemText\":\"Get-AzDtlAutoShutdownPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlAutoShutdownPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlAutoStartPolicy\",\"ListItemText\":\"Get-AzDtlAutoStartPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlAutoStartPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlVMsPerLabPolicy\",\"ListItemText\":\"Get-AzDtlVMsPerLabPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlVMsPerLabPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzDtlVMsPerUserPolicy\",\"ListItemText\":\"Get-AzDtlVMsPerUserPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzDtlVMsPerUserPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzEffectiveNetworkSecurityGroup\",\"ListItemText\":\"Get-AzEffectiveNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzEffectiveNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzEffectiveRouteTable\",\"ListItemText\":\"Get-AzEffectiveRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzEffectiveRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzEnrollmentAccount\",\"ListItemText\":\"Get-AzEnrollmentAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzEnrollmentAccount\\r\\n\"},{\"CompletionText\":\"Get-AzEnvironment\",\"ListItemText\":\"Get-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Get-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Get-AzEventCategory\",\"ListItemText\":\"Get-AzEventCategory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventCategory \\r\\n\"},{\"CompletionText\":\"Get-AzEventGridChannel\",\"ListItemText\":\"Get-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridDomain\",\"ListItemText\":\"Get-AzEventGridDomain\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridDomain\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridDomainKey\",\"ListItemText\":\"Get-AzEventGridDomainKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridDomainKey\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridDomainTopic\",\"ListItemText\":\"Get-AzEventGridDomainTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridDomainTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridFullUrlForPartnerTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridFullUrlForPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridFullUrlForPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridFullUrlForSystemTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridFullUrlForSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridFullUrlForSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Get-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerNamespace\",\"ListItemText\":\"Get-AzEventGridPartnerNamespace\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerNamespace\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerNamespaceKey\",\"ListItemText\":\"Get-AzEventGridPartnerNamespaceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerNamespaceKey\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerRegistration\",\"ListItemText\":\"Get-AzEventGridPartnerRegistration\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerRegistration\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerTopic\",\"ListItemText\":\"Get-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridPartnerTopicEventSubscriptionDeliveryAttribute\",\"ListItemText\":\"Get-AzEventGridPartnerTopicEventSubscriptionDeliveryAttribute\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridPartnerTopicEventSubscriptionDeliveryAttribute\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSubscription\",\"ListItemText\":\"Get-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSystemTopic\",\"ListItemText\":\"Get-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"Get-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridSystemTopicEventSubscriptionDeliveryAttribute\",\"ListItemText\":\"Get-AzEventGridSystemTopicEventSubscriptionDeliveryAttribute\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridSystemTopicEventSubscriptionDeliveryAttribute\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridTopic\",\"ListItemText\":\"Get-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridTopicKey\",\"ListItemText\":\"Get-AzEventGridTopicKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridTopicKey\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridTopicType\",\"ListItemText\":\"Get-AzEventGridTopicType\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridTopicType\\r\\n\"},{\"CompletionText\":\"Get-AzEventGridVerifiedPartner\",\"ListItemText\":\"Get-AzEventGridVerifiedPartner\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventGridVerifiedPartner\\r\\n\"},{\"CompletionText\":\"Get-AzEventHub\",\"ListItemText\":\"Get-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHub \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubApplicationGroup\",\"ListItemText\":\"Get-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubAuthorizationRule\",\"ListItemText\":\"Get-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubCluster\",\"ListItemText\":\"Get-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubClusterNamespace\",\"ListItemText\":\"Get-AzEventHubClusterNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubClusterNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubClustersAvailableRegion\",\"ListItemText\":\"Get-AzEventHubClustersAvailableRegion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubClustersAvailableRegion \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubConsumerGroup\",\"ListItemText\":\"Get-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubGeoDRConfiguration\",\"ListItemText\":\"Get-AzEventHubGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubKey\",\"ListItemText\":\"Get-AzEventHubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubKey \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubNamespace\",\"ListItemText\":\"Get-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubNamespaceV2\",\"ListItemText\":\"Get-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzEventHubNamespaceV2\"},{\"CompletionText\":\"Get-AzEventHubNetworkRuleSet\",\"ListItemText\":\"Get-AzEventHubNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Get-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubPrivateLink\",\"ListItemText\":\"Get-AzEventHubPrivateLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubPrivateLink \\r\\n\"},{\"CompletionText\":\"Get-AzEventHubSchemaGroup\",\"ListItemText\":\"Get-AzEventHubSchemaGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzEventHubSchemaGroup \\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuit\",\"ListItemText\":\"Get-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitARPTable\",\"ListItemText\":\"Get-AzExpressRouteCircuitARPTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitARPTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"Get-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Get-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Get-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitRouteTable\",\"ListItemText\":\"Get-AzExpressRouteCircuitRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitRouteTableSummary\",\"ListItemText\":\"Get-AzExpressRouteCircuitRouteTableSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitRouteTableSummary\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitStat\",\"ListItemText\":\"Get-AzExpressRouteCircuitStat\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitStat\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCircuitStats\",\"ListItemText\":\"Get-AzExpressRouteCircuitStats\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCircuitStats\"},{\"CompletionText\":\"Get-AzExpressRouteConnection\",\"ListItemText\":\"Get-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnection\",\"ListItemText\":\"Get-AzExpressRouteCrossConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnection\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionArpTable\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionArpTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionArpTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionPeering\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionPeering\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionPeering\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionRouteTable\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteCrossConnectionRouteTableSummary\",\"ListItemText\":\"Get-AzExpressRouteCrossConnectionRouteTableSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteCrossConnectionRouteTableSummary\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteGateway\",\"ListItemText\":\"Get-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePort\",\"ListItemText\":\"Get-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortAuthorization\",\"ListItemText\":\"Get-AzExpressRoutePortAuthorization\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortAuthorization\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortIdentity\",\"ListItemText\":\"Get-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortLinkConfig\",\"ListItemText\":\"Get-AzExpressRoutePortLinkConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortLinkConfig\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRoutePortsLocation\",\"ListItemText\":\"Get-AzExpressRoutePortsLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRoutePortsLocation\\r\\n\"},{\"CompletionText\":\"Get-AzExpressRouteServiceProvider\",\"ListItemText\":\"Get-AzExpressRouteServiceProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzExpressRouteServiceProvider\\r\\n\"},{\"CompletionText\":\"Get-AzExternalSecuritySolution\",\"ListItemText\":\"Get-AzExternalSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzExternalSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzFederatedIdentityCredentials\",\"ListItemText\":\"Get-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"Get-AzFirewall\",\"ListItemText\":\"Get-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewall\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallFqdnTag\",\"ListItemText\":\"Get-AzFirewallFqdnTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallFqdnTag\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallLearnedIpPrefix\",\"ListItemText\":\"Get-AzFirewallLearnedIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallLearnedIpPrefix\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallPolicy\",\"ListItemText\":\"Get-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"Get-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoor\",\"ListItemText\":\"Get-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"Get-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"Get-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnEndpointResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnEndpointResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnEndpointResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnOrigin\",\"ListItemText\":\"Get-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"Get-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnOriginGroupResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnOriginGroupResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnOriginGroupResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnProfile\",\"ListItemText\":\"Get-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnProfileResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnProfileResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnProfileResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRoute\",\"ListItemText\":\"Get-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRule\",\"ListItemText\":\"Get-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRuleSet\",\"ListItemText\":\"Get-AzFrontDoorCdnRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnRuleSetResourceUsage\",\"ListItemText\":\"Get-AzFrontDoorCdnRuleSetResourceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnRuleSetResourceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnSecret\",\"ListItemText\":\"Get-AzFrontDoorCdnSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnSecret \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"Get-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorFrontendEndpoint\",\"ListItemText\":\"Get-AzFrontDoorFrontendEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorFrontendEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorRulesEngine\",\"ListItemText\":\"Get-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorWafManagedRuleSetDefinition\",\"ListItemText\":\"Get-AzFrontDoorWafManagedRuleSetDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorWafManagedRuleSetDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzFrontDoorWafPolicy\",\"ListItemText\":\"Get-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzFunctionApp\",\"ListItemText\":\"Get-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Get-AzFunctionAppAvailableLocation\",\"ListItemText\":\"Get-AzFunctionAppAvailableLocation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionAppAvailableLocation \\r\\n\"},{\"CompletionText\":\"Get-AzFunctionAppPlan\",\"ListItemText\":\"Get-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"Get-AzFunctionAppSetting\",\"ListItemText\":\"Get-AzFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzGallery\",\"ListItemText\":\"Get-AzGallery\",\"ResultType\":2,\"ToolTip\":\"Get-AzGallery\\r\\n\"},{\"CompletionText\":\"Get-AzGalleryApplication\",\"ListItemText\":\"Get-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"Get-AzGalleryApplicationVersion\",\"ListItemText\":\"Get-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"Get-AzGalleryImageDefinition\",\"ListItemText\":\"Get-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzGalleryImageVersion\",\"ListItemText\":\"Get-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"Get-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightAzureMonitor\",\"ListItemText\":\"Get-AzHDInsightAzureMonitor\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightAzureMonitor\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightCluster\",\"ListItemText\":\"Get-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"Get-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightHost\",\"ListItemText\":\"Get-AzHDInsightHost\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightHost\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightJob\",\"ListItemText\":\"Get-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightJobOutput\",\"ListItemText\":\"Get-AzHDInsightJobOutput\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightJobOutput\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightMonitoring\",\"ListItemText\":\"Get-AzHDInsightMonitoring\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightMonitoring\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightPersistedScriptAction\",\"ListItemText\":\"Get-AzHDInsightPersistedScriptAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightPersistedScriptAction\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightProperty\",\"ListItemText\":\"Get-AzHDInsightProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightProperty\\r\\n\"},{\"CompletionText\":\"Get-AzHDInsightScriptActionHistory\",\"ListItemText\":\"Get-AzHDInsightScriptActionHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzHDInsightScriptActionHistory\\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareApisService\",\"ListItemText\":\"Get-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareApisWorkspace\",\"ListItemText\":\"Get-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareDicomService\",\"ListItemText\":\"Get-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareFhirDestination\",\"ListItemText\":\"Get-AzHealthcareFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareFhirDestination \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareFhirService\",\"ListItemText\":\"Get-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareIotConnector\",\"ListItemText\":\"Get-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"Get-AzHealthcareIotConnectorFhirDestination\",\"ListItemText\":\"Get-AzHealthcareIotConnectorFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzHealthcareIotConnectorFhirDestination \\r\\n\"},{\"CompletionText\":\"Get-AzHost\",\"ListItemText\":\"Get-AzHost\",\"ResultType\":2,\"ToolTip\":\"Get-AzHost\\r\\n\"},{\"CompletionText\":\"Get-AzHostGroup\",\"ListItemText\":\"Get-AzHostGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzHostGroup\\r\\n\"},{\"CompletionText\":\"Get-AzImage\",\"ListItemText\":\"Get-AzImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzImage\\r\\n\"},{\"CompletionText\":\"Get-AzInsightsPrivateLinkScope\",\"ListItemText\":\"Get-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"Get-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"Get-AzInsightsPrivateLinkScopedResource\",\"ListItemText\":\"Get-AzInsightsPrivateLinkScopedResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzInsightsPrivateLinkScopedResource\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccount\",\"ListItemText\":\"Get-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountAgreement\",\"ListItemText\":\"Get-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountAssembly\",\"ListItemText\":\"Get-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"Get-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountCallbackUrl\",\"ListItemText\":\"Get-AzIntegrationAccountCallbackUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountCallbackUrl\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountCertificate\",\"ListItemText\":\"Get-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountGeneratedIcn\",\"ListItemText\":\"Get-AzIntegrationAccountGeneratedIcn\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountGeneratedIcn\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountMap\",\"ListItemText\":\"Get-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountPartner\",\"ListItemText\":\"Get-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountReceivedIcn\",\"ListItemText\":\"Get-AzIntegrationAccountReceivedIcn\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountReceivedIcn\\r\\n\"},{\"CompletionText\":\"Get-AzIntegrationAccountSchema\",\"ListItemText\":\"Get-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"Get-AzInterfaceEndpoint\",\"ListItemText\":\"Get-AzInterfaceEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzInterfaceEndpoint\"},{\"CompletionText\":\"Get-AzInvoiceSection\",\"ListItemText\":\"Get-AzInvoiceSection\",\"ResultType\":2,\"ToolTip\":\"Get-AzInvoiceSection\\r\\n\"},{\"CompletionText\":\"Get-AzIotHub\",\"ListItemText\":\"Get-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHub\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubCertificate\",\"ListItemText\":\"Get-AzIotHubCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubCertificateVerificationCode\",\"ListItemText\":\"Get-AzIotHubCertificateVerificationCode\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubCertificateVerificationCode\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubConfiguration\",\"ListItemText\":\"Get-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubConnectionString\",\"ListItemText\":\"Get-AzIotHubConnectionString\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubConnectionString\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubCVC\",\"ListItemText\":\"Get-AzIotHubCVC\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubCVC\"},{\"CompletionText\":\"Get-AzIotHubDCL\",\"ListItemText\":\"Get-AzIotHubDCL\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDCL\"},{\"CompletionText\":\"Get-AzIotHubDCS\",\"ListItemText\":\"Get-AzIotHubDCS\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDCS\"},{\"CompletionText\":\"Get-AzIotHubDeployment\",\"ListItemText\":\"Get-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDevice\",\"ListItemText\":\"Get-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceChildren\",\"ListItemText\":\"Get-AzIotHubDeviceChildren\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceChildren\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceConnectionString\",\"ListItemText\":\"Get-AzIotHubDeviceConnectionString\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceConnectionString\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceParent\",\"ListItemText\":\"Get-AzIotHubDeviceParent\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceParent\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDeviceTwin\",\"ListItemText\":\"Get-AzIotHubDeviceTwin\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDeviceTwin\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubDistributedTracing\",\"ListItemText\":\"Get-AzIotHubDistributedTracing\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubDistributedTracing\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubEHCG\",\"ListItemText\":\"Get-AzIotHubEHCG\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubEHCG\"},{\"CompletionText\":\"Get-AzIotHubEventHubConsumerGroup\",\"ListItemText\":\"Get-AzIotHubEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubEventHubConsumerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubJob\",\"ListItemText\":\"Get-AzIotHubJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubJob\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubKey\",\"ListItemText\":\"Get-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubMCS\",\"ListItemText\":\"Get-AzIotHubMCS\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubMCS\"},{\"CompletionText\":\"Get-AzIotHubMessageEnrichment\",\"ListItemText\":\"Get-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubModule\",\"ListItemText\":\"Get-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubModuleConnectionString\",\"ListItemText\":\"Get-AzIotHubModuleConnectionString\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubModuleConnectionString\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubModuleTwin\",\"ListItemText\":\"Get-AzIotHubModuleTwin\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubModuleTwin\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubMsgEnrich\",\"ListItemText\":\"Get-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Get-AzIotHubQuotaMetric\",\"ListItemText\":\"Get-AzIotHubQuotaMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubQuotaMetric\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubRegistryStatistic\",\"ListItemText\":\"Get-AzIotHubRegistryStatistic\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubRegistryStatistic\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubRoute\",\"ListItemText\":\"Get-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubRoutingEndpoint\",\"ListItemText\":\"Get-AzIotHubRoutingEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubRoutingEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzIotHubTracing\",\"ListItemText\":\"Get-AzIotHubTracing\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubTracing\"},{\"CompletionText\":\"Get-AzIotHubValidSku\",\"ListItemText\":\"Get-AzIotHubValidSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotHubValidSku\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecurityAnalytics\",\"ListItemText\":\"Get-AzIotSecurityAnalytics\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecurityAnalytics\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecurityAnalyticsAggregatedAlert\",\"ListItemText\":\"Get-AzIotSecurityAnalyticsAggregatedAlert\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecurityAnalyticsAggregatedAlert\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecurityAnalyticsAggregatedRecommendation\",\"ListItemText\":\"Get-AzIotSecurityAnalyticsAggregatedRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecurityAnalyticsAggregatedRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzIotSecuritySolution\",\"ListItemText\":\"Get-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzIpAllocation\",\"ListItemText\":\"Get-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"Get-AzIpGroup\",\"ListItemText\":\"Get-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzIpGroup\\r\\n\"},{\"CompletionText\":\"Get-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Get-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVault\",\"ListItemText\":\"Get-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificate\",\"ListItemText\":\"Get-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificateContact\",\"ListItemText\":\"Get-AzKeyVaultCertificateContact\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificateContact\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificateIssuer\",\"ListItemText\":\"Get-AzKeyVaultCertificateIssuer\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificateIssuer\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificateOperation\",\"ListItemText\":\"Get-AzKeyVaultCertificateOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificateOperation\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultCertificatePolicy\",\"ListItemText\":\"Get-AzKeyVaultCertificatePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultCertificatePolicy\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultKey\",\"ListItemText\":\"Get-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultKeyRotationPolicy\",\"ListItemText\":\"Get-AzKeyVaultKeyRotationPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultKeyRotationPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultManagedHsm\",\"ListItemText\":\"Get-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Get-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultManagedStorageSasDefinition\",\"ListItemText\":\"Get-AzKeyVaultManagedStorageSasDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultManagedStorageSasDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultRandomNumber\",\"ListItemText\":\"Get-AzKeyVaultRandomNumber\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultRandomNumber\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultRoleAssignment\",\"ListItemText\":\"Get-AzKeyVaultRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultRoleDefinition\",\"ListItemText\":\"Get-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzKeyVaultSecret\",\"ListItemText\":\"Get-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Get-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Get-AzKustoAttachedDatabaseConfiguration\",\"ListItemText\":\"Get-AzKustoAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzKustoCluster\",\"ListItemText\":\"Get-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterFollowerDatabase\",\"ListItemText\":\"Get-AzKustoClusterFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterLanguageExtension\",\"ListItemText\":\"Get-AzKustoClusterLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterLanguageExtension \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzKustoClusterOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterPrincipalAssignment\",\"ListItemText\":\"Get-AzKustoClusterPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzKustoClusterSku\",\"ListItemText\":\"Get-AzKustoClusterSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoClusterSku \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDatabase\",\"ListItemText\":\"Get-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDatabasePrincipal\",\"ListItemText\":\"Get-AzKustoDatabasePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDatabasePrincipal \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDatabasePrincipalAssignment\",\"ListItemText\":\"Get-AzKustoDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzKustoDataConnection\",\"ListItemText\":\"Get-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"Get-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"Get-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzKustoOperationsResult\",\"ListItemText\":\"Get-AzKustoOperationsResult\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoOperationsResult \\r\\n\"},{\"CompletionText\":\"Get-AzKustoOperationsResultLocation\",\"ListItemText\":\"Get-AzKustoOperationsResultLocation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoOperationsResultLocation \\r\\n\"},{\"CompletionText\":\"Get-AzKustoPrivateEndpointConnection\",\"ListItemText\":\"Get-AzKustoPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Get-AzKustoPrivateLinkResource\",\"ListItemText\":\"Get-AzKustoPrivateLinkResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoPrivateLinkResource \\r\\n\"},{\"CompletionText\":\"Get-AzKustoScript\",\"ListItemText\":\"Get-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoScript \\r\\n\"},{\"CompletionText\":\"Get-AzKustoSku\",\"ListItemText\":\"Get-AzKustoSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzKustoSku \\r\\n\"},{\"CompletionText\":\"Get-AzLoad\",\"ListItemText\":\"Get-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzLoad \\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancer\",\"ListItemText\":\"Get-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerBackendAddressInboundNatRulePortMapping\",\"ListItemText\":\"Get-AzLoadBalancerBackendAddressInboundNatRulePortMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerBackendAddressInboundNatRulePortMapping\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"Get-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"Get-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Get-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Get-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Get-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Get-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Get-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Get-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzLocalNetworkGateway\",\"ListItemText\":\"Get-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"Get-AzLocation\",\"ListItemText\":\"Get-AzLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzLocation\\r\\n\"},{\"CompletionText\":\"Get-AzLog\",\"ListItemText\":\"Get-AzLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzLog\"},{\"CompletionText\":\"Get-AzLogicApp\",\"ListItemText\":\"Get-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppRunAction\",\"ListItemText\":\"Get-AzLogicAppRunAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppRunAction\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppRunHistory\",\"ListItemText\":\"Get-AzLogicAppRunHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppRunHistory\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppTrigger\",\"ListItemText\":\"Get-AzLogicAppTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppTriggerCallbackUrl\",\"ListItemText\":\"Get-AzLogicAppTriggerCallbackUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppTriggerCallbackUrl\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppTriggerHistory\",\"ListItemText\":\"Get-AzLogicAppTriggerHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppTriggerHistory\\r\\n\"},{\"CompletionText\":\"Get-AzLogicAppUpgradedDefinition\",\"ListItemText\":\"Get-AzLogicAppUpgradedDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogicAppUpgradedDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzLogProfile\",\"ListItemText\":\"Get-AzLogProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzLogProfile\\r\\n\"},{\"CompletionText\":\"Get-AzMaintenanceConfiguration\",\"ListItemText\":\"Get-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzMaintenancePublicConfiguration\",\"ListItemText\":\"Get-AzMaintenancePublicConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzMaintenancePublicConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzMaintenanceUpdate\",\"ListItemText\":\"Get-AzMaintenanceUpdate\",\"ResultType\":2,\"ToolTip\":\"Get-AzMaintenanceUpdate\\r\\n\"},{\"CompletionText\":\"Get-AzManagedApplication\",\"ListItemText\":\"Get-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"Get-AzManagedApplicationDefinition\",\"ListItemText\":\"Get-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzManagedCassandraCluster\",\"ListItemText\":\"Get-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"Get-AzManagedCassandraDataCenter\",\"ListItemText\":\"Get-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"Get-AzManagedServicesAssignment\",\"ListItemText\":\"Get-AzManagedServicesAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzManagedServicesAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzManagedServicesDefinition\",\"ListItemText\":\"Get-AzManagedServicesDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzManagedServicesDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzManagedServicesMarketplaceDefinition\",\"ListItemText\":\"Get-AzManagedServicesMarketplaceDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzManagedServicesMarketplaceDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroup\",\"ListItemText\":\"Get-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupDeployment\",\"ListItemText\":\"Get-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupDeploymentOperation\",\"ListItemText\":\"Get-AzManagementGroupDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzManagementGroupDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupEntity\",\"ListItemText\":\"Get-AzManagementGroupEntity\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupEntity\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupHierarchySetting\",\"ListItemText\":\"Get-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupNameAvailability\",\"ListItemText\":\"Get-AzManagementGroupNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupNameAvailability\\r\\n\"},{\"CompletionText\":\"Get-AzManagementGroupSubscription\",\"ListItemText\":\"Get-AzManagementGroupSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzManagementGroupSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzMarketplaceTerms\",\"ListItemText\":\"Get-AzMarketplaceTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMarketplaceTerms \\r\\n\"},{\"CompletionText\":\"Get-AzMediaService\",\"ListItemText\":\"Get-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaService\\r\\n\"},{\"CompletionText\":\"Get-AzMediaServiceKey\",\"ListItemText\":\"Get-AzMediaServiceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaServiceKey\\r\\n\"},{\"CompletionText\":\"Get-AzMediaServiceKeys\",\"ListItemText\":\"Get-AzMediaServiceKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaServiceKeys\"},{\"CompletionText\":\"Get-AzMediaServiceNameAvailability\",\"ListItemText\":\"Get-AzMediaServiceNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Get-AzMediaServiceNameAvailability\\r\\n\"},{\"CompletionText\":\"Get-AzMetric\",\"ListItemText\":\"Get-AzMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzMetric\\r\\n\"},{\"CompletionText\":\"Get-AzMetricAlertRuleV2\",\"ListItemText\":\"Get-AzMetricAlertRuleV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzMetricAlertRuleV2\\r\\n\"},{\"CompletionText\":\"Get-AzMetricDefinition\",\"ListItemText\":\"Get-AzMetricDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzMetricDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzMigrateDiscoveredServer\",\"ListItemText\":\"Get-AzMigrateDiscoveredServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateDiscoveredServer \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateJob\",\"ListItemText\":\"Get-AzMigrateJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateJob \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateProject\",\"ListItemText\":\"Get-AzMigrateProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateProject \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationFabric\",\"ListItemText\":\"Get-AzMigrateReplicationFabric\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationFabric \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationPolicy\",\"ListItemText\":\"Get-AzMigrateReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationProtectionContainer\",\"ListItemText\":\"Get-AzMigrateReplicationProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationProtectionContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationProtectionContainerMapping\",\"ListItemText\":\"Get-AzMigrateReplicationProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationProtectionContainerMapping \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateReplicationRecoveryServicesProvider\",\"ListItemText\":\"Get-AzMigrateReplicationRecoveryServicesProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateReplicationRecoveryServicesProvider \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateRunAsAccount\",\"ListItemText\":\"Get-AzMigrateRunAsAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateRunAsAccount \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateServerReplication\",\"ListItemText\":\"Get-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateSite\",\"ListItemText\":\"Get-AzMigrateSite\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateSite \\r\\n\"},{\"CompletionText\":\"Get-AzMigrateSolution\",\"ListItemText\":\"Get-AzMigrateSolution\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMigrateSolution \\r\\n\"},{\"CompletionText\":\"Get-AzMlCommitmentAssociation\",\"ListItemText\":\"Get-AzMlCommitmentAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlCommitmentAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzMlCommitmentPlan\",\"ListItemText\":\"Get-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Get-AzMlCommitmentPlanUsageHistory\",\"ListItemText\":\"Get-AzMlCommitmentPlanUsageHistory\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlCommitmentPlanUsageHistory\\r\\n\"},{\"CompletionText\":\"Get-AzMLServiceQuota\",\"ListItemText\":\"Get-AzMLServiceQuota\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLServiceQuota \\r\\n\"},{\"CompletionText\":\"Get-AzMLServiceUsage\",\"ListItemText\":\"Get-AzMLServiceUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLServiceUsage \\r\\n\"},{\"CompletionText\":\"Get-AzMLServiceVMSize\",\"ListItemText\":\"Get-AzMLServiceVMSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLServiceVMSize \\r\\n\"},{\"CompletionText\":\"Get-AzMlWebService\",\"ListItemText\":\"Get-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Get-AzMlWebServiceKey\",\"ListItemText\":\"Get-AzMlWebServiceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlWebServiceKey\\r\\n\"},{\"CompletionText\":\"Get-AzMlWebServiceKeys\",\"ListItemText\":\"Get-AzMlWebServiceKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzMlWebServiceKeys\"},{\"CompletionText\":\"Get-AzMLWorkspace\",\"ListItemText\":\"Get-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"Get-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"Get-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceCodeVersion\",\"ListItemText\":\"Get-AzMLWorkspaceCodeVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceCodeVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComponentContainer\",\"ListItemText\":\"Get-AzMLWorkspaceComponentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComponentContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComponentVersion\",\"ListItemText\":\"Get-AzMLWorkspaceComponentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComponentVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceCompute\",\"ListItemText\":\"Get-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComputeKey\",\"ListItemText\":\"Get-AzMLWorkspaceComputeKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComputeKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceComputeNode\",\"ListItemText\":\"Get-AzMLWorkspaceComputeNode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceComputeNode \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceConnection\",\"ListItemText\":\"Get-AzMLWorkspaceConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceConnection \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDataContainer\",\"ListItemText\":\"Get-AzMLWorkspaceDataContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDataContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDatastore\",\"ListItemText\":\"Get-AzMLWorkspaceDatastore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDatastore \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDatastoreSecret\",\"ListItemText\":\"Get-AzMLWorkspaceDatastoreSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDatastoreSecret \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceDataVersion\",\"ListItemText\":\"Get-AzMLWorkspaceDataVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceDataVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceEnvironmentContainer\",\"ListItemText\":\"Get-AzMLWorkspaceEnvironmentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceEnvironmentContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceEnvironmentVersion\",\"ListItemText\":\"Get-AzMLWorkspaceEnvironmentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceEnvironmentVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceFeature\",\"ListItemText\":\"Get-AzMLWorkspaceFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceFeature \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceJob\",\"ListItemText\":\"Get-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceKey\",\"ListItemText\":\"Get-AzMLWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceModelContainer\",\"ListItemText\":\"Get-AzMLWorkspaceModelContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceModelContainer \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceModelVersion\",\"ListItemText\":\"Get-AzMLWorkspaceModelVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceModelVersion \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceNotebookAccessToken\",\"ListItemText\":\"Get-AzMLWorkspaceNotebookAccessToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceNotebookAccessToken \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceNotebookKey\",\"ListItemText\":\"Get-AzMLWorkspaceNotebookKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceNotebookKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineDeploymentLog\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineDeploymentLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineDeploymentLog \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineDeploymentSku\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineDeploymentSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineDeploymentSku \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineEndpointKey\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineEndpointKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineEndpointKey \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOnlineEndpointToken\",\"ListItemText\":\"Get-AzMLWorkspaceOnlineEndpointToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOnlineEndpointToken \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceOutboundNetworkDependencyEndpoint\",\"ListItemText\":\"Get-AzMLWorkspaceOutboundNetworkDependencyEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceOutboundNetworkDependencyEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzMLWorkspaceStorageAccountKey\",\"ListItemText\":\"Get-AzMLWorkspaceStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMLWorkspaceStorageAccountKey \\r\\n\"},{\"CompletionText\":\"Get-AzMonitorWorkspace\",\"ListItemText\":\"Get-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlConfiguration\",\"ListItemText\":\"Get-AzMySqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlConnectionString\",\"ListItemText\":\"Get-AzMySqlConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFirewallRule\",\"ListItemText\":\"Get-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServer\",\"ListItemText\":\"Get-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerConfiguration\",\"ListItemText\":\"Get-AzMySqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerConnectionString\",\"ListItemText\":\"Get-AzMySqlFlexibleServerConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerDatabase\",\"ListItemText\":\"Get-AzMySqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"Get-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerLocationBasedCapability\",\"ListItemText\":\"Get-AzMySqlFlexibleServerLocationBasedCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerLocationBasedCapability \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlFlexibleServerReplica\",\"ListItemText\":\"Get-AzMySqlFlexibleServerReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlFlexibleServerReplica \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlReplica\",\"ListItemText\":\"Get-AzMySqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlReplica \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlServer\",\"ListItemText\":\"Get-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Get-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"Get-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Get-AzNatGateway\",\"ListItemText\":\"Get-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzNatGateway\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkInterface\",\"ListItemText\":\"Get-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Get-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Get-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManager\",\"ListItemText\":\"Get-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerActiveConnectivityConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerActiveConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerActiveConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerActiveSecurityAdminRule\",\"ListItemText\":\"Get-AzNetworkManagerActiveSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerActiveSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerDeploymentStatus\",\"ListItemText\":\"Get-AzNetworkManagerDeploymentStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerDeploymentStatus\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerEffectiveConnectivityConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerEffectiveConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerEffectiveConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerEffectiveSecurityAdminRule\",\"ListItemText\":\"Get-AzNetworkManagerEffectiveSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerEffectiveSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerGroup\",\"ListItemText\":\"Get-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"Get-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerScopeConnection\",\"ListItemText\":\"Get-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"Get-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"Get-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"Get-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerStaticMember\",\"ListItemText\":\"Get-AzNetworkManagerStaticMember\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerStaticMember\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"Get-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkProfile\",\"ListItemText\":\"Get-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkSecurityGroup\",\"ListItemText\":\"Get-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Get-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkServiceTag\",\"ListItemText\":\"Get-AzNetworkServiceTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkServiceTag\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkUsage\",\"ListItemText\":\"Get-AzNetworkUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkUsage\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkVirtualAppliance\",\"ListItemText\":\"Get-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkVirtualApplianceSku\",\"ListItemText\":\"Get-AzNetworkVirtualApplianceSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkVirtualApplianceSku\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcher\",\"ListItemText\":\"Get-AzNetworkWatcher\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcher\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Get-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherConnectionMonitorReport\",\"ListItemText\":\"Get-AzNetworkWatcherConnectionMonitorReport\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherConnectionMonitorReport\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherFlowLog\",\"ListItemText\":\"Get-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherFlowLogStatus\",\"ListItemText\":\"Get-AzNetworkWatcherFlowLogStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherFlowLogStatus\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherNextHop\",\"ListItemText\":\"Get-AzNetworkWatcherNextHop\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherNextHop\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"Get-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherReachabilityProvidersList\",\"ListItemText\":\"Get-AzNetworkWatcherReachabilityProvidersList\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherReachabilityProvidersList\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherReachabilityReport\",\"ListItemText\":\"Get-AzNetworkWatcherReachabilityReport\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherReachabilityReport\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherSecurityGroupView\",\"ListItemText\":\"Get-AzNetworkWatcherSecurityGroupView\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherSecurityGroupView\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherTopology\",\"ListItemText\":\"Get-AzNetworkWatcherTopology\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherTopology\\r\\n\"},{\"CompletionText\":\"Get-AzNetworkWatcherTroubleshootingResult\",\"ListItemText\":\"Get-AzNetworkWatcherTroubleshootingResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzNetworkWatcherTroubleshootingResult\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHub\",\"ListItemText\":\"Get-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"Get-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"Get-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"Get-AzNotificationHubListKey\",\"ListItemText\":\"Get-AzNotificationHubListKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubListKey\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubListKeys\",\"ListItemText\":\"Get-AzNotificationHubListKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubListKeys\"},{\"CompletionText\":\"Get-AzNotificationHubPNSCredential\",\"ListItemText\":\"Get-AzNotificationHubPNSCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubPNSCredential\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubPNSCredentials\",\"ListItemText\":\"Get-AzNotificationHubPNSCredentials\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubPNSCredentials\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespace\",\"ListItemText\":\"Get-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceListKey\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceListKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceListKey\\r\\n\"},{\"CompletionText\":\"Get-AzNotificationHubsNamespaceListKeys\",\"ListItemText\":\"Get-AzNotificationHubsNamespaceListKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzNotificationHubsNamespaceListKeys\"},{\"CompletionText\":\"Get-AzOperationalInsightsAvailableServiceTier\",\"ListItemText\":\"Get-AzOperationalInsightsAvailableServiceTier\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsAvailableServiceTier\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsCluster\",\"ListItemText\":\"Get-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsDataExport\",\"ListItemText\":\"Get-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsDataSource\",\"ListItemText\":\"Get-AzOperationalInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsDataSource\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsDeletedWorkspace\",\"ListItemText\":\"Get-AzOperationalInsightsDeletedWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsDeletedWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsIntelligencePack\",\"ListItemText\":\"Get-AzOperationalInsightsIntelligencePack\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsIntelligencePack\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsIntelligencePacks\",\"ListItemText\":\"Get-AzOperationalInsightsIntelligencePacks\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsIntelligencePacks\"},{\"CompletionText\":\"Get-AzOperationalInsightsLinkedService\",\"ListItemText\":\"Get-AzOperationalInsightsLinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsLinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"Get-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsOperation\",\"ListItemText\":\"Get-AzOperationalInsightsOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsOperation\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsOperationStatus\",\"ListItemText\":\"Get-AzOperationalInsightsOperationStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsOperationStatus\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsPurgeWorkspaceStatus\",\"ListItemText\":\"Get-AzOperationalInsightsPurgeWorkspaceStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsPurgeWorkspaceStatus\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"Get-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsSchema\",\"ListItemText\":\"Get-AzOperationalInsightsSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsSchema\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"Get-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsTable\",\"ListItemText\":\"Get-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceManagementGroup\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceManagementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceManagementGroups\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceManagementGroups\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceManagementGroups\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceSharedKey\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceSharedKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceSharedKey\\r\\n\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceSharedKeys\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceSharedKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceSharedKeys\"},{\"CompletionText\":\"Get-AzOperationalInsightsWorkspaceUsage\",\"ListItemText\":\"Get-AzOperationalInsightsWorkspaceUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzOperationalInsightsWorkspaceUsage\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGateway\",\"ListItemText\":\"Get-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGatewayConnectionHealth\",\"ListItemText\":\"Get-AzP2sVpnGatewayConnectionHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGatewayConnectionHealth\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGatewayDetailedConnectionHealth\",\"ListItemText\":\"Get-AzP2sVpnGatewayDetailedConnectionHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGatewayDetailedConnectionHealth\\r\\n\"},{\"CompletionText\":\"Get-AzP2sVpnGatewayVpnProfile\",\"ListItemText\":\"Get-AzP2sVpnGatewayVpnProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzP2sVpnGatewayVpnProfile\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyAlias\",\"ListItemText\":\"Get-AzPolicyAlias\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyAlias\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyAssignment\",\"ListItemText\":\"Get-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyAttestation\",\"ListItemText\":\"Get-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyDefinition\",\"ListItemText\":\"Get-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyEvent\",\"ListItemText\":\"Get-AzPolicyEvent\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyEvent\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyExemption\",\"ListItemText\":\"Get-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyMetadata\",\"ListItemText\":\"Get-AzPolicyMetadata\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyMetadata\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyRemediation\",\"ListItemText\":\"Get-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Get-AzPolicySetDefinition\",\"ListItemText\":\"Get-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyState\",\"ListItemText\":\"Get-AzPolicyState\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyState\\r\\n\"},{\"CompletionText\":\"Get-AzPolicyStateSummary\",\"ListItemText\":\"Get-AzPolicyStateSummary\",\"ResultType\":2,\"ToolTip\":\"Get-AzPolicyStateSummary\\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlConfiguration\",\"ListItemText\":\"Get-AzPostgreSqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlConnectionString\",\"ListItemText\":\"Get-AzPostgreSqlConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFirewallRule\",\"ListItemText\":\"Get-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerConfiguration\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerConnectionString\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerConnectionString\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerConnectionString \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerDatabase\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlFlexibleServerLocationBasedCapability\",\"ListItemText\":\"Get-AzPostgreSqlFlexibleServerLocationBasedCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlFlexibleServerLocationBasedCapability \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlReplica\",\"ListItemText\":\"Get-AzPostgreSqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlReplica \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlServer\",\"ListItemText\":\"Get-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Get-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"Get-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Get-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspace\",\"ListItemText\":\"Get-AzPowerBIWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspaceCollection\",\"ListItemText\":\"Get-AzPowerBIWorkspaceCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspaceCollection\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspaceCollectionAccessKey\",\"ListItemText\":\"Get-AzPowerBIWorkspaceCollectionAccessKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspaceCollectionAccessKey\\r\\n\"},{\"CompletionText\":\"Get-AzPowerBIWorkspaceCollectionAccessKeys\",\"ListItemText\":\"Get-AzPowerBIWorkspaceCollectionAccessKeys\",\"ResultType\":2,\"ToolTip\":\"Get-AzPowerBIWorkspaceCollectionAccessKeys\"},{\"CompletionText\":\"Get-AzPrivateDnsRecordSet\",\"ListItemText\":\"Get-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"Get-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateDnsZone\",\"ListItemText\":\"Get-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateDnsZoneGroup\",\"ListItemText\":\"Get-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateEndpoint\",\"ListItemText\":\"Get-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateEndpointConnection\",\"ListItemText\":\"Get-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateLinkAssociation\",\"ListItemText\":\"Get-AzPrivateLinkAssociation\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateLinkAssociation\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateLinkResource\",\"ListItemText\":\"Get-AzPrivateLinkResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateLinkResource\\r\\n\"},{\"CompletionText\":\"Get-AzPrivateLinkService\",\"ListItemText\":\"Get-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Get-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Get-AzProviderFeature\",\"ListItemText\":\"Get-AzProviderFeature\",\"ResultType\":2,\"ToolTip\":\"Get-AzProviderFeature\\r\\n\"},{\"CompletionText\":\"Get-AzProviderOperation\",\"ListItemText\":\"Get-AzProviderOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzProviderOperation\\r\\n\"},{\"CompletionText\":\"Get-AzProviderPreviewFeature\",\"ListItemText\":\"Get-AzProviderPreviewFeature\",\"ResultType\":2,\"ToolTip\":\"Get-AzProviderPreviewFeature\\r\\n\"},{\"CompletionText\":\"Get-AzProximityPlacementGroup\",\"ListItemText\":\"Get-AzProximityPlacementGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzProximityPlacementGroup\\r\\n\"},{\"CompletionText\":\"Get-AzPublicIpAddress\",\"ListItemText\":\"Get-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"Get-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"Get-AzPublicIpPrefix\",\"ListItemText\":\"Get-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Get-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrAlertSetting\",\"ListItemText\":\"Get-AzRecoveryServicesAsrAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrAlertSetting\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrEvent\",\"ListItemText\":\"Get-AzRecoveryServicesAsrEvent\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrEvent\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrFabric\",\"ListItemText\":\"Get-AzRecoveryServicesAsrFabric\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrFabric\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Get-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrNetwork\",\"ListItemText\":\"Get-AzRecoveryServicesAsrNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrNetwork\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"Get-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrNotificationSetting\",\"ListItemText\":\"Get-AzRecoveryServicesAsrNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrNotificationSetting\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"Get-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrProtectableItem\",\"ListItemText\":\"Get-AzRecoveryServicesAsrProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrProtectableItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrProtectionContainer\",\"ListItemText\":\"Get-AzRecoveryServicesAsrProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrProtectionContainer\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"Get-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Get-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrRecoveryPoint\",\"ListItemText\":\"Get-AzRecoveryServicesAsrRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"Get-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrServicesProvider\",\"ListItemText\":\"Get-AzRecoveryServicesAsrServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrServicesProvider\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrStorageClassification\",\"ListItemText\":\"Get-AzRecoveryServicesAsrStorageClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrStorageClassification\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrStorageClassificationMapping\",\"ListItemText\":\"Get-AzRecoveryServicesAsrStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrStorageClassificationMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrVaultContext\",\"ListItemText\":\"Get-AzRecoveryServicesAsrVaultContext\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrVaultContext\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrVaultSettings\",\"ListItemText\":\"Get-AzRecoveryServicesAsrVaultSettings\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrVaultSettings\"},{\"CompletionText\":\"Get-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"Get-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupContainer\",\"ListItemText\":\"Get-AzRecoveryServicesBackupContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupContainer\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupItem\",\"ListItemText\":\"Get-AzRecoveryServicesBackupItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupJob\",\"ListItemText\":\"Get-AzRecoveryServicesBackupJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupJob\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupJobDetail\",\"ListItemText\":\"Get-AzRecoveryServicesBackupJobDetail\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupJobDetail\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupManagementServer\",\"ListItemText\":\"Get-AzRecoveryServicesBackupManagementServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupManagementServer\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProperties\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProperties\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProperties\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProperty\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProperty\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProtectableItem\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProtectableItem\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"Get-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRecommendedArchivableRPGroup\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRecommendedArchivableRPGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRecommendedArchivableRPGroup\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRecoveryLogChain\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRecoveryLogChain\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRecoveryLogChain\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRecoveryPoint\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRetentionPolicyObject\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRetentionPolicyObject\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRetentionPolicyObject\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupRPMountScript\",\"ListItemText\":\"Get-AzRecoveryServicesBackupRPMountScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupRPMountScript\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupSchedulePolicyObject\",\"ListItemText\":\"Get-AzRecoveryServicesBackupSchedulePolicyObject\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupSchedulePolicyObject\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupStatus\",\"ListItemText\":\"Get-AzRecoveryServicesBackupStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupStatus\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesBackupWorkloadRecoveryConfig\",\"ListItemText\":\"Get-AzRecoveryServicesBackupWorkloadRecoveryConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesBackupWorkloadRecoveryConfig\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesResourceGuardMapping\",\"ListItemText\":\"Get-AzRecoveryServicesResourceGuardMapping\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesResourceGuardMapping\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesVault\",\"ListItemText\":\"Get-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesVaultProperty\",\"ListItemText\":\"Get-AzRecoveryServicesVaultProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesVaultProperty\\r\\n\"},{\"CompletionText\":\"Get-AzRecoveryServicesVaultSettingsFile\",\"ListItemText\":\"Get-AzRecoveryServicesVaultSettingsFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzRecoveryServicesVaultSettingsFile\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCache\",\"ListItemText\":\"Get-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCacheFirewallRule\",\"ListItemText\":\"Get-AzRedisCacheFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCacheFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCacheKey\",\"ListItemText\":\"Get-AzRedisCacheKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCacheKey\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCacheLink\",\"ListItemText\":\"Get-AzRedisCacheLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCacheLink\\r\\n\"},{\"CompletionText\":\"Get-AzRedisCachePatchSchedule\",\"ListItemText\":\"Get-AzRedisCachePatchSchedule\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisCachePatchSchedule\\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCache\",\"ListItemText\":\"Get-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheAccessKey\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheAccessKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisEnterpriseCacheAccessKey\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheDatabaseKey\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheDatabaseKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzRedisEnterpriseCacheDatabaseKey\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheKey\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCacheKey \\r\\n\"},{\"CompletionText\":\"Get-AzRedisEnterpriseCacheOperationStatus\",\"ListItemText\":\"Get-AzRedisEnterpriseCacheOperationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRedisEnterpriseCacheOperationStatus \\r\\n\"},{\"CompletionText\":\"Get-AzRegulatoryComplainceAssessment\",\"ListItemText\":\"Get-AzRegulatoryComplainceAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplainceAssessment\"},{\"CompletionText\":\"Get-AzRegulatoryComplianceAssessment\",\"ListItemText\":\"Get-AzRegulatoryComplianceAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplianceAssessment\\r\\n\"},{\"CompletionText\":\"Get-AzRegulatoryComplianceControl\",\"ListItemText\":\"Get-AzRegulatoryComplianceControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplianceControl\\r\\n\"},{\"CompletionText\":\"Get-AzRegulatoryComplianceStandard\",\"ListItemText\":\"Get-AzRegulatoryComplianceStandard\",\"ResultType\":2,\"ToolTip\":\"Get-AzRegulatoryComplianceStandard\\r\\n\"},{\"CompletionText\":\"Get-AzRelayAuthorizationRule\",\"ListItemText\":\"Get-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Get-AzRelayHybridConnection\",\"ListItemText\":\"Get-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"Get-AzRelayKey\",\"ListItemText\":\"Get-AzRelayKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayKey \\r\\n\"},{\"CompletionText\":\"Get-AzRelayNamespace\",\"ListItemText\":\"Get-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzRelayNamespaceNetworkRuleSet\",\"ListItemText\":\"Get-AzRelayNamespaceNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRelayNamespaceNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzRemoteDesktopFile\",\"ListItemText\":\"Get-AzRemoteDesktopFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzRemoteDesktopFile\\r\\n\"},{\"CompletionText\":\"Get-AzResource\",\"ListItemText\":\"Get-AzResource\",\"ResultType\":2,\"ToolTip\":\"Get-AzResource\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroup\",\"ListItemText\":\"Get-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroupDeployment\",\"ListItemText\":\"Get-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroupDeploymentOperation\",\"ListItemText\":\"Get-AzResourceGroupDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroupDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzResourceGroupDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzResourceGroupDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceGroupDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzResourceLock\",\"ListItemText\":\"Get-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceLock\\r\\n\"},{\"CompletionText\":\"Get-AzResourceManagementPrivateLink\",\"ListItemText\":\"Get-AzResourceManagementPrivateLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceManagementPrivateLink\\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverMoveCollection\",\"ListItemText\":\"Get-AzResourceMoverMoveCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverMoveCollection \\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverMoveResource\",\"ListItemText\":\"Get-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverMoveResource \\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverRequiredForResources\",\"ListItemText\":\"Get-AzResourceMoverRequiredForResources\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverRequiredForResources \\r\\n\"},{\"CompletionText\":\"Get-AzResourceMoverUnresolvedDependency\",\"ListItemText\":\"Get-AzResourceMoverUnresolvedDependency\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzResourceMoverUnresolvedDependency \\r\\n\"},{\"CompletionText\":\"Get-AzResourceProvider\",\"ListItemText\":\"Get-AzResourceProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceProvider\\r\\n\"},{\"CompletionText\":\"Get-AzResourceProviderAction\",\"ListItemText\":\"Get-AzResourceProviderAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzResourceProviderAction\"},{\"CompletionText\":\"Get-AzRestorePoint\",\"ListItemText\":\"Get-AzRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzRestorePoint\\r\\n\"},{\"CompletionText\":\"Get-AzRestorePointCollection\",\"ListItemText\":\"Get-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"Get-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"Get-AzRmStorageContainer\",\"ListItemText\":\"Get-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"Get-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Get-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzRmStorageShare\",\"ListItemText\":\"Get-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignment\",\"ListItemText\":\"Get-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignmentSchedule\",\"ListItemText\":\"Get-AzRoleAssignmentSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleAssignmentSchedule \\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignmentScheduleInstance\",\"ListItemText\":\"Get-AzRoleAssignmentScheduleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleAssignmentScheduleInstance \\r\\n\"},{\"CompletionText\":\"Get-AzRoleAssignmentScheduleRequest\",\"ListItemText\":\"Get-AzRoleAssignmentScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleAssignmentScheduleRequest \\r\\n\"},{\"CompletionText\":\"Get-AzRoleDefinition\",\"ListItemText\":\"Get-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibilitySchedule\",\"ListItemText\":\"Get-AzRoleEligibilitySchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibilitySchedule \\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibilityScheduleInstance\",\"ListItemText\":\"Get-AzRoleEligibilityScheduleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibilityScheduleInstance \\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibilityScheduleRequest\",\"ListItemText\":\"Get-AzRoleEligibilityScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibilityScheduleRequest \\r\\n\"},{\"CompletionText\":\"Get-AzRoleEligibleChildResource\",\"ListItemText\":\"Get-AzRoleEligibleChildResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleEligibleChildResource \\r\\n\"},{\"CompletionText\":\"Get-AzRoleManagementPolicy\",\"ListItemText\":\"Get-AzRoleManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleManagementPolicy \\r\\n\"},{\"CompletionText\":\"Get-AzRoleManagementPolicyAssignment\",\"ListItemText\":\"Get-AzRoleManagementPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzRoleManagementPolicyAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzRouteConfig\",\"ListItemText\":\"Get-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Get-AzRouteFilter\",\"ListItemText\":\"Get-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"Get-AzRouteFilterRuleConfig\",\"ListItemText\":\"Get-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Get-AzRouteMap\",\"ListItemText\":\"Get-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteMap\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServer\",\"ListItemText\":\"Get-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServer\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServerPeer\",\"ListItemText\":\"Get-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServerPeerAdvertisedRoute\",\"ListItemText\":\"Get-AzRouteServerPeerAdvertisedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServerPeerAdvertisedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzRouteServerPeerLearnedRoute\",\"ListItemText\":\"Get-AzRouteServerPeerLearnedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteServerPeerLearnedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzRouteTable\",\"ListItemText\":\"Get-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzRoutingIntent\",\"ListItemText\":\"Get-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"Get-AzRoutingPolicy\",\"ListItemText\":\"Get-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzScheduledQueryRule\",\"ListItemText\":\"Get-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdaptiveApplicationControl\",\"ListItemText\":\"Get-AzSecurityAdaptiveApplicationControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdaptiveApplicationControl\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdaptiveApplicationControlGroup\",\"ListItemText\":\"Get-AzSecurityAdaptiveApplicationControlGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdaptiveApplicationControlGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdaptiveNetworkHardening\",\"ListItemText\":\"Get-AzSecurityAdaptiveNetworkHardening\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdaptiveNetworkHardening\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAdvancedThreatProtection\",\"ListItemText\":\"Get-AzSecurityAdvancedThreatProtection\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAdvancedThreatProtection\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAlert\",\"ListItemText\":\"Get-AzSecurityAlert\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAlert\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAssessment\",\"ListItemText\":\"Get-AzSecurityAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAssessment\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAssessmentMetadata\",\"ListItemText\":\"Get-AzSecurityAssessmentMetadata\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAssessmentMetadata\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAutomation\",\"ListItemText\":\"Get-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityAutoProvisioningSetting\",\"ListItemText\":\"Get-AzSecurityAutoProvisioningSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityAutoProvisioningSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityCompliance\",\"ListItemText\":\"Get-AzSecurityCompliance\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityCompliance\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityContact\",\"ListItemText\":\"Get-AzSecurityContact\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityContact\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityLocation\",\"ListItemText\":\"Get-AzSecurityLocation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityLocation\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityPartnerProvider\",\"ListItemText\":\"Get-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityPricing\",\"ListItemText\":\"Get-AzSecurityPricing\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityPricing\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySecureScore\",\"ListItemText\":\"Get-AzSecuritySecureScore\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySecureScore\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySecureScoreControl\",\"ListItemText\":\"Get-AzSecuritySecureScoreControl\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySecureScoreControl\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySecureScoreControlDefinition\",\"ListItemText\":\"Get-AzSecuritySecureScoreControlDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySecureScoreControlDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySetting\",\"ListItemText\":\"Get-AzSecuritySetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySetting\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySolution\",\"ListItemText\":\"Get-AzSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySolution\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySolutionsReferenceData\",\"ListItemText\":\"Get-AzSecuritySolutionsReferenceData\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySolutionsReferenceData\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Get-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanResult\",\"ListItemText\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySqlVulnerabilityAssessmentScanResult\\r\\n\"},{\"CompletionText\":\"Get-AzSecuritySubAssessment\",\"ListItemText\":\"Get-AzSecuritySubAssessment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecuritySubAssessment\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityTask\",\"ListItemText\":\"Get-AzSecurityTask\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityTask\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityTopology\",\"ListItemText\":\"Get-AzSecurityTopology\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityTopology\\r\\n\"},{\"CompletionText\":\"Get-AzSecurityWorkspaceSetting\",\"ListItemText\":\"Get-AzSecurityWorkspaceSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSecurityWorkspaceSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAlertRule\",\"ListItemText\":\"Get-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAlertRuleAction\",\"ListItemText\":\"Get-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAlertRuleTemplate\",\"ListItemText\":\"Get-AzSentinelAlertRuleTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAlertRuleTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelAutomationRule\",\"ListItemText\":\"Get-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelBookmark\",\"ListItemText\":\"Get-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelBookmarkRelation\",\"ListItemText\":\"Get-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelDataConnector\",\"ListItemText\":\"Get-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEnrichment\",\"ListItemText\":\"Get-AzSentinelEnrichment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEnrichment \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntity\",\"ListItemText\":\"Get-AzSentinelEntity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntity \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityActivity\",\"ListItemText\":\"Get-AzSentinelEntityActivity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityActivity \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityInsight\",\"ListItemText\":\"Get-AzSentinelEntityInsight\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityInsight \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityQuery\",\"ListItemText\":\"Get-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityQueryTemplate\",\"ListItemText\":\"Get-AzSentinelEntityQueryTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityQueryTemplate \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityRelation\",\"ListItemText\":\"Get-AzSentinelEntityRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityRelation \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelEntityTimeline\",\"ListItemText\":\"Get-AzSentinelEntityTimeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelEntityTimeline \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncident\",\"ListItemText\":\"Get-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentAlert\",\"ListItemText\":\"Get-AzSentinelIncidentAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentAlert \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentBookmark\",\"ListItemText\":\"Get-AzSentinelIncidentBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentBookmark \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentComment\",\"ListItemText\":\"Get-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentEntity\",\"ListItemText\":\"Get-AzSentinelIncidentEntity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentEntity \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelIncidentRelation\",\"ListItemText\":\"Get-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelMetadata\",\"ListItemText\":\"Get-AzSentinelMetadata\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelMetadata \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelOnboardingState\",\"ListItemText\":\"Get-AzSentinelOnboardingState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelOnboardingState \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelSetting\",\"ListItemText\":\"Get-AzSentinelSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelSetting \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelThreatIntelligenceIndicator\",\"ListItemText\":\"Get-AzSentinelThreatIntelligenceIndicator\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelThreatIntelligenceIndicator \\r\\n\"},{\"CompletionText\":\"Get-AzSentinelThreatIntelligenceIndicatorMetric\",\"ListItemText\":\"Get-AzSentinelThreatIntelligenceIndicatorMetric\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSentinelThreatIntelligenceIndicatorMetric \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusAuthorizationRule\",\"ListItemText\":\"Get-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusGeoDRConfiguration\",\"ListItemText\":\"Get-AzServiceBusGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusKey\",\"ListItemText\":\"Get-AzServiceBusKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusKey \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusMigration\",\"ListItemText\":\"Get-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusNamespace\",\"ListItemText\":\"Get-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusNamespaceV2\",\"ListItemText\":\"Get-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"Get-AzServiceBusNetworkRuleSet\",\"ListItemText\":\"Get-AzServiceBusNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Get-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusPrivateLink\",\"ListItemText\":\"Get-AzServiceBusPrivateLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusPrivateLink \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusQueue\",\"ListItemText\":\"Get-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusRule\",\"ListItemText\":\"Get-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusSubscription\",\"ListItemText\":\"Get-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"Get-AzServiceBusTopic\",\"ListItemText\":\"Get-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"Get-AzServiceEndpointPolicy\",\"ListItemText\":\"Get-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Get-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricApplication\",\"ListItemText\":\"Get-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricApplicationType\",\"ListItemText\":\"Get-AzServiceFabricApplicationType\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricApplicationType\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricApplicationTypeVersion\",\"ListItemText\":\"Get-AzServiceFabricApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricCluster\",\"ListItemText\":\"Get-AzServiceFabricCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricCluster\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedCluster\",\"ListItemText\":\"Get-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedClusterService\",\"ListItemText\":\"Get-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Get-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Get-AzServiceFabricService\",\"ListItemText\":\"Get-AzServiceFabricService\",\"ResultType\":2,\"ToolTip\":\"Get-AzServiceFabricService\\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationForContainerApp\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationForContainerApp \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationForSpringCloud\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationForSpringCloud \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationForWebApp\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationForWebApp \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerConfigurationName\",\"ListItemText\":\"Get-AzServiceLinkerConfigurationName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerConfigurationName \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Get-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Get-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Get-AzServiceLinkerForWebApp\",\"ListItemText\":\"Get-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Get-AzSignalR\",\"ListItemText\":\"Get-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Get-AzSignalR\\r\\n\"},{\"CompletionText\":\"Get-AzSignalRKey\",\"ListItemText\":\"Get-AzSignalRKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSignalRKey\\r\\n\"},{\"CompletionText\":\"Get-AzSignalRUsage\",\"ListItemText\":\"Get-AzSignalRUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzSignalRUsage\\r\\n\"},{\"CompletionText\":\"Get-AzSnapshot\",\"ListItemText\":\"Get-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-AzSnapshot\\r\\n\"},{\"CompletionText\":\"Get-AzSqlCapability\",\"ListItemText\":\"Get-AzSqlCapability\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlCapability\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabase\",\"ListItemText\":\"Get-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseActivity\",\"ListItemText\":\"Get-AzSqlDatabaseActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseAdvisor\",\"ListItemText\":\"Get-AzSqlDatabaseAdvisor\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseAdvisor\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseAudit\",\"ListItemText\":\"Get-AzSqlDatabaseAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseAudit\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseDataMaskingPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseDataMaskingPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseDataMaskingPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"Get-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseExpanded\",\"ListItemText\":\"Get-AzSqlDatabaseExpanded\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseExpanded\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Get-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseGeoBackup\",\"ListItemText\":\"Get-AzSqlDatabaseGeoBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseGeoBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseGeoBackupPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseGeoBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseGeoBackupPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseImportExportStatus\",\"ListItemText\":\"Get-AzSqlDatabaseImportExportStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseImportExportStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseIndexRecommendation\",\"ListItemText\":\"Get-AzSqlDatabaseIndexRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseIndexRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Get-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseLedgerDigestUpload\",\"ListItemText\":\"Get-AzSqlDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Get-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseLongTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseLongTermRetentionPolicy\"},{\"CompletionText\":\"Get-AzSqlDatabaseRecommendedAction\",\"ListItemText\":\"Get-AzSqlDatabaseRecommendedAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseRecommendedAction\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseReplicationLink\",\"ListItemText\":\"Get-AzSqlDatabaseReplicationLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseReplicationLink\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseRestorePoint\",\"ListItemText\":\"Get-AzSqlDatabaseRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseRestorePoint\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseSensitivityClassification\",\"ListItemText\":\"Get-AzSqlDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseSensitivityRecommendation\",\"ListItemText\":\"Get-AzSqlDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseServerAuditingPolicy\",\"ListItemText\":\"Get-AzSqlDatabaseServerAuditingPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseServerAuditingPolicy\"},{\"CompletionText\":\"Get-AzSqlDatabaseTransparentDataEncryption\",\"ListItemText\":\"Get-AzSqlDatabaseTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseTransparentDataEncryptionActivity\",\"ListItemText\":\"Get-AzSqlDatabaseTransparentDataEncryptionActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseTransparentDataEncryptionActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseUpgradeHint\",\"ListItemText\":\"Get-AzSqlDatabaseUpgradeHint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseUpgradeHint\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Get-AzSqlDeletedDatabaseBackup\",\"ListItemText\":\"Get-AzSqlDeletedDatabaseBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDeletedDatabaseBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlDeletedInstanceDatabaseBackup\",\"ListItemText\":\"Get-AzSqlDeletedInstanceDatabaseBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDeletedInstanceDatabaseBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJob\",\"ListItemText\":\"Get-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobAgent\",\"ListItemText\":\"Get-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobCredential\",\"ListItemText\":\"Get-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobExecution\",\"ListItemText\":\"Get-AzSqlElasticJobExecution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobExecution\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobStep\",\"ListItemText\":\"Get-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobStepExecution\",\"ListItemText\":\"Get-AzSqlElasticJobStepExecution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobStepExecution\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobTargetExecution\",\"ListItemText\":\"Get-AzSqlElasticJobTargetExecution\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobTargetExecution\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticJobTargetGroup\",\"ListItemText\":\"Get-AzSqlElasticJobTargetGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticJobTargetGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPool\",\"ListItemText\":\"Get-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolActivity\",\"ListItemText\":\"Get-AzSqlElasticPoolActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolAdvisor\",\"ListItemText\":\"Get-AzSqlElasticPoolAdvisor\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolAdvisor\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolDatabase\",\"ListItemText\":\"Get-AzSqlElasticPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolRecommendation\",\"ListItemText\":\"Get-AzSqlElasticPoolRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlElasticPoolRecommendedAction\",\"ListItemText\":\"Get-AzSqlElasticPoolRecommendedAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlElasticPoolRecommendedAction\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInformationProtectionPolicy\",\"ListItemText\":\"Get-AzSqlInformationProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInformationProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstance\",\"ListItemText\":\"Get-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceActiveDirectoryAdministrator\",\"ListItemText\":\"Get-AzSqlInstanceActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Get-AzSqlInstanceActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceAdvancedDataSecurityPolicy\",\"ListItemText\":\"Get-AzSqlInstanceAdvancedDataSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceAdvancedDataSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabase\",\"ListItemText\":\"Get-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseGeoBackup\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseGeoBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseGeoBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseLedgerDigestUpload\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseLedgerDigestUpload\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseSensitivityClassification\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Get-AzSqlInstanceDtc\",\"ListItemText\":\"Get-AzSqlInstanceDtc\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDtc\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceEndpointCertificate\",\"ListItemText\":\"Get-AzSqlInstanceEndpointCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceEndpointCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceKeyVaultKey\",\"ListItemText\":\"Get-AzSqlInstanceKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceLink\",\"ListItemText\":\"Get-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceOperation\",\"ListItemText\":\"Get-AzSqlInstanceOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceOperation\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstancePool\",\"ListItemText\":\"Get-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstancePoolUsage\",\"ListItemText\":\"Get-AzSqlInstancePoolUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstancePoolUsage\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceServerTrustCertificate\",\"ListItemText\":\"Get-AzSqlInstanceServerTrustCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceServerTrustCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceTDEProtector\",\"ListItemText\":\"Get-AzSqlInstanceTDEProtector\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceTDEProtector\"},{\"CompletionText\":\"Get-AzSqlInstanceTransparentDataEncryptionProtector\",\"ListItemText\":\"Get-AzSqlInstanceTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Get-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServer\",\"ListItemText\":\"Get-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServer\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerActiveDirectoryAdministrator\",\"ListItemText\":\"Get-AzSqlServerActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Get-AzSqlServerActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAdvancedDataSecurityPolicy\",\"ListItemText\":\"Get-AzSqlServerAdvancedDataSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAdvancedDataSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSqlServerAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAdvisor\",\"ListItemText\":\"Get-AzSqlServerAdvisor\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAdvisor\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerAudit\",\"ListItemText\":\"Get-AzSqlServerAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerAudit\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerCommunicationLink\",\"ListItemText\":\"Get-AzSqlServerCommunicationLink\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerCommunicationLink\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerConfigurationOption\",\"ListItemText\":\"Get-AzSqlServerConfigurationOption\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerConfigurationOption\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"Get-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerDisasterRecoveryConfigurationActivity\",\"ListItemText\":\"Get-AzSqlServerDisasterRecoveryConfigurationActivity\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerDisasterRecoveryConfigurationActivity\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerDnsAlias\",\"ListItemText\":\"Get-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerFirewallRule\",\"ListItemText\":\"Get-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"Get-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerKeyVaultKey\",\"ListItemText\":\"Get-AzSqlServerKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerMSSupportAudit\",\"ListItemText\":\"Get-AzSqlServerMSSupportAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerMSSupportAudit\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerOutboundFirewallRule\",\"ListItemText\":\"Get-AzSqlServerOutboundFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerOutboundFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerRecommendedAction\",\"ListItemText\":\"Get-AzSqlServerRecommendedAction\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerRecommendedAction\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerServiceObjective\",\"ListItemText\":\"Get-AzSqlServerServiceObjective\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerServiceObjective\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerTransparentDataEncryptionProtector\",\"ListItemText\":\"Get-AzSqlServerTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerTrustGroup\",\"ListItemText\":\"Get-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerTrustGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerUpgradeHint\",\"ListItemText\":\"Get-AzSqlServerUpgradeHint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerUpgradeHint\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"Get-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Get-AzSqlServerVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlServerVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlServerVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncAgent\",\"ListItemText\":\"Get-AzSqlSyncAgent\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncAgent\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncAgentLinkedDatabase\",\"ListItemText\":\"Get-AzSqlSyncAgentLinkedDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncAgentLinkedDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncGroup\",\"ListItemText\":\"Get-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncGroupLog\",\"ListItemText\":\"Get-AzSqlSyncGroupLog\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncGroupLog\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncMember\",\"ListItemText\":\"Get-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"Get-AzSqlSyncSchema\",\"ListItemText\":\"Get-AzSqlSyncSchema\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlSyncSchema\\r\\n\"},{\"CompletionText\":\"Get-AzSqlVirtualCluster\",\"ListItemText\":\"Get-AzSqlVirtualCluster\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlVirtualCluster\\r\\n\"},{\"CompletionText\":\"Get-AzSqlVM\",\"ListItemText\":\"Get-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSqlVM \\r\\n\"},{\"CompletionText\":\"Get-AzSqlVMGroup\",\"ListItemText\":\"Get-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"Get-AzSshKey\",\"ListItemText\":\"Get-AzSshKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSshKey\\r\\n\"},{\"CompletionText\":\"Get-AzStackHciArcSetting\",\"ListItemText\":\"Get-AzStackHciArcSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHciArcSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStackHciCluster\",\"ListItemText\":\"Get-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"Get-AzStackHciExtension\",\"ListItemText\":\"Get-AzStackHciExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHciExtension \\r\\n\"},{\"CompletionText\":\"Get-AzStackHCIRemoteSupportAccess\",\"ListItemText\":\"Get-AzStackHCIRemoteSupportAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHCIRemoteSupportAccess \\r\\n\"},{\"CompletionText\":\"Get-AzStackHCIRemoteSupportSessionHistory\",\"ListItemText\":\"Get-AzStackHCIRemoteSupportSessionHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHCIRemoteSupportSessionHistory \\r\\n\"},{\"CompletionText\":\"Get-AzStackHCIVMAttestation\",\"ListItemText\":\"Get-AzStackHCIVMAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStackHCIVMAttestation \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebApp\",\"ListItemText\":\"Get-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuild\",\"ListItemText\":\"Get-AzStaticWebAppBuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuild \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuildAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppBuildAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuildAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuildFunction\",\"ListItemText\":\"Get-AzStaticWebAppBuildFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuildFunction \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppBuildFunctionAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppBuildFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppBuildFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppConfiguredRole\",\"ListItemText\":\"Get-AzStaticWebAppConfiguredRole\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppConfiguredRole \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppCustomDomain\",\"ListItemText\":\"Get-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppFunction\",\"ListItemText\":\"Get-AzStaticWebAppFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppFunction \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppFunctionAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppSecret\",\"ListItemText\":\"Get-AzStaticWebAppSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppSecret \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppSetting\",\"ListItemText\":\"Get-AzStaticWebAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppSetting \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppUser\",\"ListItemText\":\"Get-AzStaticWebAppUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppUser \\r\\n\"},{\"CompletionText\":\"Get-AzStaticWebAppUserProvidedFunctionApp\",\"ListItemText\":\"Get-AzStaticWebAppUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStaticWebAppUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccount\",\"ListItemText\":\"Get-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountKey\",\"ListItemText\":\"Get-AzStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountKey\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountManagementPolicy\",\"ListItemText\":\"Get-AzStorageAccountManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountManagementPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountNameAvailability\",\"ListItemText\":\"Get-AzStorageAccountNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountNameAvailability\\r\\n\"},{\"CompletionText\":\"Get-AzStorageAccountNetworkRuleSet\",\"ListItemText\":\"Get-AzStorageAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlob\",\"ListItemText\":\"Get-AzStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlob\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobByTag\",\"ListItemText\":\"Get-AzStorageBlobByTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobByTag\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobContent\",\"ListItemText\":\"Get-AzStorageBlobContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobContent\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobCopyState\",\"ListItemText\":\"Get-AzStorageBlobCopyState\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobCopyState\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobInventoryPolicy\",\"ListItemText\":\"Get-AzStorageBlobInventoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobInventoryPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobQueryResult\",\"ListItemText\":\"Get-AzStorageBlobQueryResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobQueryResult\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobServiceProperty\",\"ListItemText\":\"Get-AzStorageBlobServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobServiceProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageBlobTag\",\"ListItemText\":\"Get-AzStorageBlobTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageBlobTag\\r\\n\"},{\"CompletionText\":\"Get-AzStorageContainer\",\"ListItemText\":\"Get-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"Get-AzStorageContainerAcl\",\"ListItemText\":\"Get-AzStorageContainerAcl\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageContainerAcl\"},{\"CompletionText\":\"Get-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageCORSRule\",\"ListItemText\":\"Get-AzStorageCORSRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageCORSRule\\r\\n\"},{\"CompletionText\":\"Get-AzStorageEncryptionScope\",\"ListItemText\":\"Get-AzStorageEncryptionScope\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageEncryptionScope\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFile\",\"ListItemText\":\"Get-AzStorageFile\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFile\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileContent\",\"ListItemText\":\"Get-AzStorageFileContent\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileContent\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileCopyState\",\"ListItemText\":\"Get-AzStorageFileCopyState\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileCopyState\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileHandle\",\"ListItemText\":\"Get-AzStorageFileHandle\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileHandle\\r\\n\"},{\"CompletionText\":\"Get-AzStorageFileServiceProperty\",\"ListItemText\":\"Get-AzStorageFileServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageFileServiceProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageLocalUser\",\"ListItemText\":\"Get-AzStorageLocalUser\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageLocalUser\\r\\n\"},{\"CompletionText\":\"Get-AzStorageLocalUserKey\",\"ListItemText\":\"Get-AzStorageLocalUserKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageLocalUserKey\\r\\n\"},{\"CompletionText\":\"Get-AzStorageMover\",\"ListItemText\":\"Get-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMover \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverAgent\",\"ListItemText\":\"Get-AzStorageMoverAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverAgent \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverEndpoint\",\"ListItemText\":\"Get-AzStorageMoverEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverEndpoint \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverJobDefinition\",\"ListItemText\":\"Get-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverJobRun\",\"ListItemText\":\"Get-AzStorageMoverJobRun\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverJobRun \\r\\n\"},{\"CompletionText\":\"Get-AzStorageMoverProject\",\"ListItemText\":\"Get-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"Get-AzStorageObjectReplicationPolicy\",\"ListItemText\":\"Get-AzStorageObjectReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageObjectReplicationPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageQueue\",\"ListItemText\":\"Get-AzStorageQueue\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageQueue\\r\\n\"},{\"CompletionText\":\"Get-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageServiceLoggingProperty\",\"ListItemText\":\"Get-AzStorageServiceLoggingProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageServiceLoggingProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageServiceMetricsProperty\",\"ListItemText\":\"Get-AzStorageServiceMetricsProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageServiceMetricsProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageServiceProperty\",\"ListItemText\":\"Get-AzStorageServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageServiceProperty\\r\\n\"},{\"CompletionText\":\"Get-AzStorageShare\",\"ListItemText\":\"Get-AzStorageShare\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageShare\\r\\n\"},{\"CompletionText\":\"Get-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncCloudEndpoint\",\"ListItemText\":\"Get-AzStorageSyncCloudEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncCloudEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncGroup\",\"ListItemText\":\"Get-AzStorageSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncGroup\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncServer\",\"ListItemText\":\"Get-AzStorageSyncServer\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncServer\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncServerEndpoint\",\"ListItemText\":\"Get-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzStorageSyncService\",\"ListItemText\":\"Get-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"Get-AzStorageTable\",\"ListItemText\":\"Get-AzStorageTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageTable\\r\\n\"},{\"CompletionText\":\"Get-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"Get-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzStorageUsage\",\"ListItemText\":\"Get-AzStorageUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzStorageUsage\\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsCluster\",\"ListItemText\":\"Get-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsClusterStreamingJob\",\"ListItemText\":\"Get-AzStreamAnalyticsClusterStreamingJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsClusterStreamingJob \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsDefaultFunctionDefinition\",\"ListItemText\":\"Get-AzStreamAnalyticsDefaultFunctionDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsDefaultFunctionDefinition \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsFunction\",\"ListItemText\":\"Get-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsInput\",\"ListItemText\":\"Get-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsJob\",\"ListItemText\":\"Get-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsOutput\",\"ListItemText\":\"Get-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsQuota\",\"ListItemText\":\"Get-AzStreamAnalyticsQuota\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsQuota \\r\\n\"},{\"CompletionText\":\"Get-AzStreamAnalyticsTransformation\",\"ListItemText\":\"Get-AzStreamAnalyticsTransformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzStreamAnalyticsTransformation \\r\\n\"},{\"CompletionText\":\"Get-AzSubscription\",\"ListItemText\":\"Get-AzSubscription\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscription\\r\\n\"},{\"CompletionText\":\"Get-AzSubscriptionDeployment\",\"ListItemText\":\"Get-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscriptionDeployment\"},{\"CompletionText\":\"Get-AzSubscriptionDeploymentOperation\",\"ListItemText\":\"Get-AzSubscriptionDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscriptionDeploymentOperation\"},{\"CompletionText\":\"Get-AzSubscriptionDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzSubscriptionDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzSubscriptionDeploymentWhatIfResult\"},{\"CompletionText\":\"Get-AzSubscriptionDiagnosticSetting\",\"ListItemText\":\"Get-AzSubscriptionDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSubscriptionDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Get-AzSupportProblemClassification\",\"ListItemText\":\"Get-AzSupportProblemClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportProblemClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSupportService\",\"ListItemText\":\"Get-AzSupportService\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportService\\r\\n\"},{\"CompletionText\":\"Get-AzSupportTicket\",\"ListItemText\":\"Get-AzSupportTicket\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportTicket\\r\\n\"},{\"CompletionText\":\"Get-AzSupportTicketCommunication\",\"ListItemText\":\"Get-AzSupportTicketCommunication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSupportTicketCommunication\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseActiveDirectoryOnlyAuthentication\",\"ListItemText\":\"Get-AzSynapseActiveDirectoryOnlyAuthentication\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseActiveDirectoryOnlyAuthentication\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseActivityRun\",\"ListItemText\":\"Get-AzSynapseActivityRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseActivityRun\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDataFlow\",\"ListItemText\":\"Get-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDataFlow\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDataFlowDebugSession\",\"ListItemText\":\"Get-AzSynapseDataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDataset\",\"ListItemText\":\"Get-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDataset\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseDroppedSqlPool\",\"ListItemText\":\"Get-AzSynapseDroppedSqlPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseDroppedSqlPool\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseFirewallRule\",\"ListItemText\":\"Get-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntimeKey\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntimeMetric\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntimeMetric\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntimeMetric\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseIntegrationRuntimeNode\",\"ListItemText\":\"Get-AzSynapseIntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseIntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKqlScript\",\"ListItemText\":\"Get-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPool\",\"ListItemText\":\"Get-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ListItemText\":\"Get-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"Get-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ListItemText\":\"Get-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"Get-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolFollowerDatabase\",\"ListItemText\":\"Get-AzSynapseKustoPoolFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolLanguageExtension\",\"ListItemText\":\"Get-AzSynapseKustoPoolLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolLanguageExtension \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolPrincipalAssignment\",\"ListItemText\":\"Get-AzSynapseKustoPoolPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseKustoPoolSku\",\"ListItemText\":\"Get-AzSynapseKustoPoolSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSynapseKustoPoolSku \\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnection\",\"ListItemText\":\"Get-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnectionDetailedStatus\",\"ListItemText\":\"Get-AzSynapseLinkConnectionDetailedStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnectionDetailedStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnectionLinkTable\",\"ListItemText\":\"Get-AzSynapseLinkConnectionLinkTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnectionLinkTable\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkConnectionLinkTableStatus\",\"ListItemText\":\"Get-AzSynapseLinkConnectionLinkTableStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkConnectionLinkTableStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseLinkedService\",\"ListItemText\":\"Get-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseLinkedService\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseManagedIdentitySqlControlSetting\",\"ListItemText\":\"Get-AzSynapseManagedIdentitySqlControlSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseManagedIdentitySqlControlSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"Get-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseManagedPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseNotebook\",\"ListItemText\":\"Get-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Get-AzSynapsePipeline\",\"ListItemText\":\"Get-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Get-AzSynapsePipelineRun\",\"ListItemText\":\"Get-AzSynapsePipelineRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapsePipelineRun\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseRoleAssignment\",\"ListItemText\":\"Get-AzSynapseRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseRoleAssignment\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseRoleDefinition\",\"ListItemText\":\"Get-AzSynapseRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseRoleDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseRoleScope\",\"ListItemText\":\"Get-AzSynapseRoleScope\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseRoleScope\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkConfiguration\",\"ListItemText\":\"Get-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkJob\",\"ListItemText\":\"Get-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkJobDefinition\",\"ListItemText\":\"Get-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkJobDefinition\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkPool\",\"ListItemText\":\"Get-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkSession\",\"ListItemText\":\"Get-AzSynapseSparkSession\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkSession\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSparkStatement\",\"ListItemText\":\"Get-AzSynapseSparkStatement\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSparkStatement\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlActiveDirectoryAdministrator\",\"ListItemText\":\"Get-AzSynapseSqlActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlAdvancedDataSecurityPolicy\",\"ListItemText\":\"Get-AzSynapseSqlAdvancedDataSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAdvancedDataSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlAudit\",\"ListItemText\":\"Get-AzSynapseSqlAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAudit\"},{\"CompletionText\":\"Get-AzSynapseSqlAuditSetting\",\"ListItemText\":\"Get-AzSynapseSqlAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlAuditSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlDatabase\",\"ListItemText\":\"Get-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPool\",\"ListItemText\":\"Get-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Get-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolAudit\",\"ListItemText\":\"Get-AzSynapseSqlPoolAudit\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolAudit\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolAuditSetting\",\"ListItemText\":\"Get-AzSynapseSqlPoolAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolAuditSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolGeoBackup\",\"ListItemText\":\"Get-AzSynapseSqlPoolGeoBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolGeoBackup\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolRestorePoint\",\"ListItemText\":\"Get-AzSynapseSqlPoolRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolRestorePoint\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolSensitivityClassification\",\"ListItemText\":\"Get-AzSynapseSqlPoolSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolSensitivityRecommendation\",\"ListItemText\":\"Get-AzSynapseSqlPoolSensitivityRecommendation\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolSensitivityRecommendation\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolTransparentDataEncryption\",\"ListItemText\":\"Get-AzSynapseSqlPoolTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentScanRecord\",\"ListItemText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentScanRecord\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentScanRecord\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlPoolVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlScript\",\"ListItemText\":\"Get-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseSqlVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseTrigger\",\"ListItemText\":\"Get-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseTriggerRun\",\"ListItemText\":\"Get-AzSynapseTriggerRun\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseTriggerRun\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseTriggerSubscriptionStatus\",\"ListItemText\":\"Get-AzSynapseTriggerSubscriptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseTriggerSubscriptionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseWorkspace\",\"ListItemText\":\"Get-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseWorkspaceKey\",\"ListItemText\":\"Get-AzSynapseWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseWorkspaceKey\\r\\n\"},{\"CompletionText\":\"Get-AzSynapseWorkspacePackage\",\"ListItemText\":\"Get-AzSynapseWorkspacePackage\",\"ResultType\":2,\"ToolTip\":\"Get-AzSynapseWorkspacePackage\\r\\n\"},{\"CompletionText\":\"Get-AzSystemAssignedIdentity\",\"ListItemText\":\"Get-AzSystemAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzSystemAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Get-AzTag\",\"ListItemText\":\"Get-AzTag\",\"ResultType\":2,\"ToolTip\":\"Get-AzTag\\r\\n\"},{\"CompletionText\":\"Get-AzTemplateSpec\",\"ListItemText\":\"Get-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Get-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Get-AzTenant\",\"ListItemText\":\"Get-AzTenant\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenant\\r\\n\"},{\"CompletionText\":\"Get-AzTenantBackfillStatus\",\"ListItemText\":\"Get-AzTenantBackfillStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantBackfillStatus\\r\\n\"},{\"CompletionText\":\"Get-AzTenantDeployment\",\"ListItemText\":\"Get-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Get-AzTenantDeploymentOperation\",\"ListItemText\":\"Get-AzTenantDeploymentOperation\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantDeploymentOperation\\r\\n\"},{\"CompletionText\":\"Get-AzTenantDeploymentWhatIfResult\",\"ListItemText\":\"Get-AzTenantDeploymentWhatIfResult\",\"ResultType\":2,\"ToolTip\":\"Get-AzTenantDeploymentWhatIfResult\\r\\n\"},{\"CompletionText\":\"Get-AzTrafficManagerEndpoint\",\"ListItemText\":\"Get-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Get-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Get-AzTrafficManagerProfile\",\"ListItemText\":\"Get-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Get-AzUserAssignedIdentity\",\"ListItemText\":\"Get-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Get-AzUserAssignedIdentityAssociatedResource\",\"ListItemText\":\"Get-AzUserAssignedIdentityAssociatedResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzUserAssignedIdentityAssociatedResource \\r\\n\"},{\"CompletionText\":\"Get-AzVHubEffectiveRoute\",\"ListItemText\":\"Get-AzVHubEffectiveRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubEffectiveRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVHubInboundRoute\",\"ListItemText\":\"Get-AzVHubInboundRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubInboundRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVHubOutboundRoute\",\"ListItemText\":\"Get-AzVHubOutboundRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubOutboundRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVHubRouteTable\",\"ListItemText\":\"Get-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualApplianceSite\",\"ListItemText\":\"Get-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHub\",\"ListItemText\":\"Get-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHubBgpConnection\",\"ListItemText\":\"Get-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHubRouteTable\",\"ListItemText\":\"Get-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualHubVnetConnection\",\"ListItemText\":\"Get-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetwork\",\"ListItemText\":\"Get-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkAvailableEndpointService\",\"ListItemText\":\"Get-AzVirtualNetworkAvailableEndpointService\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkAvailableEndpointService\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGateway\",\"ListItemText\":\"Get-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayAdvertisedRoute\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayAdvertisedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayAdvertisedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayBgpPeerStatus\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayBgpPeerStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayBgpPeerStatus\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnectionIkeSa\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnectionIkeSa\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnectionIkeSa\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnectionSharedKey\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnectionSharedKey\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnectionSharedKey\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayConnectionVpnDeviceConfigScript\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayConnectionVpnDeviceConfigScript\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayConnectionVpnDeviceConfigScript\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayLearnedRoute\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayLearnedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayLearnedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewaySupportedVpnDevice\",\"ListItemText\":\"Get-AzVirtualNetworkGatewaySupportedVpnDevice\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewaySupportedVpnDevice\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkGatewayVpnclientConnectionHealth\",\"ListItemText\":\"Get-AzVirtualNetworkGatewayVpnclientConnectionHealth\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkGatewayVpnclientConnectionHealth\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkPeering\",\"ListItemText\":\"Get-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Get-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkTap\",\"ListItemText\":\"Get-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualNetworkUsageList\",\"ListItemText\":\"Get-AzVirtualNetworkUsageList\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualNetworkUsageList\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouter\",\"ListItemText\":\"Get-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouterPeer\",\"ListItemText\":\"Get-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouterPeerAdvertisedRoute\",\"ListItemText\":\"Get-AzVirtualRouterPeerAdvertisedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouterPeerAdvertisedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualRouterPeerLearnedRoute\",\"ListItemText\":\"Get-AzVirtualRouterPeerLearnedRoute\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualRouterPeerLearnedRoute\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWan\",\"ListItemText\":\"Get-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWanVpnConfiguration\",\"ListItemText\":\"Get-AzVirtualWanVpnConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWanVpnConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWanVpnServerConfiguration\",\"ListItemText\":\"Get-AzVirtualWanVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWanVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVirtualWanVpnServerConfigurationVpnProfile\",\"ListItemText\":\"Get-AzVirtualWanVpnServerConfigurationVpnProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzVirtualWanVpnServerConfigurationVpnProfile\\r\\n\"},{\"CompletionText\":\"Get-AzVM\",\"ListItemText\":\"Get-AzVM\",\"ResultType\":2,\"ToolTip\":\"Get-AzVM\\r\\n\"},{\"CompletionText\":\"Get-AzVMAccessExtension\",\"ListItemText\":\"Get-AzVMAccessExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMAccessExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMADDomainExtension\",\"ListItemText\":\"Get-AzVMADDomainExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMADDomainExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMAEMExtension\",\"ListItemText\":\"Get-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMBootDiagnosticsData\",\"ListItemText\":\"Get-AzVMBootDiagnosticsData\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMBootDiagnosticsData\\r\\n\"},{\"CompletionText\":\"Get-AzVMChefExtension\",\"ListItemText\":\"Get-AzVMChefExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMChefExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMCustomScriptExtension\",\"ListItemText\":\"Get-AzVMCustomScriptExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMCustomScriptExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMDiagnosticsExtension\",\"ListItemText\":\"Get-AzVMDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMDiskEncryptionStatus\",\"ListItemText\":\"Get-AzVMDiskEncryptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDiskEncryptionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzVMDscExtension\",\"ListItemText\":\"Get-AzVMDscExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDscExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMDscExtensionStatus\",\"ListItemText\":\"Get-AzVMDscExtensionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMDscExtensionStatus\\r\\n\"},{\"CompletionText\":\"Get-AzVMExtension\",\"ListItemText\":\"Get-AzVMExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVMExtensionImage\",\"ListItemText\":\"Get-AzVMExtensionImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMExtensionImage\\r\\n\"},{\"CompletionText\":\"Get-AzVMExtensionImageType\",\"ListItemText\":\"Get-AzVMExtensionImageType\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMExtensionImageType\\r\\n\"},{\"CompletionText\":\"Get-AzVMImage\",\"ListItemText\":\"Get-AzVMImage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImage\\r\\n\"},{\"CompletionText\":\"Get-AzVMImageOffer\",\"ListItemText\":\"Get-AzVMImageOffer\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImageOffer\\r\\n\"},{\"CompletionText\":\"Get-AzVMImagePublisher\",\"ListItemText\":\"Get-AzVMImagePublisher\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImagePublisher\\r\\n\"},{\"CompletionText\":\"Get-AzVMImageSku\",\"ListItemText\":\"Get-AzVMImageSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMImageSku\\r\\n\"},{\"CompletionText\":\"Get-AzVMRunCommand\",\"ListItemText\":\"Get-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMRunCommand\\r\\n\"},{\"CompletionText\":\"Get-AzVMRunCommandDocument\",\"ListItemText\":\"Get-AzVMRunCommandDocument\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMRunCommandDocument\\r\\n\"},{\"CompletionText\":\"Get-AzVMSize\",\"ListItemText\":\"Get-AzVMSize\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMSize\\r\\n\"},{\"CompletionText\":\"Get-AzVMSqlServerExtension\",\"ListItemText\":\"Get-AzVMSqlServerExtension\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMSqlServerExtension\\r\\n\"},{\"CompletionText\":\"Get-AzVmss\",\"ListItemText\":\"Get-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmss\\r\\n\"},{\"CompletionText\":\"Get-AzVmssDiskEncryption\",\"ListItemText\":\"Get-AzVmssDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssDiskEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzVmssDiskEncryptionStatus\",\"ListItemText\":\"Get-AzVmssDiskEncryptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssDiskEncryptionStatus\"},{\"CompletionText\":\"Get-AzVmssRollingUpgrade\",\"ListItemText\":\"Get-AzVmssRollingUpgrade\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssRollingUpgrade\\r\\n\"},{\"CompletionText\":\"Get-AzVmssSku\",\"ListItemText\":\"Get-AzVmssSku\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssSku\\r\\n\"},{\"CompletionText\":\"Get-AzVmssVM\",\"ListItemText\":\"Get-AzVmssVM\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVM\\r\\n\"},{\"CompletionText\":\"Get-AzVmssVMDiskEncryption\",\"ListItemText\":\"Get-AzVmssVMDiskEncryption\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVMDiskEncryption\\r\\n\"},{\"CompletionText\":\"Get-AzVmssVMDiskEncryptionStatus\",\"ListItemText\":\"Get-AzVmssVMDiskEncryptionStatus\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVMDiskEncryptionStatus\"},{\"CompletionText\":\"Get-AzVmssVMRunCommand\",\"ListItemText\":\"Get-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Get-AzVmssVMRunCommand\\r\\n\"},{\"CompletionText\":\"Get-AzVMUsage\",\"ListItemText\":\"Get-AzVMUsage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVMUsage\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientConfiguration\",\"ListItemText\":\"Get-AzVpnClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientIpsecParameter\",\"ListItemText\":\"Get-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientPackage\",\"ListItemText\":\"Get-AzVpnClientPackage\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientPackage\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientRevokedCertificate\",\"ListItemText\":\"Get-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzVpnClientRootCertificate\",\"ListItemText\":\"Get-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzVpnConnection\",\"ListItemText\":\"Get-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"Get-AzVpnGateway\",\"ListItemText\":\"Get-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Get-AzVpnGatewayNatRule\",\"ListItemText\":\"Get-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Get-AzVpnServerConfiguration\",\"ListItemText\":\"Get-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"Get-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"Get-AzVpnSite\",\"ListItemText\":\"Get-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnSite\\r\\n\"},{\"CompletionText\":\"Get-AzVpnSiteLinkConnectionIkeSa\",\"ListItemText\":\"Get-AzVpnSiteLinkConnectionIkeSa\",\"ResultType\":2,\"ToolTip\":\"Get-AzVpnSiteLinkConnectionIkeSa\\r\\n\"},{\"CompletionText\":\"Get-AzWcfRelay\",\"ListItemText\":\"Get-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"Get-AzWebApp\",\"ListItemText\":\"Get-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebApp\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppAccessRestrictionConfig\",\"ListItemText\":\"Get-AzWebAppAccessRestrictionConfig\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppAccessRestrictionConfig\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppBackup\",\"ListItemText\":\"Get-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppBackupConfiguration\",\"ListItemText\":\"Get-AzWebAppBackupConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppBackupConfiguration\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppBackupList\",\"ListItemText\":\"Get-AzWebAppBackupList\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppBackupList\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppCertificate\",\"ListItemText\":\"Get-AzWebAppCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppCertificate\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppContainerContinuousDeploymentUrl\",\"ListItemText\":\"Get-AzWebAppContainerContinuousDeploymentUrl\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppContainerContinuousDeploymentUrl\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppContinuousWebJob\",\"ListItemText\":\"Get-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppPublishingProfile\",\"ListItemText\":\"Get-AzWebAppPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppPublishingProfile\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlot\",\"ListItemText\":\"Get-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotConfigName\",\"ListItemText\":\"Get-AzWebAppSlotConfigName\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSlotConfigName\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Get-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotPublishingProfile\",\"ListItemText\":\"Get-AzWebAppSlotPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSlotPublishingProfile\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotTriggeredWebJob\",\"ListItemText\":\"Get-AzWebAppSlotTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotTriggeredWebJobHistory\",\"ListItemText\":\"Get-AzWebAppSlotTriggeredWebJobHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotTriggeredWebJobHistory \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSlotWebJob\",\"ListItemText\":\"Get-AzWebAppSlotWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppSlotWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSnapshot\",\"ListItemText\":\"Get-AzWebAppSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSnapshot\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppSSLBinding\",\"ListItemText\":\"Get-AzWebAppSSLBinding\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppSSLBinding\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppTrafficRouting\",\"ListItemText\":\"Get-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Get-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Get-AzWebAppTriggeredWebJob\",\"ListItemText\":\"Get-AzWebAppTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppTriggeredWebJobHistory\",\"ListItemText\":\"Get-AzWebAppTriggeredWebJobHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppTriggeredWebJobHistory \\r\\n\"},{\"CompletionText\":\"Get-AzWebAppWebJob\",\"ListItemText\":\"Get-AzWebAppWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebAppWebJob \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSub\",\"ListItemText\":\"Get-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubCustomCertificate\",\"ListItemText\":\"Get-AzWebPubSubCustomCertificate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubCustomCertificate \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubCustomDomain\",\"ListItemText\":\"Get-AzWebPubSubCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubCustomDomain \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubHub\",\"ListItemText\":\"Get-AzWebPubSubHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubHub \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubKey\",\"ListItemText\":\"Get-AzWebPubSubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubKey \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubSku\",\"ListItemText\":\"Get-AzWebPubSubSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubSku \\r\\n\"},{\"CompletionText\":\"Get-AzWebPubSubUsage\",\"ListItemText\":\"Get-AzWebPubSubUsage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWebPubSubUsage \\r\\n\"},{\"CompletionText\":\"Get-AzWvdApplication\",\"ListItemText\":\"Get-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"Get-AzWvdApplicationGroup\",\"ListItemText\":\"Get-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Get-AzWvdDesktop\",\"ListItemText\":\"Get-AzWvdDesktop\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdDesktop \\r\\n\"},{\"CompletionText\":\"Get-AzWvdHostPool\",\"ListItemText\":\"Get-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"Get-AzWvdHostPoolRegistrationToken\",\"ListItemText\":\"Get-AzWvdHostPoolRegistrationToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdHostPoolRegistrationToken \\r\\n\"},{\"CompletionText\":\"Get-AzWvdMsixPackage\",\"ListItemText\":\"Get-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"Get-AzWvdRegistrationInfo\",\"ListItemText\":\"Get-AzWvdRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdRegistrationInfo \\r\\n\"},{\"CompletionText\":\"Get-AzWvdScalingPlan\",\"ListItemText\":\"Get-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"Get-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"Get-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"Get-AzWvdSessionHost\",\"ListItemText\":\"Get-AzWvdSessionHost\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdSessionHost \\r\\n\"},{\"CompletionText\":\"Get-AzWvdStartMenuItem\",\"ListItemText\":\"Get-AzWvdStartMenuItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdStartMenuItem \\r\\n\"},{\"CompletionText\":\"Get-AzWvdUserSession\",\"ListItemText\":\"Get-AzWvdUserSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdUserSession \\r\\n\"},{\"CompletionText\":\"Get-AzWvdWorkspace\",\"ListItemText\":\"Get-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"Get-BCClientConfiguration\",\"ListItemText\":\"Get-BCClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCClientConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCContentServerConfiguration\",\"ListItemText\":\"Get-BCContentServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCContentServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCDataCache\",\"ListItemText\":\"Get-BCDataCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCDataCache \\r\\n\"},{\"CompletionText\":\"Get-BCDataCacheExtension\",\"ListItemText\":\"Get-BCDataCacheExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCDataCacheExtension \\r\\n\"},{\"CompletionText\":\"Get-BcdEntry\",\"ListItemText\":\"Get-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"Get-BcdEntry\\r\\n\"},{\"CompletionText\":\"Get-BcdEntryDebugSettings\",\"ListItemText\":\"Get-BcdEntryDebugSettings\",\"ResultType\":2,\"ToolTip\":\"Get-BcdEntryDebugSettings\\r\\n\"},{\"CompletionText\":\"Get-BcdEntryHypervisorSettings\",\"ListItemText\":\"Get-BcdEntryHypervisorSettings\",\"ResultType\":2,\"ToolTip\":\"Get-BcdEntryHypervisorSettings\\r\\n\"},{\"CompletionText\":\"Get-BcdStore\",\"ListItemText\":\"Get-BcdStore\",\"ResultType\":2,\"ToolTip\":\"Get-BcdStore\\r\\n\"},{\"CompletionText\":\"Get-BCHashCache\",\"ListItemText\":\"Get-BCHashCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCHashCache \\r\\n\"},{\"CompletionText\":\"Get-BCHostedCacheServerConfiguration\",\"ListItemText\":\"Get-BCHostedCacheServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCHostedCacheServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCNetworkConfiguration\",\"ListItemText\":\"Get-BCNetworkConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCNetworkConfiguration \\r\\n\"},{\"CompletionText\":\"Get-BCStatus\",\"ListItemText\":\"Get-BCStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BCStatus \\r\\n\"},{\"CompletionText\":\"Get-BitLockerVolume\",\"ListItemText\":\"Get-BitLockerVolume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-BitLockerVolume \\r\\n\"},{\"CompletionText\":\"Get-BitsTransfer\",\"ListItemText\":\"Get-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Get-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Get-Certificate\",\"ListItemText\":\"Get-Certificate\",\"ResultType\":2,\"ToolTip\":\"Get-Certificate\\r\\n\"},{\"CompletionText\":\"Get-CertificateAutoEnrollmentPolicy\",\"ListItemText\":\"Get-CertificateAutoEnrollmentPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-CertificateAutoEnrollmentPolicy\\r\\n\"},{\"CompletionText\":\"Get-CertificateEnrollmentPolicyServer\",\"ListItemText\":\"Get-CertificateEnrollmentPolicyServer\",\"ResultType\":2,\"ToolTip\":\"Get-CertificateEnrollmentPolicyServer\\r\\n\"},{\"CompletionText\":\"Get-CertificateNotificationTask\",\"ListItemText\":\"Get-CertificateNotificationTask\",\"ResultType\":2,\"ToolTip\":\"Get-CertificateNotificationTask\\r\\n\"},{\"CompletionText\":\"Get-ChildItem\",\"ListItemText\":\"Get-ChildItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ChildItem [[-Path] ] [[-Filter] ] [-Include ] [-Exclude ] [-Recurse] [-Depth ] [-Force] [-Name] [-Attributes ] [-FollowSymlink] [-Directory] [-File] [-Hidden] [-ReadOnly] [-System] []\\r\\n\\r\\nGet-ChildItem [[-Filter] ] -LiteralPath [-Include ] [-Exclude ] [-Recurse] [-Depth ] [-Force] [-Name] [-Attributes ] [-FollowSymlink] [-Directory] [-File] [-Hidden] [-ReadOnly] [-System] []\\r\\n\"},{\"CompletionText\":\"Get-CimAssociatedInstance\",\"ListItemText\":\"Get-CimAssociatedInstance\",\"ResultType\":2,\"ToolTip\":\"Get-CimAssociatedInstance\\r\\n\"},{\"CompletionText\":\"Get-CimClass\",\"ListItemText\":\"Get-CimClass\",\"ResultType\":2,\"ToolTip\":\"Get-CimClass\\r\\n\"},{\"CompletionText\":\"Get-CimInstance\",\"ListItemText\":\"Get-CimInstance\",\"ResultType\":2,\"ToolTip\":\"Get-CimInstance\\r\\n\"},{\"CompletionText\":\"Get-CimSession\",\"ListItemText\":\"Get-CimSession\",\"ResultType\":2,\"ToolTip\":\"Get-CimSession\\r\\n\"},{\"CompletionText\":\"Get-CIPolicy\",\"ListItemText\":\"Get-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-CIPolicy\\r\\n\"},{\"CompletionText\":\"Get-CIPolicyIdInfo\",\"ListItemText\":\"Get-CIPolicyIdInfo\",\"ResultType\":2,\"ToolTip\":\"Get-CIPolicyIdInfo\\r\\n\"},{\"CompletionText\":\"Get-CIPolicyInfo\",\"ListItemText\":\"Get-CIPolicyInfo\",\"ResultType\":2,\"ToolTip\":\"Get-CIPolicyInfo\\r\\n\"},{\"CompletionText\":\"Get-Clipboard\",\"ListItemText\":\"Get-Clipboard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Clipboard [-Raw] []\\r\\n\"},{\"CompletionText\":\"Get-ClusteredScheduledTask\",\"ListItemText\":\"Get-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Get-CmsMessage\",\"ListItemText\":\"Get-CmsMessage\",\"ResultType\":2,\"ToolTip\":\"Get-CmsMessage\\r\\n\"},{\"CompletionText\":\"Get-Command\",\"ListItemText\":\"Get-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Command [[-ArgumentList] ] [-Verb ] [-Noun ] [-Module ] [-FullyQualifiedModule ] [-TotalCount ] [-Syntax] [-ShowCommandInfo] [-All] [-ListImported] [-ParameterName ] [-ParameterType ] []\\r\\n\\r\\nGet-Command [[-Name] ] [[-ArgumentList] ] [-Module ] [-FullyQualifiedModule ] [-CommandType ] [-TotalCount ] [-Syntax] [-ShowCommandInfo] [-All] [-ListImported] [-ParameterName ] [-ParameterType ] [-UseFuzzyMatching] [-FuzzyMinimumDistance ] [-UseAbbreviationExpansion] []\\r\\n\"},{\"CompletionText\":\"Get-ComputeProcess\",\"ListItemText\":\"Get-ComputeProcess\",\"ResultType\":2,\"ToolTip\":\"Get-ComputeProcess\\r\\n\"},{\"CompletionText\":\"Get-ComputerInfo\",\"ListItemText\":\"Get-ComputerInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ComputerInfo [[-Property] ] []\\r\\n\"},{\"CompletionText\":\"Get-Content\",\"ListItemText\":\"Get-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Content [-Path] [-ReadCount ] [-TotalCount ] [-Tail ] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Delimiter ] [-Wait] [-Raw] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\\r\\nGet-Content -LiteralPath [-ReadCount ] [-TotalCount ] [-Tail ] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Delimiter ] [-Wait] [-Raw] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Get-Counter\",\"ListItemText\":\"Get-Counter\",\"ResultType\":2,\"ToolTip\":\"Get-Counter\\r\\n\"},{\"CompletionText\":\"Get-Credential\",\"ListItemText\":\"Get-Credential\",\"ResultType\":2,\"ToolTip\":\"Get-Credential\\r\\n\"},{\"CompletionText\":\"Get-CredsFromCredentialProvider\",\"ListItemText\":\"Get-CredsFromCredentialProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-CredsFromCredentialProvider \\r\\n\"},{\"CompletionText\":\"Get-Culture\",\"ListItemText\":\"Get-Culture\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Culture [-NoUserOverrides] []\\r\\n\\r\\nGet-Culture [[-Name] ] [-NoUserOverrides] []\\r\\n\\r\\nGet-Culture [-ListAvailable] []\\r\\n\"},{\"CompletionText\":\"Get-DAClientExperienceConfiguration\",\"ListItemText\":\"Get-DAClientExperienceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DAClientExperienceConfiguration \\r\\n\"},{\"CompletionText\":\"Get-DAConnectionStatus\",\"ListItemText\":\"Get-DAConnectionStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DAConnectionStatus \\r\\n\"},{\"CompletionText\":\"Get-DAEntryPointTableItem\",\"ListItemText\":\"Get-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Get-DAPolicyChange\",\"ListItemText\":\"Get-DAPolicyChange\",\"ResultType\":2,\"ToolTip\":\"Get-DAPolicyChange\\r\\n\"},{\"CompletionText\":\"Get-Date\",\"ListItemText\":\"Get-Date\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Date [[-Date] ] [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-Format ] [-AsUTC] []\\r\\n\\r\\nGet-Date [[-Date] ] -UFormat [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-AsUTC] []\\r\\n\\r\\nGet-Date -UnixTimeSeconds [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-Format ] [-AsUTC] []\\r\\n\\r\\nGet-Date -UnixTimeSeconds -UFormat [-Year ] [-Month ] [-Day ] [-Hour ] [-Minute ] [-Second ] [-Millisecond ] [-DisplayHint ] [-AsUTC] []\\r\\n\"},{\"CompletionText\":\"Get-DedupProperties\",\"ListItemText\":\"Get-DedupProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DedupProperties \\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationLog\",\"ListItemText\":\"Get-DeliveryOptimizationLog\",\"ResultType\":2,\"ToolTip\":\"Get-DeliveryOptimizationLog\\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationLogAnalysis\",\"ListItemText\":\"Get-DeliveryOptimizationLogAnalysis\",\"ResultType\":2,\"ToolTip\":\"Get-DeliveryOptimizationLogAnalysis\\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationPerfSnap\",\"ListItemText\":\"Get-DeliveryOptimizationPerfSnap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DeliveryOptimizationPerfSnap \\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationPerfSnapThisMonth\",\"ListItemText\":\"Get-DeliveryOptimizationPerfSnapThisMonth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DeliveryOptimizationPerfSnapThisMonth \\r\\n\"},{\"CompletionText\":\"Get-DeliveryOptimizationStatus\",\"ListItemText\":\"Get-DeliveryOptimizationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DeliveryOptimizationStatus \\r\\n\"},{\"CompletionText\":\"Get-Disk\",\"ListItemText\":\"Get-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Disk \\r\\n\"},{\"CompletionText\":\"Get-DiskImage\",\"ListItemText\":\"Get-DiskImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DiskImage \\r\\n\"},{\"CompletionText\":\"Get-DiskSNV\",\"ListItemText\":\"Get-DiskSNV\",\"ResultType\":2,\"ToolTip\":\"Get-DiskSNV\"},{\"CompletionText\":\"Get-DiskStorageNodeView\",\"ListItemText\":\"Get-DiskStorageNodeView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DiskStorageNodeView \\r\\n\"},{\"CompletionText\":\"Get-DnsClient\",\"ListItemText\":\"Get-DnsClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClient \\r\\n\"},{\"CompletionText\":\"Get-DnsClientCache\",\"ListItemText\":\"Get-DnsClientCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientCache \\r\\n\"},{\"CompletionText\":\"Get-DnsClientDohServerAddress\",\"ListItemText\":\"Get-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Get-DnsClientGlobalSetting\",\"ListItemText\":\"Get-DnsClientGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientGlobalSetting \\r\\n\"},{\"CompletionText\":\"Get-DnsClientNrptGlobal\",\"ListItemText\":\"Get-DnsClientNrptGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientNrptGlobal \\r\\n\"},{\"CompletionText\":\"Get-DnsClientNrptPolicy\",\"ListItemText\":\"Get-DnsClientNrptPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientNrptPolicy \\r\\n\"},{\"CompletionText\":\"Get-DnsClientNrptRule\",\"ListItemText\":\"Get-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Get-DnsClientServerAddress\",\"ListItemText\":\"Get-DnsClientServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DnsClientServerAddress \\r\\n\"},{\"CompletionText\":\"Get-DOConfig\",\"ListItemText\":\"Get-DOConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DOConfig \\r\\n\"},{\"CompletionText\":\"Get-DODownloadMode\",\"ListItemText\":\"Get-DODownloadMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DODownloadMode \\r\\n\"},{\"CompletionText\":\"Get-DOPercentageMaxBackgroundBandwidth\",\"ListItemText\":\"Get-DOPercentageMaxBackgroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DOPercentageMaxBackgroundBandwidth \\r\\n\"},{\"CompletionText\":\"Get-DOPercentageMaxForegroundBandwidth\",\"ListItemText\":\"Get-DOPercentageMaxForegroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DOPercentageMaxForegroundBandwidth \\r\\n\"},{\"CompletionText\":\"Get-DscConfiguration\",\"ListItemText\":\"Get-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Get-DscConfigurationStatus\",\"ListItemText\":\"Get-DscConfigurationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscConfigurationStatus \\r\\n\"},{\"CompletionText\":\"Get-DscLocalConfigurationManager\",\"ListItemText\":\"Get-DscLocalConfigurationManager\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscLocalConfigurationManager \\r\\n\"},{\"CompletionText\":\"Get-DscResource\",\"ListItemText\":\"Get-DscResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DscResource \\r\\n\"},{\"CompletionText\":\"Get-Dtc\",\"ListItemText\":\"Get-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Dtc \\r\\n\"},{\"CompletionText\":\"Get-DtcAdvancedHostSetting\",\"ListItemText\":\"Get-DtcAdvancedHostSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcAdvancedHostSetting \\r\\n\"},{\"CompletionText\":\"Get-DtcAdvancedSetting\",\"ListItemText\":\"Get-DtcAdvancedSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcAdvancedSetting \\r\\n\"},{\"CompletionText\":\"Get-DtcClusterDefault\",\"ListItemText\":\"Get-DtcClusterDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcClusterDefault \\r\\n\"},{\"CompletionText\":\"Get-DtcClusterTMMapping\",\"ListItemText\":\"Get-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Get-DtcDefault\",\"ListItemText\":\"Get-DtcDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcDefault \\r\\n\"},{\"CompletionText\":\"Get-DtcLog\",\"ListItemText\":\"Get-DtcLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcLog \\r\\n\"},{\"CompletionText\":\"Get-DtcNetworkSetting\",\"ListItemText\":\"Get-DtcNetworkSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcNetworkSetting \\r\\n\"},{\"CompletionText\":\"Get-DtcTransaction\",\"ListItemText\":\"Get-DtcTransaction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransaction \\r\\n\"},{\"CompletionText\":\"Get-DtcTransactionsStatistics\",\"ListItemText\":\"Get-DtcTransactionsStatistics\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransactionsStatistics \\r\\n\"},{\"CompletionText\":\"Get-DtcTransactionsTraceSession\",\"ListItemText\":\"Get-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Get-DtcTransactionsTraceSetting\",\"ListItemText\":\"Get-DtcTransactionsTraceSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-DtcTransactionsTraceSetting \\r\\n\"},{\"CompletionText\":\"Get-Error\",\"ListItemText\":\"Get-Error\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Error [-Newest ] []\\r\\n\\r\\nGet-Error [[-InputObject] ] []\\r\\n\"},{\"CompletionText\":\"Get-EtwTraceProvider\",\"ListItemText\":\"Get-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Get-EtwTraceSession\",\"ListItemText\":\"Get-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Get-Event\",\"ListItemText\":\"Get-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Event [[-SourceIdentifier] ] []\\r\\n\\r\\nGet-Event [-EventIdentifier] []\\r\\n\"},{\"CompletionText\":\"Get-EventSubscriber\",\"ListItemText\":\"Get-EventSubscriber\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-EventSubscriber [[-SourceIdentifier] ] [-Force] []\\r\\n\\r\\nGet-EventSubscriber [-SubscriptionId] [-Force] []\\r\\n\"},{\"CompletionText\":\"Get-ExecutionPolicy\",\"ListItemText\":\"Get-ExecutionPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-ExecutionPolicy\\r\\n\"},{\"CompletionText\":\"Get-ExperimentalFeature\",\"ListItemText\":\"Get-ExperimentalFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ExperimentalFeature [[-Name] ] []\\r\\n\"},{\"CompletionText\":\"Get-FileHash\",\"ListItemText\":\"Get-FileHash\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileHash [-Path] [[-Algorithm] ] []\\r\\n\\r\\nGet-FileHash [-LiteralPath] [[-Algorithm] ] []\\r\\n\\r\\nGet-FileHash [-InputStream] [[-Algorithm] ] []\\r\\n\"},{\"CompletionText\":\"Get-FileIntegrity\",\"ListItemText\":\"Get-FileIntegrity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileIntegrity \\r\\n\"},{\"CompletionText\":\"Get-FileShare\",\"ListItemText\":\"Get-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileShare \\r\\n\"},{\"CompletionText\":\"Get-FileShareAccessControlEntry\",\"ListItemText\":\"Get-FileShareAccessControlEntry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileShareAccessControlEntry \\r\\n\"},{\"CompletionText\":\"Get-FileStorageTier\",\"ListItemText\":\"Get-FileStorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FileStorageTier \\r\\n\"},{\"CompletionText\":\"Get-FormatData\",\"ListItemText\":\"Get-FormatData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-FormatData [[-TypeName] ] [-PowerShellVersion ] []\\r\\n\"},{\"CompletionText\":\"Get-GitBranchStatusColor\",\"ListItemText\":\"Get-GitBranchStatusColor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-GitBranchStatusColor \\r\\n\"},{\"CompletionText\":\"Get-GitDirectory\",\"ListItemText\":\"Get-GitDirectory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-GitDirectory \\r\\n\"},{\"CompletionText\":\"Get-GitStatus\",\"ListItemText\":\"Get-GitStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-GitStatus \\r\\n\"},{\"CompletionText\":\"Get-Help\",\"ListItemText\":\"Get-Help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Help [[-Name] ] [-Path ] [-Category ] [-Full] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Detailed [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Examples [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Parameter [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -Online [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nGet-Help [[-Name] ] -ShowWindow [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\"},{\"CompletionText\":\"Get-HgsAttestationBaselinePolicy\",\"ListItemText\":\"Get-HgsAttestationBaselinePolicy\",\"ResultType\":2,\"ToolTip\":\"Get-HgsAttestationBaselinePolicy\\r\\n\"},{\"CompletionText\":\"Get-HgsClientConfiguration\",\"ListItemText\":\"Get-HgsClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HgsClientConfiguration \\r\\n\"},{\"CompletionText\":\"Get-HgsClientHostKey\",\"ListItemText\":\"Get-HgsClientHostKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HgsClientHostKey \\r\\n\"},{\"CompletionText\":\"Get-HgsGuardian\",\"ListItemText\":\"Get-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Get-HgsTrace\",\"ListItemText\":\"Get-HgsTrace\",\"ResultType\":2,\"ToolTip\":\"Get-HgsTrace\\r\\n\"},{\"CompletionText\":\"Get-HgsTraceFileData\",\"ListItemText\":\"Get-HgsTraceFileData\",\"ResultType\":2,\"ToolTip\":\"Get-HgsTraceFileData\\r\\n\"},{\"CompletionText\":\"Get-History\",\"ListItemText\":\"Get-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-History [[-Id] ] [[-Count] ] []\\r\\n\"},{\"CompletionText\":\"Get-HnsEndpoint\",\"ListItemText\":\"Get-HnsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsEndpoint \\r\\n\"},{\"CompletionText\":\"Get-HnsEndpointAddresses\",\"ListItemText\":\"Get-HnsEndpointAddresses\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsEndpointAddresses \\r\\n\"},{\"CompletionText\":\"Get-HnsEndpointStats\",\"ListItemText\":\"Get-HnsEndpointStats\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsEndpointStats \\r\\n\"},{\"CompletionText\":\"Get-HnsNamespace\",\"ListItemText\":\"Get-HnsNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsNamespace \\r\\n\"},{\"CompletionText\":\"Get-HnsNetwork\",\"ListItemText\":\"Get-HnsNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsNetwork \\r\\n\"},{\"CompletionText\":\"Get-HnsPolicyList\",\"ListItemText\":\"Get-HnsPolicyList\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HnsPolicyList \\r\\n\"},{\"CompletionText\":\"Get-Host\",\"ListItemText\":\"Get-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Host []\\r\\n\"},{\"CompletionText\":\"Get-HotFix\",\"ListItemText\":\"Get-HotFix\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-HotFix [[-Id] ] [-ComputerName ] [-Credential ] []\\r\\n\\r\\nGet-HotFix [-Description ] [-ComputerName ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Get-InitiatorId\",\"ListItemText\":\"Get-InitiatorId\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InitiatorId \\r\\n\"},{\"CompletionText\":\"Get-InitiatorPort\",\"ListItemText\":\"Get-InitiatorPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InitiatorPort \\r\\n\"},{\"CompletionText\":\"Get-InstalledLanguage\",\"ListItemText\":\"Get-InstalledLanguage\",\"ResultType\":2,\"ToolTip\":\"Get-InstalledLanguage\\r\\n\"},{\"CompletionText\":\"Get-InstalledModule\",\"ListItemText\":\"Get-InstalledModule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledModule \\r\\n\"},{\"CompletionText\":\"Get-InstalledPSResource\",\"ListItemText\":\"Get-InstalledPSResource\",\"ResultType\":2,\"ToolTip\":\"Get-InstalledPSResource\\r\\n\"},{\"CompletionText\":\"Get-InstalledScript\",\"ListItemText\":\"Get-InstalledScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledScript \\r\\n\"},{\"CompletionText\":\"Get-IscsiConnection\",\"ListItemText\":\"Get-IscsiConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiConnection \\r\\n\"},{\"CompletionText\":\"Get-IscsiSession\",\"ListItemText\":\"Get-IscsiSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiSession \\r\\n\"},{\"CompletionText\":\"Get-IscsiTarget\",\"ListItemText\":\"Get-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Get-IscsiTargetPortal\",\"ListItemText\":\"Get-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"Get-IseSnippet\",\"ListItemText\":\"Get-IseSnippet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-IseSnippet \\r\\n\"},{\"CompletionText\":\"Get-Item\",\"ListItemText\":\"Get-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Item [-Path] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Stream ] []\\r\\n\\r\\nGet-Item -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Get-ItemProperty\",\"ListItemText\":\"Get-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ItemProperty [-Path] [[-Name] ] [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\\r\\nGet-ItemProperty [[-Name] ] -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Get-ItemPropertyValue\",\"ListItemText\":\"Get-ItemPropertyValue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ItemPropertyValue [[-Path] ] [-Name] [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\\r\\nGet-ItemPropertyValue [-Name] -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Get-Job\",\"ListItemText\":\"Get-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Job [[-Id] ] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-InstanceId] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-Name] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-State] [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] []\\r\\n\\r\\nGet-Job [-IncludeChildJob] [-ChildJobState ] [-HasMoreData ] [-Before ] [-After ] [-Newest ] [-Command ] []\\r\\n\\r\\nGet-Job [-Filter] []\\r\\n\"},{\"CompletionText\":\"Get-JobTrigger\",\"ListItemText\":\"Get-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Get-JobTrigger\\r\\n\"},{\"CompletionText\":\"Get-KdsConfiguration\",\"ListItemText\":\"Get-KdsConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-KdsConfiguration\\r\\n\"},{\"CompletionText\":\"Get-KdsRootKey\",\"ListItemText\":\"Get-KdsRootKey\",\"ResultType\":2,\"ToolTip\":\"Get-KdsRootKey\\r\\n\"},{\"CompletionText\":\"Get-Language\",\"ListItemText\":\"Get-Language\",\"ResultType\":2,\"ToolTip\":\"Get-Language\"},{\"CompletionText\":\"Get-LapsAADPassword\",\"ListItemText\":\"Get-LapsAADPassword\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LapsAADPassword \\r\\n\"},{\"CompletionText\":\"Get-LapsADPassword\",\"ListItemText\":\"Get-LapsADPassword\",\"ResultType\":2,\"ToolTip\":\"Get-LapsADPassword\\r\\n\"},{\"CompletionText\":\"Get-LapsDiagnostics\",\"ListItemText\":\"Get-LapsDiagnostics\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LapsDiagnostics \\r\\n\"},{\"CompletionText\":\"Get-LocalGroup\",\"ListItemText\":\"Get-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Get-LocalGroup\\r\\n\"},{\"CompletionText\":\"Get-LocalGroupMember\",\"ListItemText\":\"Get-LocalGroupMember\",\"ResultType\":2,\"ToolTip\":\"Get-LocalGroupMember\\r\\n\"},{\"CompletionText\":\"Get-LocalUser\",\"ListItemText\":\"Get-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Get-LocalUser\\r\\n\"},{\"CompletionText\":\"Get-Location\",\"ListItemText\":\"Get-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Location [-PSProvider ] [-PSDrive ] []\\r\\n\\r\\nGet-Location [-Stack] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"Get-LogProperties\",\"ListItemText\":\"Get-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LogProperties \\r\\n\"},{\"CompletionText\":\"Get-MarkdownOption\",\"ListItemText\":\"Get-MarkdownOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MarkdownOption []\\r\\n\"},{\"CompletionText\":\"Get-MaskingSet\",\"ListItemText\":\"Get-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MaskingSet \\r\\n\"},{\"CompletionText\":\"Get-Member\",\"ListItemText\":\"Get-Member\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Member [[-Name] ] [-InputObject ] [-MemberType ] [-View ] [-Static] [-Force] []\\r\\n\"},{\"CompletionText\":\"Get-MMAgent\",\"ListItemText\":\"Get-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MMAgent \\r\\n\"},{\"CompletionText\":\"Get-MockDynamicParameters\",\"ListItemText\":\"Get-MockDynamicParameters\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MockDynamicParameters \\r\\n\"},{\"CompletionText\":\"Get-Module\",\"ListItemText\":\"Get-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Module [[-Name] ] [-FullyQualifiedName ] [-All] []\\r\\n\\r\\nGet-Module [[-Name] ] -ListAvailable [-FullyQualifiedName ] [-All] [-PSEdition ] [-SkipEditionCheck] [-Refresh] []\\r\\n\\r\\nGet-Module [[-Name] ] -PSSession [-FullyQualifiedName ] [-ListAvailable] [-PSEdition ] [-SkipEditionCheck] [-Refresh] []\\r\\n\\r\\nGet-Module [[-Name] ] -CimSession [-FullyQualifiedName ] [-ListAvailable] [-SkipEditionCheck] [-Refresh] [-CimResourceUri ] [-CimNamespace ] []\\r\\n\"},{\"CompletionText\":\"Get-MpComputerStatus\",\"ListItemText\":\"Get-MpComputerStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpComputerStatus \\r\\n\"},{\"CompletionText\":\"Get-MpPerformanceReport\",\"ListItemText\":\"Get-MpPerformanceReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPerformanceReport \\r\\n\"},{\"CompletionText\":\"Get-MpPreference\",\"ListItemText\":\"Get-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPreference \\r\\n\"},{\"CompletionText\":\"Get-MpThreat\",\"ListItemText\":\"Get-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreat \\r\\n\"},{\"CompletionText\":\"Get-MpThreatCatalog\",\"ListItemText\":\"Get-MpThreatCatalog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatCatalog \\r\\n\"},{\"CompletionText\":\"Get-MpThreatDetection\",\"ListItemText\":\"Get-MpThreatDetection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatDetection \\r\\n\"},{\"CompletionText\":\"Get-NCSIPolicyConfiguration\",\"ListItemText\":\"Get-NCSIPolicyConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NCSIPolicyConfiguration \\r\\n\"},{\"CompletionText\":\"Get-Net6to4Configuration\",\"ListItemText\":\"Get-Net6to4Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Net6to4Configuration \\r\\n\"},{\"CompletionText\":\"Get-NetAdapter\",\"ListItemText\":\"Get-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapter \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterAdvancedProperty\",\"ListItemText\":\"Get-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterBinding\",\"ListItemText\":\"Get-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterChecksumOffload\",\"ListItemText\":\"Get-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterDataPathConfiguration\",\"ListItemText\":\"Get-NetAdapterDataPathConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterDataPathConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Get-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterHardwareInfo\",\"ListItemText\":\"Get-NetAdapterHardwareInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterHardwareInfo \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterIPsecOffload\",\"ListItemText\":\"Get-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterLso\",\"ListItemText\":\"Get-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterPacketDirect\",\"ListItemText\":\"Get-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterPowerManagement\",\"ListItemText\":\"Get-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterQos\",\"ListItemText\":\"Get-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterRdma\",\"ListItemText\":\"Get-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterRsc\",\"ListItemText\":\"Get-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterRss\",\"ListItemText\":\"Get-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterSriov\",\"ListItemText\":\"Get-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterSriovVf\",\"ListItemText\":\"Get-NetAdapterSriovVf\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterSriovVf \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterStatistics\",\"ListItemText\":\"Get-NetAdapterStatistics\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterStatistics \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterUso\",\"ListItemText\":\"Get-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterVmq\",\"ListItemText\":\"Get-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterVMQQueue\",\"ListItemText\":\"Get-NetAdapterVMQQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterVMQQueue \\r\\n\"},{\"CompletionText\":\"Get-NetAdapterVPort\",\"ListItemText\":\"Get-NetAdapterVPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetAdapterVPort \\r\\n\"},{\"CompletionText\":\"Get-NetCompartment\",\"ListItemText\":\"Get-NetCompartment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetCompartment \\r\\n\"},{\"CompletionText\":\"Get-NetConnectionProfile\",\"ListItemText\":\"Get-NetConnectionProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetConnectionProfile \\r\\n\"},{\"CompletionText\":\"Get-NetDnsTransitionConfiguration\",\"ListItemText\":\"Get-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetDnsTransitionMonitoring\",\"ListItemText\":\"Get-NetDnsTransitionMonitoring\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetDnsTransitionMonitoring \\r\\n\"},{\"CompletionText\":\"Get-NetEventNetworkAdapter\",\"ListItemText\":\"Get-NetEventNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Get-NetEventPacketCaptureProvider\",\"ListItemText\":\"Get-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventProvider\",\"ListItemText\":\"Get-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventSession\",\"ListItemText\":\"Get-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventSession \\r\\n\"},{\"CompletionText\":\"Get-NetEventVFPProvider\",\"ListItemText\":\"Get-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventVmNetworkAdapter\",\"ListItemText\":\"Get-NetEventVmNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVmNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Get-NetEventVmSwitch\",\"ListItemText\":\"Get-NetEventVmSwitch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVmSwitch \\r\\n\"},{\"CompletionText\":\"Get-NetEventVmSwitchProvider\",\"ListItemText\":\"Get-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Get-NetEventWFPCaptureProvider\",\"ListItemText\":\"Get-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallAddressFilter\",\"ListItemText\":\"Get-NetFirewallAddressFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallAddressFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallApplicationFilter\",\"ListItemText\":\"Get-NetFirewallApplicationFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallApplicationFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"Get-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVPort\",\"ListItemText\":\"Get-NetFirewallHyperVPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVPort \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVProfile\",\"ListItemText\":\"Get-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVRule\",\"ListItemText\":\"Get-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVVMCreator\",\"ListItemText\":\"Get-NetFirewallHyperVVMCreator\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVVMCreator \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallHyperVVMSetting\",\"ListItemText\":\"Get-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallInterfaceFilter\",\"ListItemText\":\"Get-NetFirewallInterfaceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallInterfaceFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallInterfaceTypeFilter\",\"ListItemText\":\"Get-NetFirewallInterfaceTypeFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallInterfaceTypeFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallPortFilter\",\"ListItemText\":\"Get-NetFirewallPortFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallPortFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallProfile\",\"ListItemText\":\"Get-NetFirewallProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallProfile \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallRule\",\"ListItemText\":\"Get-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallSecurityFilter\",\"ListItemText\":\"Get-NetFirewallSecurityFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallSecurityFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallServiceFilter\",\"ListItemText\":\"Get-NetFirewallServiceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallServiceFilter \\r\\n\"},{\"CompletionText\":\"Get-NetFirewallSetting\",\"ListItemText\":\"Get-NetFirewallSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetFirewallSetting \\r\\n\"},{\"CompletionText\":\"Get-NetIPAddress\",\"ListItemText\":\"Get-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPAddress \\r\\n\"},{\"CompletionText\":\"Get-NetIPConfiguration\",\"ListItemText\":\"Get-NetIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetIPHttpsConfiguration\",\"ListItemText\":\"Get-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetIPHttpsState\",\"ListItemText\":\"Get-NetIPHttpsState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPHttpsState \\r\\n\"},{\"CompletionText\":\"Get-NetIPInterface\",\"ListItemText\":\"Get-NetIPInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPInterface \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecDospSetting\",\"ListItemText\":\"Get-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Get-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecMainModeRule\",\"ListItemText\":\"Get-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecMainModeSA\",\"ListItemText\":\"Get-NetIPsecMainModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecMainModeSA \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Get-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Get-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Get-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecQuickModeSA\",\"ListItemText\":\"Get-NetIPsecQuickModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecQuickModeSA \\r\\n\"},{\"CompletionText\":\"Get-NetIPsecRule\",\"ListItemText\":\"Get-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Get-NetIPv4Protocol\",\"ListItemText\":\"Get-NetIPv4Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPv4Protocol \\r\\n\"},{\"CompletionText\":\"Get-NetIPv6Protocol\",\"ListItemText\":\"Get-NetIPv6Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIPv6Protocol \\r\\n\"},{\"CompletionText\":\"Get-NetIsatapConfiguration\",\"ListItemText\":\"Get-NetIsatapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetIsatapConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetLbfoTeam\",\"ListItemText\":\"Get-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Get-NetLbfoTeamMember\",\"ListItemText\":\"Get-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Get-NetLbfoTeamNic\",\"ListItemText\":\"Get-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Get-NetNat\",\"ListItemText\":\"Get-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNat \\r\\n\"},{\"CompletionText\":\"Get-NetNatExternalAddress\",\"ListItemText\":\"Get-NetNatExternalAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatExternalAddress \\r\\n\"},{\"CompletionText\":\"Get-NetNatGlobal\",\"ListItemText\":\"Get-NetNatGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatGlobal \\r\\n\"},{\"CompletionText\":\"Get-NetNatSession\",\"ListItemText\":\"Get-NetNatSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatSession \\r\\n\"},{\"CompletionText\":\"Get-NetNatStaticMapping\",\"ListItemText\":\"Get-NetNatStaticMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatStaticMapping \\r\\n\"},{\"CompletionText\":\"Get-NetNatTransitionConfiguration\",\"ListItemText\":\"Get-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetNatTransitionMonitoring\",\"ListItemText\":\"Get-NetNatTransitionMonitoring\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNatTransitionMonitoring \\r\\n\"},{\"CompletionText\":\"Get-NetNeighbor\",\"ListItemText\":\"Get-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetNeighbor \\r\\n\"},{\"CompletionText\":\"Get-NetOffloadGlobalSetting\",\"ListItemText\":\"Get-NetOffloadGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetOffloadGlobalSetting \\r\\n\"},{\"CompletionText\":\"Get-NetPrefixPolicy\",\"ListItemText\":\"Get-NetPrefixPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetPrefixPolicy \\r\\n\"},{\"CompletionText\":\"Get-NetQosPolicy\",\"ListItemText\":\"Get-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"Get-NetRoute\",\"ListItemText\":\"Get-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetRoute \\r\\n\"},{\"CompletionText\":\"Get-NetSwitchTeam\",\"ListItemText\":\"Get-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"Get-NetSwitchTeamMember\",\"ListItemText\":\"Get-NetSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetSwitchTeamMember \\r\\n\"},{\"CompletionText\":\"Get-NetTCPConnection\",\"ListItemText\":\"Get-NetTCPConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTCPConnection \\r\\n\"},{\"CompletionText\":\"Get-NetTCPSetting\",\"ListItemText\":\"Get-NetTCPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTCPSetting \\r\\n\"},{\"CompletionText\":\"Get-NetTeredoConfiguration\",\"ListItemText\":\"Get-NetTeredoConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTeredoConfiguration \\r\\n\"},{\"CompletionText\":\"Get-NetTeredoState\",\"ListItemText\":\"Get-NetTeredoState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTeredoState \\r\\n\"},{\"CompletionText\":\"Get-NetTransportFilter\",\"ListItemText\":\"Get-NetTransportFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetTransportFilter \\r\\n\"},{\"CompletionText\":\"Get-NetUDPEndpoint\",\"ListItemText\":\"Get-NetUDPEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetUDPEndpoint \\r\\n\"},{\"CompletionText\":\"Get-NetUDPSetting\",\"ListItemText\":\"Get-NetUDPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetUDPSetting \\r\\n\"},{\"CompletionText\":\"Get-NetView\",\"ListItemText\":\"Get-NetView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetView \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchEthernetPort\",\"ListItemText\":\"Get-NetworkSwitchEthernetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchEthernetPort \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchFeature\",\"ListItemText\":\"Get-NetworkSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchFeature \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchGlobalData\",\"ListItemText\":\"Get-NetworkSwitchGlobalData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchGlobalData \\r\\n\"},{\"CompletionText\":\"Get-NetworkSwitchVlan\",\"ListItemText\":\"Get-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Get-NonRemovableAppsPolicy\",\"ListItemText\":\"Get-NonRemovableAppsPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-NonRemovableAppsPolicy\\r\\n\"},{\"CompletionText\":\"Get-OdbcDriver\",\"ListItemText\":\"Get-OdbcDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OdbcDriver \\r\\n\"},{\"CompletionText\":\"Get-OdbcDsn\",\"ListItemText\":\"Get-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Get-OdbcPerfCounter\",\"ListItemText\":\"Get-OdbcPerfCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OdbcPerfCounter \\r\\n\"},{\"CompletionText\":\"Get-OffloadDataTransferSetting\",\"ListItemText\":\"Get-OffloadDataTransferSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OffloadDataTransferSetting \\r\\n\"},{\"CompletionText\":\"Get-OperationValidation\",\"ListItemText\":\"Get-OperationValidation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-OperationValidation \\r\\n\"},{\"CompletionText\":\"Get-Package\",\"ListItemText\":\"Get-Package\",\"ResultType\":2,\"ToolTip\":\"Get-Package\\r\\n\"},{\"CompletionText\":\"Get-PackageProvider\",\"ListItemText\":\"Get-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Get-PackageProvider\\r\\n\"},{\"CompletionText\":\"Get-PackageSource\",\"ListItemText\":\"Get-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Get-PackageSource\\r\\n\"},{\"CompletionText\":\"Get-Partition\",\"ListItemText\":\"Get-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Partition \\r\\n\"},{\"CompletionText\":\"Get-PartitionSupportedSize\",\"ListItemText\":\"Get-PartitionSupportedSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PartitionSupportedSize \\r\\n\"},{\"CompletionText\":\"Get-PcsvDevice\",\"ListItemText\":\"Get-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Get-PcsvDeviceLog\",\"ListItemText\":\"Get-PcsvDeviceLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PcsvDeviceLog \\r\\n\"},{\"CompletionText\":\"Get-PfxCertificate\",\"ListItemText\":\"Get-PfxCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-PfxCertificate\\r\\n\"},{\"CompletionText\":\"Get-PfxData\",\"ListItemText\":\"Get-PfxData\",\"ResultType\":2,\"ToolTip\":\"Get-PfxData\\r\\n\"},{\"CompletionText\":\"Get-PhysicalDisk\",\"ListItemText\":\"Get-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Get-PhysicalDiskSNV\",\"ListItemText\":\"Get-PhysicalDiskSNV\",\"ResultType\":2,\"ToolTip\":\"Get-PhysicalDiskSNV\"},{\"CompletionText\":\"Get-PhysicalDiskStorageNodeView\",\"ListItemText\":\"Get-PhysicalDiskStorageNodeView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalDiskStorageNodeView \\r\\n\"},{\"CompletionText\":\"Get-PhysicalExtent\",\"ListItemText\":\"Get-PhysicalExtent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalExtent \\r\\n\"},{\"CompletionText\":\"Get-PhysicalExtentAssociation\",\"ListItemText\":\"Get-PhysicalExtentAssociation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PhysicalExtentAssociation \\r\\n\"},{\"CompletionText\":\"Get-PmemDedicatedMemory\",\"ListItemText\":\"Get-PmemDedicatedMemory\",\"ResultType\":2,\"ToolTip\":\"Get-PmemDedicatedMemory\\r\\n\"},{\"CompletionText\":\"Get-PmemDisk\",\"ListItemText\":\"Get-PmemDisk\",\"ResultType\":2,\"ToolTip\":\"Get-PmemDisk\\r\\n\"},{\"CompletionText\":\"Get-PmemPhysicalDevice\",\"ListItemText\":\"Get-PmemPhysicalDevice\",\"ResultType\":2,\"ToolTip\":\"Get-PmemPhysicalDevice\\r\\n\"},{\"CompletionText\":\"Get-PmemUnusedRegion\",\"ListItemText\":\"Get-PmemUnusedRegion\",\"ResultType\":2,\"ToolTip\":\"Get-PmemUnusedRegion\\r\\n\"},{\"CompletionText\":\"Get-PnpDevice\",\"ListItemText\":\"Get-PnpDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PnpDevice \\r\\n\"},{\"CompletionText\":\"Get-PnpDeviceProperty\",\"ListItemText\":\"Get-PnpDeviceProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PnpDeviceProperty \\r\\n\"},{\"CompletionText\":\"Get-PreferredLanguage\",\"ListItemText\":\"Get-PreferredLanguage\",\"ResultType\":2,\"ToolTip\":\"Get-PreferredLanguage\"},{\"CompletionText\":\"Get-PrintConfiguration\",\"ListItemText\":\"Get-PrintConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrintConfiguration \\r\\n\"},{\"CompletionText\":\"Get-Printer\",\"ListItemText\":\"Get-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Printer \\r\\n\"},{\"CompletionText\":\"Get-PrinterDriver\",\"ListItemText\":\"Get-PrinterDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrinterDriver \\r\\n\"},{\"CompletionText\":\"Get-PrinterPort\",\"ListItemText\":\"Get-PrinterPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrinterPort \\r\\n\"},{\"CompletionText\":\"Get-PrinterProperty\",\"ListItemText\":\"Get-PrinterProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrinterProperty \\r\\n\"},{\"CompletionText\":\"Get-PrintJob\",\"ListItemText\":\"Get-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PrintJob \\r\\n\"},{\"CompletionText\":\"Get-Process\",\"ListItemText\":\"Get-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Process [[-Name] ] [-Module] [-FileVersionInfo] []\\r\\n\\r\\nGet-Process [[-Name] ] -IncludeUserName []\\r\\n\\r\\nGet-Process -Id [-Module] [-FileVersionInfo] []\\r\\n\\r\\nGet-Process -Id -IncludeUserName []\\r\\n\\r\\nGet-Process -InputObject [-Module] [-FileVersionInfo] []\\r\\n\\r\\nGet-Process -InputObject -IncludeUserName []\\r\\n\"},{\"CompletionText\":\"Get-ProcessMitigation\",\"ListItemText\":\"Get-ProcessMitigation\",\"ResultType\":2,\"ToolTip\":\"Get-ProcessMitigation\\r\\n\"},{\"CompletionText\":\"Get-PromptConnectionInfo\",\"ListItemText\":\"Get-PromptConnectionInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PromptConnectionInfo \\r\\n\"},{\"CompletionText\":\"Get-PromptPath\",\"ListItemText\":\"Get-PromptPath\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PromptPath \\r\\n\"},{\"CompletionText\":\"Get-ProvisionedAppPackage\",\"ListItemText\":\"Get-ProvisionedAppPackage\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisionedAppPackage\"},{\"CompletionText\":\"Get-ProvisionedAppSharedPackageContainer\",\"ListItemText\":\"Get-ProvisionedAppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisionedAppSharedPackageContainer\"},{\"CompletionText\":\"Get-ProvisionedAppxPackage\",\"ListItemText\":\"Get-ProvisionedAppxPackage\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisionedAppxPackage\"},{\"CompletionText\":\"Get-ProvisioningPackage\",\"ListItemText\":\"Get-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Get-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Get-PSBreakpoint\",\"ListItemText\":\"Get-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSBreakpoint [[-Script] ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint -Command [-Script ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint -Variable [-Script ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint [-Type] [-Script ] [-Runspace ] []\\r\\n\\r\\nGet-PSBreakpoint [-Id] [-Runspace ] []\\r\\n\"},{\"CompletionText\":\"Get-PSCallStack\",\"ListItemText\":\"Get-PSCallStack\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSCallStack []\\r\\n\"},{\"CompletionText\":\"Get-PSDrive\",\"ListItemText\":\"Get-PSDrive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSDrive [[-Name] ] [-Scope ] [-PSProvider ] []\\r\\n\\r\\nGet-PSDrive [-LiteralName] [-Scope ] [-PSProvider ] []\\r\\n\"},{\"CompletionText\":\"Get-PSHostProcessInfo\",\"ListItemText\":\"Get-PSHostProcessInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSHostProcessInfo [[-Name] ] []\\r\\n\\r\\nGet-PSHostProcessInfo [-Process] []\\r\\n\\r\\nGet-PSHostProcessInfo [-Id] []\\r\\n\"},{\"CompletionText\":\"Get-PSProvider\",\"ListItemText\":\"Get-PSProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSProvider [[-PSProvider] ] []\\r\\n\"},{\"CompletionText\":\"Get-PSReadLineKeyHandler\",\"ListItemText\":\"Get-PSReadLineKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSReadLineKeyHandler [-Bound] [-Unbound] []\\r\\n\\r\\nGet-PSReadLineKeyHandler [-Chord] []\\r\\n\"},{\"CompletionText\":\"Get-PSReadLineOption\",\"ListItemText\":\"Get-PSReadLineOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSReadLineOption []\\r\\n\"},{\"CompletionText\":\"Get-PSRepository\",\"ListItemText\":\"Get-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSRepository \\r\\n\"},{\"CompletionText\":\"Get-PSResource\",\"ListItemText\":\"Get-PSResource\",\"ResultType\":2,\"ToolTip\":\"Get-PSResource\"},{\"CompletionText\":\"Get-PSResourceRepository\",\"ListItemText\":\"Get-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Get-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Get-PSScriptFileInfo\",\"ListItemText\":\"Get-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"Get-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"Get-PSSession\",\"ListItemText\":\"Get-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSSession [-Name ] []\\r\\n\\r\\nGet-PSSession [-ComputerName] [-ApplicationName ] [-ConfigurationName ] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession [-ComputerName] -InstanceId [-ApplicationName ] [-ConfigurationName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession [-ConnectionUri] [-ConfigurationName ] [-AllowRedirection] [-Name ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession [-ConnectionUri] -InstanceId [-ConfigurationName ] [-AllowRedirection] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-ThrottleLimit ] [-State ] [-SessionOption ] []\\r\\n\\r\\nGet-PSSession -ContainerId [-ConfigurationName ] [-Name ] [-State ] []\\r\\n\\r\\nGet-PSSession -InstanceId -ContainerId [-ConfigurationName ] [-State ] []\\r\\n\\r\\nGet-PSSession -VMId [-ConfigurationName ] [-Name ] [-State ] []\\r\\n\\r\\nGet-PSSession -InstanceId -VMId [-ConfigurationName ] [-State ] []\\r\\n\\r\\nGet-PSSession -VMName [-ConfigurationName ] [-Name ] [-State ] []\\r\\n\\r\\nGet-PSSession -InstanceId -VMName [-ConfigurationName ] [-State ] []\\r\\n\\r\\nGet-PSSession [-InstanceId ] []\\r\\n\\r\\nGet-PSSession [-Id] []\\r\\n\"},{\"CompletionText\":\"Get-PSSessionCapability\",\"ListItemText\":\"Get-PSSessionCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSSessionCapability [-ConfigurationName] [-Username] [-Full] []\\r\\n\"},{\"CompletionText\":\"Get-PSSessionConfiguration\",\"ListItemText\":\"Get-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSSessionConfiguration [[-Name] ] [-Force] []\\r\\n\"},{\"CompletionText\":\"Get-Random\",\"ListItemText\":\"Get-Random\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Random [[-Maximum] ] [-SetSeed ] [-Minimum ] [-Count ] []\\r\\n\\r\\nGet-Random [-InputObject] [-SetSeed ] [-Count ] []\\r\\n\\r\\nGet-Random [-InputObject] -Shuffle [-SetSeed ] []\\r\\n\"},{\"CompletionText\":\"Get-ResiliencySetting\",\"ListItemText\":\"Get-ResiliencySetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ResiliencySetting \\r\\n\"},{\"CompletionText\":\"Get-Runspace\",\"ListItemText\":\"Get-Runspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Runspace [[-Name] ] []\\r\\n\\r\\nGet-Runspace [-Id] []\\r\\n\\r\\nGet-Runspace [-InstanceId] []\\r\\n\"},{\"CompletionText\":\"Get-RunspaceDebug\",\"ListItemText\":\"Get-RunspaceDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-RunspaceDebug [[-RunspaceName] ] []\\r\\n\\r\\nGet-RunspaceDebug [-Runspace] []\\r\\n\\r\\nGet-RunspaceDebug [-RunspaceId] []\\r\\n\\r\\nGet-RunspaceDebug [-RunspaceInstanceId] []\\r\\n\\r\\nGet-RunspaceDebug [[-ProcessName] ] [[-AppDomainName] ] []\\r\\n\"},{\"CompletionText\":\"Get-ScheduledJob\",\"ListItemText\":\"Get-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Get-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Get-ScheduledJobOption\",\"ListItemText\":\"Get-ScheduledJobOption\",\"ResultType\":2,\"ToolTip\":\"Get-ScheduledJobOption\\r\\n\"},{\"CompletionText\":\"Get-ScheduledTask\",\"ListItemText\":\"Get-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Get-ScheduledTaskInfo\",\"ListItemText\":\"Get-ScheduledTaskInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-ScheduledTaskInfo \\r\\n\"},{\"CompletionText\":\"Get-SecureBootPolicy\",\"ListItemText\":\"Get-SecureBootPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-SecureBootPolicy\\r\\n\"},{\"CompletionText\":\"Get-SecureBootUEFI\",\"ListItemText\":\"Get-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Get-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"Get-SecureRandom\",\"ListItemText\":\"Get-SecureRandom\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SecureRandom [[-Maximum] ] [-Minimum ] [-Count ] []\\r\\n\\r\\nGet-SecureRandom [-InputObject] [-Count ] []\\r\\n\\r\\nGet-SecureRandom [-InputObject] -Shuffle []\\r\\n\"},{\"CompletionText\":\"Get-Service\",\"ListItemText\":\"Get-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Service [[-Name] ] [-DependentServices] [-RequiredServices] [-Include ] [-Exclude ] []\\r\\n\\r\\nGet-Service -DisplayName [-DependentServices] [-RequiredServices] [-Include ] [-Exclude ] []\\r\\n\\r\\nGet-Service [-DependentServices] [-RequiredServices] [-Include ] [-Exclude ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Get-SmbBandWidthLimit\",\"ListItemText\":\"Get-SmbBandWidthLimit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbBandWidthLimit \\r\\n\"},{\"CompletionText\":\"Get-SmbClientAccessToServer\",\"ListItemText\":\"Get-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Get-SmbClientCertificateMapping\",\"ListItemText\":\"Get-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbClientConfiguration\",\"ListItemText\":\"Get-SmbClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientConfiguration \\r\\n\"},{\"CompletionText\":\"Get-SmbClientNetworkInterface\",\"ListItemText\":\"Get-SmbClientNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbClientNetworkInterface \\r\\n\"},{\"CompletionText\":\"Get-SmbConnection\",\"ListItemText\":\"Get-SmbConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbConnection \\r\\n\"},{\"CompletionText\":\"Get-SmbDelegation\",\"ListItemText\":\"Get-SmbDelegation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbDelegation \\r\\n\"},{\"CompletionText\":\"Get-SmbGlobalMapping\",\"ListItemText\":\"Get-SmbGlobalMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbGlobalMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbMapping\",\"ListItemText\":\"Get-SmbMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbMultichannelConnection\",\"ListItemText\":\"Get-SmbMultichannelConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbMultichannelConnection \\r\\n\"},{\"CompletionText\":\"Get-SmbMultichannelConstraint\",\"ListItemText\":\"Get-SmbMultichannelConstraint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbMultichannelConstraint \\r\\n\"},{\"CompletionText\":\"Get-SmbOpenFile\",\"ListItemText\":\"Get-SmbOpenFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbOpenFile \\r\\n\"},{\"CompletionText\":\"Get-SmbServerCertificateMapping\",\"ListItemText\":\"Get-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"Get-SmbServerCertProps\",\"ListItemText\":\"Get-SmbServerCertProps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerCertProps \\r\\n\"},{\"CompletionText\":\"Get-SmbServerConfiguration\",\"ListItemText\":\"Get-SmbServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerConfiguration \\r\\n\"},{\"CompletionText\":\"Get-SmbServerNetworkInterface\",\"ListItemText\":\"Get-SmbServerNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbServerNetworkInterface \\r\\n\"},{\"CompletionText\":\"Get-SmbSession\",\"ListItemText\":\"Get-SmbSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbSession \\r\\n\"},{\"CompletionText\":\"Get-SmbShare\",\"ListItemText\":\"Get-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbShare \\r\\n\"},{\"CompletionText\":\"Get-SmbShareAccess\",\"ListItemText\":\"Get-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Get-SmbWitnessClient\",\"ListItemText\":\"Get-SmbWitnessClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SmbWitnessClient \\r\\n\"},{\"CompletionText\":\"Get-StartApps\",\"ListItemText\":\"Get-StartApps\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StartApps \\r\\n\"},{\"CompletionText\":\"Get-StorageAdvancedProperty\",\"ListItemText\":\"Get-StorageAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Get-StorageBusBinding\",\"ListItemText\":\"Get-StorageBusBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusBinding \\r\\n\"},{\"CompletionText\":\"Get-StorageBusCache\",\"ListItemText\":\"Get-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Get-StorageBusClientDevice\",\"ListItemText\":\"Get-StorageBusClientDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusClientDevice \\r\\n\"},{\"CompletionText\":\"Get-StorageBusDisk\",\"ListItemText\":\"Get-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetCacheStore\",\"ListItemText\":\"Get-StorageBusTargetCacheStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetCacheStore \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetCacheStoresInstance\",\"ListItemText\":\"Get-StorageBusTargetCacheStoresInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetCacheStoresInstance \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetDevice\",\"ListItemText\":\"Get-StorageBusTargetDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetDevice \\r\\n\"},{\"CompletionText\":\"Get-StorageBusTargetDeviceInstance\",\"ListItemText\":\"Get-StorageBusTargetDeviceInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageBusTargetDeviceInstance \\r\\n\"},{\"CompletionText\":\"Get-StorageChassis\",\"ListItemText\":\"Get-StorageChassis\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageChassis \\r\\n\"},{\"CompletionText\":\"Get-StorageDataCollection\",\"ListItemText\":\"Get-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Get-StorageDiagnosticInfo\",\"ListItemText\":\"Get-StorageDiagnosticInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageDiagnosticInfo \\r\\n\"},{\"CompletionText\":\"Get-StorageEnclosure\",\"ListItemText\":\"Get-StorageEnclosure\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageEnclosure \\r\\n\"},{\"CompletionText\":\"Get-StorageEnclosureSNV\",\"ListItemText\":\"Get-StorageEnclosureSNV\",\"ResultType\":2,\"ToolTip\":\"Get-StorageEnclosureSNV\"},{\"CompletionText\":\"Get-StorageEnclosureStorageNodeView\",\"ListItemText\":\"Get-StorageEnclosureStorageNodeView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageEnclosureStorageNodeView \\r\\n\"},{\"CompletionText\":\"Get-StorageEnclosureVendorData\",\"ListItemText\":\"Get-StorageEnclosureVendorData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageEnclosureVendorData \\r\\n\"},{\"CompletionText\":\"Get-StorageExtendedStatus\",\"ListItemText\":\"Get-StorageExtendedStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageExtendedStatus \\r\\n\"},{\"CompletionText\":\"Get-StorageFaultDomain\",\"ListItemText\":\"Get-StorageFaultDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageFaultDomain \\r\\n\"},{\"CompletionText\":\"Get-StorageFileServer\",\"ListItemText\":\"Get-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageFileServer \\r\\n\"},{\"CompletionText\":\"Get-StorageFirmwareInformation\",\"ListItemText\":\"Get-StorageFirmwareInformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageFirmwareInformation \\r\\n\"},{\"CompletionText\":\"Get-StorageHealthAction\",\"ListItemText\":\"Get-StorageHealthAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHealthAction \\r\\n\"},{\"CompletionText\":\"Get-StorageHealthReport\",\"ListItemText\":\"Get-StorageHealthReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHealthReport \\r\\n\"},{\"CompletionText\":\"Get-StorageHealthSetting\",\"ListItemText\":\"Get-StorageHealthSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHealthSetting \\r\\n\"},{\"CompletionText\":\"Get-StorageHistory\",\"ListItemText\":\"Get-StorageHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageHistory \\r\\n\"},{\"CompletionText\":\"Get-StorageJob\",\"ListItemText\":\"Get-StorageJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageJob \\r\\n\"},{\"CompletionText\":\"Get-StorageNode\",\"ListItemText\":\"Get-StorageNode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageNode \\r\\n\"},{\"CompletionText\":\"Get-StoragePool\",\"ListItemText\":\"Get-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StoragePool \\r\\n\"},{\"CompletionText\":\"Get-StorageProvider\",\"ListItemText\":\"Get-StorageProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageProvider \\r\\n\"},{\"CompletionText\":\"Get-StorageRack\",\"ListItemText\":\"Get-StorageRack\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageRack \\r\\n\"},{\"CompletionText\":\"Get-StorageReliabilityCounter\",\"ListItemText\":\"Get-StorageReliabilityCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageReliabilityCounter \\r\\n\"},{\"CompletionText\":\"Get-StorageScaleUnit\",\"ListItemText\":\"Get-StorageScaleUnit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageScaleUnit \\r\\n\"},{\"CompletionText\":\"Get-StorageSetting\",\"ListItemText\":\"Get-StorageSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageSetting \\r\\n\"},{\"CompletionText\":\"Get-StorageSite\",\"ListItemText\":\"Get-StorageSite\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageSite \\r\\n\"},{\"CompletionText\":\"Get-StorageSubSystem\",\"ListItemText\":\"Get-StorageSubSystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageSubSystem \\r\\n\"},{\"CompletionText\":\"Get-StorageTier\",\"ListItemText\":\"Get-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageTier \\r\\n\"},{\"CompletionText\":\"Get-StorageTierSupportedSize\",\"ListItemText\":\"Get-StorageTierSupportedSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-StorageTierSupportedSize \\r\\n\"},{\"CompletionText\":\"Get-SupportedClusterSizes\",\"ListItemText\":\"Get-SupportedClusterSizes\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SupportedClusterSizes \\r\\n\"},{\"CompletionText\":\"Get-SupportedFileSystems\",\"ListItemText\":\"Get-SupportedFileSystems\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-SupportedFileSystems \\r\\n\"},{\"CompletionText\":\"Get-SystemDriver\",\"ListItemText\":\"Get-SystemDriver\",\"ResultType\":2,\"ToolTip\":\"Get-SystemDriver\\r\\n\"},{\"CompletionText\":\"Get-SystemLanguage\",\"ListItemText\":\"Get-SystemLanguage\",\"ResultType\":2,\"ToolTip\":\"Get-SystemLanguage\"},{\"CompletionText\":\"Get-SystemPreferredUILanguage\",\"ListItemText\":\"Get-SystemPreferredUILanguage\",\"ResultType\":2,\"ToolTip\":\"Get-SystemPreferredUILanguage\\r\\n\"},{\"CompletionText\":\"Get-TargetPort\",\"ListItemText\":\"Get-TargetPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TargetPort \\r\\n\"},{\"CompletionText\":\"Get-TargetPortal\",\"ListItemText\":\"Get-TargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TargetPortal \\r\\n\"},{\"CompletionText\":\"Get-TestDriveItem\",\"ListItemText\":\"Get-TestDriveItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TestDriveItem \\r\\n\"},{\"CompletionText\":\"Get-TimeZone\",\"ListItemText\":\"Get-TimeZone\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TimeZone [[-Name] ] []\\r\\n\\r\\nGet-TimeZone -Id []\\r\\n\\r\\nGet-TimeZone -ListAvailable []\\r\\n\"},{\"CompletionText\":\"Get-TlsCipherSuite\",\"ListItemText\":\"Get-TlsCipherSuite\",\"ResultType\":2,\"ToolTip\":\"Get-TlsCipherSuite\\r\\n\"},{\"CompletionText\":\"Get-TlsEccCurve\",\"ListItemText\":\"Get-TlsEccCurve\",\"ResultType\":2,\"ToolTip\":\"Get-TlsEccCurve\\r\\n\"},{\"CompletionText\":\"Get-Tpm\",\"ListItemText\":\"Get-Tpm\",\"ResultType\":2,\"ToolTip\":\"Get-Tpm\\r\\n\"},{\"CompletionText\":\"Get-TpmEndorsementKeyInfo\",\"ListItemText\":\"Get-TpmEndorsementKeyInfo\",\"ResultType\":2,\"ToolTip\":\"Get-TpmEndorsementKeyInfo\\r\\n\"},{\"CompletionText\":\"Get-TpmSupportedFeature\",\"ListItemText\":\"Get-TpmSupportedFeature\",\"ResultType\":2,\"ToolTip\":\"Get-TpmSupportedFeature\\r\\n\"},{\"CompletionText\":\"Get-TraceSource\",\"ListItemText\":\"Get-TraceSource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TraceSource [[-Name] ] []\\r\\n\"},{\"CompletionText\":\"Get-TroubleshootingPack\",\"ListItemText\":\"Get-TroubleshootingPack\",\"ResultType\":2,\"ToolTip\":\"Get-TroubleshootingPack\\r\\n\"},{\"CompletionText\":\"Get-TrustedProvisioningCertificate\",\"ListItemText\":\"Get-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Get-TrustedProvisioningCertificate\\r\\n\"},{\"CompletionText\":\"Get-TypeData\",\"ListItemText\":\"Get-TypeData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-TypeData [[-TypeName] ] []\\r\\n\"},{\"CompletionText\":\"Get-UICulture\",\"ListItemText\":\"Get-UICulture\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-UICulture []\\r\\n\"},{\"CompletionText\":\"Get-Unique\",\"ListItemText\":\"Get-Unique\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Unique [-InputObject ] [-AsString] [-CaseInsensitive] []\\r\\n\\r\\nGet-Unique [-InputObject ] [-OnType] [-CaseInsensitive] []\\r\\n\"},{\"CompletionText\":\"Get-Uptime\",\"ListItemText\":\"Get-Uptime\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Uptime []\\r\\n\\r\\nGet-Uptime [-Since] []\\r\\n\"},{\"CompletionText\":\"Get-UsageAggregates\",\"ListItemText\":\"Get-UsageAggregates\",\"ResultType\":2,\"ToolTip\":\"Get-UsageAggregates\\r\\n\"},{\"CompletionText\":\"Get-Variable\",\"ListItemText\":\"Get-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Variable [[-Name] ] [-ValueOnly] [-Include ] [-Exclude ] [-Scope ] []\\r\\n\"},{\"CompletionText\":\"Get-Verb\",\"ListItemText\":\"Get-Verb\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Verb [[-Verb] ] [[-Group] ] []\\r\\n\"},{\"CompletionText\":\"Get-VHD\",\"ListItemText\":\"Get-VHD\",\"ResultType\":2,\"ToolTip\":\"Get-VHD\\r\\n\"},{\"CompletionText\":\"Get-VHDSet\",\"ListItemText\":\"Get-VHDSet\",\"ResultType\":2,\"ToolTip\":\"Get-VHDSet\\r\\n\"},{\"CompletionText\":\"Get-VHDSnapshot\",\"ListItemText\":\"Get-VHDSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-VHDSnapshot\\r\\n\"},{\"CompletionText\":\"Get-VirtualDisk\",\"ListItemText\":\"Get-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Get-VirtualDiskSupportedSize\",\"ListItemText\":\"Get-VirtualDiskSupportedSize\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VirtualDiskSupportedSize \\r\\n\"},{\"CompletionText\":\"Get-VM\",\"ListItemText\":\"Get-VM\",\"ResultType\":2,\"ToolTip\":\"Get-VM\\r\\n\"},{\"CompletionText\":\"Get-VMAssignableDevice\",\"ListItemText\":\"Get-VMAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Get-VMAssignableDevice\\r\\n\"},{\"CompletionText\":\"Get-VMBios\",\"ListItemText\":\"Get-VMBios\",\"ResultType\":2,\"ToolTip\":\"Get-VMBios\\r\\n\"},{\"CompletionText\":\"Get-VMCheckpoint\",\"ListItemText\":\"Get-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Get-VMCheckpoint\"},{\"CompletionText\":\"Get-VMComPort\",\"ListItemText\":\"Get-VMComPort\",\"ResultType\":2,\"ToolTip\":\"Get-VMComPort\\r\\n\"},{\"CompletionText\":\"Get-VMConnectAccess\",\"ListItemText\":\"Get-VMConnectAccess\",\"ResultType\":2,\"ToolTip\":\"Get-VMConnectAccess\\r\\n\"},{\"CompletionText\":\"Get-VMDirectVirtualDisk\",\"ListItemText\":\"Get-VMDirectVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VMDirectVirtualDisk \\r\\n\"},{\"CompletionText\":\"Get-VMDvdDrive\",\"ListItemText\":\"Get-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Get-VMFibreChannelHba\",\"ListItemText\":\"Get-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Get-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Get-VMFirmware\",\"ListItemText\":\"Get-VMFirmware\",\"ResultType\":2,\"ToolTip\":\"Get-VMFirmware\\r\\n\"},{\"CompletionText\":\"Get-VMFloppyDiskDrive\",\"ListItemText\":\"Get-VMFloppyDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMFloppyDiskDrive\\r\\n\"},{\"CompletionText\":\"Get-VMGpuPartitionAdapter\",\"ListItemText\":\"Get-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMGroup\",\"ListItemText\":\"Get-VMGroup\",\"ResultType\":2,\"ToolTip\":\"Get-VMGroup\\r\\n\"},{\"CompletionText\":\"Get-VMHardDiskDrive\",\"ListItemText\":\"Get-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Get-VMHost\",\"ListItemText\":\"Get-VMHost\",\"ResultType\":2,\"ToolTip\":\"Get-VMHost\\r\\n\"},{\"CompletionText\":\"Get-VMHostAssignableDevice\",\"ListItemText\":\"Get-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Get-VMHostCluster\",\"ListItemText\":\"Get-VMHostCluster\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostCluster\\r\\n\"},{\"CompletionText\":\"Get-VMHostNumaNode\",\"ListItemText\":\"Get-VMHostNumaNode\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostNumaNode\\r\\n\"},{\"CompletionText\":\"Get-VMHostNumaNodeStatus\",\"ListItemText\":\"Get-VMHostNumaNodeStatus\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostNumaNodeStatus\\r\\n\"},{\"CompletionText\":\"Get-VMHostPartitionableGpu\",\"ListItemText\":\"Get-VMHostPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Get-VMHostSupportedVersion\",\"ListItemText\":\"Get-VMHostSupportedVersion\",\"ResultType\":2,\"ToolTip\":\"Get-VMHostSupportedVersion\\r\\n\"},{\"CompletionText\":\"Get-VMIdeController\",\"ListItemText\":\"Get-VMIdeController\",\"ResultType\":2,\"ToolTip\":\"Get-VMIdeController\\r\\n\"},{\"CompletionText\":\"Get-VMIntegrationService\",\"ListItemText\":\"Get-VMIntegrationService\",\"ResultType\":2,\"ToolTip\":\"Get-VMIntegrationService\\r\\n\"},{\"CompletionText\":\"Get-VMKeyProtector\",\"ListItemText\":\"Get-VMKeyProtector\",\"ResultType\":2,\"ToolTip\":\"Get-VMKeyProtector\\r\\n\"},{\"CompletionText\":\"Get-VMKeyStorageDrive\",\"ListItemText\":\"Get-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Get-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Get-VMMemory\",\"ListItemText\":\"Get-VMMemory\",\"ResultType\":2,\"ToolTip\":\"Get-VMMemory\\r\\n\"},{\"CompletionText\":\"Get-VMMigrationNetwork\",\"ListItemText\":\"Get-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Get-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapter\",\"ListItemText\":\"Get-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterAcl\",\"ListItemText\":\"Get-VMNetworkAdapterAcl\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterAcl\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterExtendedAcl\",\"ListItemText\":\"Get-VMNetworkAdapterExtendedAcl\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterExtendedAcl\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterFailoverConfiguration\",\"ListItemText\":\"Get-VMNetworkAdapterFailoverConfiguration\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterFailoverConfiguration\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterIsolation\",\"ListItemText\":\"Get-VMNetworkAdapterIsolation\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterIsolation\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterRdma\",\"ListItemText\":\"Get-VMNetworkAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterRdma\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Get-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterTeamMapping\",\"ListItemText\":\"Get-VMNetworkAdapterTeamMapping\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterTeamMapping\\r\\n\"},{\"CompletionText\":\"Get-VMNetworkAdapterVlan\",\"ListItemText\":\"Get-VMNetworkAdapterVlan\",\"ResultType\":2,\"ToolTip\":\"Get-VMNetworkAdapterVlan\\r\\n\"},{\"CompletionText\":\"Get-VMPartitionableGpu\",\"ListItemText\":\"Get-VMPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Get-VMPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Get-VMPmemController\",\"ListItemText\":\"Get-VMPmemController\",\"ResultType\":2,\"ToolTip\":\"Get-VMPmemController\\r\\n\"},{\"CompletionText\":\"Get-VMProcessor\",\"ListItemText\":\"Get-VMProcessor\",\"ResultType\":2,\"ToolTip\":\"Get-VMProcessor\\r\\n\"},{\"CompletionText\":\"Get-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Get-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMRemoteFXPhysicalVideoAdapter\",\"ListItemText\":\"Get-VMRemoteFXPhysicalVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Get-VMRemoteFXPhysicalVideoAdapter\\r\\n\"},{\"CompletionText\":\"Get-VMReplication\",\"ListItemText\":\"Get-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Get-VMReplication\\r\\n\"},{\"CompletionText\":\"Get-VMReplicationAuthorizationEntry\",\"ListItemText\":\"Get-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"Get-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"Get-VMReplicationServer\",\"ListItemText\":\"Get-VMReplicationServer\",\"ResultType\":2,\"ToolTip\":\"Get-VMReplicationServer\\r\\n\"},{\"CompletionText\":\"Get-VMResourcePool\",\"ListItemText\":\"Get-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Get-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Get-VMSan\",\"ListItemText\":\"Get-VMSan\",\"ResultType\":2,\"ToolTip\":\"Get-VMSan\\r\\n\"},{\"CompletionText\":\"Get-VMScsiController\",\"ListItemText\":\"Get-VMScsiController\",\"ResultType\":2,\"ToolTip\":\"Get-VMScsiController\\r\\n\"},{\"CompletionText\":\"Get-VMSecurity\",\"ListItemText\":\"Get-VMSecurity\",\"ResultType\":2,\"ToolTip\":\"Get-VMSecurity\\r\\n\"},{\"CompletionText\":\"Get-VMSnapshot\",\"ListItemText\":\"Get-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Get-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Get-VMStoragePath\",\"ListItemText\":\"Get-VMStoragePath\",\"ResultType\":2,\"ToolTip\":\"Get-VMStoragePath\\r\\n\"},{\"CompletionText\":\"Get-VMStorageSettings\",\"ListItemText\":\"Get-VMStorageSettings\",\"ResultType\":2,\"ToolTip\":\"Get-VMStorageSettings\\r\\n\"},{\"CompletionText\":\"Get-VMSwitch\",\"ListItemText\":\"Get-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitch\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtension\",\"ListItemText\":\"Get-VMSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtension\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionPortData\",\"ListItemText\":\"Get-VMSwitchExtensionPortData\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionPortData\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Get-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionSwitchData\",\"ListItemText\":\"Get-VMSwitchExtensionSwitchData\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionSwitchData\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Get-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Get-VMSwitchTeam\",\"ListItemText\":\"Get-VMSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"Get-VMSwitchTeam\\r\\n\"},{\"CompletionText\":\"Get-VMSystemSwitchExtension\",\"ListItemText\":\"Get-VMSystemSwitchExtension\",\"ResultType\":2,\"ToolTip\":\"Get-VMSystemSwitchExtension\\r\\n\"},{\"CompletionText\":\"Get-VMSystemSwitchExtensionPortFeature\",\"ListItemText\":\"Get-VMSystemSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSystemSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Get-VMSystemSwitchExtensionSwitchFeature\",\"ListItemText\":\"Get-VMSystemSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Get-VMSystemSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Get-VMVideo\",\"ListItemText\":\"Get-VMVideo\",\"ResultType\":2,\"ToolTip\":\"Get-VMVideo\\r\\n\"},{\"CompletionText\":\"Get-Volume\",\"ListItemText\":\"Get-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-Volume \\r\\n\"},{\"CompletionText\":\"Get-VolumeCorruptionCount\",\"ListItemText\":\"Get-VolumeCorruptionCount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VolumeCorruptionCount \\r\\n\"},{\"CompletionText\":\"Get-VolumeScrubPolicy\",\"ListItemText\":\"Get-VolumeScrubPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VolumeScrubPolicy \\r\\n\"},{\"CompletionText\":\"Get-VpnConnection\",\"ListItemText\":\"Get-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VpnConnection \\r\\n\"},{\"CompletionText\":\"Get-VpnConnectionTrigger\",\"ListItemText\":\"Get-VpnConnectionTrigger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-VpnConnectionTrigger \\r\\n\"},{\"CompletionText\":\"Get-WdacBidTrace\",\"ListItemText\":\"Get-WdacBidTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-WdacBidTrace \\r\\n\"},{\"CompletionText\":\"Get-WheaMemoryPolicy\",\"ListItemText\":\"Get-WheaMemoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Get-WheaMemoryPolicy\\r\\n\"},{\"CompletionText\":\"Get-WIMBootEntry\",\"ListItemText\":\"Get-WIMBootEntry\",\"ResultType\":2,\"ToolTip\":\"Get-WIMBootEntry\\r\\n\"},{\"CompletionText\":\"Get-WinAcceptLanguageFromLanguageListOptOut\",\"ListItemText\":\"Get-WinAcceptLanguageFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Get-WinAcceptLanguageFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Get-WinCultureFromLanguageListOptOut\",\"ListItemText\":\"Get-WinCultureFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Get-WinCultureFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Get-WinDefaultInputMethodOverride\",\"ListItemText\":\"Get-WinDefaultInputMethodOverride\",\"ResultType\":2,\"ToolTip\":\"Get-WinDefaultInputMethodOverride\\r\\n\"},{\"CompletionText\":\"Get-WindowsCapability\",\"ListItemText\":\"Get-WindowsCapability\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsCapability\\r\\n\"},{\"CompletionText\":\"Get-WindowsDeveloperLicense\",\"ListItemText\":\"Get-WindowsDeveloperLicense\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsDeveloperLicense\\r\\n\"},{\"CompletionText\":\"Get-WindowsDriver\",\"ListItemText\":\"Get-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Get-WindowsEdition\",\"ListItemText\":\"Get-WindowsEdition\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsEdition\\r\\n\"},{\"CompletionText\":\"Get-WindowsErrorReporting\",\"ListItemText\":\"Get-WindowsErrorReporting\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsErrorReporting\\r\\n\"},{\"CompletionText\":\"Get-WindowsImage\",\"ListItemText\":\"Get-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsImage\\r\\n\"},{\"CompletionText\":\"Get-WindowsImageContent\",\"ListItemText\":\"Get-WindowsImageContent\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsImageContent\\r\\n\"},{\"CompletionText\":\"Get-WindowsOptionalFeature\",\"ListItemText\":\"Get-WindowsOptionalFeature\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsOptionalFeature\\r\\n\"},{\"CompletionText\":\"Get-WindowsPackage\",\"ListItemText\":\"Get-WindowsPackage\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsPackage\\r\\n\"},{\"CompletionText\":\"Get-WindowsReservedStorageState\",\"ListItemText\":\"Get-WindowsReservedStorageState\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsReservedStorageState\\r\\n\"},{\"CompletionText\":\"Get-WindowsSearchSetting\",\"ListItemText\":\"Get-WindowsSearchSetting\",\"ResultType\":2,\"ToolTip\":\"Get-WindowsSearchSetting\\r\\n\"},{\"CompletionText\":\"Get-WindowsUpdateLog\",\"ListItemText\":\"Get-WindowsUpdateLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-WindowsUpdateLog \\r\\n\"},{\"CompletionText\":\"Get-WinEvent\",\"ListItemText\":\"Get-WinEvent\",\"ResultType\":2,\"ToolTip\":\"Get-WinEvent\\r\\n\"},{\"CompletionText\":\"Get-WinHomeLocation\",\"ListItemText\":\"Get-WinHomeLocation\",\"ResultType\":2,\"ToolTip\":\"Get-WinHomeLocation\\r\\n\"},{\"CompletionText\":\"Get-WinhttpProxy\",\"ListItemText\":\"Get-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"Get-WinLanguageBarOption\",\"ListItemText\":\"Get-WinLanguageBarOption\",\"ResultType\":2,\"ToolTip\":\"Get-WinLanguageBarOption\\r\\n\"},{\"CompletionText\":\"Get-WinSystemLocale\",\"ListItemText\":\"Get-WinSystemLocale\",\"ResultType\":2,\"ToolTip\":\"Get-WinSystemLocale\\r\\n\"},{\"CompletionText\":\"Get-WinUILanguageOverride\",\"ListItemText\":\"Get-WinUILanguageOverride\",\"ResultType\":2,\"ToolTip\":\"Get-WinUILanguageOverride\\r\\n\"},{\"CompletionText\":\"Get-WinUserLanguageList\",\"ListItemText\":\"Get-WinUserLanguageList\",\"ResultType\":2,\"ToolTip\":\"Get-WinUserLanguageList\\r\\n\"},{\"CompletionText\":\"Get-WSManCredSSP\",\"ListItemText\":\"Get-WSManCredSSP\",\"ResultType\":2,\"ToolTip\":\"Get-WSManCredSSP\\r\\n\"},{\"CompletionText\":\"Get-WSManInstance\",\"ListItemText\":\"Get-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"Get-WSManInstance\\r\\n\"},{\"CompletionText\":\"GetHelp.exe\",\"ListItemText\":\"GetHelp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\GetHelp.exe\"},{\"CompletionText\":\"getmac.exe\",\"ListItemText\":\"getmac.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\getmac.exe\"},{\"CompletionText\":\"gh.exe\",\"ListItemText\":\"gh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\GitHub CLI\\\\gh.exe\"},{\"CompletionText\":\"ghy\",\"ListItemText\":\"ghy\",\"ResultType\":2,\"ToolTip\":\"Get-History\"},{\"CompletionText\":\"gi\",\"ListItemText\":\"gi\",\"ResultType\":2,\"ToolTip\":\"Get-Item\"},{\"CompletionText\":\"gin\",\"ListItemText\":\"gin\",\"ResultType\":2,\"ToolTip\":\"Get-ComputerInfo\"},{\"CompletionText\":\"gip\",\"ListItemText\":\"gip\",\"ResultType\":2,\"ToolTip\":\"gip\"},{\"CompletionText\":\"git-gui.exe\",\"ListItemText\":\"git-gui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-gui.exe\"},{\"CompletionText\":\"git-lfs.exe\",\"ListItemText\":\"git-lfs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git LFS\\\\git-lfs.exe\"},{\"CompletionText\":\"git-receive-pack.exe\",\"ListItemText\":\"git-receive-pack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-receive-pack.exe\"},{\"CompletionText\":\"git-upload-pack.exe\",\"ListItemText\":\"git-upload-pack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-upload-pack.exe\"},{\"CompletionText\":\"git.exe\",\"ListItemText\":\"git.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git.exe\"},{\"CompletionText\":\"gitk.exe\",\"ListItemText\":\"gitk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\gitk.exe\"},{\"CompletionText\":\"gjb\",\"ListItemText\":\"gjb\",\"ResultType\":2,\"ToolTip\":\"Get-Job\"},{\"CompletionText\":\"gl\",\"ListItemText\":\"gl\",\"ResultType\":2,\"ToolTip\":\"Get-Location\"},{\"CompletionText\":\"glcm\",\"ListItemText\":\"glcm\",\"ResultType\":2,\"ToolTip\":\"glcm\"},{\"CompletionText\":\"glg\",\"ListItemText\":\"glg\",\"ResultType\":2,\"ToolTip\":\"glg\"},{\"CompletionText\":\"glgm\",\"ListItemText\":\"glgm\",\"ResultType\":2,\"ToolTip\":\"glgm\"},{\"CompletionText\":\"glu\",\"ListItemText\":\"glu\",\"ResultType\":2,\"ToolTip\":\"glu\"},{\"CompletionText\":\"gm\",\"ListItemText\":\"gm\",\"ResultType\":2,\"ToolTip\":\"Get-Member\"},{\"CompletionText\":\"gmo\",\"ListItemText\":\"gmo\",\"ResultType\":2,\"ToolTip\":\"Get-Module\"},{\"CompletionText\":\"gp\",\"ListItemText\":\"gp\",\"ResultType\":2,\"ToolTip\":\"Get-ItemProperty\"},{\"CompletionText\":\"gpedit.msc\",\"ListItemText\":\"gpedit.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpedit.msc\"},{\"CompletionText\":\"gpg-agent.exe\",\"ListItemText\":\"gpg-agent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-agent.exe\"},{\"CompletionText\":\"gpg-card.exe\",\"ListItemText\":\"gpg-card.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-card.exe\"},{\"CompletionText\":\"gpg-check-pattern.exe\",\"ListItemText\":\"gpg-check-pattern.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-check-pattern.exe\"},{\"CompletionText\":\"gpg-connect-agent.exe\",\"ListItemText\":\"gpg-connect-agent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-connect-agent.exe\"},{\"CompletionText\":\"gpg-disable-keyboxd.bat\",\"ListItemText\":\"gpg-disable-keyboxd.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-disable-keyboxd.bat\"},{\"CompletionText\":\"gpg-enable-keyboxd.bat\",\"ListItemText\":\"gpg-enable-keyboxd.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-enable-keyboxd.bat\"},{\"CompletionText\":\"gpg-preset-passphrase.exe\",\"ListItemText\":\"gpg-preset-passphrase.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-preset-passphrase.exe\"},{\"CompletionText\":\"gpg-wks-client.exe\",\"ListItemText\":\"gpg-wks-client.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg-wks-client.exe\"},{\"CompletionText\":\"gpg.exe\",\"ListItemText\":\"gpg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpg.exe\"},{\"CompletionText\":\"gpgconf.exe\",\"ListItemText\":\"gpgconf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgconf.exe\"},{\"CompletionText\":\"gpgme-w32spawn.exe\",\"ListItemText\":\"gpgme-w32spawn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgme-w32spawn.exe\"},{\"CompletionText\":\"gpgsm.exe\",\"ListItemText\":\"gpgsm.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgsm.exe\"},{\"CompletionText\":\"gpgtar.exe\",\"ListItemText\":\"gpgtar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgtar.exe\"},{\"CompletionText\":\"gpgv.exe\",\"ListItemText\":\"gpgv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\gpgv.exe\"},{\"CompletionText\":\"gpresult.exe\",\"ListItemText\":\"gpresult.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpresult.exe\"},{\"CompletionText\":\"gps\",\"ListItemText\":\"gps\",\"ResultType\":2,\"ToolTip\":\"Get-Process\"},{\"CompletionText\":\"gpscript.exe\",\"ListItemText\":\"gpscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpscript.exe\"},{\"CompletionText\":\"gpupdate.exe\",\"ListItemText\":\"gpupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\gpupdate.exe\"},{\"CompletionText\":\"gpv\",\"ListItemText\":\"gpv\",\"ResultType\":2,\"ToolTip\":\"Get-ItemPropertyValue\"},{\"CompletionText\":\"Grant-AzDataShareSubscriptionAccess\",\"ListItemText\":\"Grant-AzDataShareSubscriptionAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-AzDataShareSubscriptionAccess\\r\\n\"},{\"CompletionText\":\"Grant-AzDiskAccess\",\"ListItemText\":\"Grant-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Grant-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Grant-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Grant-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Grant-AzSnapshotAccess\",\"ListItemText\":\"Grant-AzSnapshotAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-AzSnapshotAccess\\r\\n\"},{\"CompletionText\":\"Grant-FileShareAccess\",\"ListItemText\":\"Grant-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Grant-HgsKeyProtectorAccess\",\"ListItemText\":\"Grant-HgsKeyProtectorAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-HgsKeyProtectorAccess \\r\\n\"},{\"CompletionText\":\"Grant-SmbClientAccessToServer\",\"ListItemText\":\"Grant-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Grant-SmbShareAccess\",\"ListItemText\":\"Grant-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGrant-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Grant-VMConnectAccess\",\"ListItemText\":\"Grant-VMConnectAccess\",\"ResultType\":2,\"ToolTip\":\"Grant-VMConnectAccess\\r\\n\"},{\"CompletionText\":\"group\",\"ListItemText\":\"group\",\"ResultType\":2,\"ToolTip\":\"Group-Object\"},{\"CompletionText\":\"Group-Object\",\"ListItemText\":\"Group-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGroup-Object [[-Property] ] [-NoElement] [-AsHashTable] [-AsString] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\"},{\"CompletionText\":\"grpconv.exe\",\"ListItemText\":\"grpconv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\grpconv.exe\"},{\"CompletionText\":\"grsmba\",\"ListItemText\":\"grsmba\",\"ResultType\":2,\"ToolTip\":\"grsmba\"},{\"CompletionText\":\"grsmbclas\",\"ListItemText\":\"grsmbclas\",\"ResultType\":2,\"ToolTip\":\"grsmbclas\"},{\"CompletionText\":\"gsmba\",\"ListItemText\":\"gsmba\",\"ResultType\":2,\"ToolTip\":\"gsmba\"},{\"CompletionText\":\"gsmbb\",\"ListItemText\":\"gsmbb\",\"ResultType\":2,\"ToolTip\":\"gsmbb\"},{\"CompletionText\":\"gsmbc\",\"ListItemText\":\"gsmbc\",\"ResultType\":2,\"ToolTip\":\"gsmbc\"},{\"CompletionText\":\"gsmbcc\",\"ListItemText\":\"gsmbcc\",\"ResultType\":2,\"ToolTip\":\"gsmbcc\"},{\"CompletionText\":\"gsmbccm\",\"ListItemText\":\"gsmbccm\",\"ResultType\":2,\"ToolTip\":\"gsmbccm\"},{\"CompletionText\":\"gsmbclas\",\"ListItemText\":\"gsmbclas\",\"ResultType\":2,\"ToolTip\":\"gsmbclas\"},{\"CompletionText\":\"gsmbcn\",\"ListItemText\":\"gsmbcn\",\"ResultType\":2,\"ToolTip\":\"gsmbcn\"},{\"CompletionText\":\"gsmbd\",\"ListItemText\":\"gsmbd\",\"ResultType\":2,\"ToolTip\":\"gsmbd\"},{\"CompletionText\":\"gsmbgm\",\"ListItemText\":\"gsmbgm\",\"ResultType\":2,\"ToolTip\":\"gsmbgm\"},{\"CompletionText\":\"gsmbm\",\"ListItemText\":\"gsmbm\",\"ResultType\":2,\"ToolTip\":\"gsmbm\"},{\"CompletionText\":\"gsmbmc\",\"ListItemText\":\"gsmbmc\",\"ResultType\":2,\"ToolTip\":\"gsmbmc\"},{\"CompletionText\":\"gsmbo\",\"ListItemText\":\"gsmbo\",\"ResultType\":2,\"ToolTip\":\"gsmbo\"},{\"CompletionText\":\"gsmbs\",\"ListItemText\":\"gsmbs\",\"ResultType\":2,\"ToolTip\":\"gsmbs\"},{\"CompletionText\":\"gsmbsc\",\"ListItemText\":\"gsmbsc\",\"ResultType\":2,\"ToolTip\":\"gsmbsc\"},{\"CompletionText\":\"gsmbscm\",\"ListItemText\":\"gsmbscm\",\"ResultType\":2,\"ToolTip\":\"gsmbscm\"},{\"CompletionText\":\"gsmbscp\",\"ListItemText\":\"gsmbscp\",\"ResultType\":2,\"ToolTip\":\"gsmbscp\"},{\"CompletionText\":\"gsmbse\",\"ListItemText\":\"gsmbse\",\"ResultType\":2,\"ToolTip\":\"gsmbse\"},{\"CompletionText\":\"gsmbsn\",\"ListItemText\":\"gsmbsn\",\"ResultType\":2,\"ToolTip\":\"gsmbsn\"},{\"CompletionText\":\"gsmbt\",\"ListItemText\":\"gsmbt\",\"ResultType\":2,\"ToolTip\":\"gsmbt\"},{\"CompletionText\":\"gsmbw\",\"ListItemText\":\"gsmbw\",\"ResultType\":2,\"ToolTip\":\"gsmbw\"},{\"CompletionText\":\"gsn\",\"ListItemText\":\"gsn\",\"ResultType\":2,\"ToolTip\":\"Get-PSSession\"},{\"CompletionText\":\"gsv\",\"ListItemText\":\"gsv\",\"ResultType\":2,\"ToolTip\":\"Get-Service\"},{\"CompletionText\":\"gtz\",\"ListItemText\":\"gtz\",\"ResultType\":2,\"ToolTip\":\"Get-TimeZone\"},{\"CompletionText\":\"gu\",\"ListItemText\":\"gu\",\"ResultType\":2,\"ToolTip\":\"Get-Unique\"},{\"CompletionText\":\"gv\",\"ListItemText\":\"gv\",\"ResultType\":2,\"ToolTip\":\"Get-Variable\"},{\"CompletionText\":\"gvm\",\"ListItemText\":\"gvm\",\"ResultType\":2,\"ToolTip\":\"gvm\"},{\"CompletionText\":\"gvmr\",\"ListItemText\":\"gvmr\",\"ResultType\":2,\"ToolTip\":\"gvmr\"},{\"CompletionText\":\"gvmrs\",\"ListItemText\":\"gvmrs\",\"ResultType\":2,\"ToolTip\":\"gvmrs\"},{\"CompletionText\":\"h\",\"ListItemText\":\"h\",\"ResultType\":2,\"ToolTip\":\"Get-History\"},{\"CompletionText\":\"H:\",\"ListItemText\":\"H:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nH: \\r\\n\"},{\"CompletionText\":\"handle.exe\",\"ListItemText\":\"handle.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Tools\\\\Handle\\\\handle.exe\"},{\"CompletionText\":\"handle64.exe\",\"ListItemText\":\"handle64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Tools\\\\Handle\\\\handle64.exe\"},{\"CompletionText\":\"handle64a.exe\",\"ListItemText\":\"handle64a.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Tools\\\\Handle\\\\handle64a.exe\"},{\"CompletionText\":\"hatch.exe\",\"ListItemText\":\"hatch.exe\",\"ResultType\":2,\"ToolTip\":\"c:\\\\users\\\\daniel\\\\.local\\\\bin\\\\hatch.exe\"},{\"CompletionText\":\"hcsdiag.exe\",\"ListItemText\":\"hcsdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hcsdiag.exe\"},{\"CompletionText\":\"hdwwiz.cpl\",\"ListItemText\":\"hdwwiz.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hdwwiz.cpl\"},{\"CompletionText\":\"hdwwiz.exe\",\"ListItemText\":\"hdwwiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hdwwiz.exe\"},{\"CompletionText\":\"help\",\"ListItemText\":\"help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nhelp [[-Name] ] [-Path ] [-Category ] [-Full] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Detailed [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Examples [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Parameter [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -Online [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\\r\\nhelp [[-Name] ] -ShowWindow [-Path ] [-Category ] [-Component ] [-Functionality ] [-Role ] []\\r\\n\"},{\"CompletionText\":\"help.exe\",\"ListItemText\":\"help.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\help.exe\"},{\"CompletionText\":\"HelpPane.exe\",\"ListItemText\":\"HelpPane.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\HelpPane.exe\"},{\"CompletionText\":\"hh.exe\",\"ListItemText\":\"hh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\hh.exe\"},{\"CompletionText\":\"Hide-VirtualDisk\",\"ListItemText\":\"Hide-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nHide-VirtualDisk \\r\\n\"},{\"CompletionText\":\"history\",\"ListItemText\":\"history\",\"ResultType\":2,\"ToolTip\":\"Get-History\"},{\"CompletionText\":\"hnsdiag.exe\",\"ListItemText\":\"hnsdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hnsdiag.exe\"},{\"CompletionText\":\"HOSTNAME.EXE\",\"ListItemText\":\"HOSTNAME.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\HOSTNAME.EXE\"},{\"CompletionText\":\"hsdb.exe\",\"ListItemText\":\"hsdb.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\hsdb.exe\"},{\"CompletionText\":\"hub-tool.exe\",\"ListItemText\":\"hub-tool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\hub-tool.exe\"},{\"CompletionText\":\"hvax64.exe\",\"ListItemText\":\"hvax64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvax64.exe\"},{\"CompletionText\":\"hvc.exe\",\"ListItemText\":\"hvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvc.exe\"},{\"CompletionText\":\"hvix64.exe\",\"ListItemText\":\"hvix64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvix64.exe\"},{\"CompletionText\":\"hvsievaluator.exe\",\"ListItemText\":\"hvsievaluator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\hvsievaluator.exe\"},{\"CompletionText\":\"I:\",\"ListItemText\":\"I:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nI: \\r\\n\"},{\"CompletionText\":\"icacls.exe\",\"ListItemText\":\"icacls.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\icacls.exe\"},{\"CompletionText\":\"icim\",\"ListItemText\":\"icim\",\"ResultType\":2,\"ToolTip\":\"icim\"},{\"CompletionText\":\"icm\",\"ListItemText\":\"icm\",\"ResultType\":2,\"ToolTip\":\"Invoke-Command\"},{\"CompletionText\":\"IcsEntitlementHost.exe\",\"ListItemText\":\"IcsEntitlementHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\IcsEntitlementHost.exe\"},{\"CompletionText\":\"icsunattend.exe\",\"ListItemText\":\"icsunattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\icsunattend.exe\"},{\"CompletionText\":\"idle.exe\",\"ListItemText\":\"idle.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\idle.exe\"},{\"CompletionText\":\"idle3.9.exe\",\"ListItemText\":\"idle3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\idle3.9.exe\"},{\"CompletionText\":\"idle3.exe\",\"ListItemText\":\"idle3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\idle3.exe\"},{\"CompletionText\":\"idlj.exe\",\"ListItemText\":\"idlj.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\idlj.exe\"},{\"CompletionText\":\"ie4uinit.exe\",\"ListItemText\":\"ie4uinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ie4uinit.exe\"},{\"CompletionText\":\"ie4ushowIE.exe\",\"ListItemText\":\"ie4ushowIE.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ie4ushowIE.exe\"},{\"CompletionText\":\"IESettingSync.exe\",\"ListItemText\":\"IESettingSync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\IESettingSync.exe\"},{\"CompletionText\":\"ieUnatt.exe\",\"ListItemText\":\"ieUnatt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ieUnatt.exe\"},{\"CompletionText\":\"iex\",\"ListItemText\":\"iex\",\"ResultType\":2,\"ToolTip\":\"Invoke-Expression\"},{\"CompletionText\":\"iexpress.exe\",\"ListItemText\":\"iexpress.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iexpress.exe\"},{\"CompletionText\":\"ihy\",\"ListItemText\":\"ihy\",\"ResultType\":2,\"ToolTip\":\"Invoke-History\"},{\"CompletionText\":\"ii\",\"ListItemText\":\"ii\",\"ResultType\":2,\"ToolTip\":\"Invoke-Item\"},{\"CompletionText\":\"immersivetpmvscmgrsvr.exe\",\"ListItemText\":\"immersivetpmvscmgrsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\immersivetpmvscmgrsvr.exe\"},{\"CompletionText\":\"Import-AdlStoreItem\",\"ListItemText\":\"Import-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Import-AdlStoreItem\"},{\"CompletionText\":\"Import-Alias\",\"ListItemText\":\"Import-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Alias [-Path] [-Scope ] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nImport-Alias -LiteralPath [-Scope ] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Import-AzAksCredential\",\"ListItemText\":\"Import-AzAksCredential\",\"ResultType\":2,\"ToolTip\":\"Import-AzAksCredential\\r\\n\"},{\"CompletionText\":\"Import-AzApiManagementApi\",\"ListItemText\":\"Import-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Import-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Import-AzAutomationDscConfiguration\",\"ListItemText\":\"Import-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Import-AzAutomationDscNodeConfiguration\",\"ListItemText\":\"Import-AzAutomationDscNodeConfiguration\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationDscNodeConfiguration\\r\\n\"},{\"CompletionText\":\"Import-AzAutomationModule\",\"ListItemText\":\"Import-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationModule\"},{\"CompletionText\":\"Import-AzAutomationRunbook\",\"ListItemText\":\"Import-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Import-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Import-AzCdnEndpointContent\",\"ListItemText\":\"Import-AzCdnEndpointContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-AzCdnEndpointContent \\r\\n\"},{\"CompletionText\":\"Import-AzConfig\",\"ListItemText\":\"Import-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Import-AzConfig\\r\\n\"},{\"CompletionText\":\"Import-AzContainerRegistryImage\",\"ListItemText\":\"Import-AzContainerRegistryImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-AzContainerRegistryImage \\r\\n\"},{\"CompletionText\":\"Import-AzContext\",\"ListItemText\":\"Import-AzContext\",\"ResultType\":2,\"ToolTip\":\"Import-AzContext\\r\\n\"},{\"CompletionText\":\"Import-AzDataLakeStoreItem\",\"ListItemText\":\"Import-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Import-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Import-AzKeyVaultCertificate\",\"ListItemText\":\"Import-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Import-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Import-AzKeyVaultSecurityDomain\",\"ListItemText\":\"Import-AzKeyVaultSecurityDomain\",\"ResultType\":2,\"ToolTip\":\"Import-AzKeyVaultSecurityDomain\\r\\n\"},{\"CompletionText\":\"Import-AzMlWebService\",\"ListItemText\":\"Import-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Import-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Import-AzRecoveryServicesAsrVaultSettingsFile\",\"ListItemText\":\"Import-AzRecoveryServicesAsrVaultSettingsFile\",\"ResultType\":2,\"ToolTip\":\"Import-AzRecoveryServicesAsrVaultSettingsFile\\r\\n\"},{\"CompletionText\":\"Import-AzRedisCache\",\"ListItemText\":\"Import-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Import-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Import-AzRedisEnterpriseCache\",\"ListItemText\":\"Import-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Import-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Import-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"Import-AzRedisEnterpriseCacheDatabase\"},{\"CompletionText\":\"Import-AzSynapseKqlScript\",\"ListItemText\":\"Import-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseKqlScript\"},{\"CompletionText\":\"Import-AzSynapseNotebook\",\"ListItemText\":\"Import-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseNotebook\"},{\"CompletionText\":\"Import-AzSynapseSparkConfiguration\",\"ListItemText\":\"Import-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseSparkConfiguration\"},{\"CompletionText\":\"Import-AzSynapseSqlScript\",\"ListItemText\":\"Import-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Import-AzSynapseSqlScript\"},{\"CompletionText\":\"Import-AzWebAppKeyVaultCertificate\",\"ListItemText\":\"Import-AzWebAppKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Import-AzWebAppKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Import-BCCachePackage\",\"ListItemText\":\"Import-BCCachePackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-BCCachePackage \\r\\n\"},{\"CompletionText\":\"Import-BcdStore\",\"ListItemText\":\"Import-BcdStore\",\"ResultType\":2,\"ToolTip\":\"Import-BcdStore\\r\\n\"},{\"CompletionText\":\"Import-BCSecretKey\",\"ListItemText\":\"Import-BCSecretKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-BCSecretKey \\r\\n\"},{\"CompletionText\":\"Import-BinaryMiLog\",\"ListItemText\":\"Import-BinaryMiLog\",\"ResultType\":2,\"ToolTip\":\"Import-BinaryMiLog\\r\\n\"},{\"CompletionText\":\"Import-Certificate\",\"ListItemText\":\"Import-Certificate\",\"ResultType\":2,\"ToolTip\":\"Import-Certificate\\r\\n\"},{\"CompletionText\":\"Import-Clixml\",\"ListItemText\":\"Import-Clixml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Clixml [-Path] [-IncludeTotalCount] [-Skip ] [-First ] []\\r\\n\\r\\nImport-Clixml -LiteralPath [-IncludeTotalCount] [-Skip ] [-First ] []\\r\\n\"},{\"CompletionText\":\"Import-Counter\",\"ListItemText\":\"Import-Counter\",\"ResultType\":2,\"ToolTip\":\"Import-Counter\\r\\n\"},{\"CompletionText\":\"Import-Csv\",\"ListItemText\":\"Import-Csv\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Csv [-Path] [[-Delimiter] ] [-Header ] [-Encoding ] []\\r\\n\\r\\nImport-Csv [[-Delimiter] ] -LiteralPath [-Header ] [-Encoding ] []\\r\\n\\r\\nImport-Csv [-Path] -UseCulture [-Header ] [-Encoding ] []\\r\\n\\r\\nImport-Csv -LiteralPath -UseCulture [-Header ] [-Encoding ] []\\r\\n\"},{\"CompletionText\":\"Import-HgsGuardian\",\"ListItemText\":\"Import-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Import-IseSnippet\",\"ListItemText\":\"Import-IseSnippet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-IseSnippet \\r\\n\"},{\"CompletionText\":\"Import-LocalizedData\",\"ListItemText\":\"Import-LocalizedData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-LocalizedData [[-BindingVariable] ] [[-UICulture] ] [-BaseDirectory ] [-FileName ] [-SupportedCommand ] []\\r\\n\"},{\"CompletionText\":\"Import-Module\",\"ListItemText\":\"Import-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-Module [-Name] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-Name] -PSSession [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-Name] -CimSession [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] [-CimResourceUri ] [-CimNamespace ] []\\r\\n\\r\\nImport-Module [-Name] -UseWindowsPowerShell [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-PassThru] [-AsCustomObject] [-MinimumVersion ] [-MaximumVersion ] [-RequiredVersion ] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-FullyQualifiedName] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-FullyQualifiedName] -PSSession [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-FullyQualifiedName] -UseWindowsPowerShell [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-Assembly] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\\r\\nImport-Module [-ModuleInfo] [-Global] [-Prefix ] [-Function ] [-Cmdlet ] [-Variable ] [-Alias ] [-Force] [-SkipEditionCheck] [-PassThru] [-AsCustomObject] [-ArgumentList ] [-DisableNameChecking] [-NoClobber] [-Scope ] []\\r\\n\"},{\"CompletionText\":\"Import-PackageProvider\",\"ListItemText\":\"Import-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Import-PackageProvider\\r\\n\"},{\"CompletionText\":\"Import-PfxCertificate\",\"ListItemText\":\"Import-PfxCertificate\",\"ResultType\":2,\"ToolTip\":\"Import-PfxCertificate\\r\\n\"},{\"CompletionText\":\"Import-PowerShellDataFile\",\"ListItemText\":\"Import-PowerShellDataFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-PowerShellDataFile [-Path] [-SkipLimitCheck] []\\r\\n\\r\\nImport-PowerShellDataFile [-LiteralPath] [-SkipLimitCheck] []\\r\\n\"},{\"CompletionText\":\"Import-PSGetRepository\",\"ListItemText\":\"Import-PSGetRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-PSGetRepository \\r\\n\"},{\"CompletionText\":\"Import-PSSession\",\"ListItemText\":\"Import-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-PSSession [-Session] [[-CommandName] ] [[-FormatTypeName] ] [-Prefix ] [-DisableNameChecking] [-AllowClobber] [-ArgumentList ] [-CommandType ] [-Module ] [-FullyQualifiedModule ] [-Certificate ] []\\r\\n\"},{\"CompletionText\":\"Import-StartLayout\",\"ListItemText\":\"Import-StartLayout\",\"ResultType\":2,\"ToolTip\":\"Import-StartLayout\\r\\n\"},{\"CompletionText\":\"Import-TpmOwnerAuth\",\"ListItemText\":\"Import-TpmOwnerAuth\",\"ResultType\":2,\"ToolTip\":\"Import-TpmOwnerAuth\\r\\n\"},{\"CompletionText\":\"Import-VM\",\"ListItemText\":\"Import-VM\",\"ResultType\":2,\"ToolTip\":\"Import-VM\\r\\n\"},{\"CompletionText\":\"Import-VMInitialReplication\",\"ListItemText\":\"Import-VMInitialReplication\",\"ResultType\":2,\"ToolTip\":\"Import-VMInitialReplication\\r\\n\"},{\"CompletionText\":\"Import-WinhttpProxy\",\"ListItemText\":\"Import-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nImport-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"In\",\"ListItemText\":\"In\",\"ResultType\":2,\"ToolTip\":\"\\r\\nIn \\r\\n\"},{\"CompletionText\":\"inetcpl.cpl\",\"ListItemText\":\"inetcpl.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\inetcpl.cpl\"},{\"CompletionText\":\"InfDefaultInstall.exe\",\"ListItemText\":\"InfDefaultInstall.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\InfDefaultInstall.exe\"},{\"CompletionText\":\"Initialize-AzDataProtectionBackupInstance\",\"ListItemText\":\"Initialize-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Initialize-AzDataProtectionRestoreRequest\",\"ListItemText\":\"Initialize-AzDataProtectionRestoreRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-AzDataProtectionRestoreRequest \\r\\n\"},{\"CompletionText\":\"Initialize-AzMigrateReplicationInfrastructure\",\"ListItemText\":\"Initialize-AzMigrateReplicationInfrastructure\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-AzMigrateReplicationInfrastructure \\r\\n\"},{\"CompletionText\":\"Initialize-AzRecoveryServicesBackupProtectableItem\",\"ListItemText\":\"Initialize-AzRecoveryServicesBackupProtectableItem\",\"ResultType\":2,\"ToolTip\":\"Initialize-AzRecoveryServicesBackupProtectableItem\\r\\n\"},{\"CompletionText\":\"Initialize-AzRecoveryServicesDSMove\",\"ListItemText\":\"Initialize-AzRecoveryServicesDSMove\",\"ResultType\":2,\"ToolTip\":\"Initialize-AzRecoveryServicesDSMove\\r\\n\"},{\"CompletionText\":\"Initialize-Disk\",\"ListItemText\":\"Initialize-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInitialize-Disk \\r\\n\"},{\"CompletionText\":\"Initialize-PmemPhysicalDevice\",\"ListItemText\":\"Initialize-PmemPhysicalDevice\",\"ResultType\":2,\"ToolTip\":\"Initialize-PmemPhysicalDevice\\r\\n\"},{\"CompletionText\":\"Initialize-Tpm\",\"ListItemText\":\"Initialize-Tpm\",\"ResultType\":2,\"ToolTip\":\"Initialize-Tpm\\r\\n\"},{\"CompletionText\":\"Initialize-Volume\",\"ListItemText\":\"Initialize-Volume\",\"ResultType\":2,\"ToolTip\":\"Initialize-Volume\"},{\"CompletionText\":\"inmo\",\"ListItemText\":\"inmo\",\"ResultType\":2,\"ToolTip\":\"inmo\"},{\"CompletionText\":\"InModuleScope\",\"ListItemText\":\"InModuleScope\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInModuleScope \\r\\n\"},{\"CompletionText\":\"InputSwitchToastHandler.exe\",\"ListItemText\":\"InputSwitchToastHandler.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\InputSwitchToastHandler.exe\"},{\"CompletionText\":\"Install-AzAksCliTool\",\"ListItemText\":\"Install-AzAksCliTool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-AzAksCliTool \\r\\n\"},{\"CompletionText\":\"Install-AzAksKubectl\",\"ListItemText\":\"Install-AzAksKubectl\",\"ResultType\":2,\"ToolTip\":\"Install-AzAksKubectl\"},{\"CompletionText\":\"Install-AzStackHCIRemoteSupport\",\"ListItemText\":\"Install-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Install-Dtc\",\"ListItemText\":\"Install-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Dtc \\r\\n\"},{\"CompletionText\":\"Install-Language\",\"ListItemText\":\"Install-Language\",\"ResultType\":2,\"ToolTip\":\"Install-Language\\r\\n\"},{\"CompletionText\":\"Install-Module\",\"ListItemText\":\"Install-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Module \\r\\n\"},{\"CompletionText\":\"Install-Package\",\"ListItemText\":\"Install-Package\",\"ResultType\":2,\"ToolTip\":\"Install-Package\\r\\n\"},{\"CompletionText\":\"Install-PackageProvider\",\"ListItemText\":\"Install-PackageProvider\",\"ResultType\":2,\"ToolTip\":\"Install-PackageProvider\\r\\n\"},{\"CompletionText\":\"Install-PowerShellRemoting.ps1\",\"ListItemText\":\"Install-PowerShellRemoting.ps1\",\"ResultType\":2,\"ToolTip\":\"Install-PowerShellRemoting.ps1 [-PowerShellHome ] []\\r\\nInstall-PowerShellRemoting.ps1 -Force [-PowerShellHome ] []\\r\\n\"},{\"CompletionText\":\"Install-ProvisioningPackage\",\"ListItemText\":\"Install-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Install-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Install-PSResource\",\"ListItemText\":\"Install-PSResource\",\"ResultType\":2,\"ToolTip\":\"Install-PSResource\\r\\n\"},{\"CompletionText\":\"Install-Script\",\"ListItemText\":\"Install-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Script \\r\\n\"},{\"CompletionText\":\"Install-TrustedProvisioningCertificate\",\"ListItemText\":\"Install-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Install-TrustedProvisioningCertificate\\r\\n\"},{\"CompletionText\":\"InstallPSCorePolicyDefinitions.ps1\",\"ListItemText\":\"InstallPSCorePolicyDefinitions.ps1\",\"ResultType\":2,\"ToolTip\":\"InstallPSCorePolicyDefinitions.ps1 [[-Path] ] []\\r\\n\"},{\"CompletionText\":\"install_tools.bat\",\"ListItemText\":\"install_tools.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\install_tools.bat\"},{\"CompletionText\":\"intl.cpl\",\"ListItemText\":\"intl.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\intl.cpl\"},{\"CompletionText\":\"Invoke-AsWorkflow\",\"ListItemText\":\"Invoke-AsWorkflow\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AsWorkflow \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksAbortAgentPoolLatestOperation\",\"ListItemText\":\"Invoke-AzAksAbortAgentPoolLatestOperation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzAksAbortAgentPoolLatestOperation \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksAbortManagedClusterLatestOperation\",\"ListItemText\":\"Invoke-AzAksAbortManagedClusterLatestOperation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzAksAbortManagedClusterLatestOperation \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksRotateManagedClusterServiceAccountSigningKey\",\"ListItemText\":\"Invoke-AzAksRotateManagedClusterServiceAccountSigningKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzAksRotateManagedClusterServiceAccountSigningKey \\r\\n\"},{\"CompletionText\":\"Invoke-AzAksRunCommand\",\"ListItemText\":\"Invoke-AzAksRunCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzAksRunCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceRebuild\",\"ListItemText\":\"Invoke-AzCloudServiceRebuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceRebuild \\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceReimage\",\"ListItemText\":\"Invoke-AzCloudServiceReimage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceReimage \\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceRoleInstanceRebuild\",\"ListItemText\":\"Invoke-AzCloudServiceRoleInstanceRebuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceRoleInstanceRebuild \\r\\n\"},{\"CompletionText\":\"Invoke-AzCloudServiceRoleInstanceReimage\",\"ListItemText\":\"Invoke-AzCloudServiceRoleInstanceReimage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzCloudServiceRoleInstanceReimage \\r\\n\"},{\"CompletionText\":\"Invoke-AzContainerInstanceCommand\",\"ListItemText\":\"Invoke-AzContainerInstanceCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzContainerInstanceCommand \\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBCassandraKeyspaceThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBCassandraKeyspaceThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBCassandraKeyspaceThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBCassandraTableThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBCassandraTableThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBCassandraTableThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBGremlinDatabaseThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBGremlinDatabaseThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBGremlinDatabaseThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBGremlinGraphThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBGremlinGraphThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBGremlinGraphThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBMongoDBCollectionThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBMongoDBCollectionThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBMongoDBCollectionThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBMongoDBDatabaseThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBMongoDBDatabaseThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBMongoDBDatabaseThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBSqlContainerThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBSqlContainerThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBSqlContainerThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBSqlDatabaseThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBSqlDatabaseThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBSqlDatabaseThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzCosmosDBTableThroughputMigration\",\"ListItemText\":\"Invoke-AzCosmosDBTableThroughputMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzCosmosDBTableThroughputMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataBoxEdgeDevice\",\"ListItemText\":\"Invoke-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataBoxEdgeShare\",\"ListItemText\":\"Invoke-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"Invoke-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2DataFlowDebugSessionCommand\",\"ListItemText\":\"Invoke-AzDataFactoryV2DataFlowDebugSessionCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2DataFlowDebugSessionCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2IntegrationRuntimeUpgrade\",\"ListItemText\":\"Invoke-AzDataFactoryV2IntegrationRuntimeUpgrade\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2IntegrationRuntimeUpgrade\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Invoke-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Invoke-AzDataFactoryV2TriggerRun\",\"ListItemText\":\"Invoke-AzDataFactoryV2TriggerRun\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzDataFactoryV2TriggerRun\\r\\n\"},{\"CompletionText\":\"Invoke-AzHDInsightHiveJob\",\"ListItemText\":\"Invoke-AzHDInsightHiveJob\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzHDInsightHiveJob\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubConfigMetric\",\"ListItemText\":\"Invoke-AzIotHubConfigMetric\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubConfigMetric\"},{\"CompletionText\":\"Invoke-AzIotHubConfigurationMetricsQuery\",\"ListItemText\":\"Invoke-AzIotHubConfigurationMetricsQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubConfigurationMetricsQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubDeploymentMetricsQuery\",\"ListItemText\":\"Invoke-AzIotHubDeploymentMetricsQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubDeploymentMetricsQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubDeployMetric\",\"ListItemText\":\"Invoke-AzIotHubDeployMetric\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubDeployMetric\"},{\"CompletionText\":\"Invoke-AzIotHubDeviceMethod\",\"ListItemText\":\"Invoke-AzIotHubDeviceMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubDeviceMethod\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubManualFailover\",\"ListItemText\":\"Invoke-AzIotHubManualFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubManualFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubModuleMethod\",\"ListItemText\":\"Invoke-AzIotHubModuleMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubModuleMethod\\r\\n\"},{\"CompletionText\":\"Invoke-AzIotHubQuery\",\"ListItemText\":\"Invoke-AzIotHubQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzIotHubQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzKeyVaultKeyOperation\",\"ListItemText\":\"Invoke-AzKeyVaultKeyOperation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzKeyVaultKeyOperation\\r\\n\"},{\"CompletionText\":\"Invoke-AzKeyVaultKeyRotation\",\"ListItemText\":\"Invoke-AzKeyVaultKeyRotation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzKeyVaultKeyRotation\\r\\n\"},{\"CompletionText\":\"Invoke-AzKustoDataConnectionValidation\",\"ListItemText\":\"Invoke-AzKustoDataConnectionValidation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzKustoDataConnectionValidation \\r\\n\"},{\"CompletionText\":\"Invoke-AzKustoDetachClusterFollowerDatabase\",\"ListItemText\":\"Invoke-AzKustoDetachClusterFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzKustoDetachClusterFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Invoke-AzKustoDiagnoseClusterVirtualNetwork\",\"ListItemText\":\"Invoke-AzKustoDiagnoseClusterVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzKustoDiagnoseClusterVirtualNetwork \\r\\n\"},{\"CompletionText\":\"Invoke-AzMarketplaceSignTerms\",\"ListItemText\":\"Invoke-AzMarketplaceSignTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzMarketplaceSignTerms \\r\\n\"},{\"CompletionText\":\"Invoke-AzMLWorkspaceDiagnose\",\"ListItemText\":\"Invoke-AzMLWorkspaceDiagnose\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzMLWorkspaceDiagnose \\r\\n\"},{\"CompletionText\":\"Invoke-AzMLWorkspaceNotebook\",\"ListItemText\":\"Invoke-AzMLWorkspaceNotebook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzMLWorkspaceNotebook \\r\\n\"},{\"CompletionText\":\"Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic\",\"ListItemText\":\"Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic\\r\\n\"},{\"CompletionText\":\"Invoke-AzOperationalInsightsMigrateTable\",\"ListItemText\":\"Invoke-AzOperationalInsightsMigrateTable\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzOperationalInsightsMigrateTable\\r\\n\"},{\"CompletionText\":\"Invoke-AzOperationalInsightsQuery\",\"ListItemText\":\"Invoke-AzOperationalInsightsQuery\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzOperationalInsightsQuery\\r\\n\"},{\"CompletionText\":\"Invoke-AzRedeploySqlVM\",\"ListItemText\":\"Invoke-AzRedeploySqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzRedeploySqlVM \\r\\n\"},{\"CompletionText\":\"Invoke-AzRedisEnterpriseCacheDatabaseFlush\",\"ListItemText\":\"Invoke-AzRedisEnterpriseCacheDatabaseFlush\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzRedisEnterpriseCacheDatabaseFlush \\r\\n\"},{\"CompletionText\":\"Invoke-AzRedisEnterpriseCacheForceDatabaseUnlink\",\"ListItemText\":\"Invoke-AzRedisEnterpriseCacheForceDatabaseUnlink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzRedisEnterpriseCacheForceDatabaseUnlink \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceAction\",\"ListItemText\":\"Invoke-AzResourceAction\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzResourceAction\\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverBulkRemove\",\"ListItemText\":\"Invoke-AzResourceMoverBulkRemove\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverBulkRemove \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverCommit\",\"ListItemText\":\"Invoke-AzResourceMoverCommit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverCommit \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverDiscard\",\"ListItemText\":\"Invoke-AzResourceMoverDiscard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverDiscard \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverInitiateMove\",\"ListItemText\":\"Invoke-AzResourceMoverInitiateMove\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverInitiateMove \\r\\n\"},{\"CompletionText\":\"Invoke-AzResourceMoverPrepare\",\"ListItemText\":\"Invoke-AzResourceMoverPrepare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzResourceMoverPrepare \\r\\n\"},{\"CompletionText\":\"Invoke-AzRest\",\"ListItemText\":\"Invoke-AzRest\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzRest\"},{\"CompletionText\":\"Invoke-AzRestMethod\",\"ListItemText\":\"Invoke-AzRestMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzRestMethod\\r\\n\"},{\"CompletionText\":\"Invoke-AzRmStorageContainerImmutableStorageWithVersioningMigration\",\"ListItemText\":\"Invoke-AzRmStorageContainerImmutableStorageWithVersioningMigration\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzRmStorageContainerImmutableStorageWithVersioningMigration\\r\\n\"},{\"CompletionText\":\"Invoke-AzSentinelThreatIntelligenceIndicatorQuery\",\"ListItemText\":\"Invoke-AzSentinelThreatIntelligenceIndicatorQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzSentinelThreatIntelligenceIndicatorQuery \\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlDatabaseFailover\",\"ListItemText\":\"Invoke-AzSqlDatabaseFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlDatabaseFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevalidation\",\"ListItemText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevalidation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevalidation\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevert\",\"ListItemText\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevert\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlDatabaseTransparentDataEncryptionProtectorRevert\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlElasticPoolFailover\",\"ListItemText\":\"Invoke-AzSqlElasticPoolFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlElasticPoolFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlInstanceFailover\",\"ListItemText\":\"Invoke-AzSqlInstanceFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlInstanceFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlInstanceTransparentDataEncryptionProtectorRevalidation\",\"ListItemText\":\"Invoke-AzSqlInstanceTransparentDataEncryptionProtectorRevalidation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlInstanceTransparentDataEncryptionProtectorRevalidation\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlServerExternalGovernanceStatusRefresh\",\"ListItemText\":\"Invoke-AzSqlServerExternalGovernanceStatusRefresh\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlServerExternalGovernanceStatusRefresh\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlServerTransparentDataEncryptionProtectorRevalidation\",\"ListItemText\":\"Invoke-AzSqlServerTransparentDataEncryptionProtectorRevalidation\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSqlServerTransparentDataEncryptionProtectorRevalidation\\r\\n\"},{\"CompletionText\":\"Invoke-AzSqlVMTroubleshoot\",\"ListItemText\":\"Invoke-AzSqlVMTroubleshoot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzSqlVMTroubleshoot \\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageAccountFailover\",\"ListItemText\":\"Invoke-AzStorageAccountFailover\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageAccountFailover\\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ListItemText\":\"Invoke-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageAccountHierarchicalNamespaceUpgrade\\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageSyncChangeDetection\",\"ListItemText\":\"Invoke-AzStorageSyncChangeDetection\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageSyncChangeDetection\\r\\n\"},{\"CompletionText\":\"Invoke-AzStorageSyncCompatibilityCheck\",\"ListItemText\":\"Invoke-AzStorageSyncCompatibilityCheck\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzStorageSyncCompatibilityCheck\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseDataFlowDebugSessionCommand\",\"ListItemText\":\"Invoke-AzSynapseDataFlowDebugSessionCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseDataFlowDebugSessionCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseDetachKustoPoolFollowerDatabase\",\"ListItemText\":\"Invoke-AzSynapseDetachKustoPoolFollowerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-AzSynapseDetachKustoPoolFollowerDatabase \\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseIntegrationRuntimeUpgrade\",\"ListItemText\":\"Invoke-AzSynapseIntegrationRuntimeUpgrade\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseIntegrationRuntimeUpgrade\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapsePipeline\",\"ListItemText\":\"Invoke-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseSparkStatement\",\"ListItemText\":\"Invoke-AzSynapseSparkStatement\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseSparkStatement\\r\\n\"},{\"CompletionText\":\"Invoke-AzSynapseTriggerRun\",\"ListItemText\":\"Invoke-AzSynapseTriggerRun\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzSynapseTriggerRun\\r\\n\"},{\"CompletionText\":\"Invoke-AzVmAssessPatch\",\"ListItemText\":\"Invoke-AzVmAssessPatch\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmAssessPatch\"},{\"CompletionText\":\"Invoke-AzVmInstallPatch\",\"ListItemText\":\"Invoke-AzVmInstallPatch\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmInstallPatch\\r\\n\"},{\"CompletionText\":\"Invoke-AzVmPatchAssess\",\"ListItemText\":\"Invoke-AzVmPatchAssess\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmPatchAssess\"},{\"CompletionText\":\"Invoke-AzVmPatchAssessment\",\"ListItemText\":\"Invoke-AzVmPatchAssessment\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmPatchAssessment\\r\\n\"},{\"CompletionText\":\"Invoke-AzVMReimage\",\"ListItemText\":\"Invoke-AzVMReimage\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVMReimage\\r\\n\"},{\"CompletionText\":\"Invoke-AzVMRunCommand\",\"ListItemText\":\"Invoke-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVMRunCommand\\r\\n\"},{\"CompletionText\":\"Invoke-AzVmssVMRunCommand\",\"ListItemText\":\"Invoke-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"Invoke-AzVmssVMRunCommand\\r\\n\"},{\"CompletionText\":\"Invoke-CimMethod\",\"ListItemText\":\"Invoke-CimMethod\",\"ResultType\":2,\"ToolTip\":\"Invoke-CimMethod\\r\\n\"},{\"CompletionText\":\"Invoke-Command\",\"ListItemText\":\"Invoke-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Command [-ScriptBlock] [-NoNewScope] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-Session] ] [-ScriptBlock] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-Session] ] [-FilePath] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-ComputerName] ] [-ScriptBlock] [-Credential ] [-Port ] [-UseSSL] [-ConfigurationName ] [-ApplicationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-SessionName ] [-HideComputerName] [-JobName ] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] [-CertificateThumbprint ] []\\r\\n\\r\\nInvoke-Command [[-ComputerName] ] [-FilePath] [-Credential ] [-Port ] [-UseSSL] [-ConfigurationName ] [-ApplicationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-SessionName ] [-HideComputerName] [-JobName ] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [[-ConnectionUri] ] [-ScriptBlock] [-Credential ] [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-HideComputerName] [-JobName ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] [-CertificateThumbprint ] []\\r\\n\\r\\nInvoke-Command [[-ConnectionUri] ] [-FilePath] [-Credential ] [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-HideComputerName] [-JobName ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-EnableNetworkAccess] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-VMId] [-ScriptBlock] -Credential [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -Credential -VMName [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-VMId] [-FilePath] -Credential [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-FilePath] -Credential -VMName [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -HostName [-Port ] [-AsJob] [-HideComputerName] [-JobName ] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] [-Options ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -ContainerId [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RunAsAdministrator] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-FilePath] -ContainerId [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RunAsAdministrator] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command [-ScriptBlock] -SSHConnection [-AsJob] [-HideComputerName] [-JobName ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command -FilePath -HostName [-AsJob] [-HideComputerName] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] [-Options ] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nInvoke-Command -FilePath -SSHConnection [-AsJob] [-HideComputerName] [-RemoteDebug] [-InputObject ] [-ArgumentList ] []\\r\\n\"},{\"CompletionText\":\"Invoke-CommandInDesktopPackage\",\"ListItemText\":\"Invoke-CommandInDesktopPackage\",\"ResultType\":2,\"ToolTip\":\"Invoke-CommandInDesktopPackage\\r\\n\"},{\"CompletionText\":\"Invoke-DscResource\",\"ListItemText\":\"Invoke-DscResource\",\"ResultType\":2,\"ToolTip\":\"Invoke-DscResource\\r\\n\"},{\"CompletionText\":\"Invoke-Expression\",\"ListItemText\":\"Invoke-Expression\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Expression [-Command] []\\r\\n\"},{\"CompletionText\":\"Invoke-History\",\"ListItemText\":\"Invoke-History\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-History [[-Id] ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Invoke-HnsRequest\",\"ListItemText\":\"Invoke-HnsRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-HnsRequest \\r\\n\"},{\"CompletionText\":\"Invoke-Item\",\"ListItemText\":\"Invoke-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Item [-Path] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nInvoke-Item -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Invoke-LapsPolicyProcessing\",\"ListItemText\":\"Invoke-LapsPolicyProcessing\",\"ResultType\":2,\"ToolTip\":\"Invoke-LapsPolicyProcessing\\r\\n\"},{\"CompletionText\":\"Invoke-Mock\",\"ListItemText\":\"Invoke-Mock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Mock \\r\\n\"},{\"CompletionText\":\"Invoke-OperationValidation\",\"ListItemText\":\"Invoke-OperationValidation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-OperationValidation \\r\\n\"},{\"CompletionText\":\"Invoke-Pester\",\"ListItemText\":\"Invoke-Pester\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-Pester \\r\\n\"},{\"CompletionText\":\"Invoke-RestMethod\",\"ListItemText\":\"Invoke-RestMethod\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-RestMethod [-Uri] [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-RestMethod [-Uri] -NoProxy [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-RestMethod [-Uri] -CustomMethod [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-RestMethod [-Uri] -CustomMethod -NoProxy [-FollowRelLink] [-MaximumFollowRelLink ] [-ResponseHeadersVariable ] [-StatusCodeVariable ] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\"},{\"CompletionText\":\"Invoke-TroubleshootingPack\",\"ListItemText\":\"Invoke-TroubleshootingPack\",\"ResultType\":2,\"ToolTip\":\"Invoke-TroubleshootingPack\\r\\n\"},{\"CompletionText\":\"Invoke-WebRequest\",\"ListItemText\":\"Invoke-WebRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInvoke-WebRequest [-Uri] [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-WebRequest [-Uri] -NoProxy [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-Method ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-WebRequest [-Uri] -CustomMethod [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\\r\\nInvoke-WebRequest [-Uri] -CustomMethod -NoProxy [-UseBasicParsing] [-HttpVersion ] [-WebSession ] [-SessionVariable ] [-AllowUnencryptedAuthentication] [-Authentication ] [-Credential ] [-UseDefaultCredentials] [-CertificateThumbprint ] [-Certificate ] [-SkipCertificateCheck] [-SslProtocol ] [-Token ] [-UserAgent ] [-DisableKeepAlive] [-ConnectionTimeoutSeconds ] [-OperationTimeoutSeconds ] [-Headers ] [-SkipHeaderValidation] [-AllowInsecureRedirect] [-MaximumRedirection ] [-MaximumRetryCount ] [-PreserveAuthorizationOnRedirect] [-RetryIntervalSec ] [-PreserveHttpMethodOnRedirect] [-UnixSocket ] [-Body ] [-Form ] [-ContentType ] [-TransferEncoding ] [-InFile ] [-OutFile ] [-PassThru] [-Resume] [-SkipHttpErrorCheck] []\\r\\n\"},{\"CompletionText\":\"Invoke-WSManAction\",\"ListItemText\":\"Invoke-WSManAction\",\"ResultType\":2,\"ToolTip\":\"Invoke-WSManAction\\r\\n\"},{\"CompletionText\":\"iotstartup.exe\",\"ListItemText\":\"iotstartup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iotstartup.exe\"},{\"CompletionText\":\"ipal\",\"ListItemText\":\"ipal\",\"ResultType\":2,\"ToolTip\":\"Import-Alias\"},{\"CompletionText\":\"ipconfig.exe\",\"ListItemText\":\"ipconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ipconfig.exe\"},{\"CompletionText\":\"ipcsv\",\"ListItemText\":\"ipcsv\",\"ResultType\":2,\"ToolTip\":\"Import-Csv\"},{\"CompletionText\":\"ipmo\",\"ListItemText\":\"ipmo\",\"ResultType\":2,\"ToolTip\":\"Import-Module\"},{\"CompletionText\":\"irm\",\"ListItemText\":\"irm\",\"ResultType\":2,\"ToolTip\":\"Invoke-RestMethod\"},{\"CompletionText\":\"irprops.cpl\",\"ListItemText\":\"irprops.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\irprops.cpl\"},{\"CompletionText\":\"iru\",\"ListItemText\":\"iru\",\"ResultType\":2,\"ToolTip\":\"iru\"},{\"CompletionText\":\"iscsicli.exe\",\"ListItemText\":\"iscsicli.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iscsicli.exe\"},{\"CompletionText\":\"iscsicpl.exe\",\"ListItemText\":\"iscsicpl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\iscsicpl.exe\"},{\"CompletionText\":\"ISM.exe\",\"ListItemText\":\"ISM.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ISM.exe\"},{\"CompletionText\":\"isoburn.exe\",\"ListItemText\":\"isoburn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\isoburn.exe\"},{\"CompletionText\":\"isres\",\"ListItemText\":\"isres\",\"ResultType\":2,\"ToolTip\":\"isres\"},{\"CompletionText\":\"It\",\"ListItemText\":\"It\",\"ResultType\":2,\"ToolTip\":\"\\r\\nIt \\r\\n\"},{\"CompletionText\":\"iwr\",\"ListItemText\":\"iwr\",\"ResultType\":2,\"ToolTip\":\"Invoke-WebRequest\"},{\"CompletionText\":\"J:\",\"ListItemText\":\"J:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nJ: \\r\\n\"},{\"CompletionText\":\"jabswitch.exe\",\"ListItemText\":\"jabswitch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jabswitch.exe\"},{\"CompletionText\":\"jar.exe\",\"ListItemText\":\"jar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jar.exe\"},{\"CompletionText\":\"jarsigner.exe\",\"ListItemText\":\"jarsigner.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jarsigner.exe\"},{\"CompletionText\":\"java-rmi.exe\",\"ListItemText\":\"java-rmi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\java-rmi.exe\"},{\"CompletionText\":\"java.exe\",\"ListItemText\":\"java.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\java.exe\"},{\"CompletionText\":\"javac.exe\",\"ListItemText\":\"javac.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javac.exe\"},{\"CompletionText\":\"javadoc.exe\",\"ListItemText\":\"javadoc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javadoc.exe\"},{\"CompletionText\":\"javah.exe\",\"ListItemText\":\"javah.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javah.exe\"},{\"CompletionText\":\"javap.exe\",\"ListItemText\":\"javap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javap.exe\"},{\"CompletionText\":\"javaw.exe\",\"ListItemText\":\"javaw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\javaw.exe\"},{\"CompletionText\":\"jcmd.exe\",\"ListItemText\":\"jcmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jcmd.exe\"},{\"CompletionText\":\"jconsole.exe\",\"ListItemText\":\"jconsole.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jconsole.exe\"},{\"CompletionText\":\"jdb.exe\",\"ListItemText\":\"jdb.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jdb.exe\"},{\"CompletionText\":\"jdeps.exe\",\"ListItemText\":\"jdeps.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jdeps.exe\"},{\"CompletionText\":\"jfr.exe\",\"ListItemText\":\"jfr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jfr.exe\"},{\"CompletionText\":\"jhat.exe\",\"ListItemText\":\"jhat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jhat.exe\"},{\"CompletionText\":\"jinfo.exe\",\"ListItemText\":\"jinfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jinfo.exe\"},{\"CompletionText\":\"jjs.exe\",\"ListItemText\":\"jjs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jjs.exe\"},{\"CompletionText\":\"jmap.exe\",\"ListItemText\":\"jmap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jmap.exe\"},{\"CompletionText\":\"Join-AdlStoreItem\",\"ListItemText\":\"Join-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Join-AdlStoreItem\"},{\"CompletionText\":\"Join-AzDataLakeStoreItem\",\"ListItemText\":\"Join-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Join-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Join-DtcDiagnosticResourceManager\",\"ListItemText\":\"Join-DtcDiagnosticResourceManager\",\"ResultType\":2,\"ToolTip\":\"Join-DtcDiagnosticResourceManager\\r\\n\"},{\"CompletionText\":\"Join-Path\",\"ListItemText\":\"Join-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nJoin-Path [-Path] [-ChildPath] [[-AdditionalChildPath] ] [-Resolve] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Join-String\",\"ListItemText\":\"Join-String\",\"ResultType\":2,\"ToolTip\":\"\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-UseCulture] [-InputObject ] []\\r\\n\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-SingleQuote] [-UseCulture] [-InputObject ] []\\r\\n\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-DoubleQuote] [-UseCulture] [-InputObject ] []\\r\\n\\r\\nJoin-String [[-Property] ] [[-Separator] ] [-OutputPrefix ] [-OutputSuffix ] [-FormatString ] [-UseCulture] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"joy.cpl\",\"ListItemText\":\"joy.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\joy.cpl\"},{\"CompletionText\":\"jps.exe\",\"ListItemText\":\"jps.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jps.exe\"},{\"CompletionText\":\"jrunscript.exe\",\"ListItemText\":\"jrunscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jrunscript.exe\"},{\"CompletionText\":\"jsadebugd.exe\",\"ListItemText\":\"jsadebugd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jsadebugd.exe\"},{\"CompletionText\":\"jstack.exe\",\"ListItemText\":\"jstack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jstack.exe\"},{\"CompletionText\":\"jstat.exe\",\"ListItemText\":\"jstat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jstat.exe\"},{\"CompletionText\":\"jstatd.exe\",\"ListItemText\":\"jstatd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\jstatd.exe\"},{\"CompletionText\":\"K:\",\"ListItemText\":\"K:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nK: \\r\\n\"},{\"CompletionText\":\"keyboxd.exe\",\"ListItemText\":\"keyboxd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\keyboxd.exe\"},{\"CompletionText\":\"keytool.exe\",\"ListItemText\":\"keytool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\keytool.exe\"},{\"CompletionText\":\"kill\",\"ListItemText\":\"kill\",\"ResultType\":2,\"ToolTip\":\"Stop-Process\"},{\"CompletionText\":\"kinit.exe\",\"ListItemText\":\"kinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\kinit.exe\"},{\"CompletionText\":\"klist.exe\",\"ListItemText\":\"klist.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\klist.exe\"},{\"CompletionText\":\"ksetup.exe\",\"ListItemText\":\"ksetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ksetup.exe\"},{\"CompletionText\":\"ktab.exe\",\"ListItemText\":\"ktab.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\ktab.exe\"},{\"CompletionText\":\"ktmutil.exe\",\"ListItemText\":\"ktmutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ktmutil.exe\"},{\"CompletionText\":\"kubectl.exe\",\"ListItemText\":\"kubectl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\kubectl.exe\"},{\"CompletionText\":\"L:\",\"ListItemText\":\"L:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nL: \\r\\n\"},{\"CompletionText\":\"la57setup.exe\",\"ListItemText\":\"la57setup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\la57setup.exe\"},{\"CompletionText\":\"label.exe\",\"ListItemText\":\"label.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\label.exe\"},{\"CompletionText\":\"LanguageComponentsInstallerComHandler.exe\",\"ListItemText\":\"LanguageComponentsInstallerComHandler.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LanguageComponentsInstallerComHandler.exe\"},{\"CompletionText\":\"LaunchTM.exe\",\"ListItemText\":\"LaunchTM.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LaunchTM.exe\"},{\"CompletionText\":\"LaunchWinApp.exe\",\"ListItemText\":\"LaunchWinApp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LaunchWinApp.exe\"},{\"CompletionText\":\"LegacyNetUXHost.exe\",\"ListItemText\":\"LegacyNetUXHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LegacyNetUXHost.exe\"},{\"CompletionText\":\"less.exe\",\"ListItemText\":\"less.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\less.exe\"},{\"CompletionText\":\"LicenseManagerShellext.exe\",\"ListItemText\":\"LicenseManagerShellext.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LicenseManagerShellext.exe\"},{\"CompletionText\":\"licensingdiag.exe\",\"ListItemText\":\"licensingdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\licensingdiag.exe\"},{\"CompletionText\":\"LicensingUI.exe\",\"ListItemText\":\"LicensingUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LicensingUI.exe\"},{\"CompletionText\":\"List-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ListItemText\":\"List-AzApplicationGatewayAvailableServerVariableAndHeader\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewayAvailableServerVariableAndHeader\"},{\"CompletionText\":\"List-AzApplicationGatewayAvailableSslOptions\",\"ListItemText\":\"List-AzApplicationGatewayAvailableSslOptions\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewayAvailableSslOptions\"},{\"CompletionText\":\"List-AzApplicationGatewayAvailableWafRuleSets\",\"ListItemText\":\"List-AzApplicationGatewayAvailableWafRuleSets\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewayAvailableWafRuleSets\"},{\"CompletionText\":\"List-AzApplicationGatewaySslPredefinedPolicy\",\"ListItemText\":\"List-AzApplicationGatewaySslPredefinedPolicy\",\"ResultType\":2,\"ToolTip\":\"List-AzApplicationGatewaySslPredefinedPolicy\"},{\"CompletionText\":\"LiveCaptions.exe\",\"ListItemText\":\"LiveCaptions.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LiveCaptions.exe\"},{\"CompletionText\":\"LocationNotificationWindows.exe\",\"ListItemText\":\"LocationNotificationWindows.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LocationNotificationWindows.exe\"},{\"CompletionText\":\"Locator.exe\",\"ListItemText\":\"Locator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Locator.exe\"},{\"CompletionText\":\"Lock-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Lock-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Lock-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Lock-BitLocker\",\"ListItemText\":\"Lock-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nLock-BitLocker \\r\\n\"},{\"CompletionText\":\"LockAppHost.exe\",\"ListItemText\":\"LockAppHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LockAppHost.exe\"},{\"CompletionText\":\"LockScreenContentServer.exe\",\"ListItemText\":\"LockScreenContentServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LockScreenContentServer.exe\"},{\"CompletionText\":\"lodctr.exe\",\"ListItemText\":\"lodctr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lodctr.exe\"},{\"CompletionText\":\"logagent.exe\",\"ListItemText\":\"logagent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\logagent.exe\"},{\"CompletionText\":\"Login-AzAccount\",\"ListItemText\":\"Login-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Login-AzAccount\"},{\"CompletionText\":\"Login-AzAsAccount\",\"ListItemText\":\"Login-AzAsAccount\",\"ResultType\":2,\"ToolTip\":\"Login-AzAsAccount\"},{\"CompletionText\":\"Login-AzureAsAccount\",\"ListItemText\":\"Login-AzureAsAccount\",\"ResultType\":2,\"ToolTip\":\"Login-AzureAsAccount\"},{\"CompletionText\":\"logman.exe\",\"ListItemText\":\"logman.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\logman.exe\"},{\"CompletionText\":\"logoff.exe\",\"ListItemText\":\"logoff.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\logoff.exe\"},{\"CompletionText\":\"LogonUI.exe\",\"ListItemText\":\"LogonUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LogonUI.exe\"},{\"CompletionText\":\"Logout-AzAccount\",\"ListItemText\":\"Logout-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Logout-AzAccount\"},{\"CompletionText\":\"lpkinstall.exe\",\"ListItemText\":\"lpkinstall.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lpkinstall.exe\"},{\"CompletionText\":\"lpksetup.exe\",\"ListItemText\":\"lpksetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lpksetup.exe\"},{\"CompletionText\":\"lpremove.exe\",\"ListItemText\":\"lpremove.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lpremove.exe\"},{\"CompletionText\":\"ls\",\"ListItemText\":\"ls\",\"ResultType\":2,\"ToolTip\":\"Get-ChildItem\"},{\"CompletionText\":\"LsaIso.exe\",\"ListItemText\":\"LsaIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\LsaIso.exe\"},{\"CompletionText\":\"lsass.exe\",\"ListItemText\":\"lsass.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lsass.exe\"},{\"CompletionText\":\"lusrmgr.msc\",\"ListItemText\":\"lusrmgr.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\lusrmgr.msc\"},{\"CompletionText\":\"M:\",\"ListItemText\":\"M:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nM: \\r\\n\"},{\"CompletionText\":\"Magnify.exe\",\"ListItemText\":\"Magnify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Magnify.exe\"},{\"CompletionText\":\"main.cpl\",\"ListItemText\":\"main.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\main.cpl\"},{\"CompletionText\":\"makecab.exe\",\"ListItemText\":\"makecab.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\makecab.exe\"},{\"CompletionText\":\"man\",\"ListItemText\":\"man\",\"ResultType\":2,\"ToolTip\":\"help\"},{\"CompletionText\":\"manage-bde.exe\",\"ListItemText\":\"manage-bde.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\manage-bde.exe\"},{\"CompletionText\":\"manage-bde.wsf\",\"ListItemText\":\"manage-bde.wsf\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\manage-bde.wsf\"},{\"CompletionText\":\"markdown-it.exe\",\"ListItemText\":\"markdown-it.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\markdown-it.exe\"},{\"CompletionText\":\"mavinject.exe\",\"ListItemText\":\"mavinject.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mavinject.exe\"},{\"CompletionText\":\"mblctr.exe\",\"ListItemText\":\"mblctr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mblctr.exe\"},{\"CompletionText\":\"MBR2GPT.EXE\",\"ListItemText\":\"MBR2GPT.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MBR2GPT.EXE\"},{\"CompletionText\":\"mcbuilder.exe\",\"ListItemText\":\"mcbuilder.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mcbuilder.exe\"},{\"CompletionText\":\"MCU.exe\",\"ListItemText\":\"MCU.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MCU.exe\"},{\"CompletionText\":\"md\",\"ListItemText\":\"md\",\"ResultType\":2,\"ToolTip\":\"mkdir\"},{\"CompletionText\":\"MDEServer.exe\",\"ListItemText\":\"MDEServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MDEServer.exe\"},{\"CompletionText\":\"MDMAgent.exe\",\"ListItemText\":\"MDMAgent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MDMAgent.exe\"},{\"CompletionText\":\"MDMAppInstaller.exe\",\"ListItemText\":\"MDMAppInstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MDMAppInstaller.exe\"},{\"CompletionText\":\"MdmDiagnosticsTool.exe\",\"ListItemText\":\"MdmDiagnosticsTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MdmDiagnosticsTool.exe\"},{\"CompletionText\":\"MdRes.exe\",\"ListItemText\":\"MdRes.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MdRes.exe\"},{\"CompletionText\":\"MdSched.exe\",\"ListItemText\":\"MdSched.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MdSched.exe\"},{\"CompletionText\":\"measure\",\"ListItemText\":\"measure\",\"ResultType\":2,\"ToolTip\":\"Measure-Object\"},{\"CompletionText\":\"Measure-Command\",\"ListItemText\":\"Measure-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMeasure-Command [-Expression] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Measure-Object\",\"ListItemText\":\"Measure-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMeasure-Object [[-Property] ] [-InputObject ] [-StandardDeviation] [-Sum] [-AllStats] [-Average] [-Maximum] [-Minimum] []\\r\\n\\r\\nMeasure-Object [[-Property] ] [-InputObject ] [-Line] [-Word] [-Character] [-IgnoreWhiteSpace] []\\r\\n\"},{\"CompletionText\":\"Measure-VM\",\"ListItemText\":\"Measure-VM\",\"ResultType\":2,\"ToolTip\":\"Measure-VM\\r\\n\"},{\"CompletionText\":\"Measure-VMReplication\",\"ListItemText\":\"Measure-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Measure-VMReplication\\r\\n\"},{\"CompletionText\":\"Measure-VMResourcePool\",\"ListItemText\":\"Measure-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Measure-VMResourcePool\\r\\n\"},{\"CompletionText\":\"MediaPlayer.exe\",\"ListItemText\":\"MediaPlayer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\MediaPlayer.exe\"},{\"CompletionText\":\"Merge-CIPolicy\",\"ListItemText\":\"Merge-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"Merge-CIPolicy\\r\\n\"},{\"CompletionText\":\"Merge-VHD\",\"ListItemText\":\"Merge-VHD\",\"ResultType\":2,\"ToolTip\":\"Merge-VHD\\r\\n\"},{\"CompletionText\":\"mfpmp.exe\",\"ListItemText\":\"mfpmp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mfpmp.exe\"},{\"CompletionText\":\"mi\",\"ListItemText\":\"mi\",\"ResultType\":2,\"ToolTip\":\"Move-Item\"},{\"CompletionText\":\"Microsoft.AzureVpn.exe\",\"ListItemText\":\"Microsoft.AzureVpn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\Microsoft.AzureVpn.exe\"},{\"CompletionText\":\"Microsoft.Uev.CscUnpinTool.exe\",\"ListItemText\":\"Microsoft.Uev.CscUnpinTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Microsoft.Uev.CscUnpinTool.exe\"},{\"CompletionText\":\"Microsoft.Uev.SyncController.exe\",\"ListItemText\":\"Microsoft.Uev.SyncController.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Microsoft.Uev.SyncController.exe\"},{\"CompletionText\":\"microsoft.windows.softwarelogo.showdesktop.exe\",\"ListItemText\":\"microsoft.windows.softwarelogo.showdesktop.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\microsoft.windows.softwarelogo.showdesktop.exe\"},{\"CompletionText\":\"MicrosoftEdgeBCHost.exe\",\"ListItemText\":\"MicrosoftEdgeBCHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeBCHost.exe\"},{\"CompletionText\":\"MicrosoftEdgeCP.exe\",\"ListItemText\":\"MicrosoftEdgeCP.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeCP.exe\"},{\"CompletionText\":\"MicrosoftEdgeDevTools.exe\",\"ListItemText\":\"MicrosoftEdgeDevTools.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeDevTools.exe\"},{\"CompletionText\":\"MicrosoftEdgeSH.exe\",\"ListItemText\":\"MicrosoftEdgeSH.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MicrosoftEdgeSH.exe\"},{\"CompletionText\":\"MicrosoftWindows.DesktopStickerEditorCentennial.exe\",\"ListItemText\":\"MicrosoftWindows.DesktopStickerEditorCentennial.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\MicrosoftWindows.DesktopStickerEditorCentennial.exe\"},{\"CompletionText\":\"mkdir\",\"ListItemText\":\"mkdir\",\"ResultType\":2,\"ToolTip\":\"\\r\\nmkdir [-Path] [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nmkdir [[-Path] ] -Name [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"mmc.exe\",\"ListItemText\":\"mmc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mmc.exe\"},{\"CompletionText\":\"mmgaserver.exe\",\"ListItemText\":\"mmgaserver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mmgaserver.exe\"},{\"CompletionText\":\"mmsys.cpl\",\"ListItemText\":\"mmsys.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mmsys.cpl\"},{\"CompletionText\":\"mobsync.exe\",\"ListItemText\":\"mobsync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mobsync.exe\"},{\"CompletionText\":\"Mock\",\"ListItemText\":\"Mock\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMock \\r\\n\"},{\"CompletionText\":\"mode.com\",\"ListItemText\":\"mode.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mode.com\"},{\"CompletionText\":\"mofcomp.exe\",\"ListItemText\":\"mofcomp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\mofcomp.exe\"},{\"CompletionText\":\"MoNotificationUxStub.exe\",\"ListItemText\":\"MoNotificationUxStub.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MoNotificationUxStub.exe\"},{\"CompletionText\":\"more.com\",\"ListItemText\":\"more.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\more.com\"},{\"CompletionText\":\"mount\",\"ListItemText\":\"mount\",\"ResultType\":2,\"ToolTip\":\"New-PSDrive\"},{\"CompletionText\":\"Mount-AppPackageVolume\",\"ListItemText\":\"Mount-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Mount-AppPackageVolume\"},{\"CompletionText\":\"Mount-AppxVolume\",\"ListItemText\":\"Mount-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Mount-AppxVolume\\r\\n\"},{\"CompletionText\":\"Mount-DiskImage\",\"ListItemText\":\"Mount-DiskImage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMount-DiskImage \\r\\n\"},{\"CompletionText\":\"mount-sqlite\",\"ListItemText\":\"mount-sqlite\",\"ResultType\":2,\"ToolTip\":\"\\r\\nmount-sqlite \\r\\n\"},{\"CompletionText\":\"Mount-VHD\",\"ListItemText\":\"Mount-VHD\",\"ResultType\":2,\"ToolTip\":\"Mount-VHD\\r\\n\"},{\"CompletionText\":\"Mount-VMHostAssignableDevice\",\"ListItemText\":\"Mount-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Mount-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Mount-WindowsImage\",\"ListItemText\":\"Mount-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Mount-WindowsImage\\r\\n\"},{\"CompletionText\":\"mountvol.exe\",\"ListItemText\":\"mountvol.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mountvol.exe\"},{\"CompletionText\":\"move\",\"ListItemText\":\"move\",\"ResultType\":2,\"ToolTip\":\"Move-Item\"},{\"CompletionText\":\"Move-AdlStoreItem\",\"ListItemText\":\"Move-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Move-AdlStoreItem\"},{\"CompletionText\":\"Move-AppPackage\",\"ListItemText\":\"Move-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Move-AppPackage\"},{\"CompletionText\":\"Move-AppxPackage\",\"ListItemText\":\"Move-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Move-AppxPackage\\r\\n\"},{\"CompletionText\":\"Move-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"Move-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"Move-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"Move-AzDataLakeGen2Item\",\"ListItemText\":\"Move-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Move-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Move-AzDataLakeStoreItem\",\"ListItemText\":\"Move-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Move-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Move-AzExpressRouteCircuit\",\"ListItemText\":\"Move-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Move-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Move-AzMlCommitmentAssociation\",\"ListItemText\":\"Move-AzMlCommitmentAssociation\",\"ResultType\":2,\"ToolTip\":\"Move-AzMlCommitmentAssociation\\r\\n\"},{\"CompletionText\":\"Move-AzRecoveryServicesBackupRecoveryPoint\",\"ListItemText\":\"Move-AzRecoveryServicesBackupRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Move-AzRecoveryServicesBackupRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Move-AzResource\",\"ListItemText\":\"Move-AzResource\",\"ResultType\":2,\"ToolTip\":\"Move-AzResource\\r\\n\"},{\"CompletionText\":\"Move-Item\",\"ListItemText\":\"Move-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMove-Item [-Path] [[-Destination] ] [-Force] [-Filter ] [-Include ] [-Exclude ] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nMove-Item [[-Destination] ] -LiteralPath [-Force] [-Filter ] [-Include ] [-Exclude ] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Move-ItemProperty\",\"ListItemText\":\"Move-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMove-ItemProperty [-Path] [-Destination] [-Name] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nMove-ItemProperty [-Destination] [-Name] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Move-SmbClient\",\"ListItemText\":\"Move-SmbClient\",\"ResultType\":2,\"ToolTip\":\"Move-SmbClient\"},{\"CompletionText\":\"Move-SmbWitnessClient\",\"ListItemText\":\"Move-SmbWitnessClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nMove-SmbWitnessClient \\r\\n\"},{\"CompletionText\":\"Move-VM\",\"ListItemText\":\"Move-VM\",\"ResultType\":2,\"ToolTip\":\"Move-VM\\r\\n\"},{\"CompletionText\":\"Move-VMStorage\",\"ListItemText\":\"Move-VMStorage\",\"ResultType\":2,\"ToolTip\":\"Move-VMStorage\\r\\n\"},{\"CompletionText\":\"mp\",\"ListItemText\":\"mp\",\"ResultType\":2,\"ToolTip\":\"Move-ItemProperty\"},{\"CompletionText\":\"mpnotify.exe\",\"ListItemText\":\"mpnotify.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mpnotify.exe\"},{\"CompletionText\":\"MpSigStub.exe\",\"ListItemText\":\"MpSigStub.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MpSigStub.exe\"},{\"CompletionText\":\"MRINFO.EXE\",\"ListItemText\":\"MRINFO.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MRINFO.EXE\"},{\"CompletionText\":\"MRT.exe\",\"ListItemText\":\"MRT.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MRT.exe\"},{\"CompletionText\":\"ms-teams.exe\",\"ListItemText\":\"ms-teams.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ms-teams.exe\"},{\"CompletionText\":\"ms-teamsupdate.exe\",\"ListItemText\":\"ms-teamsupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ms-teamsupdate.exe\"},{\"CompletionText\":\"ms-teams_autostarter.exe\",\"ListItemText\":\"ms-teams_autostarter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ms-teams_autostarter.exe\"},{\"CompletionText\":\"MSBuild.exe\",\"ListItemText\":\"MSBuild.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2017\\\\BuildTools\\\\MSBuild\\\\15.0\\\\Bin\\\\MSBuild.exe\"},{\"CompletionText\":\"MSBuildTaskHost.exe\",\"ListItemText\":\"MSBuildTaskHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2017\\\\BuildTools\\\\MSBuild\\\\15.0\\\\Bin\\\\MSBuildTaskHost.exe\"},{\"CompletionText\":\"MSchedExe.exe\",\"ListItemText\":\"MSchedExe.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MSchedExe.exe\"},{\"CompletionText\":\"msconfig.exe\",\"ListItemText\":\"msconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msconfig.exe\"},{\"CompletionText\":\"msdt.exe\",\"ListItemText\":\"msdt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msdt.exe\"},{\"CompletionText\":\"msdtc.exe\",\"ListItemText\":\"msdtc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msdtc.exe\"},{\"CompletionText\":\"msfeedssync.exe\",\"ListItemText\":\"msfeedssync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msfeedssync.exe\"},{\"CompletionText\":\"msg.exe\",\"ListItemText\":\"msg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msg.exe\"},{\"CompletionText\":\"mshta.exe\",\"ListItemText\":\"mshta.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mshta.exe\"},{\"CompletionText\":\"msiexec.exe\",\"ListItemText\":\"msiexec.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msiexec.exe\"},{\"CompletionText\":\"msinfo32.exe\",\"ListItemText\":\"msinfo32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msinfo32.exe\"},{\"CompletionText\":\"msmbw\",\"ListItemText\":\"msmbw\",\"ResultType\":2,\"ToolTip\":\"msmbw\"},{\"CompletionText\":\"mspaint.exe\",\"ListItemText\":\"mspaint.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\mspaint.exe\"},{\"CompletionText\":\"msra.exe\",\"ListItemText\":\"msra.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\msra.exe\"},{\"CompletionText\":\"msrdc.exe\",\"ListItemText\":\"msrdc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msrdc.exe\"},{\"CompletionText\":\"MsSpellCheckingHost.exe\",\"ListItemText\":\"MsSpellCheckingHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MsSpellCheckingHost.exe\"},{\"CompletionText\":\"msteams.exe\",\"ListItemText\":\"msteams.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msteams.exe\"},{\"CompletionText\":\"msteamsupdate.exe\",\"ListItemText\":\"msteamsupdate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msteamsupdate.exe\"},{\"CompletionText\":\"msteams_autostarter.exe\",\"ListItemText\":\"msteams_autostarter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\msteams_autostarter.exe\"},{\"CompletionText\":\"mstsc.exe\",\"ListItemText\":\"mstsc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mstsc.exe\"},{\"CompletionText\":\"mtstocom.exe\",\"ListItemText\":\"mtstocom.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\mtstocom.exe\"},{\"CompletionText\":\"MuiUnattend.exe\",\"ListItemText\":\"MuiUnattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MuiUnattend.exe\"},{\"CompletionText\":\"MultiDigiMon.exe\",\"ListItemText\":\"MultiDigiMon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\MultiDigiMon.exe\"},{\"CompletionText\":\"mv\",\"ListItemText\":\"mv\",\"ResultType\":2,\"ToolTip\":\"Move-Item\"},{\"CompletionText\":\"mvmr\",\"ListItemText\":\"mvmr\",\"ResultType\":2,\"ToolTip\":\"mvmr\"},{\"CompletionText\":\"N:\",\"ListItemText\":\"N:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nN: \\r\\n\"},{\"CompletionText\":\"nal\",\"ListItemText\":\"nal\",\"ResultType\":2,\"ToolTip\":\"New-Alias\"},{\"CompletionText\":\"Narrator.exe\",\"ListItemText\":\"Narrator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Narrator.exe\"},{\"CompletionText\":\"native2ascii.exe\",\"ListItemText\":\"native2ascii.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\native2ascii.exe\"},{\"CompletionText\":\"nbtstat.exe\",\"ListItemText\":\"nbtstat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nbtstat.exe\"},{\"CompletionText\":\"ncim\",\"ListItemText\":\"ncim\",\"ResultType\":2,\"ToolTip\":\"ncim\"},{\"CompletionText\":\"ncms\",\"ListItemText\":\"ncms\",\"ResultType\":2,\"ToolTip\":\"ncms\"},{\"CompletionText\":\"ncpa.cpl\",\"ListItemText\":\"ncpa.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ncpa.cpl\"},{\"CompletionText\":\"ncso\",\"ListItemText\":\"ncso\",\"ResultType\":2,\"ToolTip\":\"ncso\"},{\"CompletionText\":\"ndadmin.exe\",\"ListItemText\":\"ndadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ndadmin.exe\"},{\"CompletionText\":\"NDKPerfCmd.exe\",\"ListItemText\":\"NDKPerfCmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NDKPerfCmd.exe\"},{\"CompletionText\":\"NDKPing.exe\",\"ListItemText\":\"NDKPing.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NDKPing.exe\"},{\"CompletionText\":\"ndr\",\"ListItemText\":\"ndr\",\"ResultType\":2,\"ToolTip\":\"New-PSDrive\"},{\"CompletionText\":\"net.exe\",\"ListItemText\":\"net.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\net.exe\"},{\"CompletionText\":\"net1.exe\",\"ListItemText\":\"net1.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\net1.exe\"},{\"CompletionText\":\"netbtugc.exe\",\"ListItemText\":\"netbtugc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netbtugc.exe\"},{\"CompletionText\":\"netcfg.exe\",\"ListItemText\":\"netcfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netcfg.exe\"},{\"CompletionText\":\"NetCfgNotifyObjectHost.exe\",\"ListItemText\":\"NetCfgNotifyObjectHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NetCfgNotifyObjectHost.exe\"},{\"CompletionText\":\"NetEvtFwdr.exe\",\"ListItemText\":\"NetEvtFwdr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NetEvtFwdr.exe\"},{\"CompletionText\":\"NetHost.exe\",\"ListItemText\":\"NetHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NetHost.exe\"},{\"CompletionText\":\"netiougc.exe\",\"ListItemText\":\"netiougc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netiougc.exe\"},{\"CompletionText\":\"Netplwiz.exe\",\"ListItemText\":\"Netplwiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Netplwiz.exe\"},{\"CompletionText\":\"netsh.exe\",\"ListItemText\":\"netsh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\netsh.exe\"},{\"CompletionText\":\"NETSTAT.EXE\",\"ListItemText\":\"NETSTAT.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NETSTAT.EXE\"},{\"CompletionText\":\"New-AdlAnalyticsAccount\",\"ListItemText\":\"New-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"New-AdlAnalyticsAccount\"},{\"CompletionText\":\"New-AdlAnalyticsComputePolicy\",\"ListItemText\":\"New-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"New-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"New-AdlCatalogCredential\",\"ListItemText\":\"New-AdlCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"New-AdlCatalogCredential\"},{\"CompletionText\":\"New-AdlCatalogSecret\",\"ListItemText\":\"New-AdlCatalogSecret\",\"ResultType\":2,\"ToolTip\":\"New-AdlCatalogSecret\"},{\"CompletionText\":\"New-AdlStore\",\"ListItemText\":\"New-AdlStore\",\"ResultType\":2,\"ToolTip\":\"New-AdlStore\"},{\"CompletionText\":\"New-AdlStoreItem\",\"ListItemText\":\"New-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"New-AdlStoreItem\"},{\"CompletionText\":\"New-Alias\",\"ListItemText\":\"New-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Alias [-Name] [-Value] [-Description ] [-Option ] [-PassThru] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-AppLockerPolicy\",\"ListItemText\":\"New-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"New-ASRFabric\",\"ListItemText\":\"New-ASRFabric\",\"ResultType\":2,\"ToolTip\":\"New-ASRFabric\"},{\"CompletionText\":\"New-AsrInMageAzureV2DiskInput\",\"ListItemText\":\"New-AsrInMageAzureV2DiskInput\",\"ResultType\":2,\"ToolTip\":\"New-AsrInMageAzureV2DiskInput\"},{\"CompletionText\":\"New-ASRInMageRcmDiskInput\",\"ListItemText\":\"New-ASRInMageRcmDiskInput\",\"ResultType\":2,\"ToolTip\":\"New-ASRInMageRcmDiskInput\"},{\"CompletionText\":\"New-ASRNetworkMapping\",\"ListItemText\":\"New-ASRNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"New-ASRNetworkMapping\"},{\"CompletionText\":\"New-ASRPolicy\",\"ListItemText\":\"New-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"New-ASRPolicy\"},{\"CompletionText\":\"New-ASRProtectableItem\",\"ListItemText\":\"New-ASRProtectableItem\",\"ResultType\":2,\"ToolTip\":\"New-ASRProtectableItem\"},{\"CompletionText\":\"New-ASRProtectionContainerMapping\",\"ListItemText\":\"New-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"New-ASRProtectionContainerMapping\"},{\"CompletionText\":\"New-ASRRecoveryPlan\",\"ListItemText\":\"New-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"New-ASRRecoveryPlan\"},{\"CompletionText\":\"New-ASRReplicationProtectedItem\",\"ListItemText\":\"New-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"New-ASRReplicationProtectedItem\"},{\"CompletionText\":\"New-ASRRP\",\"ListItemText\":\"New-ASRRP\",\"ResultType\":2,\"ToolTip\":\"New-ASRRP\"},{\"CompletionText\":\"New-ASRStorageClassificationMapping\",\"ListItemText\":\"New-ASRStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"New-ASRStorageClassificationMapping\"},{\"CompletionText\":\"New-ASRvCenter\",\"ListItemText\":\"New-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"New-ASRvCenter\"},{\"CompletionText\":\"New-ASRVMNicConfig\",\"ListItemText\":\"New-ASRVMNicConfig\",\"ResultType\":2,\"ToolTip\":\"New-ASRVMNicConfig\"},{\"CompletionText\":\"New-AutologgerConfig\",\"ListItemText\":\"New-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"New-AzActionGroupReceiver\",\"ListItemText\":\"New-AzActionGroupReceiver\",\"ResultType\":2,\"ToolTip\":\"New-AzActionGroupReceiver\\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlert\",\"ListItemText\":\"New-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlertActionGroupObject\",\"ListItemText\":\"New-AzActivityLogAlertActionGroupObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlertActionGroupObject \\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlertAlertRuleAnyOfOrLeafConditionObject\",\"ListItemText\":\"New-AzActivityLogAlertAlertRuleAnyOfOrLeafConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlertAlertRuleAnyOfOrLeafConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzActivityLogAlertAlertRuleLeafConditionObject\",\"ListItemText\":\"New-AzActivityLogAlertAlertRuleLeafConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzActivityLogAlertAlertRuleLeafConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzADAppCredential\",\"ListItemText\":\"New-AzADAppCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADAppCredential \\r\\n\"},{\"CompletionText\":\"New-AzADAppFederatedCredential\",\"ListItemText\":\"New-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"New-AzADApplication\",\"ListItemText\":\"New-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADApplication \\r\\n\"},{\"CompletionText\":\"New-AzADGroup\",\"ListItemText\":\"New-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADGroup \\r\\n\"},{\"CompletionText\":\"New-AzADServicePrincipal\",\"ListItemText\":\"New-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"New-AzADServicePrincipalCredential\",\"ListItemText\":\"New-AzADServicePrincipalCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzADServicePrincipalCredential\"},{\"CompletionText\":\"New-AzADSpCredential\",\"ListItemText\":\"New-AzADSpCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADSpCredential \\r\\n\"},{\"CompletionText\":\"New-AzADUser\",\"ListItemText\":\"New-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzADUser \\r\\n\"},{\"CompletionText\":\"New-AzAksCluster\",\"ListItemText\":\"New-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzAksCluster\\r\\n\"},{\"CompletionText\":\"New-AzAksMaintenanceConfiguration\",\"ListItemText\":\"New-AzAksMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksMaintenanceConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzAksNodePool\",\"ListItemText\":\"New-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"New-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"New-AzAksSnapshot\",\"ListItemText\":\"New-AzAksSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksSnapshot \\r\\n\"},{\"CompletionText\":\"New-AzAksTimeInWeekObject\",\"ListItemText\":\"New-AzAksTimeInWeekObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksTimeInWeekObject \\r\\n\"},{\"CompletionText\":\"New-AzAksTimeSpanObject\",\"ListItemText\":\"New-AzAksTimeSpanObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAksTimeSpanObject \\r\\n\"},{\"CompletionText\":\"New-AzAlertRuleEmail\",\"ListItemText\":\"New-AzAlertRuleEmail\",\"ResultType\":2,\"ToolTip\":\"New-AzAlertRuleEmail\\r\\n\"},{\"CompletionText\":\"New-AzAlertRuleWebhook\",\"ListItemText\":\"New-AzAlertRuleWebhook\",\"ResultType\":2,\"ToolTip\":\"New-AzAlertRuleWebhook\\r\\n\"},{\"CompletionText\":\"New-AzAlertsSuppressionRuleScope\",\"ListItemText\":\"New-AzAlertsSuppressionRuleScope\",\"ResultType\":2,\"ToolTip\":\"New-AzAlertsSuppressionRuleScope\\r\\n\"},{\"CompletionText\":\"New-AzAnalysisServicesFirewallConfig\",\"ListItemText\":\"New-AzAnalysisServicesFirewallConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzAnalysisServicesFirewallConfig\\r\\n\"},{\"CompletionText\":\"New-AzAnalysisServicesFirewallRule\",\"ListItemText\":\"New-AzAnalysisServicesFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzAnalysisServicesFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzAnalysisServicesServer\",\"ListItemText\":\"New-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"New-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"New-AzApiManagement\",\"ListItemText\":\"New-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagement\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApi\",\"ListItemText\":\"New-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiRelease\",\"ListItemText\":\"New-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiRevision\",\"ListItemText\":\"New-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiSchema\",\"ListItemText\":\"New-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementApiVersionSet\",\"ListItemText\":\"New-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementAuthorizationServer\",\"ListItemText\":\"New-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackend\",\"ListItemText\":\"New-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackendCredential\",\"ListItemText\":\"New-AzApiManagementBackendCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackendCredential\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackendProxy\",\"ListItemText\":\"New-AzApiManagementBackendProxy\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackendProxy\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementBackendServiceFabric\",\"ListItemText\":\"New-AzApiManagementBackendServiceFabric\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementBackendServiceFabric\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementCache\",\"ListItemText\":\"New-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementCertificate\",\"ListItemText\":\"New-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementContext\",\"ListItemText\":\"New-AzApiManagementContext\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementContext\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementCustomHostnameConfiguration\",\"ListItemText\":\"New-AzApiManagementCustomHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementCustomHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementDiagnostic\",\"ListItemText\":\"New-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementGateway\",\"ListItemText\":\"New-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementGatewayHostnameConfiguration\",\"ListItemText\":\"New-AzApiManagementGatewayHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementGatewayHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementGroup\",\"ListItemText\":\"New-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementHttpMessageDiagnostic\",\"ListItemText\":\"New-AzApiManagementHttpMessageDiagnostic\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementHttpMessageDiagnostic\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementIdentityProvider\",\"ListItemText\":\"New-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementKeyVaultObject\",\"ListItemText\":\"New-AzApiManagementKeyVaultObject\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementKeyVaultObject\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementLogger\",\"ListItemText\":\"New-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementNamedValue\",\"ListItemText\":\"New-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"New-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementOperation\",\"ListItemText\":\"New-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementPipelineDiagnosticSetting\",\"ListItemText\":\"New-AzApiManagementPipelineDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementPipelineDiagnosticSetting\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementProduct\",\"ListItemText\":\"New-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementRegion\",\"ListItemText\":\"New-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementResourceLocationObject\",\"ListItemText\":\"New-AzApiManagementResourceLocationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementResourceLocationObject\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSamplingSetting\",\"ListItemText\":\"New-AzApiManagementSamplingSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSamplingSetting\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSslSetting\",\"ListItemText\":\"New-AzApiManagementSslSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSslSetting\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSubscription\",\"ListItemText\":\"New-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementSystemCertificate\",\"ListItemText\":\"New-AzApiManagementSystemCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementSystemCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementUser\",\"ListItemText\":\"New-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementUserToken\",\"ListItemText\":\"New-AzApiManagementUserToken\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementUserToken\\r\\n\"},{\"CompletionText\":\"New-AzApiManagementVirtualNetwork\",\"ListItemText\":\"New-AzApiManagementVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"New-AzApiManagementVirtualNetwork\\r\\n\"},{\"CompletionText\":\"New-AzAppConfigurationStore\",\"ListItemText\":\"New-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"New-AzAppConfigurationStoreKey\",\"ListItemText\":\"New-AzAppConfigurationStoreKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAppConfigurationStoreKey \\r\\n\"},{\"CompletionText\":\"New-AzApplicationGateway\",\"ListItemText\":\"New-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"New-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"New-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"New-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"New-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"New-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"New-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"New-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayCustomError\",\"ListItemText\":\"New-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCondition\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCondition\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCondition\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCustomRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCustomRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCustomRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByVariable\",\"ListItemText\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByVariable\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallCustomRuleGroupByVariable\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallDisabledRuleGroupConfig\",\"ListItemText\":\"New-AzApplicationGatewayFirewallDisabledRuleGroupConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallDisabledRuleGroupConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallExclusionConfig\",\"ListItemText\":\"New-AzApplicationGatewayFirewallExclusionConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallExclusionConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallMatchVariable\",\"ListItemText\":\"New-AzApplicationGatewayFirewallMatchVariable\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallMatchVariable\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusion\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusion\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusion\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyLogScrubbingRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRule\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleOverride\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleOverride\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleOverride\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleSet\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicyManagedRuleSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFirewallPolicySetting\",\"ListItemText\":\"New-AzApplicationGatewayFirewallPolicySetting\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFirewallPolicySetting\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"New-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"New-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayHttpListener\",\"ListItemText\":\"New-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayIdentity\",\"ListItemText\":\"New-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayListener\",\"ListItemText\":\"New-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayPathRuleConfig\",\"ListItemText\":\"New-AzApplicationGatewayPathRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayPathRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayPrivateLinkIpConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayPrivateLinkIpConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayPrivateLinkIpConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"New-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayProbeHealthResponseMatch\",\"ListItemText\":\"New-AzApplicationGatewayProbeHealthResponseMatch\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayProbeHealthResponseMatch\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"New-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRule\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleActionSet\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleActionSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleActionSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleCondition\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleCondition\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleCondition\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleHeaderConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleHeaderConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleHeaderConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRewriteRuleUrlConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayRewriteRuleUrlConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRewriteRuleUrlConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"New-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySku\",\"ListItemText\":\"New-AzApplicationGatewaySku\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySku\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"New-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"New-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewaySslProfile\",\"ListItemText\":\"New-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"New-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"New-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"New-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"New-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ListItemText\":\"New-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationGatewayWebApplicationFirewallConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsights\",\"ListItemText\":\"New-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsApiKey\",\"ListItemText\":\"New-AzApplicationInsightsApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsApiKey \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"New-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"New-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"New-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWebTest\",\"ListItemText\":\"New-AzApplicationInsightsWebTest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWebTest \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWebTestGeolocationObject\",\"ListItemText\":\"New-AzApplicationInsightsWebTestGeolocationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWebTestGeolocationObject \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWebTestHeaderFieldObject\",\"ListItemText\":\"New-AzApplicationInsightsWebTestHeaderFieldObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWebTestHeaderFieldObject \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWorkbook\",\"ListItemText\":\"New-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"New-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"New-AzApplicationInsightsWorkbookTemplateGalleryObject\",\"ListItemText\":\"New-AzApplicationInsightsWorkbookTemplateGalleryObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzApplicationInsightsWorkbookTemplateGalleryObject \\r\\n\"},{\"CompletionText\":\"New-AzApplicationSecurityGroup\",\"ListItemText\":\"New-AzApplicationSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzApplicationSecurityGroup\\r\\n\"},{\"CompletionText\":\"New-AzApplyUpdate\",\"ListItemText\":\"New-AzApplyUpdate\",\"ResultType\":2,\"ToolTip\":\"New-AzApplyUpdate\\r\\n\"},{\"CompletionText\":\"New-AzAppServiceEnvironment\",\"ListItemText\":\"New-AzAppServiceEnvironment\",\"ResultType\":2,\"ToolTip\":\"New-AzAppServiceEnvironment\\r\\n\"},{\"CompletionText\":\"New-AzAppServiceEnvironmentInboundServices\",\"ListItemText\":\"New-AzAppServiceEnvironmentInboundServices\",\"ResultType\":2,\"ToolTip\":\"New-AzAppServiceEnvironmentInboundServices\\r\\n\"},{\"CompletionText\":\"New-AzAppServicePlan\",\"ListItemText\":\"New-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"New-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"New-AzAs\",\"ListItemText\":\"New-AzAs\",\"ResultType\":2,\"ToolTip\":\"New-AzAs\"},{\"CompletionText\":\"New-AzAttestationProvider\",\"ListItemText\":\"New-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfile\",\"ListItemText\":\"New-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfileAssignment\",\"ListItemText\":\"New-AzAutomanageConfigProfileAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfileAssignment \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfileHciAssignment\",\"ListItemText\":\"New-AzAutomanageConfigProfileHciAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfileHciAssignment \\r\\n\"},{\"CompletionText\":\"New-AzAutomanageConfigProfileHcrpAssignment\",\"ListItemText\":\"New-AzAutomanageConfigProfileHcrpAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutomanageConfigProfileHcrpAssignment \\r\\n\"},{\"CompletionText\":\"New-AzAutomationAccount\",\"ListItemText\":\"New-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"New-AzAutomationCertificate\",\"ListItemText\":\"New-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"New-AzAutomationConnection\",\"ListItemText\":\"New-AzAutomationConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationConnection\\r\\n\"},{\"CompletionText\":\"New-AzAutomationCredential\",\"ListItemText\":\"New-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"New-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"New-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"New-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"New-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"New-AzAutomationKey\",\"ListItemText\":\"New-AzAutomationKey\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationKey\\r\\n\"},{\"CompletionText\":\"New-AzAutomationModule\",\"ListItemText\":\"New-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"New-AzAutomationPython3Package\",\"ListItemText\":\"New-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"New-AzAutomationRunbook\",\"ListItemText\":\"New-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"New-AzAutomationSchedule\",\"ListItemText\":\"New-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"New-AzAutomationSoftwareUpdateConfiguration\",\"ListItemText\":\"New-AzAutomationSoftwareUpdateConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationSoftwareUpdateConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzAutomationSourceControl\",\"ListItemText\":\"New-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"New-AzAutomationUpdateManagementAzureQuery\",\"ListItemText\":\"New-AzAutomationUpdateManagementAzureQuery\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationUpdateManagementAzureQuery\\r\\n\"},{\"CompletionText\":\"New-AzAutomationVariable\",\"ListItemText\":\"New-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"New-AzAutomationWebhook\",\"ListItemText\":\"New-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"New-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleNotificationObject\",\"ListItemText\":\"New-AzAutoscaleNotificationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleNotificationObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleProfileObject\",\"ListItemText\":\"New-AzAutoscaleProfileObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleProfileObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleScaleRuleMetricDimensionObject\",\"ListItemText\":\"New-AzAutoscaleScaleRuleMetricDimensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleScaleRuleMetricDimensionObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleScaleRuleObject\",\"ListItemText\":\"New-AzAutoscaleScaleRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleScaleRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleSetting\",\"ListItemText\":\"New-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"New-AzAutoscaleWebhookNotificationObject\",\"ListItemText\":\"New-AzAutoscaleWebhookNotificationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAutoscaleWebhookNotificationObject \\r\\n\"},{\"CompletionText\":\"New-AzAvailabilityGroupListener\",\"ListItemText\":\"New-AzAvailabilityGroupListener\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzAvailabilityGroupListener \\r\\n\"},{\"CompletionText\":\"New-AzAvailabilitySet\",\"ListItemText\":\"New-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"New-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"New-AzBastion\",\"ListItemText\":\"New-AzBastion\",\"ResultType\":2,\"ToolTip\":\"New-AzBastion\\r\\n\"},{\"CompletionText\":\"New-AzBatchAccount\",\"ListItemText\":\"New-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"New-AzBatchAccountKey\",\"ListItemText\":\"New-AzBatchAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzBatchApplication\",\"ListItemText\":\"New-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"New-AzBatchApplicationPackage\",\"ListItemText\":\"New-AzBatchApplicationPackage\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchApplicationPackage\\r\\n\"},{\"CompletionText\":\"New-AzBatchCertificate\",\"ListItemText\":\"New-AzBatchCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchCertificate\\r\\n\"},{\"CompletionText\":\"New-AzBatchComputeNodeUser\",\"ListItemText\":\"New-AzBatchComputeNodeUser\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchComputeNodeUser\\r\\n\"},{\"CompletionText\":\"New-AzBatchJob\",\"ListItemText\":\"New-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchJob\\r\\n\"},{\"CompletionText\":\"New-AzBatchJobSchedule\",\"ListItemText\":\"New-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"New-AzBatchPool\",\"ListItemText\":\"New-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchPool\\r\\n\"},{\"CompletionText\":\"New-AzBatchResourceFile\",\"ListItemText\":\"New-AzBatchResourceFile\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchResourceFile\\r\\n\"},{\"CompletionText\":\"New-AzBatchTask\",\"ListItemText\":\"New-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"New-AzBatchTask\\r\\n\"},{\"CompletionText\":\"New-AzCapacityReservation\",\"ListItemText\":\"New-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"New-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"New-AzCapacityReservationGroup\",\"ListItemText\":\"New-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"New-AzCdnCustomDomain\",\"ListItemText\":\"New-AzCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleCacheExpirationActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleCacheExpirationActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleCacheExpirationActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleCacheKeyQueryStringActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleCacheKeyQueryStringActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleCacheKeyQueryStringActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleCookiesConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleCookiesConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleCookiesConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleHttpVersionConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleHttpVersionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleHttpVersionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleIsDeviceConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleIsDeviceConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleIsDeviceConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRulePostArgsConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRulePostArgsConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRulePostArgsConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleQueryStringConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleQueryStringConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleQueryStringConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRemoteAddressConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRemoteAddressConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRemoteAddressConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestBodyConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestBodyConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestBodyConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestHeaderActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestHeaderConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestHeaderConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestHeaderConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestMethodConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestMethodConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestMethodConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestSchemeConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestSchemeConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestSchemeConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleRequestUriConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleRequestUriConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleRequestUriConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleResponseHeaderActionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleResponseHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleResponseHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleUrlFileExtensionConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleUrlFileExtensionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleUrlFileExtensionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleUrlFileNameConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleUrlFileNameConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleUrlFileNameConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnDeliveryRuleUrlPathConditionObject\",\"ListItemText\":\"New-AzCdnDeliveryRuleUrlPathConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnDeliveryRuleUrlPathConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnEndpoint\",\"ListItemText\":\"New-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzCdnHealthProbeParametersObject\",\"ListItemText\":\"New-AzCdnHealthProbeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnHealthProbeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnLoadParametersObject\",\"ListItemText\":\"New-AzCdnLoadParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnLoadParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnManagedHttpsParametersObject\",\"ListItemText\":\"New-AzCdnManagedHttpsParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnManagedHttpsParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnOrigin\",\"ListItemText\":\"New-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"New-AzCdnOriginGroup\",\"ListItemText\":\"New-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"New-AzCdnOriginGroupOverrideActionObject\",\"ListItemText\":\"New-AzCdnOriginGroupOverrideActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnOriginGroupOverrideActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnProfile\",\"ListItemText\":\"New-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"New-AzCdnPurgeParametersObject\",\"ListItemText\":\"New-AzCdnPurgeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnPurgeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnResourceReferenceObject\",\"ListItemText\":\"New-AzCdnResourceReferenceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnResourceReferenceObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnResponseBasedOriginErrorDetectionParametersObject\",\"ListItemText\":\"New-AzCdnResponseBasedOriginErrorDetectionParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnResponseBasedOriginErrorDetectionParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUrlRedirectActionObject\",\"ListItemText\":\"New-AzCdnUrlRedirectActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUrlRedirectActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUrlRewriteActionObject\",\"ListItemText\":\"New-AzCdnUrlRewriteActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUrlRewriteActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUrlSigningActionObject\",\"ListItemText\":\"New-AzCdnUrlSigningActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUrlSigningActionObject \\r\\n\"},{\"CompletionText\":\"New-AzCdnUserManagedHttpsParametersObject\",\"ListItemText\":\"New-AzCdnUserManagedHttpsParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCdnUserManagedHttpsParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudService\",\"ListItemText\":\"New-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudService \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceDiagnosticsExtension\",\"ListItemText\":\"New-AzCloudServiceDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceDiagnosticsExtension \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceExtensionObject\",\"ListItemText\":\"New-AzCloudServiceExtensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceExtensionObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceLoadBalancerConfigurationObject\",\"ListItemText\":\"New-AzCloudServiceLoadBalancerConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceLoadBalancerConfigurationObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceLoadBalancerFrontendIPConfigurationObject\",\"ListItemText\":\"New-AzCloudServiceLoadBalancerFrontendIPConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceLoadBalancerFrontendIPConfigurationObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceRemoteDesktopExtensionObject\",\"ListItemText\":\"New-AzCloudServiceRemoteDesktopExtensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceRemoteDesktopExtensionObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceRoleProfilePropertiesObject\",\"ListItemText\":\"New-AzCloudServiceRoleProfilePropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceRoleProfilePropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzCloudServiceVaultSecretGroupObject\",\"ListItemText\":\"New-AzCloudServiceVaultSecretGroupObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzCloudServiceVaultSecretGroupObject \\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccount\",\"ListItemText\":\"New-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountApiProperty\",\"ListItemText\":\"New-AzCognitiveServicesAccountApiProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountApiProperty\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountCommitmentPlan\",\"ListItemText\":\"New-AzCognitiveServicesAccountCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountCommitmentPlan\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountDeployment\",\"ListItemText\":\"New-AzCognitiveServicesAccountDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountDeployment\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesAccountKey\",\"ListItemText\":\"New-AzCognitiveServicesAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesCommitmentPlan\",\"ListItemText\":\"New-AzCognitiveServicesCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesCommitmentPlan\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesCommitmentPlanAssociation\",\"ListItemText\":\"New-AzCognitiveServicesCommitmentPlanAssociation\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesCommitmentPlanAssociation\\r\\n\"},{\"CompletionText\":\"New-AzCognitiveServicesObject\",\"ListItemText\":\"New-AzCognitiveServicesObject\",\"ResultType\":2,\"ToolTip\":\"New-AzCognitiveServicesObject\\r\\n\"},{\"CompletionText\":\"New-AzConfidentialLedger\",\"ListItemText\":\"New-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"New-AzConfidentialLedgerAADBasedSecurityPrincipalObject\",\"ListItemText\":\"New-AzConfidentialLedgerAADBasedSecurityPrincipalObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzConfidentialLedgerAADBasedSecurityPrincipalObject \\r\\n\"},{\"CompletionText\":\"New-AzConfidentialLedgerCertBasedSecurityPrincipalObject\",\"ListItemText\":\"New-AzConfidentialLedgerCertBasedSecurityPrincipalObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzConfidentialLedgerCertBasedSecurityPrincipalObject \\r\\n\"},{\"CompletionText\":\"New-AzConfigurationAssignment\",\"ListItemText\":\"New-AzConfigurationAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzConfigurationAssignment\\r\\n\"},{\"CompletionText\":\"New-AzConsumptionBudget\",\"ListItemText\":\"New-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"New-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"New-AzContainerGroup\",\"ListItemText\":\"New-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"New-AzContainerGroupImageRegistryCredentialObject\",\"ListItemText\":\"New-AzContainerGroupImageRegistryCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroupImageRegistryCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerGroupPortObject\",\"ListItemText\":\"New-AzContainerGroupPortObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroupPortObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerGroupVolumeObject\",\"ListItemText\":\"New-AzContainerGroupVolumeObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerGroupVolumeObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceEnvironmentVariableObject\",\"ListItemText\":\"New-AzContainerInstanceEnvironmentVariableObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceEnvironmentVariableObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceHttpHeaderObject\",\"ListItemText\":\"New-AzContainerInstanceHttpHeaderObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceHttpHeaderObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceInitDefinitionObject\",\"ListItemText\":\"New-AzContainerInstanceInitDefinitionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceInitDefinitionObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceObject\",\"ListItemText\":\"New-AzContainerInstanceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstancePortObject\",\"ListItemText\":\"New-AzContainerInstancePortObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstancePortObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerInstanceVolumeMountObject\",\"ListItemText\":\"New-AzContainerInstanceVolumeMountObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerInstanceVolumeMountObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerNicConfig\",\"ListItemText\":\"New-AzContainerNicConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzContainerNicConfig\\r\\n\"},{\"CompletionText\":\"New-AzContainerNicConfigIpConfig\",\"ListItemText\":\"New-AzContainerNicConfigIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzContainerNicConfigIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistry\",\"ListItemText\":\"New-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryAgentPool\",\"ListItemText\":\"New-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryExportPipeline\",\"ListItemText\":\"New-AzContainerRegistryExportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryExportPipeline \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryImportPipeline\",\"ListItemText\":\"New-AzContainerRegistryImportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryImportPipeline \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryIPRuleObject\",\"ListItemText\":\"New-AzContainerRegistryIPRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryIPRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryReplication\",\"ListItemText\":\"New-AzContainerRegistryReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryReplication \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryScopeMap\",\"ListItemText\":\"New-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryToken\",\"ListItemText\":\"New-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"New-AzContainerRegistryWebhook\",\"ListItemText\":\"New-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBAccount\",\"ListItemText\":\"New-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBAccountKey\",\"ListItemText\":\"New-AzCosmosDBAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraClusterKey\",\"ListItemText\":\"New-AzCosmosDBCassandraClusterKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraClusterKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraColumn\",\"ListItemText\":\"New-AzCosmosDBCassandraColumn\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraColumn\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"New-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraSchema\",\"ListItemText\":\"New-AzCosmosDBCassandraSchema\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraSchema\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBCassandraTable\",\"ListItemText\":\"New-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDbClientEncryptionKey\",\"ListItemText\":\"New-AzCosmosDbClientEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDbClientEncryptionKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBDatabaseToRestore\",\"ListItemText\":\"New-AzCosmosDBDatabaseToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBDatabaseToRestore\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinCompositePath\",\"ListItemText\":\"New-AzCosmosDBGremlinCompositePath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinCompositePath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinConflictResolutionPolicy\",\"ListItemText\":\"New-AzCosmosDBGremlinConflictResolutionPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinConflictResolutionPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"New-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinDatabaseToRestore\",\"ListItemText\":\"New-AzCosmosDBGremlinDatabaseToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinDatabaseToRestore\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinGraph\",\"ListItemText\":\"New-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinIncludedPath\",\"ListItemText\":\"New-AzCosmosDBGremlinIncludedPath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinIncludedPath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinIncludedPathIndex\",\"ListItemText\":\"New-AzCosmosDBGremlinIncludedPathIndex\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinIncludedPathIndex\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinIndexingPolicy\",\"ListItemText\":\"New-AzCosmosDBGremlinIndexingPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinIndexingPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinSpatialSpec\",\"ListItemText\":\"New-AzCosmosDBGremlinSpatialSpec\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinSpatialSpec\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinUniqueKey\",\"ListItemText\":\"New-AzCosmosDBGremlinUniqueKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinUniqueKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBGremlinUniqueKeyPolicy\",\"ListItemText\":\"New-AzCosmosDBGremlinUniqueKeyPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBGremlinUniqueKeyPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBLocationObject\",\"ListItemText\":\"New-AzCosmosDBLocationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBLocationObject\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"New-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"New-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBIndex\",\"ListItemText\":\"New-AzCosmosDBMongoDBIndex\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBIndex\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBPrivilege\",\"ListItemText\":\"New-AzCosmosDBMongoDBPrivilege\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBPrivilege\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBPrivilegeResource\",\"ListItemText\":\"New-AzCosmosDBMongoDBPrivilegeResource\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBPrivilegeResource\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBRole\",\"ListItemText\":\"New-AzCosmosDBMongoDBRole\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBRole\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"New-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"New-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBPermission\",\"ListItemText\":\"New-AzCosmosDBPermission\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBPermission\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBService\",\"ListItemText\":\"New-AzCosmosDBService\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBService\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlCompositePath\",\"ListItemText\":\"New-AzCosmosDBSqlCompositePath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlCompositePath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlConflictResolutionPolicy\",\"ListItemText\":\"New-AzCosmosDBSqlConflictResolutionPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlConflictResolutionPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlContainer\",\"ListItemText\":\"New-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlDatabase\",\"ListItemText\":\"New-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlIncludedPath\",\"ListItemText\":\"New-AzCosmosDBSqlIncludedPath\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlIncludedPath\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlIncludedPathIndex\",\"ListItemText\":\"New-AzCosmosDBSqlIncludedPathIndex\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlIncludedPathIndex\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlIndexingPolicy\",\"ListItemText\":\"New-AzCosmosDBSqlIndexingPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlIndexingPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"New-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"New-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlSpatialSpec\",\"ListItemText\":\"New-AzCosmosDBSqlSpatialSpec\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlSpatialSpec\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"New-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlTrigger\",\"ListItemText\":\"New-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlUniqueKey\",\"ListItemText\":\"New-AzCosmosDBSqlUniqueKey\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlUniqueKey\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlUniqueKeyPolicy\",\"ListItemText\":\"New-AzCosmosDBSqlUniqueKeyPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlUniqueKeyPolicy\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"New-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBTable\",\"ListItemText\":\"New-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBTableToRestore\",\"ListItemText\":\"New-AzCosmosDBTableToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBTableToRestore\\r\\n\"},{\"CompletionText\":\"New-AzCosmosDBVirtualNetworkRule\",\"ListItemText\":\"New-AzCosmosDBVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzCosmosDBVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzCustomIpPrefix\",\"ListItemText\":\"New-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"New-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"New-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeDevice\",\"ListItemText\":\"New-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeOrder\",\"ListItemText\":\"New-AzDataBoxEdgeOrder\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeOrder\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeRole\",\"ListItemText\":\"New-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeShare\",\"ListItemText\":\"New-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeStorageAccount\",\"ListItemText\":\"New-AzDataBoxEdgeStorageAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeStorageAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"New-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"New-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeTrigger\",\"ListItemText\":\"New-AzDataBoxEdgeTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeTrigger\\r\\n\"},{\"CompletionText\":\"New-AzDataBoxEdgeUser\",\"ListItemText\":\"New-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"New-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"New-AzDatabricksAccessConnector\",\"ListItemText\":\"New-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"New-AzDatabricksVNetPeering\",\"ListItemText\":\"New-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"New-AzDatabricksWorkspace\",\"ListItemText\":\"New-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzDataCollectionRule\",\"ListItemText\":\"New-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"New-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"New-AzDataCollectionRuleAssociation\",\"ListItemText\":\"New-AzDataCollectionRuleAssociation\",\"ResultType\":2,\"ToolTip\":\"New-AzDataCollectionRuleAssociation\\r\\n\"},{\"CompletionText\":\"New-AzDataFactory\",\"ListItemText\":\"New-AzDataFactory\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactory\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryDataset\",\"ListItemText\":\"New-AzDataFactoryDataset\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryDataset\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryEncryptValue\",\"ListItemText\":\"New-AzDataFactoryEncryptValue\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryEncryptValue\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryGateway\",\"ListItemText\":\"New-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryGatewayAuthkey\",\"ListItemText\":\"New-AzDataFactoryGatewayAuthkey\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryGatewayAuthkey\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryHub\",\"ListItemText\":\"New-AzDataFactoryHub\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryHub\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryLinkedService\",\"ListItemText\":\"New-AzDataFactoryLinkedService\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryLinkedService\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryPipeline\",\"ListItemText\":\"New-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryV2\",\"ListItemText\":\"New-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2\"},{\"CompletionText\":\"New-AzDataFactoryV2Dataset\",\"ListItemText\":\"New-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2Dataset\"},{\"CompletionText\":\"New-AzDataFactoryV2IntegrationRuntimeKey\",\"ListItemText\":\"New-AzDataFactoryV2IntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2IntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryV2LinkedService\",\"ListItemText\":\"New-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2LinkedService\"},{\"CompletionText\":\"New-AzDataFactoryV2LinkedServiceEncryptedCredential\",\"ListItemText\":\"New-AzDataFactoryV2LinkedServiceEncryptedCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2LinkedServiceEncryptedCredential\\r\\n\"},{\"CompletionText\":\"New-AzDataFactoryV2Pipeline\",\"ListItemText\":\"New-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2Pipeline\"},{\"CompletionText\":\"New-AzDataFactoryV2Trigger\",\"ListItemText\":\"New-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"New-AzDataFactoryV2Trigger\"},{\"CompletionText\":\"New-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"New-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeAnalyticsCatalogCredential\",\"ListItemText\":\"New-AzDataLakeAnalyticsCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeAnalyticsCatalogCredential\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"New-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"New-AzDatalakeGen2FileSystem\",\"ListItemText\":\"New-AzDatalakeGen2FileSystem\",\"ResultType\":2,\"ToolTip\":\"New-AzDatalakeGen2FileSystem\"},{\"CompletionText\":\"New-AzDataLakeGen2Item\",\"ListItemText\":\"New-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeGen2ItemAclObject\",\"ListItemText\":\"New-AzDataLakeGen2ItemAclObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeGen2ItemAclObject\"},{\"CompletionText\":\"New-AzDataLakeGen2SasToken\",\"ListItemText\":\"New-AzDataLakeGen2SasToken\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeGen2SasToken\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeStoreAccount\",\"ListItemText\":\"New-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataLakeStoreItem\",\"ListItemText\":\"New-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"New-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupConfigurationClientObject\",\"ListItemText\":\"New-AzDataProtectionBackupConfigurationClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupConfigurationClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupInstance\",\"ListItemText\":\"New-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupPolicy\",\"ListItemText\":\"New-AzDataProtectionBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupPolicy \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupVault\",\"ListItemText\":\"New-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionBackupVaultStorageSettingObject\",\"ListItemText\":\"New-AzDataProtectionBackupVaultStorageSettingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionBackupVaultStorageSettingObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionPolicyTagCriteriaClientObject\",\"ListItemText\":\"New-AzDataProtectionPolicyTagCriteriaClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionPolicyTagCriteriaClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionPolicyTriggerScheduleClientObject\",\"ListItemText\":\"New-AzDataProtectionPolicyTriggerScheduleClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionPolicyTriggerScheduleClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionResourceGuard\",\"ListItemText\":\"New-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionRestoreConfigurationClientObject\",\"ListItemText\":\"New-AzDataProtectionRestoreConfigurationClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionRestoreConfigurationClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataProtectionRetentionLifeCycleClientObject\",\"ListItemText\":\"New-AzDataProtectionRetentionLifeCycleClientObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDataProtectionRetentionLifeCycleClientObject \\r\\n\"},{\"CompletionText\":\"New-AzDataShare\",\"ListItemText\":\"New-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShare\\r\\n\"},{\"CompletionText\":\"New-AzDataShareAccount\",\"ListItemText\":\"New-AzDataShareAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareAccount\\r\\n\"},{\"CompletionText\":\"New-AzDataShareDataSet\",\"ListItemText\":\"New-AzDataShareDataSet\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareDataSet\\r\\n\"},{\"CompletionText\":\"New-AzDataShareDataSetMapping\",\"ListItemText\":\"New-AzDataShareDataSetMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareDataSetMapping\\r\\n\"},{\"CompletionText\":\"New-AzDataShareInvitation\",\"ListItemText\":\"New-AzDataShareInvitation\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareInvitation\\r\\n\"},{\"CompletionText\":\"New-AzDataShareSubscription\",\"ListItemText\":\"New-AzDataShareSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareSubscription\\r\\n\"},{\"CompletionText\":\"New-AzDataShareSynchronizationSetting\",\"ListItemText\":\"New-AzDataShareSynchronizationSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareSynchronizationSetting\\r\\n\"},{\"CompletionText\":\"New-AzDataShareTrigger\",\"ListItemText\":\"New-AzDataShareTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzDataShareTrigger\\r\\n\"},{\"CompletionText\":\"New-AzDdosProtectionPlan\",\"ListItemText\":\"New-AzDdosProtectionPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzDdosProtectionPlan\\r\\n\"},{\"CompletionText\":\"New-AzDelegation\",\"ListItemText\":\"New-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"New-AzDelegation\\r\\n\"},{\"CompletionText\":\"New-AzDeployment\",\"ListItemText\":\"New-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzDeployment\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"New-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerService\",\"ListItemText\":\"New-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"New-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"New-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"New-AzDeploymentManagerStep\",\"ListItemText\":\"New-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"New-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupAllowlistCustomAlertRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupAllowlistCustomAlertRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupAllowlistCustomAlertRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupDenylistCustomAlertRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupDenylistCustomAlertRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupDenylistCustomAlertRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupThresholdCustomAlertRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupThresholdCustomAlertRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupThresholdCustomAlertRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDeviceSecurityGroupTimeWindowRuleObject\",\"ListItemText\":\"New-AzDeviceSecurityGroupTimeWindowRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzDeviceSecurityGroupTimeWindowRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSetting\",\"ListItemText\":\"New-AzDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSettingLogSettingsObject\",\"ListItemText\":\"New-AzDiagnosticSettingLogSettingsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSettingLogSettingsObject \\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSettingMetricSettingsObject\",\"ListItemText\":\"New-AzDiagnosticSettingMetricSettingsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSettingMetricSettingsObject \\r\\n\"},{\"CompletionText\":\"New-AzDiagnosticSettingSubscriptionLogSettingsObject\",\"ListItemText\":\"New-AzDiagnosticSettingSubscriptionLogSettingsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzDiagnosticSettingSubscriptionLogSettingsObject \\r\\n\"},{\"CompletionText\":\"New-AzDisk\",\"ListItemText\":\"New-AzDisk\",\"ResultType\":2,\"ToolTip\":\"New-AzDisk\\r\\n\"},{\"CompletionText\":\"New-AzDiskAccess\",\"ListItemText\":\"New-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"New-AzDiskConfig\",\"ListItemText\":\"New-AzDiskConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskConfig\\r\\n\"},{\"CompletionText\":\"New-AzDiskEncryptionSet\",\"ListItemText\":\"New-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"New-AzDiskEncryptionSetConfig\",\"ListItemText\":\"New-AzDiskEncryptionSetConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskEncryptionSetConfig\\r\\n\"},{\"CompletionText\":\"New-AzDiskPurchasePlanConfig\",\"ListItemText\":\"New-AzDiskPurchasePlanConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskPurchasePlanConfig\\r\\n\"},{\"CompletionText\":\"New-AzDiskUpdateConfig\",\"ListItemText\":\"New-AzDiskUpdateConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDiskUpdateConfig\\r\\n\"},{\"CompletionText\":\"New-AzDnsRecordConfig\",\"ListItemText\":\"New-AzDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"New-AzDnsRecordSet\",\"ListItemText\":\"New-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"New-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"New-AzDnsZone\",\"ListItemText\":\"New-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"New-AzDnsZone\\r\\n\"},{\"CompletionText\":\"New-AzEventGridChannel\",\"ListItemText\":\"New-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"New-AzEventGridDomain\",\"ListItemText\":\"New-AzEventGridDomain\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridDomain\\r\\n\"},{\"CompletionText\":\"New-AzEventGridDomainKey\",\"ListItemText\":\"New-AzEventGridDomainKey\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridDomainKey\\r\\n\"},{\"CompletionText\":\"New-AzEventGridDomainTopic\",\"ListItemText\":\"New-AzEventGridDomainTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridDomainTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerConfiguration\",\"ListItemText\":\"New-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerNamespace\",\"ListItemText\":\"New-AzEventGridPartnerNamespace\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerNamespace\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerNamespaceKey\",\"ListItemText\":\"New-AzEventGridPartnerNamespaceKey\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerNamespaceKey\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerRegistration\",\"ListItemText\":\"New-AzEventGridPartnerRegistration\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerRegistration\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerTopic\",\"ListItemText\":\"New-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"New-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"New-AzEventGridSubscription\",\"ListItemText\":\"New-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"New-AzEventGridSystemTopic\",\"ListItemText\":\"New-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"New-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"New-AzEventGridTopic\",\"ListItemText\":\"New-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"New-AzEventGridTopicKey\",\"ListItemText\":\"New-AzEventGridTopicKey\",\"ResultType\":2,\"ToolTip\":\"New-AzEventGridTopicKey\\r\\n\"},{\"CompletionText\":\"New-AzEventHub\",\"ListItemText\":\"New-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHub \\r\\n\"},{\"CompletionText\":\"New-AzEventHubApplicationGroup\",\"ListItemText\":\"New-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"New-AzEventHubAuthorizationRule\",\"ListItemText\":\"New-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"New-AzEventHubAuthorizationRuleSASToken\",\"ListItemText\":\"New-AzEventHubAuthorizationRuleSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzEventHubAuthorizationRuleSASToken\\r\\n\"},{\"CompletionText\":\"New-AzEventHubCluster\",\"ListItemText\":\"New-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"New-AzEventHubConsumerGroup\",\"ListItemText\":\"New-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"New-AzEventHubGeoDRConfiguration\",\"ListItemText\":\"New-AzEventHubGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzEventHubIPRuleConfig\",\"ListItemText\":\"New-AzEventHubIPRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubIPRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzEventHubKey\",\"ListItemText\":\"New-AzEventHubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubKey \\r\\n\"},{\"CompletionText\":\"New-AzEventHubKeyVaultPropertiesObject\",\"ListItemText\":\"New-AzEventHubKeyVaultPropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubKeyVaultPropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzEventHubNamespace\",\"ListItemText\":\"New-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"New-AzEventHubNamespaceV2\",\"ListItemText\":\"New-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"New-AzEventHubNamespaceV2\"},{\"CompletionText\":\"New-AzEventHubSchemaGroup\",\"ListItemText\":\"New-AzEventHubSchemaGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubSchemaGroup \\r\\n\"},{\"CompletionText\":\"New-AzEventHubThrottlingPolicyConfig\",\"ListItemText\":\"New-AzEventHubThrottlingPolicyConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubThrottlingPolicyConfig \\r\\n\"},{\"CompletionText\":\"New-AzEventHubVirtualNetworkRuleConfig\",\"ListItemText\":\"New-AzEventHubVirtualNetworkRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzEventHubVirtualNetworkRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteCircuit\",\"ListItemText\":\"New-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"New-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"New-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteConnection\",\"ListItemText\":\"New-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"New-AzExpressRouteGateway\",\"ListItemText\":\"New-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"New-AzExpressRoutePort\",\"ListItemText\":\"New-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"New-AzExpressRoutePortIdentity\",\"ListItemText\":\"New-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"New-AzExpressRoutePortLOA\",\"ListItemText\":\"New-AzExpressRoutePortLOA\",\"ResultType\":2,\"ToolTip\":\"New-AzExpressRoutePortLOA\\r\\n\"},{\"CompletionText\":\"New-AzFederatedIdentityCredentials\",\"ListItemText\":\"New-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"New-AzFirewall\",\"ListItemText\":\"New-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewall\\r\\n\"},{\"CompletionText\":\"New-AzFirewallApplicationRule\",\"ListItemText\":\"New-AzFirewallApplicationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallApplicationRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallApplicationRuleCollection\",\"ListItemText\":\"New-AzFirewallApplicationRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallApplicationRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallHubIpAddress\",\"ListItemText\":\"New-AzFirewallHubIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallHubIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzFirewallHubPublicIpAddress\",\"ListItemText\":\"New-AzFirewallHubPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallHubPublicIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNatRule\",\"ListItemText\":\"New-AzFirewallNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNatRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNatRuleCollection\",\"ListItemText\":\"New-AzFirewallNatRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNatRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNetworkRule\",\"ListItemText\":\"New-AzFirewallNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallNetworkRuleCollection\",\"ListItemText\":\"New-AzFirewallNetworkRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallNetworkRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicy\",\"ListItemText\":\"New-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyApplicationRule\",\"ListItemText\":\"New-AzFirewallPolicyApplicationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyApplicationRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyApplicationRuleCustomHttpHeader\",\"ListItemText\":\"New-AzFirewallPolicyApplicationRuleCustomHttpHeader\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyApplicationRuleCustomHttpHeader\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyDnsSetting\",\"ListItemText\":\"New-AzFirewallPolicyDnsSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyDnsSetting\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyExplicitProxy\",\"ListItemText\":\"New-AzFirewallPolicyExplicitProxy\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyExplicitProxy\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyFilterRuleCollection\",\"ListItemText\":\"New-AzFirewallPolicyFilterRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyFilterRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyIntrusionDetection\",\"ListItemText\":\"New-AzFirewallPolicyIntrusionDetection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyIntrusionDetection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyIntrusionDetectionBypassTraffic\",\"ListItemText\":\"New-AzFirewallPolicyIntrusionDetectionBypassTraffic\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyIntrusionDetectionBypassTraffic\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyIntrusionDetectionSignatureOverride\",\"ListItemText\":\"New-AzFirewallPolicyIntrusionDetectionSignatureOverride\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyIntrusionDetectionSignatureOverride\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyNatRule\",\"ListItemText\":\"New-AzFirewallPolicyNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyNatRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyNatRuleCollection\",\"ListItemText\":\"New-AzFirewallPolicyNatRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyNatRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyNetworkRule\",\"ListItemText\":\"New-AzFirewallPolicyNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"New-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicySnat\",\"ListItemText\":\"New-AzFirewallPolicySnat\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicySnat\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicySqlSetting\",\"ListItemText\":\"New-AzFirewallPolicySqlSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicySqlSetting\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPolicyThreatIntelWhitelist\",\"ListItemText\":\"New-AzFirewallPolicyThreatIntelWhitelist\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPolicyThreatIntelWhitelist\\r\\n\"},{\"CompletionText\":\"New-AzFirewallPublicIpAddress\",\"ListItemText\":\"New-AzFirewallPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallPublicIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzFirewallThreatIntelWhitelist\",\"ListItemText\":\"New-AzFirewallThreatIntelWhitelist\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallThreatIntelWhitelist\\r\\n\"},{\"CompletionText\":\"New-AzFirewallThreatIntelWhitelistObject\",\"ListItemText\":\"New-AzFirewallThreatIntelWhitelistObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFirewallThreatIntelWhitelistObject\"},{\"CompletionText\":\"New-AzFrontDoor\",\"ListItemText\":\"New-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorBackendObject\",\"ListItemText\":\"New-AzFrontDoorBackendObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorBackendObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorBackendPoolObject\",\"ListItemText\":\"New-AzFrontDoorBackendPoolObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorBackendPoolObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorBackendPoolsSettingObject\",\"ListItemText\":\"New-AzFrontDoorBackendPoolsSettingObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorBackendPoolsSettingObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"New-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnCustomDomainTlsSettingParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnCustomDomainTlsSettingParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnCustomDomainTlsSettingParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"New-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnMigrationParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnMigrationParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnMigrationParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnMigrationWebApplicationFirewallMappingObject\",\"ListItemText\":\"New-AzFrontDoorCdnMigrationWebApplicationFirewallMappingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnMigrationWebApplicationFirewallMappingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOrigin\",\"ListItemText\":\"New-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"New-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOriginGroupHealthProbeSettingObject\",\"ListItemText\":\"New-AzFrontDoorCdnOriginGroupHealthProbeSettingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOriginGroupHealthProbeSettingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnOriginGroupLoadBalancingSettingObject\",\"ListItemText\":\"New-AzFrontDoorCdnOriginGroupLoadBalancingSettingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnOriginGroupLoadBalancingSettingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnProfile\",\"ListItemText\":\"New-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnProfileChangeSkuWafMappingObject\",\"ListItemText\":\"New-AzFrontDoorCdnProfileChangeSkuWafMappingObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnProfileChangeSkuWafMappingObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnProfileUpgradeParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnProfileUpgradeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnProfileUpgradeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnPurgeParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnPurgeParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnPurgeParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnResourceReferenceObject\",\"ListItemText\":\"New-AzFrontDoorCdnResourceReferenceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnResourceReferenceObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRoute\",\"ListItemText\":\"New-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRule\",\"ListItemText\":\"New-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleClientPortConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleClientPortConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleClientPortConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleCookiesConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleCookiesConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleCookiesConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleHostNameConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleHostNameConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleHostNameConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleHttpVersionConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleHttpVersionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleHttpVersionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleIsDeviceConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleIsDeviceConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleIsDeviceConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRulePostArgsConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRulePostArgsConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRulePostArgsConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleQueryStringConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleQueryStringConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleQueryStringConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRemoteAddressConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRemoteAddressConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRemoteAddressConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestBodyConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestBodyConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestBodyConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestHeaderActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestHeaderConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestHeaderConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestHeaderConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestMethodConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestMethodConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestMethodConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestSchemeConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestSchemeConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestSchemeConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRequestUriConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRequestUriConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRequestUriConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleResponseHeaderActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleResponseHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleResponseHeaderActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleRouteConfigurationOverrideActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleRouteConfigurationOverrideActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleRouteConfigurationOverrideActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleServerPortConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleServerPortConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleServerPortConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleSet\",\"ListItemText\":\"New-AzFrontDoorCdnRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleSet \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleSocketAddrConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleSocketAddrConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleSocketAddrConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleSslProtocolConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleSslProtocolConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleSslProtocolConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlFileExtensionConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlFileExtensionConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlFileExtensionConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlFileNameConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlFileNameConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlFileNameConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlPathConditionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlPathConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlPathConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlRedirectActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlRedirectActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlRedirectActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlRewriteActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlRewriteActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlRewriteActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnRuleUrlSigningActionObject\",\"ListItemText\":\"New-AzFrontDoorCdnRuleUrlSigningActionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnRuleUrlSigningActionObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecret\",\"ListItemText\":\"New-AzFrontDoorCdnSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecret \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretCustomerCertificateParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretCustomerCertificateParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretCustomerCertificateParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretFirstPartyManagedCertificateParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretFirstPartyManagedCertificateParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretFirstPartyManagedCertificateParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretManagedCertificateParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretManagedCertificateParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretManagedCertificateParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecretUrlSigningKeyParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecretUrlSigningKeyParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecretUrlSigningKeyParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"New-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallAssociationObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallAssociationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallAssociationObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallParametersObject\",\"ListItemText\":\"New-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallParametersObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFrontDoorCdnSecurityPolicyWebApplicationFirewallParametersObject \\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorFrontendEndpointObject\",\"ListItemText\":\"New-AzFrontDoorFrontendEndpointObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorFrontendEndpointObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorHeaderActionObject\",\"ListItemText\":\"New-AzFrontDoorHeaderActionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorHeaderActionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorHealthProbeSettingObject\",\"ListItemText\":\"New-AzFrontDoorHealthProbeSettingObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorHealthProbeSettingObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorLoadBalancingSettingObject\",\"ListItemText\":\"New-AzFrontDoorLoadBalancingSettingObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorLoadBalancingSettingObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRoutingRuleObject\",\"ListItemText\":\"New-AzFrontDoorRoutingRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRoutingRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngine\",\"ListItemText\":\"New-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngineActionObject\",\"ListItemText\":\"New-AzFrontDoorRulesEngineActionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngineActionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngineMatchConditionObject\",\"ListItemText\":\"New-AzFrontDoorRulesEngineMatchConditionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngineMatchConditionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorRulesEngineRuleObject\",\"ListItemText\":\"New-AzFrontDoorRulesEngineRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorRulesEngineRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafCustomRuleObject\",\"ListItemText\":\"New-AzFrontDoorWafCustomRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafCustomRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafManagedRuleExclusionObject\",\"ListItemText\":\"New-AzFrontDoorWafManagedRuleExclusionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafManagedRuleExclusionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafManagedRuleObject\",\"ListItemText\":\"New-AzFrontDoorWafManagedRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafManagedRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafManagedRuleOverrideObject\",\"ListItemText\":\"New-AzFrontDoorWafManagedRuleOverrideObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafManagedRuleOverrideObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafMatchConditionObject\",\"ListItemText\":\"New-AzFrontDoorWafMatchConditionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafMatchConditionObject\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafPolicy\",\"ListItemText\":\"New-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"New-AzFrontDoorWafRuleGroupOverrideObject\",\"ListItemText\":\"New-AzFrontDoorWafRuleGroupOverrideObject\",\"ResultType\":2,\"ToolTip\":\"New-AzFrontDoorWafRuleGroupOverrideObject\\r\\n\"},{\"CompletionText\":\"New-AzFunctionApp\",\"ListItemText\":\"New-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"New-AzFunctionAppPlan\",\"ListItemText\":\"New-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"New-AzGallery\",\"ListItemText\":\"New-AzGallery\",\"ResultType\":2,\"ToolTip\":\"New-AzGallery\\r\\n\"},{\"CompletionText\":\"New-AzGalleryApplication\",\"ListItemText\":\"New-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"New-AzGalleryApplicationVersion\",\"ListItemText\":\"New-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"New-AzGalleryImageDefinition\",\"ListItemText\":\"New-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"New-AzGalleryImageVersion\",\"ListItemText\":\"New-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"New-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"New-AzGatewayCustomBgpIpConfigurationObject\",\"ListItemText\":\"New-AzGatewayCustomBgpIpConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzGatewayCustomBgpIpConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightCluster\",\"ListItemText\":\"New-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"New-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightClusterAutoscaleScheduleCondition\",\"ListItemText\":\"New-AzHDInsightClusterAutoscaleScheduleCondition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightClusterAutoscaleScheduleCondition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightClusterConfig\",\"ListItemText\":\"New-AzHDInsightClusterConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightClusterConfig\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightHiveJobDefinition\",\"ListItemText\":\"New-AzHDInsightHiveJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightHiveJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightIPConfiguration\",\"ListItemText\":\"New-AzHDInsightIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightIPConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightMapReduceJobDefinition\",\"ListItemText\":\"New-AzHDInsightMapReduceJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightMapReduceJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightPigJobDefinition\",\"ListItemText\":\"New-AzHDInsightPigJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightPigJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightPrivateLinkConfiguration\",\"ListItemText\":\"New-AzHDInsightPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightSqoopJobDefinition\",\"ListItemText\":\"New-AzHDInsightSqoopJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightSqoopJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHDInsightStreamingMapReduceJobDefinition\",\"ListItemText\":\"New-AzHDInsightStreamingMapReduceJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzHDInsightStreamingMapReduceJobDefinition\\r\\n\"},{\"CompletionText\":\"New-AzHealthcareApisService\",\"ListItemText\":\"New-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareApisWorkspace\",\"ListItemText\":\"New-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareDicomService\",\"ListItemText\":\"New-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareFhirService\",\"ListItemText\":\"New-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareIotConnector\",\"ListItemText\":\"New-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"New-AzHealthcareIotConnectorFhirDestination\",\"ListItemText\":\"New-AzHealthcareIotConnectorFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzHealthcareIotConnectorFhirDestination \\r\\n\"},{\"CompletionText\":\"New-AzHost\",\"ListItemText\":\"New-AzHost\",\"ResultType\":2,\"ToolTip\":\"New-AzHost\\r\\n\"},{\"CompletionText\":\"New-AzHostGroup\",\"ListItemText\":\"New-AzHostGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzHostGroup\\r\\n\"},{\"CompletionText\":\"New-AzImage\",\"ListItemText\":\"New-AzImage\",\"ResultType\":2,\"ToolTip\":\"New-AzImage\\r\\n\"},{\"CompletionText\":\"New-AzImageConfig\",\"ListItemText\":\"New-AzImageConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzImageConfig\\r\\n\"},{\"CompletionText\":\"New-AzInsightsPrivateLinkScope\",\"ListItemText\":\"New-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"New-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"New-AzInsightsPrivateLinkScopedResource\",\"ListItemText\":\"New-AzInsightsPrivateLinkScopedResource\",\"ResultType\":2,\"ToolTip\":\"New-AzInsightsPrivateLinkScopedResource\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccount\",\"ListItemText\":\"New-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountAgreement\",\"ListItemText\":\"New-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountAssembly\",\"ListItemText\":\"New-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"New-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountCertificate\",\"ListItemText\":\"New-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountMap\",\"ListItemText\":\"New-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountPartner\",\"ListItemText\":\"New-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"New-AzIntegrationAccountSchema\",\"ListItemText\":\"New-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"New-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"New-AzIotHub\",\"ListItemText\":\"New-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHub\\r\\n\"},{\"CompletionText\":\"New-AzIotHubExportDevice\",\"ListItemText\":\"New-AzIotHubExportDevice\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubExportDevice\\r\\n\"},{\"CompletionText\":\"New-AzIotHubImportDevice\",\"ListItemText\":\"New-AzIotHubImportDevice\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubImportDevice\\r\\n\"},{\"CompletionText\":\"New-AzIotHubKey\",\"ListItemText\":\"New-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"New-AzIotHubSasToken\",\"ListItemText\":\"New-AzIotHubSasToken\",\"ResultType\":2,\"ToolTip\":\"New-AzIotHubSasToken\\r\\n\"},{\"CompletionText\":\"New-AzIotSecuritySolutionRecommendationConfigurationObject\",\"ListItemText\":\"New-AzIotSecuritySolutionRecommendationConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzIotSecuritySolutionRecommendationConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzIotSecuritySolutionUserDefinedResourcesObject\",\"ListItemText\":\"New-AzIotSecuritySolutionUserDefinedResourcesObject\",\"ResultType\":2,\"ToolTip\":\"New-AzIotSecuritySolutionUserDefinedResourcesObject\\r\\n\"},{\"CompletionText\":\"New-AzIpAllocation\",\"ListItemText\":\"New-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"New-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"New-AzIpConfigurationBgpPeeringAddressObject\",\"ListItemText\":\"New-AzIpConfigurationBgpPeeringAddressObject\",\"ResultType\":2,\"ToolTip\":\"New-AzIpConfigurationBgpPeeringAddressObject\\r\\n\"},{\"CompletionText\":\"New-AzIpGroup\",\"ListItemText\":\"New-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzIpGroup\\r\\n\"},{\"CompletionText\":\"New-AzIpsecPolicy\",\"ListItemText\":\"New-AzIpsecPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzIpsecPolicy\\r\\n\"},{\"CompletionText\":\"New-AzIpsecTrafficSelectorPolicy\",\"ListItemText\":\"New-AzIpsecTrafficSelectorPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzIpsecTrafficSelectorPolicy\\r\\n\"},{\"CompletionText\":\"New-AzKeyVault\",\"ListItemText\":\"New-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVault\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultCertificateAdministratorDetail\",\"ListItemText\":\"New-AzKeyVaultCertificateAdministratorDetail\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultCertificateAdministratorDetail\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultCertificateOrganizationDetail\",\"ListItemText\":\"New-AzKeyVaultCertificateOrganizationDetail\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultCertificateOrganizationDetail\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultCertificatePolicy\",\"ListItemText\":\"New-AzKeyVaultCertificatePolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultCertificatePolicy\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultManagedHsm\",\"ListItemText\":\"New-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultNetworkRuleSetObject\",\"ListItemText\":\"New-AzKeyVaultNetworkRuleSetObject\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultNetworkRuleSetObject\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultRoleAssignment\",\"ListItemText\":\"New-AzKeyVaultRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzKeyVaultRoleDefinition\",\"ListItemText\":\"New-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzKeyVaultRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzKustoAttachedDatabaseConfiguration\",\"ListItemText\":\"New-AzKustoAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzKustoCluster\",\"ListItemText\":\"New-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"New-AzKustoClusterPrincipalAssignment\",\"ListItemText\":\"New-AzKustoClusterPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoClusterPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzKustoDatabase\",\"ListItemText\":\"New-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"New-AzKustoDatabasePrincipalAssignment\",\"ListItemText\":\"New-AzKustoDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzKustoDataConnection\",\"ListItemText\":\"New-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"New-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"New-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzKustoPrivateEndpointConnection\",\"ListItemText\":\"New-AzKustoPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"New-AzKustoScript\",\"ListItemText\":\"New-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzKustoScript \\r\\n\"},{\"CompletionText\":\"New-AzLoad\",\"ListItemText\":\"New-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzLoad \\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancer\",\"ListItemText\":\"New-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressConfig\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerBackendAddressPoolTunnelInterfaceConfig\",\"ListItemText\":\"New-AzLoadBalancerBackendAddressPoolTunnelInterfaceConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerBackendAddressPoolTunnelInterfaceConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"New-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"New-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"New-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"New-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerProbeConfig\",\"ListItemText\":\"New-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"New-AzLoadBalancerRuleConfig\",\"ListItemText\":\"New-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzLocalNetworkGateway\",\"ListItemText\":\"New-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"New-AzLogicApp\",\"ListItemText\":\"New-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"New-AzLogicApp\\r\\n\"},{\"CompletionText\":\"New-AzMaintenanceConfiguration\",\"ListItemText\":\"New-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzManagedApplication\",\"ListItemText\":\"New-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"New-AzManagedApplicationDefinition\",\"ListItemText\":\"New-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"New-AzManagedCassandraCluster\",\"ListItemText\":\"New-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"New-AzManagedCassandraDataCenter\",\"ListItemText\":\"New-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"New-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesAssignment\",\"ListItemText\":\"New-AzManagedServicesAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesAssignment \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesAuthorizationObject\",\"ListItemText\":\"New-AzManagedServicesAuthorizationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesAuthorizationObject \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesDefinition\",\"ListItemText\":\"New-AzManagedServicesDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesDefinition \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesEligibleApproverObject\",\"ListItemText\":\"New-AzManagedServicesEligibleApproverObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesEligibleApproverObject \\r\\n\"},{\"CompletionText\":\"New-AzManagedServicesEligibleAuthorizationObject\",\"ListItemText\":\"New-AzManagedServicesEligibleAuthorizationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzManagedServicesEligibleAuthorizationObject \\r\\n\"},{\"CompletionText\":\"New-AzManagementGroup\",\"ListItemText\":\"New-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"New-AzManagementGroupDeployment\",\"ListItemText\":\"New-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"New-AzManagementGroupHierarchySetting\",\"ListItemText\":\"New-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"New-AzManagementGroupSubscription\",\"ListItemText\":\"New-AzManagementGroupSubscription\",\"ResultType\":2,\"ToolTip\":\"New-AzManagementGroupSubscription\\r\\n\"},{\"CompletionText\":\"New-AzMediaService\",\"ListItemText\":\"New-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"New-AzMediaService\\r\\n\"},{\"CompletionText\":\"New-AzMediaServiceStorageConfig\",\"ListItemText\":\"New-AzMediaServiceStorageConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzMediaServiceStorageConfig\\r\\n\"},{\"CompletionText\":\"New-AzMetricAlertRuleV2Criteria\",\"ListItemText\":\"New-AzMetricAlertRuleV2Criteria\",\"ResultType\":2,\"ToolTip\":\"New-AzMetricAlertRuleV2Criteria\\r\\n\"},{\"CompletionText\":\"New-AzMetricAlertRuleV2DimensionSelection\",\"ListItemText\":\"New-AzMetricAlertRuleV2DimensionSelection\",\"ResultType\":2,\"ToolTip\":\"New-AzMetricAlertRuleV2DimensionSelection\\r\\n\"},{\"CompletionText\":\"New-AzMetricFilter\",\"ListItemText\":\"New-AzMetricFilter\",\"ResultType\":2,\"ToolTip\":\"New-AzMetricFilter\\r\\n\"},{\"CompletionText\":\"New-AzMigrateDiskMapping\",\"ListItemText\":\"New-AzMigrateDiskMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateDiskMapping \\r\\n\"},{\"CompletionText\":\"New-AzMigrateNicMapping\",\"ListItemText\":\"New-AzMigrateNicMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateNicMapping \\r\\n\"},{\"CompletionText\":\"New-AzMigrateProject\",\"ListItemText\":\"New-AzMigrateProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateProject \\r\\n\"},{\"CompletionText\":\"New-AzMigrateReplicationPolicy\",\"ListItemText\":\"New-AzMigrateReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateReplicationPolicy \\r\\n\"},{\"CompletionText\":\"New-AzMigrateReplicationProtectionContainerMapping\",\"ListItemText\":\"New-AzMigrateReplicationProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateReplicationProtectionContainerMapping \\r\\n\"},{\"CompletionText\":\"New-AzMigrateServerReplication\",\"ListItemText\":\"New-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"New-AzMigrateTestNicMapping\",\"ListItemText\":\"New-AzMigrateTestNicMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMigrateTestNicMapping \\r\\n\"},{\"CompletionText\":\"New-AzMlCommitmentPlan\",\"ListItemText\":\"New-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"New-AzMlWebService\",\"ListItemText\":\"New-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"New-AzMlWebService\\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspace\",\"ListItemText\":\"New-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceAksObject\",\"ListItemText\":\"New-AzMLWorkspaceAksObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceAksObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceAmlComputeObject\",\"ListItemText\":\"New-AzMLWorkspaceAmlComputeObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceAmlComputeObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"New-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"New-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCodeVersion\",\"ListItemText\":\"New-AzMLWorkspaceCodeVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCodeVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCommandJobObject\",\"ListItemText\":\"New-AzMLWorkspaceCommandJobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCommandJobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComponentContainer\",\"ListItemText\":\"New-AzMLWorkspaceComponentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComponentContainer \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComponentVersion\",\"ListItemText\":\"New-AzMLWorkspaceComponentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComponentVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCompute\",\"ListItemText\":\"New-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComputeInstanceObject\",\"ListItemText\":\"New-AzMLWorkspaceComputeInstanceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComputeInstanceObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceComputeStartStopScheduleObject\",\"ListItemText\":\"New-AzMLWorkspaceComputeStartStopScheduleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceComputeStartStopScheduleObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceConnection\",\"ListItemText\":\"New-AzMLWorkspaceConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceConnection \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCustomModelJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceCustomModelJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCustomModelJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceCustomModelJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceCustomModelJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceCustomModelJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatabricksObject\",\"ListItemText\":\"New-AzMLWorkspaceDatabricksObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatabricksObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataContainer\",\"ListItemText\":\"New-AzMLWorkspaceDataContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataContainer \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataFactoryObject\",\"ListItemText\":\"New-AzMLWorkspaceDataFactoryObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataFactoryObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataLakeAnalyticsObject\",\"ListItemText\":\"New-AzMLWorkspaceDataLakeAnalyticsObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataLakeAnalyticsObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastore\",\"ListItemText\":\"New-AzMLWorkspaceDatastore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastore \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreBlobObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreBlobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreBlobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreDataLakeGen1Object\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreDataLakeGen1Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreDataLakeGen1Object \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreDataLakeGen2Object\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreDataLakeGen2Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreDataLakeGen2Object \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreFileObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreFileObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreFileObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreKeyCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreKeyCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreKeyCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreNoneCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreNoneCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreNoneCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreSasCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreSasCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreSasCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDatastoreServicePrincipalCredentialObject\",\"ListItemText\":\"New-AzMLWorkspaceDatastoreServicePrincipalCredentialObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDatastoreServicePrincipalCredentialObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceDataVersion\",\"ListItemText\":\"New-AzMLWorkspaceDataVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceDataVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceEnvironmentVersion\",\"ListItemText\":\"New-AzMLWorkspaceEnvironmentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceEnvironmentVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceHDInsightObject\",\"ListItemText\":\"New-AzMLWorkspaceHDInsightObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceHDInsightObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceJob\",\"ListItemText\":\"New-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceJobServiceObject\",\"ListItemText\":\"New-AzMLWorkspaceJobServiceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceJobServiceObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceKubernetesObject\",\"ListItemText\":\"New-AzMLWorkspaceKubernetesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceKubernetesObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceLiteralJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceLiteralJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceLiteralJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLFlowModelJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLFlowModelJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLFlowModelJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLFlowModelJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLFlowModelJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLFlowModelJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLTableJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLTableJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLTableJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceMLTableJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceMLTableJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceMLTableJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceModelContainer\",\"ListItemText\":\"New-AzMLWorkspaceModelContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceModelContainer \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceModelVersion\",\"ListItemText\":\"New-AzMLWorkspaceModelVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceModelVersion \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"New-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"New-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceOnlineEndpointKey\",\"ListItemText\":\"New-AzMLWorkspaceOnlineEndpointKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceOnlineEndpointKey \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspacePipelineJobObject\",\"ListItemText\":\"New-AzMLWorkspacePipelineJobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspacePipelineJobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceQuotaPropertiesObject\",\"ListItemText\":\"New-AzMLWorkspaceQuotaPropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceQuotaPropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceSharedPrivateLinkResourceObject\",\"ListItemText\":\"New-AzMLWorkspaceSharedPrivateLinkResourceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceSharedPrivateLinkResourceObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceSweepJobObject\",\"ListItemText\":\"New-AzMLWorkspaceSweepJobObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceSweepJobObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceSynapseSparkObject\",\"ListItemText\":\"New-AzMLWorkspaceSynapseSparkObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceSynapseSparkObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceTritonModelJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceTritonModelJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceTritonModelJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceTritonModelJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceTritonModelJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceTritonModelJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFileJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFileJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFileJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFileJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFileJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFileJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFolderJobInputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFolderJobInputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFolderJobInputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceUriFolderJobOutputObject\",\"ListItemText\":\"New-AzMLWorkspaceUriFolderJobOutputObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceUriFolderJobOutputObject \\r\\n\"},{\"CompletionText\":\"New-AzMLWorkspaceVirtualMachineObject\",\"ListItemText\":\"New-AzMLWorkspaceVirtualMachineObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMLWorkspaceVirtualMachineObject \\r\\n\"},{\"CompletionText\":\"New-AzMonitorWorkspace\",\"ListItemText\":\"New-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFirewallRule\",\"ListItemText\":\"New-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServer\",\"ListItemText\":\"New-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServerDatabase\",\"ListItemText\":\"New-AzMySqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"New-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzMySqlFlexibleServerReplica\",\"ListItemText\":\"New-AzMySqlFlexibleServerReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlFlexibleServerReplica \\r\\n\"},{\"CompletionText\":\"New-AzMySqlReplica\",\"ListItemText\":\"New-AzMySqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlReplica \\r\\n\"},{\"CompletionText\":\"New-AzMySqlServer\",\"ListItemText\":\"New-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"New-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"New-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"New-AzNatGateway\",\"ListItemText\":\"New-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzNatGateway\\r\\n\"},{\"CompletionText\":\"New-AzNetworkInterface\",\"ListItemText\":\"New-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"New-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"New-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManager\",\"ListItemText\":\"New-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerAddressPrefixItem\",\"ListItemText\":\"New-AzNetworkManagerAddressPrefixItem\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerAddressPrefixItem\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"New-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerConnectivityGroupItem\",\"ListItemText\":\"New-AzNetworkManagerConnectivityGroupItem\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerConnectivityGroupItem\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerGroup\",\"ListItemText\":\"New-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerHub\",\"ListItemText\":\"New-AzNetworkManagerHub\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerHub\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"New-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerScope\",\"ListItemText\":\"New-AzNetworkManagerScope\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerScope\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerScopeConnection\",\"ListItemText\":\"New-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"New-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"New-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"New-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSecurityGroupItem\",\"ListItemText\":\"New-AzNetworkManagerSecurityGroupItem\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSecurityGroupItem\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerStaticMember\",\"ListItemText\":\"New-AzNetworkManagerStaticMember\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerStaticMember\\r\\n\"},{\"CompletionText\":\"New-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"New-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"New-AzNetworkProfile\",\"ListItemText\":\"New-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"New-AzNetworkSecurityGroup\",\"ListItemText\":\"New-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"New-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"New-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzNetworkVirtualAppliance\",\"ListItemText\":\"New-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcher\",\"ListItemText\":\"New-AzNetworkWatcher\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcher\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorEndpointObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorEndpointObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorEndpointObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorEndpointScopeItemObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorEndpointScopeItemObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorEndpointScopeItemObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorOutputObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorOutputObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorOutputObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorProtocolConfigurationObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorProtocolConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorProtocolConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorTestConfigurationObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorTestConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorTestConfigurationObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherConnectionMonitorTestGroupObject\",\"ListItemText\":\"New-AzNetworkWatcherConnectionMonitorTestGroupObject\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherConnectionMonitorTestGroupObject\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherFlowLog\",\"ListItemText\":\"New-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile\",\"ListItemText\":\"New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"New-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherPacketCaptureV2\",\"ListItemText\":\"New-AzNetworkWatcherPacketCaptureV2\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherPacketCaptureV2\\r\\n\"},{\"CompletionText\":\"New-AzNetworkWatcherProtocolConfiguration\",\"ListItemText\":\"New-AzNetworkWatcherProtocolConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzNetworkWatcherProtocolConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHub\",\"ListItemText\":\"New-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"New-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"New-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"New-AzNotificationHubKey\",\"ListItemText\":\"New-AzNotificationHubKey\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubKey\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubsNamespace\",\"ListItemText\":\"New-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"New-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"New-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"New-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"New-AzNotificationHubsNamespaceKey\",\"ListItemText\":\"New-AzNotificationHubsNamespaceKey\",\"ResultType\":2,\"ToolTip\":\"New-AzNotificationHubsNamespaceKey\\r\\n\"},{\"CompletionText\":\"New-AzO365PolicyProperty\",\"ListItemText\":\"New-AzO365PolicyProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzO365PolicyProperty\\r\\n\"},{\"CompletionText\":\"New-AzOffice365PolicyProperty\",\"ListItemText\":\"New-AzOffice365PolicyProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzOffice365PolicyProperty\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsApplicationInsightsDataSource\",\"ListItemText\":\"New-AzOperationalInsightsApplicationInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsApplicationInsightsDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsAzureActivityLogDataSource\",\"ListItemText\":\"New-AzOperationalInsightsAzureActivityLogDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsAzureActivityLogDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsAzureAuditDataSource\",\"ListItemText\":\"New-AzOperationalInsightsAzureAuditDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsAzureAuditDataSource\"},{\"CompletionText\":\"New-AzOperationalInsightsCluster\",\"ListItemText\":\"New-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsComputerGroup\",\"ListItemText\":\"New-AzOperationalInsightsComputerGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsComputerGroup\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsCustomLogDataSource\",\"ListItemText\":\"New-AzOperationalInsightsCustomLogDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsCustomLogDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsDataExport\",\"ListItemText\":\"New-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"New-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsLinuxPerformanceObjectDataSource\",\"ListItemText\":\"New-AzOperationalInsightsLinuxPerformanceObjectDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsLinuxPerformanceObjectDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsLinuxSyslogDataSource\",\"ListItemText\":\"New-AzOperationalInsightsLinuxSyslogDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsLinuxSyslogDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsPurgeWorkspace\",\"ListItemText\":\"New-AzOperationalInsightsPurgeWorkspace\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsPurgeWorkspace\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsRestoreTable\",\"ListItemText\":\"New-AzOperationalInsightsRestoreTable\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsRestoreTable\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"New-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsSearchTable\",\"ListItemText\":\"New-AzOperationalInsightsSearchTable\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsSearchTable\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"New-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsTable\",\"ListItemText\":\"New-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsWindowsEventDataSource\",\"ListItemText\":\"New-AzOperationalInsightsWindowsEventDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsWindowsEventDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsWindowsPerformanceCounterDataSource\",\"ListItemText\":\"New-AzOperationalInsightsWindowsPerformanceCounterDataSource\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsWindowsPerformanceCounterDataSource\\r\\n\"},{\"CompletionText\":\"New-AzOperationalInsightsWorkspace\",\"ListItemText\":\"New-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"New-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"New-AzP2sVpnGateway\",\"ListItemText\":\"New-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"New-AzPacketCaptureFilterConfig\",\"ListItemText\":\"New-AzPacketCaptureFilterConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPacketCaptureFilterConfig\\r\\n\"},{\"CompletionText\":\"New-AzPacketCaptureScopeConfig\",\"ListItemText\":\"New-AzPacketCaptureScopeConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPacketCaptureScopeConfig\\r\\n\"},{\"CompletionText\":\"New-AzPolicyAssignment\",\"ListItemText\":\"New-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"New-AzPolicyAttestation\",\"ListItemText\":\"New-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"New-AzPolicyDefinition\",\"ListItemText\":\"New-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"New-AzPolicyExemption\",\"ListItemText\":\"New-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"New-AzPolicySetDefinition\",\"ListItemText\":\"New-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFirewallRule\",\"ListItemText\":\"New-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"New-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFlexibleServerDatabase\",\"ListItemText\":\"New-AzPostgreSqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"New-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlReplica\",\"ListItemText\":\"New-AzPostgreSqlReplica\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlReplica \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlServer\",\"ListItemText\":\"New-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"New-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"New-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"New-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"New-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"New-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"New-AzPowerBIWorkspaceCollection\",\"ListItemText\":\"New-AzPowerBIWorkspaceCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzPowerBIWorkspaceCollection\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsRecordConfig\",\"ListItemText\":\"New-AzPrivateDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsRecordSet\",\"ListItemText\":\"New-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"New-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsZone\",\"ListItemText\":\"New-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsZoneConfig\",\"ListItemText\":\"New-AzPrivateDnsZoneConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsZoneConfig\\r\\n\"},{\"CompletionText\":\"New-AzPrivateDnsZoneGroup\",\"ListItemText\":\"New-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"New-AzPrivateEndpoint\",\"ListItemText\":\"New-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzPrivateEndpointIpConfiguration\",\"ListItemText\":\"New-AzPrivateEndpointIpConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateEndpointIpConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkAssociation\",\"ListItemText\":\"New-AzPrivateLinkAssociation\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkAssociation\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkService\",\"ListItemText\":\"New-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkServiceConnection\",\"ListItemText\":\"New-AzPrivateLinkServiceConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkServiceConnection\\r\\n\"},{\"CompletionText\":\"New-AzPrivateLinkServiceIpConfig\",\"ListItemText\":\"New-AzPrivateLinkServiceIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzPrivateLinkServiceIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzProximityPlacementGroup\",\"ListItemText\":\"New-AzProximityPlacementGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzProximityPlacementGroup\\r\\n\"},{\"CompletionText\":\"New-AzPublicIpAddress\",\"ListItemText\":\"New-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"New-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"New-AzPublicIpPrefix\",\"ListItemText\":\"New-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"New-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"New-AzPublicIpTag\",\"ListItemText\":\"New-AzPublicIpTag\",\"ResultType\":2,\"ToolTip\":\"New-AzPublicIpTag\\r\\n\"},{\"CompletionText\":\"New-AzRadiusServer\",\"ListItemText\":\"New-AzRadiusServer\",\"ResultType\":2,\"ToolTip\":\"New-AzRadiusServer\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig\",\"ListItemText\":\"New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrFabric\",\"ListItemText\":\"New-AzRecoveryServicesAsrFabric\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrFabric\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrInMageAzureV2DiskInput\",\"ListItemText\":\"New-AzRecoveryServicesAsrInMageAzureV2DiskInput\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrInMageAzureV2DiskInput\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrInMageRcmDiskInput\",\"ListItemText\":\"New-AzRecoveryServicesAsrInMageRcmDiskInput\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrInMageRcmDiskInput\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"New-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"New-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrProtectableItem\",\"ListItemText\":\"New-AzRecoveryServicesAsrProtectableItem\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrProtectableItem\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrProtectionContainer\",\"ListItemText\":\"New-AzRecoveryServicesAsrProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrProtectionContainer\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"New-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"New-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"New-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrStorageClassificationMapping\",\"ListItemText\":\"New-AzRecoveryServicesAsrStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrStorageClassificationMapping\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"New-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrVMNicConfig\",\"ListItemText\":\"New-AzRecoveryServicesAsrVMNicConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrVMNicConfig\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesAsrVMNicIPConfig\",\"ListItemText\":\"New-AzRecoveryServicesAsrVMNicIPConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesAsrVMNicIPConfig\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"New-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"New-AzRecoveryServicesVault\",\"ListItemText\":\"New-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"New-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"New-AzRedisCache\",\"ListItemText\":\"New-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCache\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheFirewallRule\",\"ListItemText\":\"New-AzRedisCacheFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheKey\",\"ListItemText\":\"New-AzRedisCacheKey\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheKey\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheLink\",\"ListItemText\":\"New-AzRedisCacheLink\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheLink\\r\\n\"},{\"CompletionText\":\"New-AzRedisCachePatchSchedule\",\"ListItemText\":\"New-AzRedisCachePatchSchedule\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCachePatchSchedule\\r\\n\"},{\"CompletionText\":\"New-AzRedisCacheScheduleEntry\",\"ListItemText\":\"New-AzRedisCacheScheduleEntry\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisCacheScheduleEntry\\r\\n\"},{\"CompletionText\":\"New-AzRedisEnterpriseCache\",\"ListItemText\":\"New-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheAccessKey\",\"ListItemText\":\"New-AzRedisEnterpriseCacheAccessKey\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisEnterpriseCacheAccessKey\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"New-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheDatabaseKey\",\"ListItemText\":\"New-AzRedisEnterpriseCacheDatabaseKey\",\"ResultType\":2,\"ToolTip\":\"New-AzRedisEnterpriseCacheDatabaseKey\"},{\"CompletionText\":\"New-AzRedisEnterpriseCacheKey\",\"ListItemText\":\"New-AzRedisEnterpriseCacheKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRedisEnterpriseCacheKey \\r\\n\"},{\"CompletionText\":\"New-AzRelayAuthorizationRule\",\"ListItemText\":\"New-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"New-AzRelayHybridConnection\",\"ListItemText\":\"New-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"New-AzRelayKey\",\"ListItemText\":\"New-AzRelayKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayKey \\r\\n\"},{\"CompletionText\":\"New-AzRelayNamespace\",\"ListItemText\":\"New-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"New-AzRelayNetworkRuleSetIPRuleObject\",\"ListItemText\":\"New-AzRelayNetworkRuleSetIPRuleObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRelayNetworkRuleSetIPRuleObject \\r\\n\"},{\"CompletionText\":\"New-AzResource\",\"ListItemText\":\"New-AzResource\",\"ResultType\":2,\"ToolTip\":\"New-AzResource\\r\\n\"},{\"CompletionText\":\"New-AzResourceGroup\",\"ListItemText\":\"New-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"New-AzResourceGroupDeployment\",\"ListItemText\":\"New-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"New-AzResourceLock\",\"ListItemText\":\"New-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceLock\\r\\n\"},{\"CompletionText\":\"New-AzResourceManagementPrivateLink\",\"ListItemText\":\"New-AzResourceManagementPrivateLink\",\"ResultType\":2,\"ToolTip\":\"New-AzResourceManagementPrivateLink\\r\\n\"},{\"CompletionText\":\"New-AzResourceMoverMoveCollection\",\"ListItemText\":\"New-AzResourceMoverMoveCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzResourceMoverMoveCollection \\r\\n\"},{\"CompletionText\":\"New-AzRestorePoint\",\"ListItemText\":\"New-AzRestorePoint\",\"ResultType\":2,\"ToolTip\":\"New-AzRestorePoint\\r\\n\"},{\"CompletionText\":\"New-AzRestorePointCollection\",\"ListItemText\":\"New-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"New-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"New-AzRmStorageContainer\",\"ListItemText\":\"New-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"New-AzRmStorageShare\",\"ListItemText\":\"New-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"New-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"New-AzRoleAssignment\",\"ListItemText\":\"New-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzRoleAssignmentScheduleRequest\",\"ListItemText\":\"New-AzRoleAssignmentScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRoleAssignmentScheduleRequest \\r\\n\"},{\"CompletionText\":\"New-AzRoleDefinition\",\"ListItemText\":\"New-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"New-AzRoleEligibilityScheduleRequest\",\"ListItemText\":\"New-AzRoleEligibilityScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRoleEligibilityScheduleRequest \\r\\n\"},{\"CompletionText\":\"New-AzRoleManagementPolicyAssignment\",\"ListItemText\":\"New-AzRoleManagementPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzRoleManagementPolicyAssignment \\r\\n\"},{\"CompletionText\":\"New-AzRouteConfig\",\"ListItemText\":\"New-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"New-AzRouteFilter\",\"ListItemText\":\"New-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"New-AzRouteFilterRuleConfig\",\"ListItemText\":\"New-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"New-AzRouteMap\",\"ListItemText\":\"New-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMap\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRule\",\"ListItemText\":\"New-AzRouteMapRule\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRule\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRuleAction\",\"ListItemText\":\"New-AzRouteMapRuleAction\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRuleAction\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRuleActionParameter\",\"ListItemText\":\"New-AzRouteMapRuleActionParameter\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRuleActionParameter\\r\\n\"},{\"CompletionText\":\"New-AzRouteMapRuleCriterion\",\"ListItemText\":\"New-AzRouteMapRuleCriterion\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteMapRuleCriterion\\r\\n\"},{\"CompletionText\":\"New-AzRouteServer\",\"ListItemText\":\"New-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteServer\\r\\n\"},{\"CompletionText\":\"New-AzRouteTable\",\"ListItemText\":\"New-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"New-AzRouteTable\\r\\n\"},{\"CompletionText\":\"New-AzRoutingConfiguration\",\"ListItemText\":\"New-AzRoutingConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzRoutingConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzRoutingIntent\",\"ListItemText\":\"New-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"New-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"New-AzRoutingPolicy\",\"ListItemText\":\"New-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"New-AzScheduledQueryRule\",\"ListItemText\":\"New-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"New-AzScheduledQueryRuleConditionObject\",\"ListItemText\":\"New-AzScheduledQueryRuleConditionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzScheduledQueryRuleConditionObject \\r\\n\"},{\"CompletionText\":\"New-AzScheduledQueryRuleDimensionObject\",\"ListItemText\":\"New-AzScheduledQueryRuleDimensionObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzScheduledQueryRuleDimensionObject \\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomation\",\"ListItemText\":\"New-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationActionObject\",\"ListItemText\":\"New-AzSecurityAutomationActionObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationActionObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationRuleObject\",\"ListItemText\":\"New-AzSecurityAutomationRuleObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationRuleObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationRuleSetObject\",\"ListItemText\":\"New-AzSecurityAutomationRuleSetObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationRuleSetObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationScopeObject\",\"ListItemText\":\"New-AzSecurityAutomationScopeObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationScopeObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityAutomationSourceObject\",\"ListItemText\":\"New-AzSecurityAutomationSourceObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityAutomationSourceObject\\r\\n\"},{\"CompletionText\":\"New-AzSecurityPartnerProvider\",\"ListItemText\":\"New-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"New-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"New-AzSentinelAlertRule\",\"ListItemText\":\"New-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"New-AzSentinelAlertRuleAction\",\"ListItemText\":\"New-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"New-AzSentinelAutomationRule\",\"ListItemText\":\"New-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"New-AzSentinelBookmark\",\"ListItemText\":\"New-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"New-AzSentinelBookmarkRelation\",\"ListItemText\":\"New-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"New-AzSentinelDataConnector\",\"ListItemText\":\"New-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"New-AzSentinelEntityQuery\",\"ListItemText\":\"New-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncident\",\"ListItemText\":\"New-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncidentComment\",\"ListItemText\":\"New-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncidentRelation\",\"ListItemText\":\"New-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"New-AzSentinelIncidentTeam\",\"ListItemText\":\"New-AzSentinelIncidentTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelIncidentTeam \\r\\n\"},{\"CompletionText\":\"New-AzSentinelOnboardingState\",\"ListItemText\":\"New-AzSentinelOnboardingState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSentinelOnboardingState \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusAuthorizationRule\",\"ListItemText\":\"New-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusAuthorizationRuleSASToken\",\"ListItemText\":\"New-AzServiceBusAuthorizationRuleSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceBusAuthorizationRuleSASToken\\r\\n\"},{\"CompletionText\":\"New-AzServiceBusGeoDRConfiguration\",\"ListItemText\":\"New-AzServiceBusGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusIPRuleConfig\",\"ListItemText\":\"New-AzServiceBusIPRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusIPRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusKey\",\"ListItemText\":\"New-AzServiceBusKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusKey \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusKeyVaultPropertiesObject\",\"ListItemText\":\"New-AzServiceBusKeyVaultPropertiesObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusKeyVaultPropertiesObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusNamespace\",\"ListItemText\":\"New-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusNamespaceV2\",\"ListItemText\":\"New-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"New-AzServiceBusQueue\",\"ListItemText\":\"New-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusRule\",\"ListItemText\":\"New-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusSubscription\",\"ListItemText\":\"New-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusTopic\",\"ListItemText\":\"New-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"New-AzServiceBusVirtualNetworkRuleConfig\",\"ListItemText\":\"New-AzServiceBusVirtualNetworkRuleConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceBusVirtualNetworkRuleConfig \\r\\n\"},{\"CompletionText\":\"New-AzServiceEndpointPolicy\",\"ListItemText\":\"New-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"New-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"New-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricApplication\",\"ListItemText\":\"New-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricApplicationType\",\"ListItemText\":\"New-AzServiceFabricApplicationType\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricApplicationType\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricApplicationTypeVersion\",\"ListItemText\":\"New-AzServiceFabricApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricCluster\",\"ListItemText\":\"New-AzServiceFabricCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricCluster\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedCluster\",\"ListItemText\":\"New-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"New-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"New-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"New-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedClusterService\",\"ListItemText\":\"New-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricManagedNodeType\",\"ListItemText\":\"New-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"New-AzServiceFabricService\",\"ListItemText\":\"New-AzServiceFabricService\",\"ResultType\":2,\"ToolTip\":\"New-AzServiceFabricService\\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerAzureResourceObject\",\"ListItemText\":\"New-AzServiceLinkerAzureResourceObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerAzureResourceObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerConfluentBootstrapServerObject\",\"ListItemText\":\"New-AzServiceLinkerConfluentBootstrapServerObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerConfluentBootstrapServerObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerConfluentSchemaRegistryObject\",\"ListItemText\":\"New-AzServiceLinkerConfluentSchemaRegistryObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerConfluentSchemaRegistryObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerForContainerApp\",\"ListItemText\":\"New-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"New-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerForWebApp\",\"ListItemText\":\"New-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerSecretAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerSecretAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerSecretAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerServicePrincipalSecretAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerServicePrincipalSecretAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerServicePrincipalSecretAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerSystemAssignedIdentityAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerSystemAssignedIdentityAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerSystemAssignedIdentityAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzServiceLinkerUserAssignedIdentityAuthInfoObject\",\"ListItemText\":\"New-AzServiceLinkerUserAssignedIdentityAuthInfoObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzServiceLinkerUserAssignedIdentityAuthInfoObject \\r\\n\"},{\"CompletionText\":\"New-AzSignalR\",\"ListItemText\":\"New-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"New-AzSignalR\\r\\n\"},{\"CompletionText\":\"New-AzSignalRKey\",\"ListItemText\":\"New-AzSignalRKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSignalRKey\\r\\n\"},{\"CompletionText\":\"New-AzSnapshot\",\"ListItemText\":\"New-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"New-AzSnapshot\\r\\n\"},{\"CompletionText\":\"New-AzSnapshotConfig\",\"ListItemText\":\"New-AzSnapshotConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSnapshotConfig\\r\\n\"},{\"CompletionText\":\"New-AzSnapshotUpdateConfig\",\"ListItemText\":\"New-AzSnapshotUpdateConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSnapshotUpdateConfig\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabase\",\"ListItemText\":\"New-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseCopy\",\"ListItemText\":\"New-AzSqlDatabaseCopy\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseCopy\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"New-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseExport\",\"ListItemText\":\"New-AzSqlDatabaseExport\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseExport\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"New-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseImport\",\"ListItemText\":\"New-AzSqlDatabaseImport\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseImport\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"New-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseRestorePoint\",\"ListItemText\":\"New-AzSqlDatabaseRestorePoint\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseRestorePoint\\r\\n\"},{\"CompletionText\":\"New-AzSqlDatabaseSecondary\",\"ListItemText\":\"New-AzSqlDatabaseSecondary\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlDatabaseSecondary\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJob\",\"ListItemText\":\"New-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJobAgent\",\"ListItemText\":\"New-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJobCredential\",\"ListItemText\":\"New-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticJobTargetGroup\",\"ListItemText\":\"New-AzSqlElasticJobTargetGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticJobTargetGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlElasticPool\",\"ListItemText\":\"New-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstance\",\"ListItemText\":\"New-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstanceDatabase\",\"ListItemText\":\"New-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstanceLink\",\"ListItemText\":\"New-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstancePool\",\"ListItemText\":\"New-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"New-AzSqlInstanceServerTrustCertificate\",\"ListItemText\":\"New-AzSqlInstanceServerTrustCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlInstanceServerTrustCertificate\\r\\n\"},{\"CompletionText\":\"New-AzSqlServer\",\"ListItemText\":\"New-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServer\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerCommunicationLink\",\"ListItemText\":\"New-AzSqlServerCommunicationLink\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerCommunicationLink\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"New-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerDnsAlias\",\"ListItemText\":\"New-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerFirewallRule\",\"ListItemText\":\"New-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"New-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerOutboundFirewallRule\",\"ListItemText\":\"New-AzSqlServerOutboundFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerOutboundFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerTrustGroup\",\"ListItemText\":\"New-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerTrustGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"New-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncAgent\",\"ListItemText\":\"New-AzSqlSyncAgent\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncAgent\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncAgentKey\",\"ListItemText\":\"New-AzSqlSyncAgentKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncAgentKey\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncGroup\",\"ListItemText\":\"New-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"New-AzSqlSyncMember\",\"ListItemText\":\"New-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"New-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"New-AzSqlVirtualMachineAgReplicaObject\",\"ListItemText\":\"New-AzSqlVirtualMachineAgReplicaObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVirtualMachineAgReplicaObject \\r\\n\"},{\"CompletionText\":\"New-AzSqlVirtualMachineMultiSubnetIPConfigurationObject\",\"ListItemText\":\"New-AzSqlVirtualMachineMultiSubnetIPConfigurationObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVirtualMachineMultiSubnetIPConfigurationObject \\r\\n\"},{\"CompletionText\":\"New-AzSqlVM\",\"ListItemText\":\"New-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVM \\r\\n\"},{\"CompletionText\":\"New-AzSqlVMGroup\",\"ListItemText\":\"New-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"New-AzSshKey\",\"ListItemText\":\"New-AzSshKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSshKey\\r\\n\"},{\"CompletionText\":\"New-AzStackHciArcSetting\",\"ListItemText\":\"New-AzStackHciArcSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStackHciArcSetting \\r\\n\"},{\"CompletionText\":\"New-AzStackHciCluster\",\"ListItemText\":\"New-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"New-AzStackHciExtension\",\"ListItemText\":\"New-AzStackHciExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStackHciExtension \\r\\n\"},{\"CompletionText\":\"New-AzStaticRoute\",\"ListItemText\":\"New-AzStaticRoute\",\"ResultType\":2,\"ToolTip\":\"New-AzStaticRoute\\r\\n\"},{\"CompletionText\":\"New-AzStaticWebApp\",\"ListItemText\":\"New-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppBuildAppSetting\",\"ListItemText\":\"New-AzStaticWebAppBuildAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppBuildAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppBuildFunctionAppSetting\",\"ListItemText\":\"New-AzStaticWebAppBuildFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppBuildFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppCustomDomain\",\"ListItemText\":\"New-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppFunctionAppSetting\",\"ListItemText\":\"New-AzStaticWebAppFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppSetting\",\"ListItemText\":\"New-AzStaticWebAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppSetting \\r\\n\"},{\"CompletionText\":\"New-AzStaticWebAppUserRoleInvitationLink\",\"ListItemText\":\"New-AzStaticWebAppUserRoleInvitationLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStaticWebAppUserRoleInvitationLink \\r\\n\"},{\"CompletionText\":\"New-AzStorageAccount\",\"ListItemText\":\"New-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountKey\",\"ListItemText\":\"New-AzStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountKey\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountManagementPolicyBlobIndexMatchObject\",\"ListItemText\":\"New-AzStorageAccountManagementPolicyBlobIndexMatchObject\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountManagementPolicyBlobIndexMatchObject\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountManagementPolicyFilter\",\"ListItemText\":\"New-AzStorageAccountManagementPolicyFilter\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountManagementPolicyFilter\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountManagementPolicyRule\",\"ListItemText\":\"New-AzStorageAccountManagementPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountManagementPolicyRule\\r\\n\"},{\"CompletionText\":\"New-AzStorageAccountSASToken\",\"ListItemText\":\"New-AzStorageAccountSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageAccountSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobInventoryPolicyRule\",\"ListItemText\":\"New-AzStorageBlobInventoryPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobInventoryPolicyRule\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobQueryConfig\",\"ListItemText\":\"New-AzStorageBlobQueryConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobQueryConfig\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobRangeToRestore\",\"ListItemText\":\"New-AzStorageBlobRangeToRestore\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobRangeToRestore\\r\\n\"},{\"CompletionText\":\"New-AzStorageBlobSASToken\",\"ListItemText\":\"New-AzStorageBlobSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageBlobSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageContainer\",\"ListItemText\":\"New-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"New-AzStorageContainerSASToken\",\"ListItemText\":\"New-AzStorageContainerSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContainerSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStorageContext\",\"ListItemText\":\"New-AzStorageContext\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageContext\\r\\n\"},{\"CompletionText\":\"New-AzStorageDirectory\",\"ListItemText\":\"New-AzStorageDirectory\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageDirectory\\r\\n\"},{\"CompletionText\":\"New-AzStorageEncryptionScope\",\"ListItemText\":\"New-AzStorageEncryptionScope\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageEncryptionScope\\r\\n\"},{\"CompletionText\":\"New-AzStorageFileSASToken\",\"ListItemText\":\"New-AzStorageFileSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageFileSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageLocalUserPermissionScope\",\"ListItemText\":\"New-AzStorageLocalUserPermissionScope\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageLocalUserPermissionScope\\r\\n\"},{\"CompletionText\":\"New-AzStorageLocalUserSshPassword\",\"ListItemText\":\"New-AzStorageLocalUserSshPassword\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageLocalUserSshPassword\\r\\n\"},{\"CompletionText\":\"New-AzStorageLocalUserSshPublicKey\",\"ListItemText\":\"New-AzStorageLocalUserSshPublicKey\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageLocalUserSshPublicKey\\r\\n\"},{\"CompletionText\":\"New-AzStorageMover\",\"ListItemText\":\"New-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMover \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverAzStorageContainerEndpoint\",\"ListItemText\":\"New-AzStorageMoverAzStorageContainerEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverAzStorageContainerEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverJobDefinition\",\"ListItemText\":\"New-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverNfsEndpoint\",\"ListItemText\":\"New-AzStorageMoverNfsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverNfsEndpoint \\r\\n\"},{\"CompletionText\":\"New-AzStorageMoverProject\",\"ListItemText\":\"New-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"New-AzStorageObjectReplicationPolicyRule\",\"ListItemText\":\"New-AzStorageObjectReplicationPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageObjectReplicationPolicyRule\\r\\n\"},{\"CompletionText\":\"New-AzStorageQueue\",\"ListItemText\":\"New-AzStorageQueue\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageQueue\\r\\n\"},{\"CompletionText\":\"New-AzStorageQueueSASToken\",\"ListItemText\":\"New-AzStorageQueueSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageQueueSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStorageShare\",\"ListItemText\":\"New-AzStorageShare\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageShare\\r\\n\"},{\"CompletionText\":\"New-AzStorageShareSASToken\",\"ListItemText\":\"New-AzStorageShareSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageShareSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncCloudEndpoint\",\"ListItemText\":\"New-AzStorageSyncCloudEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncCloudEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncGroup\",\"ListItemText\":\"New-AzStorageSyncGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncGroup\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncServerEndpoint\",\"ListItemText\":\"New-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzStorageSyncService\",\"ListItemText\":\"New-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"New-AzStorageTable\",\"ListItemText\":\"New-AzStorageTable\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageTable\\r\\n\"},{\"CompletionText\":\"New-AzStorageTableSASToken\",\"ListItemText\":\"New-AzStorageTableSASToken\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageTableSASToken\\r\\n\"},{\"CompletionText\":\"New-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"New-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsCluster\",\"ListItemText\":\"New-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsFunction\",\"ListItemText\":\"New-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsInput\",\"ListItemText\":\"New-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsJob\",\"ListItemText\":\"New-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsOutput\",\"ListItemText\":\"New-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"New-AzStreamAnalyticsTransformation\",\"ListItemText\":\"New-AzStreamAnalyticsTransformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzStreamAnalyticsTransformation \\r\\n\"},{\"CompletionText\":\"New-AzSubscriptionDeployment\",\"ListItemText\":\"New-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzSubscriptionDeployment\"},{\"CompletionText\":\"New-AzSubscriptionDiagnosticSetting\",\"ListItemText\":\"New-AzSubscriptionDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSubscriptionDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"New-AzSupportContactProfileObject\",\"ListItemText\":\"New-AzSupportContactProfileObject\",\"ResultType\":2,\"ToolTip\":\"New-AzSupportContactProfileObject\\r\\n\"},{\"CompletionText\":\"New-AzSupportTicket\",\"ListItemText\":\"New-AzSupportTicket\",\"ResultType\":2,\"ToolTip\":\"New-AzSupportTicket\\r\\n\"},{\"CompletionText\":\"New-AzSupportTicketCommunication\",\"ListItemText\":\"New-AzSupportTicketCommunication\",\"ResultType\":2,\"ToolTip\":\"New-AzSupportTicketCommunication\\r\\n\"},{\"CompletionText\":\"New-AzSynapseDataFlow\",\"ListItemText\":\"New-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseDataFlow\"},{\"CompletionText\":\"New-AzSynapseDataset\",\"ListItemText\":\"New-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseDataset\"},{\"CompletionText\":\"New-AzSynapseFirewallRule\",\"ListItemText\":\"New-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"New-AzSynapseGitRepositoryConfig\",\"ListItemText\":\"New-AzSynapseGitRepositoryConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseGitRepositoryConfig\\r\\n\"},{\"CompletionText\":\"New-AzSynapseIntegrationRuntimeKey\",\"ListItemText\":\"New-AzSynapseIntegrationRuntimeKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseIntegrationRuntimeKey\\r\\n\"},{\"CompletionText\":\"New-AzSynapseKqlScript\",\"ListItemText\":\"New-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPool\",\"ListItemText\":\"New-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ListItemText\":\"New-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"New-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ListItemText\":\"New-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"New-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"New-AzSynapseKustoPoolPrincipalAssignment\",\"ListItemText\":\"New-AzSynapseKustoPoolPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzSynapseKustoPoolPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"New-AzSynapseLinkConnection\",\"ListItemText\":\"New-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseLinkConnection\"},{\"CompletionText\":\"New-AzSynapseLinkedService\",\"ListItemText\":\"New-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseLinkedService\"},{\"CompletionText\":\"New-AzSynapseLinkedServiceEncryptedCredential\",\"ListItemText\":\"New-AzSynapseLinkedServiceEncryptedCredential\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseLinkedServiceEncryptedCredential\\r\\n\"},{\"CompletionText\":\"New-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"New-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseManagedPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzSynapseManagedVirtualNetworkConfig\",\"ListItemText\":\"New-AzSynapseManagedVirtualNetworkConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseManagedVirtualNetworkConfig\\r\\n\"},{\"CompletionText\":\"New-AzSynapseNotebook\",\"ListItemText\":\"New-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseNotebook\"},{\"CompletionText\":\"New-AzSynapsePipeline\",\"ListItemText\":\"New-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapsePipeline\"},{\"CompletionText\":\"New-AzSynapseRoleAssignment\",\"ListItemText\":\"New-AzSynapseRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseRoleAssignment\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSparkConfiguration\",\"ListItemText\":\"New-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSparkJobDefinition\",\"ListItemText\":\"New-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSparkJobDefinition\"},{\"CompletionText\":\"New-AzSynapseSparkPool\",\"ListItemText\":\"New-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlDatabase\",\"ListItemText\":\"New-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlPool\",\"ListItemText\":\"New-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlPoolRestorePoint\",\"ListItemText\":\"New-AzSynapseSqlPoolRestorePoint\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlPoolRestorePoint\\r\\n\"},{\"CompletionText\":\"New-AzSynapseSqlScript\",\"ListItemText\":\"New-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseSqlScript\"},{\"CompletionText\":\"New-AzSynapseTrigger\",\"ListItemText\":\"New-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseTrigger\"},{\"CompletionText\":\"New-AzSynapseWorkspace\",\"ListItemText\":\"New-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"New-AzSynapseWorkspaceKey\",\"ListItemText\":\"New-AzSynapseWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseWorkspaceKey\\r\\n\"},{\"CompletionText\":\"New-AzSynapseWorkspacePackage\",\"ListItemText\":\"New-AzSynapseWorkspacePackage\",\"ResultType\":2,\"ToolTip\":\"New-AzSynapseWorkspacePackage\\r\\n\"},{\"CompletionText\":\"New-AzTag\",\"ListItemText\":\"New-AzTag\",\"ResultType\":2,\"ToolTip\":\"New-AzTag\\r\\n\"},{\"CompletionText\":\"New-AzTemplateSpec\",\"ListItemText\":\"New-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"New-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"New-AzTenantDeployment\",\"ListItemText\":\"New-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"New-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"New-AzTrafficManagerEndpoint\",\"ListItemText\":\"New-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"New-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"New-AzTrafficManagerProfile\",\"ListItemText\":\"New-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"New-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"New-AzUserAssignedIdentity\",\"ListItemText\":\"New-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"New-AzVHubRoute\",\"ListItemText\":\"New-AzVHubRoute\",\"ResultType\":2,\"ToolTip\":\"New-AzVHubRoute\\r\\n\"},{\"CompletionText\":\"New-AzVHubRouteTable\",\"ListItemText\":\"New-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"New-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"New-AzVirtualApplianceAdditionalNicProperty\",\"ListItemText\":\"New-AzVirtualApplianceAdditionalNicProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualApplianceAdditionalNicProperty\\r\\n\"},{\"CompletionText\":\"New-AzVirtualApplianceSite\",\"ListItemText\":\"New-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"New-AzVirtualApplianceSkuProperty\",\"ListItemText\":\"New-AzVirtualApplianceSkuProperty\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualApplianceSkuProperty\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHub\",\"ListItemText\":\"New-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubBgpConnection\",\"ListItemText\":\"New-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubRoute\",\"ListItemText\":\"New-AzVirtualHubRoute\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubRoute\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubRouteTable\",\"ListItemText\":\"New-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"New-AzVirtualHubVnetConnection\",\"ListItemText\":\"New-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetwork\",\"ListItemText\":\"New-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGateway\",\"ListItemText\":\"New-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"New-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayIpConfig\",\"ListItemText\":\"New-AzVirtualNetworkGatewayIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"New-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayPolicyGroup\",\"ListItemText\":\"New-AzVirtualNetworkGatewayPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayPolicyGroup\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkGatewayPolicyGroupMember\",\"ListItemText\":\"New-AzVirtualNetworkGatewayPolicyGroupMember\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkGatewayPolicyGroupMember\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"New-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"New-AzVirtualNetworkTap\",\"ListItemText\":\"New-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"New-AzVirtualRouter\",\"ListItemText\":\"New-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"New-AzVirtualRouterAutoScaleConfiguration\",\"ListItemText\":\"New-AzVirtualRouterAutoScaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualRouterAutoScaleConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVirtualWan\",\"ListItemText\":\"New-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"New-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"New-AzVM\",\"ListItemText\":\"New-AzVM\",\"ResultType\":2,\"ToolTip\":\"New-AzVM\\r\\n\"},{\"CompletionText\":\"New-AzVMConfig\",\"ListItemText\":\"New-AzVMConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMConfig\\r\\n\"},{\"CompletionText\":\"New-AzVMDataDisk\",\"ListItemText\":\"New-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"New-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"New-AzVmGalleryApplication\",\"ListItemText\":\"New-AzVmGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzVmGalleryApplication\\r\\n\"},{\"CompletionText\":\"New-AzVMSqlServerAutoBackupConfig\",\"ListItemText\":\"New-AzVMSqlServerAutoBackupConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMSqlServerAutoBackupConfig\\r\\n\"},{\"CompletionText\":\"New-AzVMSqlServerAutoPatchingConfig\",\"ListItemText\":\"New-AzVMSqlServerAutoPatchingConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMSqlServerAutoPatchingConfig\\r\\n\"},{\"CompletionText\":\"New-AzVMSqlServerKeyVaultCredentialConfig\",\"ListItemText\":\"New-AzVMSqlServerKeyVaultCredentialConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVMSqlServerKeyVaultCredentialConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmss\",\"ListItemText\":\"New-AzVmss\",\"ResultType\":2,\"ToolTip\":\"New-AzVmss\\r\\n\"},{\"CompletionText\":\"New-AzVmssConfig\",\"ListItemText\":\"New-AzVmssConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmssGalleryApplication\",\"ListItemText\":\"New-AzVmssGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssGalleryApplication\\r\\n\"},{\"CompletionText\":\"New-AzVmssIpConfig\",\"ListItemText\":\"New-AzVmssIpConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssIpConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmssIpTagConfig\",\"ListItemText\":\"New-AzVmssIpTagConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssIpTagConfig\\r\\n\"},{\"CompletionText\":\"New-AzVmssVaultCertificateConfig\",\"ListItemText\":\"New-AzVmssVaultCertificateConfig\",\"ResultType\":2,\"ToolTip\":\"New-AzVmssVaultCertificateConfig\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientConfiguration\",\"ListItemText\":\"New-AzVpnClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientConnectionConfiguration\",\"ListItemText\":\"New-AzVpnClientConnectionConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientConnectionConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientIpsecParameter\",\"ListItemText\":\"New-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientIpsecPolicy\",\"ListItemText\":\"New-AzVpnClientIpsecPolicy\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientIpsecPolicy\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientRevokedCertificate\",\"ListItemText\":\"New-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"New-AzVpnClientRootCertificate\",\"ListItemText\":\"New-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"New-AzVpnConnection\",\"ListItemText\":\"New-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"New-AzVpnGateway\",\"ListItemText\":\"New-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"New-AzVpnGatewayNatRule\",\"ListItemText\":\"New-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"New-AzVpnServerConfiguration\",\"ListItemText\":\"New-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"New-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"New-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"New-AzVpnSite\",\"ListItemText\":\"New-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnSite\\r\\n\"},{\"CompletionText\":\"New-AzVpnSiteLink\",\"ListItemText\":\"New-AzVpnSiteLink\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnSiteLink\\r\\n\"},{\"CompletionText\":\"New-AzVpnSiteLinkConnection\",\"ListItemText\":\"New-AzVpnSiteLinkConnection\",\"ResultType\":2,\"ToolTip\":\"New-AzVpnSiteLinkConnection\\r\\n\"},{\"CompletionText\":\"New-AzWcfRelay\",\"ListItemText\":\"New-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"New-AzWebApp\",\"ListItemText\":\"New-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"New-AzWebApp\\r\\n\"},{\"CompletionText\":\"New-AzWebAppAzureStoragePath\",\"ListItemText\":\"New-AzWebAppAzureStoragePath\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppAzureStoragePath\\r\\n\"},{\"CompletionText\":\"New-AzWebAppBackup\",\"ListItemText\":\"New-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"New-AzWebAppCertificate\",\"ListItemText\":\"New-AzWebAppCertificate\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppCertificate\\r\\n\"},{\"CompletionText\":\"New-AzWebAppDatabaseBackupSetting\",\"ListItemText\":\"New-AzWebAppDatabaseBackupSetting\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppDatabaseBackupSetting\\r\\n\"},{\"CompletionText\":\"New-AzWebAppSlot\",\"ListItemText\":\"New-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"New-AzWebAppSSLBinding\",\"ListItemText\":\"New-AzWebAppSSLBinding\",\"ResultType\":2,\"ToolTip\":\"New-AzWebAppSSLBinding\\r\\n\"},{\"CompletionText\":\"New-AzWebPubSub\",\"ListItemText\":\"New-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubCustomCertificate\",\"ListItemText\":\"New-AzWebPubSubCustomCertificate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubCustomCertificate \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubCustomDomain\",\"ListItemText\":\"New-AzWebPubSubCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubCustomDomain \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubEventHubEndpointObject\",\"ListItemText\":\"New-AzWebPubSubEventHubEndpointObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubEventHubEndpointObject \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubEventNameFilterObject\",\"ListItemText\":\"New-AzWebPubSubEventNameFilterObject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubEventNameFilterObject \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubHub\",\"ListItemText\":\"New-AzWebPubSubHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubHub \\r\\n\"},{\"CompletionText\":\"New-AzWebPubSubKey\",\"ListItemText\":\"New-AzWebPubSubKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWebPubSubKey \\r\\n\"},{\"CompletionText\":\"New-AzWvdApplication\",\"ListItemText\":\"New-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"New-AzWvdApplicationGroup\",\"ListItemText\":\"New-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"New-AzWvdHostPool\",\"ListItemText\":\"New-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"New-AzWvdMsixPackage\",\"ListItemText\":\"New-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"New-AzWvdRegistrationInfo\",\"ListItemText\":\"New-AzWvdRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdRegistrationInfo \\r\\n\"},{\"CompletionText\":\"New-AzWvdScalingPlan\",\"ListItemText\":\"New-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"New-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"New-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"New-AzWvdWorkspace\",\"ListItemText\":\"New-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"New-BcdEntry\",\"ListItemText\":\"New-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"New-BcdEntry\\r\\n\"},{\"CompletionText\":\"New-BcdStore\",\"ListItemText\":\"New-BcdStore\",\"ResultType\":2,\"ToolTip\":\"New-BcdStore\\r\\n\"},{\"CompletionText\":\"New-CertificateNotificationTask\",\"ListItemText\":\"New-CertificateNotificationTask\",\"ResultType\":2,\"ToolTip\":\"New-CertificateNotificationTask\\r\\n\"},{\"CompletionText\":\"New-CimInstance\",\"ListItemText\":\"New-CimInstance\",\"ResultType\":2,\"ToolTip\":\"New-CimInstance\\r\\n\"},{\"CompletionText\":\"New-CimSession\",\"ListItemText\":\"New-CimSession\",\"ResultType\":2,\"ToolTip\":\"New-CimSession\\r\\n\"},{\"CompletionText\":\"New-CimSessionOption\",\"ListItemText\":\"New-CimSessionOption\",\"ResultType\":2,\"ToolTip\":\"New-CimSessionOption\\r\\n\"},{\"CompletionText\":\"New-CIPolicy\",\"ListItemText\":\"New-CIPolicy\",\"ResultType\":2,\"ToolTip\":\"New-CIPolicy\\r\\n\"},{\"CompletionText\":\"New-CIPolicyRule\",\"ListItemText\":\"New-CIPolicyRule\",\"ResultType\":2,\"ToolTip\":\"New-CIPolicyRule\\r\\n\"},{\"CompletionText\":\"New-DAEntryPointTableItem\",\"ListItemText\":\"New-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"New-DscChecksum\",\"ListItemText\":\"New-DscChecksum\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-DscChecksum \\r\\n\"},{\"CompletionText\":\"New-DtcDiagnosticTransaction\",\"ListItemText\":\"New-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"New-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"New-EapConfiguration\",\"ListItemText\":\"New-EapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-EapConfiguration \\r\\n\"},{\"CompletionText\":\"New-EtwTraceSession\",\"ListItemText\":\"New-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"New-Event\",\"ListItemText\":\"New-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Event [-SourceIdentifier] [[-Sender] ] [[-EventArguments] ] [[-MessageData] ] []\\r\\n\"},{\"CompletionText\":\"New-FileCatalog\",\"ListItemText\":\"New-FileCatalog\",\"ResultType\":2,\"ToolTip\":\"New-FileCatalog\\r\\n\"},{\"CompletionText\":\"New-FileShare\",\"ListItemText\":\"New-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-FileShare \\r\\n\"},{\"CompletionText\":\"New-Fixture\",\"ListItemText\":\"New-Fixture\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Fixture \\r\\n\"},{\"CompletionText\":\"New-GitPromptSettings\",\"ListItemText\":\"New-GitPromptSettings\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-GitPromptSettings \\r\\n\"},{\"CompletionText\":\"New-Guid\",\"ListItemText\":\"New-Guid\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Guid []\\r\\n\"},{\"CompletionText\":\"New-HgsGuardian\",\"ListItemText\":\"New-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-HgsGuardian \\r\\n\"},{\"CompletionText\":\"New-HgsKeyProtector\",\"ListItemText\":\"New-HgsKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-HgsKeyProtector \\r\\n\"},{\"CompletionText\":\"New-HgsTraceTarget\",\"ListItemText\":\"New-HgsTraceTarget\",\"ResultType\":2,\"ToolTip\":\"New-HgsTraceTarget\\r\\n\"},{\"CompletionText\":\"New-IscsiTargetPortal\",\"ListItemText\":\"New-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"New-IseSnippet\",\"ListItemText\":\"New-IseSnippet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-IseSnippet \\r\\n\"},{\"CompletionText\":\"New-Item\",\"ListItemText\":\"New-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Item [-Path] [-ItemType ] [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nNew-Item [[-Path] ] -Name [-ItemType ] [-Value ] [-Force] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-ItemProperty\",\"ListItemText\":\"New-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ItemProperty [-Path] [-Name] [-PropertyType ] [-Value ] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nNew-ItemProperty [-Name] -LiteralPath [-PropertyType ] [-Value ] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-JobTrigger\",\"ListItemText\":\"New-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"New-JobTrigger\\r\\n\"},{\"CompletionText\":\"New-LocalGroup\",\"ListItemText\":\"New-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"New-LocalGroup\\r\\n\"},{\"CompletionText\":\"New-LocalUser\",\"ListItemText\":\"New-LocalUser\",\"ResultType\":2,\"ToolTip\":\"New-LocalUser\\r\\n\"},{\"CompletionText\":\"New-MaskingSet\",\"ListItemText\":\"New-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-MaskingSet \\r\\n\"},{\"CompletionText\":\"New-Module\",\"ListItemText\":\"New-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Module [-ScriptBlock] [-Function ] [-Cmdlet ] [-ReturnResult] [-AsCustomObject] [-ArgumentList ] []\\r\\n\\r\\nNew-Module [-Name] [-ScriptBlock] [-Function ] [-Cmdlet ] [-ReturnResult] [-AsCustomObject] [-ArgumentList ] []\\r\\n\"},{\"CompletionText\":\"New-ModuleManifest\",\"ListItemText\":\"New-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ModuleManifest [-Path] [-NestedModules ] [-Guid ] [-Author ] [-CompanyName ] [-Copyright ] [-RootModule ] [-ModuleVersion ] [-Description ] [-ProcessorArchitecture ] [-PowerShellVersion ] [-ClrVersion ] [-DotNetFrameworkVersion ] [-PowerShellHostName ] [-PowerShellHostVersion ] [-RequiredModules ] [-TypesToProcess ] [-FormatsToProcess ] [-ScriptsToProcess ] [-RequiredAssemblies ] [-FileList ] [-ModuleList ] [-FunctionsToExport ] [-AliasesToExport ] [-VariablesToExport ] [-CmdletsToExport ] [-DscResourcesToExport ] [-CompatiblePSEditions ] [-PrivateData ] [-Tags ] [-ProjectUri ] [-LicenseUri ] [-IconUri ] [-ReleaseNotes ] [-Prerelease ] [-RequireLicenseAcceptance] [-ExternalModuleDependencies ] [-HelpInfoUri ] [-PassThru] [-DefaultCommandPrefix ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-MpPerformanceRecording\",\"ListItemText\":\"New-MpPerformanceRecording\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-MpPerformanceRecording \\r\\n\"},{\"CompletionText\":\"New-NetAdapterAdvancedProperty\",\"ListItemText\":\"New-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"New-NetEventSession\",\"ListItemText\":\"New-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetEventSession \\r\\n\"},{\"CompletionText\":\"New-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"New-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"New-NetFirewallHyperVProfile\",\"ListItemText\":\"New-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"New-NetFirewallHyperVRule\",\"ListItemText\":\"New-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"New-NetFirewallHyperVVMSetting\",\"ListItemText\":\"New-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"New-NetFirewallRule\",\"ListItemText\":\"New-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"New-NetIPAddress\",\"ListItemText\":\"New-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPAddress \\r\\n\"},{\"CompletionText\":\"New-NetIPHttpsConfiguration\",\"ListItemText\":\"New-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"New-NetIPsecAuthProposal\",\"ListItemText\":\"New-NetIPsecAuthProposal\",\"ResultType\":2,\"ToolTip\":\"New-NetIPsecAuthProposal\\r\\n\"},{\"CompletionText\":\"New-NetIPsecDospSetting\",\"ListItemText\":\"New-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"New-NetIPsecMainModeCryptoProposal\",\"ListItemText\":\"New-NetIPsecMainModeCryptoProposal\",\"ResultType\":2,\"ToolTip\":\"New-NetIPsecMainModeCryptoProposal\\r\\n\"},{\"CompletionText\":\"New-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"New-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecMainModeRule\",\"ListItemText\":\"New-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"New-NetIPsecPhase1AuthSet\",\"ListItemText\":\"New-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecPhase2AuthSet\",\"ListItemText\":\"New-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecQuickModeCryptoProposal\",\"ListItemText\":\"New-NetIPsecQuickModeCryptoProposal\",\"ResultType\":2,\"ToolTip\":\"New-NetIPsecQuickModeCryptoProposal\\r\\n\"},{\"CompletionText\":\"New-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"New-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"New-NetIPsecRule\",\"ListItemText\":\"New-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"New-NetLbfoTeam\",\"ListItemText\":\"New-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"New-NetNat\",\"ListItemText\":\"New-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetNat \\r\\n\"},{\"CompletionText\":\"New-NetNatTransitionConfiguration\",\"ListItemText\":\"New-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"New-NetNeighbor\",\"ListItemText\":\"New-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetNeighbor \\r\\n\"},{\"CompletionText\":\"New-NetQosPolicy\",\"ListItemText\":\"New-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"New-NetRoute\",\"ListItemText\":\"New-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetRoute \\r\\n\"},{\"CompletionText\":\"New-NetSwitchTeam\",\"ListItemText\":\"New-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"New-NetTransportFilter\",\"ListItemText\":\"New-NetTransportFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetTransportFilter \\r\\n\"},{\"CompletionText\":\"New-NetworkSwitchVlan\",\"ListItemText\":\"New-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"New-Object\",\"ListItemText\":\"New-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Object [-TypeName] [[-ArgumentList] ] [-Property ] []\\r\\n\\r\\nNew-Object [-ComObject] [-Strict] [-Property ] []\\r\\n\"},{\"CompletionText\":\"New-Partition\",\"ListItemText\":\"New-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Partition \\r\\n\"},{\"CompletionText\":\"New-PesterOption\",\"ListItemText\":\"New-PesterOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PesterOption \\r\\n\"},{\"CompletionText\":\"New-PmemDedicatedMemory\",\"ListItemText\":\"New-PmemDedicatedMemory\",\"ResultType\":2,\"ToolTip\":\"New-PmemDedicatedMemory\\r\\n\"},{\"CompletionText\":\"New-PmemDisk\",\"ListItemText\":\"New-PmemDisk\",\"ResultType\":2,\"ToolTip\":\"New-PmemDisk\\r\\n\"},{\"CompletionText\":\"New-ProvisioningRepro\",\"ListItemText\":\"New-ProvisioningRepro\",\"ResultType\":2,\"ToolTip\":\"New-ProvisioningRepro\\r\\n\"},{\"CompletionText\":\"New-PSDrive\",\"ListItemText\":\"New-PSDrive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSDrive [-Name] [-PSProvider] [-Root] [-Description ] [-Scope ] [-Persist] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-PSRoleCapabilityFile\",\"ListItemText\":\"New-PSRoleCapabilityFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSRoleCapabilityFile [-Path] [-Guid ] [-Author ] [-Description ] [-CompanyName ] [-Copyright ] [-ModulesToImport ] [-VisibleAliases ] [-VisibleCmdlets ] [-VisibleFunctions ] [-VisibleExternalCommands ] [-VisibleProviders ] [-ScriptsToProcess ] [-AliasDefinitions ] [-FunctionDefinitions ] [-VariableDefinitions ] [-EnvironmentVariables ] [-TypesToProcess ] [-FormatsToProcess ] [-AssembliesToLoad ] []\\r\\n\"},{\"CompletionText\":\"New-PSScriptFileInfo\",\"ListItemText\":\"New-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"New-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"New-PSSession\",\"ListItemText\":\"New-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSSession [[-ComputerName] ] [-Credential ] [-Name ] [-EnableNetworkAccess] [-ConfigurationName ] [-Port ] [-UseSSL] [-ApplicationName ] [-ThrottleLimit ] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nNew-PSSession [-ConnectionUri] [-Credential ] [-Name ] [-EnableNetworkAccess] [-ConfigurationName ] [-ThrottleLimit ] [-AllowRedirection] [-SessionOption ] [-Authentication ] [-CertificateThumbprint ] []\\r\\n\\r\\nNew-PSSession [-VMId] -Credential [-Name ] [-ConfigurationName ] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession -Credential -VMName [-Name ] [-ConfigurationName ] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession [[-Session] ] [-Name ] [-EnableNetworkAccess] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession -ContainerId [-Name ] [-ConfigurationName ] [-RunAsAdministrator] [-ThrottleLimit ] []\\r\\n\\r\\nNew-PSSession -UseWindowsPowerShell [-Name ] []\\r\\n\\r\\nNew-PSSession [-HostName] [-Name ] [-Port ] [-UserName ] [-KeyFilePath ] [-Subsystem ] [-ConnectingTimeout ] [-SSHTransport] [-Options ] []\\r\\n\\r\\nNew-PSSession -SSHConnection [-Name ] []\\r\\n\"},{\"CompletionText\":\"New-PSSessionConfigurationFile\",\"ListItemText\":\"New-PSSessionConfigurationFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSSessionConfigurationFile [-Path] [-SchemaVersion ] [-Guid ] [-Author ] [-Description ] [-CompanyName ] [-Copyright ] [-SessionType ] [-TranscriptDirectory ] [-RunAsVirtualAccount] [-RunAsVirtualAccountGroups ] [-MountUserDrive] [-UserDriveMaximumSize ] [-GroupManagedServiceAccount ] [-ScriptsToProcess ] [-RoleDefinitions ] [-RequiredGroups ] [-LanguageMode ] [-ExecutionPolicy ] [-PowerShellVersion ] [-ModulesToImport ] [-VisibleAliases ] [-VisibleCmdlets ] [-VisibleFunctions ] [-VisibleExternalCommands ] [-VisibleProviders ] [-AliasDefinitions ] [-FunctionDefinitions ] [-VariableDefinitions ] [-EnvironmentVariables ] [-TypesToProcess ] [-FormatsToProcess ] [-AssembliesToLoad ] [-Full] []\\r\\n\"},{\"CompletionText\":\"New-PSSessionOption\",\"ListItemText\":\"New-PSSessionOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSSessionOption [-MaximumRedirection ] [-NoCompression] [-NoMachineProfile] [-Culture ] [-UICulture ] [-MaximumReceivedDataSizePerCommand ] [-MaximumReceivedObjectSize ] [-OutputBufferingMode ] [-MaxConnectionRetryCount ] [-ApplicationArguments ] [-OpenTimeout ] [-CancelTimeout ] [-IdleTimeout ] [-ProxyAccessType ] [-ProxyAuthentication ] [-ProxyCredential ] [-SkipCACheck] [-SkipCNCheck] [-SkipRevocationCheck] [-OperationTimeout ] [-NoEncryption] [-UseUTF16] [-IncludePortInSPN] []\\r\\n\"},{\"CompletionText\":\"New-PSTransportOption\",\"ListItemText\":\"New-PSTransportOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSTransportOption [-MaxIdleTimeoutSec ] [-ProcessIdleTimeoutSec ] [-MaxSessions ] [-MaxConcurrentCommandsPerSession ] [-MaxSessionsPerUser ] [-MaxMemoryPerSessionMB ] [-MaxProcessesPerSession ] [-MaxConcurrentUsers ] [-IdleTimeoutSec ] [-OutputBufferingMode ] []\\r\\n\"},{\"CompletionText\":\"New-PSWorkflowExecutionOption\",\"ListItemText\":\"New-PSWorkflowExecutionOption\",\"ResultType\":2,\"ToolTip\":\"New-PSWorkflowExecutionOption\\r\\n\"},{\"CompletionText\":\"New-PSWorkflowSession\",\"ListItemText\":\"New-PSWorkflowSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-PSWorkflowSession \\r\\n\"},{\"CompletionText\":\"New-ScheduledJobOption\",\"ListItemText\":\"New-ScheduledJobOption\",\"ResultType\":2,\"ToolTip\":\"New-ScheduledJobOption\\r\\n\"},{\"CompletionText\":\"New-ScheduledTask\",\"ListItemText\":\"New-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTask \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskAction\",\"ListItemText\":\"New-ScheduledTaskAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskAction \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskPrincipal\",\"ListItemText\":\"New-ScheduledTaskPrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskPrincipal \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskSettingsSet\",\"ListItemText\":\"New-ScheduledTaskSettingsSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskSettingsSet \\r\\n\"},{\"CompletionText\":\"New-ScheduledTaskTrigger\",\"ListItemText\":\"New-ScheduledTaskTrigger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScheduledTaskTrigger \\r\\n\"},{\"CompletionText\":\"New-ScriptFileInfo\",\"ListItemText\":\"New-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"New-SelfSignedCertificate\",\"ListItemText\":\"New-SelfSignedCertificate\",\"ResultType\":2,\"ToolTip\":\"New-SelfSignedCertificate\\r\\n\"},{\"CompletionText\":\"New-Service\",\"ListItemText\":\"New-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Service [-Name] [-BinaryPathName] [-DisplayName ] [-Description ] [-StartupType ] [-Credential ] [-SecurityDescriptorSddl ] [-DependsOn ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-SmbClientCertificateMapping\",\"ListItemText\":\"New-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"New-SmbGlobalMapping\",\"ListItemText\":\"New-SmbGlobalMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbGlobalMapping \\r\\n\"},{\"CompletionText\":\"New-SmbMapping\",\"ListItemText\":\"New-SmbMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbMapping \\r\\n\"},{\"CompletionText\":\"New-SmbMultichannelConstraint\",\"ListItemText\":\"New-SmbMultichannelConstraint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbMultichannelConstraint \\r\\n\"},{\"CompletionText\":\"New-SmbServerCertificateMapping\",\"ListItemText\":\"New-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"New-SmbShare\",\"ListItemText\":\"New-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-SmbShare \\r\\n\"},{\"CompletionText\":\"New-StorageBusBinding\",\"ListItemText\":\"New-StorageBusBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageBusBinding \\r\\n\"},{\"CompletionText\":\"New-StorageBusCacheStore\",\"ListItemText\":\"New-StorageBusCacheStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageBusCacheStore \\r\\n\"},{\"CompletionText\":\"New-StorageFileServer\",\"ListItemText\":\"New-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageFileServer \\r\\n\"},{\"CompletionText\":\"New-StoragePool\",\"ListItemText\":\"New-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StoragePool \\r\\n\"},{\"CompletionText\":\"New-StorageSubsystemVirtualDisk\",\"ListItemText\":\"New-StorageSubsystemVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageSubsystemVirtualDisk \\r\\n\"},{\"CompletionText\":\"New-StorageTier\",\"ListItemText\":\"New-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-StorageTier \\r\\n\"},{\"CompletionText\":\"New-TemporaryFile\",\"ListItemText\":\"New-TemporaryFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-TemporaryFile [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-TimeSpan\",\"ListItemText\":\"New-TimeSpan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-TimeSpan [[-Start] ] [[-End] ] []\\r\\n\\r\\nNew-TimeSpan [-Days ] [-Hours ] [-Minutes ] [-Seconds ] [-Milliseconds ] []\\r\\n\"},{\"CompletionText\":\"New-TlsSessionTicketKey\",\"ListItemText\":\"New-TlsSessionTicketKey\",\"ResultType\":2,\"ToolTip\":\"New-TlsSessionTicketKey\\r\\n\"},{\"CompletionText\":\"New-Variable\",\"ListItemText\":\"New-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Variable [-Name] [[-Value] ] [-Description ] [-Option ] [-Visibility ] [-Force] [-PassThru] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"New-VFD\",\"ListItemText\":\"New-VFD\",\"ResultType\":2,\"ToolTip\":\"New-VFD\\r\\n\"},{\"CompletionText\":\"New-VHD\",\"ListItemText\":\"New-VHD\",\"ResultType\":2,\"ToolTip\":\"New-VHD\\r\\n\"},{\"CompletionText\":\"New-VirtualDisk\",\"ListItemText\":\"New-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VirtualDisk \\r\\n\"},{\"CompletionText\":\"New-VirtualDiskClone\",\"ListItemText\":\"New-VirtualDiskClone\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VirtualDiskClone \\r\\n\"},{\"CompletionText\":\"New-VirtualDiskSnapshot\",\"ListItemText\":\"New-VirtualDiskSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VirtualDiskSnapshot \\r\\n\"},{\"CompletionText\":\"New-VM\",\"ListItemText\":\"New-VM\",\"ResultType\":2,\"ToolTip\":\"New-VM\\r\\n\"},{\"CompletionText\":\"New-VMGroup\",\"ListItemText\":\"New-VMGroup\",\"ResultType\":2,\"ToolTip\":\"New-VMGroup\\r\\n\"},{\"CompletionText\":\"New-VMReplicationAuthorizationEntry\",\"ListItemText\":\"New-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"New-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"New-VMResourcePool\",\"ListItemText\":\"New-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"New-VMResourcePool\\r\\n\"},{\"CompletionText\":\"New-VMSan\",\"ListItemText\":\"New-VMSan\",\"ResultType\":2,\"ToolTip\":\"New-VMSan\\r\\n\"},{\"CompletionText\":\"New-VMSwitch\",\"ListItemText\":\"New-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"New-VMSwitch\\r\\n\"},{\"CompletionText\":\"New-Volume\",\"ListItemText\":\"New-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-Volume \\r\\n\"},{\"CompletionText\":\"New-VpnServerAddress\",\"ListItemText\":\"New-VpnServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-VpnServerAddress \\r\\n\"},{\"CompletionText\":\"New-WindowsCustomImage\",\"ListItemText\":\"New-WindowsCustomImage\",\"ResultType\":2,\"ToolTip\":\"New-WindowsCustomImage\\r\\n\"},{\"CompletionText\":\"New-WindowsImage\",\"ListItemText\":\"New-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"New-WindowsImage\\r\\n\"},{\"CompletionText\":\"New-WinEvent\",\"ListItemText\":\"New-WinEvent\",\"ResultType\":2,\"ToolTip\":\"New-WinEvent\\r\\n\"},{\"CompletionText\":\"New-WinUserLanguageList\",\"ListItemText\":\"New-WinUserLanguageList\",\"ResultType\":2,\"ToolTip\":\"New-WinUserLanguageList\\r\\n\"},{\"CompletionText\":\"New-WSManInstance\",\"ListItemText\":\"New-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"New-WSManInstance\\r\\n\"},{\"CompletionText\":\"New-WSManSessionOption\",\"ListItemText\":\"New-WSManSessionOption\",\"ResultType\":2,\"ToolTip\":\"New-WSManSessionOption\\r\\n\"},{\"CompletionText\":\"newdev.exe\",\"ListItemText\":\"newdev.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\newdev.exe\"},{\"CompletionText\":\"nf.cmd\",\"ListItemText\":\"nf.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\nf.cmd\"},{\"CompletionText\":\"nf.ps1\",\"ListItemText\":\"nf.ps1\",\"ResultType\":2,\"ToolTip\":\"nf.ps1 \\r\\n\"},{\"CompletionText\":\"NgcIso.exe\",\"ListItemText\":\"NgcIso.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\NgcIso.exe\"},{\"CompletionText\":\"ni\",\"ListItemText\":\"ni\",\"ResultType\":2,\"ToolTip\":\"New-Item\"},{\"CompletionText\":\"nlg\",\"ListItemText\":\"nlg\",\"ResultType\":2,\"ToolTip\":\"nlg\"},{\"CompletionText\":\"nltest.exe\",\"ListItemText\":\"nltest.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nltest.exe\"},{\"CompletionText\":\"nlu\",\"ListItemText\":\"nlu\",\"ResultType\":2,\"ToolTip\":\"nlu\"},{\"CompletionText\":\"nmbind.exe\",\"ListItemText\":\"nmbind.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nmbind.exe\"},{\"CompletionText\":\"nmo\",\"ListItemText\":\"nmo\",\"ResultType\":2,\"ToolTip\":\"New-Module\"},{\"CompletionText\":\"nmscrub.exe\",\"ListItemText\":\"nmscrub.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nmscrub.exe\"},{\"CompletionText\":\"node.exe\",\"ListItemText\":\"node.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\node.exe\"},{\"CompletionText\":\"nodevars.bat\",\"ListItemText\":\"nodevars.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\nodevars.bat\"},{\"CompletionText\":\"normalizer.exe\",\"ListItemText\":\"normalizer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\normalizer.exe\"},{\"CompletionText\":\"notepad.exe\",\"ListItemText\":\"notepad.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\notepad.exe\"},{\"CompletionText\":\"npm.cmd\",\"ListItemText\":\"npm.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\npm.cmd\"},{\"CompletionText\":\"npx.cmd\",\"ListItemText\":\"npx.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nodejs\\\\npx.cmd\"},{\"CompletionText\":\"nslookup.exe\",\"ListItemText\":\"nslookup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nslookup.exe\"},{\"CompletionText\":\"nsmbccm\",\"ListItemText\":\"nsmbccm\",\"ResultType\":2,\"ToolTip\":\"nsmbccm\"},{\"CompletionText\":\"nsmbgm\",\"ListItemText\":\"nsmbgm\",\"ResultType\":2,\"ToolTip\":\"nsmbgm\"},{\"CompletionText\":\"nsmbm\",\"ListItemText\":\"nsmbm\",\"ResultType\":2,\"ToolTip\":\"nsmbm\"},{\"CompletionText\":\"nsmbs\",\"ListItemText\":\"nsmbs\",\"ResultType\":2,\"ToolTip\":\"nsmbs\"},{\"CompletionText\":\"nsmbscm\",\"ListItemText\":\"nsmbscm\",\"ResultType\":2,\"ToolTip\":\"nsmbscm\"},{\"CompletionText\":\"nsmbt\",\"ListItemText\":\"nsmbt\",\"ResultType\":2,\"ToolTip\":\"nsmbt\"},{\"CompletionText\":\"nsn\",\"ListItemText\":\"nsn\",\"ResultType\":2,\"ToolTip\":\"New-PSSession\"},{\"CompletionText\":\"ntoskrnl.exe\",\"ListItemText\":\"ntoskrnl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ntoskrnl.exe\"},{\"CompletionText\":\"ntprint.exe\",\"ListItemText\":\"ntprint.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ntprint.exe\"},{\"CompletionText\":\"nu.exe\",\"ListItemText\":\"nu.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu.exe\"},{\"CompletionText\":\"nu_plugin_gstat.exe\",\"ListItemText\":\"nu_plugin_gstat.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu_plugin_gstat.exe\"},{\"CompletionText\":\"nu_plugin_inc.exe\",\"ListItemText\":\"nu_plugin_inc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu_plugin_inc.exe\"},{\"CompletionText\":\"nu_plugin_query.exe\",\"ListItemText\":\"nu_plugin_query.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\nu\\\\bin\\\\nu_plugin_query.exe\"},{\"CompletionText\":\"nv\",\"ListItemText\":\"nv\",\"ResultType\":2,\"ToolTip\":\"New-Variable\"},{\"CompletionText\":\"NvContainerRecovery.bat\",\"ListItemText\":\"NvContainerRecovery.bat\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\NvContainerRecovery.bat\"},{\"CompletionText\":\"nvdebugdump.exe\",\"ListItemText\":\"nvdebugdump.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nvdebugdump.exe\"},{\"CompletionText\":\"nvdlisrwrapper.exe\",\"ListItemText\":\"nvdlisrwrapper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\NVIDIA Corporation\\\\NVIDIA NvDLISR\\\\nvdlisrwrapper.exe\"},{\"CompletionText\":\"nvidia-smi.exe\",\"ListItemText\":\"nvidia-smi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nvidia-smi.exe\"},{\"CompletionText\":\"nvs.cmd\",\"ListItemText\":\"nvs.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\nvs\\\\nvs.cmd\"},{\"CompletionText\":\"nvs.ps1\",\"ListItemText\":\"nvs.ps1\",\"ResultType\":2,\"ToolTip\":\"nvs.ps1 \\r\\n\"},{\"CompletionText\":\"nvspinfo.exe\",\"ListItemText\":\"nvspinfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\nvspinfo.exe\"},{\"CompletionText\":\"nwsn\",\"ListItemText\":\"nwsn\",\"ResultType\":2,\"ToolTip\":\"nwsn\"},{\"CompletionText\":\"O:\",\"ListItemText\":\"O:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nO: \\r\\n\"},{\"CompletionText\":\"odbcad32.exe\",\"ListItemText\":\"odbcad32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\odbcad32.exe\"},{\"CompletionText\":\"odbcconf.exe\",\"ListItemText\":\"odbcconf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\odbcconf.exe\"},{\"CompletionText\":\"ofdeploy.exe\",\"ListItemText\":\"ofdeploy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ofdeploy.exe\"},{\"CompletionText\":\"ogv\",\"ListItemText\":\"ogv\",\"ResultType\":2,\"ToolTip\":\"Out-GridView\"},{\"CompletionText\":\"oh\",\"ListItemText\":\"oh\",\"ResultType\":2,\"ToolTip\":\"Out-Host\"},{\"CompletionText\":\"oh-my-posh.exe\",\"ListItemText\":\"oh-my-posh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\oh-my-posh\\\\bin\\\\oh-my-posh.exe\"},{\"CompletionText\":\"olk.exe\",\"ListItemText\":\"olk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\olk.exe\"},{\"CompletionText\":\"omadmclient.exe\",\"ListItemText\":\"omadmclient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\omadmclient.exe\"},{\"CompletionText\":\"omadmprc.exe\",\"ListItemText\":\"omadmprc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\omadmprc.exe\"},{\"CompletionText\":\"OneDriveSetup.exe\",\"ListItemText\":\"OneDriveSetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OneDriveSetup.exe\"},{\"CompletionText\":\"OOBE-Maintenance.exe\",\"ListItemText\":\"OOBE-Maintenance.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OOBE-Maintenance.exe\"},{\"CompletionText\":\"Open-AzSurveyLink\",\"ListItemText\":\"Open-AzSurveyLink\",\"ResultType\":2,\"ToolTip\":\"Open-AzSurveyLink\\r\\n\"},{\"CompletionText\":\"Open-NetGPO\",\"ListItemText\":\"Open-NetGPO\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOpen-NetGPO \\r\\n\"},{\"CompletionText\":\"openfiles.exe\",\"ListItemText\":\"openfiles.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\openfiles.exe\"},{\"CompletionText\":\"OpenWith.exe\",\"ListItemText\":\"OpenWith.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OpenWith.exe\"},{\"CompletionText\":\"Optimize-AppProvisionedPackages\",\"ListItemText\":\"Optimize-AppProvisionedPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-AppProvisionedPackages\"},{\"CompletionText\":\"Optimize-AppxProvisionedPackages\",\"ListItemText\":\"Optimize-AppxProvisionedPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-AppxProvisionedPackages\\r\\n\"},{\"CompletionText\":\"Optimize-ProvisionedAppPackages\",\"ListItemText\":\"Optimize-ProvisionedAppPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-ProvisionedAppPackages\"},{\"CompletionText\":\"Optimize-ProvisionedAppxPackages\",\"ListItemText\":\"Optimize-ProvisionedAppxPackages\",\"ResultType\":2,\"ToolTip\":\"Optimize-ProvisionedAppxPackages\"},{\"CompletionText\":\"Optimize-StoragePool\",\"ListItemText\":\"Optimize-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOptimize-StoragePool \\r\\n\"},{\"CompletionText\":\"Optimize-VHD\",\"ListItemText\":\"Optimize-VHD\",\"ResultType\":2,\"ToolTip\":\"Optimize-VHD\\r\\n\"},{\"CompletionText\":\"Optimize-VHDSet\",\"ListItemText\":\"Optimize-VHDSet\",\"ResultType\":2,\"ToolTip\":\"Optimize-VHDSet\\r\\n\"},{\"CompletionText\":\"Optimize-Volume\",\"ListItemText\":\"Optimize-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOptimize-Volume \\r\\n\"},{\"CompletionText\":\"Optimize-WindowsImage\",\"ListItemText\":\"Optimize-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Optimize-WindowsImage\\r\\n\"},{\"CompletionText\":\"OptionalFeatures.exe\",\"ListItemText\":\"OptionalFeatures.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\OptionalFeatures.exe\"},{\"CompletionText\":\"orbd.exe\",\"ListItemText\":\"orbd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\orbd.exe\"},{\"CompletionText\":\"osk.exe\",\"ListItemText\":\"osk.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\osk.exe\"},{\"CompletionText\":\"oss\",\"ListItemText\":\"oss\",\"ResultType\":2,\"ToolTip\":\"\\r\\noss [[-Width] ] [[-InputObject] ] []\\r\\n\"},{\"CompletionText\":\"Out-Default\",\"ListItemText\":\"Out-Default\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Default [-Transcript] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-File\",\"ListItemText\":\"Out-File\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-File [-FilePath] [[-Encoding] ] [-Append] [-Force] [-NoClobber] [-Width ] [-NoNewline] [-InputObject ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nOut-File [[-Encoding] ] -LiteralPath [-Append] [-Force] [-NoClobber] [-Width ] [-NoNewline] [-InputObject ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Out-GridView\",\"ListItemText\":\"Out-GridView\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-GridView [-InputObject ] [-Title ] [-PassThru] []\\r\\n\\r\\nOut-GridView [-InputObject ] [-Title ] [-Wait] []\\r\\n\\r\\nOut-GridView [-InputObject ] [-Title ] [-OutputMode ] []\\r\\n\"},{\"CompletionText\":\"Out-Host\",\"ListItemText\":\"Out-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Host [-Paging] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-Null\",\"ListItemText\":\"Out-Null\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Null [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-Printer\",\"ListItemText\":\"Out-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-Printer [[-Name] ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Out-String\",\"ListItemText\":\"Out-String\",\"ResultType\":2,\"ToolTip\":\"\\r\\nOut-String [-Width ] [-NoNewline] [-InputObject ] []\\r\\n\\r\\nOut-String [-Stream] [-Width ] [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"P:\",\"ListItemText\":\"P:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nP: \\r\\n\"},{\"CompletionText\":\"pacjsworker.exe\",\"ListItemText\":\"pacjsworker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pacjsworker.exe\"},{\"CompletionText\":\"pack200.exe\",\"ListItemText\":\"pack200.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\pack200.exe\"},{\"CompletionText\":\"PackagedCWALauncher.exe\",\"ListItemText\":\"PackagedCWALauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PackagedCWALauncher.exe\"},{\"CompletionText\":\"PackageInspector.exe\",\"ListItemText\":\"PackageInspector.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PackageInspector.exe\"},{\"CompletionText\":\"PasswordOnWakeSettingFlyout.exe\",\"ListItemText\":\"PasswordOnWakeSettingFlyout.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PasswordOnWakeSettingFlyout.exe\"},{\"CompletionText\":\"PATHPING.EXE\",\"ListItemText\":\"PATHPING.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PATHPING.EXE\"},{\"CompletionText\":\"Pause\",\"ListItemText\":\"Pause\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPause \\r\\n\"},{\"CompletionText\":\"pbcfg\",\"ListItemText\":\"pbcfg\",\"ResultType\":2,\"ToolTip\":\"pbcfg\"},{\"CompletionText\":\"pbres\",\"ListItemText\":\"pbres\",\"ResultType\":2,\"ToolTip\":\"pbres\"},{\"CompletionText\":\"pbrush.exe\",\"ListItemText\":\"pbrush.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pbrush.exe\"},{\"CompletionText\":\"pcalua.exe\",\"ListItemText\":\"pcalua.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pcalua.exe\"},{\"CompletionText\":\"pcaui.exe\",\"ListItemText\":\"pcaui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pcaui.exe\"},{\"CompletionText\":\"pcwrun.exe\",\"ListItemText\":\"pcwrun.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pcwrun.exe\"},{\"CompletionText\":\"perfmon.exe\",\"ListItemText\":\"perfmon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\perfmon.exe\"},{\"CompletionText\":\"perfmon.msc\",\"ListItemText\":\"perfmon.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\perfmon.msc\"},{\"CompletionText\":\"pfn\",\"ListItemText\":\"pfn\",\"ResultType\":2,\"ToolTip\":\"pfn\"},{\"CompletionText\":\"phoneactivate.exe\",\"ListItemText\":\"phoneactivate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\phoneactivate.exe\"},{\"CompletionText\":\"PickerHost.exe\",\"ListItemText\":\"PickerHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PickerHost.exe\"},{\"CompletionText\":\"PinEnrollmentBroker.exe\",\"ListItemText\":\"PinEnrollmentBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PinEnrollmentBroker.exe\"},{\"CompletionText\":\"pinentry-basic.exe\",\"ListItemText\":\"pinentry-basic.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\pinentry-basic.exe\"},{\"CompletionText\":\"PING.EXE\",\"ListItemText\":\"PING.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PING.EXE\"},{\"CompletionText\":\"pip.exe\",\"ListItemText\":\"pip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\Scripts\\\\pip.exe\"},{\"CompletionText\":\"pip3.10.exe\",\"ListItemText\":\"pip3.10.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip3.10.exe\"},{\"CompletionText\":\"pip3.12.exe\",\"ListItemText\":\"pip3.12.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\Scripts\\\\pip3.12.exe\"},{\"CompletionText\":\"pip3.9.exe\",\"ListItemText\":\"pip3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip3.9.exe\"},{\"CompletionText\":\"pip3.exe\",\"ListItemText\":\"pip3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\Scripts\\\\pip3.exe\"},{\"CompletionText\":\"PkgMgr.exe\",\"ListItemText\":\"PkgMgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PkgMgr.exe\"},{\"CompletionText\":\"PktMon.exe\",\"ListItemText\":\"PktMon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PktMon.exe\"},{\"CompletionText\":\"plasrv.exe\",\"ListItemText\":\"plasrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\plasrv.exe\"},{\"CompletionText\":\"PnPUnattend.exe\",\"ListItemText\":\"PnPUnattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PnPUnattend.exe\"},{\"CompletionText\":\"pnputil.exe\",\"ListItemText\":\"pnputil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pnputil.exe\"},{\"CompletionText\":\"poetry.exe\",\"ListItemText\":\"poetry.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\Python\\\\Scripts\\\\poetry.exe\"},{\"CompletionText\":\"policytool.exe\",\"ListItemText\":\"policytool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\policytool.exe\"},{\"CompletionText\":\"Pop-Location\",\"ListItemText\":\"Pop-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPop-Location [-PassThru] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"popd\",\"ListItemText\":\"popd\",\"ResultType\":2,\"ToolTip\":\"Pop-Location\"},{\"CompletionText\":\"poqexec.exe\",\"ListItemText\":\"poqexec.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\poqexec.exe\"},{\"CompletionText\":\"pospaymentsworker.exe\",\"ListItemText\":\"pospaymentsworker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pospaymentsworker.exe\"},{\"CompletionText\":\"powercfg.cpl\",\"ListItemText\":\"powercfg.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\powercfg.cpl\"},{\"CompletionText\":\"powercfg.exe\",\"ListItemText\":\"powercfg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\powercfg.exe\"},{\"CompletionText\":\"powershell.exe\",\"ListItemText\":\"powershell.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\"},{\"CompletionText\":\"powershell_ise.exe\",\"ListItemText\":\"powershell_ise.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell_ise.exe\"},{\"CompletionText\":\"PresentationHost.exe\",\"ListItemText\":\"PresentationHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PresentationHost.exe\"},{\"CompletionText\":\"PresentationSettings.exe\",\"ListItemText\":\"PresentationSettings.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PresentationSettings.exe\"},{\"CompletionText\":\"prevhost.exe\",\"ListItemText\":\"prevhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\prevhost.exe\"},{\"CompletionText\":\"print.exe\",\"ListItemText\":\"print.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\print.exe\"},{\"CompletionText\":\"PrintBrmUi.exe\",\"ListItemText\":\"PrintBrmUi.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PrintBrmUi.exe\"},{\"CompletionText\":\"printfilterpipelinesvc.exe\",\"ListItemText\":\"printfilterpipelinesvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\printfilterpipelinesvc.exe\"},{\"CompletionText\":\"PrintIsolationHost.exe\",\"ListItemText\":\"PrintIsolationHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\PrintIsolationHost.exe\"},{\"CompletionText\":\"printmanagement.msc\",\"ListItemText\":\"printmanagement.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\printmanagement.msc\"},{\"CompletionText\":\"printui.exe\",\"ListItemText\":\"printui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\printui.exe\"},{\"CompletionText\":\"prompt\",\"ListItemText\":\"prompt\",\"ResultType\":2,\"ToolTip\":\"\\r\\nprompt \\r\\n\"},{\"CompletionText\":\"proquota.exe\",\"ListItemText\":\"proquota.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\proquota.exe\"},{\"CompletionText\":\"Protect-CmsMessage\",\"ListItemText\":\"Protect-CmsMessage\",\"ResultType\":2,\"ToolTip\":\"Protect-CmsMessage\\r\\n\"},{\"CompletionText\":\"provlaunch.exe\",\"ListItemText\":\"provlaunch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\provlaunch.exe\"},{\"CompletionText\":\"provtool.exe\",\"ListItemText\":\"provtool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\provtool.exe\"},{\"CompletionText\":\"ProximityUxHost.exe\",\"ListItemText\":\"ProximityUxHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ProximityUxHost.exe\"},{\"CompletionText\":\"prproc.exe\",\"ListItemText\":\"prproc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\prproc.exe\"},{\"CompletionText\":\"ps\",\"ListItemText\":\"ps\",\"ResultType\":2,\"ToolTip\":\"Get-Process\"},{\"CompletionText\":\"PSConsoleHostReadLine\",\"ListItemText\":\"PSConsoleHostReadLine\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPSConsoleHostReadLine \\r\\n\"},{\"CompletionText\":\"psr.exe\",\"ListItemText\":\"psr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\psr.exe\"},{\"CompletionText\":\"Publish-AzApiManagementTenantGitConfiguration\",\"ListItemText\":\"Publish-AzApiManagementTenantGitConfiguration\",\"ResultType\":2,\"ToolTip\":\"Publish-AzApiManagementTenantGitConfiguration\\r\\n\"},{\"CompletionText\":\"Publish-AzAutomationRunbook\",\"ListItemText\":\"Publish-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Publish-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Publish-AzBicepModule\",\"ListItemText\":\"Publish-AzBicepModule\",\"ResultType\":2,\"ToolTip\":\"Publish-AzBicepModule\\r\\n\"},{\"CompletionText\":\"Publish-AzVMDscConfiguration\",\"ListItemText\":\"Publish-AzVMDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Publish-AzVMDscConfiguration\\r\\n\"},{\"CompletionText\":\"Publish-AzWebApp\",\"ListItemText\":\"Publish-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Publish-AzWebApp\\r\\n\"},{\"CompletionText\":\"Publish-BCFileContent\",\"ListItemText\":\"Publish-BCFileContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-BCFileContent \\r\\n\"},{\"CompletionText\":\"Publish-BCWebContent\",\"ListItemText\":\"Publish-BCWebContent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-BCWebContent \\r\\n\"},{\"CompletionText\":\"Publish-DscConfiguration\",\"ListItemText\":\"Publish-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Publish-DscConfiguration\\r\\n\"},{\"CompletionText\":\"Publish-Module\",\"ListItemText\":\"Publish-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Module \\r\\n\"},{\"CompletionText\":\"Publish-PSResource\",\"ListItemText\":\"Publish-PSResource\",\"ResultType\":2,\"ToolTip\":\"Publish-PSResource\\r\\n\"},{\"CompletionText\":\"Publish-Script\",\"ListItemText\":\"Publish-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Script \\r\\n\"},{\"CompletionText\":\"pumo\",\"ListItemText\":\"pumo\",\"ResultType\":2,\"ToolTip\":\"pumo\"},{\"CompletionText\":\"Push-Location\",\"ListItemText\":\"Push-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPush-Location [[-Path] ] [-PassThru] [-StackName ] []\\r\\n\\r\\nPush-Location [-LiteralPath ] [-PassThru] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"pushd\",\"ListItemText\":\"pushd\",\"ResultType\":2,\"ToolTip\":\"Push-Location\"},{\"CompletionText\":\"pwd\",\"ListItemText\":\"pwd\",\"ResultType\":2,\"ToolTip\":\"Get-Location\"},{\"CompletionText\":\"pwlauncher.exe\",\"ListItemText\":\"pwlauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\pwlauncher.exe\"},{\"CompletionText\":\"pwsh-preview.exe\",\"ListItemText\":\"pwsh-preview.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh-preview.exe\"},{\"CompletionText\":\"pwsh.exe\",\"ListItemText\":\"pwsh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\WindowsApps\\\\Microsoft.PowerShell_7.4.2.0_x64__8wekyb3d8bbwe\\\\pwsh.exe\"},{\"CompletionText\":\"py.exe\",\"ListItemText\":\"py.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\py.exe\"},{\"CompletionText\":\"pygmentize.exe\",\"ListItemText\":\"pygmentize.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pygmentize.exe\"},{\"CompletionText\":\"python.exe\",\"ListItemText\":\"python.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\python.exe\"},{\"CompletionText\":\"python3.12.exe\",\"ListItemText\":\"python3.12.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\python3.12.exe\"},{\"CompletionText\":\"python3.9.exe\",\"ListItemText\":\"python3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python3.9.exe\"},{\"CompletionText\":\"python3.exe\",\"ListItemText\":\"python3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python3.exe\"},{\"CompletionText\":\"pythonw.exe\",\"ListItemText\":\"pythonw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Python312\\\\pythonw.exe\"},{\"CompletionText\":\"pythonw3.9.exe\",\"ListItemText\":\"pythonw3.9.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw3.9.exe\"},{\"CompletionText\":\"pythonw3.exe\",\"ListItemText\":\"pythonw3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw3.exe\"},{\"CompletionText\":\"pyw.exe\",\"ListItemText\":\"pyw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\pyw.exe\"},{\"CompletionText\":\"Q:\",\"ListItemText\":\"Q:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nQ: \\r\\n\"},{\"CompletionText\":\"qappsrv.exe\",\"ListItemText\":\"qappsrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\qappsrv.exe\"},{\"CompletionText\":\"qprocess.exe\",\"ListItemText\":\"qprocess.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\qprocess.exe\"},{\"CompletionText\":\"query.exe\",\"ListItemText\":\"query.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\query.exe\"},{\"CompletionText\":\"quser.exe\",\"ListItemText\":\"quser.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\quser.exe\"},{\"CompletionText\":\"qwinsta.exe\",\"ListItemText\":\"qwinsta.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\qwinsta.exe\"},{\"CompletionText\":\"r\",\"ListItemText\":\"r\",\"ResultType\":2,\"ToolTip\":\"Invoke-History\"},{\"CompletionText\":\"R:\",\"ListItemText\":\"R:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nR: \\r\\n\"},{\"CompletionText\":\"rasautou.exe\",\"ListItemText\":\"rasautou.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rasautou.exe\"},{\"CompletionText\":\"rasdial.exe\",\"ListItemText\":\"rasdial.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rasdial.exe\"},{\"CompletionText\":\"raserver.exe\",\"ListItemText\":\"raserver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\raserver.exe\"},{\"CompletionText\":\"rasphone.exe\",\"ListItemText\":\"rasphone.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rasphone.exe\"},{\"CompletionText\":\"rbp\",\"ListItemText\":\"rbp\",\"ResultType\":2,\"ToolTip\":\"Remove-PSBreakpoint\"},{\"CompletionText\":\"rcie\",\"ListItemText\":\"rcie\",\"ResultType\":2,\"ToolTip\":\"rcie\"},{\"CompletionText\":\"rcim\",\"ListItemText\":\"rcim\",\"ResultType\":2,\"ToolTip\":\"rcim\"},{\"CompletionText\":\"rcjb\",\"ListItemText\":\"rcjb\",\"ResultType\":2,\"ToolTip\":\"Receive-Job\"},{\"CompletionText\":\"rcms\",\"ListItemText\":\"rcms\",\"ResultType\":2,\"ToolTip\":\"rcms\"},{\"CompletionText\":\"rcsn\",\"ListItemText\":\"rcsn\",\"ResultType\":2,\"ToolTip\":\"Receive-PSSession\"},{\"CompletionText\":\"rd\",\"ListItemText\":\"rd\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"rdpclip.exe\",\"ListItemText\":\"rdpclip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpclip.exe\"},{\"CompletionText\":\"rdpinit.exe\",\"ListItemText\":\"rdpinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpinit.exe\"},{\"CompletionText\":\"rdpinput.exe\",\"ListItemText\":\"rdpinput.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpinput.exe\"},{\"CompletionText\":\"RdpSa.exe\",\"ListItemText\":\"RdpSa.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RdpSa.exe\"},{\"CompletionText\":\"RdpSaProxy.exe\",\"ListItemText\":\"RdpSaProxy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RdpSaProxy.exe\"},{\"CompletionText\":\"RdpSaUacHelper.exe\",\"ListItemText\":\"RdpSaUacHelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RdpSaUacHelper.exe\"},{\"CompletionText\":\"rdpshell.exe\",\"ListItemText\":\"rdpshell.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpshell.exe\"},{\"CompletionText\":\"rdpsign.exe\",\"ListItemText\":\"rdpsign.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdpsign.exe\"},{\"CompletionText\":\"rdr\",\"ListItemText\":\"rdr\",\"ResultType\":2,\"ToolTip\":\"Remove-PSDrive\"},{\"CompletionText\":\"rdrleakdiag.exe\",\"ListItemText\":\"rdrleakdiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rdrleakdiag.exe\"},{\"CompletionText\":\"Reactivate-AzBatchTask\",\"ListItemText\":\"Reactivate-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Reactivate-AzBatchTask\"},{\"CompletionText\":\"Read-Host\",\"ListItemText\":\"Read-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRead-Host [[-Prompt] ] [-MaskInput] []\\r\\n\\r\\nRead-Host [[-Prompt] ] [-AsSecureString] []\\r\\n\"},{\"CompletionText\":\"Read-PrinterNfcTag\",\"ListItemText\":\"Read-PrinterNfcTag\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRead-PrinterNfcTag \\r\\n\"},{\"CompletionText\":\"readCloudDataSettings.exe\",\"ListItemText\":\"readCloudDataSettings.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\readCloudDataSettings.exe\"},{\"CompletionText\":\"ReAgentc.exe\",\"ListItemText\":\"ReAgentc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ReAgentc.exe\"},{\"CompletionText\":\"recdisc.exe\",\"ListItemText\":\"recdisc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\recdisc.exe\"},{\"CompletionText\":\"Receive-DtcDiagnosticTransaction\",\"ListItemText\":\"Receive-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Receive-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"Receive-Job\",\"ListItemText\":\"Receive-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReceive-Job [-Job] [[-Location] ] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Job] [[-ComputerName] ] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Job] [[-Session] ] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Name] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-InstanceId] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\\r\\nReceive-Job [-Id] [-Keep] [-NoRecurse] [-Force] [-Wait] [-AutoRemoveJob] [-WriteEvents] [-WriteJobInResults] []\\r\\n\"},{\"CompletionText\":\"Receive-PSSession\",\"ListItemText\":\"Receive-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReceive-PSSession [-Session] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-Id] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ComputerName] -Name [-ApplicationName ] [-ConfigurationName ] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ComputerName] -InstanceId [-ApplicationName ] [-ConfigurationName ] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-Port ] [-UseSSL] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ConnectionUri] -Name [-ConfigurationName ] [-AllowRedirection] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-ConnectionUri] -InstanceId [-ConfigurationName ] [-AllowRedirection] [-OutTarget ] [-JobName ] [-Credential ] [-Authentication ] [-CertificateThumbprint ] [-SessionOption ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-InstanceId] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nReceive-PSSession [-Name] [-OutTarget ] [-JobName ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"recover.exe\",\"ListItemText\":\"recover.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\recover.exe\"},{\"CompletionText\":\"RecoveryDrive.exe\",\"ListItemText\":\"RecoveryDrive.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RecoveryDrive.exe\"},{\"CompletionText\":\"RefreshEnv.cmd\",\"ListItemText\":\"RefreshEnv.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\RefreshEnv.cmd\"},{\"CompletionText\":\"refsutil.exe\",\"ListItemText\":\"refsutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\refsutil.exe\"},{\"CompletionText\":\"reg.exe\",\"ListItemText\":\"reg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\reg.exe\"},{\"CompletionText\":\"regedit.exe\",\"ListItemText\":\"regedit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\regedit.exe\"},{\"CompletionText\":\"regedt32.exe\",\"ListItemText\":\"regedt32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\regedt32.exe\"},{\"CompletionText\":\"regini.exe\",\"ListItemText\":\"regini.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\regini.exe\"},{\"CompletionText\":\"Register-ArgumentCompleter\",\"ListItemText\":\"Register-ArgumentCompleter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ArgumentCompleter -CommandName -ScriptBlock [-Native] []\\r\\n\\r\\nRegister-ArgumentCompleter -ParameterName -ScriptBlock [-CommandName ] []\\r\\n\"},{\"CompletionText\":\"Register-AzAutomationDscNode\",\"ListItemText\":\"Register-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Register-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Register-AzAutomationScheduledRunbook\",\"ListItemText\":\"Register-AzAutomationScheduledRunbook\",\"ResultType\":2,\"ToolTip\":\"Register-AzAutomationScheduledRunbook\\r\\n\"},{\"CompletionText\":\"Register-AzMigrateProjectTool\",\"ListItemText\":\"Register-AzMigrateProjectTool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzMigrateProjectTool \\r\\n\"},{\"CompletionText\":\"Register-AzModule\",\"ListItemText\":\"Register-AzModule\",\"ResultType\":2,\"ToolTip\":\"Register-AzModule\\r\\n\"},{\"CompletionText\":\"Register-AzProviderFeature\",\"ListItemText\":\"Register-AzProviderFeature\",\"ResultType\":2,\"ToolTip\":\"Register-AzProviderFeature\\r\\n\"},{\"CompletionText\":\"Register-AzProviderPreviewFeature\",\"ListItemText\":\"Register-AzProviderPreviewFeature\",\"ResultType\":2,\"ToolTip\":\"Register-AzProviderPreviewFeature\\r\\n\"},{\"CompletionText\":\"Register-AzRecoveryServicesBackupContainer\",\"ListItemText\":\"Register-AzRecoveryServicesBackupContainer\",\"ResultType\":2,\"ToolTip\":\"Register-AzRecoveryServicesBackupContainer\\r\\n\"},{\"CompletionText\":\"Register-AzResourceProvider\",\"ListItemText\":\"Register-AzResourceProvider\",\"ResultType\":2,\"ToolTip\":\"Register-AzResourceProvider\\r\\n\"},{\"CompletionText\":\"Register-AzStackHCI\",\"ListItemText\":\"Register-AzStackHCI\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzStackHCI \\r\\n\"},{\"CompletionText\":\"Register-AzStaticWebAppUserProvidedFunctionApp\",\"ListItemText\":\"Register-AzStaticWebAppUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzStaticWebAppUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Register-AzStorageSyncServer\",\"ListItemText\":\"Register-AzStorageSyncServer\",\"ResultType\":2,\"ToolTip\":\"Register-AzStorageSyncServer\\r\\n\"},{\"CompletionText\":\"Register-AzWvdApplicationGroup\",\"ListItemText\":\"Register-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Register-CimIndicationEvent\",\"ListItemText\":\"Register-CimIndicationEvent\",\"ResultType\":2,\"ToolTip\":\"Register-CimIndicationEvent\\r\\n\"},{\"CompletionText\":\"Register-CimProvider.exe\",\"ListItemText\":\"Register-CimProvider.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Register-CimProvider.exe\"},{\"CompletionText\":\"Register-ClusteredScheduledTask\",\"ListItemText\":\"Register-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Register-DnsClient\",\"ListItemText\":\"Register-DnsClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-DnsClient \\r\\n\"},{\"CompletionText\":\"Register-EngineEvent\",\"ListItemText\":\"Register-EngineEvent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-EngineEvent [-SourceIdentifier] [[-Action] ] [-MessageData ] [-SupportEvent] [-Forward] [-MaxTriggerCount ] []\\r\\n\"},{\"CompletionText\":\"Register-IscsiSession\",\"ListItemText\":\"Register-IscsiSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-IscsiSession \\r\\n\"},{\"CompletionText\":\"Register-ObjectEvent\",\"ListItemText\":\"Register-ObjectEvent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ObjectEvent [-InputObject] [-EventName] [[-SourceIdentifier] ] [[-Action] ] [-MessageData ] [-SupportEvent] [-Forward] [-MaxTriggerCount ] []\\r\\n\"},{\"CompletionText\":\"Register-PackageSource\",\"ListItemText\":\"Register-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Register-PackageSource\\r\\n\"},{\"CompletionText\":\"Register-PSRepository\",\"ListItemText\":\"Register-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-PSRepository \\r\\n\"},{\"CompletionText\":\"Register-PSResourceRepository\",\"ListItemText\":\"Register-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Register-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Register-PSSessionConfiguration\",\"ListItemText\":\"Register-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-PSSessionConfiguration [-Name] [-ProcessorArchitecture ] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRegister-PSSessionConfiguration [-Name] [-AssemblyName] [-ConfigurationTypeName] [-ProcessorArchitecture ] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRegister-PSSessionConfiguration [-Name] -Path [-ProcessorArchitecture ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-TransportOption ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Register-ScheduledJob\",\"ListItemText\":\"Register-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Register-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Register-ScheduledTask\",\"ListItemText\":\"Register-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Register-StorageSubsystem\",\"ListItemText\":\"Register-StorageSubsystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-StorageSubsystem \\r\\n\"},{\"CompletionText\":\"RegisterManifest.ps1\",\"ListItemText\":\"RegisterManifest.ps1\",\"ResultType\":2,\"ToolTip\":\"RegisterManifest.ps1 [[-Path] ] [-Unregister] []\\r\\n\"},{\"CompletionText\":\"RegisterMicrosoftUpdate.ps1\",\"ListItemText\":\"RegisterMicrosoftUpdate.ps1\",\"ResultType\":2,\"ToolTip\":\"RegisterMicrosoftUpdate.ps1 [[-TestHook] ]\\r\\n\"},{\"CompletionText\":\"regsvr32.exe\",\"ListItemText\":\"regsvr32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\regsvr32.exe\"},{\"CompletionText\":\"rekeywiz.exe\",\"ListItemText\":\"rekeywiz.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rekeywiz.exe\"},{\"CompletionText\":\"relog.exe\",\"ListItemText\":\"relog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\relog.exe\"},{\"CompletionText\":\"RelPost.exe\",\"ListItemText\":\"RelPost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RelPost.exe\"},{\"CompletionText\":\"RemoteAppLifetimeManager.exe\",\"ListItemText\":\"RemoteAppLifetimeManager.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RemoteAppLifetimeManager.exe\"},{\"CompletionText\":\"RemotePosWorker.exe\",\"ListItemText\":\"RemotePosWorker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RemotePosWorker.exe\"},{\"CompletionText\":\"Remove-AdlAnalyticsAccount\",\"ListItemText\":\"Remove-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsAccount\"},{\"CompletionText\":\"Remove-AdlAnalyticsComputePolicy\",\"ListItemText\":\"Remove-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"Remove-AdlAnalyticsDataSource\",\"ListItemText\":\"Remove-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Remove-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Remove-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Remove-AdlCatalogCredential\",\"ListItemText\":\"Remove-AdlCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlCatalogCredential\"},{\"CompletionText\":\"Remove-AdlCatalogItemAclEntry\",\"ListItemText\":\"Remove-AdlCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlCatalogItemAclEntry\"},{\"CompletionText\":\"Remove-AdlCatalogSecret\",\"ListItemText\":\"Remove-AdlCatalogSecret\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlCatalogSecret\"},{\"CompletionText\":\"Remove-AdlStore\",\"ListItemText\":\"Remove-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStore\"},{\"CompletionText\":\"Remove-AdlStoreFirewallRule\",\"ListItemText\":\"Remove-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreFirewallRule\"},{\"CompletionText\":\"Remove-AdlStoreItem\",\"ListItemText\":\"Remove-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreItem\"},{\"CompletionText\":\"Remove-AdlStoreItemAcl\",\"ListItemText\":\"Remove-AdlStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreItemAcl\"},{\"CompletionText\":\"Remove-AdlStoreItemAclEntry\",\"ListItemText\":\"Remove-AdlStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreItemAclEntry\"},{\"CompletionText\":\"Remove-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Remove-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Remove-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Remove-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Remove-Alias\",\"ListItemText\":\"Remove-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Alias [-Name] [-Scope ] [-Force] []\\r\\n\"},{\"CompletionText\":\"Remove-AppPackage\",\"ListItemText\":\"Remove-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppPackage\"},{\"CompletionText\":\"Remove-AppPackageAutoUpdateSettings\",\"ListItemText\":\"Remove-AppPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Remove-AppPackageAutoUpdateSettings\"},{\"CompletionText\":\"Remove-AppPackageVolume\",\"ListItemText\":\"Remove-AppPackageVolume\",\"ResultType\":2,\"ToolTip\":\"Remove-AppPackageVolume\"},{\"CompletionText\":\"Remove-AppProvisionedPackage\",\"ListItemText\":\"Remove-AppProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppProvisionedPackage\"},{\"CompletionText\":\"Remove-AppProvisionedSharedPackageContainer\",\"ListItemText\":\"Remove-AppProvisionedSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AppProvisionedSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AppSharedPackageContainer\",\"ListItemText\":\"Remove-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AppxPackage\",\"ListItemText\":\"Remove-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxPackage\\r\\n\"},{\"CompletionText\":\"Remove-AppxPackageAutoUpdateSettings\",\"ListItemText\":\"Remove-AppxPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxPackageAutoUpdateSettings\\r\\n\"},{\"CompletionText\":\"Remove-AppxProvisionedPackage\",\"ListItemText\":\"Remove-AppxProvisionedPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxProvisionedPackage\\r\\n\"},{\"CompletionText\":\"Remove-AppxVolume\",\"ListItemText\":\"Remove-AppxVolume\",\"ResultType\":2,\"ToolTip\":\"Remove-AppxVolume\\r\\n\"},{\"CompletionText\":\"Remove-ASRFabric\",\"ListItemText\":\"Remove-ASRFabric\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRFabric\"},{\"CompletionText\":\"Remove-ASRNetworkMapping\",\"ListItemText\":\"Remove-ASRNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRNetworkMapping\"},{\"CompletionText\":\"Remove-ASRPolicy\",\"ListItemText\":\"Remove-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRPolicy\"},{\"CompletionText\":\"Remove-ASRProtectionContainerMapping\",\"ListItemText\":\"Remove-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRProtectionContainerMapping\"},{\"CompletionText\":\"Remove-ASRRecoveryPlan\",\"ListItemText\":\"Remove-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRRecoveryPlan\"},{\"CompletionText\":\"Remove-ASRReplicationProtectedItem\",\"ListItemText\":\"Remove-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRReplicationProtectedItem\"},{\"CompletionText\":\"Remove-ASRReplicationProtectedItemDisk\",\"ListItemText\":\"Remove-ASRReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRReplicationProtectedItemDisk\"},{\"CompletionText\":\"Remove-ASRRP\",\"ListItemText\":\"Remove-ASRRP\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRRP\"},{\"CompletionText\":\"Remove-ASRServicesProvider\",\"ListItemText\":\"Remove-ASRServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRServicesProvider\"},{\"CompletionText\":\"Remove-ASRStorageClassificationMapping\",\"ListItemText\":\"Remove-ASRStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRStorageClassificationMapping\"},{\"CompletionText\":\"Remove-ASRvCenter\",\"ListItemText\":\"Remove-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"Remove-ASRvCenter\"},{\"CompletionText\":\"Remove-AutologgerConfig\",\"ListItemText\":\"Remove-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Remove-AzAccount\",\"ListItemText\":\"Remove-AzAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAccount\"},{\"CompletionText\":\"Remove-AzActionGroup\",\"ListItemText\":\"Remove-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzActivityLogAlert\",\"ListItemText\":\"Remove-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"Remove-AzADAppCredential\",\"ListItemText\":\"Remove-AzADAppCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADAppCredential \\r\\n\"},{\"CompletionText\":\"Remove-AzADAppFederatedCredential\",\"ListItemText\":\"Remove-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"Remove-AzADApplication\",\"ListItemText\":\"Remove-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADApplication \\r\\n\"},{\"CompletionText\":\"Remove-AzADAppPermission\",\"ListItemText\":\"Remove-AzADAppPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADAppPermission \\r\\n\"},{\"CompletionText\":\"Remove-AzADGroup\",\"ListItemText\":\"Remove-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzADGroupMember\",\"ListItemText\":\"Remove-AzADGroupMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADGroupMember \\r\\n\"},{\"CompletionText\":\"Remove-AzADServicePrincipal\",\"ListItemText\":\"Remove-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"Remove-AzADServicePrincipalCredential\",\"ListItemText\":\"Remove-AzADServicePrincipalCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzADServicePrincipalCredential\"},{\"CompletionText\":\"Remove-AzADSpCredential\",\"ListItemText\":\"Remove-AzADSpCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADSpCredential \\r\\n\"},{\"CompletionText\":\"Remove-AzADUser\",\"ListItemText\":\"Remove-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzADUser \\r\\n\"},{\"CompletionText\":\"Remove-AzAksCluster\",\"ListItemText\":\"Remove-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAksCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzAksMaintenanceConfiguration\",\"ListItemText\":\"Remove-AzAksMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAksMaintenanceConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzAksNodePool\",\"ListItemText\":\"Remove-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"Remove-AzAksSnapshot\",\"ListItemText\":\"Remove-AzAksSnapshot\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAksSnapshot \\r\\n\"},{\"CompletionText\":\"Remove-AzAlertRule\",\"ListItemText\":\"Remove-AzAlertRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAlertRule\\r\\n\"},{\"CompletionText\":\"Remove-AzAlertsSuppressionRule\",\"ListItemText\":\"Remove-AzAlertsSuppressionRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAlertsSuppressionRule\\r\\n\"},{\"CompletionText\":\"Remove-AzAnalysisServicesServer\",\"ListItemText\":\"Remove-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagement\",\"ListItemText\":\"Remove-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApi\",\"ListItemText\":\"Remove-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiFromGateway\",\"ListItemText\":\"Remove-AzApiManagementApiFromGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiFromGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiFromProduct\",\"ListItemText\":\"Remove-AzApiManagementApiFromProduct\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiFromProduct\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiRelease\",\"ListItemText\":\"Remove-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiRevision\",\"ListItemText\":\"Remove-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiSchema\",\"ListItemText\":\"Remove-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementApiVersionSet\",\"ListItemText\":\"Remove-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementAuthorizationServer\",\"ListItemText\":\"Remove-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementBackend\",\"ListItemText\":\"Remove-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementCache\",\"ListItemText\":\"Remove-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementCertificate\",\"ListItemText\":\"Remove-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementDiagnostic\",\"ListItemText\":\"Remove-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementGateway\",\"ListItemText\":\"Remove-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementGatewayHostnameConfiguration\",\"ListItemText\":\"Remove-AzApiManagementGatewayHostnameConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementGatewayHostnameConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementGroup\",\"ListItemText\":\"Remove-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementIdentityProvider\",\"ListItemText\":\"Remove-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementLogger\",\"ListItemText\":\"Remove-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementNamedValue\",\"ListItemText\":\"Remove-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"Remove-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementOperation\",\"ListItemText\":\"Remove-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementPolicy\",\"ListItemText\":\"Remove-AzApiManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementProduct\",\"ListItemText\":\"Remove-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementProductFromGroup\",\"ListItemText\":\"Remove-AzApiManagementProductFromGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementProductFromGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementRegion\",\"ListItemText\":\"Remove-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementSubscription\",\"ListItemText\":\"Remove-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementUser\",\"ListItemText\":\"Remove-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"Remove-AzApiManagementUserFromGroup\",\"ListItemText\":\"Remove-AzApiManagementUserFromGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApiManagementUserFromGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAppConfigurationStore\",\"ListItemText\":\"Remove-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGateway\",\"ListItemText\":\"Remove-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Remove-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Remove-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"Remove-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayCustomError\",\"ListItemText\":\"Remove-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"Remove-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Remove-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Remove-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Remove-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Remove-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayIdentity\",\"ListItemText\":\"Remove-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayListener\",\"ListItemText\":\"Remove-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Remove-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Remove-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Remove-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Remove-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Remove-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"Remove-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Remove-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewaySslProfilePolicy\",\"ListItemText\":\"Remove-AzApplicationGatewaySslProfilePolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewaySslProfilePolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Remove-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Remove-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsights\",\"ListItemText\":\"Remove-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsApiKey\",\"ListItemText\":\"Remove-AzApplicationInsightsApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsApiKey \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"Remove-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"Remove-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"Remove-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsWebTest\",\"ListItemText\":\"Remove-AzApplicationInsightsWebTest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsWebTest \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsWorkbook\",\"ListItemText\":\"Remove-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"Remove-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"Remove-AzApplicationSecurityGroup\",\"ListItemText\":\"Remove-AzApplicationSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzApplicationSecurityGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAppServiceEnvironment\",\"ListItemText\":\"Remove-AzAppServiceEnvironment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAppServiceEnvironment\\r\\n\"},{\"CompletionText\":\"Remove-AzAppServicePlan\",\"ListItemText\":\"Remove-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"Remove-AzAs\",\"ListItemText\":\"Remove-AzAs\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAs\"},{\"CompletionText\":\"Remove-AzAttestationPolicySigner\",\"ListItemText\":\"Remove-AzAttestationPolicySigner\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAttestationPolicySigner\\r\\n\"},{\"CompletionText\":\"Remove-AzAttestationProvider\",\"ListItemText\":\"Remove-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfile\",\"ListItemText\":\"Remove-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfileAssignment\",\"ListItemText\":\"Remove-AzAutomanageConfigProfileAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfileAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfileHciAssignment\",\"ListItemText\":\"Remove-AzAutomanageConfigProfileHciAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfileHciAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomanageConfigProfileHcrpAssignment\",\"ListItemText\":\"Remove-AzAutomanageConfigProfileHcrpAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutomanageConfigProfileHcrpAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationAccount\",\"ListItemText\":\"Remove-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationCertificate\",\"ListItemText\":\"Remove-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationConnection\",\"ListItemText\":\"Remove-AzAutomationConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationConnectionType\",\"ListItemText\":\"Remove-AzAutomationConnectionType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationConnectionType\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationCredential\",\"ListItemText\":\"Remove-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationDscConfiguration\",\"ListItemText\":\"Remove-AzAutomationDscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationDscConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationDscNodeConfiguration\",\"ListItemText\":\"Remove-AzAutomationDscNodeConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationDscNodeConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationHybridRunbookWorker\",\"ListItemText\":\"Remove-AzAutomationHybridRunbookWorker\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationHybridRunbookWorker\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"Remove-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationHybridWorkerGroup\",\"ListItemText\":\"Remove-AzAutomationHybridWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationHybridWorkerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationModule\",\"ListItemText\":\"Remove-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationPython3Package\",\"ListItemText\":\"Remove-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationRunbook\",\"ListItemText\":\"Remove-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationSchedule\",\"ListItemText\":\"Remove-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationSoftwareUpdateConfiguration\",\"ListItemText\":\"Remove-AzAutomationSoftwareUpdateConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationSoftwareUpdateConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationSourceControl\",\"ListItemText\":\"Remove-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationVariable\",\"ListItemText\":\"Remove-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"Remove-AzAutomationWebhook\",\"ListItemText\":\"Remove-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"Remove-AzAutoscaleSetting\",\"ListItemText\":\"Remove-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzAvailabilityGroupListener\",\"ListItemText\":\"Remove-AzAvailabilityGroupListener\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzAvailabilityGroupListener \\r\\n\"},{\"CompletionText\":\"Remove-AzAvailabilitySet\",\"ListItemText\":\"Remove-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"Remove-AzBastion\",\"ListItemText\":\"Remove-AzBastion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBastion\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchAccount\",\"ListItemText\":\"Remove-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchApplication\",\"ListItemText\":\"Remove-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchApplicationPackage\",\"ListItemText\":\"Remove-AzBatchApplicationPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchApplicationPackage\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchCertificate\",\"ListItemText\":\"Remove-AzBatchCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchComputeNode\",\"ListItemText\":\"Remove-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchComputeNodeUser\",\"ListItemText\":\"Remove-AzBatchComputeNodeUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchComputeNodeUser\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchJob\",\"ListItemText\":\"Remove-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchJobSchedule\",\"ListItemText\":\"Remove-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchNodeFile\",\"ListItemText\":\"Remove-AzBatchNodeFile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchNodeFile\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchPool\",\"ListItemText\":\"Remove-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchPool\\r\\n\"},{\"CompletionText\":\"Remove-AzBatchTask\",\"ListItemText\":\"Remove-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Remove-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Remove-AzCapacityReservation\",\"ListItemText\":\"Remove-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"Remove-AzCapacityReservationGroup\",\"ListItemText\":\"Remove-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzCdnCustomDomain\",\"ListItemText\":\"Remove-AzCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnEndpoint\",\"ListItemText\":\"Remove-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnOrigin\",\"ListItemText\":\"Remove-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnOriginGroup\",\"ListItemText\":\"Remove-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzCdnProfile\",\"ListItemText\":\"Remove-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"Remove-AzCloudService\",\"ListItemText\":\"Remove-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCloudService \\r\\n\"},{\"CompletionText\":\"Remove-AzCloudServiceRoleInstance\",\"ListItemText\":\"Remove-AzCloudServiceRoleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzCloudServiceRoleInstance \\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccount\",\"ListItemText\":\"Remove-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccountCommitmentPlan\",\"ListItemText\":\"Remove-AzCognitiveServicesAccountCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccountCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccountDeployment\",\"ListItemText\":\"Remove-AzCognitiveServicesAccountDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccountDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesAccountNetworkRule\",\"ListItemText\":\"Remove-AzCognitiveServicesAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesCommitmentPlan\",\"ListItemText\":\"Remove-AzCognitiveServicesCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzCognitiveServicesCommitmentPlanAssociation\",\"ListItemText\":\"Remove-AzCognitiveServicesCommitmentPlanAssociation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCognitiveServicesCommitmentPlanAssociation\\r\\n\"},{\"CompletionText\":\"Remove-AzConfidentialLedger\",\"ListItemText\":\"Remove-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"Remove-AzConfigurationAssignment\",\"ListItemText\":\"Remove-AzConfigurationAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzConfigurationAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzConsumptionBudget\",\"ListItemText\":\"Remove-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"Remove-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerGroup\",\"ListItemText\":\"Remove-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerInstanceSubnetServiceAssociationLink\",\"ListItemText\":\"Remove-AzContainerInstanceSubnetServiceAssociationLink\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerInstanceSubnetServiceAssociationLink \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistry\",\"ListItemText\":\"Remove-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryAgentPool\",\"ListItemText\":\"Remove-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryExportPipeline\",\"ListItemText\":\"Remove-AzContainerRegistryExportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryExportPipeline \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryImportPipeline\",\"ListItemText\":\"Remove-AzContainerRegistryImportPipeline\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryImportPipeline \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryManifest\",\"ListItemText\":\"Remove-AzContainerRegistryManifest\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContainerRegistryManifest\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryReplication\",\"ListItemText\":\"Remove-AzContainerRegistryReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryReplication \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryRepository\",\"ListItemText\":\"Remove-AzContainerRegistryRepository\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContainerRegistryRepository\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryScopeMap\",\"ListItemText\":\"Remove-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryTag\",\"ListItemText\":\"Remove-AzContainerRegistryTag\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContainerRegistryTag\\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryToken\",\"ListItemText\":\"Remove-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"Remove-AzContainerRegistryWebhook\",\"ListItemText\":\"Remove-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Remove-AzContext\",\"ListItemText\":\"Remove-AzContext\",\"ResultType\":2,\"ToolTip\":\"Remove-AzContext\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBAccount\",\"ListItemText\":\"Remove-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"Remove-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBCassandraTable\",\"ListItemText\":\"Remove-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"Remove-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBGremlinGraph\",\"ListItemText\":\"Remove-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"Remove-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBService\",\"ListItemText\":\"Remove-AzCosmosDBService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBService\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlContainer\",\"ListItemText\":\"Remove-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlDatabase\",\"ListItemText\":\"Remove-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"Remove-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"Remove-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"Remove-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlTrigger\",\"ListItemText\":\"Remove-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"Remove-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"Remove-AzCosmosDBTable\",\"ListItemText\":\"Remove-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"Remove-AzCustomIpPrefix\",\"ListItemText\":\"Remove-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Remove-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"Remove-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeDevice\",\"ListItemText\":\"Remove-AzDataBoxEdgeDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeDevice\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeOrder\",\"ListItemText\":\"Remove-AzDataBoxEdgeOrder\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeOrder\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeRole\",\"ListItemText\":\"Remove-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeShare\",\"ListItemText\":\"Remove-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeStorageAccount\",\"ListItemText\":\"Remove-AzDataBoxEdgeStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"Remove-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeStorageContainer\",\"ListItemText\":\"Remove-AzDataBoxEdgeStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeStorageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeTrigger\",\"ListItemText\":\"Remove-AzDataBoxEdgeTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzDataBoxEdgeUser\",\"ListItemText\":\"Remove-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"Remove-AzDatabricksAccessConnector\",\"ListItemText\":\"Remove-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"Remove-AzDatabricksVNetPeering\",\"ListItemText\":\"Remove-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"Remove-AzDatabricksWorkspace\",\"ListItemText\":\"Remove-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzDataCollectionRule\",\"ListItemText\":\"Remove-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataCollectionRuleAssociation\",\"ListItemText\":\"Remove-AzDataCollectionRuleAssociation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataCollectionRuleAssociation\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactory\",\"ListItemText\":\"Remove-AzDataFactory\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactory\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryDataset\",\"ListItemText\":\"Remove-AzDataFactoryDataset\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryDataset\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryGateway\",\"ListItemText\":\"Remove-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryHub\",\"ListItemText\":\"Remove-AzDataFactoryHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryHub\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryLinkedService\",\"ListItemText\":\"Remove-AzDataFactoryLinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryLinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryPipeline\",\"ListItemText\":\"Remove-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2\",\"ListItemText\":\"Remove-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2DataFlow\",\"ListItemText\":\"Remove-AzDataFactoryV2DataFlow\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2DataFlow\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2Dataset\",\"ListItemText\":\"Remove-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2Dataset\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Remove-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2IntegrationRuntimeNode\",\"ListItemText\":\"Remove-AzDataFactoryV2IntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2IntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2LinkedService\",\"ListItemText\":\"Remove-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2LinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Remove-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2Trigger\",\"ListItemText\":\"Remove-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Remove-AzDataFactoryV2TriggerSubscription\",\"ListItemText\":\"Remove-AzDataFactoryV2TriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataFactoryV2TriggerSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsCatalogCredential\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsCatalogCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsCatalogItemAclEntry\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Remove-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeGen2AclRecursive\",\"ListItemText\":\"Remove-AzDataLakeGen2AclRecursive\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeGen2AclRecursive\\r\\n\"},{\"CompletionText\":\"Remove-AzDatalakeGen2FileSystem\",\"ListItemText\":\"Remove-AzDatalakeGen2FileSystem\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDatalakeGen2FileSystem\"},{\"CompletionText\":\"Remove-AzDataLakeGen2Item\",\"ListItemText\":\"Remove-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreAccount\",\"ListItemText\":\"Remove-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Remove-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreItem\",\"ListItemText\":\"Remove-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreItemAcl\",\"ListItemText\":\"Remove-AzDataLakeStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreItemAcl\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreItemAclEntry\",\"ListItemText\":\"Remove-AzDataLakeStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreItemAclEntry\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Remove-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Remove-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionBackupInstance\",\"ListItemText\":\"Remove-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionBackupPolicy\",\"ListItemText\":\"Remove-AzDataProtectionBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionBackupPolicy \\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionBackupVault\",\"ListItemText\":\"Remove-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"Remove-AzDataProtectionResourceGuard\",\"ListItemText\":\"Remove-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"Remove-AzDataShare\",\"ListItemText\":\"Remove-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShare\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareAccount\",\"ListItemText\":\"Remove-AzDataShareAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareDataSet\",\"ListItemText\":\"Remove-AzDataShareDataSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareDataSet\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareDataSetMapping\",\"ListItemText\":\"Remove-AzDataShareDataSetMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareDataSetMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareInvitation\",\"ListItemText\":\"Remove-AzDataShareInvitation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareInvitation\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareSubscription\",\"ListItemText\":\"Remove-AzDataShareSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareSynchronizationSetting\",\"ListItemText\":\"Remove-AzDataShareSynchronizationSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareSynchronizationSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzDataShareTrigger\",\"ListItemText\":\"Remove-AzDataShareTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDataShareTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzDdosProtectionPlan\",\"ListItemText\":\"Remove-AzDdosProtectionPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDdosProtectionPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzDelegation\",\"ListItemText\":\"Remove-AzDelegation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDelegation\\r\\n\"},{\"CompletionText\":\"Remove-AzDeployment\",\"ListItemText\":\"Remove-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"Remove-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerRollout\",\"ListItemText\":\"Remove-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerService\",\"ListItemText\":\"Remove-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"Remove-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"Remove-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentManagerStep\",\"ListItemText\":\"Remove-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"Remove-AzDeploymentScript\",\"ListItemText\":\"Remove-AzDeploymentScript\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeploymentScript\\r\\n\"},{\"CompletionText\":\"Remove-AzDeviceSecurityGroup\",\"ListItemText\":\"Remove-AzDeviceSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDeviceSecurityGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzDiagnosticSetting\",\"ListItemText\":\"Remove-AzDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzDisk\",\"ListItemText\":\"Remove-AzDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzDiskAccess\",\"ListItemText\":\"Remove-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Remove-AzDiskEncryptionSet\",\"ListItemText\":\"Remove-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"Remove-AzDnsRecordConfig\",\"ListItemText\":\"Remove-AzDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzDnsRecordSet\",\"ListItemText\":\"Remove-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Remove-AzDnsZone\",\"ListItemText\":\"Remove-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"Remove-AzDnsZone\\r\\n\"},{\"CompletionText\":\"Remove-AzEnvironment\",\"ListItemText\":\"Remove-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridChannel\",\"ListItemText\":\"Remove-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridDomain\",\"ListItemText\":\"Remove-AzEventGridDomain\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridDomain\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridDomainTopic\",\"ListItemText\":\"Remove-AzEventGridDomainTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridDomainTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Remove-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerNamespace\",\"ListItemText\":\"Remove-AzEventGridPartnerNamespace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerNamespace\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerRegistration\",\"ListItemText\":\"Remove-AzEventGridPartnerRegistration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerRegistration\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerTopic\",\"ListItemText\":\"Remove-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"Remove-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridSubscription\",\"ListItemText\":\"Remove-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridSystemTopic\",\"ListItemText\":\"Remove-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"Remove-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzEventGridTopic\",\"ListItemText\":\"Remove-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"Remove-AzEventHub\",\"ListItemText\":\"Remove-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHub \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubApplicationGroup\",\"ListItemText\":\"Remove-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubAuthorizationRule\",\"ListItemText\":\"Remove-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubCluster\",\"ListItemText\":\"Remove-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubConsumerGroup\",\"ListItemText\":\"Remove-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubGeoDRConfiguration\",\"ListItemText\":\"Remove-AzEventHubGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubNamespace\",\"ListItemText\":\"Remove-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubNamespaceV2\",\"ListItemText\":\"Remove-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzEventHubNamespaceV2\"},{\"CompletionText\":\"Remove-AzEventHubPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzEventHubPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzEventHubSchemaGroup\",\"ListItemText\":\"Remove-AzEventHubSchemaGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzEventHubSchemaGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuit\",\"ListItemText\":\"Remove-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuitAuthorization\",\"ListItemText\":\"Remove-AzExpressRouteCircuitAuthorization\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuitAuthorization\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Remove-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Remove-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteConnection\",\"ListItemText\":\"Remove-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteCrossConnectionPeering\",\"ListItemText\":\"Remove-AzExpressRouteCrossConnectionPeering\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteCrossConnectionPeering\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRouteGateway\",\"ListItemText\":\"Remove-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRoutePort\",\"ListItemText\":\"Remove-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRoutePortAuthorization\",\"ListItemText\":\"Remove-AzExpressRoutePortAuthorization\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRoutePortAuthorization\\r\\n\"},{\"CompletionText\":\"Remove-AzExpressRoutePortIdentity\",\"ListItemText\":\"Remove-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"Remove-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"Remove-AzFederatedIdentityCredentials\",\"ListItemText\":\"Remove-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"Remove-AzFirewall\",\"ListItemText\":\"Remove-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFirewall\\r\\n\"},{\"CompletionText\":\"Remove-AzFirewallPolicy\",\"ListItemText\":\"Remove-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"Remove-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoor\",\"ListItemText\":\"Remove-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"Remove-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"Remove-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnOrigin\",\"ListItemText\":\"Remove-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"Remove-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnProfile\",\"ListItemText\":\"Remove-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnRoute\",\"ListItemText\":\"Remove-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnRule\",\"ListItemText\":\"Remove-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnRuleSet\",\"ListItemText\":\"Remove-AzFrontDoorCdnRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnRuleSet \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnSecret\",\"ListItemText\":\"Remove-AzFrontDoorCdnSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnSecret \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"Remove-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorContent\",\"ListItemText\":\"Remove-AzFrontDoorContent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoorContent\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorRulesEngine\",\"ListItemText\":\"Remove-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"Remove-AzFrontDoorWafPolicy\",\"ListItemText\":\"Remove-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzFunctionApp\",\"ListItemText\":\"Remove-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Remove-AzFunctionAppPlan\",\"ListItemText\":\"Remove-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"Remove-AzFunctionAppSetting\",\"ListItemText\":\"Remove-AzFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzGallery\",\"ListItemText\":\"Remove-AzGallery\",\"ResultType\":2,\"ToolTip\":\"Remove-AzGallery\\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryApplication\",\"ListItemText\":\"Remove-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryApplicationVersion\",\"ListItemText\":\"Remove-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryImageDefinition\",\"ListItemText\":\"Remove-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzGalleryImageVersion\",\"ListItemText\":\"Remove-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"Remove-AzHDInsightCluster\",\"ListItemText\":\"Remove-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"Remove-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzHDInsightPersistedScriptAction\",\"ListItemText\":\"Remove-AzHDInsightPersistedScriptAction\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHDInsightPersistedScriptAction\\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareApisService\",\"ListItemText\":\"Remove-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareApisWorkspace\",\"ListItemText\":\"Remove-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareDicomService\",\"ListItemText\":\"Remove-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareFhirService\",\"ListItemText\":\"Remove-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareIotConnector\",\"ListItemText\":\"Remove-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"Remove-AzHealthcareIotConnectorFhirDestination\",\"ListItemText\":\"Remove-AzHealthcareIotConnectorFhirDestination\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzHealthcareIotConnectorFhirDestination \\r\\n\"},{\"CompletionText\":\"Remove-AzHost\",\"ListItemText\":\"Remove-AzHost\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHost\\r\\n\"},{\"CompletionText\":\"Remove-AzHostGroup\",\"ListItemText\":\"Remove-AzHostGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzHostGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzImage\",\"ListItemText\":\"Remove-AzImage\",\"ResultType\":2,\"ToolTip\":\"Remove-AzImage\\r\\n\"},{\"CompletionText\":\"Remove-AzImageDataDisk\",\"ListItemText\":\"Remove-AzImageDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzImageDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzInsightsPrivateLinkScope\",\"ListItemText\":\"Remove-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"Remove-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"Remove-AzInsightsPrivateLinkScopedResource\",\"ListItemText\":\"Remove-AzInsightsPrivateLinkScopedResource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzInsightsPrivateLinkScopedResource\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccount\",\"ListItemText\":\"Remove-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountAgreement\",\"ListItemText\":\"Remove-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountAssembly\",\"ListItemText\":\"Remove-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"Remove-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountCertificate\",\"ListItemText\":\"Remove-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountMap\",\"ListItemText\":\"Remove-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountPartner\",\"ListItemText\":\"Remove-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountReceivedIcn\",\"ListItemText\":\"Remove-AzIntegrationAccountReceivedIcn\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountReceivedIcn\\r\\n\"},{\"CompletionText\":\"Remove-AzIntegrationAccountSchema\",\"ListItemText\":\"Remove-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHub\",\"ListItemText\":\"Remove-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHub\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubCertificate\",\"ListItemText\":\"Remove-AzIotHubCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubConfiguration\",\"ListItemText\":\"Remove-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubDCL\",\"ListItemText\":\"Remove-AzIotHubDCL\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDCL\"},{\"CompletionText\":\"Remove-AzIotHubDeployment\",\"ListItemText\":\"Remove-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubDevice\",\"ListItemText\":\"Remove-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubDeviceChildren\",\"ListItemText\":\"Remove-AzIotHubDeviceChildren\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubDeviceChildren\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubEHCG\",\"ListItemText\":\"Remove-AzIotHubEHCG\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubEHCG\"},{\"CompletionText\":\"Remove-AzIotHubEventHubConsumerGroup\",\"ListItemText\":\"Remove-AzIotHubEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubEventHubConsumerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubKey\",\"ListItemText\":\"Remove-AzIotHubKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubKey\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubMessageEnrichment\",\"ListItemText\":\"Remove-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubModule\",\"ListItemText\":\"Remove-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubMsgEnrich\",\"ListItemText\":\"Remove-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Remove-AzIotHubRoute\",\"ListItemText\":\"Remove-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Remove-AzIotHubRoutingEndpoint\",\"ListItemText\":\"Remove-AzIotHubRoutingEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotHubRoutingEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzIotSecuritySolution\",\"ListItemText\":\"Remove-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Remove-AzIpAllocation\",\"ListItemText\":\"Remove-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"Remove-AzIpGroup\",\"ListItemText\":\"Remove-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzIpGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Remove-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVault\",\"ListItemText\":\"Remove-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultAccessPolicy\",\"ListItemText\":\"Remove-AzKeyVaultAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificate\",\"ListItemText\":\"Remove-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificateContact\",\"ListItemText\":\"Remove-AzKeyVaultCertificateContact\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificateContact\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificateIssuer\",\"ListItemText\":\"Remove-AzKeyVaultCertificateIssuer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificateIssuer\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultCertificateOperation\",\"ListItemText\":\"Remove-AzKeyVaultCertificateOperation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultCertificateOperation\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultKey\",\"ListItemText\":\"Remove-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultManagedHsm\",\"ListItemText\":\"Remove-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Remove-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultManagedStorageSasDefinition\",\"ListItemText\":\"Remove-AzKeyVaultManagedStorageSasDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultManagedStorageSasDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultNetworkRule\",\"ListItemText\":\"Remove-AzKeyVaultNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultRoleAssignment\",\"ListItemText\":\"Remove-AzKeyVaultRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultRoleDefinition\",\"ListItemText\":\"Remove-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzKeyVaultSecret\",\"ListItemText\":\"Remove-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Remove-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Remove-AzKustoAttachedDatabaseConfiguration\",\"ListItemText\":\"Remove-AzKustoAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoCluster\",\"ListItemText\":\"Remove-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoClusterLanguageExtension\",\"ListItemText\":\"Remove-AzKustoClusterLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoClusterLanguageExtension \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoClusterPrincipalAssignment\",\"ListItemText\":\"Remove-AzKustoClusterPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoClusterPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDatabase\",\"ListItemText\":\"Remove-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDatabasePrincipal\",\"ListItemText\":\"Remove-AzKustoDatabasePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDatabasePrincipal \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDatabasePrincipalAssignment\",\"ListItemText\":\"Remove-AzKustoDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoDataConnection\",\"ListItemText\":\"Remove-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"Remove-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzKustoPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzKustoScript\",\"ListItemText\":\"Remove-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzKustoScript \\r\\n\"},{\"CompletionText\":\"Remove-AzLoad\",\"ListItemText\":\"Remove-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzLoad \\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancer\",\"ListItemText\":\"Remove-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"Remove-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerBackendAddressPoolConfig\",\"ListItemText\":\"Remove-AzLoadBalancerBackendAddressPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerBackendAddressPoolConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Remove-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Remove-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Remove-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Remove-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Remove-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Remove-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzLocalNetworkGateway\",\"ListItemText\":\"Remove-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzLogicApp\",\"ListItemText\":\"Remove-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Remove-AzLogProfile\",\"ListItemText\":\"Remove-AzLogProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzLogProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzMaintenanceConfiguration\",\"ListItemText\":\"Remove-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedApplication\",\"ListItemText\":\"Remove-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedApplicationDefinition\",\"ListItemText\":\"Remove-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedCassandraCluster\",\"ListItemText\":\"Remove-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedCassandraDataCenter\",\"ListItemText\":\"Remove-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"Remove-AzManagedServicesAssignment\",\"ListItemText\":\"Remove-AzManagedServicesAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzManagedServicesAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzManagedServicesDefinition\",\"ListItemText\":\"Remove-AzManagedServicesDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzManagedServicesDefinition \\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroup\",\"ListItemText\":\"Remove-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroupDeployment\",\"ListItemText\":\"Remove-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroupHierarchySetting\",\"ListItemText\":\"Remove-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"Remove-AzManagementGroupSubscription\",\"ListItemText\":\"Remove-AzManagementGroupSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzManagementGroupSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzMediaService\",\"ListItemText\":\"Remove-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMediaService\\r\\n\"},{\"CompletionText\":\"Remove-AzMetricAlertRuleV2\",\"ListItemText\":\"Remove-AzMetricAlertRuleV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMetricAlertRuleV2\\r\\n\"},{\"CompletionText\":\"Remove-AzMigrateProject\",\"ListItemText\":\"Remove-AzMigrateProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMigrateProject \\r\\n\"},{\"CompletionText\":\"Remove-AzMigrateServerReplication\",\"ListItemText\":\"Remove-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Remove-AzMlCommitmentPlan\",\"ListItemText\":\"Remove-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzMlWebService\",\"ListItemText\":\"Remove-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspace\",\"ListItemText\":\"Remove-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"Remove-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"Remove-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceCodeVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceCodeVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceCodeVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceComponentContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceComponentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceComponentContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceComponentVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceComponentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceComponentVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceCompute\",\"ListItemText\":\"Remove-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceConnection\",\"ListItemText\":\"Remove-AzMLWorkspaceConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceDataContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceDataContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceDataContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceDatastore\",\"ListItemText\":\"Remove-AzMLWorkspaceDatastore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceDatastore \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceDataVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceDataVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceDataVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceEnvironmentContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceEnvironmentContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceEnvironmentContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceEnvironmentVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceEnvironmentVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceEnvironmentVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceJob\",\"ListItemText\":\"Remove-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceModelContainer\",\"ListItemText\":\"Remove-AzMLWorkspaceModelContainer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceModelContainer \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceModelVersion\",\"ListItemText\":\"Remove-AzMLWorkspaceModelVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceModelVersion \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"Remove-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"Remove-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"Remove-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzMonitorWorkspace\",\"ListItemText\":\"Remove-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFirewallRule\",\"ListItemText\":\"Remove-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFlexibleServer\",\"ListItemText\":\"Remove-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFlexibleServerDatabase\",\"ListItemText\":\"Remove-AzMySqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"Remove-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlServer\",\"ListItemText\":\"Remove-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Remove-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"Remove-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Remove-AzNatGateway\",\"ListItemText\":\"Remove-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNatGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkInterface\",\"ListItemText\":\"Remove-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Remove-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Remove-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManager\",\"ListItemText\":\"Remove-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"Remove-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerGroup\",\"ListItemText\":\"Remove-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"Remove-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerScopeConnection\",\"ListItemText\":\"Remove-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"Remove-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"Remove-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"Remove-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerStaticMember\",\"ListItemText\":\"Remove-AzNetworkManagerStaticMember\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerStaticMember\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"Remove-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkProfile\",\"ListItemText\":\"Remove-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkSecurityGroup\",\"ListItemText\":\"Remove-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Remove-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkVirtualAppliance\",\"ListItemText\":\"Remove-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcher\",\"ListItemText\":\"Remove-AzNetworkWatcher\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcher\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Remove-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcherFlowLog\",\"ListItemText\":\"Remove-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"Remove-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"Remove-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHub\",\"ListItemText\":\"Remove-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"Remove-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"Remove-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"Remove-AzNotificationHubsNamespace\",\"ListItemText\":\"Remove-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"Remove-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Remove-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"Remove-AzOperationalInsightsCluster\",\"ListItemText\":\"Remove-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsDataExport\",\"ListItemText\":\"Remove-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsDataSource\",\"ListItemText\":\"Remove-AzOperationalInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsDataSource\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsLinkedService\",\"ListItemText\":\"Remove-AzOperationalInsightsLinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsLinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"Remove-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"Remove-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"Remove-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsTable\",\"ListItemText\":\"Remove-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"Remove-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Remove-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Remove-AzP2sVpnGateway\",\"ListItemText\":\"Remove-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyAssignment\",\"ListItemText\":\"Remove-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyAttestation\",\"ListItemText\":\"Remove-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyDefinition\",\"ListItemText\":\"Remove-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyExemption\",\"ListItemText\":\"Remove-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicyRemediation\",\"ListItemText\":\"Remove-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Remove-AzPolicySetDefinition\",\"ListItemText\":\"Remove-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFirewallRule\",\"ListItemText\":\"Remove-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Remove-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFlexibleServerDatabase\",\"ListItemText\":\"Remove-AzPostgreSqlFlexibleServerDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFlexibleServerDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"Remove-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlServer\",\"ListItemText\":\"Remove-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Remove-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"Remove-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Remove-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Remove-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Remove-AzPowerBIWorkspaceCollection\",\"ListItemText\":\"Remove-AzPowerBIWorkspaceCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPowerBIWorkspaceCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsRecordConfig\",\"ListItemText\":\"Remove-AzPrivateDnsRecordConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsRecordConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsRecordSet\",\"ListItemText\":\"Remove-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"Remove-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsZone\",\"ListItemText\":\"Remove-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateDnsZoneGroup\",\"ListItemText\":\"Remove-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateEndpoint\",\"ListItemText\":\"Remove-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateLinkAssociation\",\"ListItemText\":\"Remove-AzPrivateLinkAssociation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateLinkAssociation\\r\\n\"},{\"CompletionText\":\"Remove-AzPrivateLinkService\",\"ListItemText\":\"Remove-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Remove-AzProximityPlacementGroup\",\"ListItemText\":\"Remove-AzProximityPlacementGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzProximityPlacementGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzPublicIpAddress\",\"ListItemText\":\"Remove-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"Remove-AzPublicIpPrefix\",\"ListItemText\":\"Remove-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Remove-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrFabric\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrFabric\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrFabric\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrProtectionContainer\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrProtectionContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrProtectionContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItemDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrReplicationProtectedItemDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrServicesProvider\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrServicesProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrStorageClassificationMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrStorageClassificationMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrStorageClassificationMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"Remove-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"Remove-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesResourceGuardMapping\",\"ListItemText\":\"Remove-AzRecoveryServicesResourceGuardMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesResourceGuardMapping\\r\\n\"},{\"CompletionText\":\"Remove-AzRecoveryServicesVault\",\"ListItemText\":\"Remove-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCache\",\"ListItemText\":\"Remove-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCacheDiagnostic\",\"ListItemText\":\"Remove-AzRedisCacheDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheDiagnostic\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCacheDiagnostics\",\"ListItemText\":\"Remove-AzRedisCacheDiagnostics\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheDiagnostics\"},{\"CompletionText\":\"Remove-AzRedisCacheFirewallRule\",\"ListItemText\":\"Remove-AzRedisCacheFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCacheLink\",\"ListItemText\":\"Remove-AzRedisCacheLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCacheLink\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisCachePatchSchedule\",\"ListItemText\":\"Remove-AzRedisCachePatchSchedule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRedisCachePatchSchedule\\r\\n\"},{\"CompletionText\":\"Remove-AzRedisEnterpriseCache\",\"ListItemText\":\"Remove-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Remove-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Remove-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzRelayAuthorizationRule\",\"ListItemText\":\"Remove-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzRelayHybridConnection\",\"ListItemText\":\"Remove-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzRelayNamespace\",\"ListItemText\":\"Remove-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"Remove-AzResource\",\"ListItemText\":\"Remove-AzResource\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResource\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceGroup\",\"ListItemText\":\"Remove-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceGroupDeployment\",\"ListItemText\":\"Remove-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceLock\",\"ListItemText\":\"Remove-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceLock\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceManagementPrivateLink\",\"ListItemText\":\"Remove-AzResourceManagementPrivateLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzResourceManagementPrivateLink\\r\\n\"},{\"CompletionText\":\"Remove-AzResourceMoverMoveCollection\",\"ListItemText\":\"Remove-AzResourceMoverMoveCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzResourceMoverMoveCollection \\r\\n\"},{\"CompletionText\":\"Remove-AzResourceMoverMoveResource\",\"ListItemText\":\"Remove-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzResourceMoverMoveResource \\r\\n\"},{\"CompletionText\":\"Remove-AzRestorePoint\",\"ListItemText\":\"Remove-AzRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRestorePoint\\r\\n\"},{\"CompletionText\":\"Remove-AzRestorePointCollection\",\"ListItemText\":\"Remove-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageContainer\",\"ListItemText\":\"Remove-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Remove-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageContainerLegalHold\",\"ListItemText\":\"Remove-AzRmStorageContainerLegalHold\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageContainerLegalHold\\r\\n\"},{\"CompletionText\":\"Remove-AzRmStorageShare\",\"ListItemText\":\"Remove-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Remove-AzRoleAssignment\",\"ListItemText\":\"Remove-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzRoleDefinition\",\"ListItemText\":\"Remove-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzRoleManagementPolicy\",\"ListItemText\":\"Remove-AzRoleManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRoleManagementPolicy \\r\\n\"},{\"CompletionText\":\"Remove-AzRoleManagementPolicyAssignment\",\"ListItemText\":\"Remove-AzRoleManagementPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzRoleManagementPolicyAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzRouteConfig\",\"ListItemText\":\"Remove-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteFilter\",\"ListItemText\":\"Remove-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteFilterRuleConfig\",\"ListItemText\":\"Remove-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteMap\",\"ListItemText\":\"Remove-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteMap\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteServer\",\"ListItemText\":\"Remove-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteServer\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteServerPeer\",\"ListItemText\":\"Remove-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Remove-AzRouteTable\",\"ListItemText\":\"Remove-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRouteTable\\r\\n\"},{\"CompletionText\":\"Remove-AzRoutingIntent\",\"ListItemText\":\"Remove-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"Remove-AzRoutingPolicy\",\"ListItemText\":\"Remove-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzScheduledQueryRule\",\"ListItemText\":\"Remove-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityAssessment\",\"ListItemText\":\"Remove-AzSecurityAssessment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityAssessment\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityAssessmentMetadata\",\"ListItemText\":\"Remove-AzSecurityAssessmentMetadata\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityAssessmentMetadata\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityAutomation\",\"ListItemText\":\"Remove-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityAutomation\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityContact\",\"ListItemText\":\"Remove-AzSecurityContact\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityContact\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityPartnerProvider\",\"ListItemText\":\"Remove-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"Remove-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Remove-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Remove-AzSecurityWorkspaceSetting\",\"ListItemText\":\"Remove-AzSecurityWorkspaceSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSecurityWorkspaceSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelAlertRule\",\"ListItemText\":\"Remove-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelAlertRuleAction\",\"ListItemText\":\"Remove-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelAutomationRule\",\"ListItemText\":\"Remove-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelBookmark\",\"ListItemText\":\"Remove-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelBookmarkRelation\",\"ListItemText\":\"Remove-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelDataConnector\",\"ListItemText\":\"Remove-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelEntityQuery\",\"ListItemText\":\"Remove-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelIncident\",\"ListItemText\":\"Remove-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelIncidentComment\",\"ListItemText\":\"Remove-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelIncidentRelation\",\"ListItemText\":\"Remove-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"Remove-AzSentinelOnboardingState\",\"ListItemText\":\"Remove-AzSentinelOnboardingState\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSentinelOnboardingState \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusAuthorizationRule\",\"ListItemText\":\"Remove-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusGeoDRConfiguration\",\"ListItemText\":\"Remove-AzServiceBusGeoDRConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusGeoDRConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusMigration\",\"ListItemText\":\"Remove-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusNamespace\",\"ListItemText\":\"Remove-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusNamespaceV2\",\"ListItemText\":\"Remove-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"Remove-AzServiceBusPrivateEndpointConnection\",\"ListItemText\":\"Remove-AzServiceBusPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusPrivateEndpointConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusQueue\",\"ListItemText\":\"Remove-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusRule\",\"ListItemText\":\"Remove-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusSubscription\",\"ListItemText\":\"Remove-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceBusTopic\",\"ListItemText\":\"Remove-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceEndpointPolicy\",\"ListItemText\":\"Remove-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Remove-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricApplication\",\"ListItemText\":\"Remove-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricApplicationType\",\"ListItemText\":\"Remove-AzServiceFabricApplicationType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricApplicationType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricApplicationTypeVersion\",\"ListItemText\":\"Remove-AzServiceFabricApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricClientCertificate\",\"ListItemText\":\"Remove-AzServiceFabricClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricClientCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedCluster\",\"ListItemText\":\"Remove-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterClientCertificate\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterClientCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedClusterService\",\"ListItemText\":\"Remove-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Remove-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricManagedNodeTypeVMExtension\",\"ListItemText\":\"Remove-AzServiceFabricManagedNodeTypeVMExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricManagedNodeTypeVMExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricNode\",\"ListItemText\":\"Remove-AzServiceFabricNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricNode\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricNodeType\",\"ListItemText\":\"Remove-AzServiceFabricNodeType\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricNodeType\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricService\",\"ListItemText\":\"Remove-AzServiceFabricService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricService\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceFabricSetting\",\"ListItemText\":\"Remove-AzServiceFabricSetting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzServiceFabricSetting\\r\\n\"},{\"CompletionText\":\"Remove-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Remove-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Remove-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Remove-AzServiceLinkerForWebApp\",\"ListItemText\":\"Remove-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Remove-AzSignalR\",\"ListItemText\":\"Remove-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSignalR\\r\\n\"},{\"CompletionText\":\"Remove-AzSnapshot\",\"ListItemText\":\"Remove-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSnapshot\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabase\",\"ListItemText\":\"Remove-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseAudit\",\"ListItemText\":\"Remove-AzSqlDatabaseAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseAudit\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"Remove-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Remove-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseFromFailoverGroup\",\"ListItemText\":\"Remove-AzSqlDatabaseFromFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseFromFailoverGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Remove-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Remove-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseRestorePoint\",\"ListItemText\":\"Remove-AzSqlDatabaseRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseRestorePoint\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseSecondary\",\"ListItemText\":\"Remove-AzSqlDatabaseSecondary\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseSecondary\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseSensitivityClassification\",\"ListItemText\":\"Remove-AzSqlDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlDatabaseServerAuditing\",\"ListItemText\":\"Remove-AzSqlDatabaseServerAuditing\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlDatabaseServerAuditing\"},{\"CompletionText\":\"Remove-AzSqlElasticJob\",\"ListItemText\":\"Remove-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobAgent\",\"ListItemText\":\"Remove-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobCredential\",\"ListItemText\":\"Remove-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobStep\",\"ListItemText\":\"Remove-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobTarget\",\"ListItemText\":\"Remove-AzSqlElasticJobTarget\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobTarget\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticJobTargetGroup\",\"ListItemText\":\"Remove-AzSqlElasticJobTargetGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticJobTargetGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlElasticPool\",\"ListItemText\":\"Remove-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstance\",\"ListItemText\":\"Remove-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceActiveDirectoryAdministrator\",\"ListItemText\":\"Remove-AzSqlInstanceActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceDatabase\",\"ListItemText\":\"Remove-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Remove-AzSqlInstanceDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceDatabaseSensitivityClassification\",\"ListItemText\":\"Remove-AzSqlInstanceDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceKeyVaultKey\",\"ListItemText\":\"Remove-AzSqlInstanceKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceLink\",\"ListItemText\":\"Remove-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstancePool\",\"ListItemText\":\"Remove-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlInstanceServerTrustCertificate\",\"ListItemText\":\"Remove-AzSqlInstanceServerTrustCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlInstanceServerTrustCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServer\",\"ListItemText\":\"Remove-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServer\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerActiveDirectoryAdministrator\",\"ListItemText\":\"Remove-AzSqlServerActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerAudit\",\"ListItemText\":\"Remove-AzSqlServerAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerAudit\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerCommunicationLink\",\"ListItemText\":\"Remove-AzSqlServerCommunicationLink\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerCommunicationLink\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"Remove-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerDnsAlias\",\"ListItemText\":\"Remove-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerFirewallRule\",\"ListItemText\":\"Remove-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"Remove-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerKeyVaultKey\",\"ListItemText\":\"Remove-AzSqlServerKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerMSSupportAudit\",\"ListItemText\":\"Remove-AzSqlServerMSSupportAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerMSSupportAudit\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerOutboundFirewallRule\",\"ListItemText\":\"Remove-AzSqlServerOutboundFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerOutboundFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerTrustGroup\",\"ListItemText\":\"Remove-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerTrustGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"Remove-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlSyncAgent\",\"ListItemText\":\"Remove-AzSqlSyncAgent\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlSyncAgent\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlSyncGroup\",\"ListItemText\":\"Remove-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlSyncMember\",\"ListItemText\":\"Remove-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlVirtualCluster\",\"ListItemText\":\"Remove-AzSqlVirtualCluster\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSqlVirtualCluster\\r\\n\"},{\"CompletionText\":\"Remove-AzSqlVM\",\"ListItemText\":\"Remove-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSqlVM \\r\\n\"},{\"CompletionText\":\"Remove-AzSqlVMGroup\",\"ListItemText\":\"Remove-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzSshkey\",\"ListItemText\":\"Remove-AzSshkey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSshkey\\r\\n\"},{\"CompletionText\":\"Remove-AzStackHciArcSetting\",\"ListItemText\":\"Remove-AzStackHciArcSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHciArcSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHciCluster\",\"ListItemText\":\"Remove-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHciExtension\",\"ListItemText\":\"Remove-AzStackHciExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHciExtension \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHCIRemoteSupport\",\"ListItemText\":\"Remove-AzStackHCIRemoteSupport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHCIRemoteSupport \\r\\n\"},{\"CompletionText\":\"Remove-AzStackHCIVMAttestation\",\"ListItemText\":\"Remove-AzStackHCIVMAttestation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStackHCIVMAttestation \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebApp\",\"ListItemText\":\"Remove-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppAttachedRepository\",\"ListItemText\":\"Remove-AzStaticWebAppAttachedRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppAttachedRepository \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppBuild\",\"ListItemText\":\"Remove-AzStaticWebAppBuild\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppBuild \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppCustomDomain\",\"ListItemText\":\"Remove-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzStaticWebAppUser\",\"ListItemText\":\"Remove-AzStaticWebAppUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStaticWebAppUser \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageAccount\",\"ListItemText\":\"Remove-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageAccountManagementPolicy\",\"ListItemText\":\"Remove-AzStorageAccountManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageAccountManagementPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageAccountNetworkRule\",\"ListItemText\":\"Remove-AzStorageAccountNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageAccountNetworkRule\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageBlob\",\"ListItemText\":\"Remove-AzStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageBlob\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageBlobImmutabilityPolicy\",\"ListItemText\":\"Remove-AzStorageBlobImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageBlobImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageBlobInventoryPolicy\",\"ListItemText\":\"Remove-AzStorageBlobInventoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageBlobInventoryPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageContainer\",\"ListItemText\":\"Remove-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageCORSRule\",\"ListItemText\":\"Remove-AzStorageCORSRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageCORSRule\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageDirectory\",\"ListItemText\":\"Remove-AzStorageDirectory\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageDirectory\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageFile\",\"ListItemText\":\"Remove-AzStorageFile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageFile\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageLocalUser\",\"ListItemText\":\"Remove-AzStorageLocalUser\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageLocalUser\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMover\",\"ListItemText\":\"Remove-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMover \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMoverEndpoint\",\"ListItemText\":\"Remove-AzStorageMoverEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMoverEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMoverJobDefinition\",\"ListItemText\":\"Remove-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageMoverProject\",\"ListItemText\":\"Remove-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"Remove-AzStorageObjectReplicationPolicy\",\"ListItemText\":\"Remove-AzStorageObjectReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageObjectReplicationPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageQueue\",\"ListItemText\":\"Remove-AzStorageQueue\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageQueue\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageShare\",\"ListItemText\":\"Remove-AzStorageShare\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageShare\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncCloudEndpoint\",\"ListItemText\":\"Remove-AzStorageSyncCloudEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncCloudEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncGroup\",\"ListItemText\":\"Remove-AzStorageSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncServerEndpoint\",\"ListItemText\":\"Remove-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageSyncService\",\"ListItemText\":\"Remove-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageTable\",\"ListItemText\":\"Remove-AzStorageTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageTable\\r\\n\"},{\"CompletionText\":\"Remove-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"Remove-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Remove-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsCluster\",\"ListItemText\":\"Remove-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsFunction\",\"ListItemText\":\"Remove-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsInput\",\"ListItemText\":\"Remove-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsJob\",\"ListItemText\":\"Remove-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Remove-AzStreamAnalyticsOutput\",\"ListItemText\":\"Remove-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Remove-AzSubscriptionDeployment\",\"ListItemText\":\"Remove-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSubscriptionDeployment\"},{\"CompletionText\":\"Remove-AzSubscriptionDiagnosticSetting\",\"ListItemText\":\"Remove-AzSubscriptionDiagnosticSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSubscriptionDiagnosticSetting \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseDataFlow\",\"ListItemText\":\"Remove-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseDataFlow\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseDataset\",\"ListItemText\":\"Remove-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseDataset\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseFirewallRule\",\"ListItemText\":\"Remove-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Remove-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseIntegrationRuntimeNode\",\"ListItemText\":\"Remove-AzSynapseIntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseIntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKqlScript\",\"ListItemText\":\"Remove-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseKqlScript\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPool\",\"ListItemText\":\"Remove-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ListItemText\":\"Remove-AzSynapseKustoPoolAttachedDatabaseConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolAttachedDatabaseConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"Remove-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ListItemText\":\"Remove-AzSynapseKustoPoolDatabasePrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolDatabasePrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"Remove-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolLanguageExtension\",\"ListItemText\":\"Remove-AzSynapseKustoPoolLanguageExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolLanguageExtension \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseKustoPoolPrincipalAssignment\",\"ListItemText\":\"Remove-AzSynapseKustoPoolPrincipalAssignment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzSynapseKustoPoolPrincipalAssignment \\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseLinkConnection\",\"ListItemText\":\"Remove-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseLinkedService\",\"ListItemText\":\"Remove-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseLinkedService\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"Remove-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseManagedPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseNotebook\",\"ListItemText\":\"Remove-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapsePipeline\",\"ListItemText\":\"Remove-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseRoleAssignment\",\"ListItemText\":\"Remove-AzSynapseRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseRoleAssignment\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSparkConfiguration\",\"ListItemText\":\"Remove-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSparkConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSparkJobDefinition\",\"ListItemText\":\"Remove-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSparkJobDefinition\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSparkPool\",\"ListItemText\":\"Remove-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlActiveDirectoryAdministrator\",\"ListItemText\":\"Remove-AzSynapseSqlActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlAudit\",\"ListItemText\":\"Remove-AzSynapseSqlAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlAudit\"},{\"CompletionText\":\"Remove-AzSynapseSqlDatabase\",\"ListItemText\":\"Remove-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlPool\",\"ListItemText\":\"Remove-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlPoolAudit\",\"ListItemText\":\"Remove-AzSynapseSqlPoolAudit\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPoolAudit\"},{\"CompletionText\":\"Remove-AzSynapseSqlPoolRestorePoint\",\"ListItemText\":\"Remove-AzSynapseSqlPoolRestorePoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPoolRestorePoint\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlPoolSensitivityClassification\",\"ListItemText\":\"Remove-AzSynapseSqlPoolSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlPoolSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseSqlScript\",\"ListItemText\":\"Remove-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseTrigger\",\"ListItemText\":\"Remove-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseTriggerSubscription\",\"ListItemText\":\"Remove-AzSynapseTriggerSubscription\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseTriggerSubscription\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseWorkspace\",\"ListItemText\":\"Remove-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseWorkspaceKey\",\"ListItemText\":\"Remove-AzSynapseWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseWorkspaceKey\\r\\n\"},{\"CompletionText\":\"Remove-AzSynapseWorkspacePackage\",\"ListItemText\":\"Remove-AzSynapseWorkspacePackage\",\"ResultType\":2,\"ToolTip\":\"Remove-AzSynapseWorkspacePackage\\r\\n\"},{\"CompletionText\":\"Remove-AzTag\",\"ListItemText\":\"Remove-AzTag\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTag\\r\\n\"},{\"CompletionText\":\"Remove-AzTemplateSpec\",\"ListItemText\":\"Remove-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Remove-AzTenantDeployment\",\"ListItemText\":\"Remove-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerCustomHeaderFromEndpoint\",\"ListItemText\":\"Remove-AzTrafficManagerCustomHeaderFromEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerCustomHeaderFromEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerCustomHeaderFromProfile\",\"ListItemText\":\"Remove-AzTrafficManagerCustomHeaderFromProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerCustomHeaderFromProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerEndpoint\",\"ListItemText\":\"Remove-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerEndpointConfig\",\"ListItemText\":\"Remove-AzTrafficManagerEndpointConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerEndpointConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerExpectedStatusCodeRange\",\"ListItemText\":\"Remove-AzTrafficManagerExpectedStatusCodeRange\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerExpectedStatusCodeRange\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerIpAddressRange\",\"ListItemText\":\"Remove-AzTrafficManagerIpAddressRange\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerIpAddressRange\\r\\n\"},{\"CompletionText\":\"Remove-AzTrafficManagerProfile\",\"ListItemText\":\"Remove-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Remove-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Remove-AzUserAssignedIdentity\",\"ListItemText\":\"Remove-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Remove-AzVHubRouteTable\",\"ListItemText\":\"Remove-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualApplianceSite\",\"ListItemText\":\"Remove-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHub\",\"ListItemText\":\"Remove-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHubBgpConnection\",\"ListItemText\":\"Remove-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHubRouteTable\",\"ListItemText\":\"Remove-AzVirtualHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHubRouteTable\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualHubVnetConnection\",\"ListItemText\":\"Remove-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetwork\",\"ListItemText\":\"Remove-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGateway\",\"ListItemText\":\"Remove-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayDefaultSite\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayDefaultSite\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayDefaultSite\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayIpConfig\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayIpConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayIpConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"Remove-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkPeering\",\"ListItemText\":\"Remove-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Remove-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualNetworkTap\",\"ListItemText\":\"Remove-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualRouter\",\"ListItemText\":\"Remove-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualRouterPeer\",\"ListItemText\":\"Remove-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Remove-AzVirtualWan\",\"ListItemText\":\"Remove-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"Remove-AzVM\",\"ListItemText\":\"Remove-AzVM\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVM\\r\\n\"},{\"CompletionText\":\"Remove-AzVMAccessExtension\",\"ListItemText\":\"Remove-AzVMAccessExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMAccessExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMAEMExtension\",\"ListItemText\":\"Remove-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMBackup\",\"ListItemText\":\"Remove-AzVMBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzVMChefExtension\",\"ListItemText\":\"Remove-AzVMChefExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMChefExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMCustomScriptExtension\",\"ListItemText\":\"Remove-AzVMCustomScriptExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMCustomScriptExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDataDisk\",\"ListItemText\":\"Remove-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDiagnosticsExtension\",\"ListItemText\":\"Remove-AzVMDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDiskEncryptionExtension\",\"ListItemText\":\"Remove-AzVMDiskEncryptionExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDiskEncryptionExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMDscExtension\",\"ListItemText\":\"Remove-AzVMDscExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMDscExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVMExtension\",\"ListItemText\":\"Remove-AzVMExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmGalleryApplication\",\"ListItemText\":\"Remove-AzVmGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmGalleryApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzVMNetworkInterface\",\"ListItemText\":\"Remove-AzVMNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMNetworkInterface\\r\\n\"},{\"CompletionText\":\"Remove-AzVMRunCommand\",\"ListItemText\":\"Remove-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzVMRunCommand \\r\\n\"},{\"CompletionText\":\"Remove-AzVMSecret\",\"ListItemText\":\"Remove-AzVMSecret\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMSecret\\r\\n\"},{\"CompletionText\":\"Remove-AzVMSqlServerExtension\",\"ListItemText\":\"Remove-AzVMSqlServerExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVMSqlServerExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmss\",\"ListItemText\":\"Remove-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmss\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssDataDisk\",\"ListItemText\":\"Remove-AzVmssDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssDiagnosticsExtension\",\"ListItemText\":\"Remove-AzVmssDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssExtension\",\"ListItemText\":\"Remove-AzVmssExtension\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssExtension\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssGalleryApplication\",\"ListItemText\":\"Remove-AzVmssGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssGalleryApplication\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssNetworkInterfaceConfiguration\",\"ListItemText\":\"Remove-AzVmssNetworkInterfaceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssNetworkInterfaceConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssRunCommand\",\"ListItemText\":\"Remove-AzVmssRunCommand\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssRunCommand\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssVMDataDisk\",\"ListItemText\":\"Remove-AzVmssVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVmssVMDataDisk\\r\\n\"},{\"CompletionText\":\"Remove-AzVmssVMRunCommand\",\"ListItemText\":\"Remove-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzVmssVMRunCommand \\r\\n\"},{\"CompletionText\":\"Remove-AzVpnClientIpsecParameter\",\"ListItemText\":\"Remove-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnClientRevokedCertificate\",\"ListItemText\":\"Remove-AzVpnClientRevokedCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnClientRevokedCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnClientRootCertificate\",\"ListItemText\":\"Remove-AzVpnClientRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnClientRootCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnConnection\",\"ListItemText\":\"Remove-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnGateway\",\"ListItemText\":\"Remove-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnGatewayNatRule\",\"ListItemText\":\"Remove-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnServerConfiguration\",\"ListItemText\":\"Remove-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"Remove-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"Remove-AzVpnSite\",\"ListItemText\":\"Remove-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"Remove-AzVpnSite\\r\\n\"},{\"CompletionText\":\"Remove-AzWcfRelay\",\"ListItemText\":\"Remove-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"Remove-AzWebApp\",\"ListItemText\":\"Remove-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebApp\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppAccessRestrictionRule\",\"ListItemText\":\"Remove-AzWebAppAccessRestrictionRule\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppAccessRestrictionRule\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppBackup\",\"ListItemText\":\"Remove-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppCertificate\",\"ListItemText\":\"Remove-AzWebAppCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppCertificate\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppContinuousWebJob\",\"ListItemText\":\"Remove-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSlot\",\"ListItemText\":\"Remove-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Remove-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSlotTriggeredWebJob\",\"ListItemText\":\"Remove-AzWebAppSlotTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppSlotTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppSSLBinding\",\"ListItemText\":\"Remove-AzWebAppSSLBinding\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppSSLBinding\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppTrafficRouting\",\"ListItemText\":\"Remove-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Remove-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Remove-AzWebAppTriggeredWebJob\",\"ListItemText\":\"Remove-AzWebAppTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebAppTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSub\",\"ListItemText\":\"Remove-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSubCustomCertificate\",\"ListItemText\":\"Remove-AzWebPubSubCustomCertificate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSubCustomCertificate \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSubCustomDomain\",\"ListItemText\":\"Remove-AzWebPubSubCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSubCustomDomain \\r\\n\"},{\"CompletionText\":\"Remove-AzWebPubSubHub\",\"ListItemText\":\"Remove-AzWebPubSubHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWebPubSubHub \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdApplication\",\"ListItemText\":\"Remove-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdApplicationGroup\",\"ListItemText\":\"Remove-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdHostPool\",\"ListItemText\":\"Remove-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdMsixPackage\",\"ListItemText\":\"Remove-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdRegistrationInfo\",\"ListItemText\":\"Remove-AzWvdRegistrationInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdRegistrationInfo \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdScalingPlan\",\"ListItemText\":\"Remove-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"Remove-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdSessionHost\",\"ListItemText\":\"Remove-AzWvdSessionHost\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdSessionHost \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdUserSession\",\"ListItemText\":\"Remove-AzWvdUserSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdUserSession \\r\\n\"},{\"CompletionText\":\"Remove-AzWvdWorkspace\",\"ListItemText\":\"Remove-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"Remove-BCDataCacheExtension\",\"ListItemText\":\"Remove-BCDataCacheExtension\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-BCDataCacheExtension \\r\\n\"},{\"CompletionText\":\"Remove-BcdElement\",\"ListItemText\":\"Remove-BcdElement\",\"ResultType\":2,\"ToolTip\":\"Remove-BcdElement\\r\\n\"},{\"CompletionText\":\"Remove-BcdEntry\",\"ListItemText\":\"Remove-BcdEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-BcdEntry\\r\\n\"},{\"CompletionText\":\"Remove-BitLockerKeyProtector\",\"ListItemText\":\"Remove-BitLockerKeyProtector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-BitLockerKeyProtector \\r\\n\"},{\"CompletionText\":\"Remove-BitsTransfer\",\"ListItemText\":\"Remove-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Remove-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Remove-CertificateEnrollmentPolicyServer\",\"ListItemText\":\"Remove-CertificateEnrollmentPolicyServer\",\"ResultType\":2,\"ToolTip\":\"Remove-CertificateEnrollmentPolicyServer\\r\\n\"},{\"CompletionText\":\"Remove-CertificateNotificationTask\",\"ListItemText\":\"Remove-CertificateNotificationTask\",\"ResultType\":2,\"ToolTip\":\"Remove-CertificateNotificationTask\\r\\n\"},{\"CompletionText\":\"Remove-CimInstance\",\"ListItemText\":\"Remove-CimInstance\",\"ResultType\":2,\"ToolTip\":\"Remove-CimInstance\\r\\n\"},{\"CompletionText\":\"Remove-CimSession\",\"ListItemText\":\"Remove-CimSession\",\"ResultType\":2,\"ToolTip\":\"Remove-CimSession\\r\\n\"},{\"CompletionText\":\"Remove-CIPolicyRule\",\"ListItemText\":\"Remove-CIPolicyRule\",\"ResultType\":2,\"ToolTip\":\"Remove-CIPolicyRule\\r\\n\"},{\"CompletionText\":\"Remove-DAEntryPointTableItem\",\"ListItemText\":\"Remove-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Remove-DnsClientDohServerAddress\",\"ListItemText\":\"Remove-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Remove-DnsClientNrptRule\",\"ListItemText\":\"Remove-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Remove-DscConfigurationDocument\",\"ListItemText\":\"Remove-DscConfigurationDocument\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DscConfigurationDocument \\r\\n\"},{\"CompletionText\":\"Remove-DtcClusterTMMapping\",\"ListItemText\":\"Remove-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Remove-EtwTraceProvider\",\"ListItemText\":\"Remove-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Remove-EtwTraceSession\",\"ListItemText\":\"Remove-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"Remove-EtwTraceSession\"},{\"CompletionText\":\"Remove-Event\",\"ListItemText\":\"Remove-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Event [-SourceIdentifier] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Event [-EventIdentifier] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-FileShare\",\"ListItemText\":\"Remove-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-FileShare \\r\\n\"},{\"CompletionText\":\"Remove-GitBranch\",\"ListItemText\":\"Remove-GitBranch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-GitBranch \\r\\n\"},{\"CompletionText\":\"Remove-HgsClientHostKey\",\"ListItemText\":\"Remove-HgsClientHostKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HgsClientHostKey \\r\\n\"},{\"CompletionText\":\"Remove-HgsGuardian\",\"ListItemText\":\"Remove-HgsGuardian\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HgsGuardian \\r\\n\"},{\"CompletionText\":\"Remove-HnsEndpoint\",\"ListItemText\":\"Remove-HnsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsEndpoint \\r\\n\"},{\"CompletionText\":\"Remove-HnsNamespace\",\"ListItemText\":\"Remove-HnsNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsNamespace \\r\\n\"},{\"CompletionText\":\"Remove-HnsNetwork\",\"ListItemText\":\"Remove-HnsNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsNetwork \\r\\n\"},{\"CompletionText\":\"Remove-HnsPolicyList\",\"ListItemText\":\"Remove-HnsPolicyList\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-HnsPolicyList \\r\\n\"},{\"CompletionText\":\"Remove-InitiatorId\",\"ListItemText\":\"Remove-InitiatorId\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-InitiatorId \\r\\n\"},{\"CompletionText\":\"Remove-InitiatorIdFromMaskingSet\",\"ListItemText\":\"Remove-InitiatorIdFromMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-InitiatorIdFromMaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-IscsiTargetPortal\",\"ListItemText\":\"Remove-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"Remove-Item\",\"ListItemText\":\"Remove-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Item [-Path] [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\\r\\nRemove-Item -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-Recurse] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Remove-ItemProperty\",\"ListItemText\":\"Remove-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-ItemProperty [-Path] [-Name] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-ItemProperty [-Name] -LiteralPath [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-Job\",\"ListItemText\":\"Remove-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Job [-Id] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Job] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-InstanceId] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Name] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Filter] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-State] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Job [-Command ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-JobTrigger\",\"ListItemText\":\"Remove-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Remove-JobTrigger\\r\\n\"},{\"CompletionText\":\"Remove-LocalGroup\",\"ListItemText\":\"Remove-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-LocalGroup\\r\\n\"},{\"CompletionText\":\"Remove-LocalGroupMember\",\"ListItemText\":\"Remove-LocalGroupMember\",\"ResultType\":2,\"ToolTip\":\"Remove-LocalGroupMember\\r\\n\"},{\"CompletionText\":\"Remove-LocalUser\",\"ListItemText\":\"Remove-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Remove-LocalUser\\r\\n\"},{\"CompletionText\":\"Remove-MaskingSet\",\"ListItemText\":\"Remove-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-Module\",\"ListItemText\":\"Remove-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Module [-Name] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Module [-FullyQualifiedName] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Module [-ModuleInfo] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-MpPreference\",\"ListItemText\":\"Remove-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpPreference \\r\\n\"},{\"CompletionText\":\"Remove-MpThreat\",\"ListItemText\":\"Remove-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpThreat \\r\\n\"},{\"CompletionText\":\"Remove-NetAdapterAdvancedProperty\",\"ListItemText\":\"Remove-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Remove-NetEventNetworkAdapter\",\"ListItemText\":\"Remove-NetEventNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Remove-NetEventPacketCaptureProvider\",\"ListItemText\":\"Remove-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventProvider\",\"ListItemText\":\"Remove-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventSession\",\"ListItemText\":\"Remove-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventSession \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVFPProvider\",\"ListItemText\":\"Remove-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVmNetworkAdapter\",\"ListItemText\":\"Remove-NetEventVmNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVmNetworkAdapter \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVmSwitch\",\"ListItemText\":\"Remove-NetEventVmSwitch\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVmSwitch \\r\\n\"},{\"CompletionText\":\"Remove-NetEventVmSwitchProvider\",\"ListItemText\":\"Remove-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetEventWFPCaptureProvider\",\"ListItemText\":\"Remove-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"Remove-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallHyperVProfile\",\"ListItemText\":\"Remove-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallHyperVRule\",\"ListItemText\":\"Remove-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallHyperVVMSetting\",\"ListItemText\":\"Remove-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"Remove-NetFirewallRule\",\"ListItemText\":\"Remove-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Remove-NetIPAddress\",\"ListItemText\":\"Remove-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetIPHttpsCertBinding\",\"ListItemText\":\"Remove-NetIPHttpsCertBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPHttpsCertBinding \\r\\n\"},{\"CompletionText\":\"Remove-NetIPHttpsConfiguration\",\"ListItemText\":\"Remove-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecDospSetting\",\"ListItemText\":\"Remove-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Remove-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecMainModeRule\",\"ListItemText\":\"Remove-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecMainModeSA\",\"ListItemText\":\"Remove-NetIPsecMainModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecMainModeSA \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Remove-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Remove-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Remove-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecQuickModeSA\",\"ListItemText\":\"Remove-NetIPsecQuickModeSA\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecQuickModeSA \\r\\n\"},{\"CompletionText\":\"Remove-NetIPsecRule\",\"ListItemText\":\"Remove-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Remove-NetLbfoTeam\",\"ListItemText\":\"Remove-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Remove-NetLbfoTeamMember\",\"ListItemText\":\"Remove-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Remove-NetLbfoTeamNic\",\"ListItemText\":\"Remove-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Remove-NetNat\",\"ListItemText\":\"Remove-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNat \\r\\n\"},{\"CompletionText\":\"Remove-NetNatExternalAddress\",\"ListItemText\":\"Remove-NetNatExternalAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNatExternalAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetNatStaticMapping\",\"ListItemText\":\"Remove-NetNatStaticMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNatStaticMapping \\r\\n\"},{\"CompletionText\":\"Remove-NetNatTransitionConfiguration\",\"ListItemText\":\"Remove-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-NetNeighbor\",\"ListItemText\":\"Remove-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetNeighbor \\r\\n\"},{\"CompletionText\":\"Remove-NetQosPolicy\",\"ListItemText\":\"Remove-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"Remove-NetRoute\",\"ListItemText\":\"Remove-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetRoute \\r\\n\"},{\"CompletionText\":\"Remove-NetSwitchTeam\",\"ListItemText\":\"Remove-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"Remove-NetSwitchTeamMember\",\"ListItemText\":\"Remove-NetSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetSwitchTeamMember \\r\\n\"},{\"CompletionText\":\"Remove-NetTransportFilter\",\"ListItemText\":\"Remove-NetTransportFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetTransportFilter \\r\\n\"},{\"CompletionText\":\"Remove-NetworkSwitchEthernetPortIPAddress\",\"ListItemText\":\"Remove-NetworkSwitchEthernetPortIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetworkSwitchEthernetPortIPAddress \\r\\n\"},{\"CompletionText\":\"Remove-NetworkSwitchVlan\",\"ListItemText\":\"Remove-NetworkSwitchVlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-NetworkSwitchVlan \\r\\n\"},{\"CompletionText\":\"Remove-OdbcDsn\",\"ListItemText\":\"Remove-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Remove-Partition\",\"ListItemText\":\"Remove-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Partition \\r\\n\"},{\"CompletionText\":\"Remove-PartitionAccessPath\",\"ListItemText\":\"Remove-PartitionAccessPath\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PartitionAccessPath \\r\\n\"},{\"CompletionText\":\"Remove-PhysicalDisk\",\"ListItemText\":\"Remove-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Remove-PmemDedicatedMemory\",\"ListItemText\":\"Remove-PmemDedicatedMemory\",\"ResultType\":2,\"ToolTip\":\"Remove-PmemDedicatedMemory\\r\\n\"},{\"CompletionText\":\"Remove-PmemDisk\",\"ListItemText\":\"Remove-PmemDisk\",\"ResultType\":2,\"ToolTip\":\"Remove-PmemDisk\\r\\n\"},{\"CompletionText\":\"Remove-PoshGitFromProfile\",\"ListItemText\":\"Remove-PoshGitFromProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PoshGitFromProfile \\r\\n\"},{\"CompletionText\":\"Remove-Printer\",\"ListItemText\":\"Remove-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Printer \\r\\n\"},{\"CompletionText\":\"Remove-PrinterDriver\",\"ListItemText\":\"Remove-PrinterDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PrinterDriver \\r\\n\"},{\"CompletionText\":\"Remove-PrinterPort\",\"ListItemText\":\"Remove-PrinterPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PrinterPort \\r\\n\"},{\"CompletionText\":\"Remove-PrintJob\",\"ListItemText\":\"Remove-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PrintJob \\r\\n\"},{\"CompletionText\":\"Remove-ProvisionedAppPackage\",\"ListItemText\":\"Remove-ProvisionedAppPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisionedAppPackage\"},{\"CompletionText\":\"Remove-ProvisionedAppSharedPackageContainer\",\"ListItemText\":\"Remove-ProvisionedAppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisionedAppSharedPackageContainer\"},{\"CompletionText\":\"Remove-ProvisionedAppxPackage\",\"ListItemText\":\"Remove-ProvisionedAppxPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisionedAppxPackage\"},{\"CompletionText\":\"Remove-ProvisioningPackage\",\"ListItemText\":\"Remove-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-ProvisioningPackage\"},{\"CompletionText\":\"Remove-PSBreakpoint\",\"ListItemText\":\"Remove-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSBreakpoint [-Breakpoint] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSBreakpoint [-Id] [-Runspace ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-PSDrive\",\"ListItemText\":\"Remove-PSDrive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSDrive [-Name] [-PSProvider ] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSDrive [-LiteralName] [-PSProvider ] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-PSReadLineKeyHandler\",\"ListItemText\":\"Remove-PSReadLineKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSReadLineKeyHandler [-Chord] [-ViMode ] []\\r\\n\"},{\"CompletionText\":\"Remove-PSSession\",\"ListItemText\":\"Remove-PSSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-PSSession [-Id] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession [-Session] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -ContainerId [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -VMId [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -VMName [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -InstanceId [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession -Name [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-PSSession [-ComputerName] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-Service\",\"ListItemText\":\"Remove-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Service [-Name] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-Service [-InputObject ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-SmbBandwidthLimit\",\"ListItemText\":\"Remove-SmbBandwidthLimit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbBandwidthLimit \\r\\n\"},{\"CompletionText\":\"Remove-SmbClientCertificateMapping\",\"ListItemText\":\"Remove-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"Remove-SMBComponent\",\"ListItemText\":\"Remove-SMBComponent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SMBComponent \\r\\n\"},{\"CompletionText\":\"Remove-SmbGlobalMapping\",\"ListItemText\":\"Remove-SmbGlobalMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbGlobalMapping \\r\\n\"},{\"CompletionText\":\"Remove-SmbMapping\",\"ListItemText\":\"Remove-SmbMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbMapping \\r\\n\"},{\"CompletionText\":\"Remove-SmbMultichannelConstraint\",\"ListItemText\":\"Remove-SmbMultichannelConstraint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbMultichannelConstraint \\r\\n\"},{\"CompletionText\":\"Remove-SmbServerCertificateMapping\",\"ListItemText\":\"Remove-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"Remove-SmbShare\",\"ListItemText\":\"Remove-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-SmbShare \\r\\n\"},{\"CompletionText\":\"Remove-StorageBusBinding\",\"ListItemText\":\"Remove-StorageBusBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageBusBinding \\r\\n\"},{\"CompletionText\":\"Remove-StorageFaultDomain\",\"ListItemText\":\"Remove-StorageFaultDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageFaultDomain \\r\\n\"},{\"CompletionText\":\"Remove-StorageFileServer\",\"ListItemText\":\"Remove-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageFileServer \\r\\n\"},{\"CompletionText\":\"Remove-StorageHealthIntent\",\"ListItemText\":\"Remove-StorageHealthIntent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageHealthIntent \\r\\n\"},{\"CompletionText\":\"Remove-StorageHealthSetting\",\"ListItemText\":\"Remove-StorageHealthSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageHealthSetting \\r\\n\"},{\"CompletionText\":\"Remove-StoragePool\",\"ListItemText\":\"Remove-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StoragePool \\r\\n\"},{\"CompletionText\":\"Remove-StorageTier\",\"ListItemText\":\"Remove-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-StorageTier \\r\\n\"},{\"CompletionText\":\"Remove-TargetPortFromMaskingSet\",\"ListItemText\":\"Remove-TargetPortFromMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-TargetPortFromMaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-TrustedProvisioningCertificate\",\"ListItemText\":\"Remove-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Remove-TrustedProvisioningCertificate\"},{\"CompletionText\":\"Remove-TypeData\",\"ListItemText\":\"Remove-TypeData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-TypeData -TypeData [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-TypeData [-TypeName] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRemove-TypeData -Path [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-Variable\",\"ListItemText\":\"Remove-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-Variable [-Name] [-Include ] [-Exclude ] [-Force] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Remove-VHDSnapshot\",\"ListItemText\":\"Remove-VHDSnapshot\",\"ResultType\":2,\"ToolTip\":\"Remove-VHDSnapshot\\r\\n\"},{\"CompletionText\":\"Remove-VirtualDisk\",\"ListItemText\":\"Remove-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Remove-VirtualDiskFromMaskingSet\",\"ListItemText\":\"Remove-VirtualDiskFromMaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VirtualDiskFromMaskingSet \\r\\n\"},{\"CompletionText\":\"Remove-VM\",\"ListItemText\":\"Remove-VM\",\"ResultType\":2,\"ToolTip\":\"Remove-VM\\r\\n\"},{\"CompletionText\":\"Remove-VMAssignableDevice\",\"ListItemText\":\"Remove-VMAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-VMAssignableDevice\\r\\n\"},{\"CompletionText\":\"Remove-VMCheckpoint\",\"ListItemText\":\"Remove-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Remove-VMCheckpoint\"},{\"CompletionText\":\"Remove-VMDirectVirtualDisk\",\"ListItemText\":\"Remove-VMDirectVirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VMDirectVirtualDisk \\r\\n\"},{\"CompletionText\":\"Remove-VMDvdDrive\",\"ListItemText\":\"Remove-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Remove-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Remove-VMFibreChannelHba\",\"ListItemText\":\"Remove-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Remove-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Remove-VMGpuPartitionAdapter\",\"ListItemText\":\"Remove-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Remove-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Remove-VMGroup\",\"ListItemText\":\"Remove-VMGroup\",\"ResultType\":2,\"ToolTip\":\"Remove-VMGroup\\r\\n\"},{\"CompletionText\":\"Remove-VMGroupMember\",\"ListItemText\":\"Remove-VMGroupMember\",\"ResultType\":2,\"ToolTip\":\"Remove-VMGroupMember\\r\\n\"},{\"CompletionText\":\"Remove-VMHardDiskDrive\",\"ListItemText\":\"Remove-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Remove-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Remove-VMHostAssignableDevice\",\"ListItemText\":\"Remove-VMHostAssignableDevice\",\"ResultType\":2,\"ToolTip\":\"Remove-VMHostAssignableDevice\\r\\n\"},{\"CompletionText\":\"Remove-VMKeyStorageDrive\",\"ListItemText\":\"Remove-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Remove-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Remove-VMMigrationNetwork\",\"ListItemText\":\"Remove-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Remove-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapter\",\"ListItemText\":\"Remove-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterAcl\",\"ListItemText\":\"Remove-VMNetworkAdapterAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterAcl\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterExtendedAcl\",\"ListItemText\":\"Remove-VMNetworkAdapterExtendedAcl\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterExtendedAcl\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Remove-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Remove-VMNetworkAdapterTeamMapping\",\"ListItemText\":\"Remove-VMNetworkAdapterTeamMapping\",\"ResultType\":2,\"ToolTip\":\"Remove-VMNetworkAdapterTeamMapping\\r\\n\"},{\"CompletionText\":\"Remove-VMPmemController\",\"ListItemText\":\"Remove-VMPmemController\",\"ResultType\":2,\"ToolTip\":\"Remove-VMPmemController\\r\\n\"},{\"CompletionText\":\"Remove-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Remove-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Remove-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Remove-VMReplication\",\"ListItemText\":\"Remove-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Remove-VMReplication\\r\\n\"},{\"CompletionText\":\"Remove-VMReplicationAuthorizationEntry\",\"ListItemText\":\"Remove-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"Remove-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"Remove-VMResourcePool\",\"ListItemText\":\"Remove-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Remove-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Remove-VMSan\",\"ListItemText\":\"Remove-VMSan\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSan\\r\\n\"},{\"CompletionText\":\"Remove-VMSavedState\",\"ListItemText\":\"Remove-VMSavedState\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSavedState\\r\\n\"},{\"CompletionText\":\"Remove-VMScsiController\",\"ListItemText\":\"Remove-VMScsiController\",\"ResultType\":2,\"ToolTip\":\"Remove-VMScsiController\\r\\n\"},{\"CompletionText\":\"Remove-VMSnapshot\",\"ListItemText\":\"Remove-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Remove-VMStoragePath\",\"ListItemText\":\"Remove-VMStoragePath\",\"ResultType\":2,\"ToolTip\":\"Remove-VMStoragePath\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitch\",\"ListItemText\":\"Remove-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitch\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Remove-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Remove-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Remove-VMSwitchTeamMember\",\"ListItemText\":\"Remove-VMSwitchTeamMember\",\"ResultType\":2,\"ToolTip\":\"Remove-VMSwitchTeamMember\\r\\n\"},{\"CompletionText\":\"Remove-VpnConnection\",\"ListItemText\":\"Remove-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnection \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionRoute\",\"ListItemText\":\"Remove-VpnConnectionRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionRoute \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionTriggerApplication\",\"ListItemText\":\"Remove-VpnConnectionTriggerApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionTriggerApplication \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionTriggerDnsConfiguration\",\"ListItemText\":\"Remove-VpnConnectionTriggerDnsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionTriggerDnsConfiguration \\r\\n\"},{\"CompletionText\":\"Remove-VpnConnectionTriggerTrustedNetwork\",\"ListItemText\":\"Remove-VpnConnectionTriggerTrustedNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-VpnConnectionTriggerTrustedNetwork \\r\\n\"},{\"CompletionText\":\"Remove-WindowsCapability\",\"ListItemText\":\"Remove-WindowsCapability\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsCapability\\r\\n\"},{\"CompletionText\":\"Remove-WindowsDriver\",\"ListItemText\":\"Remove-WindowsDriver\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsDriver\\r\\n\"},{\"CompletionText\":\"Remove-WindowsImage\",\"ListItemText\":\"Remove-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsImage\\r\\n\"},{\"CompletionText\":\"Remove-WindowsPackage\",\"ListItemText\":\"Remove-WindowsPackage\",\"ResultType\":2,\"ToolTip\":\"Remove-WindowsPackage\\r\\n\"},{\"CompletionText\":\"Remove-WSManInstance\",\"ListItemText\":\"Remove-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"Remove-WSManInstance\\r\\n\"},{\"CompletionText\":\"ren\",\"ListItemText\":\"ren\",\"ResultType\":2,\"ToolTip\":\"Rename-Item\"},{\"CompletionText\":\"Rename-AzContext\",\"ListItemText\":\"Rename-AzContext\",\"ResultType\":2,\"ToolTip\":\"Rename-AzContext\\r\\n\"},{\"CompletionText\":\"Rename-AzStorageDirectory\",\"ListItemText\":\"Rename-AzStorageDirectory\",\"ResultType\":2,\"ToolTip\":\"Rename-AzStorageDirectory\\r\\n\"},{\"CompletionText\":\"Rename-AzStorageFile\",\"ListItemText\":\"Rename-AzStorageFile\",\"ResultType\":2,\"ToolTip\":\"Rename-AzStorageFile\\r\\n\"},{\"CompletionText\":\"Rename-Computer\",\"ListItemText\":\"Rename-Computer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-Computer [-NewName] [-ComputerName ] [-PassThru] [-DomainCredential ] [-LocalCredential ] [-Force] [-Restart] [-WsmanAuthentication ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Rename-DAEntryPointTableItem\",\"ListItemText\":\"Rename-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Rename-Item\",\"ListItemText\":\"Rename-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-Item [-Path] [-NewName] [-Force] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRename-Item [-NewName] -LiteralPath [-Force] [-PassThru] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Rename-ItemProperty\",\"ListItemText\":\"Rename-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-ItemProperty [-Path] [-Name] [-NewName] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRename-ItemProperty [-Name] [-NewName] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Rename-LocalGroup\",\"ListItemText\":\"Rename-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Rename-LocalGroup\\r\\n\"},{\"CompletionText\":\"Rename-LocalUser\",\"ListItemText\":\"Rename-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Rename-LocalUser\\r\\n\"},{\"CompletionText\":\"Rename-MaskingSet\",\"ListItemText\":\"Rename-MaskingSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-MaskingSet \\r\\n\"},{\"CompletionText\":\"Rename-NetAdapter\",\"ListItemText\":\"Rename-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetAdapter \\r\\n\"},{\"CompletionText\":\"Rename-NetFirewallHyperVRule\",\"ListItemText\":\"Rename-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Rename-NetFirewallRule\",\"ListItemText\":\"Rename-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Rename-NetIPHttpsConfiguration\",\"ListItemText\":\"Rename-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Rename-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecMainModeRule\",\"ListItemText\":\"Rename-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Rename-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Rename-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Rename-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Rename-NetIPsecRule\",\"ListItemText\":\"Rename-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Rename-NetLbfoTeam\",\"ListItemText\":\"Rename-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Rename-NetSwitchTeam\",\"ListItemText\":\"Rename-NetSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-NetSwitchTeam \\r\\n\"},{\"CompletionText\":\"Rename-Printer\",\"ListItemText\":\"Rename-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRename-Printer \\r\\n\"},{\"CompletionText\":\"Rename-VM\",\"ListItemText\":\"Rename-VM\",\"ResultType\":2,\"ToolTip\":\"Rename-VM\\r\\n\"},{\"CompletionText\":\"Rename-VMCheckpoint\",\"ListItemText\":\"Rename-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Rename-VMCheckpoint\"},{\"CompletionText\":\"Rename-VMGroup\",\"ListItemText\":\"Rename-VMGroup\",\"ResultType\":2,\"ToolTip\":\"Rename-VMGroup\\r\\n\"},{\"CompletionText\":\"Rename-VMNetworkAdapter\",\"ListItemText\":\"Rename-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Rename-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Rename-VMResourcePool\",\"ListItemText\":\"Rename-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Rename-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Rename-VMSan\",\"ListItemText\":\"Rename-VMSan\",\"ResultType\":2,\"ToolTip\":\"Rename-VMSan\\r\\n\"},{\"CompletionText\":\"Rename-VMSnapshot\",\"ListItemText\":\"Rename-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Rename-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Rename-VMSwitch\",\"ListItemText\":\"Rename-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Rename-VMSwitch\\r\\n\"},{\"CompletionText\":\"Repair-AzVmssServiceFabricUD\",\"ListItemText\":\"Repair-AzVmssServiceFabricUD\",\"ResultType\":2,\"ToolTip\":\"Repair-AzVmssServiceFabricUD\"},{\"CompletionText\":\"Repair-AzVmssServiceFabricUpdateDomain\",\"ListItemText\":\"Repair-AzVmssServiceFabricUpdateDomain\",\"ResultType\":2,\"ToolTip\":\"Repair-AzVmssServiceFabricUpdateDomain\\r\\n\"},{\"CompletionText\":\"repair-bde.exe\",\"ListItemText\":\"repair-bde.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\repair-bde.exe\"},{\"CompletionText\":\"Repair-FileIntegrity\",\"ListItemText\":\"Repair-FileIntegrity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRepair-FileIntegrity \\r\\n\"},{\"CompletionText\":\"Repair-VirtualDisk\",\"ListItemText\":\"Repair-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRepair-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Repair-VM\",\"ListItemText\":\"Repair-VM\",\"ResultType\":2,\"ToolTip\":\"Repair-VM\\r\\n\"},{\"CompletionText\":\"Repair-Volume\",\"ListItemText\":\"Repair-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRepair-Volume \\r\\n\"},{\"CompletionText\":\"Repair-WindowsImage\",\"ListItemText\":\"Repair-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Repair-WindowsImage\\r\\n\"},{\"CompletionText\":\"replace.exe\",\"ListItemText\":\"replace.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\replace.exe\"},{\"CompletionText\":\"Reset-AppPackage\",\"ListItemText\":\"Reset-AppPackage\",\"ResultType\":2,\"ToolTip\":\"Reset-AppPackage\"},{\"CompletionText\":\"Reset-AppSharedPackageContainer\",\"ListItemText\":\"Reset-AppSharedPackageContainer\",\"ResultType\":2,\"ToolTip\":\"Reset-AppSharedPackageContainer\\r\\n\"},{\"CompletionText\":\"Reset-AppxPackage\",\"ListItemText\":\"Reset-AppxPackage\",\"ResultType\":2,\"ToolTip\":\"Reset-AppxPackage\\r\\n\"},{\"CompletionText\":\"Reset-AzAttestationPolicy\",\"ListItemText\":\"Reset-AzAttestationPolicy\",\"ResultType\":2,\"ToolTip\":\"Reset-AzAttestationPolicy\\r\\n\"},{\"CompletionText\":\"Reset-AzBatchComputeNode\",\"ListItemText\":\"Reset-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Reset-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Reset-AzHubRouter\",\"ListItemText\":\"Reset-AzHubRouter\",\"ResultType\":2,\"ToolTip\":\"Reset-AzHubRouter\\r\\n\"},{\"CompletionText\":\"Reset-AzP2sVpnGateway\",\"ListItemText\":\"Reset-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Reset-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKey\",\"ListItemText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKey\",\"ResultType\":2,\"ToolTip\":\"Reset-AzPowerBIWorkspaceCollectionAccessKey\\r\\n\"},{\"CompletionText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKeys\",\"ListItemText\":\"Reset-AzPowerBIWorkspaceCollectionAccessKeys\",\"ResultType\":2,\"ToolTip\":\"Reset-AzPowerBIWorkspaceCollectionAccessKeys\"},{\"CompletionText\":\"Reset-AzRedisCache\",\"ListItemText\":\"Reset-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Reset-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Reset-AzStaticWebAppApiKey\",\"ListItemText\":\"Reset-AzStaticWebAppApiKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-AzStaticWebAppApiKey \\r\\n\"},{\"CompletionText\":\"Reset-AzStorageSyncServerCertificate\",\"ListItemText\":\"Reset-AzStorageSyncServerCertificate\",\"ResultType\":2,\"ToolTip\":\"Reset-AzStorageSyncServerCertificate\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSparkSessionTimeout\",\"ListItemText\":\"Reset-AzSynapseSparkSessionTimeout\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSparkSessionTimeout\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Reset-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlAuditSetting\",\"ListItemText\":\"Reset-AzSynapseSqlAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlAuditSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Reset-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlPoolAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlPoolAuditSetting\",\"ListItemText\":\"Reset-AzSynapseSqlPoolAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlPoolAuditSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Reset-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlPoolVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Reset-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Reset-AzSynapseSqlVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Reset-AzVirtualNetworkGateway\",\"ListItemText\":\"Reset-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Reset-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Reset-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Reset-AzVirtualNetworkGatewayConnectionSharedKey\",\"ListItemText\":\"Reset-AzVirtualNetworkGatewayConnectionSharedKey\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVirtualNetworkGatewayConnectionSharedKey\\r\\n\"},{\"CompletionText\":\"Reset-AzVpnGateway\",\"ListItemText\":\"Reset-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Reset-AzVpnSiteLinkConnection\",\"ListItemText\":\"Reset-AzVpnSiteLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Reset-AzVpnSiteLinkConnection\\r\\n\"},{\"CompletionText\":\"Reset-AzWebAppPublishingProfile\",\"ListItemText\":\"Reset-AzWebAppPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Reset-AzWebAppPublishingProfile\\r\\n\"},{\"CompletionText\":\"Reset-AzWebAppSlotPublishingProfile\",\"ListItemText\":\"Reset-AzWebAppSlotPublishingProfile\",\"ResultType\":2,\"ToolTip\":\"Reset-AzWebAppSlotPublishingProfile\\r\\n\"},{\"CompletionText\":\"Reset-BC\",\"ListItemText\":\"Reset-BC\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-BC \\r\\n\"},{\"CompletionText\":\"Reset-DAClientExperienceConfiguration\",\"ListItemText\":\"Reset-DAClientExperienceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-DAClientExperienceConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-DAEntryPointTableItem\",\"ListItemText\":\"Reset-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Reset-DtcLog\",\"ListItemText\":\"Reset-DtcLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-DtcLog \\r\\n\"},{\"CompletionText\":\"Reset-LapsPassword\",\"ListItemText\":\"Reset-LapsPassword\",\"ResultType\":2,\"ToolTip\":\"Reset-LapsPassword\\r\\n\"},{\"CompletionText\":\"Reset-NCSIPolicyConfiguration\",\"ListItemText\":\"Reset-NCSIPolicyConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NCSIPolicyConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-Net6to4Configuration\",\"ListItemText\":\"Reset-Net6to4Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-Net6to4Configuration \\r\\n\"},{\"CompletionText\":\"Reset-NetAdapterAdvancedProperty\",\"ListItemText\":\"Reset-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Reset-NetDnsTransitionConfiguration\",\"ListItemText\":\"Reset-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-NetIPHttpsConfiguration\",\"ListItemText\":\"Reset-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-NetIsatapConfiguration\",\"ListItemText\":\"Reset-NetIsatapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetIsatapConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-NetTeredoConfiguration\",\"ListItemText\":\"Reset-NetTeredoConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-NetTeredoConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-PhysicalDisk\",\"ListItemText\":\"Reset-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Reset-SmbClientConfiguration\",\"ListItemText\":\"Reset-SmbClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-SmbClientConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-SmbServerConfiguration\",\"ListItemText\":\"Reset-SmbServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-SmbServerConfiguration \\r\\n\"},{\"CompletionText\":\"Reset-StorageReliabilityCounter\",\"ListItemText\":\"Reset-StorageReliabilityCounter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-StorageReliabilityCounter \\r\\n\"},{\"CompletionText\":\"Reset-VMReplicationStatistics\",\"ListItemText\":\"Reset-VMReplicationStatistics\",\"ResultType\":2,\"ToolTip\":\"Reset-VMReplicationStatistics\\r\\n\"},{\"CompletionText\":\"Reset-VMResourceMetering\",\"ListItemText\":\"Reset-VMResourceMetering\",\"ResultType\":2,\"ToolTip\":\"Reset-VMResourceMetering\\r\\n\"},{\"CompletionText\":\"Reset-WinhttpProxy\",\"ListItemText\":\"Reset-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nReset-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"reset.exe\",\"ListItemText\":\"reset.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\reset.exe\"},{\"CompletionText\":\"ResetEngine.exe\",\"ListItemText\":\"ResetEngine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ResetEngine.exe\"},{\"CompletionText\":\"Resize-AzVirtualNetworkGateway\",\"ListItemText\":\"Resize-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Resize-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Resize-Partition\",\"ListItemText\":\"Resize-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResize-Partition \\r\\n\"},{\"CompletionText\":\"Resize-StorageTier\",\"ListItemText\":\"Resize-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResize-StorageTier \\r\\n\"},{\"CompletionText\":\"Resize-VHD\",\"ListItemText\":\"Resize-VHD\",\"ResultType\":2,\"ToolTip\":\"Resize-VHD\\r\\n\"},{\"CompletionText\":\"Resize-VirtualDisk\",\"ListItemText\":\"Resize-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResize-VirtualDisk \\r\\n\"},{\"CompletionText\":\"resmon.exe\",\"ListItemText\":\"resmon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\resmon.exe\"},{\"CompletionText\":\"Resolve-AzError\",\"ListItemText\":\"Resolve-AzError\",\"ResultType\":2,\"ToolTip\":\"Resolve-AzError\\r\\n\"},{\"CompletionText\":\"Resolve-AzResourceMoverMoveCollectionDependency\",\"ListItemText\":\"Resolve-AzResourceMoverMoveCollectionDependency\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResolve-AzResourceMoverMoveCollectionDependency \\r\\n\"},{\"CompletionText\":\"Resolve-DnsName\",\"ListItemText\":\"Resolve-DnsName\",\"ResultType\":2,\"ToolTip\":\"Resolve-DnsName\\r\\n\"},{\"CompletionText\":\"Resolve-Error\",\"ListItemText\":\"Resolve-Error\",\"ResultType\":2,\"ToolTip\":\"Resolve-Error\"},{\"CompletionText\":\"Resolve-Path\",\"ListItemText\":\"Resolve-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResolve-Path [-Path] [-Relative] [-RelativeBasePath ] [-Credential ] []\\r\\n\\r\\nResolve-Path -LiteralPath [-Relative] [-RelativeBasePath ] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Restart-ASRJob\",\"ListItemText\":\"Restart-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Restart-ASRJob\"},{\"CompletionText\":\"Restart-AzAnalysisServicesInstance\",\"ListItemText\":\"Restart-AzAnalysisServicesInstance\",\"ResultType\":2,\"ToolTip\":\"Restart-AzAnalysisServicesInstance\\r\\n\"},{\"CompletionText\":\"Restart-AzAsInstance\",\"ListItemText\":\"Restart-AzAsInstance\",\"ResultType\":2,\"ToolTip\":\"Restart-AzAsInstance\"},{\"CompletionText\":\"Restart-AzBatchComputeNode\",\"ListItemText\":\"Restart-AzBatchComputeNode\",\"ResultType\":2,\"ToolTip\":\"Restart-AzBatchComputeNode\\r\\n\"},{\"CompletionText\":\"Restart-AzCloudService\",\"ListItemText\":\"Restart-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzCloudService \\r\\n\"},{\"CompletionText\":\"Restart-AzCloudServiceRoleInstance\",\"ListItemText\":\"Restart-AzCloudServiceRoleInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzCloudServiceRoleInstance \\r\\n\"},{\"CompletionText\":\"Restart-AzContainerGroup\",\"ListItemText\":\"Restart-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Restart-AzDeploymentManagerRollout\",\"ListItemText\":\"Restart-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Restart-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Restart-AzFunctionApp\",\"ListItemText\":\"Restart-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Restart-AzHDInsightHost\",\"ListItemText\":\"Restart-AzHDInsightHost\",\"ResultType\":2,\"ToolTip\":\"Restart-AzHDInsightHost\\r\\n\"},{\"CompletionText\":\"Restart-AzHost\",\"ListItemText\":\"Restart-AzHost\",\"ResultType\":2,\"ToolTip\":\"Restart-AzHost\\r\\n\"},{\"CompletionText\":\"Restart-AzMigrateServerReplication\",\"ListItemText\":\"Restart-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Restart-AzMLWorkspaceCompute\",\"ListItemText\":\"Restart-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Restart-AzMySqlFlexibleServer\",\"ListItemText\":\"Restart-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restart-AzMySqlServer\",\"ListItemText\":\"Restart-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Restart-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Restart-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restart-AzPostgreSqlServer\",\"ListItemText\":\"Restart-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Restart-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Restart-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Restart-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Restart-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Restart-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Restart-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Restart-AzSignalR\",\"ListItemText\":\"Restart-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Restart-AzSignalR\\r\\n\"},{\"CompletionText\":\"Restart-AzureAsInstance\",\"ListItemText\":\"Restart-AzureAsInstance\",\"ResultType\":2,\"ToolTip\":\"Restart-AzureAsInstance\"},{\"CompletionText\":\"Restart-AzVM\",\"ListItemText\":\"Restart-AzVM\",\"ResultType\":2,\"ToolTip\":\"Restart-AzVM\\r\\n\"},{\"CompletionText\":\"Restart-AzVmss\",\"ListItemText\":\"Restart-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Restart-AzVmss\\r\\n\"},{\"CompletionText\":\"Restart-AzWebApp\",\"ListItemText\":\"Restart-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Restart-AzWebApp\\r\\n\"},{\"CompletionText\":\"Restart-AzWebAppSlot\",\"ListItemText\":\"Restart-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Restart-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Restart-AzWebPubSub\",\"ListItemText\":\"Restart-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Restart-Computer\",\"ListItemText\":\"Restart-Computer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-Computer [[-ComputerName] ] [[-Credential] ] [-WsmanAuthentication ] [-Force] [-Wait] [-Timeout ] [-For ] [-Delay ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Restart-NetAdapter\",\"ListItemText\":\"Restart-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-NetAdapter \\r\\n\"},{\"CompletionText\":\"Restart-PcsvDevice\",\"ListItemText\":\"Restart-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Restart-PrintJob\",\"ListItemText\":\"Restart-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-PrintJob \\r\\n\"},{\"CompletionText\":\"Restart-Service\",\"ListItemText\":\"Restart-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestart-Service [-InputObject] [-Force] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRestart-Service [-Name] [-Force] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nRestart-Service -DisplayName [-Force] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Restart-VM\",\"ListItemText\":\"Restart-VM\",\"ResultType\":2,\"ToolTip\":\"Restart-VM\\r\\n\"},{\"CompletionText\":\"Restore-AdlStoreDeletedItem\",\"ListItemText\":\"Restore-AdlStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AdlStoreDeletedItem\"},{\"CompletionText\":\"Restore-AzApiManagement\",\"ListItemText\":\"Restore-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Restore-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Restore-AzCosmosDBAccount\",\"ListItemText\":\"Restore-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Restore-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Restore-AzDataLakeGen2DeletedItem\",\"ListItemText\":\"Restore-AzDataLakeGen2DeletedItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AzDataLakeGen2DeletedItem\\r\\n\"},{\"CompletionText\":\"Restore-AzDataLakeStoreDeletedItem\",\"ListItemText\":\"Restore-AzDataLakeStoreDeletedItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AzDataLakeStoreDeletedItem\\r\\n\"},{\"CompletionText\":\"Restore-AzDeletedWebApp\",\"ListItemText\":\"Restore-AzDeletedWebApp\",\"ResultType\":2,\"ToolTip\":\"Restore-AzDeletedWebApp\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVault\",\"ListItemText\":\"Restore-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultCertificate\",\"ListItemText\":\"Restore-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultKey\",\"ListItemText\":\"Restore-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Restore-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Restore-AzKeyVaultSecret\",\"ListItemText\":\"Restore-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Restore-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Restore-AzMySqlFlexibleServer\",\"ListItemText\":\"Restore-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restore-AzMySqlServer\",\"ListItemText\":\"Restore-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Restore-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Restore-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Restore-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Restore-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Restore-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Restore-AzPostgreSqlServer\",\"ListItemText\":\"Restore-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Restore-AzRecoveryServicesBackupItem\",\"ListItemText\":\"Restore-AzRecoveryServicesBackupItem\",\"ResultType\":2,\"ToolTip\":\"Restore-AzRecoveryServicesBackupItem\\r\\n\"},{\"CompletionText\":\"Restore-AzRmStorageShare\",\"ListItemText\":\"Restore-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Restore-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Restore-AzSqlDatabase\",\"ListItemText\":\"Restore-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Restore-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Restore-AzSqlInstanceDatabase\",\"ListItemText\":\"Restore-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Restore-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Restore-AzStorageBlobRange\",\"ListItemText\":\"Restore-AzStorageBlobRange\",\"ResultType\":2,\"ToolTip\":\"Restore-AzStorageBlobRange\\r\\n\"},{\"CompletionText\":\"Restore-AzStorageContainer\",\"ListItemText\":\"Restore-AzStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Restore-AzStorageContainer\\r\\n\"},{\"CompletionText\":\"Restore-AzSynapseSqlPool\",\"ListItemText\":\"Restore-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Restore-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Restore-AzWebAppBackup\",\"ListItemText\":\"Restore-AzWebAppBackup\",\"ResultType\":2,\"ToolTip\":\"Restore-AzWebAppBackup\\r\\n\"},{\"CompletionText\":\"Restore-AzWebAppSnapshot\",\"ListItemText\":\"Restore-AzWebAppSnapshot\",\"ResultType\":2,\"ToolTip\":\"Restore-AzWebAppSnapshot\\r\\n\"},{\"CompletionText\":\"Restore-DscConfiguration\",\"ListItemText\":\"Restore-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Restore-NetworkSwitchConfiguration\",\"ListItemText\":\"Restore-NetworkSwitchConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRestore-NetworkSwitchConfiguration \\r\\n\"},{\"CompletionText\":\"Restore-VMCheckpoint\",\"ListItemText\":\"Restore-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"Restore-VMCheckpoint\"},{\"CompletionText\":\"Restore-VMSnapshot\",\"ListItemText\":\"Restore-VMSnapshot\",\"ResultType\":2,\"ToolTip\":\"Restore-VMSnapshot\\r\\n\"},{\"CompletionText\":\"Resume-ASRJob\",\"ListItemText\":\"Resume-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Resume-ASRJob\"},{\"CompletionText\":\"Resume-AzAnalysisServicesServer\",\"ListItemText\":\"Resume-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Resume-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Resume-AzAs\",\"ListItemText\":\"Resume-AzAs\",\"ResultType\":2,\"ToolTip\":\"Resume-AzAs\"},{\"CompletionText\":\"Resume-AzAutomationJob\",\"ListItemText\":\"Resume-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Resume-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Resume-AzDataFactoryPipeline\",\"ListItemText\":\"Resume-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Resume-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Resume-AzDataProtectionBackupInstanceProtection\",\"ListItemText\":\"Resume-AzDataProtectionBackupInstanceProtection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-AzDataProtectionBackupInstanceProtection \\r\\n\"},{\"CompletionText\":\"Resume-AzMigrateServerReplication\",\"ListItemText\":\"Resume-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Resume-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Resume-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Resume-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Resume-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Resume-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Resume-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Resume-AzSqlDatabase\",\"ListItemText\":\"Resume-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Resume-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Resume-AzSynapseSqlPool\",\"ListItemText\":\"Resume-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Resume-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Resume-BitLocker\",\"ListItemText\":\"Resume-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-BitLocker \\r\\n\"},{\"CompletionText\":\"Resume-BitsTransfer\",\"ListItemText\":\"Resume-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Resume-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Resume-PrintJob\",\"ListItemText\":\"Resume-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-PrintJob \\r\\n\"},{\"CompletionText\":\"Resume-ProvisioningSession\",\"ListItemText\":\"Resume-ProvisioningSession\",\"ResultType\":2,\"ToolTip\":\"Resume-ProvisioningSession\\r\\n\"},{\"CompletionText\":\"Resume-Service\",\"ListItemText\":\"Resume-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-Service [-InputObject] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nResume-Service [-Name] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nResume-Service -DisplayName [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Resume-StorageBusDisk\",\"ListItemText\":\"Resume-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nResume-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Resume-VM\",\"ListItemText\":\"Resume-VM\",\"ResultType\":2,\"ToolTip\":\"Resume-VM\\r\\n\"},{\"CompletionText\":\"Resume-VMReplication\",\"ListItemText\":\"Resume-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Resume-VMReplication\\r\\n\"},{\"CompletionText\":\"Revoke-AzDataShareSubscriptionAccess\",\"ListItemText\":\"Revoke-AzDataShareSubscriptionAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzDataShareSubscriptionAccess\\r\\n\"},{\"CompletionText\":\"Revoke-AzDiskAccess\",\"ListItemText\":\"Revoke-AzDiskAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzDiskAccess\\r\\n\"},{\"CompletionText\":\"Revoke-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Revoke-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Revoke-AzSnapshotAccess\",\"ListItemText\":\"Revoke-AzSnapshotAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzSnapshotAccess\\r\\n\"},{\"CompletionText\":\"Revoke-AzStorageAccountUserDelegationKeys\",\"ListItemText\":\"Revoke-AzStorageAccountUserDelegationKeys\",\"ResultType\":2,\"ToolTip\":\"Revoke-AzStorageAccountUserDelegationKeys\\r\\n\"},{\"CompletionText\":\"Revoke-FileShareAccess\",\"ListItemText\":\"Revoke-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Revoke-HgsKeyProtectorAccess\",\"ListItemText\":\"Revoke-HgsKeyProtectorAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-HgsKeyProtectorAccess \\r\\n\"},{\"CompletionText\":\"Revoke-SmbClientAccessToServer\",\"ListItemText\":\"Revoke-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Revoke-SmbShareAccess\",\"ListItemText\":\"Revoke-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRevoke-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Revoke-VMConnectAccess\",\"ListItemText\":\"Revoke-VMConnectAccess\",\"ResultType\":2,\"ToolTip\":\"Revoke-VMConnectAccess\\r\\n\"},{\"CompletionText\":\"rg.exe\",\"ListItemText\":\"rg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WinGet\\\\Packages\\\\BurntSushi.ripgrep.MSVC_Microsoft.Winget.Source_8wekyb3d8bbwe\\\\ripgrep-13.0.0-x86_64-pc-windows-msvc\\\\rg.exe\"},{\"CompletionText\":\"ri\",\"ListItemText\":\"ri\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"rjb\",\"ListItemText\":\"rjb\",\"ResultType\":2,\"ToolTip\":\"Remove-Job\"},{\"CompletionText\":\"rksmba\",\"ListItemText\":\"rksmba\",\"ResultType\":2,\"ToolTip\":\"rksmba\"},{\"CompletionText\":\"rksmbclas\",\"ListItemText\":\"rksmbclas\",\"ResultType\":2,\"ToolTip\":\"rksmbclas\"},{\"CompletionText\":\"rlg\",\"ListItemText\":\"rlg\",\"ResultType\":2,\"ToolTip\":\"rlg\"},{\"CompletionText\":\"rlgm\",\"ListItemText\":\"rlgm\",\"ResultType\":2,\"ToolTip\":\"rlgm\"},{\"CompletionText\":\"rlu\",\"ListItemText\":\"rlu\",\"ResultType\":2,\"ToolTip\":\"rlu\"},{\"CompletionText\":\"rm\",\"ListItemText\":\"rm\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"RMActivate.exe\",\"ListItemText\":\"RMActivate.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate.exe\"},{\"CompletionText\":\"RMActivate_isv.exe\",\"ListItemText\":\"RMActivate_isv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate_isv.exe\"},{\"CompletionText\":\"RMActivate_ssp.exe\",\"ListItemText\":\"RMActivate_ssp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate_ssp.exe\"},{\"CompletionText\":\"RMActivate_ssp_isv.exe\",\"ListItemText\":\"RMActivate_ssp_isv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RMActivate_ssp_isv.exe\"},{\"CompletionText\":\"RmClient.exe\",\"ListItemText\":\"RmClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RmClient.exe\"},{\"CompletionText\":\"rmdir\",\"ListItemText\":\"rmdir\",\"ResultType\":2,\"ToolTip\":\"Remove-Item\"},{\"CompletionText\":\"rmic.exe\",\"ListItemText\":\"rmic.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\rmic.exe\"},{\"CompletionText\":\"rmid.exe\",\"ListItemText\":\"rmid.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\rmid.exe\"},{\"CompletionText\":\"rmiregistry.exe\",\"ListItemText\":\"rmiregistry.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\rmiregistry.exe\"},{\"CompletionText\":\"rmo\",\"ListItemText\":\"rmo\",\"ResultType\":2,\"ToolTip\":\"Remove-Module\"},{\"CompletionText\":\"rmttpmvscmgrsvr.exe\",\"ListItemText\":\"rmttpmvscmgrsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rmttpmvscmgrsvr.exe\"},{\"CompletionText\":\"rni\",\"ListItemText\":\"rni\",\"ResultType\":2,\"ToolTip\":\"Rename-Item\"},{\"CompletionText\":\"rnlg\",\"ListItemText\":\"rnlg\",\"ResultType\":2,\"ToolTip\":\"rnlg\"},{\"CompletionText\":\"rnlu\",\"ListItemText\":\"rnlu\",\"ResultType\":2,\"ToolTip\":\"rnlu\"},{\"CompletionText\":\"rnp\",\"ListItemText\":\"rnp\",\"ResultType\":2,\"ToolTip\":\"Rename-ItemProperty\"},{\"CompletionText\":\"Robocopy.exe\",\"ListItemText\":\"Robocopy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Robocopy.exe\"},{\"CompletionText\":\"ROUTE.EXE\",\"ListItemText\":\"ROUTE.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ROUTE.EXE\"},{\"CompletionText\":\"rp\",\"ListItemText\":\"rp\",\"ResultType\":2,\"ToolTip\":\"Remove-ItemProperty\"},{\"CompletionText\":\"RpcPing.exe\",\"ListItemText\":\"RpcPing.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RpcPing.exe\"},{\"CompletionText\":\"rrinstaller.exe\",\"ListItemText\":\"rrinstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rrinstaller.exe\"},{\"CompletionText\":\"rsmbb\",\"ListItemText\":\"rsmbb\",\"ResultType\":2,\"ToolTip\":\"rsmbb\"},{\"CompletionText\":\"rsmbc\",\"ListItemText\":\"rsmbc\",\"ResultType\":2,\"ToolTip\":\"rsmbc\"},{\"CompletionText\":\"rsmbcc\",\"ListItemText\":\"rsmbcc\",\"ResultType\":2,\"ToolTip\":\"rsmbcc\"},{\"CompletionText\":\"rsmbccm\",\"ListItemText\":\"rsmbccm\",\"ResultType\":2,\"ToolTip\":\"rsmbccm\"},{\"CompletionText\":\"rsmbgm\",\"ListItemText\":\"rsmbgm\",\"ResultType\":2,\"ToolTip\":\"rsmbgm\"},{\"CompletionText\":\"rsmbm\",\"ListItemText\":\"rsmbm\",\"ResultType\":2,\"ToolTip\":\"rsmbm\"},{\"CompletionText\":\"rsmbs\",\"ListItemText\":\"rsmbs\",\"ResultType\":2,\"ToolTip\":\"rsmbs\"},{\"CompletionText\":\"rsmbsc\",\"ListItemText\":\"rsmbsc\",\"ResultType\":2,\"ToolTip\":\"rsmbsc\"},{\"CompletionText\":\"rsmbscm\",\"ListItemText\":\"rsmbscm\",\"ResultType\":2,\"ToolTip\":\"rsmbscm\"},{\"CompletionText\":\"rsmbt\",\"ListItemText\":\"rsmbt\",\"ResultType\":2,\"ToolTip\":\"rsmbt\"},{\"CompletionText\":\"rsn\",\"ListItemText\":\"rsn\",\"ResultType\":2,\"ToolTip\":\"Remove-PSSession\"},{\"CompletionText\":\"rsop.msc\",\"ListItemText\":\"rsop.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rsop.msc\"},{\"CompletionText\":\"rstrui.exe\",\"ListItemText\":\"rstrui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rstrui.exe\"},{\"CompletionText\":\"rtcfg\",\"ListItemText\":\"rtcfg\",\"ResultType\":2,\"ToolTip\":\"rtcfg\"},{\"CompletionText\":\"runas.exe\",\"ListItemText\":\"runas.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\runas.exe\"},{\"CompletionText\":\"rundll32.exe\",\"ListItemText\":\"rundll32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rundll32.exe\"},{\"CompletionText\":\"runexehelper.exe\",\"ListItemText\":\"runexehelper.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\runexehelper.exe\"},{\"CompletionText\":\"RunLegacyCPLElevated.exe\",\"ListItemText\":\"RunLegacyCPLElevated.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RunLegacyCPLElevated.exe\"},{\"CompletionText\":\"runonce.exe\",\"ListItemText\":\"runonce.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\runonce.exe\"},{\"CompletionText\":\"RuntimeBroker.exe\",\"ListItemText\":\"RuntimeBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\RuntimeBroker.exe\"},{\"CompletionText\":\"rv\",\"ListItemText\":\"rv\",\"ResultType\":2,\"ToolTip\":\"Remove-Variable\"},{\"CompletionText\":\"rvpa\",\"ListItemText\":\"rvpa\",\"ResultType\":2,\"ToolTip\":\"Resolve-Path\"},{\"CompletionText\":\"rwinsta.exe\",\"ListItemText\":\"rwinsta.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\rwinsta.exe\"},{\"CompletionText\":\"S:\",\"ListItemText\":\"S:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nS: \\r\\n\"},{\"CompletionText\":\"sacfg\",\"ListItemText\":\"sacfg\",\"ResultType\":2,\"ToolTip\":\"sacfg\"},{\"CompletionText\":\"SafeGetCommand\",\"ListItemText\":\"SafeGetCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSafeGetCommand \\r\\n\"},{\"CompletionText\":\"sajb\",\"ListItemText\":\"sajb\",\"ResultType\":2,\"ToolTip\":\"Start-Job\"},{\"CompletionText\":\"sal\",\"ListItemText\":\"sal\",\"ResultType\":2,\"ToolTip\":\"Set-Alias\"},{\"CompletionText\":\"saps\",\"ListItemText\":\"saps\",\"ResultType\":2,\"ToolTip\":\"Start-Process\"},{\"CompletionText\":\"sasv\",\"ListItemText\":\"sasv\",\"ResultType\":2,\"ToolTip\":\"Start-Service\"},{\"CompletionText\":\"Save-AzApiManagementTenantGitConfiguration\",\"ListItemText\":\"Save-AzApiManagementTenantGitConfiguration\",\"ResultType\":2,\"ToolTip\":\"Save-AzApiManagementTenantGitConfiguration\\r\\n\"},{\"CompletionText\":\"Save-AzContext\",\"ListItemText\":\"Save-AzContext\",\"ResultType\":2,\"ToolTip\":\"Save-AzContext\\r\\n\"},{\"CompletionText\":\"Save-AzDataFactoryLog\",\"ListItemText\":\"Save-AzDataFactoryLog\",\"ResultType\":2,\"ToolTip\":\"Save-AzDataFactoryLog\\r\\n\"},{\"CompletionText\":\"Save-AzDeploymentScriptLog\",\"ListItemText\":\"Save-AzDeploymentScriptLog\",\"ResultType\":2,\"ToolTip\":\"Save-AzDeploymentScriptLog\\r\\n\"},{\"CompletionText\":\"Save-AzDeploymentTemplate\",\"ListItemText\":\"Save-AzDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzManagementGroupDeploymentTemplate\",\"ListItemText\":\"Save-AzManagementGroupDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzManagementGroupDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzProfile\",\"ListItemText\":\"Save-AzProfile\",\"ResultType\":2,\"ToolTip\":\"Save-AzProfile\"},{\"CompletionText\":\"Save-AzResourceGroupDeploymentTemplate\",\"ListItemText\":\"Save-AzResourceGroupDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzResourceGroupDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzSubscriptionDeploymentTemplate\",\"ListItemText\":\"Save-AzSubscriptionDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzSubscriptionDeploymentTemplate\"},{\"CompletionText\":\"Save-AzTenantDeploymentTemplate\",\"ListItemText\":\"Save-AzTenantDeploymentTemplate\",\"ResultType\":2,\"ToolTip\":\"Save-AzTenantDeploymentTemplate\\r\\n\"},{\"CompletionText\":\"Save-AzVhd\",\"ListItemText\":\"Save-AzVhd\",\"ResultType\":2,\"ToolTip\":\"Save-AzVhd\\r\\n\"},{\"CompletionText\":\"Save-AzVMImage\",\"ListItemText\":\"Save-AzVMImage\",\"ResultType\":2,\"ToolTip\":\"Save-AzVMImage\\r\\n\"},{\"CompletionText\":\"Save-EtwTraceSession\",\"ListItemText\":\"Save-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Save-Help\",\"ListItemText\":\"Save-Help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Help [-DestinationPath] [[-Module] ] [[-UICulture] ] [-FullyQualifiedModule ] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] []\\r\\n\\r\\nSave-Help [[-Module] ] [[-UICulture] ] -LiteralPath [-FullyQualifiedModule ] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] []\\r\\n\"},{\"CompletionText\":\"Save-Module\",\"ListItemText\":\"Save-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Module \\r\\n\"},{\"CompletionText\":\"Save-NetGPO\",\"ListItemText\":\"Save-NetGPO\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-NetGPO \\r\\n\"},{\"CompletionText\":\"Save-NetworkSwitchConfiguration\",\"ListItemText\":\"Save-NetworkSwitchConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-NetworkSwitchConfiguration \\r\\n\"},{\"CompletionText\":\"Save-Package\",\"ListItemText\":\"Save-Package\",\"ResultType\":2,\"ToolTip\":\"Save-Package\\r\\n\"},{\"CompletionText\":\"Save-PSResource\",\"ListItemText\":\"Save-PSResource\",\"ResultType\":2,\"ToolTip\":\"Save-PSResource\\r\\n\"},{\"CompletionText\":\"Save-Script\",\"ListItemText\":\"Save-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Script \\r\\n\"},{\"CompletionText\":\"Save-SoftwareInventory\",\"ListItemText\":\"Save-SoftwareInventory\",\"ResultType\":2,\"ToolTip\":\"Save-SoftwareInventory\\r\\n\"},{\"CompletionText\":\"Save-StorageDataCollection\",\"ListItemText\":\"Save-StorageDataCollection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-StorageDataCollection \\r\\n\"},{\"CompletionText\":\"Save-VM\",\"ListItemText\":\"Save-VM\",\"ResultType\":2,\"ToolTip\":\"Save-VM\\r\\n\"},{\"CompletionText\":\"Save-WindowsImage\",\"ListItemText\":\"Save-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Save-WindowsImage\\r\\n\"},{\"CompletionText\":\"savm\",\"ListItemText\":\"savm\",\"ResultType\":2,\"ToolTip\":\"savm\"},{\"CompletionText\":\"sbp\",\"ListItemText\":\"sbp\",\"ResultType\":2,\"ToolTip\":\"Set-PSBreakpoint\"},{\"CompletionText\":\"sc.exe\",\"ListItemText\":\"sc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sc.exe\"},{\"CompletionText\":\"scalar.exe\",\"ListItemText\":\"scalar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\scalar.exe\"},{\"CompletionText\":\"scb\",\"ListItemText\":\"scb\",\"ResultType\":2,\"ToolTip\":\"Set-Clipboard\"},{\"CompletionText\":\"scdaemon.exe\",\"ListItemText\":\"scdaemon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Gpg4win\\\\..\\\\GnuPG\\\\bin\\\\scdaemon.exe\"},{\"CompletionText\":\"schemagen.exe\",\"ListItemText\":\"schemagen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\schemagen.exe\"},{\"CompletionText\":\"schtasks.exe\",\"ListItemText\":\"schtasks.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\schtasks.exe\"},{\"CompletionText\":\"scim\",\"ListItemText\":\"scim\",\"ResultType\":2,\"ToolTip\":\"scim\"},{\"CompletionText\":\"scp.exe\",\"ListItemText\":\"scp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\scp.exe\"},{\"CompletionText\":\"scrcons.exe\",\"ListItemText\":\"scrcons.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\scrcons.exe\"},{\"CompletionText\":\"ScriptRunner.exe\",\"ListItemText\":\"ScriptRunner.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ScriptRunner.exe\"},{\"CompletionText\":\"sdbinst.exe\",\"ListItemText\":\"sdbinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdbinst.exe\"},{\"CompletionText\":\"sdchange.exe\",\"ListItemText\":\"sdchange.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdchange.exe\"},{\"CompletionText\":\"sdclt.exe\",\"ListItemText\":\"sdclt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdclt.exe\"},{\"CompletionText\":\"sdiagnhost.exe\",\"ListItemText\":\"sdiagnhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sdiagnhost.exe\"},{\"CompletionText\":\"Search-AzDataProtectionBackupInstanceInAzGraph\",\"ListItemText\":\"Search-AzDataProtectionBackupInstanceInAzGraph\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSearch-AzDataProtectionBackupInstanceInAzGraph \\r\\n\"},{\"CompletionText\":\"Search-AzDataProtectionJobInAzGraph\",\"ListItemText\":\"Search-AzDataProtectionJobInAzGraph\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSearch-AzDataProtectionJobInAzGraph \\r\\n\"},{\"CompletionText\":\"SearchFilterHost.exe\",\"ListItemText\":\"SearchFilterHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SearchFilterHost.exe\"},{\"CompletionText\":\"SearchIndexer.exe\",\"ListItemText\":\"SearchIndexer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SearchIndexer.exe\"},{\"CompletionText\":\"SearchProtocolHost.exe\",\"ListItemText\":\"SearchProtocolHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SearchProtocolHost.exe\"},{\"CompletionText\":\"SecEdit.exe\",\"ListItemText\":\"SecEdit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecEdit.exe\"},{\"CompletionText\":\"secinit.exe\",\"ListItemText\":\"secinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\secinit.exe\"},{\"CompletionText\":\"secpol.msc\",\"ListItemText\":\"secpol.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\secpol.msc\"},{\"CompletionText\":\"SecureBootEncodeUEFI.exe\",\"ListItemText\":\"SecureBootEncodeUEFI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecureBootEncodeUEFI.exe\"},{\"CompletionText\":\"securekernel.exe\",\"ListItemText\":\"securekernel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\securekernel.exe\"},{\"CompletionText\":\"SecurityHealthHost.exe\",\"ListItemText\":\"SecurityHealthHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecurityHealthHost.exe\"},{\"CompletionText\":\"SecurityHealthService.exe\",\"ListItemText\":\"SecurityHealthService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecurityHealthService.exe\"},{\"CompletionText\":\"SecurityHealthSystray.exe\",\"ListItemText\":\"SecurityHealthSystray.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SecurityHealthSystray.exe\"},{\"CompletionText\":\"select\",\"ListItemText\":\"select\",\"ResultType\":2,\"ToolTip\":\"Select-Object\"},{\"CompletionText\":\"Select-AzContext\",\"ListItemText\":\"Select-AzContext\",\"ResultType\":2,\"ToolTip\":\"Select-AzContext\\r\\n\"},{\"CompletionText\":\"Select-AzSubscription\",\"ListItemText\":\"Select-AzSubscription\",\"ResultType\":2,\"ToolTip\":\"Select-AzSubscription\"},{\"CompletionText\":\"Select-Object\",\"ListItemText\":\"Select-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSelect-Object [[-Property] ] [-InputObject ] [-ExcludeProperty ] [-ExpandProperty ] [-Unique] [-CaseInsensitive] [-Last ] [-First ] [-Skip ] [-Wait] []\\r\\n\\r\\nSelect-Object [[-Property] ] [-InputObject ] [-ExcludeProperty ] [-ExpandProperty ] [-Unique] [-CaseInsensitive] [-Skip ] [-SkipLast ] []\\r\\n\\r\\nSelect-Object [-InputObject ] [-Unique] [-CaseInsensitive] [-Wait] [-Index ] []\\r\\n\\r\\nSelect-Object [-InputObject ] [-Unique] [-CaseInsensitive] [-SkipIndex ] []\\r\\n\"},{\"CompletionText\":\"Select-String\",\"ListItemText\":\"Select-String\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSelect-String [-Pattern] [-Path] [-Culture ] [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -InputObject [-Culture ] [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -InputObject -Raw [-Culture ] [-SimpleMatch] [-CaseSensitive] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] [-Path] -Raw [-Culture ] [-SimpleMatch] [-CaseSensitive] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -LiteralPath [-Culture ] [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\\r\\nSelect-String [-Pattern] -LiteralPath -Raw [-Culture ] [-SimpleMatch] [-CaseSensitive] [-List] [-NoEmphasis] [-Include ] [-Exclude ] [-NotMatch] [-AllMatches] [-Encoding ] [-Context ] []\\r\\n\"},{\"CompletionText\":\"Select-Xml\",\"ListItemText\":\"Select-Xml\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSelect-Xml [-XPath] [-Xml] [-Namespace ] []\\r\\n\\r\\nSelect-Xml [-XPath] [-Path] [-Namespace ] []\\r\\n\\r\\nSelect-Xml [-XPath] -LiteralPath [-Namespace ] []\\r\\n\\r\\nSelect-Xml [-XPath] -Content [-Namespace ] []\\r\\n\"},{\"CompletionText\":\"Send-AzIotHubD2CMessage\",\"ListItemText\":\"Send-AzIotHubD2CMessage\",\"ResultType\":2,\"ToolTip\":\"Send-AzIotHubD2CMessage\"},{\"CompletionText\":\"Send-AzIotHubDevice2CloudMessage\",\"ListItemText\":\"Send-AzIotHubDevice2CloudMessage\",\"ResultType\":2,\"ToolTip\":\"Send-AzIotHubDevice2CloudMessage\\r\\n\"},{\"CompletionText\":\"Send-AzWvdUserSessionMessage\",\"ListItemText\":\"Send-AzWvdUserSessionMessage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-AzWvdUserSessionMessage \\r\\n\"},{\"CompletionText\":\"Send-Completions\",\"ListItemText\":\"Send-Completions\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-Completions \\r\\n\"},{\"CompletionText\":\"Send-DtcDiagnosticTransaction\",\"ListItemText\":\"Send-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Send-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"Send-EtwTraceSession\",\"ListItemText\":\"Send-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Send-Feedback\",\"ListItemText\":\"Send-Feedback\",\"ResultType\":2,\"ToolTip\":\"Send-Feedback\\r\\n\"},{\"CompletionText\":\"Send-MailMessage\",\"ListItemText\":\"Send-MailMessage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSend-MailMessage [-To] [[-Subject] ] [[-Body] ] [[-SmtpServer] ] -From [-Attachments ] [-Bcc ] [-BodyAsHtml] [-Encoding ] [-Cc ] [-DeliveryNotificationOption ] [-Priority ] [-ReplyTo ] [-Credential ] [-UseSsl] [-Port ] []\\r\\n\"},{\"CompletionText\":\"SensorDataService.exe\",\"ListItemText\":\"SensorDataService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SensorDataService.exe\"},{\"CompletionText\":\"SensorRuntimeBroker.exe\",\"ListItemText\":\"SensorRuntimeBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SensorRuntimeBroker.exe\"},{\"CompletionText\":\"serialver.exe\",\"ListItemText\":\"serialver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\serialver.exe\"},{\"CompletionText\":\"servertool.exe\",\"ListItemText\":\"servertool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\servertool.exe\"},{\"CompletionText\":\"services.exe\",\"ListItemText\":\"services.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\services.exe\"},{\"CompletionText\":\"services.msc\",\"ListItemText\":\"services.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\services.msc\"},{\"CompletionText\":\"sessionmsg.exe\",\"ListItemText\":\"sessionmsg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sessionmsg.exe\"},{\"CompletionText\":\"set\",\"ListItemText\":\"set\",\"ResultType\":2,\"ToolTip\":\"Set-Variable\"},{\"CompletionText\":\"Set-Acl\",\"ListItemText\":\"Set-Acl\",\"ResultType\":2,\"ToolTip\":\"Set-Acl\\r\\n\"},{\"CompletionText\":\"Set-AdlAnalyticsAccount\",\"ListItemText\":\"Set-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AdlAnalyticsAccount\"},{\"CompletionText\":\"Set-AdlAnalyticsDataSource\",\"ListItemText\":\"Set-AdlAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Set-AdlAnalyticsDataSource\"},{\"CompletionText\":\"Set-AdlAnalyticsFirewallRule\",\"ListItemText\":\"Set-AdlAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AdlAnalyticsFirewallRule\"},{\"CompletionText\":\"Set-AdlCatalogCredential\",\"ListItemText\":\"Set-AdlCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AdlCatalogCredential\"},{\"CompletionText\":\"Set-AdlCatalogItemAclEntry\",\"ListItemText\":\"Set-AdlCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AdlCatalogItemAclEntry\"},{\"CompletionText\":\"Set-AdlCatalogSecret\",\"ListItemText\":\"Set-AdlCatalogSecret\",\"ResultType\":2,\"ToolTip\":\"Set-AdlCatalogSecret\"},{\"CompletionText\":\"Set-AdlStore\",\"ListItemText\":\"Set-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStore\"},{\"CompletionText\":\"Set-AdlStoreFirewallRule\",\"ListItemText\":\"Set-AdlStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreFirewallRule\"},{\"CompletionText\":\"Set-AdlStoreItemAcl\",\"ListItemText\":\"Set-AdlStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemAcl\"},{\"CompletionText\":\"Set-AdlStoreItemAclEntry\",\"ListItemText\":\"Set-AdlStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemAclEntry\"},{\"CompletionText\":\"Set-AdlStoreItemExpiry\",\"ListItemText\":\"Set-AdlStoreItemExpiry\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemExpiry\"},{\"CompletionText\":\"Set-AdlStoreItemOwner\",\"ListItemText\":\"Set-AdlStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemOwner\"},{\"CompletionText\":\"Set-AdlStoreItemPermission\",\"ListItemText\":\"Set-AdlStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreItemPermission\"},{\"CompletionText\":\"Set-AdlStoreTrustedIdProvider\",\"ListItemText\":\"Set-AdlStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreTrustedIdProvider\"},{\"CompletionText\":\"Set-AdlStoreVirtualNetworkRule\",\"ListItemText\":\"Set-AdlStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Set-AdlStoreVirtualNetworkRule\"},{\"CompletionText\":\"Set-Alias\",\"ListItemText\":\"Set-Alias\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Alias [-Name] [-Value] [-Description ] [-Option ] [-PassThru] [-Scope ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-AppBackgroundTaskResourcePolicy\",\"ListItemText\":\"Set-AppBackgroundTaskResourcePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AppBackgroundTaskResourcePolicy\\r\\n\"},{\"CompletionText\":\"Set-AppLockerPolicy\",\"ListItemText\":\"Set-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"Set-AppPackageAutoUpdateSettings\",\"ListItemText\":\"Set-AppPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AppPackageAutoUpdateSettings\"},{\"CompletionText\":\"Set-AppPackageDefaultVolume\",\"ListItemText\":\"Set-AppPackageDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Set-AppPackageDefaultVolume\"},{\"CompletionText\":\"Set-AppPackageProvisionedDataFile\",\"ListItemText\":\"Set-AppPackageProvisionedDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-AppPackageProvisionedDataFile\"},{\"CompletionText\":\"Set-AppxDefaultVolume\",\"ListItemText\":\"Set-AppxDefaultVolume\",\"ResultType\":2,\"ToolTip\":\"Set-AppxDefaultVolume\\r\\n\"},{\"CompletionText\":\"Set-AppxPackageAutoUpdateSettings\",\"ListItemText\":\"Set-AppxPackageAutoUpdateSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AppxPackageAutoUpdateSettings\\r\\n\"},{\"CompletionText\":\"Set-AppXProvisionedDataFile\",\"ListItemText\":\"Set-AppXProvisionedDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-AppXProvisionedDataFile\\r\\n\"},{\"CompletionText\":\"Set-ASRAlertSetting\",\"ListItemText\":\"Set-ASRAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Set-ASRAlertSetting\"},{\"CompletionText\":\"Set-ASRNotificationSetting\",\"ListItemText\":\"Set-ASRNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Set-ASRNotificationSetting\"},{\"CompletionText\":\"Set-ASRReplicationProtectedItem\",\"ListItemText\":\"Set-ASRReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Set-ASRReplicationProtectedItem\"},{\"CompletionText\":\"Set-ASRVaultContext\",\"ListItemText\":\"Set-ASRVaultContext\",\"ResultType\":2,\"ToolTip\":\"Set-ASRVaultContext\"},{\"CompletionText\":\"Set-ASRVaultSettings\",\"ListItemText\":\"Set-ASRVaultSettings\",\"ResultType\":2,\"ToolTip\":\"Set-ASRVaultSettings\"},{\"CompletionText\":\"Set-AssignedAccess\",\"ListItemText\":\"Set-AssignedAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AssignedAccess \\r\\n\"},{\"CompletionText\":\"Set-AuthenticodeSignature\",\"ListItemText\":\"Set-AuthenticodeSignature\",\"ResultType\":2,\"ToolTip\":\"Set-AuthenticodeSignature\\r\\n\"},{\"CompletionText\":\"Set-AutologgerConfig\",\"ListItemText\":\"Set-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AutologgerConfig\"},{\"CompletionText\":\"Set-AzActionGroup\",\"ListItemText\":\"Set-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Set-AzADApplication\",\"ListItemText\":\"Set-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzADApplication\"},{\"CompletionText\":\"Set-AzADServicePrincipal\",\"ListItemText\":\"Set-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"Set-AzADServicePrincipal\"},{\"CompletionText\":\"Set-AzADUser\",\"ListItemText\":\"Set-AzADUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzADUser\"},{\"CompletionText\":\"Set-AzAdvisorConfiguration\",\"ListItemText\":\"Set-AzAdvisorConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzAdvisorConfiguration \\r\\n\"},{\"CompletionText\":\"Set-AzAksCluster\",\"ListItemText\":\"Set-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"Set-AzAksCluster\\r\\n\"},{\"CompletionText\":\"Set-AzAksClusterCredential\",\"ListItemText\":\"Set-AzAksClusterCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzAksClusterCredential\\r\\n\"},{\"CompletionText\":\"Set-AzAlertsSuppressionRule\",\"ListItemText\":\"Set-AzAlertsSuppressionRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzAlertsSuppressionRule\\r\\n\"},{\"CompletionText\":\"Set-AzAnalysisServicesServer\",\"ListItemText\":\"Set-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Set-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagement\",\"ListItemText\":\"Set-AzApiManagement\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagement\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApi\",\"ListItemText\":\"Set-AzApiManagementApi\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApi\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApiRevision\",\"ListItemText\":\"Set-AzApiManagementApiRevision\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApiRevision\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApiSchema\",\"ListItemText\":\"Set-AzApiManagementApiSchema\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApiSchema\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementApiVersionSet\",\"ListItemText\":\"Set-AzApiManagementApiVersionSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementApiVersionSet\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementAuthorizationServer\",\"ListItemText\":\"Set-AzApiManagementAuthorizationServer\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementAuthorizationServer\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementBackend\",\"ListItemText\":\"Set-AzApiManagementBackend\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementBackend\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementCertificate\",\"ListItemText\":\"Set-AzApiManagementCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementDiagnostic\",\"ListItemText\":\"Set-AzApiManagementDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementGroup\",\"ListItemText\":\"Set-AzApiManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementGroup\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementIdentityProvider\",\"ListItemText\":\"Set-AzApiManagementIdentityProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementIdentityProvider\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementLogger\",\"ListItemText\":\"Set-AzApiManagementLogger\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementLogger\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementNamedValue\",\"ListItemText\":\"Set-AzApiManagementNamedValue\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementNamedValue\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementOpenIdConnectProvider\",\"ListItemText\":\"Set-AzApiManagementOpenIdConnectProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementOpenIdConnectProvider\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementOperation\",\"ListItemText\":\"Set-AzApiManagementOperation\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementOperation\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementPolicy\",\"ListItemText\":\"Set-AzApiManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementProduct\",\"ListItemText\":\"Set-AzApiManagementProduct\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementProduct\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementSubscription\",\"ListItemText\":\"Set-AzApiManagementSubscription\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementSubscription\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementTenantAccess\",\"ListItemText\":\"Set-AzApiManagementTenantAccess\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementTenantAccess\\r\\n\"},{\"CompletionText\":\"Set-AzApiManagementUser\",\"ListItemText\":\"Set-AzApiManagementUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzApiManagementUser\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGateway\",\"ListItemText\":\"Set-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayAuthenticationCertificate\",\"ListItemText\":\"Set-AzApplicationGatewayAuthenticationCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayAuthenticationCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayAutoscaleConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendAddressPool\",\"ListItemText\":\"Set-AzApplicationGatewayBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendHttpSetting\",\"ListItemText\":\"Set-AzApplicationGatewayBackendHttpSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendHttpSetting\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendHttpSettings\",\"ListItemText\":\"Set-AzApplicationGatewayBackendHttpSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendHttpSettings\"},{\"CompletionText\":\"Set-AzApplicationGatewayBackendSetting\",\"ListItemText\":\"Set-AzApplicationGatewayBackendSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayBackendSetting\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayClientAuthConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayClientAuthConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayClientAuthConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayConnectionDraining\",\"ListItemText\":\"Set-AzApplicationGatewayConnectionDraining\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayConnectionDraining\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayCustomError\",\"ListItemText\":\"Set-AzApplicationGatewayCustomError\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayCustomError\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayFirewallPolicy\",\"ListItemText\":\"Set-AzApplicationGatewayFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayFrontendIPConfig\",\"ListItemText\":\"Set-AzApplicationGatewayFrontendIPConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayFrontendIPConfig\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayFrontendPort\",\"ListItemText\":\"Set-AzApplicationGatewayFrontendPort\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayFrontendPort\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayHttpListener\",\"ListItemText\":\"Set-AzApplicationGatewayHttpListener\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayHttpListener\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayHttpListenerCustomError\",\"ListItemText\":\"Set-AzApplicationGatewayHttpListenerCustomError\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayHttpListenerCustomError\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayIdentity\",\"ListItemText\":\"Set-AzApplicationGatewayIdentity\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayIdentity\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayIPConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayIPConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayIPConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayListener\",\"ListItemText\":\"Set-AzApplicationGatewayListener\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayListener\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayPrivateLinkConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayPrivateLinkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayPrivateLinkConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayProbeConfig\",\"ListItemText\":\"Set-AzApplicationGatewayProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayProbeConfig\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRedirectConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayRedirectConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRedirectConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRequestRoutingRule\",\"ListItemText\":\"Set-AzApplicationGatewayRequestRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRequestRoutingRule\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRewriteRuleSet\",\"ListItemText\":\"Set-AzApplicationGatewayRewriteRuleSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRewriteRuleSet\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayRoutingRule\",\"ListItemText\":\"Set-AzApplicationGatewayRoutingRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayRoutingRule\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySku\",\"ListItemText\":\"Set-AzApplicationGatewaySku\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySku\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslCertificate\",\"ListItemText\":\"Set-AzApplicationGatewaySslCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslPolicy\",\"ListItemText\":\"Set-AzApplicationGatewaySslPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslProfile\",\"ListItemText\":\"Set-AzApplicationGatewaySslProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslProfile\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewaySslProfilePolicy\",\"ListItemText\":\"Set-AzApplicationGatewaySslProfilePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewaySslProfilePolicy\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayTrustedClientCertificate\",\"ListItemText\":\"Set-AzApplicationGatewayTrustedClientCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayTrustedClientCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayTrustedRootCertificate\",\"ListItemText\":\"Set-AzApplicationGatewayTrustedRootCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayTrustedRootCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayUrlPathMapConfig\",\"ListItemText\":\"Set-AzApplicationGatewayUrlPathMapConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayUrlPathMapConfig\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ListItemText\":\"Set-AzApplicationGatewayWebApplicationFirewallConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzApplicationGatewayWebApplicationFirewallConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzApplicationInsightsContinuousExport\",\"ListItemText\":\"Set-AzApplicationInsightsContinuousExport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzApplicationInsightsContinuousExport \\r\\n\"},{\"CompletionText\":\"Set-AzApplicationInsightsDailyCap\",\"ListItemText\":\"Set-AzApplicationInsightsDailyCap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzApplicationInsightsDailyCap \\r\\n\"},{\"CompletionText\":\"Set-AzApplicationInsightsPricingPlan\",\"ListItemText\":\"Set-AzApplicationInsightsPricingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzApplicationInsightsPricingPlan \\r\\n\"},{\"CompletionText\":\"Set-AzAppServicePlan\",\"ListItemText\":\"Set-AzAppServicePlan\",\"ResultType\":2,\"ToolTip\":\"Set-AzAppServicePlan\\r\\n\"},{\"CompletionText\":\"Set-AzAs\",\"ListItemText\":\"Set-AzAs\",\"ResultType\":2,\"ToolTip\":\"Set-AzAs\"},{\"CompletionText\":\"Set-AzAttestationPolicy\",\"ListItemText\":\"Set-AzAttestationPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzAttestationPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationAccount\",\"ListItemText\":\"Set-AzAutomationAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationAccount\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationCertificate\",\"ListItemText\":\"Set-AzAutomationCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationConnectionFieldValue\",\"ListItemText\":\"Set-AzAutomationConnectionFieldValue\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationConnectionFieldValue\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationCredential\",\"ListItemText\":\"Set-AzAutomationCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationCredential\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationDscNode\",\"ListItemText\":\"Set-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationHybridRunbookWorkerGroup\",\"ListItemText\":\"Set-AzAutomationHybridRunbookWorkerGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationHybridRunbookWorkerGroup\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationModule\",\"ListItemText\":\"Set-AzAutomationModule\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationModule\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationPython3Package\",\"ListItemText\":\"Set-AzAutomationPython3Package\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationPython3Package\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationRunbook\",\"ListItemText\":\"Set-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationSchedule\",\"ListItemText\":\"Set-AzAutomationSchedule\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationSchedule\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationVariable\",\"ListItemText\":\"Set-AzAutomationVariable\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationVariable\\r\\n\"},{\"CompletionText\":\"Set-AzAutomationWebhook\",\"ListItemText\":\"Set-AzAutomationWebhook\",\"ResultType\":2,\"ToolTip\":\"Set-AzAutomationWebhook\\r\\n\"},{\"CompletionText\":\"Set-AzBastion\",\"ListItemText\":\"Set-AzBastion\",\"ResultType\":2,\"ToolTip\":\"Set-AzBastion\\r\\n\"},{\"CompletionText\":\"Set-AzBatchAccount\",\"ListItemText\":\"Set-AzBatchAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchAccount\\r\\n\"},{\"CompletionText\":\"Set-AzBatchApplication\",\"ListItemText\":\"Set-AzBatchApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchApplication\\r\\n\"},{\"CompletionText\":\"Set-AzBatchComputeNodeUser\",\"ListItemText\":\"Set-AzBatchComputeNodeUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchComputeNodeUser\\r\\n\"},{\"CompletionText\":\"Set-AzBatchJob\",\"ListItemText\":\"Set-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Set-AzBatchJobSchedule\",\"ListItemText\":\"Set-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Set-AzBatchPool\",\"ListItemText\":\"Set-AzBatchPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchPool\\r\\n\"},{\"CompletionText\":\"Set-AzBatchTask\",\"ListItemText\":\"Set-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Set-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Set-AzCloudServiceUpdateDomain\",\"ListItemText\":\"Set-AzCloudServiceUpdateDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzCloudServiceUpdateDomain \\r\\n\"},{\"CompletionText\":\"Set-AzCognitiveServicesAccount\",\"ListItemText\":\"Set-AzCognitiveServicesAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzCognitiveServicesAccount\\r\\n\"},{\"CompletionText\":\"Set-AzConsumptionBudget\",\"ListItemText\":\"Set-AzConsumptionBudget\",\"ResultType\":2,\"ToolTip\":\"Set-AzConsumptionBudget\\r\\n\"},{\"CompletionText\":\"Set-AzContext\",\"ListItemText\":\"Set-AzContext\",\"ResultType\":2,\"ToolTip\":\"Set-AzContext\\r\\n\"},{\"CompletionText\":\"Set-AzCurrentStorageAccount\",\"ListItemText\":\"Set-AzCurrentStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzCurrentStorageAccount\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeBandwidthSchedule\",\"ListItemText\":\"Set-AzDataBoxEdgeBandwidthSchedule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeBandwidthSchedule\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeRole\",\"ListItemText\":\"Set-AzDataBoxEdgeRole\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeRole\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeShare\",\"ListItemText\":\"Set-AzDataBoxEdgeShare\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeShare\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeStorageAccountCredential\",\"ListItemText\":\"Set-AzDataBoxEdgeStorageAccountCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeStorageAccountCredential\\r\\n\"},{\"CompletionText\":\"Set-AzDataBoxEdgeUser\",\"ListItemText\":\"Set-AzDataBoxEdgeUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataBoxEdgeUser\\r\\n\"},{\"CompletionText\":\"Set-AzDataCollectionRule\",\"ListItemText\":\"Set-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryGateway\",\"ListItemText\":\"Set-AzDataFactoryGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryGateway\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryPipelineActivePeriod\",\"ListItemText\":\"Set-AzDataFactoryPipelineActivePeriod\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryPipelineActivePeriod\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactorySliceStatus\",\"ListItemText\":\"Set-AzDataFactorySliceStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactorySliceStatus\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2\",\"ListItemText\":\"Set-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2DataFlow\",\"ListItemText\":\"Set-AzDataFactoryV2DataFlow\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2DataFlow\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2Dataset\",\"ListItemText\":\"Set-AzDataFactoryV2Dataset\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2Dataset\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Set-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2LinkedService\",\"ListItemText\":\"Set-AzDataFactoryV2LinkedService\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2LinkedService\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2Pipeline\",\"ListItemText\":\"Set-AzDataFactoryV2Pipeline\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2Pipeline\\r\\n\"},{\"CompletionText\":\"Set-AzDataFactoryV2Trigger\",\"ListItemText\":\"Set-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Set-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsCatalogCredential\",\"ListItemText\":\"Set-AzDataLakeAnalyticsCatalogCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsCatalogCredential\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ListItemText\":\"Set-AzDataLakeAnalyticsCatalogItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsCatalogItemAclEntry\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsDataSource\",\"ListItemText\":\"Set-AzDataLakeAnalyticsDataSource\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsDataSource\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeAnalyticsFirewallRule\",\"ListItemText\":\"Set-AzDataLakeAnalyticsFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeAnalyticsFirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeGen2AclRecursive\",\"ListItemText\":\"Set-AzDataLakeGen2AclRecursive\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeGen2AclRecursive\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeGen2ItemAclObject\",\"ListItemText\":\"Set-AzDataLakeGen2ItemAclObject\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeGen2ItemAclObject\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreAccount\",\"ListItemText\":\"Set-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreFirewallRule\",\"ListItemText\":\"Set-AzDataLakeStoreFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreFirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemAcl\",\"ListItemText\":\"Set-AzDataLakeStoreItemAcl\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemAcl\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemAclEntry\",\"ListItemText\":\"Set-AzDataLakeStoreItemAclEntry\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemAclEntry\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemExpiry\",\"ListItemText\":\"Set-AzDataLakeStoreItemExpiry\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemExpiry\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemOwner\",\"ListItemText\":\"Set-AzDataLakeStoreItemOwner\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemOwner\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreItemPermission\",\"ListItemText\":\"Set-AzDataLakeStoreItemPermission\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreItemPermission\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreTrustedIdProvider\",\"ListItemText\":\"Set-AzDataLakeStoreTrustedIdProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreTrustedIdProvider\\r\\n\"},{\"CompletionText\":\"Set-AzDataLakeStoreVirtualNetworkRule\",\"ListItemText\":\"Set-AzDataLakeStoreVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataLakeStoreVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Set-AzDataProtectionMSIPermission\",\"ListItemText\":\"Set-AzDataProtectionMSIPermission\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzDataProtectionMSIPermission \\r\\n\"},{\"CompletionText\":\"Set-AzDataShare\",\"ListItemText\":\"Set-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Set-AzDataShare\\r\\n\"},{\"CompletionText\":\"Set-AzDefault\",\"ListItemText\":\"Set-AzDefault\",\"ResultType\":2,\"ToolTip\":\"Set-AzDefault\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerArtifactSource\",\"ListItemText\":\"Set-AzDeploymentManagerArtifactSource\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerArtifactSource\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerService\",\"ListItemText\":\"Set-AzDeploymentManagerService\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerService\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerServiceTopology\",\"ListItemText\":\"Set-AzDeploymentManagerServiceTopology\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerServiceTopology\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerServiceUnit\",\"ListItemText\":\"Set-AzDeploymentManagerServiceUnit\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerServiceUnit\\r\\n\"},{\"CompletionText\":\"Set-AzDeploymentManagerStep\",\"ListItemText\":\"Set-AzDeploymentManagerStep\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeploymentManagerStep\\r\\n\"},{\"CompletionText\":\"Set-AzDeviceSecurityGroup\",\"ListItemText\":\"Set-AzDeviceSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzDeviceSecurityGroup\\r\\n\"},{\"CompletionText\":\"Set-AzDiskDiskEncryptionKey\",\"ListItemText\":\"Set-AzDiskDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDiskImageReference\",\"ListItemText\":\"Set-AzDiskImageReference\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskImageReference\\r\\n\"},{\"CompletionText\":\"Set-AzDiskKeyEncryptionKey\",\"ListItemText\":\"Set-AzDiskKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDiskSecurityProfile\",\"ListItemText\":\"Set-AzDiskSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskSecurityProfile\\r\\n\"},{\"CompletionText\":\"Set-AzDiskUpdateDiskEncryptionKey\",\"ListItemText\":\"Set-AzDiskUpdateDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskUpdateDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDiskUpdateKeyEncryptionKey\",\"ListItemText\":\"Set-AzDiskUpdateKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzDiskUpdateKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzDnsRecordSet\",\"ListItemText\":\"Set-AzDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Set-AzDnsZone\",\"ListItemText\":\"Set-AzDnsZone\",\"ResultType\":2,\"ToolTip\":\"Set-AzDnsZone\\r\\n\"},{\"CompletionText\":\"Set-AzDtlAllowedVMSizesPolicy\",\"ListItemText\":\"Set-AzDtlAllowedVMSizesPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlAllowedVMSizesPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlAutoShutdownPolicy\",\"ListItemText\":\"Set-AzDtlAutoShutdownPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlAutoShutdownPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlAutoStartPolicy\",\"ListItemText\":\"Set-AzDtlAutoStartPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlAutoStartPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlVMsPerLabPolicy\",\"ListItemText\":\"Set-AzDtlVMsPerLabPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlVMsPerLabPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzDtlVMsPerUserPolicy\",\"ListItemText\":\"Set-AzDtlVMsPerUserPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzDtlVMsPerUserPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzEnvironment\",\"ListItemText\":\"Set-AzEnvironment\",\"ResultType\":2,\"ToolTip\":\"Set-AzEnvironment\\r\\n\"},{\"CompletionText\":\"Set-AzEventGridTopic\",\"ListItemText\":\"Set-AzEventGridTopic\",\"ResultType\":2,\"ToolTip\":\"Set-AzEventGridTopic\\r\\n\"},{\"CompletionText\":\"Set-AzEventHub\",\"ListItemText\":\"Set-AzEventHub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHub \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubApplicationGroup\",\"ListItemText\":\"Set-AzEventHubApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubApplicationGroup \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubAuthorizationRule\",\"ListItemText\":\"Set-AzEventHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubCluster\",\"ListItemText\":\"Set-AzEventHubCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubCluster \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubConsumerGroup\",\"ListItemText\":\"Set-AzEventHubConsumerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubConsumerGroup \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubGeoDRConfigurationBreakPair\",\"ListItemText\":\"Set-AzEventHubGeoDRConfigurationBreakPair\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubGeoDRConfigurationBreakPair \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubGeoDRConfigurationFailOver\",\"ListItemText\":\"Set-AzEventHubGeoDRConfigurationFailOver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubGeoDRConfigurationFailOver \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubNamespace\",\"ListItemText\":\"Set-AzEventHubNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubNamespace \\r\\n\"},{\"CompletionText\":\"Set-AzEventHubNamespaceV2\",\"ListItemText\":\"Set-AzEventHubNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Set-AzEventHubNamespaceV2\"},{\"CompletionText\":\"Set-AzEventHubNetworkRuleSet\",\"ListItemText\":\"Set-AzEventHubNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzEventHubNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCircuit\",\"ListItemText\":\"Set-AzExpressRouteCircuit\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCircuit\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCircuitConnectionConfig\",\"ListItemText\":\"Set-AzExpressRouteCircuitConnectionConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCircuitConnectionConfig\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCircuitPeeringConfig\",\"ListItemText\":\"Set-AzExpressRouteCircuitPeeringConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCircuitPeeringConfig\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteConnection\",\"ListItemText\":\"Set-AzExpressRouteConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteConnection\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteCrossConnection\",\"ListItemText\":\"Set-AzExpressRouteCrossConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteCrossConnection\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRouteGateway\",\"ListItemText\":\"Set-AzExpressRouteGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRouteGateway\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRoutePort\",\"ListItemText\":\"Set-AzExpressRoutePort\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRoutePort\\r\\n\"},{\"CompletionText\":\"Set-AzExpressRoutePortIdentity\",\"ListItemText\":\"Set-AzExpressRoutePortIdentity\",\"ResultType\":2,\"ToolTip\":\"Set-AzExpressRoutePortIdentity\\r\\n\"},{\"CompletionText\":\"Set-AzFirewall\",\"ListItemText\":\"Set-AzFirewall\",\"ResultType\":2,\"ToolTip\":\"Set-AzFirewall\\r\\n\"},{\"CompletionText\":\"Set-AzFirewallPolicy\",\"ListItemText\":\"Set-AzFirewallPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzFirewallPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzFirewallPolicyRuleCollectionGroup\",\"ListItemText\":\"Set-AzFirewallPolicyRuleCollectionGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzFirewallPolicyRuleCollectionGroup\\r\\n\"},{\"CompletionText\":\"Set-AzFrontDoor\",\"ListItemText\":\"Set-AzFrontDoor\",\"ResultType\":2,\"ToolTip\":\"Set-AzFrontDoor\\r\\n\"},{\"CompletionText\":\"Set-AzFrontDoorRulesEngine\",\"ListItemText\":\"Set-AzFrontDoorRulesEngine\",\"ResultType\":2,\"ToolTip\":\"Set-AzFrontDoorRulesEngine\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightClusterAutoscaleConfiguration\",\"ListItemText\":\"Set-AzHDInsightClusterAutoscaleConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightClusterAutoscaleConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightClusterDiskEncryptionKey\",\"ListItemText\":\"Set-AzHDInsightClusterDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightClusterDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightClusterSize\",\"ListItemText\":\"Set-AzHDInsightClusterSize\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightClusterSize\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightDefaultStorage\",\"ListItemText\":\"Set-AzHDInsightDefaultStorage\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightDefaultStorage\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightGatewayCredential\",\"ListItemText\":\"Set-AzHDInsightGatewayCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightGatewayCredential\\r\\n\"},{\"CompletionText\":\"Set-AzHDInsightPersistedScriptAction\",\"ListItemText\":\"Set-AzHDInsightPersistedScriptAction\",\"ResultType\":2,\"ToolTip\":\"Set-AzHDInsightPersistedScriptAction\\r\\n\"},{\"CompletionText\":\"Set-AzImageOsDisk\",\"ListItemText\":\"Set-AzImageOsDisk\",\"ResultType\":2,\"ToolTip\":\"Set-AzImageOsDisk\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccount\",\"ListItemText\":\"Set-AzIntegrationAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccount\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountAgreement\",\"ListItemText\":\"Set-AzIntegrationAccountAgreement\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountAgreement\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountAssembly\",\"ListItemText\":\"Set-AzIntegrationAccountAssembly\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountAssembly\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountBatchConfiguration\",\"ListItemText\":\"Set-AzIntegrationAccountBatchConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountBatchConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountCertificate\",\"ListItemText\":\"Set-AzIntegrationAccountCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountGeneratedIcn\",\"ListItemText\":\"Set-AzIntegrationAccountGeneratedIcn\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountGeneratedIcn\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountMap\",\"ListItemText\":\"Set-AzIntegrationAccountMap\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountMap\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountPartner\",\"ListItemText\":\"Set-AzIntegrationAccountPartner\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountPartner\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountReceivedIcn\",\"ListItemText\":\"Set-AzIntegrationAccountReceivedIcn\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountReceivedIcn\\r\\n\"},{\"CompletionText\":\"Set-AzIntegrationAccountSchema\",\"ListItemText\":\"Set-AzIntegrationAccountSchema\",\"ResultType\":2,\"ToolTip\":\"Set-AzIntegrationAccountSchema\\r\\n\"},{\"CompletionText\":\"Set-AzIotHub\",\"ListItemText\":\"Set-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHub\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubConfiguration\",\"ListItemText\":\"Set-AzIotHubConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDeployment\",\"ListItemText\":\"Set-AzIotHubDeployment\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDeployment\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDevice\",\"ListItemText\":\"Set-AzIotHubDevice\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDevice\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDeviceParent\",\"ListItemText\":\"Set-AzIotHubDeviceParent\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDeviceParent\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubDistributedTracing\",\"ListItemText\":\"Set-AzIotHubDistributedTracing\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubDistributedTracing\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubEdgeModule\",\"ListItemText\":\"Set-AzIotHubEdgeModule\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubEdgeModule\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubMessageEnrichment\",\"ListItemText\":\"Set-AzIotHubMessageEnrichment\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubMessageEnrichment\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubModule\",\"ListItemText\":\"Set-AzIotHubModule\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubModule\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubMsgEnrich\",\"ListItemText\":\"Set-AzIotHubMsgEnrich\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubMsgEnrich\"},{\"CompletionText\":\"Set-AzIotHubRoute\",\"ListItemText\":\"Set-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Set-AzIotHubTracing\",\"ListItemText\":\"Set-AzIotHubTracing\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubTracing\"},{\"CompletionText\":\"Set-AzIotHubVC\",\"ListItemText\":\"Set-AzIotHubVC\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubVC\"},{\"CompletionText\":\"Set-AzIotHubVerifiedCertificate\",\"ListItemText\":\"Set-AzIotHubVerifiedCertificate\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotHubVerifiedCertificate\\r\\n\"},{\"CompletionText\":\"Set-AzIotSecuritySolution\",\"ListItemText\":\"Set-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Set-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Set-AzIpAllocation\",\"ListItemText\":\"Set-AzIpAllocation\",\"ResultType\":2,\"ToolTip\":\"Set-AzIpAllocation\\r\\n\"},{\"CompletionText\":\"Set-AzIpGroup\",\"ListItemText\":\"Set-AzIpGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzIpGroup\\r\\n\"},{\"CompletionText\":\"Set-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Set-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultAccessPolicy\",\"ListItemText\":\"Set-AzKeyVaultAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultCertificateAttribute\",\"ListItemText\":\"Set-AzKeyVaultCertificateAttribute\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultCertificateAttribute\"},{\"CompletionText\":\"Set-AzKeyVaultCertificateIssuer\",\"ListItemText\":\"Set-AzKeyVaultCertificateIssuer\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultCertificateIssuer\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultCertificatePolicy\",\"ListItemText\":\"Set-AzKeyVaultCertificatePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultCertificatePolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultKey\",\"ListItemText\":\"Set-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultKey\"},{\"CompletionText\":\"Set-AzKeyVaultKeyAttribute\",\"ListItemText\":\"Set-AzKeyVaultKeyAttribute\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultKeyAttribute\"},{\"CompletionText\":\"Set-AzKeyVaultKeyRotationPolicy\",\"ListItemText\":\"Set-AzKeyVaultKeyRotationPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultKeyRotationPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultManagedStorageSasDefinition\",\"ListItemText\":\"Set-AzKeyVaultManagedStorageSasDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultManagedStorageSasDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultRoleDefinition\",\"ListItemText\":\"Set-AzKeyVaultRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultRoleDefinition\"},{\"CompletionText\":\"Set-AzKeyVaultSecret\",\"ListItemText\":\"Set-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Set-AzKeyVaultSecretAttribute\",\"ListItemText\":\"Set-AzKeyVaultSecretAttribute\",\"ResultType\":2,\"ToolTip\":\"Set-AzKeyVaultSecretAttribute\"},{\"CompletionText\":\"Set-AzLoadBalancer\",\"ListItemText\":\"Set-AzLoadBalancer\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancer\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerBackendAddressPool\",\"ListItemText\":\"Set-AzLoadBalancerBackendAddressPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerBackendAddressPool\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerFrontendIpConfig\",\"ListItemText\":\"Set-AzLoadBalancerFrontendIpConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerFrontendIpConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerInboundNatPoolConfig\",\"ListItemText\":\"Set-AzLoadBalancerInboundNatPoolConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerInboundNatPoolConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerInboundNatRuleConfig\",\"ListItemText\":\"Set-AzLoadBalancerInboundNatRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerInboundNatRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerOutboundRuleConfig\",\"ListItemText\":\"Set-AzLoadBalancerOutboundRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerOutboundRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerProbeConfig\",\"ListItemText\":\"Set-AzLoadBalancerProbeConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerProbeConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLoadBalancerRuleConfig\",\"ListItemText\":\"Set-AzLoadBalancerRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzLoadBalancerRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzLocalNetworkGateway\",\"ListItemText\":\"Set-AzLocalNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzLocalNetworkGateway\\r\\n\"},{\"CompletionText\":\"Set-AzLogicApp\",\"ListItemText\":\"Set-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Set-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Set-AzManagedApplication\",\"ListItemText\":\"Set-AzManagedApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzManagedApplication\\r\\n\"},{\"CompletionText\":\"Set-AzManagedApplicationDefinition\",\"ListItemText\":\"Set-AzManagedApplicationDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzManagedApplicationDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzMarketplaceTerms\",\"ListItemText\":\"Set-AzMarketplaceTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzMarketplaceTerms \\r\\n\"},{\"CompletionText\":\"Set-AzMediaService\",\"ListItemText\":\"Set-AzMediaService\",\"ResultType\":2,\"ToolTip\":\"Set-AzMediaService\\r\\n\"},{\"CompletionText\":\"Set-AzMediaServiceKey\",\"ListItemText\":\"Set-AzMediaServiceKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzMediaServiceKey\\r\\n\"},{\"CompletionText\":\"Set-AzMigrateDiskMapping\",\"ListItemText\":\"Set-AzMigrateDiskMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzMigrateDiskMapping \\r\\n\"},{\"CompletionText\":\"Set-AzMigrateServerReplication\",\"ListItemText\":\"Set-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Set-AzNatGateway\",\"ListItemText\":\"Set-AzNatGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzNatGateway\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkInterface\",\"ListItemText\":\"Set-AzNetworkInterface\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkInterface\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkInterfaceIpConfig\",\"ListItemText\":\"Set-AzNetworkInterfaceIpConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkInterfaceIpConfig\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkInterfaceTapConfig\",\"ListItemText\":\"Set-AzNetworkInterfaceTapConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkInterfaceTapConfig\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManager\",\"ListItemText\":\"Set-AzNetworkManager\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManager\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerConnectivityConfiguration\",\"ListItemText\":\"Set-AzNetworkManagerConnectivityConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerConnectivityConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerGroup\",\"ListItemText\":\"Set-AzNetworkManagerGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerGroup\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerManagementGroupConnection\",\"ListItemText\":\"Set-AzNetworkManagerManagementGroupConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerManagementGroupConnection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerScopeConnection\",\"ListItemText\":\"Set-AzNetworkManagerScopeConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerScopeConnection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSecurityAdminConfiguration\",\"ListItemText\":\"Set-AzNetworkManagerSecurityAdminConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSecurityAdminConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSecurityAdminRule\",\"ListItemText\":\"Set-AzNetworkManagerSecurityAdminRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSecurityAdminRule\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSecurityAdminRuleCollection\",\"ListItemText\":\"Set-AzNetworkManagerSecurityAdminRuleCollection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSecurityAdminRuleCollection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkManagerSubscriptionConnection\",\"ListItemText\":\"Set-AzNetworkManagerSubscriptionConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkManagerSubscriptionConnection\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkProfile\",\"ListItemText\":\"Set-AzNetworkProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkProfile\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkSecurityGroup\",\"ListItemText\":\"Set-AzNetworkSecurityGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkSecurityGroup\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkSecurityRuleConfig\",\"ListItemText\":\"Set-AzNetworkSecurityRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkSecurityRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkWatcherConfigFlowLog\",\"ListItemText\":\"Set-AzNetworkWatcherConfigFlowLog\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkWatcherConfigFlowLog\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Set-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Set-AzNetworkWatcherFlowLog\",\"ListItemText\":\"Set-AzNetworkWatcherFlowLog\",\"ResultType\":2,\"ToolTip\":\"Set-AzNetworkWatcherFlowLog\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHub\",\"ListItemText\":\"Set-AzNotificationHub\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHub\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubAuthorizationRule\",\"ListItemText\":\"Set-AzNotificationHubAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubAuthorizationRules\",\"ListItemText\":\"Set-AzNotificationHubAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubAuthorizationRules\"},{\"CompletionText\":\"Set-AzNotificationHubsNamespace\",\"ListItemText\":\"Set-AzNotificationHubsNamespace\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubsNamespace\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubsNamespaceAuthorizationRule\",\"ListItemText\":\"Set-AzNotificationHubsNamespaceAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubsNamespaceAuthorizationRule\\r\\n\"},{\"CompletionText\":\"Set-AzNotificationHubsNamespaceAuthorizationRules\",\"ListItemText\":\"Set-AzNotificationHubsNamespaceAuthorizationRules\",\"ResultType\":2,\"ToolTip\":\"Set-AzNotificationHubsNamespaceAuthorizationRules\"},{\"CompletionText\":\"Set-AzOperationalInsightsDataSource\",\"ListItemText\":\"Set-AzOperationalInsightsDataSource\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsDataSource\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsIntelligencePack\",\"ListItemText\":\"Set-AzOperationalInsightsIntelligencePack\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsIntelligencePack\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsLinkedService\",\"ListItemText\":\"Set-AzOperationalInsightsLinkedService\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsLinkedService\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsLinkedStorageAccount\",\"ListItemText\":\"Set-AzOperationalInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsLinkedStorageAccount\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsSavedSearch\",\"ListItemText\":\"Set-AzOperationalInsightsSavedSearch\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsSavedSearch\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsStorageInsight\",\"ListItemText\":\"Set-AzOperationalInsightsStorageInsight\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsStorageInsight\\r\\n\"},{\"CompletionText\":\"Set-AzOperationalInsightsWorkspace\",\"ListItemText\":\"Set-AzOperationalInsightsWorkspace\",\"ResultType\":2,\"ToolTip\":\"Set-AzOperationalInsightsWorkspace\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyAssignment\",\"ListItemText\":\"Set-AzPolicyAssignment\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyAssignment\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyAttestation\",\"ListItemText\":\"Set-AzPolicyAttestation\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyAttestation\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyDefinition\",\"ListItemText\":\"Set-AzPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzPolicyExemption\",\"ListItemText\":\"Set-AzPolicyExemption\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicyExemption\\r\\n\"},{\"CompletionText\":\"Set-AzPolicySetDefinition\",\"ListItemText\":\"Set-AzPolicySetDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzPolicySetDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsRecordSet\",\"ListItemText\":\"Set-AzPrivateDnsRecordSet\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsRecordSet\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsVirtualNetworkLink\",\"ListItemText\":\"Set-AzPrivateDnsVirtualNetworkLink\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsVirtualNetworkLink\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsZone\",\"ListItemText\":\"Set-AzPrivateDnsZone\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsZone\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateDnsZoneGroup\",\"ListItemText\":\"Set-AzPrivateDnsZoneGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateDnsZoneGroup\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateEndpoint\",\"ListItemText\":\"Set-AzPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateEndpoint\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateEndpointConnection\",\"ListItemText\":\"Set-AzPrivateEndpointConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateEndpointConnection\\r\\n\"},{\"CompletionText\":\"Set-AzPrivateLinkService\",\"ListItemText\":\"Set-AzPrivateLinkService\",\"ResultType\":2,\"ToolTip\":\"Set-AzPrivateLinkService\\r\\n\"},{\"CompletionText\":\"Set-AzPublicIpAddress\",\"ListItemText\":\"Set-AzPublicIpAddress\",\"ResultType\":2,\"ToolTip\":\"Set-AzPublicIpAddress\\r\\n\"},{\"CompletionText\":\"Set-AzPublicIpPrefix\",\"ListItemText\":\"Set-AzPublicIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Set-AzPublicIpPrefix\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrAlertSetting\",\"ListItemText\":\"Set-AzRecoveryServicesAsrAlertSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrAlertSetting\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrNotificationSetting\",\"ListItemText\":\"Set-AzRecoveryServicesAsrNotificationSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrNotificationSetting\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrReplicationProtectedItem\",\"ListItemText\":\"Set-AzRecoveryServicesAsrReplicationProtectedItem\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrReplicationProtectedItem\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrVaultContext\",\"ListItemText\":\"Set-AzRecoveryServicesAsrVaultContext\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrVaultContext\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesAsrVaultSettings\",\"ListItemText\":\"Set-AzRecoveryServicesAsrVaultSettings\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesAsrVaultSettings\"},{\"CompletionText\":\"Set-AzRecoveryServicesBackupProperty\",\"ListItemText\":\"Set-AzRecoveryServicesBackupProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesBackupProperty\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesBackupProtectionPolicy\",\"ListItemText\":\"Set-AzRecoveryServicesBackupProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesBackupProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesResourceGuardMapping\",\"ListItemText\":\"Set-AzRecoveryServicesResourceGuardMapping\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesResourceGuardMapping\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesVaultContext\",\"ListItemText\":\"Set-AzRecoveryServicesVaultContext\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesVaultContext\\r\\n\"},{\"CompletionText\":\"Set-AzRecoveryServicesVaultProperty\",\"ListItemText\":\"Set-AzRecoveryServicesVaultProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzRecoveryServicesVaultProperty\\r\\n\"},{\"CompletionText\":\"Set-AzRedisCache\",\"ListItemText\":\"Set-AzRedisCache\",\"ResultType\":2,\"ToolTip\":\"Set-AzRedisCache\\r\\n\"},{\"CompletionText\":\"Set-AzRedisCacheDiagnostic\",\"ListItemText\":\"Set-AzRedisCacheDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzRedisCacheDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzRedisCacheDiagnostics\",\"ListItemText\":\"Set-AzRedisCacheDiagnostics\",\"ResultType\":2,\"ToolTip\":\"Set-AzRedisCacheDiagnostics\"},{\"CompletionText\":\"Set-AzRelayAuthorizationRule\",\"ListItemText\":\"Set-AzRelayAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzRelayAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Set-AzRelayHybridConnection\",\"ListItemText\":\"Set-AzRelayHybridConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzRelayHybridConnection \\r\\n\"},{\"CompletionText\":\"Set-AzRelayNamespaceNetworkRuleSet\",\"ListItemText\":\"Set-AzRelayNamespaceNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzRelayNamespaceNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Set-AzResource\",\"ListItemText\":\"Set-AzResource\",\"ResultType\":2,\"ToolTip\":\"Set-AzResource\\r\\n\"},{\"CompletionText\":\"Set-AzResourceGroup\",\"ListItemText\":\"Set-AzResourceGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzResourceGroup\\r\\n\"},{\"CompletionText\":\"Set-AzResourceLock\",\"ListItemText\":\"Set-AzResourceLock\",\"ResultType\":2,\"ToolTip\":\"Set-AzResourceLock\\r\\n\"},{\"CompletionText\":\"Set-AzRmStorageContainerImmutabilityPolicy\",\"ListItemText\":\"Set-AzRmStorageContainerImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzRmStorageContainerImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzRoleAssignment\",\"ListItemText\":\"Set-AzRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoleAssignment\\r\\n\"},{\"CompletionText\":\"Set-AzRoleDefinition\",\"ListItemText\":\"Set-AzRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoleDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzRouteConfig\",\"ListItemText\":\"Set-AzRouteConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteConfig\\r\\n\"},{\"CompletionText\":\"Set-AzRouteFilter\",\"ListItemText\":\"Set-AzRouteFilter\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteFilter\\r\\n\"},{\"CompletionText\":\"Set-AzRouteFilterRuleConfig\",\"ListItemText\":\"Set-AzRouteFilterRuleConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteFilterRuleConfig\\r\\n\"},{\"CompletionText\":\"Set-AzRouteTable\",\"ListItemText\":\"Set-AzRouteTable\",\"ResultType\":2,\"ToolTip\":\"Set-AzRouteTable\\r\\n\"},{\"CompletionText\":\"Set-AzRoutingIntent\",\"ListItemText\":\"Set-AzRoutingIntent\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoutingIntent\\r\\n\"},{\"CompletionText\":\"Set-AzRoutingPolicy\",\"ListItemText\":\"Set-AzRoutingPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzRoutingPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAlert\",\"ListItemText\":\"Set-AzSecurityAlert\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAlert\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAssessment\",\"ListItemText\":\"Set-AzSecurityAssessment\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAssessment\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAssessmentMetadata\",\"ListItemText\":\"Set-AzSecurityAssessmentMetadata\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAssessmentMetadata\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityAutomation\",\"ListItemText\":\"Set-AzSecurityAutomation\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAutomation\"},{\"CompletionText\":\"Set-AzSecurityAutoProvisioningSetting\",\"ListItemText\":\"Set-AzSecurityAutoProvisioningSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityAutoProvisioningSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityContact\",\"ListItemText\":\"Set-AzSecurityContact\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityContact\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityPartnerProvider\",\"ListItemText\":\"Set-AzSecurityPartnerProvider\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityPartnerProvider\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityPricing\",\"ListItemText\":\"Set-AzSecurityPricing\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityPricing\\r\\n\"},{\"CompletionText\":\"Set-AzSecuritySetting\",\"ListItemText\":\"Set-AzSecuritySetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecuritySetting\\r\\n\"},{\"CompletionText\":\"Set-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ListItemText\":\"Set-AzSecuritySqlVulnerabilityAssessmentBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecuritySqlVulnerabilityAssessmentBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSecurityWorkspaceSetting\",\"ListItemText\":\"Set-AzSecurityWorkspaceSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSecurityWorkspaceSetting\\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusAuthorizationRule\",\"ListItemText\":\"Set-AzServiceBusAuthorizationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusAuthorizationRule \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusGeoDRConfigurationBreakPair\",\"ListItemText\":\"Set-AzServiceBusGeoDRConfigurationBreakPair\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusGeoDRConfigurationBreakPair \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusGeoDRConfigurationFailOver\",\"ListItemText\":\"Set-AzServiceBusGeoDRConfigurationFailOver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusGeoDRConfigurationFailOver \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusNamespace\",\"ListItemText\":\"Set-AzServiceBusNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusNamespace \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusNamespaceV2\",\"ListItemText\":\"Set-AzServiceBusNamespaceV2\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceBusNamespaceV2\"},{\"CompletionText\":\"Set-AzServiceBusNetworkRuleSet\",\"ListItemText\":\"Set-AzServiceBusNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusNetworkRuleSet \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusQueue\",\"ListItemText\":\"Set-AzServiceBusQueue\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusQueue \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusRule\",\"ListItemText\":\"Set-AzServiceBusRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusRule \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusSubscription\",\"ListItemText\":\"Set-AzServiceBusSubscription\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusSubscription \\r\\n\"},{\"CompletionText\":\"Set-AzServiceBusTopic\",\"ListItemText\":\"Set-AzServiceBusTopic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzServiceBusTopic \\r\\n\"},{\"CompletionText\":\"Set-AzServiceEndpointPolicy\",\"ListItemText\":\"Set-AzServiceEndpointPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceEndpointPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzServiceEndpointPolicyDefinition\",\"ListItemText\":\"Set-AzServiceEndpointPolicyDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceEndpointPolicyDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedCluster\",\"ListItemText\":\"Set-AzServiceFabricManagedCluster\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedCluster\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterApplication\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterApplication\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterApplication\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterApplicationType\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterApplicationType\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterApplicationType\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterApplicationTypeVersion\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterApplicationTypeVersion\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedClusterService\",\"ListItemText\":\"Set-AzServiceFabricManagedClusterService\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedClusterService\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricManagedNodeType\",\"ListItemText\":\"Set-AzServiceFabricManagedNodeType\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricManagedNodeType\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricSetting\",\"ListItemText\":\"Set-AzServiceFabricSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricSetting\\r\\n\"},{\"CompletionText\":\"Set-AzServiceFabricUpgradeType\",\"ListItemText\":\"Set-AzServiceFabricUpgradeType\",\"ResultType\":2,\"ToolTip\":\"Set-AzServiceFabricUpgradeType\\r\\n\"},{\"CompletionText\":\"Set-AzSignalRUpstream\",\"ListItemText\":\"Set-AzSignalRUpstream\",\"ResultType\":2,\"ToolTip\":\"Set-AzSignalRUpstream\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotDiskEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotImageReference\",\"ListItemText\":\"Set-AzSnapshotImageReference\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotImageReference\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotKeyEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotUpdateDiskEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotUpdateDiskEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotUpdateDiskEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSnapshotUpdateKeyEncryptionKey\",\"ListItemText\":\"Set-AzSnapshotUpdateKeyEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzSnapshotUpdateKeyEncryptionKey\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabase\",\"ListItemText\":\"Set-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseAdvisorAutoExecuteStatus\",\"ListItemText\":\"Set-AzSqlDatabaseAdvisorAutoExecuteStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseAdvisorAutoExecuteStatus\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseAudit\",\"ListItemText\":\"Set-AzSqlDatabaseAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseAudit\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseDataMaskingPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseDataMaskingPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseDataMaskingPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseDataMaskingRule\",\"ListItemText\":\"Set-AzSqlDatabaseDataMaskingRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseDataMaskingRule\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Set-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseGeoBackupPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseGeoBackupPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseGeoBackupPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Set-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseLongTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseLongTermRetentionPolicy\"},{\"CompletionText\":\"Set-AzSqlDatabaseRecommendedActionState\",\"ListItemText\":\"Set-AzSqlDatabaseRecommendedActionState\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseRecommendedActionState\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseSecondary\",\"ListItemText\":\"Set-AzSqlDatabaseSecondary\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseSecondary\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseSensitivityClassification\",\"ListItemText\":\"Set-AzSqlDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseServerAuditingPolicy\",\"ListItemText\":\"Set-AzSqlDatabaseServerAuditingPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseServerAuditingPolicy\"},{\"CompletionText\":\"Set-AzSqlDatabaseTransparentDataEncryption\",\"ListItemText\":\"Set-AzSqlDatabaseTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Set-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Set-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJob\",\"ListItemText\":\"Set-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJobAgent\",\"ListItemText\":\"Set-AzSqlElasticJobAgent\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJobAgent\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJobCredential\",\"ListItemText\":\"Set-AzSqlElasticJobCredential\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJobCredential\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticJobStep\",\"ListItemText\":\"Set-AzSqlElasticJobStep\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticJobStep\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticPool\",\"ListItemText\":\"Set-AzSqlElasticPool\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticPool\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticPoolAdvisorAutoExecuteStatus\",\"ListItemText\":\"Set-AzSqlElasticPoolAdvisorAutoExecuteStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticPoolAdvisorAutoExecuteStatus\\r\\n\"},{\"CompletionText\":\"Set-AzSqlElasticPoolRecommendedActionState\",\"ListItemText\":\"Set-AzSqlElasticPoolRecommendedActionState\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlElasticPoolRecommendedActionState\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInformationProtectionPolicy\",\"ListItemText\":\"Set-AzSqlInformationProtectionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInformationProtectionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstance\",\"ListItemText\":\"Set-AzSqlInstance\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstance\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceActiveDirectoryAdministrator\",\"ListItemText\":\"Set-AzSqlInstanceActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabase\",\"ListItemText\":\"Set-AzSqlInstanceDatabase\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabase\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseBackupLongTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseBackupShortTermRetentionPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseSensitivityClassification\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Set-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDatabaseVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceDtc\",\"ListItemText\":\"Set-AzSqlInstanceDtc\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceDtc\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceLink\",\"ListItemText\":\"Set-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceLink\"},{\"CompletionText\":\"Set-AzSqlInstancePool\",\"ListItemText\":\"Set-AzSqlInstancePool\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstancePool\\r\\n\"},{\"CompletionText\":\"Set-AzSqlInstanceTDEProtector\",\"ListItemText\":\"Set-AzSqlInstanceTDEProtector\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceTDEProtector\"},{\"CompletionText\":\"Set-AzSqlInstanceTransparentDataEncryptionProtector\",\"ListItemText\":\"Set-AzSqlInstanceTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlInstanceTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServer\",\"ListItemText\":\"Set-AzSqlServer\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServer\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerActiveDirectoryAdministrator\",\"ListItemText\":\"Set-AzSqlServerActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerAdvisorAutoExecuteStatus\",\"ListItemText\":\"Set-AzSqlServerAdvisorAutoExecuteStatus\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerAdvisorAutoExecuteStatus\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerAudit\",\"ListItemText\":\"Set-AzSqlServerAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerAudit\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerConfigurationOption\",\"ListItemText\":\"Set-AzSqlServerConfigurationOption\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerConfigurationOption\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerDisasterRecoveryConfiguration\",\"ListItemText\":\"Set-AzSqlServerDisasterRecoveryConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerDisasterRecoveryConfiguration\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerDnsAlias\",\"ListItemText\":\"Set-AzSqlServerDnsAlias\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerDnsAlias\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerFirewallRule\",\"ListItemText\":\"Set-AzSqlServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerFirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerIpv6FirewallRule\",\"ListItemText\":\"Set-AzSqlServerIpv6FirewallRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerIpv6FirewallRule\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerMSSupportAudit\",\"ListItemText\":\"Set-AzSqlServerMSSupportAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerMSSupportAudit\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerRecommendedActionState\",\"ListItemText\":\"Set-AzSqlServerRecommendedActionState\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerRecommendedActionState\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerTransparentDataEncryptionProtector\",\"ListItemText\":\"Set-AzSqlServerTransparentDataEncryptionProtector\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerTransparentDataEncryptionProtector\\r\\n\"},{\"CompletionText\":\"Set-AzSqlServerTrustGroup\",\"ListItemText\":\"Set-AzSqlServerTrustGroup\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerTrustGroup\"},{\"CompletionText\":\"Set-AzSqlServerVirtualNetworkRule\",\"ListItemText\":\"Set-AzSqlServerVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzSqlServerVirtualNetworkRule\\r\\n\"},{\"CompletionText\":\"Set-AzStackHCI\",\"ListItemText\":\"Set-AzStackHCI\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzStackHCI \\r\\n\"},{\"CompletionText\":\"Set-AzStorageAccount\",\"ListItemText\":\"Set-AzStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageAccount\\r\\n\"},{\"CompletionText\":\"Set-AzStorageAccountManagementPolicy\",\"ListItemText\":\"Set-AzStorageAccountManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageAccountManagementPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobContent\",\"ListItemText\":\"Set-AzStorageBlobContent\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobContent\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobImmutabilityPolicy\",\"ListItemText\":\"Set-AzStorageBlobImmutabilityPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobImmutabilityPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobInventoryPolicy\",\"ListItemText\":\"Set-AzStorageBlobInventoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobInventoryPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobLegalHold\",\"ListItemText\":\"Set-AzStorageBlobLegalHold\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobLegalHold\\r\\n\"},{\"CompletionText\":\"Set-AzStorageBlobTag\",\"ListItemText\":\"Set-AzStorageBlobTag\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageBlobTag\\r\\n\"},{\"CompletionText\":\"Set-AzStorageContainerAcl\",\"ListItemText\":\"Set-AzStorageContainerAcl\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageContainerAcl\\r\\n\"},{\"CompletionText\":\"Set-AzStorageContainerStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageContainerStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageContainerStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageCORSRule\",\"ListItemText\":\"Set-AzStorageCORSRule\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageCORSRule\\r\\n\"},{\"CompletionText\":\"Set-AzStorageFileContent\",\"ListItemText\":\"Set-AzStorageFileContent\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageFileContent\\r\\n\"},{\"CompletionText\":\"Set-AzStorageLocalUser\",\"ListItemText\":\"Set-AzStorageLocalUser\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageLocalUser\\r\\n\"},{\"CompletionText\":\"Set-AzStorageObjectReplicationPolicy\",\"ListItemText\":\"Set-AzStorageObjectReplicationPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageObjectReplicationPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageQueueStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageQueueStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageQueueStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageServiceLoggingProperty\",\"ListItemText\":\"Set-AzStorageServiceLoggingProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageServiceLoggingProperty\\r\\n\"},{\"CompletionText\":\"Set-AzStorageServiceMetricsProperty\",\"ListItemText\":\"Set-AzStorageServiceMetricsProperty\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageServiceMetricsProperty\\r\\n\"},{\"CompletionText\":\"Set-AzStorageShareQuota\",\"ListItemText\":\"Set-AzStorageShareQuota\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageShareQuota\\r\\n\"},{\"CompletionText\":\"Set-AzStorageShareStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageShareStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageShareStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzStorageSyncServerEndpoint\",\"ListItemText\":\"Set-AzStorageSyncServerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageSyncServerEndpoint\\r\\n\"},{\"CompletionText\":\"Set-AzStorageSyncService\",\"ListItemText\":\"Set-AzStorageSyncService\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageSyncService\\r\\n\"},{\"CompletionText\":\"Set-AzStorageTableStoredAccessPolicy\",\"ListItemText\":\"Set-AzStorageTableStoredAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzStorageTableStoredAccessPolicy\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseDataFlow\",\"ListItemText\":\"Set-AzSynapseDataFlow\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseDataFlow\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseDataset\",\"ListItemText\":\"Set-AzSynapseDataset\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseDataset\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Set-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseKqlScript\",\"ListItemText\":\"Set-AzSynapseKqlScript\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseKqlScript\"},{\"CompletionText\":\"Set-AzSynapseLinkConnection\",\"ListItemText\":\"Set-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseLinkConnectionLinkTable\",\"ListItemText\":\"Set-AzSynapseLinkConnectionLinkTable\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseLinkConnectionLinkTable\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseLinkedService\",\"ListItemText\":\"Set-AzSynapseLinkedService\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseLinkedService\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseManagedIdentitySqlControlSetting\",\"ListItemText\":\"Set-AzSynapseManagedIdentitySqlControlSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseManagedIdentitySqlControlSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseManagedPrivateEndpoint\",\"ListItemText\":\"Set-AzSynapseManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseManagedPrivateEndpoint\"},{\"CompletionText\":\"Set-AzSynapseNotebook\",\"ListItemText\":\"Set-AzSynapseNotebook\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseNotebook\\r\\n\"},{\"CompletionText\":\"Set-AzSynapsePipeline\",\"ListItemText\":\"Set-AzSynapsePipeline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapsePipeline\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSparkConfiguration\",\"ListItemText\":\"Set-AzSynapseSparkConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSparkConfiguration\"},{\"CompletionText\":\"Set-AzSynapseSparkJobDefinition\",\"ListItemText\":\"Set-AzSynapseSparkJobDefinition\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSparkJobDefinition\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlActiveDirectoryAdministrator\",\"ListItemText\":\"Set-AzSynapseSqlActiveDirectoryAdministrator\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlActiveDirectoryAdministrator\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlAudit\",\"ListItemText\":\"Set-AzSynapseSqlAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlAudit\"},{\"CompletionText\":\"Set-AzSynapseSqlAuditSetting\",\"ListItemText\":\"Set-AzSynapseSqlAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlAuditSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolAudit\",\"ListItemText\":\"Set-AzSynapseSqlPoolAudit\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolAudit\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolAuditSetting\",\"ListItemText\":\"Set-AzSynapseSqlPoolAuditSetting\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolAuditSetting\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolSensitivityClassification\",\"ListItemText\":\"Set-AzSynapseSqlPoolSensitivityClassification\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolSensitivityClassification\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolTransparentDataEncryption\",\"ListItemText\":\"Set-AzSynapseSqlPoolTransparentDataEncryption\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolTransparentDataEncryption\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ListItemText\":\"Set-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlPoolVulnerabilityAssessmentRuleBaseline\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseSqlScript\",\"ListItemText\":\"Set-AzSynapseSqlScript\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseSqlScript\\r\\n\"},{\"CompletionText\":\"Set-AzSynapseTrigger\",\"ListItemText\":\"Set-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Set-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Set-AzTemplateSpec\",\"ListItemText\":\"Set-AzTemplateSpec\",\"ResultType\":2,\"ToolTip\":\"Set-AzTemplateSpec\\r\\n\"},{\"CompletionText\":\"Set-AzTrafficManagerEndpoint\",\"ListItemText\":\"Set-AzTrafficManagerEndpoint\",\"ResultType\":2,\"ToolTip\":\"Set-AzTrafficManagerEndpoint\\r\\n\"},{\"CompletionText\":\"Set-AzTrafficManagerProfile\",\"ListItemText\":\"Set-AzTrafficManagerProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzTrafficManagerProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualHub\",\"ListItemText\":\"Set-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetwork\",\"ListItemText\":\"Set-AzVirtualNetwork\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetwork\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGateway\",\"ListItemText\":\"Set-AzVirtualNetworkGateway\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGateway\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGatewayConnection\",\"ListItemText\":\"Set-AzVirtualNetworkGatewayConnection\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGatewayConnection\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGatewayConnectionSharedKey\",\"ListItemText\":\"Set-AzVirtualNetworkGatewayConnectionSharedKey\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGatewayConnectionSharedKey\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkGatewayDefaultSite\",\"ListItemText\":\"Set-AzVirtualNetworkGatewayDefaultSite\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkGatewayDefaultSite\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkPeering\",\"ListItemText\":\"Set-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkSubnetConfig\",\"ListItemText\":\"Set-AzVirtualNetworkSubnetConfig\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkSubnetConfig\\r\\n\"},{\"CompletionText\":\"Set-AzVirtualNetworkTap\",\"ListItemText\":\"Set-AzVirtualNetworkTap\",\"ResultType\":2,\"ToolTip\":\"Set-AzVirtualNetworkTap\\r\\n\"},{\"CompletionText\":\"Set-AzVM\",\"ListItemText\":\"Set-AzVM\",\"ResultType\":2,\"ToolTip\":\"Set-AzVM\\r\\n\"},{\"CompletionText\":\"Set-AzVMAccessExtension\",\"ListItemText\":\"Set-AzVMAccessExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMAccessExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMADDomainExtension\",\"ListItemText\":\"Set-AzVMADDomainExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMADDomainExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMAEMExtension\",\"ListItemText\":\"Set-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMBackupExtension\",\"ListItemText\":\"Set-AzVMBackupExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMBackupExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMBginfoExtension\",\"ListItemText\":\"Set-AzVMBginfoExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMBginfoExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMBootDiagnostic\",\"ListItemText\":\"Set-AzVMBootDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMBootDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzVMChefExtension\",\"ListItemText\":\"Set-AzVMChefExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMChefExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMCustomScriptExtension\",\"ListItemText\":\"Set-AzVMCustomScriptExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMCustomScriptExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMDataDisk\",\"ListItemText\":\"Set-AzVMDataDisk\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDataDisk\\r\\n\"},{\"CompletionText\":\"Set-AzVMDiagnosticsExtension\",\"ListItemText\":\"Set-AzVMDiagnosticsExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDiagnosticsExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMDiskEncryptionExtension\",\"ListItemText\":\"Set-AzVMDiskEncryptionExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDiskEncryptionExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMDscExtension\",\"ListItemText\":\"Set-AzVMDscExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMDscExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMExtension\",\"ListItemText\":\"Set-AzVMExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVMOperatingSystem\",\"ListItemText\":\"Set-AzVMOperatingSystem\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMOperatingSystem\\r\\n\"},{\"CompletionText\":\"Set-AzVMOSDisk\",\"ListItemText\":\"Set-AzVMOSDisk\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMOSDisk\\r\\n\"},{\"CompletionText\":\"Set-AzVMPlan\",\"ListItemText\":\"Set-AzVMPlan\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMPlan\\r\\n\"},{\"CompletionText\":\"Set-AzVMRunCommand\",\"ListItemText\":\"Set-AzVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzVMRunCommand \\r\\n\"},{\"CompletionText\":\"Set-AzVmSecurityProfile\",\"ListItemText\":\"Set-AzVmSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmSecurityProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVMSourceImage\",\"ListItemText\":\"Set-AzVMSourceImage\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMSourceImage\\r\\n\"},{\"CompletionText\":\"Set-AzVMSqlServerExtension\",\"ListItemText\":\"Set-AzVMSqlServerExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVMSqlServerExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVmss\",\"ListItemText\":\"Set-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmss\\r\\n\"},{\"CompletionText\":\"Set-AzVmssBootDiagnostic\",\"ListItemText\":\"Set-AzVmssBootDiagnostic\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssBootDiagnostic\\r\\n\"},{\"CompletionText\":\"Set-AzVmssDiskEncryptionExtension\",\"ListItemText\":\"Set-AzVmssDiskEncryptionExtension\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssDiskEncryptionExtension\\r\\n\"},{\"CompletionText\":\"Set-AzVmssOrchestrationServiceState\",\"ListItemText\":\"Set-AzVmssOrchestrationServiceState\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssOrchestrationServiceState\\r\\n\"},{\"CompletionText\":\"Set-AzVmssOsProfile\",\"ListItemText\":\"Set-AzVmssOsProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssOsProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVmssRollingUpgradePolicy\",\"ListItemText\":\"Set-AzVmssRollingUpgradePolicy\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssRollingUpgradePolicy\\r\\n\"},{\"CompletionText\":\"Set-AzVmssSecurityProfile\",\"ListItemText\":\"Set-AzVmssSecurityProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssSecurityProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVmssStorageProfile\",\"ListItemText\":\"Set-AzVmssStorageProfile\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssStorageProfile\\r\\n\"},{\"CompletionText\":\"Set-AzVmssUefi\",\"ListItemText\":\"Set-AzVmssUefi\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssUefi\\r\\n\"},{\"CompletionText\":\"Set-AzVmssVM\",\"ListItemText\":\"Set-AzVmssVM\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmssVM\\r\\n\"},{\"CompletionText\":\"Set-AzVmssVMRunCommand\",\"ListItemText\":\"Set-AzVmssVMRunCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzVmssVMRunCommand \\r\\n\"},{\"CompletionText\":\"Set-AzVmUefi\",\"ListItemText\":\"Set-AzVmUefi\",\"ResultType\":2,\"ToolTip\":\"Set-AzVmUefi\\r\\n\"},{\"CompletionText\":\"Set-AzVpnClientIpsecParameter\",\"ListItemText\":\"Set-AzVpnClientIpsecParameter\",\"ResultType\":2,\"ToolTip\":\"Set-AzVpnClientIpsecParameter\\r\\n\"},{\"CompletionText\":\"Set-AzWcfRelay\",\"ListItemText\":\"Set-AzWcfRelay\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-AzWcfRelay \\r\\n\"},{\"CompletionText\":\"Set-AzWebApp\",\"ListItemText\":\"Set-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Set-AzWebApp\\r\\n\"},{\"CompletionText\":\"Set-AzWebAppSlot\",\"ListItemText\":\"Set-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Set-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Set-AzWebAppSlotConfigName\",\"ListItemText\":\"Set-AzWebAppSlotConfigName\",\"ResultType\":2,\"ToolTip\":\"Set-AzWebAppSlotConfigName\\r\\n\"},{\"CompletionText\":\"Set-BCAuthentication\",\"ListItemText\":\"Set-BCAuthentication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCAuthentication \\r\\n\"},{\"CompletionText\":\"Set-BCCache\",\"ListItemText\":\"Set-BCCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCCache \\r\\n\"},{\"CompletionText\":\"Set-BCDataCacheEntryMaxAge\",\"ListItemText\":\"Set-BCDataCacheEntryMaxAge\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCDataCacheEntryMaxAge \\r\\n\"},{\"CompletionText\":\"Set-BcdBootDefault\",\"ListItemText\":\"Set-BcdBootDefault\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootDefault\\r\\n\"},{\"CompletionText\":\"Set-BcdBootDisplayOrder\",\"ListItemText\":\"Set-BcdBootDisplayOrder\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootDisplayOrder\\r\\n\"},{\"CompletionText\":\"Set-BcdBootSequence\",\"ListItemText\":\"Set-BcdBootSequence\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootSequence\\r\\n\"},{\"CompletionText\":\"Set-BcdBootTimeout\",\"ListItemText\":\"Set-BcdBootTimeout\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootTimeout\\r\\n\"},{\"CompletionText\":\"Set-BcdBootToolsDisplayOrder\",\"ListItemText\":\"Set-BcdBootToolsDisplayOrder\",\"ResultType\":2,\"ToolTip\":\"Set-BcdBootToolsDisplayOrder\\r\\n\"},{\"CompletionText\":\"Set-BcdDebugSettings\",\"ListItemText\":\"Set-BcdDebugSettings\",\"ResultType\":2,\"ToolTip\":\"Set-BcdDebugSettings\\r\\n\"},{\"CompletionText\":\"Set-BcdElement\",\"ListItemText\":\"Set-BcdElement\",\"ResultType\":2,\"ToolTip\":\"Set-BcdElement\\r\\n\"},{\"CompletionText\":\"Set-BcdHypervisorSettings\",\"ListItemText\":\"Set-BcdHypervisorSettings\",\"ResultType\":2,\"ToolTip\":\"Set-BcdHypervisorSettings\\r\\n\"},{\"CompletionText\":\"Set-BCMinSMBLatency\",\"ListItemText\":\"Set-BCMinSMBLatency\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCMinSMBLatency \\r\\n\"},{\"CompletionText\":\"Set-BCSecretKey\",\"ListItemText\":\"Set-BCSecretKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-BCSecretKey \\r\\n\"},{\"CompletionText\":\"Set-BitsTransfer\",\"ListItemText\":\"Set-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Set-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Set-CertificateAutoEnrollmentPolicy\",\"ListItemText\":\"Set-CertificateAutoEnrollmentPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-CertificateAutoEnrollmentPolicy\\r\\n\"},{\"CompletionText\":\"Set-CimInstance\",\"ListItemText\":\"Set-CimInstance\",\"ResultType\":2,\"ToolTip\":\"Set-CimInstance\\r\\n\"},{\"CompletionText\":\"Set-CIPolicyIdInfo\",\"ListItemText\":\"Set-CIPolicyIdInfo\",\"ResultType\":2,\"ToolTip\":\"Set-CIPolicyIdInfo\\r\\n\"},{\"CompletionText\":\"Set-CIPolicySetting\",\"ListItemText\":\"Set-CIPolicySetting\",\"ResultType\":2,\"ToolTip\":\"Set-CIPolicySetting\\r\\n\"},{\"CompletionText\":\"Set-CIPolicyVersion\",\"ListItemText\":\"Set-CIPolicyVersion\",\"ResultType\":2,\"ToolTip\":\"Set-CIPolicyVersion\\r\\n\"},{\"CompletionText\":\"Set-Clipboard\",\"ListItemText\":\"Set-Clipboard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Clipboard [-Value] [-Append] [-PassThru] [-AsOSC52] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-ClusteredScheduledTask\",\"ListItemText\":\"Set-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Set-Content\",\"ListItemText\":\"Set-Content\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Content [-Path] [-Value] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\\r\\nSet-Content [-Value] -LiteralPath [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Force] [-Credential ] [-WhatIf] [-Confirm] [-NoNewline] [-Encoding ] [-AsByteStream] [-Stream ] []\\r\\n\"},{\"CompletionText\":\"Set-Culture\",\"ListItemText\":\"Set-Culture\",\"ResultType\":2,\"ToolTip\":\"Set-Culture\\r\\n\"},{\"CompletionText\":\"Set-DAClientExperienceConfiguration\",\"ListItemText\":\"Set-DAClientExperienceConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DAClientExperienceConfiguration \\r\\n\"},{\"CompletionText\":\"Set-DAEntryPointTableItem\",\"ListItemText\":\"Set-DAEntryPointTableItem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DAEntryPointTableItem \\r\\n\"},{\"CompletionText\":\"Set-Date\",\"ListItemText\":\"Set-Date\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Date [-Date] [-DisplayHint ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-Date [-Adjust] [-DisplayHint ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-DeliveryOptimizationStatus\",\"ListItemText\":\"Set-DeliveryOptimizationStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DeliveryOptimizationStatus \\r\\n\"},{\"CompletionText\":\"Set-Disk\",\"ListItemText\":\"Set-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Disk \\r\\n\"},{\"CompletionText\":\"Set-DnsClient\",\"ListItemText\":\"Set-DnsClient\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClient \\r\\n\"},{\"CompletionText\":\"Set-DnsClientDohServerAddress\",\"ListItemText\":\"Set-DnsClientDohServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientDohServerAddress \\r\\n\"},{\"CompletionText\":\"Set-DnsClientGlobalSetting\",\"ListItemText\":\"Set-DnsClientGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientGlobalSetting \\r\\n\"},{\"CompletionText\":\"Set-DnsClientNrptGlobal\",\"ListItemText\":\"Set-DnsClientNrptGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientNrptGlobal \\r\\n\"},{\"CompletionText\":\"Set-DnsClientNrptRule\",\"ListItemText\":\"Set-DnsClientNrptRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientNrptRule \\r\\n\"},{\"CompletionText\":\"Set-DnsClientServerAddress\",\"ListItemText\":\"Set-DnsClientServerAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DnsClientServerAddress \\r\\n\"},{\"CompletionText\":\"Set-DODownloadMode\",\"ListItemText\":\"Set-DODownloadMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DODownloadMode \\r\\n\"},{\"CompletionText\":\"Set-DOMaxBackgroundBandwidth\",\"ListItemText\":\"Set-DOMaxBackgroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOMaxBackgroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DOMaxForegroundBandwidth\",\"ListItemText\":\"Set-DOMaxForegroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOMaxForegroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DOPercentageMaxBackgroundBandwidth\",\"ListItemText\":\"Set-DOPercentageMaxBackgroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOPercentageMaxBackgroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DOPercentageMaxForegroundBandwidth\",\"ListItemText\":\"Set-DOPercentageMaxForegroundBandwidth\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DOPercentageMaxForegroundBandwidth \\r\\n\"},{\"CompletionText\":\"Set-DscLocalConfigurationManager\",\"ListItemText\":\"Set-DscLocalConfigurationManager\",\"ResultType\":2,\"ToolTip\":\"Set-DscLocalConfigurationManager\\r\\n\"},{\"CompletionText\":\"Set-DtcAdvancedHostSetting\",\"ListItemText\":\"Set-DtcAdvancedHostSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcAdvancedHostSetting \\r\\n\"},{\"CompletionText\":\"Set-DtcAdvancedSetting\",\"ListItemText\":\"Set-DtcAdvancedSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcAdvancedSetting \\r\\n\"},{\"CompletionText\":\"Set-DtcClusterDefault\",\"ListItemText\":\"Set-DtcClusterDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcClusterDefault \\r\\n\"},{\"CompletionText\":\"Set-DtcClusterTMMapping\",\"ListItemText\":\"Set-DtcClusterTMMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcClusterTMMapping \\r\\n\"},{\"CompletionText\":\"Set-DtcDefault\",\"ListItemText\":\"Set-DtcDefault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcDefault \\r\\n\"},{\"CompletionText\":\"Set-DtcLog\",\"ListItemText\":\"Set-DtcLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcLog \\r\\n\"},{\"CompletionText\":\"Set-DtcNetworkSetting\",\"ListItemText\":\"Set-DtcNetworkSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcNetworkSetting \\r\\n\"},{\"CompletionText\":\"Set-DtcTransaction\",\"ListItemText\":\"Set-DtcTransaction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcTransaction \\r\\n\"},{\"CompletionText\":\"Set-DtcTransactionsTraceSession\",\"ListItemText\":\"Set-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Set-DtcTransactionsTraceSetting\",\"ListItemText\":\"Set-DtcTransactionsTraceSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DtcTransactionsTraceSetting \\r\\n\"},{\"CompletionText\":\"Set-DynamicParameterVariables\",\"ListItemText\":\"Set-DynamicParameterVariables\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-DynamicParameterVariables \\r\\n\"},{\"CompletionText\":\"Set-EtwTraceProvider\",\"ListItemText\":\"Set-EtwTraceProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-EtwTraceProvider \\r\\n\"},{\"CompletionText\":\"Set-EtwTraceSession\",\"ListItemText\":\"Set-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"Set-EtwTraceSession\"},{\"CompletionText\":\"Set-ExecutionPolicy\",\"ListItemText\":\"Set-ExecutionPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-ExecutionPolicy\\r\\n\"},{\"CompletionText\":\"Set-FileIntegrity\",\"ListItemText\":\"Set-FileIntegrity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-FileIntegrity \\r\\n\"},{\"CompletionText\":\"Set-FileShare\",\"ListItemText\":\"Set-FileShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-FileShare \\r\\n\"},{\"CompletionText\":\"Set-FileStorageTier\",\"ListItemText\":\"Set-FileStorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-FileStorageTier \\r\\n\"},{\"CompletionText\":\"Set-HgsClientConfiguration\",\"ListItemText\":\"Set-HgsClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-HgsClientConfiguration \\r\\n\"},{\"CompletionText\":\"Set-HgsClientHostKey\",\"ListItemText\":\"Set-HgsClientHostKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-HgsClientHostKey \\r\\n\"},{\"CompletionText\":\"Set-HVCIOptions\",\"ListItemText\":\"Set-HVCIOptions\",\"ResultType\":2,\"ToolTip\":\"Set-HVCIOptions\\r\\n\"},{\"CompletionText\":\"Set-InitiatorPort\",\"ListItemText\":\"Set-InitiatorPort\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-InitiatorPort \\r\\n\"},{\"CompletionText\":\"Set-IscsiChapSecret\",\"ListItemText\":\"Set-IscsiChapSecret\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-IscsiChapSecret \\r\\n\"},{\"CompletionText\":\"Set-Item\",\"ListItemText\":\"Set-Item\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Item [-Path] [[-Value] ] [-Force] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-Item [[-Value] ] -LiteralPath [-Force] [-PassThru] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-ItemProperty\",\"ListItemText\":\"Set-ItemProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ItemProperty [-Path] [-Name] [-Value] [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-ItemProperty [-Path] -InputObject [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-ItemProperty [-Name] [-Value] -LiteralPath [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-ItemProperty -LiteralPath -InputObject [-PassThru] [-Force] [-Filter ] [-Include ] [-Exclude ] [-Credential ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-JobTrigger\",\"ListItemText\":\"Set-JobTrigger\",\"ResultType\":2,\"ToolTip\":\"Set-JobTrigger\\r\\n\"},{\"CompletionText\":\"Set-KdsConfiguration\",\"ListItemText\":\"Set-KdsConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-KdsConfiguration\\r\\n\"},{\"CompletionText\":\"Set-LapsADAuditing\",\"ListItemText\":\"Set-LapsADAuditing\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADAuditing\\r\\n\"},{\"CompletionText\":\"Set-LapsADComputerSelfPermission\",\"ListItemText\":\"Set-LapsADComputerSelfPermission\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADComputerSelfPermission\\r\\n\"},{\"CompletionText\":\"Set-LapsADPasswordExpirationTime\",\"ListItemText\":\"Set-LapsADPasswordExpirationTime\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADPasswordExpirationTime\\r\\n\"},{\"CompletionText\":\"Set-LapsADReadPasswordPermission\",\"ListItemText\":\"Set-LapsADReadPasswordPermission\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADReadPasswordPermission\\r\\n\"},{\"CompletionText\":\"Set-LapsADResetPasswordPermission\",\"ListItemText\":\"Set-LapsADResetPasswordPermission\",\"ResultType\":2,\"ToolTip\":\"Set-LapsADResetPasswordPermission\\r\\n\"},{\"CompletionText\":\"Set-LocalGroup\",\"ListItemText\":\"Set-LocalGroup\",\"ResultType\":2,\"ToolTip\":\"Set-LocalGroup\\r\\n\"},{\"CompletionText\":\"Set-LocalUser\",\"ListItemText\":\"Set-LocalUser\",\"ResultType\":2,\"ToolTip\":\"Set-LocalUser\\r\\n\"},{\"CompletionText\":\"Set-Location\",\"ListItemText\":\"Set-Location\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Location [[-Path] ] [-PassThru] []\\r\\n\\r\\nSet-Location -LiteralPath [-PassThru] []\\r\\n\\r\\nSet-Location [-PassThru] [-StackName ] []\\r\\n\"},{\"CompletionText\":\"Set-LogProperties\",\"ListItemText\":\"Set-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-LogProperties \\r\\n\"},{\"CompletionText\":\"Set-MappedKeyHandler\",\"ListItemText\":\"Set-MappedKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MappedKeyHandler [[-Chord] ] [[-Sequence] ]\\r\\n\"},{\"CompletionText\":\"Set-MappedKeyHandlers\",\"ListItemText\":\"Set-MappedKeyHandlers\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MappedKeyHandlers \\r\\n\"},{\"CompletionText\":\"Set-MarkdownOption\",\"ListItemText\":\"Set-MarkdownOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MarkdownOption [-Header1Color ] [-Header2Color ] [-Header3Color ] [-Header4Color ] [-Header5Color ] [-Header6Color ] [-Code ] [-ImageAltTextForegroundColor ] [-LinkForegroundColor ] [-ItalicsForegroundColor ] [-BoldForegroundColor ] [-PassThru] []\\r\\n\\r\\nSet-MarkdownOption -Theme [-PassThru] []\\r\\n\\r\\nSet-MarkdownOption [-InputObject] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Set-MMAgent\",\"ListItemText\":\"Set-MMAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MMAgent \\r\\n\"},{\"CompletionText\":\"Set-MpPreference\",\"ListItemText\":\"Set-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MpPreference \\r\\n\"},{\"CompletionText\":\"Set-NCSIPolicyConfiguration\",\"ListItemText\":\"Set-NCSIPolicyConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NCSIPolicyConfiguration \\r\\n\"},{\"CompletionText\":\"Set-Net6to4Configuration\",\"ListItemText\":\"Set-Net6to4Configuration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Net6to4Configuration \\r\\n\"},{\"CompletionText\":\"Set-NetAdapter\",\"ListItemText\":\"Set-NetAdapter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapter \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterAdvancedProperty\",\"ListItemText\":\"Set-NetAdapterAdvancedProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterAdvancedProperty \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterBinding\",\"ListItemText\":\"Set-NetAdapterBinding\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterBinding \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterChecksumOffload\",\"ListItemText\":\"Set-NetAdapterChecksumOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterChecksumOffload \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterDataPathConfiguration\",\"ListItemText\":\"Set-NetAdapterDataPathConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterDataPathConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterEncapsulatedPacketTaskOffload\",\"ListItemText\":\"Set-NetAdapterEncapsulatedPacketTaskOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterEncapsulatedPacketTaskOffload \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterIPsecOffload\",\"ListItemText\":\"Set-NetAdapterIPsecOffload\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterIPsecOffload \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterLso\",\"ListItemText\":\"Set-NetAdapterLso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterLso \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterPacketDirect\",\"ListItemText\":\"Set-NetAdapterPacketDirect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterPacketDirect \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterPowerManagement\",\"ListItemText\":\"Set-NetAdapterPowerManagement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterPowerManagement \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterQos\",\"ListItemText\":\"Set-NetAdapterQos\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterQos \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterRdma\",\"ListItemText\":\"Set-NetAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterRdma \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterRsc\",\"ListItemText\":\"Set-NetAdapterRsc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterRsc \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterRss\",\"ListItemText\":\"Set-NetAdapterRss\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterRss \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterSriov\",\"ListItemText\":\"Set-NetAdapterSriov\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterSriov \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterUso\",\"ListItemText\":\"Set-NetAdapterUso\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterUso \\r\\n\"},{\"CompletionText\":\"Set-NetAdapterVmq\",\"ListItemText\":\"Set-NetAdapterVmq\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetAdapterVmq \\r\\n\"},{\"CompletionText\":\"Set-NetConnectionProfile\",\"ListItemText\":\"Set-NetConnectionProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetConnectionProfile \\r\\n\"},{\"CompletionText\":\"Set-NetDnsTransitionConfiguration\",\"ListItemText\":\"Set-NetDnsTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetDnsTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetEventPacketCaptureProvider\",\"ListItemText\":\"Set-NetEventPacketCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventPacketCaptureProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventProvider\",\"ListItemText\":\"Set-NetEventProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventSession\",\"ListItemText\":\"Set-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventSession \\r\\n\"},{\"CompletionText\":\"Set-NetEventVFPProvider\",\"ListItemText\":\"Set-NetEventVFPProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventVFPProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventVmSwitchProvider\",\"ListItemText\":\"Set-NetEventVmSwitchProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventVmSwitchProvider \\r\\n\"},{\"CompletionText\":\"Set-NetEventWFPCaptureProvider\",\"ListItemText\":\"Set-NetEventWFPCaptureProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetEventWFPCaptureProvider \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallAddressFilter\",\"ListItemText\":\"Set-NetFirewallAddressFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallAddressFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallApplicationFilter\",\"ListItemText\":\"Set-NetFirewallApplicationFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallApplicationFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallHyperVProfile\",\"ListItemText\":\"Set-NetFirewallHyperVProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallHyperVProfile \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallHyperVRule\",\"ListItemText\":\"Set-NetFirewallHyperVRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallHyperVRule \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallHyperVVMSetting\",\"ListItemText\":\"Set-NetFirewallHyperVVMSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallHyperVVMSetting \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallInterfaceFilter\",\"ListItemText\":\"Set-NetFirewallInterfaceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallInterfaceFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallInterfaceTypeFilter\",\"ListItemText\":\"Set-NetFirewallInterfaceTypeFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallInterfaceTypeFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallPortFilter\",\"ListItemText\":\"Set-NetFirewallPortFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallPortFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallProfile\",\"ListItemText\":\"Set-NetFirewallProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallProfile \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallRule\",\"ListItemText\":\"Set-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallSecurityFilter\",\"ListItemText\":\"Set-NetFirewallSecurityFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallSecurityFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallServiceFilter\",\"ListItemText\":\"Set-NetFirewallServiceFilter\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallServiceFilter \\r\\n\"},{\"CompletionText\":\"Set-NetFirewallSetting\",\"ListItemText\":\"Set-NetFirewallSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetFirewallSetting \\r\\n\"},{\"CompletionText\":\"Set-NetIPAddress\",\"ListItemText\":\"Set-NetIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPAddress \\r\\n\"},{\"CompletionText\":\"Set-NetIPHttpsConfiguration\",\"ListItemText\":\"Set-NetIPHttpsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPHttpsConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetIPInterface\",\"ListItemText\":\"Set-NetIPInterface\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPInterface \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecDospSetting\",\"ListItemText\":\"Set-NetIPsecDospSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecDospSetting \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecMainModeCryptoSet\",\"ListItemText\":\"Set-NetIPsecMainModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecMainModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecMainModeRule\",\"ListItemText\":\"Set-NetIPsecMainModeRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecMainModeRule \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecPhase1AuthSet\",\"ListItemText\":\"Set-NetIPsecPhase1AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecPhase1AuthSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecPhase2AuthSet\",\"ListItemText\":\"Set-NetIPsecPhase2AuthSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecPhase2AuthSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecQuickModeCryptoSet\",\"ListItemText\":\"Set-NetIPsecQuickModeCryptoSet\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecQuickModeCryptoSet \\r\\n\"},{\"CompletionText\":\"Set-NetIPsecRule\",\"ListItemText\":\"Set-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Set-NetIPv4Protocol\",\"ListItemText\":\"Set-NetIPv4Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPv4Protocol \\r\\n\"},{\"CompletionText\":\"Set-NetIPv6Protocol\",\"ListItemText\":\"Set-NetIPv6Protocol\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIPv6Protocol \\r\\n\"},{\"CompletionText\":\"Set-NetIsatapConfiguration\",\"ListItemText\":\"Set-NetIsatapConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetIsatapConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetLbfoTeam\",\"ListItemText\":\"Set-NetLbfoTeam\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetLbfoTeam \\r\\n\"},{\"CompletionText\":\"Set-NetLbfoTeamMember\",\"ListItemText\":\"Set-NetLbfoTeamMember\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetLbfoTeamMember \\r\\n\"},{\"CompletionText\":\"Set-NetLbfoTeamNic\",\"ListItemText\":\"Set-NetLbfoTeamNic\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetLbfoTeamNic \\r\\n\"},{\"CompletionText\":\"Set-NetNat\",\"ListItemText\":\"Set-NetNat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNat \\r\\n\"},{\"CompletionText\":\"Set-NetNatGlobal\",\"ListItemText\":\"Set-NetNatGlobal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNatGlobal \\r\\n\"},{\"CompletionText\":\"Set-NetNatTransitionConfiguration\",\"ListItemText\":\"Set-NetNatTransitionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNatTransitionConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetNeighbor\",\"ListItemText\":\"Set-NetNeighbor\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetNeighbor \\r\\n\"},{\"CompletionText\":\"Set-NetOffloadGlobalSetting\",\"ListItemText\":\"Set-NetOffloadGlobalSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetOffloadGlobalSetting \\r\\n\"},{\"CompletionText\":\"Set-NetQosPolicy\",\"ListItemText\":\"Set-NetQosPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetQosPolicy \\r\\n\"},{\"CompletionText\":\"Set-NetRoute\",\"ListItemText\":\"Set-NetRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetRoute \\r\\n\"},{\"CompletionText\":\"Set-NetTCPSetting\",\"ListItemText\":\"Set-NetTCPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetTCPSetting \\r\\n\"},{\"CompletionText\":\"Set-NetTeredoConfiguration\",\"ListItemText\":\"Set-NetTeredoConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetTeredoConfiguration \\r\\n\"},{\"CompletionText\":\"Set-NetUDPSetting\",\"ListItemText\":\"Set-NetUDPSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetUDPSetting \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchEthernetPortIPAddress\",\"ListItemText\":\"Set-NetworkSwitchEthernetPortIPAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchEthernetPortIPAddress \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchPortMode\",\"ListItemText\":\"Set-NetworkSwitchPortMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchPortMode \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchPortProperty\",\"ListItemText\":\"Set-NetworkSwitchPortProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchPortProperty \\r\\n\"},{\"CompletionText\":\"Set-NetworkSwitchVlanProperty\",\"ListItemText\":\"Set-NetworkSwitchVlanProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-NetworkSwitchVlanProperty \\r\\n\"},{\"CompletionText\":\"Set-NonRemovableAppsPolicy\",\"ListItemText\":\"Set-NonRemovableAppsPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-NonRemovableAppsPolicy\\r\\n\"},{\"CompletionText\":\"Set-OdbcDriver\",\"ListItemText\":\"Set-OdbcDriver\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-OdbcDriver \\r\\n\"},{\"CompletionText\":\"Set-OdbcDsn\",\"ListItemText\":\"Set-OdbcDsn\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-OdbcDsn \\r\\n\"},{\"CompletionText\":\"Set-PackageSource\",\"ListItemText\":\"Set-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Set-PackageSource\\r\\n\"},{\"CompletionText\":\"Set-Partition\",\"ListItemText\":\"Set-Partition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Partition \\r\\n\"},{\"CompletionText\":\"Set-PcsvDeviceBootConfiguration\",\"ListItemText\":\"Set-PcsvDeviceBootConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PcsvDeviceBootConfiguration \\r\\n\"},{\"CompletionText\":\"Set-PcsvDeviceNetworkConfiguration\",\"ListItemText\":\"Set-PcsvDeviceNetworkConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PcsvDeviceNetworkConfiguration \\r\\n\"},{\"CompletionText\":\"Set-PcsvDeviceUserPassword\",\"ListItemText\":\"Set-PcsvDeviceUserPassword\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PcsvDeviceUserPassword \\r\\n\"},{\"CompletionText\":\"Set-PhysicalDisk\",\"ListItemText\":\"Set-PhysicalDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PhysicalDisk \\r\\n\"},{\"CompletionText\":\"Set-PreferredLanguage\",\"ListItemText\":\"Set-PreferredLanguage\",\"ResultType\":2,\"ToolTip\":\"Set-PreferredLanguage\"},{\"CompletionText\":\"Set-PrintConfiguration\",\"ListItemText\":\"Set-PrintConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PrintConfiguration \\r\\n\"},{\"CompletionText\":\"Set-Printer\",\"ListItemText\":\"Set-Printer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Printer \\r\\n\"},{\"CompletionText\":\"Set-PrinterProperty\",\"ListItemText\":\"Set-PrinterProperty\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PrinterProperty \\r\\n\"},{\"CompletionText\":\"Set-ProcessMitigation\",\"ListItemText\":\"Set-ProcessMitigation\",\"ResultType\":2,\"ToolTip\":\"Set-ProcessMitigation\\r\\n\"},{\"CompletionText\":\"Set-ProvisionedAppPackageDataFile\",\"ListItemText\":\"Set-ProvisionedAppPackageDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-ProvisionedAppPackageDataFile\"},{\"CompletionText\":\"Set-ProvisionedAppXDataFile\",\"ListItemText\":\"Set-ProvisionedAppXDataFile\",\"ResultType\":2,\"ToolTip\":\"Set-ProvisionedAppXDataFile\"},{\"CompletionText\":\"Set-PSBreakpoint\",\"ListItemText\":\"Set-PSBreakpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSBreakpoint [-Script] [-Line] [[-Column] ] [-Action ] [-Runspace ] []\\r\\n\\r\\nSet-PSBreakpoint [[-Script] ] -Command [-Action ] [-Runspace ] []\\r\\n\\r\\nSet-PSBreakpoint [[-Script] ] -Variable [-Action ] [-Mode ] [-Runspace ] []\\r\\n\"},{\"CompletionText\":\"Set-PSDebug\",\"ListItemText\":\"Set-PSDebug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSDebug [-Trace ] [-Step] [-Strict] []\\r\\n\\r\\nSet-PSDebug [-Off] []\\r\\n\"},{\"CompletionText\":\"Set-PSReadLineKeyHandler\",\"ListItemText\":\"Set-PSReadLineKeyHandler\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSReadLineKeyHandler [-Chord] [-ScriptBlock] [-BriefDescription ] [-Description ] [-ViMode ] []\\r\\n\\r\\nSet-PSReadLineKeyHandler [-Chord] [-Function] [-ViMode ] []\\r\\n\"},{\"CompletionText\":\"Set-PSReadLineOption\",\"ListItemText\":\"Set-PSReadLineOption\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSReadLineOption [-EditMode ] [-ContinuationPrompt ] [-HistoryNoDuplicates] [-AddToHistoryHandler ] [-CommandValidationHandler ] [-HistorySearchCursorMovesToEnd] [-MaximumHistoryCount ] [-MaximumKillRingCount ] [-ShowToolTips] [-ExtraPromptLineCount ] [-DingTone ] [-DingDuration ] [-BellStyle ] [-CompletionQueryItems ] [-WordDelimiters ] [-HistorySearchCaseSensitive] [-HistorySaveStyle ] [-HistorySavePath ] [-AnsiEscapeTimeout ] [-PromptText ] [-ViModeIndicator ] [-ViModeChangeHandler ] [-PredictionSource ] [-PredictionViewStyle ] [-Colors ] [-TerminateOrphanedConsoleApps] []\\r\\n\"},{\"CompletionText\":\"Set-PSRepository\",\"ListItemText\":\"Set-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSRepository \\r\\n\"},{\"CompletionText\":\"Set-PSResourceRepository\",\"ListItemText\":\"Set-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Set-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Set-PSSessionConfiguration\",\"ListItemText\":\"Set-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSSessionConfiguration [-Name] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-PSSessionConfiguration [-Name] [-AssemblyName] [-ConfigurationTypeName] [-ApplicationBase ] [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-PSVersion ] [-SessionTypeOption ] [-TransportOption ] [-ModulesToImport ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-PSSessionConfiguration [-Name] -Path [-RunAsCredential ] [-ThreadApartmentState ] [-ThreadOptions ] [-AccessMode ] [-UseSharedProcess] [-StartupScript ] [-MaximumReceivedDataSizePerCommandMB ] [-MaximumReceivedObjectSizeMB ] [-SecurityDescriptorSddl ] [-ShowSecurityDescriptorUI] [-Force] [-NoServiceRestart] [-TransportOption ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-ResiliencySetting\",\"ListItemText\":\"Set-ResiliencySetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ResiliencySetting \\r\\n\"},{\"CompletionText\":\"Set-RuleOption\",\"ListItemText\":\"Set-RuleOption\",\"ResultType\":2,\"ToolTip\":\"Set-RuleOption\\r\\n\"},{\"CompletionText\":\"Set-ScheduledJob\",\"ListItemText\":\"Set-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Set-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Set-ScheduledJobOption\",\"ListItemText\":\"Set-ScheduledJobOption\",\"ResultType\":2,\"ToolTip\":\"Set-ScheduledJobOption\\r\\n\"},{\"CompletionText\":\"Set-ScheduledTask\",\"ListItemText\":\"Set-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Set-SecureBootUEFI\",\"ListItemText\":\"Set-SecureBootUEFI\",\"ResultType\":2,\"ToolTip\":\"Set-SecureBootUEFI\\r\\n\"},{\"CompletionText\":\"Set-Service\",\"ListItemText\":\"Set-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Service [-Name] [-DisplayName ] [-Credential ] [-Description ] [-StartupType ] [-SecurityDescriptorSddl ] [-Status ] [-Force] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-Service [-InputObject] [-DisplayName ] [-Credential ] [-Description ] [-StartupType ] [-SecurityDescriptorSddl ] [-Status ] [-Force] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-SmbBandwidthLimit\",\"ListItemText\":\"Set-SmbBandwidthLimit\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbBandwidthLimit \\r\\n\"},{\"CompletionText\":\"Set-SmbClientCertificateMapping\",\"ListItemText\":\"Set-SmbClientCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbClientCertificateMapping \\r\\n\"},{\"CompletionText\":\"Set-SmbClientConfiguration\",\"ListItemText\":\"Set-SmbClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbClientConfiguration \\r\\n\"},{\"CompletionText\":\"Set-SmbPathAcl\",\"ListItemText\":\"Set-SmbPathAcl\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbPathAcl \\r\\n\"},{\"CompletionText\":\"Set-SmbServerCertificateMapping\",\"ListItemText\":\"Set-SmbServerCertificateMapping\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbServerCertificateMapping \\r\\n\"},{\"CompletionText\":\"Set-SmbServerConfiguration\",\"ListItemText\":\"Set-SmbServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbServerConfiguration \\r\\n\"},{\"CompletionText\":\"Set-SmbShare\",\"ListItemText\":\"Set-SmbShare\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-SmbShare \\r\\n\"},{\"CompletionText\":\"Set-StorageBusCache\",\"ListItemText\":\"Set-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Set-StorageBusProfile\",\"ListItemText\":\"Set-StorageBusProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageBusProfile \\r\\n\"},{\"CompletionText\":\"Set-StorageFileServer\",\"ListItemText\":\"Set-StorageFileServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageFileServer \\r\\n\"},{\"CompletionText\":\"Set-StorageHealthSetting\",\"ListItemText\":\"Set-StorageHealthSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageHealthSetting \\r\\n\"},{\"CompletionText\":\"Set-StoragePool\",\"ListItemText\":\"Set-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StoragePool \\r\\n\"},{\"CompletionText\":\"Set-StorageProvider\",\"ListItemText\":\"Set-StorageProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageProvider \\r\\n\"},{\"CompletionText\":\"Set-StorageSetting\",\"ListItemText\":\"Set-StorageSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageSetting \\r\\n\"},{\"CompletionText\":\"Set-StorageSubSystem\",\"ListItemText\":\"Set-StorageSubSystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageSubSystem \\r\\n\"},{\"CompletionText\":\"Set-StorageTier\",\"ListItemText\":\"Set-StorageTier\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StorageTier \\r\\n\"},{\"CompletionText\":\"Set-StrictMode\",\"ListItemText\":\"Set-StrictMode\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-StrictMode -Version []\\r\\n\\r\\nSet-StrictMode -Off []\\r\\n\"},{\"CompletionText\":\"Set-SystemLanguage\",\"ListItemText\":\"Set-SystemLanguage\",\"ResultType\":2,\"ToolTip\":\"Set-SystemLanguage\"},{\"CompletionText\":\"Set-SystemPreferredUILanguage\",\"ListItemText\":\"Set-SystemPreferredUILanguage\",\"ResultType\":2,\"ToolTip\":\"Set-SystemPreferredUILanguage\\r\\n\"},{\"CompletionText\":\"Set-TestInconclusive\",\"ListItemText\":\"Set-TestInconclusive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-TestInconclusive \\r\\n\"},{\"CompletionText\":\"Set-TimeZone\",\"ListItemText\":\"Set-TimeZone\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-TimeZone [-Name] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-TimeZone -Id [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSet-TimeZone [-InputObject] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-TpmOwnerAuth\",\"ListItemText\":\"Set-TpmOwnerAuth\",\"ResultType\":2,\"ToolTip\":\"Set-TpmOwnerAuth\\r\\n\"},{\"CompletionText\":\"Set-TraceSource\",\"ListItemText\":\"Set-TraceSource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-TraceSource [-Name] [[-Option] ] [-ListenerOption ] [-FilePath ] [-Force] [-Debugger] [-PSHost] [-PassThru] []\\r\\n\\r\\nSet-TraceSource [-Name] [-RemoveListener ] []\\r\\n\\r\\nSet-TraceSource [-Name] [-RemoveFileListener ] []\\r\\n\"},{\"CompletionText\":\"Set-Variable\",\"ListItemText\":\"Set-Variable\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Variable [-Name] [[-Value] ] [-Include ] [-Exclude ] [-Description ] [-Option ] [-Force] [-Visibility ] [-PassThru] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Set-VHD\",\"ListItemText\":\"Set-VHD\",\"ResultType\":2,\"ToolTip\":\"Set-VHD\\r\\n\"},{\"CompletionText\":\"Set-VirtualDisk\",\"ListItemText\":\"Set-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Set-VM\",\"ListItemText\":\"Set-VM\",\"ResultType\":2,\"ToolTip\":\"Set-VM\\r\\n\"},{\"CompletionText\":\"Set-VMBios\",\"ListItemText\":\"Set-VMBios\",\"ResultType\":2,\"ToolTip\":\"Set-VMBios\\r\\n\"},{\"CompletionText\":\"Set-VMComPort\",\"ListItemText\":\"Set-VMComPort\",\"ResultType\":2,\"ToolTip\":\"Set-VMComPort\\r\\n\"},{\"CompletionText\":\"Set-VMDvdDrive\",\"ListItemText\":\"Set-VMDvdDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMDvdDrive\\r\\n\"},{\"CompletionText\":\"Set-VMFibreChannelHba\",\"ListItemText\":\"Set-VMFibreChannelHba\",\"ResultType\":2,\"ToolTip\":\"Set-VMFibreChannelHba\\r\\n\"},{\"CompletionText\":\"Set-VMFirmware\",\"ListItemText\":\"Set-VMFirmware\",\"ResultType\":2,\"ToolTip\":\"Set-VMFirmware\\r\\n\"},{\"CompletionText\":\"Set-VMFloppyDiskDrive\",\"ListItemText\":\"Set-VMFloppyDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMFloppyDiskDrive\\r\\n\"},{\"CompletionText\":\"Set-VMGpuPartitionAdapter\",\"ListItemText\":\"Set-VMGpuPartitionAdapter\",\"ResultType\":2,\"ToolTip\":\"Set-VMGpuPartitionAdapter\\r\\n\"},{\"CompletionText\":\"Set-VMHardDiskDrive\",\"ListItemText\":\"Set-VMHardDiskDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMHardDiskDrive\\r\\n\"},{\"CompletionText\":\"Set-VMHost\",\"ListItemText\":\"Set-VMHost\",\"ResultType\":2,\"ToolTip\":\"Set-VMHost\\r\\n\"},{\"CompletionText\":\"Set-VMHostCluster\",\"ListItemText\":\"Set-VMHostCluster\",\"ResultType\":2,\"ToolTip\":\"Set-VMHostCluster\\r\\n\"},{\"CompletionText\":\"Set-VMHostPartitionableGpu\",\"ListItemText\":\"Set-VMHostPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Set-VMHostPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Set-VMKeyProtector\",\"ListItemText\":\"Set-VMKeyProtector\",\"ResultType\":2,\"ToolTip\":\"Set-VMKeyProtector\\r\\n\"},{\"CompletionText\":\"Set-VMKeyStorageDrive\",\"ListItemText\":\"Set-VMKeyStorageDrive\",\"ResultType\":2,\"ToolTip\":\"Set-VMKeyStorageDrive\\r\\n\"},{\"CompletionText\":\"Set-VMMemory\",\"ListItemText\":\"Set-VMMemory\",\"ResultType\":2,\"ToolTip\":\"Set-VMMemory\\r\\n\"},{\"CompletionText\":\"Set-VMMigrationNetwork\",\"ListItemText\":\"Set-VMMigrationNetwork\",\"ResultType\":2,\"ToolTip\":\"Set-VMMigrationNetwork\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapter\",\"ListItemText\":\"Set-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterFailoverConfiguration\",\"ListItemText\":\"Set-VMNetworkAdapterFailoverConfiguration\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterFailoverConfiguration\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterIsolation\",\"ListItemText\":\"Set-VMNetworkAdapterIsolation\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterIsolation\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterRdma\",\"ListItemText\":\"Set-VMNetworkAdapterRdma\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterRdma\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterRoutingDomainMapping\",\"ListItemText\":\"Set-VMNetworkAdapterRoutingDomainMapping\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterRoutingDomainMapping\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterTeamMapping\",\"ListItemText\":\"Set-VMNetworkAdapterTeamMapping\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterTeamMapping\\r\\n\"},{\"CompletionText\":\"Set-VMNetworkAdapterVlan\",\"ListItemText\":\"Set-VMNetworkAdapterVlan\",\"ResultType\":2,\"ToolTip\":\"Set-VMNetworkAdapterVlan\\r\\n\"},{\"CompletionText\":\"Set-VMPartitionableGpu\",\"ListItemText\":\"Set-VMPartitionableGpu\",\"ResultType\":2,\"ToolTip\":\"Set-VMPartitionableGpu\\r\\n\"},{\"CompletionText\":\"Set-VMProcessor\",\"ListItemText\":\"Set-VMProcessor\",\"ResultType\":2,\"ToolTip\":\"Set-VMProcessor\\r\\n\"},{\"CompletionText\":\"Set-VMRemoteFx3dVideoAdapter\",\"ListItemText\":\"Set-VMRemoteFx3dVideoAdapter\",\"ResultType\":2,\"ToolTip\":\"Set-VMRemoteFx3dVideoAdapter\\r\\n\"},{\"CompletionText\":\"Set-VMReplication\",\"ListItemText\":\"Set-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Set-VMReplication\\r\\n\"},{\"CompletionText\":\"Set-VMReplicationAuthorizationEntry\",\"ListItemText\":\"Set-VMReplicationAuthorizationEntry\",\"ResultType\":2,\"ToolTip\":\"Set-VMReplicationAuthorizationEntry\\r\\n\"},{\"CompletionText\":\"Set-VMReplicationServer\",\"ListItemText\":\"Set-VMReplicationServer\",\"ResultType\":2,\"ToolTip\":\"Set-VMReplicationServer\\r\\n\"},{\"CompletionText\":\"Set-VMResourcePool\",\"ListItemText\":\"Set-VMResourcePool\",\"ResultType\":2,\"ToolTip\":\"Set-VMResourcePool\\r\\n\"},{\"CompletionText\":\"Set-VMSan\",\"ListItemText\":\"Set-VMSan\",\"ResultType\":2,\"ToolTip\":\"Set-VMSan\\r\\n\"},{\"CompletionText\":\"Set-VMSecurity\",\"ListItemText\":\"Set-VMSecurity\",\"ResultType\":2,\"ToolTip\":\"Set-VMSecurity\\r\\n\"},{\"CompletionText\":\"Set-VMSecurityPolicy\",\"ListItemText\":\"Set-VMSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-VMSecurityPolicy\\r\\n\"},{\"CompletionText\":\"Set-VMStorageSettings\",\"ListItemText\":\"Set-VMStorageSettings\",\"ResultType\":2,\"ToolTip\":\"Set-VMStorageSettings\\r\\n\"},{\"CompletionText\":\"Set-VMSwitch\",\"ListItemText\":\"Set-VMSwitch\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitch\\r\\n\"},{\"CompletionText\":\"Set-VMSwitchExtensionPortFeature\",\"ListItemText\":\"Set-VMSwitchExtensionPortFeature\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitchExtensionPortFeature\\r\\n\"},{\"CompletionText\":\"Set-VMSwitchExtensionSwitchFeature\",\"ListItemText\":\"Set-VMSwitchExtensionSwitchFeature\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitchExtensionSwitchFeature\\r\\n\"},{\"CompletionText\":\"Set-VMSwitchTeam\",\"ListItemText\":\"Set-VMSwitchTeam\",\"ResultType\":2,\"ToolTip\":\"Set-VMSwitchTeam\\r\\n\"},{\"CompletionText\":\"Set-VMVideo\",\"ListItemText\":\"Set-VMVideo\",\"ResultType\":2,\"ToolTip\":\"Set-VMVideo\\r\\n\"},{\"CompletionText\":\"Set-Volume\",\"ListItemText\":\"Set-Volume\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-Volume \\r\\n\"},{\"CompletionText\":\"Set-VolumeScrubPolicy\",\"ListItemText\":\"Set-VolumeScrubPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VolumeScrubPolicy \\r\\n\"},{\"CompletionText\":\"Set-VpnConnection\",\"ListItemText\":\"Set-VpnConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnection \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionIPsecConfiguration\",\"ListItemText\":\"Set-VpnConnectionIPsecConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionIPsecConfiguration \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionProxy\",\"ListItemText\":\"Set-VpnConnectionProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionProxy \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionTriggerDnsConfiguration\",\"ListItemText\":\"Set-VpnConnectionTriggerDnsConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionTriggerDnsConfiguration \\r\\n\"},{\"CompletionText\":\"Set-VpnConnectionTriggerTrustedNetwork\",\"ListItemText\":\"Set-VpnConnectionTriggerTrustedNetwork\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-VpnConnectionTriggerTrustedNetwork \\r\\n\"},{\"CompletionText\":\"Set-WheaMemoryPolicy\",\"ListItemText\":\"Set-WheaMemoryPolicy\",\"ResultType\":2,\"ToolTip\":\"Set-WheaMemoryPolicy\\r\\n\"},{\"CompletionText\":\"Set-WinAcceptLanguageFromLanguageListOptOut\",\"ListItemText\":\"Set-WinAcceptLanguageFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Set-WinAcceptLanguageFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Set-WinCultureFromLanguageListOptOut\",\"ListItemText\":\"Set-WinCultureFromLanguageListOptOut\",\"ResultType\":2,\"ToolTip\":\"Set-WinCultureFromLanguageListOptOut\\r\\n\"},{\"CompletionText\":\"Set-WinDefaultInputMethodOverride\",\"ListItemText\":\"Set-WinDefaultInputMethodOverride\",\"ResultType\":2,\"ToolTip\":\"Set-WinDefaultInputMethodOverride\\r\\n\"},{\"CompletionText\":\"Set-WindowsEdition\",\"ListItemText\":\"Set-WindowsEdition\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsEdition\\r\\n\"},{\"CompletionText\":\"Set-WindowsProductKey\",\"ListItemText\":\"Set-WindowsProductKey\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsProductKey\\r\\n\"},{\"CompletionText\":\"Set-WindowsReservedStorageState\",\"ListItemText\":\"Set-WindowsReservedStorageState\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsReservedStorageState\\r\\n\"},{\"CompletionText\":\"Set-WindowsSearchSetting\",\"ListItemText\":\"Set-WindowsSearchSetting\",\"ResultType\":2,\"ToolTip\":\"Set-WindowsSearchSetting\\r\\n\"},{\"CompletionText\":\"Set-WinHomeLocation\",\"ListItemText\":\"Set-WinHomeLocation\",\"ResultType\":2,\"ToolTip\":\"Set-WinHomeLocation\\r\\n\"},{\"CompletionText\":\"Set-WinhttpProxy\",\"ListItemText\":\"Set-WinhttpProxy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-WinhttpProxy \\r\\n\"},{\"CompletionText\":\"Set-WinLanguageBarOption\",\"ListItemText\":\"Set-WinLanguageBarOption\",\"ResultType\":2,\"ToolTip\":\"Set-WinLanguageBarOption\\r\\n\"},{\"CompletionText\":\"Set-WinSystemLocale\",\"ListItemText\":\"Set-WinSystemLocale\",\"ResultType\":2,\"ToolTip\":\"Set-WinSystemLocale\\r\\n\"},{\"CompletionText\":\"Set-WinUILanguageOverride\",\"ListItemText\":\"Set-WinUILanguageOverride\",\"ResultType\":2,\"ToolTip\":\"Set-WinUILanguageOverride\\r\\n\"},{\"CompletionText\":\"Set-WinUserLanguageList\",\"ListItemText\":\"Set-WinUserLanguageList\",\"ResultType\":2,\"ToolTip\":\"Set-WinUserLanguageList\\r\\n\"},{\"CompletionText\":\"Set-WSManInstance\",\"ListItemText\":\"Set-WSManInstance\",\"ResultType\":2,\"ToolTip\":\"Set-WSManInstance\\r\\n\"},{\"CompletionText\":\"Set-WSManQuickConfig\",\"ListItemText\":\"Set-WSManQuickConfig\",\"ResultType\":2,\"ToolTip\":\"Set-WSManQuickConfig\\r\\n\"},{\"CompletionText\":\"sethc.exe\",\"ListItemText\":\"sethc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sethc.exe\"},{\"CompletionText\":\"setspn.exe\",\"ListItemText\":\"setspn.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setspn.exe\"},{\"CompletionText\":\"Setup\",\"ListItemText\":\"Setup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSetup \\r\\n\"},{\"CompletionText\":\"setupcl.exe\",\"ListItemText\":\"setupcl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setupcl.exe\"},{\"CompletionText\":\"setupugc.exe\",\"ListItemText\":\"setupugc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setupugc.exe\"},{\"CompletionText\":\"setx.exe\",\"ListItemText\":\"setx.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\setx.exe\"},{\"CompletionText\":\"sfc.exe\",\"ListItemText\":\"sfc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sfc.exe\"},{\"CompletionText\":\"sftp.exe\",\"ListItemText\":\"sftp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\sftp.exe\"},{\"CompletionText\":\"shcm\",\"ListItemText\":\"shcm\",\"ResultType\":2,\"ToolTip\":\"Show-Command\"},{\"CompletionText\":\"ShellAppRuntime.exe\",\"ListItemText\":\"ShellAppRuntime.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ShellAppRuntime.exe\"},{\"CompletionText\":\"Should\",\"ListItemText\":\"Should\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShould \\r\\n\"},{\"CompletionText\":\"Show-Command\",\"ListItemText\":\"Show-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-Command [[-Name] ] [-Height ] [-Width ] [-NoCommonParameter] [-ErrorPopup] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Show-Markdown\",\"ListItemText\":\"Show-Markdown\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-Markdown [-Path] [-UseBrowser] []\\r\\n\\r\\nShow-Markdown -InputObject [-UseBrowser] []\\r\\n\\r\\nShow-Markdown -LiteralPath [-UseBrowser] []\\r\\n\"},{\"CompletionText\":\"Show-NetFirewallRule\",\"ListItemText\":\"Show-NetFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-NetFirewallRule \\r\\n\"},{\"CompletionText\":\"Show-NetIPsecRule\",\"ListItemText\":\"Show-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Show-StorageHistory\",\"ListItemText\":\"Show-StorageHistory\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-StorageHistory \\r\\n\"},{\"CompletionText\":\"Show-VirtualDisk\",\"ListItemText\":\"Show-VirtualDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nShow-VirtualDisk \\r\\n\"},{\"CompletionText\":\"Show-WindowsDeveloperLicenseRegistration\",\"ListItemText\":\"Show-WindowsDeveloperLicenseRegistration\",\"ResultType\":2,\"ToolTip\":\"Show-WindowsDeveloperLicenseRegistration\\r\\n\"},{\"CompletionText\":\"shrpubw.exe\",\"ListItemText\":\"shrpubw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\shrpubw.exe\"},{\"CompletionText\":\"shutdown.exe\",\"ListItemText\":\"shutdown.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\shutdown.exe\"},{\"CompletionText\":\"si\",\"ListItemText\":\"si\",\"ResultType\":2,\"ToolTip\":\"Set-Item\"},{\"CompletionText\":\"sigverif.exe\",\"ListItemText\":\"sigverif.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sigverif.exe\"},{\"CompletionText\":\"SIHClient.exe\",\"ListItemText\":\"SIHClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SIHClient.exe\"},{\"CompletionText\":\"sihost.exe\",\"ListItemText\":\"sihost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sihost.exe\"},{\"CompletionText\":\"sl\",\"ListItemText\":\"sl\",\"ResultType\":2,\"ToolTip\":\"Set-Location\"},{\"CompletionText\":\"Slack.exe\",\"ListItemText\":\"Slack.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\Slack.exe\"},{\"CompletionText\":\"slcm\",\"ListItemText\":\"slcm\",\"ResultType\":2,\"ToolTip\":\"slcm\"},{\"CompletionText\":\"sleep\",\"ListItemText\":\"sleep\",\"ResultType\":2,\"ToolTip\":\"Start-Sleep\"},{\"CompletionText\":\"slg\",\"ListItemText\":\"slg\",\"ResultType\":2,\"ToolTip\":\"slg\"},{\"CompletionText\":\"SlideToShutDown.exe\",\"ListItemText\":\"SlideToShutDown.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SlideToShutDown.exe\"},{\"CompletionText\":\"slmgr.vbs\",\"ListItemText\":\"slmgr.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\slmgr.vbs\"},{\"CompletionText\":\"sls\",\"ListItemText\":\"sls\",\"ResultType\":2,\"ToolTip\":\"Select-String\"},{\"CompletionText\":\"slu\",\"ListItemText\":\"slu\",\"ResultType\":2,\"ToolTip\":\"slu\"},{\"CompletionText\":\"slui.exe\",\"ListItemText\":\"slui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\slui.exe\"},{\"CompletionText\":\"smartscreen.exe\",\"ListItemText\":\"smartscreen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\smartscreen.exe\"},{\"CompletionText\":\"smss.exe\",\"ListItemText\":\"smss.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\smss.exe\"},{\"CompletionText\":\"SndVol.exe\",\"ListItemText\":\"SndVol.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SndVol.exe\"},{\"CompletionText\":\"SnippingTool.exe\",\"ListItemText\":\"SnippingTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\SnippingTool.exe\"},{\"CompletionText\":\"snmptrap.exe\",\"ListItemText\":\"snmptrap.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\snmptrap.exe\"},{\"CompletionText\":\"sort\",\"ListItemText\":\"sort\",\"ResultType\":2,\"ToolTip\":\"Sort-Object\"},{\"CompletionText\":\"Sort-Object\",\"ListItemText\":\"Sort-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSort-Object [[-Property] ] [-Stable] [-Descending] [-Unique] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\\r\\nSort-Object [[-Property] ] -Top [-Descending] [-Unique] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\\r\\nSort-Object [[-Property] ] -Bottom [-Descending] [-Unique] [-InputObject ] [-Culture ] [-CaseSensitive] []\\r\\n\"},{\"CompletionText\":\"sort.exe\",\"ListItemText\":\"sort.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sort.exe\"},{\"CompletionText\":\"sp\",\"ListItemText\":\"sp\",\"ResultType\":2,\"ToolTip\":\"Set-ItemProperty\"},{\"CompletionText\":\"SpaceAgent.exe\",\"ListItemText\":\"SpaceAgent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SpaceAgent.exe\"},{\"CompletionText\":\"spaceman.exe\",\"ListItemText\":\"spaceman.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\spaceman.exe\"},{\"CompletionText\":\"spaceutil.exe\",\"ListItemText\":\"spaceutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\spaceutil.exe\"},{\"CompletionText\":\"SpatialAudioLicenseSrv.exe\",\"ListItemText\":\"SpatialAudioLicenseSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SpatialAudioLicenseSrv.exe\"},{\"CompletionText\":\"Spectrum.exe\",\"ListItemText\":\"Spectrum.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Spectrum.exe\"},{\"CompletionText\":\"spjb\",\"ListItemText\":\"spjb\",\"ResultType\":2,\"ToolTip\":\"Stop-Job\"},{\"CompletionText\":\"Split-Path\",\"ListItemText\":\"Split-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSplit-Path [-Path] [-Parent] [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -Leaf [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -LeafBase [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -Extension [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -Qualifier [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -NoQualifier [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path [-Path] -IsAbsolute [-Resolve] [-Credential ] []\\r\\n\\r\\nSplit-Path -LiteralPath [-Resolve] [-Credential ] []\\r\\n\"},{\"CompletionText\":\"Split-WindowsImage\",\"ListItemText\":\"Split-WindowsImage\",\"ResultType\":2,\"ToolTip\":\"Split-WindowsImage\\r\\n\"},{\"CompletionText\":\"splwow64.exe\",\"ListItemText\":\"splwow64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\splwow64.exe\"},{\"CompletionText\":\"spoolsv.exe\",\"ListItemText\":\"spoolsv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\spoolsv.exe\"},{\"CompletionText\":\"SppExtComObj.Exe\",\"ListItemText\":\"SppExtComObj.Exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SppExtComObj.Exe\"},{\"CompletionText\":\"spps\",\"ListItemText\":\"spps\",\"ResultType\":2,\"ToolTip\":\"Stop-Process\"},{\"CompletionText\":\"sppsvc.exe\",\"ListItemText\":\"sppsvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sppsvc.exe\"},{\"CompletionText\":\"spsv\",\"ListItemText\":\"spsv\",\"ResultType\":2,\"ToolTip\":\"Stop-Service\"},{\"CompletionText\":\"spvm\",\"ListItemText\":\"spvm\",\"ResultType\":2,\"ToolTip\":\"spvm\"},{\"CompletionText\":\"srdelayed.exe\",\"ListItemText\":\"srdelayed.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\srdelayed.exe\"},{\"CompletionText\":\"SrTasks.exe\",\"ListItemText\":\"SrTasks.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SrTasks.exe\"},{\"CompletionText\":\"ssh-add.exe\",\"ListItemText\":\"ssh-add.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-add.exe\"},{\"CompletionText\":\"ssh-agent.exe\",\"ListItemText\":\"ssh-agent.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-agent.exe\"},{\"CompletionText\":\"ssh-keygen.exe\",\"ListItemText\":\"ssh-keygen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-keygen.exe\"},{\"CompletionText\":\"ssh-keyscan.exe\",\"ListItemText\":\"ssh-keyscan.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh-keyscan.exe\"},{\"CompletionText\":\"ssh.exe\",\"ListItemText\":\"ssh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\OpenSSH\\\\ssh.exe\"},{\"CompletionText\":\"ssmbb\",\"ListItemText\":\"ssmbb\",\"ResultType\":2,\"ToolTip\":\"ssmbb\"},{\"CompletionText\":\"ssmbcc\",\"ListItemText\":\"ssmbcc\",\"ResultType\":2,\"ToolTip\":\"ssmbcc\"},{\"CompletionText\":\"ssmbccm\",\"ListItemText\":\"ssmbccm\",\"ResultType\":2,\"ToolTip\":\"ssmbccm\"},{\"CompletionText\":\"ssmbp\",\"ListItemText\":\"ssmbp\",\"ResultType\":2,\"ToolTip\":\"ssmbp\"},{\"CompletionText\":\"ssmbs\",\"ListItemText\":\"ssmbs\",\"ResultType\":2,\"ToolTip\":\"ssmbs\"},{\"CompletionText\":\"ssmbsc\",\"ListItemText\":\"ssmbsc\",\"ResultType\":2,\"ToolTip\":\"ssmbsc\"},{\"CompletionText\":\"ssmbscm\",\"ListItemText\":\"ssmbscm\",\"ResultType\":2,\"ToolTip\":\"ssmbscm\"},{\"CompletionText\":\"starship.exe\",\"ListItemText\":\"starship.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\starship\\\\bin\\\\starship.exe\"},{\"CompletionText\":\"start\",\"ListItemText\":\"start\",\"ResultType\":2,\"ToolTip\":\"Start-Process\"},{\"CompletionText\":\"Start-AppBackgroundTask\",\"ListItemText\":\"Start-AppBackgroundTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AppBackgroundTask \\r\\n\"},{\"CompletionText\":\"Start-AppvVirtualProcess\",\"ListItemText\":\"Start-AppvVirtualProcess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AppvVirtualProcess \\r\\n\"},{\"CompletionText\":\"Start-ASRApplyRecoveryPoint\",\"ListItemText\":\"Start-ASRApplyRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Start-ASRApplyRecoveryPoint\"},{\"CompletionText\":\"Start-ASRCancelFailover\",\"ListItemText\":\"Start-ASRCancelFailover\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCancelFailover\"},{\"CompletionText\":\"Start-ASRCancelFailoverJob\",\"ListItemText\":\"Start-ASRCancelFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCancelFailoverJob\"},{\"CompletionText\":\"Start-ASRCommitFailover\",\"ListItemText\":\"Start-ASRCommitFailover\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCommitFailover\"},{\"CompletionText\":\"Start-ASRCommitFailoverJob\",\"ListItemText\":\"Start-ASRCommitFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRCommitFailoverJob\"},{\"CompletionText\":\"Start-ASRFO\",\"ListItemText\":\"Start-ASRFO\",\"ResultType\":2,\"ToolTip\":\"Start-ASRFO\"},{\"CompletionText\":\"Start-ASRPFO\",\"ListItemText\":\"Start-ASRPFO\",\"ResultType\":2,\"ToolTip\":\"Start-ASRPFO\"},{\"CompletionText\":\"Start-ASRPlannedFailoverJob\",\"ListItemText\":\"Start-ASRPlannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRPlannedFailoverJob\"},{\"CompletionText\":\"Start-ASRResynchronizeReplicationJob\",\"ListItemText\":\"Start-ASRResynchronizeReplicationJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRResynchronizeReplicationJob\"},{\"CompletionText\":\"Start-ASRResyncJob\",\"ListItemText\":\"Start-ASRResyncJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRResyncJob\"},{\"CompletionText\":\"Start-ASRSwitchAppliance\",\"ListItemText\":\"Start-ASRSwitchAppliance\",\"ResultType\":2,\"ToolTip\":\"Start-ASRSwitchAppliance\"},{\"CompletionText\":\"Start-ASRSwitchProcessServerJob\",\"ListItemText\":\"Start-ASRSwitchProcessServerJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRSwitchProcessServerJob\"},{\"CompletionText\":\"Start-ASRTestFailoverCleanupJob\",\"ListItemText\":\"Start-ASRTestFailoverCleanupJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTestFailoverCleanupJob\"},{\"CompletionText\":\"Start-ASRTestFailoverJob\",\"ListItemText\":\"Start-ASRTestFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTestFailoverJob\"},{\"CompletionText\":\"Start-ASRTFO\",\"ListItemText\":\"Start-ASRTFO\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTFO\"},{\"CompletionText\":\"Start-ASRTFOCleanupJob\",\"ListItemText\":\"Start-ASRTFOCleanupJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRTFOCleanupJob\"},{\"CompletionText\":\"Start-ASRUnplannedFailoverJob\",\"ListItemText\":\"Start-ASRUnplannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-ASRUnplannedFailoverJob\"},{\"CompletionText\":\"Start-AutologgerConfig\",\"ListItemText\":\"Start-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Start-AzAksCluster\",\"ListItemText\":\"Start-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzAksCluster \\r\\n\"},{\"CompletionText\":\"Start-AzAksDashboard\",\"ListItemText\":\"Start-AzAksDashboard\",\"ResultType\":2,\"ToolTip\":\"Start-AzAksDashboard\\r\\n\"},{\"CompletionText\":\"Start-AzAksManagedClusterCommand\",\"ListItemText\":\"Start-AzAksManagedClusterCommand\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzAksManagedClusterCommand \\r\\n\"},{\"CompletionText\":\"Start-AzApplicationGateway\",\"ListItemText\":\"Start-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Start-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationDscCompilationJob\",\"ListItemText\":\"Start-AzAutomationDscCompilationJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationDscCompilationJob\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationDscNodeConfigurationDeployment\",\"ListItemText\":\"Start-AzAutomationDscNodeConfigurationDeployment\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationDscNodeConfigurationDeployment\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationRunbook\",\"ListItemText\":\"Start-AzAutomationRunbook\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationRunbook\\r\\n\"},{\"CompletionText\":\"Start-AzAutomationSourceControlSyncJob\",\"ListItemText\":\"Start-AzAutomationSourceControlSyncJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzAutomationSourceControlSyncJob\\r\\n\"},{\"CompletionText\":\"Start-AzBatchComputeNodeServiceLogUpload\",\"ListItemText\":\"Start-AzBatchComputeNodeServiceLogUpload\",\"ResultType\":2,\"ToolTip\":\"Start-AzBatchComputeNodeServiceLogUpload\\r\\n\"},{\"CompletionText\":\"Start-AzBatchPoolResize\",\"ListItemText\":\"Start-AzBatchPoolResize\",\"ResultType\":2,\"ToolTip\":\"Start-AzBatchPoolResize\\r\\n\"},{\"CompletionText\":\"Start-AzCdnEndpoint\",\"ListItemText\":\"Start-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Start-AzCloudService\",\"ListItemText\":\"Start-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzCloudService \\r\\n\"},{\"CompletionText\":\"Start-AzContainerGroup\",\"ListItemText\":\"Start-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Start-AzDataFactoryV2DataFlowDebugSession\",\"ListItemText\":\"Start-AzDataFactoryV2DataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataFactoryV2DataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Start-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Start-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Start-AzDataFactoryV2Trigger\",\"ListItemText\":\"Start-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Start-AzDataProtectionBackupInstanceRestore\",\"ListItemText\":\"Start-AzDataProtectionBackupInstanceRestore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzDataProtectionBackupInstanceRestore \\r\\n\"},{\"CompletionText\":\"Start-AzDataShareSubscriptionSynchronization\",\"ListItemText\":\"Start-AzDataShareSubscriptionSynchronization\",\"ResultType\":2,\"ToolTip\":\"Start-AzDataShareSubscriptionSynchronization\\r\\n\"},{\"CompletionText\":\"Start-AzFrontDoorCdnProfilePrepareMigration\",\"ListItemText\":\"Start-AzFrontDoorCdnProfilePrepareMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzFrontDoorCdnProfilePrepareMigration \\r\\n\"},{\"CompletionText\":\"Start-AzFunctionApp\",\"ListItemText\":\"Start-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Start-AzHDInsightJob\",\"ListItemText\":\"Start-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Start-AzJitNetworkAccessPolicy\",\"ListItemText\":\"Start-AzJitNetworkAccessPolicy\",\"ResultType\":2,\"ToolTip\":\"Start-AzJitNetworkAccessPolicy\\r\\n\"},{\"CompletionText\":\"Start-AzKustoCluster\",\"ListItemText\":\"Start-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Start-AzLogicApp\",\"ListItemText\":\"Start-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Start-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Start-AzMigrateServerMigration\",\"ListItemText\":\"Start-AzMigrateServerMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMigrateServerMigration \\r\\n\"},{\"CompletionText\":\"Start-AzMigrateTestMigration\",\"ListItemText\":\"Start-AzMigrateTestMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMigrateTestMigration \\r\\n\"},{\"CompletionText\":\"Start-AzMigrateTestMigrationCleanup\",\"ListItemText\":\"Start-AzMigrateTestMigrationCleanup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMigrateTestMigrationCleanup \\r\\n\"},{\"CompletionText\":\"Start-AzMLWorkspaceCompute\",\"ListItemText\":\"Start-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Start-AzMySqlFlexibleServer\",\"ListItemText\":\"Start-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Start-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Start-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Start-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Start-AzNetworkWatcherResourceTroubleshooting\",\"ListItemText\":\"Start-AzNetworkWatcherResourceTroubleshooting\",\"ResultType\":2,\"ToolTip\":\"Start-AzNetworkWatcherResourceTroubleshooting\\r\\n\"},{\"CompletionText\":\"Start-AzPolicyComplianceScan\",\"ListItemText\":\"Start-AzPolicyComplianceScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzPolicyComplianceScan\\r\\n\"},{\"CompletionText\":\"Start-AzPolicyRemediation\",\"ListItemText\":\"Start-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Start-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Start-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Start-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrApplyRecoveryPoint\",\"ListItemText\":\"Start-AzRecoveryServicesAsrApplyRecoveryPoint\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrApplyRecoveryPoint\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrCancelFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrCancelFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrCancelFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrCommitFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrCommitFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrCommitFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrPlannedFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrPlannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrPlannedFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrResynchronizeReplicationJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrResynchronizeReplicationJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrResynchronizeReplicationJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrSwitchAppliance\",\"ListItemText\":\"Start-AzRecoveryServicesAsrSwitchAppliance\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrSwitchAppliance\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrSwitchProcessServerJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrSwitchProcessServerJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrSwitchProcessServerJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrTestFailoverCleanupJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrTestFailoverCleanupJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrTestFailoverCleanupJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrTestFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrTestFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrTestFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzRecoveryServicesAsrUnplannedFailoverJob\",\"ListItemText\":\"Start-AzRecoveryServicesAsrUnplannedFailoverJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzRecoveryServicesAsrUnplannedFailoverJob\\r\\n\"},{\"CompletionText\":\"Start-AzServiceBusMigration\",\"ListItemText\":\"Start-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Start-AzSqlDatabaseExecuteIndexRecommendation\",\"ListItemText\":\"Start-AzSqlDatabaseExecuteIndexRecommendation\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlDatabaseExecuteIndexRecommendation\\r\\n\"},{\"CompletionText\":\"Start-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Start-AzSqlDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Start-AzSqlElasticJob\",\"ListItemText\":\"Start-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Start-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Start-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Start-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ListItemText\":\"Start-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlInstanceDatabaseVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Start-AzSqlSyncGroupSync\",\"ListItemText\":\"Start-AzSqlSyncGroupSync\",\"ResultType\":2,\"ToolTip\":\"Start-AzSqlSyncGroupSync\\r\\n\"},{\"CompletionText\":\"Start-AzSqlVMAssessment\",\"ListItemText\":\"Start-AzSqlVMAssessment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzSqlVMAssessment \\r\\n\"},{\"CompletionText\":\"Start-AzStorageBlobCopy\",\"ListItemText\":\"Start-AzStorageBlobCopy\",\"ResultType\":2,\"ToolTip\":\"Start-AzStorageBlobCopy\\r\\n\"},{\"CompletionText\":\"Start-AzStorageBlobIncrementalCopy\",\"ListItemText\":\"Start-AzStorageBlobIncrementalCopy\",\"ResultType\":2,\"ToolTip\":\"Start-AzStorageBlobIncrementalCopy\\r\\n\"},{\"CompletionText\":\"Start-AzStorageFileCopy\",\"ListItemText\":\"Start-AzStorageFileCopy\",\"ResultType\":2,\"ToolTip\":\"Start-AzStorageFileCopy\\r\\n\"},{\"CompletionText\":\"Start-AzStorageMoverJobDefinition\",\"ListItemText\":\"Start-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Start-AzStreamAnalyticsJob\",\"ListItemText\":\"Start-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Start-AzSynapseDataFlowDebugSession\",\"ListItemText\":\"Start-AzSynapseDataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseDataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Start-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseKustoPool\",\"ListItemText\":\"Start-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Start-AzSynapseLinkConnection\",\"ListItemText\":\"Start-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseSparkSession\",\"ListItemText\":\"Start-AzSynapseSparkSession\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseSparkSession\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ListItemText\":\"Start-AzSynapseSqlPoolVulnerabilityAssessmentScan\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseSqlPoolVulnerabilityAssessmentScan\\r\\n\"},{\"CompletionText\":\"Start-AzSynapseTrigger\",\"ListItemText\":\"Start-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Start-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Start-AzTenantBackfill\",\"ListItemText\":\"Start-AzTenantBackfill\",\"ResultType\":2,\"ToolTip\":\"Start-AzTenantBackfill\\r\\n\"},{\"CompletionText\":\"Start-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ListItemText\":\"Start-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVirtualNetworkGatewayConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzVirtualNetworkGatewayPacketCapture\",\"ListItemText\":\"Start-AzVirtualNetworkGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVirtualNetworkGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzVM\",\"ListItemText\":\"Start-AzVM\",\"ResultType\":2,\"ToolTip\":\"Start-AzVM\\r\\n\"},{\"CompletionText\":\"Start-AzVmss\",\"ListItemText\":\"Start-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Start-AzVmss\\r\\n\"},{\"CompletionText\":\"Start-AzVmssRollingExtensionUpgrade\",\"ListItemText\":\"Start-AzVmssRollingExtensionUpgrade\",\"ResultType\":2,\"ToolTip\":\"Start-AzVmssRollingExtensionUpgrade\\r\\n\"},{\"CompletionText\":\"Start-AzVmssRollingOSUpgrade\",\"ListItemText\":\"Start-AzVmssRollingOSUpgrade\",\"ResultType\":2,\"ToolTip\":\"Start-AzVmssRollingOSUpgrade\\r\\n\"},{\"CompletionText\":\"Start-AzVpnConnectionPacketCapture\",\"ListItemText\":\"Start-AzVpnConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVpnConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzVpnGatewayPacketCapture\",\"ListItemText\":\"Start-AzVpnGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Start-AzVpnGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Start-AzWebApp\",\"ListItemText\":\"Start-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Start-AzWebApp\\r\\n\"},{\"CompletionText\":\"Start-AzWebAppContinuousWebJob\",\"ListItemText\":\"Start-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Start-AzWebAppSlot\",\"ListItemText\":\"Start-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Start-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Start-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Start-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Start-AzWebAppSlotTriggeredWebJob\",\"ListItemText\":\"Start-AzWebAppSlotTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppSlotTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Start-AzWebAppTriggeredWebJob\",\"ListItemText\":\"Start-AzWebAppTriggeredWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-AzWebAppTriggeredWebJob \\r\\n\"},{\"CompletionText\":\"Start-BitsTransfer\",\"ListItemText\":\"Start-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Start-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Start-CopyAzureStorageBlob\",\"ListItemText\":\"Start-CopyAzureStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Start-CopyAzureStorageBlob\"},{\"CompletionText\":\"Start-DscConfiguration\",\"ListItemText\":\"Start-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Start-DscConfiguration\\r\\n\"},{\"CompletionText\":\"Start-Dtc\",\"ListItemText\":\"Start-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Dtc \\r\\n\"},{\"CompletionText\":\"Start-DtcDiagnosticResourceManager\",\"ListItemText\":\"Start-DtcDiagnosticResourceManager\",\"ResultType\":2,\"ToolTip\":\"Start-DtcDiagnosticResourceManager\\r\\n\"},{\"CompletionText\":\"Start-DtcTransactionsTraceSession\",\"ListItemText\":\"Start-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Start-EtwTraceSession\",\"ListItemText\":\"Start-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Start-Job\",\"ListItemText\":\"Start-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Job [-ScriptBlock] [[-InitializationScript] ] [-Name ] [-Credential ] [-Authentication ] [-WorkingDirectory ] [-RunAs32] [-PSVersion ] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nStart-Job [-DefinitionName] [[-DefinitionPath] ] [[-Type] ] [-WorkingDirectory ] []\\r\\n\\r\\nStart-Job [-FilePath] [[-InitializationScript] ] [-Name ] [-Credential ] [-Authentication ] [-WorkingDirectory ] [-RunAs32] [-PSVersion ] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nStart-Job [[-InitializationScript] ] -LiteralPath [-Name ] [-Credential ] [-Authentication ] [-WorkingDirectory ] [-RunAs32] [-PSVersion ] [-InputObject ] [-ArgumentList ] []\\r\\n\\r\\nStart-Job [-WorkingDirectory ] [-ConnectingTimeout ] [-Options ] []\\r\\n\"},{\"CompletionText\":\"Start-MpRollback\",\"ListItemText\":\"Start-MpRollback\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpRollback \\r\\n\"},{\"CompletionText\":\"Start-MpScan\",\"ListItemText\":\"Start-MpScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpScan \\r\\n\"},{\"CompletionText\":\"Start-MpWDOScan\",\"ListItemText\":\"Start-MpWDOScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpWDOScan \\r\\n\"},{\"CompletionText\":\"Start-NetEventSession\",\"ListItemText\":\"Start-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-NetEventSession \\r\\n\"},{\"CompletionText\":\"Start-OSUninstall\",\"ListItemText\":\"Start-OSUninstall\",\"ResultType\":2,\"ToolTip\":\"Start-OSUninstall\\r\\n\"},{\"CompletionText\":\"Start-PcsvDevice\",\"ListItemText\":\"Start-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Start-Process\",\"ListItemText\":\"Start-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Process [-FilePath] [[-ArgumentList] ] [-Credential ] [-WorkingDirectory ] [-LoadUserProfile] [-NoNewWindow] [-PassThru] [-RedirectStandardError ] [-RedirectStandardInput ] [-RedirectStandardOutput ] [-WindowStyle ] [-Wait] [-UseNewEnvironment] [-Environment ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStart-Process [-FilePath] [[-ArgumentList] ] [-WorkingDirectory ] [-PassThru] [-Verb ] [-WindowStyle ] [-Wait] [-Environment ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Start-ScheduledTask\",\"ListItemText\":\"Start-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Start-Service\",\"ListItemText\":\"Start-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Service [-InputObject] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStart-Service [-Name] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStart-Service -DisplayName [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Start-Sleep\",\"ListItemText\":\"Start-Sleep\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Sleep [-Seconds] []\\r\\n\\r\\nStart-Sleep -Milliseconds []\\r\\n\\r\\nStart-Sleep [-Duration] []\\r\\n\"},{\"CompletionText\":\"start-ssh-agent.cmd\",\"ListItemText\":\"start-ssh-agent.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\start-ssh-agent.cmd\"},{\"CompletionText\":\"start-ssh-pageant.cmd\",\"ListItemText\":\"start-ssh-pageant.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\start-ssh-pageant.cmd\"},{\"CompletionText\":\"Start-StorageDiagnosticLog\",\"ListItemText\":\"Start-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-StorageDiagnosticLog \\r\\n\"},{\"CompletionText\":\"Start-ThreadJob\",\"ListItemText\":\"Start-ThreadJob\",\"ResultType\":2,\"ToolTip\":\"Start-ThreadJob\\r\\n\"},{\"CompletionText\":\"Start-Trace\",\"ListItemText\":\"Start-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Trace \\r\\n\"},{\"CompletionText\":\"Start-Transcript\",\"ListItemText\":\"Start-Transcript\",\"ResultType\":2,\"ToolTip\":\"Start-Transcript\\r\\n\"},{\"CompletionText\":\"Start-VM\",\"ListItemText\":\"Start-VM\",\"ResultType\":2,\"ToolTip\":\"Start-VM\\r\\n\"},{\"CompletionText\":\"Start-VMFailover\",\"ListItemText\":\"Start-VMFailover\",\"ResultType\":2,\"ToolTip\":\"Start-VMFailover\\r\\n\"},{\"CompletionText\":\"Start-VMInitialReplication\",\"ListItemText\":\"Start-VMInitialReplication\",\"ResultType\":2,\"ToolTip\":\"Start-VMInitialReplication\\r\\n\"},{\"CompletionText\":\"Start-VMTrace\",\"ListItemText\":\"Start-VMTrace\",\"ResultType\":2,\"ToolTip\":\"Start-VMTrace\\r\\n\"},{\"CompletionText\":\"Stop-AdlJob\",\"ListItemText\":\"Stop-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AdlJob\"},{\"CompletionText\":\"Stop-ASRJob\",\"ListItemText\":\"Stop-ASRJob\",\"ResultType\":2,\"ToolTip\":\"Stop-ASRJob\"},{\"CompletionText\":\"Stop-AzAksCluster\",\"ListItemText\":\"Stop-AzAksCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzAksCluster \\r\\n\"},{\"CompletionText\":\"Stop-AzAksDashboard\",\"ListItemText\":\"Stop-AzAksDashboard\",\"ResultType\":2,\"ToolTip\":\"Stop-AzAksDashboard\\r\\n\"},{\"CompletionText\":\"Stop-AzApplicationGateway\",\"ListItemText\":\"Stop-AzApplicationGateway\",\"ResultType\":2,\"ToolTip\":\"Stop-AzApplicationGateway\\r\\n\"},{\"CompletionText\":\"Stop-AzAutomationDscNodeConfigurationDeployment\",\"ListItemText\":\"Stop-AzAutomationDscNodeConfigurationDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzAutomationDscNodeConfigurationDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzAutomationJob\",\"ListItemText\":\"Stop-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchCertificateDeletion\",\"ListItemText\":\"Stop-AzBatchCertificateDeletion\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchCertificateDeletion\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchJob\",\"ListItemText\":\"Stop-AzBatchJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchJob\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchJobSchedule\",\"ListItemText\":\"Stop-AzBatchJobSchedule\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchJobSchedule\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchPoolResize\",\"ListItemText\":\"Stop-AzBatchPoolResize\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchPoolResize\\r\\n\"},{\"CompletionText\":\"Stop-AzBatchTask\",\"ListItemText\":\"Stop-AzBatchTask\",\"ResultType\":2,\"ToolTip\":\"Stop-AzBatchTask\\r\\n\"},{\"CompletionText\":\"Stop-AzCdnEndpoint\",\"ListItemText\":\"Stop-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Stop-AzCloudService\",\"ListItemText\":\"Stop-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzCloudService \\r\\n\"},{\"CompletionText\":\"Stop-AzContainerGroup\",\"ListItemText\":\"Stop-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2DataFlowDebugSession\",\"ListItemText\":\"Stop-AzDataFactoryV2DataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2DataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Stop-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2PipelineRun\",\"ListItemText\":\"Stop-AzDataFactoryV2PipelineRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2PipelineRun\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2Trigger\",\"ListItemText\":\"Stop-AzDataFactoryV2Trigger\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2Trigger\\r\\n\"},{\"CompletionText\":\"Stop-AzDataFactoryV2TriggerRun\",\"ListItemText\":\"Stop-AzDataFactoryV2TriggerRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataFactoryV2TriggerRun\\r\\n\"},{\"CompletionText\":\"Stop-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Stop-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Stop-AzDataProtectionBackupInstanceProtection\",\"ListItemText\":\"Stop-AzDataProtectionBackupInstanceProtection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzDataProtectionBackupInstanceProtection \\r\\n\"},{\"CompletionText\":\"Stop-AzDataShareSubscriptionSynchronization\",\"ListItemText\":\"Stop-AzDataShareSubscriptionSynchronization\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDataShareSubscriptionSynchronization\\r\\n\"},{\"CompletionText\":\"Stop-AzDeployment\",\"ListItemText\":\"Stop-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzDeploymentManagerRollout\",\"ListItemText\":\"Stop-AzDeploymentManagerRollout\",\"ResultType\":2,\"ToolTip\":\"Stop-AzDeploymentManagerRollout\\r\\n\"},{\"CompletionText\":\"Stop-AzFrontDoorCdnProfileMigration\",\"ListItemText\":\"Stop-AzFrontDoorCdnProfileMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzFrontDoorCdnProfileMigration \\r\\n\"},{\"CompletionText\":\"Stop-AzFunctionApp\",\"ListItemText\":\"Stop-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Stop-AzHDInsightJob\",\"ListItemText\":\"Stop-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Stop-AzKeyVaultCertificateOperation\",\"ListItemText\":\"Stop-AzKeyVaultCertificateOperation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzKeyVaultCertificateOperation\\r\\n\"},{\"CompletionText\":\"Stop-AzKustoCluster\",\"ListItemText\":\"Stop-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Stop-AzLogicAppRun\",\"ListItemText\":\"Stop-AzLogicAppRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzLogicAppRun\\r\\n\"},{\"CompletionText\":\"Stop-AzManagementGroupDeployment\",\"ListItemText\":\"Stop-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzMarketplaceTerms\",\"ListItemText\":\"Stop-AzMarketplaceTerms\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMarketplaceTerms \\r\\n\"},{\"CompletionText\":\"Stop-AzMLWorkspaceCompute\",\"ListItemText\":\"Stop-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Stop-AzMLWorkspaceJob\",\"ListItemText\":\"Stop-AzMLWorkspaceJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMLWorkspaceJob \\r\\n\"},{\"CompletionText\":\"Stop-AzMySqlFlexibleServer\",\"ListItemText\":\"Stop-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Stop-AzNetworkWatcherConnectionMonitor\",\"ListItemText\":\"Stop-AzNetworkWatcherConnectionMonitor\",\"ResultType\":2,\"ToolTip\":\"Stop-AzNetworkWatcherConnectionMonitor\\r\\n\"},{\"CompletionText\":\"Stop-AzNetworkWatcherPacketCapture\",\"ListItemText\":\"Stop-AzNetworkWatcherPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzNetworkWatcherPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzPolicyRemediation\",\"ListItemText\":\"Stop-AzPolicyRemediation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzPolicyRemediation\\r\\n\"},{\"CompletionText\":\"Stop-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Stop-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Stop-AzRecoveryServicesAsrJob\",\"ListItemText\":\"Stop-AzRecoveryServicesAsrJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzRecoveryServicesAsrJob\\r\\n\"},{\"CompletionText\":\"Stop-AzRecoveryServicesBackupJob\",\"ListItemText\":\"Stop-AzRecoveryServicesBackupJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzRecoveryServicesBackupJob\\r\\n\"},{\"CompletionText\":\"Stop-AzResourceGroupDeployment\",\"ListItemText\":\"Stop-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzRoleAssignmentScheduleRequest\",\"ListItemText\":\"Stop-AzRoleAssignmentScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzRoleAssignmentScheduleRequest \\r\\n\"},{\"CompletionText\":\"Stop-AzRoleEligibilityScheduleRequest\",\"ListItemText\":\"Stop-AzRoleEligibilityScheduleRequest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzRoleEligibilityScheduleRequest \\r\\n\"},{\"CompletionText\":\"Stop-AzServiceBusMigration\",\"ListItemText\":\"Stop-AzServiceBusMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzServiceBusMigration \\r\\n\"},{\"CompletionText\":\"Stop-AzSqlDatabaseActivity\",\"ListItemText\":\"Stop-AzSqlDatabaseActivity\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlDatabaseActivity\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlDatabaseExecuteIndexRecommendation\",\"ListItemText\":\"Stop-AzSqlDatabaseExecuteIndexRecommendation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlDatabaseExecuteIndexRecommendation\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlElasticJob\",\"ListItemText\":\"Stop-AzSqlElasticJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlElasticJob\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlElasticPoolActivity\",\"ListItemText\":\"Stop-AzSqlElasticPoolActivity\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlElasticPoolActivity\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlInstanceDatabaseLogReplay\",\"ListItemText\":\"Stop-AzSqlInstanceDatabaseLogReplay\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlInstanceDatabaseLogReplay\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlInstanceOperation\",\"ListItemText\":\"Stop-AzSqlInstanceOperation\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlInstanceOperation\\r\\n\"},{\"CompletionText\":\"Stop-AzSqlSyncGroupSync\",\"ListItemText\":\"Stop-AzSqlSyncGroupSync\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSqlSyncGroupSync\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ListItemText\":\"Stop-AzStorageAccountHierarchicalNamespaceUpgrade\",\"ResultType\":2,\"ToolTip\":\"Stop-AzStorageAccountHierarchicalNamespaceUpgrade\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageBlobCopy\",\"ListItemText\":\"Stop-AzStorageBlobCopy\",\"ResultType\":2,\"ToolTip\":\"Stop-AzStorageBlobCopy\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageFileCopy\",\"ListItemText\":\"Stop-AzStorageFileCopy\",\"ResultType\":2,\"ToolTip\":\"Stop-AzStorageFileCopy\\r\\n\"},{\"CompletionText\":\"Stop-AzStorageMoverJobDefinition\",\"ListItemText\":\"Stop-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Stop-AzStreamAnalyticsJob\",\"ListItemText\":\"Stop-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Stop-AzSubscriptionDeployment\",\"ListItemText\":\"Stop-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSubscriptionDeployment\"},{\"CompletionText\":\"Stop-AzSynapseDataFlowDebugSession\",\"ListItemText\":\"Stop-AzSynapseDataFlowDebugSession\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseDataFlowDebugSession\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Stop-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseKustoPool\",\"ListItemText\":\"Stop-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseLinkConnection\",\"ListItemText\":\"Stop-AzSynapseLinkConnection\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseLinkConnection\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapsePipelineRun\",\"ListItemText\":\"Stop-AzSynapsePipelineRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapsePipelineRun\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseSparkJob\",\"ListItemText\":\"Stop-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseSparkSession\",\"ListItemText\":\"Stop-AzSynapseSparkSession\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseSparkSession\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseSparkStatement\",\"ListItemText\":\"Stop-AzSynapseSparkStatement\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseSparkStatement\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseTrigger\",\"ListItemText\":\"Stop-AzSynapseTrigger\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseTrigger\\r\\n\"},{\"CompletionText\":\"Stop-AzSynapseTriggerRun\",\"ListItemText\":\"Stop-AzSynapseTriggerRun\",\"ResultType\":2,\"ToolTip\":\"Stop-AzSynapseTriggerRun\\r\\n\"},{\"CompletionText\":\"Stop-AzTenantDeployment\",\"ListItemText\":\"Stop-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Stop-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Stop-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ListItemText\":\"Stop-AzVirtualNetworkGatewayConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVirtualNetworkGatewayConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzVirtualNetworkGatewayPacketCapture\",\"ListItemText\":\"Stop-AzVirtualNetworkGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVirtualNetworkGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzVM\",\"ListItemText\":\"Stop-AzVM\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVM\\r\\n\"},{\"CompletionText\":\"Stop-AzVmss\",\"ListItemText\":\"Stop-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVmss\\r\\n\"},{\"CompletionText\":\"Stop-AzVmssRollingUpgrade\",\"ListItemText\":\"Stop-AzVmssRollingUpgrade\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVmssRollingUpgrade\\r\\n\"},{\"CompletionText\":\"Stop-AzVpnConnectionPacketCapture\",\"ListItemText\":\"Stop-AzVpnConnectionPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVpnConnectionPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzVpnGatewayPacketCapture\",\"ListItemText\":\"Stop-AzVpnGatewayPacketCapture\",\"ResultType\":2,\"ToolTip\":\"Stop-AzVpnGatewayPacketCapture\\r\\n\"},{\"CompletionText\":\"Stop-AzWebApp\",\"ListItemText\":\"Stop-AzWebApp\",\"ResultType\":2,\"ToolTip\":\"Stop-AzWebApp\\r\\n\"},{\"CompletionText\":\"Stop-AzWebAppContinuousWebJob\",\"ListItemText\":\"Stop-AzWebAppContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzWebAppContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Stop-AzWebAppSlot\",\"ListItemText\":\"Stop-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Stop-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Stop-AzWebAppSlotContinuousWebJob\",\"ListItemText\":\"Stop-AzWebAppSlotContinuousWebJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-AzWebAppSlotContinuousWebJob \\r\\n\"},{\"CompletionText\":\"Stop-ComputeProcess\",\"ListItemText\":\"Stop-ComputeProcess\",\"ResultType\":2,\"ToolTip\":\"Stop-ComputeProcess\\r\\n\"},{\"CompletionText\":\"Stop-Computer\",\"ListItemText\":\"Stop-Computer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Computer [[-ComputerName] ] [[-Credential] ] [-WsmanAuthentication ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-CopyAzureStorageBlob\",\"ListItemText\":\"Stop-CopyAzureStorageBlob\",\"ResultType\":2,\"ToolTip\":\"Stop-CopyAzureStorageBlob\"},{\"CompletionText\":\"Stop-DscConfiguration\",\"ListItemText\":\"Stop-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Stop-Dtc\",\"ListItemText\":\"Stop-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Dtc \\r\\n\"},{\"CompletionText\":\"Stop-DtcDiagnosticResourceManager\",\"ListItemText\":\"Stop-DtcDiagnosticResourceManager\",\"ResultType\":2,\"ToolTip\":\"Stop-DtcDiagnosticResourceManager\\r\\n\"},{\"CompletionText\":\"Stop-DtcTransactionsTraceSession\",\"ListItemText\":\"Stop-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Stop-EtwTraceSession\",\"ListItemText\":\"Stop-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Stop-Job\",\"ListItemText\":\"Stop-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Job [-Id] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-Job] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-Name] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-InstanceId] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-State] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Job [-Filter] [-PassThru] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-NetEventSession\",\"ListItemText\":\"Stop-NetEventSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-NetEventSession \\r\\n\"},{\"CompletionText\":\"Stop-PcsvDevice\",\"ListItemText\":\"Stop-PcsvDevice\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-PcsvDevice \\r\\n\"},{\"CompletionText\":\"Stop-Process\",\"ListItemText\":\"Stop-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Process [-Id] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Process -Name [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Process [-InputObject] [-PassThru] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-ScheduledTask\",\"ListItemText\":\"Stop-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Stop-Service\",\"ListItemText\":\"Stop-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Service [-InputObject] [-Force] [-NoWait] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Service [-Name] [-Force] [-NoWait] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nStop-Service -DisplayName [-Force] [-NoWait] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Stop-StorageDiagnosticLog\",\"ListItemText\":\"Stop-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-StorageDiagnosticLog \\r\\n\"},{\"CompletionText\":\"Stop-StorageJob\",\"ListItemText\":\"Stop-StorageJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-StorageJob \\r\\n\"},{\"CompletionText\":\"Stop-Trace\",\"ListItemText\":\"Stop-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Trace \\r\\n\"},{\"CompletionText\":\"Stop-Transcript\",\"ListItemText\":\"Stop-Transcript\",\"ResultType\":2,\"ToolTip\":\"Stop-Transcript\\r\\n\"},{\"CompletionText\":\"Stop-VM\",\"ListItemText\":\"Stop-VM\",\"ResultType\":2,\"ToolTip\":\"Stop-VM\\r\\n\"},{\"CompletionText\":\"Stop-VMFailover\",\"ListItemText\":\"Stop-VMFailover\",\"ResultType\":2,\"ToolTip\":\"Stop-VMFailover\\r\\n\"},{\"CompletionText\":\"Stop-VMInitialReplication\",\"ListItemText\":\"Stop-VMInitialReplication\",\"ResultType\":2,\"ToolTip\":\"Stop-VMInitialReplication\\r\\n\"},{\"CompletionText\":\"Stop-VMReplication\",\"ListItemText\":\"Stop-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Stop-VMReplication\\r\\n\"},{\"CompletionText\":\"Stop-VMTrace\",\"ListItemText\":\"Stop-VMTrace\",\"ResultType\":2,\"ToolTip\":\"Stop-VMTrace\\r\\n\"},{\"CompletionText\":\"stordiag.exe\",\"ListItemText\":\"stordiag.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\stordiag.exe\"},{\"CompletionText\":\"stz\",\"ListItemText\":\"stz\",\"ResultType\":2,\"ToolTip\":\"Set-TimeZone\"},{\"CompletionText\":\"Submit-AdlJob\",\"ListItemText\":\"Submit-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Submit-AdlJob\"},{\"CompletionText\":\"Submit-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Submit-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Submit-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Submit-AzHDInsightScriptAction\",\"ListItemText\":\"Submit-AzHDInsightScriptAction\",\"ResultType\":2,\"ToolTip\":\"Submit-AzHDInsightScriptAction\\r\\n\"},{\"CompletionText\":\"Submit-AzSynapseSparkJob\",\"ListItemText\":\"Submit-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Submit-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"subst.exe\",\"ListItemText\":\"subst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\subst.exe\"},{\"CompletionText\":\"Suspend-AzAnalysisServicesServer\",\"ListItemText\":\"Suspend-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Suspend-AzAs\",\"ListItemText\":\"Suspend-AzAs\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzAs\"},{\"CompletionText\":\"Suspend-AzAutomationJob\",\"ListItemText\":\"Suspend-AzAutomationJob\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzAutomationJob\\r\\n\"},{\"CompletionText\":\"Suspend-AzDataFactoryPipeline\",\"ListItemText\":\"Suspend-AzDataFactoryPipeline\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzDataFactoryPipeline\\r\\n\"},{\"CompletionText\":\"Suspend-AzDataProtectionBackupInstanceBackup\",\"ListItemText\":\"Suspend-AzDataProtectionBackupInstanceBackup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-AzDataProtectionBackupInstanceBackup \\r\\n\"},{\"CompletionText\":\"Suspend-AzMigrateServerReplication\",\"ListItemText\":\"Suspend-AzMigrateServerReplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-AzMigrateServerReplication \\r\\n\"},{\"CompletionText\":\"Suspend-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Suspend-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Suspend-AzSqlDatabase\",\"ListItemText\":\"Suspend-AzSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzSqlDatabase\\r\\n\"},{\"CompletionText\":\"Suspend-AzSynapseSqlPool\",\"ListItemText\":\"Suspend-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Suspend-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Suspend-BitLocker\",\"ListItemText\":\"Suspend-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-BitLocker \\r\\n\"},{\"CompletionText\":\"Suspend-BitsTransfer\",\"ListItemText\":\"Suspend-BitsTransfer\",\"ResultType\":2,\"ToolTip\":\"Suspend-BitsTransfer\\r\\n\"},{\"CompletionText\":\"Suspend-PrintJob\",\"ListItemText\":\"Suspend-PrintJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-PrintJob \\r\\n\"},{\"CompletionText\":\"Suspend-Service\",\"ListItemText\":\"Suspend-Service\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-Service [-InputObject] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSuspend-Service [-Name] [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nSuspend-Service -DisplayName [-PassThru] [-Include ] [-Exclude ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Suspend-StorageBusDisk\",\"ListItemText\":\"Suspend-StorageBusDisk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSuspend-StorageBusDisk \\r\\n\"},{\"CompletionText\":\"Suspend-VM\",\"ListItemText\":\"Suspend-VM\",\"ResultType\":2,\"ToolTip\":\"Suspend-VM\\r\\n\"},{\"CompletionText\":\"Suspend-VMReplication\",\"ListItemText\":\"Suspend-VMReplication\",\"ResultType\":2,\"ToolTip\":\"Suspend-VMReplication\\r\\n\"},{\"CompletionText\":\"sv\",\"ListItemText\":\"sv\",\"ResultType\":2,\"ToolTip\":\"Set-Variable\"},{\"CompletionText\":\"svchost.exe\",\"ListItemText\":\"svchost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\svchost.exe\"},{\"CompletionText\":\"Swap-AzWebAppSlot\",\"ListItemText\":\"Swap-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Swap-AzWebAppSlot\"},{\"CompletionText\":\"Switch-AzCloudService\",\"ListItemText\":\"Switch-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSwitch-AzCloudService \\r\\n\"},{\"CompletionText\":\"Switch-AzSqlDatabaseFailoverGroup\",\"ListItemText\":\"Switch-AzSqlDatabaseFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Switch-AzSqlDatabaseFailoverGroup\\r\\n\"},{\"CompletionText\":\"Switch-AzSqlDatabaseInstanceFailoverGroup\",\"ListItemText\":\"Switch-AzSqlDatabaseInstanceFailoverGroup\",\"ResultType\":2,\"ToolTip\":\"Switch-AzSqlDatabaseInstanceFailoverGroup\\r\\n\"},{\"CompletionText\":\"Switch-AzWebAppSlot\",\"ListItemText\":\"Switch-AzWebAppSlot\",\"ResultType\":2,\"ToolTip\":\"Switch-AzWebAppSlot\\r\\n\"},{\"CompletionText\":\"Switch-Certificate\",\"ListItemText\":\"Switch-Certificate\",\"ResultType\":2,\"ToolTip\":\"Switch-Certificate\\r\\n\"},{\"CompletionText\":\"sxstrace.exe\",\"ListItemText\":\"sxstrace.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sxstrace.exe\"},{\"CompletionText\":\"Sync-AzAnalysisServicesInstance\",\"ListItemText\":\"Sync-AzAnalysisServicesInstance\",\"ResultType\":2,\"ToolTip\":\"Sync-AzAnalysisServicesInstance\\r\\n\"},{\"CompletionText\":\"Sync-AzApiManagementKeyVaultSecret\",\"ListItemText\":\"Sync-AzApiManagementKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Sync-AzApiManagementKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Sync-AzAsInstance\",\"ListItemText\":\"Sync-AzAsInstance\",\"ResultType\":2,\"ToolTip\":\"Sync-AzAsInstance\"},{\"CompletionText\":\"Sync-AzDataFactoryV2IntegrationRuntimeCredential\",\"ListItemText\":\"Sync-AzDataFactoryV2IntegrationRuntimeCredential\",\"ResultType\":2,\"ToolTip\":\"Sync-AzDataFactoryV2IntegrationRuntimeCredential\\r\\n\"},{\"CompletionText\":\"Sync-AzDataProtectionBackupInstance\",\"ListItemText\":\"Sync-AzDataProtectionBackupInstance\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSync-AzDataProtectionBackupInstance \\r\\n\"},{\"CompletionText\":\"Sync-AzMediaServiceStorageKey\",\"ListItemText\":\"Sync-AzMediaServiceStorageKey\",\"ResultType\":2,\"ToolTip\":\"Sync-AzMediaServiceStorageKey\\r\\n\"},{\"CompletionText\":\"Sync-AzMediaServiceStorageKeys\",\"ListItemText\":\"Sync-AzMediaServiceStorageKeys\",\"ResultType\":2,\"ToolTip\":\"Sync-AzMediaServiceStorageKeys\"},{\"CompletionText\":\"Sync-AzMLWorkspaceKey\",\"ListItemText\":\"Sync-AzMLWorkspaceKey\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSync-AzMLWorkspaceKey \\r\\n\"},{\"CompletionText\":\"Sync-AzSynapseIntegrationRuntimeCredential\",\"ListItemText\":\"Sync-AzSynapseIntegrationRuntimeCredential\",\"ResultType\":2,\"ToolTip\":\"Sync-AzSynapseIntegrationRuntimeCredential\\r\\n\"},{\"CompletionText\":\"Sync-AzureAsInstance\",\"ListItemText\":\"Sync-AzureAsInstance\",\"ResultType\":2,\"ToolTip\":\"Sync-AzureAsInstance\"},{\"CompletionText\":\"Sync-AzVirtualNetworkPeering\",\"ListItemText\":\"Sync-AzVirtualNetworkPeering\",\"ResultType\":2,\"ToolTip\":\"Sync-AzVirtualNetworkPeering\\r\\n\"},{\"CompletionText\":\"Sync-NetIPsecRule\",\"ListItemText\":\"Sync-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSync-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"SyncAppvPublishingServer.exe\",\"ListItemText\":\"SyncAppvPublishingServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SyncAppvPublishingServer.exe\"},{\"CompletionText\":\"SyncAppvPublishingServer.vbs\",\"ListItemText\":\"SyncAppvPublishingServer.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SyncAppvPublishingServer.vbs\"},{\"CompletionText\":\"SyncHost.exe\",\"ListItemText\":\"SyncHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SyncHost.exe\"},{\"CompletionText\":\"sysdm.cpl\",\"ListItemText\":\"sysdm.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\sysdm.cpl\"},{\"CompletionText\":\"SysResetErr.exe\",\"ListItemText\":\"SysResetErr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SysResetErr.exe\"},{\"CompletionText\":\"systeminfo.exe\",\"ListItemText\":\"systeminfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\systeminfo.exe\"},{\"CompletionText\":\"SystemPropertiesAdvanced.exe\",\"ListItemText\":\"SystemPropertiesAdvanced.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesAdvanced.exe\"},{\"CompletionText\":\"SystemPropertiesComputerName.exe\",\"ListItemText\":\"SystemPropertiesComputerName.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesComputerName.exe\"},{\"CompletionText\":\"SystemPropertiesDataExecutionPrevention.exe\",\"ListItemText\":\"SystemPropertiesDataExecutionPrevention.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesDataExecutionPrevention.exe\"},{\"CompletionText\":\"SystemPropertiesHardware.exe\",\"ListItemText\":\"SystemPropertiesHardware.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesHardware.exe\"},{\"CompletionText\":\"SystemPropertiesPerformance.exe\",\"ListItemText\":\"SystemPropertiesPerformance.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesPerformance.exe\"},{\"CompletionText\":\"SystemPropertiesProtection.exe\",\"ListItemText\":\"SystemPropertiesProtection.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesProtection.exe\"},{\"CompletionText\":\"SystemPropertiesRemote.exe\",\"ListItemText\":\"SystemPropertiesRemote.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemPropertiesRemote.exe\"},{\"CompletionText\":\"systemreset.exe\",\"ListItemText\":\"systemreset.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\systemreset.exe\"},{\"CompletionText\":\"SystemSettingsAdminFlows.exe\",\"ListItemText\":\"SystemSettingsAdminFlows.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemSettingsAdminFlows.exe\"},{\"CompletionText\":\"SystemSettingsBroker.exe\",\"ListItemText\":\"SystemSettingsBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemSettingsBroker.exe\"},{\"CompletionText\":\"SystemSettingsRemoveDevice.exe\",\"ListItemText\":\"SystemSettingsRemoveDevice.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemSettingsRemoveDevice.exe\"},{\"CompletionText\":\"SystemUWPLauncher.exe\",\"ListItemText\":\"SystemUWPLauncher.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\SystemUWPLauncher.exe\"},{\"CompletionText\":\"systray.exe\",\"ListItemText\":\"systray.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\systray.exe\"},{\"CompletionText\":\"T:\",\"ListItemText\":\"T:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nT: \\r\\n\"},{\"CompletionText\":\"tabcal.exe\",\"ListItemText\":\"tabcal.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tabcal.exe\"},{\"CompletionText\":\"TabExpansion\",\"ListItemText\":\"TabExpansion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTabExpansion \\r\\n\"},{\"CompletionText\":\"TabExpansion2\",\"ListItemText\":\"TabExpansion2\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTabExpansion2 [-inputScript] [[-cursorColumn] ] [[-options] ] []\\r\\n\\r\\nTabExpansion2 [-ast] [-tokens] [-positionOfCursor] [[-options] ] []\\r\\n\"},{\"CompletionText\":\"TabletPC.cpl\",\"ListItemText\":\"TabletPC.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TabletPC.cpl\"},{\"CompletionText\":\"takeown.exe\",\"ListItemText\":\"takeown.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\takeown.exe\"},{\"CompletionText\":\"TapiUnattend.exe\",\"ListItemText\":\"TapiUnattend.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TapiUnattend.exe\"},{\"CompletionText\":\"tar.exe\",\"ListItemText\":\"tar.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tar.exe\"},{\"CompletionText\":\"taskhostw.exe\",\"ListItemText\":\"taskhostw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\taskhostw.exe\"},{\"CompletionText\":\"taskkill.exe\",\"ListItemText\":\"taskkill.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\taskkill.exe\"},{\"CompletionText\":\"tasklist.exe\",\"ListItemText\":\"tasklist.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tasklist.exe\"},{\"CompletionText\":\"Taskmgr.exe\",\"ListItemText\":\"Taskmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Taskmgr.exe\"},{\"CompletionText\":\"taskschd.msc\",\"ListItemText\":\"taskschd.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\taskschd.msc\"},{\"CompletionText\":\"tcblaunch.exe\",\"ListItemText\":\"tcblaunch.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tcblaunch.exe\"},{\"CompletionText\":\"tcfg\",\"ListItemText\":\"tcfg\",\"ResultType\":2,\"ToolTip\":\"tcfg\"},{\"CompletionText\":\"tcmsetup.exe\",\"ListItemText\":\"tcmsetup.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tcmsetup.exe\"},{\"CompletionText\":\"TCPSVCS.EXE\",\"ListItemText\":\"TCPSVCS.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TCPSVCS.EXE\"},{\"CompletionText\":\"tee\",\"ListItemText\":\"tee\",\"ResultType\":2,\"ToolTip\":\"Tee-Object\"},{\"CompletionText\":\"Tee-Object\",\"ListItemText\":\"Tee-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTee-Object [-FilePath] [-InputObject ] [-Append] [-Encoding ] []\\r\\n\\r\\nTee-Object -LiteralPath [-InputObject ] [-Encoding ] []\\r\\n\\r\\nTee-Object -Variable [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"telephon.cpl\",\"ListItemText\":\"telephon.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\telephon.cpl\"},{\"CompletionText\":\"test-64bit\",\"ListItemText\":\"test-64bit\",\"ResultType\":2,\"ToolTip\":\"\\r\\ntest-64bit \\r\\n\"},{\"CompletionText\":\"Test-AdlAnalyticsAccount\",\"ListItemText\":\"Test-AdlAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Test-AdlAnalyticsAccount\"},{\"CompletionText\":\"Test-AdlCatalogItem\",\"ListItemText\":\"Test-AdlCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Test-AdlCatalogItem\"},{\"CompletionText\":\"Test-AdlStore\",\"ListItemText\":\"Test-AdlStore\",\"ResultType\":2,\"ToolTip\":\"Test-AdlStore\"},{\"CompletionText\":\"Test-AdlStoreItem\",\"ListItemText\":\"Test-AdlStoreItem\",\"ResultType\":2,\"ToolTip\":\"Test-AdlStoreItem\"},{\"CompletionText\":\"Test-AppLockerPolicy\",\"ListItemText\":\"Test-AppLockerPolicy\",\"ResultType\":2,\"ToolTip\":\"Test-AppLockerPolicy\\r\\n\"},{\"CompletionText\":\"Test-AzActionGroup\",\"ListItemText\":\"Test-AzActionGroup\",\"ResultType\":2,\"ToolTip\":\"Test-AzActionGroup\\r\\n\"},{\"CompletionText\":\"Test-AzAnalysisServicesServer\",\"ListItemText\":\"Test-AzAnalysisServicesServer\",\"ResultType\":2,\"ToolTip\":\"Test-AzAnalysisServicesServer\\r\\n\"},{\"CompletionText\":\"Test-AzAppConfigurationStoreNameAvailability\",\"ListItemText\":\"Test-AzAppConfigurationStoreNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzAppConfigurationStoreNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzAs\",\"ListItemText\":\"Test-AzAs\",\"ResultType\":2,\"ToolTip\":\"Test-AzAs\"},{\"CompletionText\":\"Test-AzBatchAutoScale\",\"ListItemText\":\"Test-AzBatchAutoScale\",\"ResultType\":2,\"ToolTip\":\"Test-AzBatchAutoScale\\r\\n\"},{\"CompletionText\":\"Test-AzCdnEndpointCustomDomain\",\"ListItemText\":\"Test-AzCdnEndpointCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzCdnEndpointCustomDomain \\r\\n\"},{\"CompletionText\":\"Test-AzCdnNameAvailability\",\"ListItemText\":\"Test-AzCdnNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzCdnNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzCdnProbe\",\"ListItemText\":\"Test-AzCdnProbe\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzCdnProbe \\r\\n\"},{\"CompletionText\":\"Test-AzConfidentialLedgerNameAvailability\",\"ListItemText\":\"Test-AzConfidentialLedgerNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzConfidentialLedgerNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzContainerRegistryNameAvailability\",\"ListItemText\":\"Test-AzContainerRegistryNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzContainerRegistryNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzContainerRegistryWebhook\",\"ListItemText\":\"Test-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeAnalyticsAccount\",\"ListItemText\":\"Test-AzDataLakeAnalyticsAccount\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeAnalyticsAccount\\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeAnalyticsCatalogItem\",\"ListItemText\":\"Test-AzDataLakeAnalyticsCatalogItem\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeAnalyticsCatalogItem\\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeStoreAccount\",\"ListItemText\":\"Test-AzDataLakeStoreAccount\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeStoreAccount\\r\\n\"},{\"CompletionText\":\"Test-AzDataLakeStoreItem\",\"ListItemText\":\"Test-AzDataLakeStoreItem\",\"ResultType\":2,\"ToolTip\":\"Test-AzDataLakeStoreItem\\r\\n\"},{\"CompletionText\":\"Test-AzDataProtectionBackupInstanceReadiness\",\"ListItemText\":\"Test-AzDataProtectionBackupInstanceReadiness\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzDataProtectionBackupInstanceReadiness \\r\\n\"},{\"CompletionText\":\"Test-AzDataProtectionBackupInstanceRestore\",\"ListItemText\":\"Test-AzDataProtectionBackupInstanceRestore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzDataProtectionBackupInstanceRestore \\r\\n\"},{\"CompletionText\":\"Test-AzDeployment\",\"ListItemText\":\"Test-AzDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzDnsAvailability\",\"ListItemText\":\"Test-AzDnsAvailability\",\"ResultType\":2,\"ToolTip\":\"Test-AzDnsAvailability\\r\\n\"},{\"CompletionText\":\"Test-AzEventHubName\",\"ListItemText\":\"Test-AzEventHubName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzEventHubName \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnEndpointCustomDomain\",\"ListItemText\":\"Test-AzFrontDoorCdnEndpointCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnEndpointCustomDomain \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnEndpointNameAvailability\",\"ListItemText\":\"Test-AzFrontDoorCdnEndpointNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnEndpointNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnProfileHostNameAvailability\",\"ListItemText\":\"Test-AzFrontDoorCdnProfileHostNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnProfileHostNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzFrontDoorCdnProfileMigration\",\"ListItemText\":\"Test-AzFrontDoorCdnProfileMigration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzFrontDoorCdnProfileMigration \\r\\n\"},{\"CompletionText\":\"Test-AzHealthcareServiceNameAvailability\",\"ListItemText\":\"Test-AzHealthcareServiceNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzHealthcareServiceNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzIotHubRoute\",\"ListItemText\":\"Test-AzIotHubRoute\",\"ResultType\":2,\"ToolTip\":\"Test-AzIotHubRoute\\r\\n\"},{\"CompletionText\":\"Test-AzKustoAttachedDatabaseConfigurationNameAvailability\",\"ListItemText\":\"Test-AzKustoAttachedDatabaseConfigurationNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoAttachedDatabaseConfigurationNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoClusterNameAvailability\",\"ListItemText\":\"Test-AzKustoClusterNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoClusterNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoClusterPrincipalAssignmentNameAvailability\",\"ListItemText\":\"Test-AzKustoClusterPrincipalAssignmentNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoClusterPrincipalAssignmentNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoDatabaseNameAvailability\",\"ListItemText\":\"Test-AzKustoDatabaseNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoDatabaseNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoDatabasePrincipalAssignmentNameAvailability\",\"ListItemText\":\"Test-AzKustoDatabasePrincipalAssignmentNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoDatabasePrincipalAssignmentNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoDataConnectionNameAvailability\",\"ListItemText\":\"Test-AzKustoDataConnectionNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoDataConnectionNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoManagedPrivateEndpointNameAvailability\",\"ListItemText\":\"Test-AzKustoManagedPrivateEndpointNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoManagedPrivateEndpointNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzKustoScriptNameAvailability\",\"ListItemText\":\"Test-AzKustoScriptNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzKustoScriptNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-AzLogicApp\",\"ListItemText\":\"Test-AzLogicApp\",\"ResultType\":2,\"ToolTip\":\"Test-AzLogicApp\\r\\n\"},{\"CompletionText\":\"Test-AzManagementGroupDeployment\",\"ListItemText\":\"Test-AzManagementGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzManagementGroupDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzMySqlFlexibleServerConnect\",\"ListItemText\":\"Test-AzMySqlFlexibleServerConnect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzMySqlFlexibleServerConnect \\r\\n\"},{\"CompletionText\":\"Test-AzNetworkWatcherConnectivity\",\"ListItemText\":\"Test-AzNetworkWatcherConnectivity\",\"ResultType\":2,\"ToolTip\":\"Test-AzNetworkWatcherConnectivity\\r\\n\"},{\"CompletionText\":\"Test-AzNetworkWatcherIPFlow\",\"ListItemText\":\"Test-AzNetworkWatcherIPFlow\",\"ResultType\":2,\"ToolTip\":\"Test-AzNetworkWatcherIPFlow\\r\\n\"},{\"CompletionText\":\"Test-AzPostgreSqlFlexibleServerConnect\",\"ListItemText\":\"Test-AzPostgreSqlFlexibleServerConnect\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzPostgreSqlFlexibleServerConnect \\r\\n\"},{\"CompletionText\":\"Test-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Test-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Test-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Test-AzPrivateIPAddressAvailability\",\"ListItemText\":\"Test-AzPrivateIPAddressAvailability\",\"ResultType\":2,\"ToolTip\":\"Test-AzPrivateIPAddressAvailability\\r\\n\"},{\"CompletionText\":\"Test-AzPrivateLinkServiceVisibility\",\"ListItemText\":\"Test-AzPrivateLinkServiceVisibility\",\"ResultType\":2,\"ToolTip\":\"Test-AzPrivateLinkServiceVisibility\\r\\n\"},{\"CompletionText\":\"Test-AzRecoveryServicesDSMove\",\"ListItemText\":\"Test-AzRecoveryServicesDSMove\",\"ResultType\":2,\"ToolTip\":\"Test-AzRecoveryServicesDSMove\\r\\n\"},{\"CompletionText\":\"Test-AzRelayName\",\"ListItemText\":\"Test-AzRelayName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzRelayName \\r\\n\"},{\"CompletionText\":\"Test-AzResourceGroupDeployment\",\"ListItemText\":\"Test-AzResourceGroupDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzResourceGroupDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzSentinelDataConnectorCheckRequirement\",\"ListItemText\":\"Test-AzSentinelDataConnectorCheckRequirement\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzSentinelDataConnectorCheckRequirement \\r\\n\"},{\"CompletionText\":\"Test-AzServiceBusName\",\"ListItemText\":\"Test-AzServiceBusName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceBusName \\r\\n\"},{\"CompletionText\":\"Test-AzServiceBusNameAvailability\",\"ListItemText\":\"Test-AzServiceBusNameAvailability\",\"ResultType\":2,\"ToolTip\":\"Test-AzServiceBusNameAvailability\\r\\n\"},{\"CompletionText\":\"Test-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Test-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Test-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Test-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Test-AzServiceLinkerForWebApp\",\"ListItemText\":\"Test-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Test-AzSignalR\",\"ListItemText\":\"Test-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Test-AzSignalR\"},{\"CompletionText\":\"Test-AzSignalRName\",\"ListItemText\":\"Test-AzSignalRName\",\"ResultType\":2,\"ToolTip\":\"Test-AzSignalRName\\r\\n\"},{\"CompletionText\":\"Test-AzStaticWebAppCustomDomain\",\"ListItemText\":\"Test-AzStaticWebAppCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStaticWebAppCustomDomain \\r\\n\"},{\"CompletionText\":\"Test-AzStreamAnalyticsFunction\",\"ListItemText\":\"Test-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Test-AzStreamAnalyticsInput\",\"ListItemText\":\"Test-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Test-AzStreamAnalyticsOutput\",\"ListItemText\":\"Test-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Test-AzSubscriptionDeployment\",\"ListItemText\":\"Test-AzSubscriptionDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzSubscriptionDeployment\"},{\"CompletionText\":\"Test-AzSynapseSparkPool\",\"ListItemText\":\"Test-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Test-AzSynapseSqlDatabase\",\"ListItemText\":\"Test-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Test-AzSynapseSqlPool\",\"ListItemText\":\"Test-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Test-AzSynapseWorkspace\",\"ListItemText\":\"Test-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Test-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Test-AzTenantDeployment\",\"ListItemText\":\"Test-AzTenantDeployment\",\"ResultType\":2,\"ToolTip\":\"Test-AzTenantDeployment\\r\\n\"},{\"CompletionText\":\"Test-AzVMAEMExtension\",\"ListItemText\":\"Test-AzVMAEMExtension\",\"ResultType\":2,\"ToolTip\":\"Test-AzVMAEMExtension\\r\\n\"},{\"CompletionText\":\"Test-AzWebPubSubNameAvailability\",\"ListItemText\":\"Test-AzWebPubSubNameAvailability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-AzWebPubSubNameAvailability \\r\\n\"},{\"CompletionText\":\"Test-Certificate\",\"ListItemText\":\"Test-Certificate\",\"ResultType\":2,\"ToolTip\":\"Test-Certificate\\r\\n\"},{\"CompletionText\":\"Test-Connection\",\"ListItemText\":\"Test-Connection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Connection [-TargetName] [-Ping] [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-MaxHops ] [-Count ] [-Delay ] [-BufferSize ] [-DontFragment] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -Repeat [-Ping] [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-MaxHops ] [-Delay ] [-BufferSize ] [-DontFragment] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -Traceroute [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-MaxHops ] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -MtuSize [-IPv4] [-IPv6] [-ResolveDestination] [-Quiet] [-TimeoutSeconds ] []\\r\\n\\r\\nTest-Connection [-TargetName] -TcpPort [-IPv4] [-IPv6] [-ResolveDestination] [-Source ] [-Count ] [-Delay ] [-Repeat] [-Quiet] [-TimeoutSeconds ] [-Detailed] []\\r\\n\"},{\"CompletionText\":\"Test-DscConfiguration\",\"ListItemText\":\"Test-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Test-DscConfiguration\\r\\n\"},{\"CompletionText\":\"Test-Dtc\",\"ListItemText\":\"Test-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Dtc \\r\\n\"},{\"CompletionText\":\"Test-FileCatalog\",\"ListItemText\":\"Test-FileCatalog\",\"ResultType\":2,\"ToolTip\":\"Test-FileCatalog\\r\\n\"},{\"CompletionText\":\"Test-HgsClientConfiguration\",\"ListItemText\":\"Test-HgsClientConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-HgsClientConfiguration \\r\\n\"},{\"CompletionText\":\"Test-HgsTraceTarget\",\"ListItemText\":\"Test-HgsTraceTarget\",\"ResultType\":2,\"ToolTip\":\"Test-HgsTraceTarget\\r\\n\"},{\"CompletionText\":\"Test-Json\",\"ListItemText\":\"Test-Json\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Json [-Json] []\\r\\n\\r\\nTest-Json [-Json] [-Schema] []\\r\\n\\r\\nTest-Json [-Json] [-SchemaFile] []\\r\\n\\r\\nTest-Json [-Path] []\\r\\n\\r\\nTest-Json [-Path] [-Schema] []\\r\\n\\r\\nTest-Json [-Path] [-SchemaFile] []\\r\\n\\r\\nTest-Json [-LiteralPath] []\\r\\n\\r\\nTest-Json [-LiteralPath] [-Schema] []\\r\\n\\r\\nTest-Json [-LiteralPath] [-SchemaFile] []\\r\\n\"},{\"CompletionText\":\"Test-KdsRootKey\",\"ListItemText\":\"Test-KdsRootKey\",\"ResultType\":2,\"ToolTip\":\"Test-KdsRootKey\\r\\n\"},{\"CompletionText\":\"Test-ModuleManifest\",\"ListItemText\":\"Test-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-ModuleManifest [-Path] []\\r\\n\"},{\"CompletionText\":\"Test-NetConnection\",\"ListItemText\":\"Test-NetConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-NetConnection \\r\\n\"},{\"CompletionText\":\"Test-Path\",\"ListItemText\":\"Test-Path\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-Path [-Path] [-Filter ] [-Include ] [-Exclude ] [-PathType ] [-IsValid] [-Credential ] [-OlderThan ] [-NewerThan ] []\\r\\n\\r\\nTest-Path -LiteralPath [-Filter ] [-Include ] [-Exclude ] [-PathType ] [-IsValid] [-Credential ] [-OlderThan ] [-NewerThan ] []\\r\\n\"},{\"CompletionText\":\"Test-PSScriptFileInfo\",\"ListItemText\":\"Test-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"Test-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"Test-PSSessionConfigurationFile\",\"ListItemText\":\"Test-PSSessionConfigurationFile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-PSSessionConfigurationFile [-Path] []\\r\\n\"},{\"CompletionText\":\"Test-ScriptFileInfo\",\"ListItemText\":\"Test-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"Test-VHD\",\"ListItemText\":\"Test-VHD\",\"ResultType\":2,\"ToolTip\":\"Test-VHD\\r\\n\"},{\"CompletionText\":\"Test-VMNetworkAdapter\",\"ListItemText\":\"Test-VMNetworkAdapter\",\"ResultType\":2,\"ToolTip\":\"Test-VMNetworkAdapter\\r\\n\"},{\"CompletionText\":\"Test-VMReplicationConnection\",\"ListItemText\":\"Test-VMReplicationConnection\",\"ResultType\":2,\"ToolTip\":\"Test-VMReplicationConnection\\r\\n\"},{\"CompletionText\":\"Test-WSMan\",\"ListItemText\":\"Test-WSMan\",\"ResultType\":2,\"ToolTip\":\"Test-WSMan\\r\\n\"},{\"CompletionText\":\"textual.exe\",\"ListItemText\":\"textual.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\textual.exe\"},{\"CompletionText\":\"tgit\",\"ListItemText\":\"tgit\",\"ResultType\":2,\"ToolTip\":\"\\r\\ntgit \\r\\n\"},{\"CompletionText\":\"ThumbnailExtractionHost.exe\",\"ListItemText\":\"ThumbnailExtractionHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ThumbnailExtractionHost.exe\"},{\"CompletionText\":\"tid\",\"ListItemText\":\"tid\",\"ResultType\":2,\"ToolTip\":\"tid\"},{\"CompletionText\":\"TieringEngineService.exe\",\"ListItemText\":\"TieringEngineService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TieringEngineService.exe\"},{\"CompletionText\":\"tig.exe\",\"ListItemText\":\"tig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\tig.exe\"},{\"CompletionText\":\"timedate.cpl\",\"ListItemText\":\"timedate.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\timedate.cpl\"},{\"CompletionText\":\"timeout.exe\",\"ListItemText\":\"timeout.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\timeout.exe\"},{\"CompletionText\":\"tnameserv.exe\",\"ListItemText\":\"tnameserv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\tnameserv.exe\"},{\"CompletionText\":\"TNC\",\"ListItemText\":\"TNC\",\"ResultType\":2,\"ToolTip\":\"TNC\"},{\"CompletionText\":\"TokenBrokerCookies.exe\",\"ListItemText\":\"TokenBrokerCookies.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TokenBrokerCookies.exe\"},{\"CompletionText\":\"tpm.msc\",\"ListItemText\":\"tpm.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tpm.msc\"},{\"CompletionText\":\"TpmInit.exe\",\"ListItemText\":\"TpmInit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TpmInit.exe\"},{\"CompletionText\":\"TpmTool.exe\",\"ListItemText\":\"TpmTool.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TpmTool.exe\"},{\"CompletionText\":\"tpmvscmgr.exe\",\"ListItemText\":\"tpmvscmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tpmvscmgr.exe\"},{\"CompletionText\":\"tpmvscmgrsvr.exe\",\"ListItemText\":\"tpmvscmgrsvr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tpmvscmgrsvr.exe\"},{\"CompletionText\":\"Trace-Command\",\"ListItemText\":\"Trace-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTrace-Command [-Name] [-Expression] [[-Option] ] [-InputObject ] [-ListenerOption ] [-FilePath ] [-Force] [-Debugger] [-PSHost] []\\r\\n\\r\\nTrace-Command [-Name] [-Command] [[-Option] ] [-InputObject ] [-ArgumentList ] [-ListenerOption ] [-FilePath ] [-Force] [-Debugger] [-PSHost] []\\r\\n\"},{\"CompletionText\":\"tracerpt.exe\",\"ListItemText\":\"tracerpt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tracerpt.exe\"},{\"CompletionText\":\"TRACERT.EXE\",\"ListItemText\":\"TRACERT.EXE\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TRACERT.EXE\"},{\"CompletionText\":\"Tracker.exe\",\"ListItemText\":\"Tracker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2017\\\\BuildTools\\\\MSBuild\\\\15.0\\\\Bin\\\\Tracker.exe\"},{\"CompletionText\":\"tree.com\",\"ListItemText\":\"tree.com\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tree.com\"},{\"CompletionText\":\"ts-node-cwd.cmd\",\"ListItemText\":\"ts-node-cwd.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-cwd.cmd\"},{\"CompletionText\":\"ts-node-cwd.ps1\",\"ListItemText\":\"ts-node-cwd.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-cwd.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node-esm.cmd\",\"ListItemText\":\"ts-node-esm.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-esm.cmd\"},{\"CompletionText\":\"ts-node-esm.ps1\",\"ListItemText\":\"ts-node-esm.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-esm.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node-script.cmd\",\"ListItemText\":\"ts-node-script.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-script.cmd\"},{\"CompletionText\":\"ts-node-script.ps1\",\"ListItemText\":\"ts-node-script.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-script.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node-transpile-only.cmd\",\"ListItemText\":\"ts-node-transpile-only.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node-transpile-only.cmd\"},{\"CompletionText\":\"ts-node-transpile-only.ps1\",\"ListItemText\":\"ts-node-transpile-only.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node-transpile-only.ps1 \\r\\n\"},{\"CompletionText\":\"ts-node.cmd\",\"ListItemText\":\"ts-node.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-node.cmd\"},{\"CompletionText\":\"ts-node.ps1\",\"ListItemText\":\"ts-node.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-node.ps1 \\r\\n\"},{\"CompletionText\":\"ts-script.cmd\",\"ListItemText\":\"ts-script.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\ts-script.cmd\"},{\"CompletionText\":\"ts-script.ps1\",\"ListItemText\":\"ts-script.ps1\",\"ResultType\":2,\"ToolTip\":\"ts-script.ps1 \\r\\n\"},{\"CompletionText\":\"tscon.exe\",\"ListItemText\":\"tscon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tscon.exe\"},{\"CompletionText\":\"tsdiscon.exe\",\"ListItemText\":\"tsdiscon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tsdiscon.exe\"},{\"CompletionText\":\"tskill.exe\",\"ListItemText\":\"tskill.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tskill.exe\"},{\"CompletionText\":\"TSTheme.exe\",\"ListItemText\":\"TSTheme.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TSTheme.exe\"},{\"CompletionText\":\"TSWbPrxy.exe\",\"ListItemText\":\"TSWbPrxy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\TSWbPrxy.exe\"},{\"CompletionText\":\"ttdinject.exe\",\"ListItemText\":\"ttdinject.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ttdinject.exe\"},{\"CompletionText\":\"tttracer.exe\",\"ListItemText\":\"tttracer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tttracer.exe\"},{\"CompletionText\":\"type\",\"ListItemText\":\"type\",\"ResultType\":2,\"ToolTip\":\"Get-Content\"},{\"CompletionText\":\"typeperf.exe\",\"ListItemText\":\"typeperf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\typeperf.exe\"},{\"CompletionText\":\"tzsync.exe\",\"ListItemText\":\"tzsync.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tzsync.exe\"},{\"CompletionText\":\"tzutil.exe\",\"ListItemText\":\"tzutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\tzutil.exe\"},{\"CompletionText\":\"U:\",\"ListItemText\":\"U:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nU: \\r\\n\"},{\"CompletionText\":\"ubuntu.exe\",\"ListItemText\":\"ubuntu.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\ubuntu.exe\"},{\"CompletionText\":\"UCPDMgr.exe\",\"ListItemText\":\"UCPDMgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UCPDMgr.exe\"},{\"CompletionText\":\"ucsvc.exe\",\"ListItemText\":\"ucsvc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\ucsvc.exe\"},{\"CompletionText\":\"udres\",\"ListItemText\":\"udres\",\"ResultType\":2,\"ToolTip\":\"udres\"},{\"CompletionText\":\"udsmbmc\",\"ListItemText\":\"udsmbmc\",\"ResultType\":2,\"ToolTip\":\"udsmbmc\"},{\"CompletionText\":\"UevAgentPolicyGenerator.exe\",\"ListItemText\":\"UevAgentPolicyGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevAgentPolicyGenerator.exe\"},{\"CompletionText\":\"UevAppMonitor.exe\",\"ListItemText\":\"UevAppMonitor.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevAppMonitor.exe\"},{\"CompletionText\":\"UevTemplateBaselineGenerator.exe\",\"ListItemText\":\"UevTemplateBaselineGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevTemplateBaselineGenerator.exe\"},{\"CompletionText\":\"UevTemplateConfigItemGenerator.exe\",\"ListItemText\":\"UevTemplateConfigItemGenerator.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UevTemplateConfigItemGenerator.exe\"},{\"CompletionText\":\"UIMgrBroker.exe\",\"ListItemText\":\"UIMgrBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UIMgrBroker.exe\"},{\"CompletionText\":\"ulsmba\",\"ListItemText\":\"ulsmba\",\"ResultType\":2,\"ToolTip\":\"ulsmba\"},{\"CompletionText\":\"ulsmbclas\",\"ListItemText\":\"ulsmbclas\",\"ResultType\":2,\"ToolTip\":\"ulsmbclas\"},{\"CompletionText\":\"Unblock-File\",\"ListItemText\":\"Unblock-File\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-File [-Path] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUnblock-File -LiteralPath [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Unblock-FileShareAccess\",\"ListItemText\":\"Unblock-FileShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-FileShareAccess \\r\\n\"},{\"CompletionText\":\"Unblock-SmbClientAccessToServer\",\"ListItemText\":\"Unblock-SmbClientAccessToServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-SmbClientAccessToServer \\r\\n\"},{\"CompletionText\":\"Unblock-SmbShareAccess\",\"ListItemText\":\"Unblock-SmbShareAccess\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnblock-SmbShareAccess \\r\\n\"},{\"CompletionText\":\"Unblock-Tpm\",\"ListItemText\":\"Unblock-Tpm\",\"ResultType\":2,\"ToolTip\":\"Unblock-Tpm\\r\\n\"},{\"CompletionText\":\"Undo-AzCognitiveServicesAccountRemoval\",\"ListItemText\":\"Undo-AzCognitiveServicesAccountRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzCognitiveServicesAccountRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultCertificateRemoval\",\"ListItemText\":\"Undo-AzKeyVaultCertificateRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultCertificateRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultKeyRemoval\",\"ListItemText\":\"Undo-AzKeyVaultKeyRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultKeyRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultManagedHsmRemoval\",\"ListItemText\":\"Undo-AzKeyVaultManagedHsmRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultManagedHsmRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultManagedStorageAccountRemoval\",\"ListItemText\":\"Undo-AzKeyVaultManagedStorageAccountRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultManagedStorageAccountRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultManagedStorageSasDefinitionRemoval\",\"ListItemText\":\"Undo-AzKeyVaultManagedStorageSasDefinitionRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultManagedStorageSasDefinitionRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultRemoval\",\"ListItemText\":\"Undo-AzKeyVaultRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzKeyVaultSecretRemoval\",\"ListItemText\":\"Undo-AzKeyVaultSecretRemoval\",\"ResultType\":2,\"ToolTip\":\"Undo-AzKeyVaultSecretRemoval\\r\\n\"},{\"CompletionText\":\"Undo-AzRecoveryServicesBackupItemDeletion\",\"ListItemText\":\"Undo-AzRecoveryServicesBackupItemDeletion\",\"ResultType\":2,\"ToolTip\":\"Undo-AzRecoveryServicesBackupItemDeletion\\r\\n\"},{\"CompletionText\":\"Undo-DtcDiagnosticTransaction\",\"ListItemText\":\"Undo-DtcDiagnosticTransaction\",\"ResultType\":2,\"ToolTip\":\"Undo-DtcDiagnosticTransaction\\r\\n\"},{\"CompletionText\":\"unins000.exe\",\"ListItemText\":\"unins000.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git LFS\\\\unins000.exe\"},{\"CompletionText\":\"Uninstall-AzureRm\",\"ListItemText\":\"Uninstall-AzureRm\",\"ResultType\":2,\"ToolTip\":\"Uninstall-AzureRm\\r\\n\"},{\"CompletionText\":\"Uninstall-Dtc\",\"ListItemText\":\"Uninstall-Dtc\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Dtc \\r\\n\"},{\"CompletionText\":\"Uninstall-Language\",\"ListItemText\":\"Uninstall-Language\",\"ResultType\":2,\"ToolTip\":\"Uninstall-Language\\r\\n\"},{\"CompletionText\":\"Uninstall-Module\",\"ListItemText\":\"Uninstall-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Module \\r\\n\"},{\"CompletionText\":\"Uninstall-Package\",\"ListItemText\":\"Uninstall-Package\",\"ResultType\":2,\"ToolTip\":\"Uninstall-Package\\r\\n\"},{\"CompletionText\":\"Uninstall-ProvisioningPackage\",\"ListItemText\":\"Uninstall-ProvisioningPackage\",\"ResultType\":2,\"ToolTip\":\"Uninstall-ProvisioningPackage\\r\\n\"},{\"CompletionText\":\"Uninstall-PSResource\",\"ListItemText\":\"Uninstall-PSResource\",\"ResultType\":2,\"ToolTip\":\"Uninstall-PSResource\\r\\n\"},{\"CompletionText\":\"Uninstall-Script\",\"ListItemText\":\"Uninstall-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Script \\r\\n\"},{\"CompletionText\":\"Uninstall-TrustedProvisioningCertificate\",\"ListItemText\":\"Uninstall-TrustedProvisioningCertificate\",\"ResultType\":2,\"ToolTip\":\"Uninstall-TrustedProvisioningCertificate\\r\\n\"},{\"CompletionText\":\"Unlock-BitLocker\",\"ListItemText\":\"Unlock-BitLocker\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnlock-BitLocker \\r\\n\"},{\"CompletionText\":\"unlodctr.exe\",\"ListItemText\":\"unlodctr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\unlodctr.exe\"},{\"CompletionText\":\"unpack200.exe\",\"ListItemText\":\"unpack200.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\unpack200.exe\"},{\"CompletionText\":\"Unprotect-CmsMessage\",\"ListItemText\":\"Unprotect-CmsMessage\",\"ResultType\":2,\"ToolTip\":\"Unprotect-CmsMessage\\r\\n\"},{\"CompletionText\":\"Unregister-AppBackgroundTask\",\"ListItemText\":\"Unregister-AppBackgroundTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AppBackgroundTask \\r\\n\"},{\"CompletionText\":\"Unregister-AzAutomationDscNode\",\"ListItemText\":\"Unregister-AzAutomationDscNode\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzAutomationDscNode\\r\\n\"},{\"CompletionText\":\"Unregister-AzAutomationScheduledRunbook\",\"ListItemText\":\"Unregister-AzAutomationScheduledRunbook\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzAutomationScheduledRunbook\\r\\n\"},{\"CompletionText\":\"Unregister-AzProviderFeature\",\"ListItemText\":\"Unregister-AzProviderFeature\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzProviderFeature\\r\\n\"},{\"CompletionText\":\"Unregister-AzProviderPreviewFeature\",\"ListItemText\":\"Unregister-AzProviderPreviewFeature\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzProviderPreviewFeature\\r\\n\"},{\"CompletionText\":\"Unregister-AzRecoveryServicesBackupContainer\",\"ListItemText\":\"Unregister-AzRecoveryServicesBackupContainer\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzRecoveryServicesBackupContainer\\r\\n\"},{\"CompletionText\":\"Unregister-AzRecoveryServicesBackupManagementServer\",\"ListItemText\":\"Unregister-AzRecoveryServicesBackupManagementServer\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzRecoveryServicesBackupManagementServer\\r\\n\"},{\"CompletionText\":\"Unregister-AzResourceProvider\",\"ListItemText\":\"Unregister-AzResourceProvider\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzResourceProvider\\r\\n\"},{\"CompletionText\":\"Unregister-AzStackHCI\",\"ListItemText\":\"Unregister-AzStackHCI\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStackHCI \\r\\n\"},{\"CompletionText\":\"Unregister-AzStaticWebAppBuildUserProvidedFunctionApp\",\"ListItemText\":\"Unregister-AzStaticWebAppBuildUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStaticWebAppBuildUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Unregister-AzStaticWebAppUserProvidedFunctionApp\",\"ListItemText\":\"Unregister-AzStaticWebAppUserProvidedFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStaticWebAppUserProvidedFunctionApp \\r\\n\"},{\"CompletionText\":\"Unregister-AzStorageMoverAgent\",\"ListItemText\":\"Unregister-AzStorageMoverAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzStorageMoverAgent \\r\\n\"},{\"CompletionText\":\"Unregister-AzStorageSyncServer\",\"ListItemText\":\"Unregister-AzStorageSyncServer\",\"ResultType\":2,\"ToolTip\":\"Unregister-AzStorageSyncServer\\r\\n\"},{\"CompletionText\":\"Unregister-AzWvdApplicationGroup\",\"ListItemText\":\"Unregister-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Unregister-ClusteredScheduledTask\",\"ListItemText\":\"Unregister-ClusteredScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-ClusteredScheduledTask \\r\\n\"},{\"CompletionText\":\"Unregister-Event\",\"ListItemText\":\"Unregister-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-Event [-SourceIdentifier] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUnregister-Event [-SubscriptionId] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Unregister-IscsiSession\",\"ListItemText\":\"Unregister-IscsiSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-IscsiSession \\r\\n\"},{\"CompletionText\":\"Unregister-PackageSource\",\"ListItemText\":\"Unregister-PackageSource\",\"ResultType\":2,\"ToolTip\":\"Unregister-PackageSource\\r\\n\"},{\"CompletionText\":\"Unregister-PSRepository\",\"ListItemText\":\"Unregister-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-PSRepository \\r\\n\"},{\"CompletionText\":\"Unregister-PSResourceRepository\",\"ListItemText\":\"Unregister-PSResourceRepository\",\"ResultType\":2,\"ToolTip\":\"Unregister-PSResourceRepository\\r\\n\"},{\"CompletionText\":\"Unregister-PSSessionConfiguration\",\"ListItemText\":\"Unregister-PSSessionConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-PSSessionConfiguration [-Name] [-Force] [-NoServiceRestart] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Unregister-ScheduledJob\",\"ListItemText\":\"Unregister-ScheduledJob\",\"ResultType\":2,\"ToolTip\":\"Unregister-ScheduledJob\\r\\n\"},{\"CompletionText\":\"Unregister-ScheduledTask\",\"ListItemText\":\"Unregister-ScheduledTask\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-ScheduledTask \\r\\n\"},{\"CompletionText\":\"Unregister-StorageSubsystem\",\"ListItemText\":\"Unregister-StorageSubsystem\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-StorageSubsystem \\r\\n\"},{\"CompletionText\":\"Unregister-WindowsDeveloperLicense\",\"ListItemText\":\"Unregister-WindowsDeveloperLicense\",\"ResultType\":2,\"ToolTip\":\"Unregister-WindowsDeveloperLicense\\r\\n\"},{\"CompletionText\":\"unregmp2.exe\",\"ListItemText\":\"unregmp2.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\unregmp2.exe\"},{\"CompletionText\":\"unsecapp.exe\",\"ListItemText\":\"unsecapp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\unsecapp.exe\"},{\"CompletionText\":\"upcfg\",\"ListItemText\":\"upcfg\",\"ResultType\":2,\"ToolTip\":\"upcfg\"},{\"CompletionText\":\"Update-AdlAnalyticsComputePolicy\",\"ListItemText\":\"Update-AdlAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AdlAnalyticsComputePolicy\"},{\"CompletionText\":\"Update-AllBranches\",\"ListItemText\":\"Update-AllBranches\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AllBranches \\r\\n\"},{\"CompletionText\":\"Update-ASRMobilityService\",\"ListItemText\":\"Update-ASRMobilityService\",\"ResultType\":2,\"ToolTip\":\"Update-ASRMobilityService\"},{\"CompletionText\":\"Update-ASRPolicy\",\"ListItemText\":\"Update-ASRPolicy\",\"ResultType\":2,\"ToolTip\":\"Update-ASRPolicy\"},{\"CompletionText\":\"Update-ASRProtectionContainerMapping\",\"ListItemText\":\"Update-ASRProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Update-ASRProtectionContainerMapping\"},{\"CompletionText\":\"Update-ASRProtectionDirection\",\"ListItemText\":\"Update-ASRProtectionDirection\",\"ResultType\":2,\"ToolTip\":\"Update-ASRProtectionDirection\"},{\"CompletionText\":\"Update-ASRRecoveryPlan\",\"ListItemText\":\"Update-ASRRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Update-ASRRecoveryPlan\"},{\"CompletionText\":\"Update-ASRServicesProvider\",\"ListItemText\":\"Update-ASRServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Update-ASRServicesProvider\"},{\"CompletionText\":\"Update-ASRvCenter\",\"ListItemText\":\"Update-ASRvCenter\",\"ResultType\":2,\"ToolTip\":\"Update-ASRvCenter\"},{\"CompletionText\":\"Update-AutologgerConfig\",\"ListItemText\":\"Update-AutologgerConfig\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AutologgerConfig \\r\\n\"},{\"CompletionText\":\"Update-AzActivityLogAlert\",\"ListItemText\":\"Update-AzActivityLogAlert\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzActivityLogAlert \\r\\n\"},{\"CompletionText\":\"Update-AzADAppFederatedCredential\",\"ListItemText\":\"Update-AzADAppFederatedCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADAppFederatedCredential \\r\\n\"},{\"CompletionText\":\"Update-AzADApplication\",\"ListItemText\":\"Update-AzADApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADApplication \\r\\n\"},{\"CompletionText\":\"Update-AzADGroup\",\"ListItemText\":\"Update-AzADGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADGroup \\r\\n\"},{\"CompletionText\":\"Update-AzADServicePrincipal\",\"ListItemText\":\"Update-AzADServicePrincipal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADServicePrincipal \\r\\n\"},{\"CompletionText\":\"Update-AzADUser\",\"ListItemText\":\"Update-AzADUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzADUser \\r\\n\"},{\"CompletionText\":\"Update-AzAksNodePool\",\"ListItemText\":\"Update-AzAksNodePool\",\"ResultType\":2,\"ToolTip\":\"Update-AzAksNodePool\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementApiRelease\",\"ListItemText\":\"Update-AzApiManagementApiRelease\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementApiRelease\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementCache\",\"ListItemText\":\"Update-AzApiManagementCache\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementCache\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementGateway\",\"ListItemText\":\"Update-AzApiManagementGateway\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementGateway\\r\\n\"},{\"CompletionText\":\"Update-AzApiManagementRegion\",\"ListItemText\":\"Update-AzApiManagementRegion\",\"ResultType\":2,\"ToolTip\":\"Update-AzApiManagementRegion\\r\\n\"},{\"CompletionText\":\"Update-AzAppConfigurationStore\",\"ListItemText\":\"Update-AzAppConfigurationStore\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAppConfigurationStore \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsights\",\"ListItemText\":\"Update-AzApplicationInsights\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsights \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsLinkedStorageAccount\",\"ListItemText\":\"Update-AzApplicationInsightsLinkedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsLinkedStorageAccount \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsMyWorkbook\",\"ListItemText\":\"Update-AzApplicationInsightsMyWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsMyWorkbook \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsWebTestTag\",\"ListItemText\":\"Update-AzApplicationInsightsWebTestTag\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsWebTestTag \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsWorkbook\",\"ListItemText\":\"Update-AzApplicationInsightsWorkbook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsWorkbook \\r\\n\"},{\"CompletionText\":\"Update-AzApplicationInsightsWorkbookTemplate\",\"ListItemText\":\"Update-AzApplicationInsightsWorkbookTemplate\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzApplicationInsightsWorkbookTemplate \\r\\n\"},{\"CompletionText\":\"Update-AzAttestationProvider\",\"ListItemText\":\"Update-AzAttestationProvider\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAttestationProvider \\r\\n\"},{\"CompletionText\":\"Update-AzAutomanageConfigProfile\",\"ListItemText\":\"Update-AzAutomanageConfigProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAutomanageConfigProfile \\r\\n\"},{\"CompletionText\":\"Update-AzAutomationSourceControl\",\"ListItemText\":\"Update-AzAutomationSourceControl\",\"ResultType\":2,\"ToolTip\":\"Update-AzAutomationSourceControl\\r\\n\"},{\"CompletionText\":\"Update-AzAutoscaleSetting\",\"ListItemText\":\"Update-AzAutoscaleSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzAutoscaleSetting \\r\\n\"},{\"CompletionText\":\"Update-AzAvailabilitySet\",\"ListItemText\":\"Update-AzAvailabilitySet\",\"ResultType\":2,\"ToolTip\":\"Update-AzAvailabilitySet\\r\\n\"},{\"CompletionText\":\"Update-AzCapacityReservation\",\"ListItemText\":\"Update-AzCapacityReservation\",\"ResultType\":2,\"ToolTip\":\"Update-AzCapacityReservation\\r\\n\"},{\"CompletionText\":\"Update-AzCapacityReservationGroup\",\"ListItemText\":\"Update-AzCapacityReservationGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzCapacityReservationGroup\\r\\n\"},{\"CompletionText\":\"Update-AzCdnEndpoint\",\"ListItemText\":\"Update-AzCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzCdnOrigin\",\"ListItemText\":\"Update-AzCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnOrigin \\r\\n\"},{\"CompletionText\":\"Update-AzCdnOriginGroup\",\"ListItemText\":\"Update-AzCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Update-AzCdnProfile\",\"ListItemText\":\"Update-AzCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCdnProfile \\r\\n\"},{\"CompletionText\":\"Update-AzCloudService\",\"ListItemText\":\"Update-AzCloudService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzCloudService \\r\\n\"},{\"CompletionText\":\"Update-AzCognitiveServicesAccountNetworkRuleSet\",\"ListItemText\":\"Update-AzCognitiveServicesAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzCognitiveServicesAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Update-AzConfidentialLedger\",\"ListItemText\":\"Update-AzConfidentialLedger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzConfidentialLedger \\r\\n\"},{\"CompletionText\":\"Update-AzConfig\",\"ListItemText\":\"Update-AzConfig\",\"ResultType\":2,\"ToolTip\":\"Update-AzConfig\\r\\n\"},{\"CompletionText\":\"Update-AzContainerGroup\",\"ListItemText\":\"Update-AzContainerGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerGroup \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistry\",\"ListItemText\":\"Update-AzContainerRegistry\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistry \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryAgentPool\",\"ListItemText\":\"Update-AzContainerRegistryAgentPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryAgentPool \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryCredential\",\"ListItemText\":\"Update-AzContainerRegistryCredential\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryCredential \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryManifest\",\"ListItemText\":\"Update-AzContainerRegistryManifest\",\"ResultType\":2,\"ToolTip\":\"Update-AzContainerRegistryManifest\\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryRepository\",\"ListItemText\":\"Update-AzContainerRegistryRepository\",\"ResultType\":2,\"ToolTip\":\"Update-AzContainerRegistryRepository\\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryScopeMap\",\"ListItemText\":\"Update-AzContainerRegistryScopeMap\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryScopeMap \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryTag\",\"ListItemText\":\"Update-AzContainerRegistryTag\",\"ResultType\":2,\"ToolTip\":\"Update-AzContainerRegistryTag\\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryToken\",\"ListItemText\":\"Update-AzContainerRegistryToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryToken \\r\\n\"},{\"CompletionText\":\"Update-AzContainerRegistryWebhook\",\"ListItemText\":\"Update-AzContainerRegistryWebhook\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzContainerRegistryWebhook \\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBAccount\",\"ListItemText\":\"Update-AzCosmosDBAccount\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBAccount\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBAccountFailoverPriority\",\"ListItemText\":\"Update-AzCosmosDBAccountFailoverPriority\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBAccountFailoverPriority\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBAccountRegion\",\"ListItemText\":\"Update-AzCosmosDBAccountRegion\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBAccountRegion\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraKeyspace\",\"ListItemText\":\"Update-AzCosmosDBCassandraKeyspace\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraKeyspace\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraKeyspaceThroughput\",\"ListItemText\":\"Update-AzCosmosDBCassandraKeyspaceThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraKeyspaceThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraTable\",\"ListItemText\":\"Update-AzCosmosDBCassandraTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraTable\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBCassandraTableThroughput\",\"ListItemText\":\"Update-AzCosmosDBCassandraTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBCassandraTableThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDbClientEncryptionKey\",\"ListItemText\":\"Update-AzCosmosDbClientEncryptionKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDbClientEncryptionKey\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinDatabase\",\"ListItemText\":\"Update-AzCosmosDBGremlinDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinDatabaseThroughput\",\"ListItemText\":\"Update-AzCosmosDBGremlinDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinGraph\",\"ListItemText\":\"Update-AzCosmosDBGremlinGraph\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinGraph\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBGremlinGraphThroughput\",\"ListItemText\":\"Update-AzCosmosDBGremlinGraphThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBGremlinGraphThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBCollection\",\"ListItemText\":\"Update-AzCosmosDBMongoDBCollection\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBCollection\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBCollectionThroughput\",\"ListItemText\":\"Update-AzCosmosDBMongoDBCollectionThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBCollectionThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBDatabase\",\"ListItemText\":\"Update-AzCosmosDBMongoDBDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBDatabaseThroughput\",\"ListItemText\":\"Update-AzCosmosDBMongoDBDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBRoleDefinition\",\"ListItemText\":\"Update-AzCosmosDBMongoDBRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBRoleDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBMongoDBUserDefinition\",\"ListItemText\":\"Update-AzCosmosDBMongoDBUserDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBMongoDBUserDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlContainer\",\"ListItemText\":\"Update-AzCosmosDBSqlContainer\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlContainer\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlContainerThroughput\",\"ListItemText\":\"Update-AzCosmosDBSqlContainerThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlContainerThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlDatabase\",\"ListItemText\":\"Update-AzCosmosDBSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlDatabaseThroughput\",\"ListItemText\":\"Update-AzCosmosDBSqlDatabaseThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlDatabaseThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlRoleAssignment\",\"ListItemText\":\"Update-AzCosmosDBSqlRoleAssignment\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlRoleAssignment\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlRoleDefinition\",\"ListItemText\":\"Update-AzCosmosDBSqlRoleDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlRoleDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlStoredProcedure\",\"ListItemText\":\"Update-AzCosmosDBSqlStoredProcedure\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlStoredProcedure\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlTrigger\",\"ListItemText\":\"Update-AzCosmosDBSqlTrigger\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlTrigger\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBSqlUserDefinedFunction\",\"ListItemText\":\"Update-AzCosmosDBSqlUserDefinedFunction\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBSqlUserDefinedFunction\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBTable\",\"ListItemText\":\"Update-AzCosmosDBTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBTable\\r\\n\"},{\"CompletionText\":\"Update-AzCosmosDBTableThroughput\",\"ListItemText\":\"Update-AzCosmosDBTableThroughput\",\"ResultType\":2,\"ToolTip\":\"Update-AzCosmosDBTableThroughput\\r\\n\"},{\"CompletionText\":\"Update-AzCustomIpPrefix\",\"ListItemText\":\"Update-AzCustomIpPrefix\",\"ResultType\":2,\"ToolTip\":\"Update-AzCustomIpPrefix\\r\\n\"},{\"CompletionText\":\"Update-AzDatabricksAccessConnector\",\"ListItemText\":\"Update-AzDatabricksAccessConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDatabricksAccessConnector \\r\\n\"},{\"CompletionText\":\"Update-AzDatabricksVNetPeering\",\"ListItemText\":\"Update-AzDatabricksVNetPeering\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDatabricksVNetPeering \\r\\n\"},{\"CompletionText\":\"Update-AzDatabricksWorkspace\",\"ListItemText\":\"Update-AzDatabricksWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDatabricksWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzDataCollectionRule\",\"ListItemText\":\"Update-AzDataCollectionRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataCollectionRule\\r\\n\"},{\"CompletionText\":\"Update-AzDataFactoryV2\",\"ListItemText\":\"Update-AzDataFactoryV2\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataFactoryV2\\r\\n\"},{\"CompletionText\":\"Update-AzDataFactoryV2IntegrationRuntime\",\"ListItemText\":\"Update-AzDataFactoryV2IntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataFactoryV2IntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Update-AzDataFactoryV2IntegrationRuntimeNode\",\"ListItemText\":\"Update-AzDataFactoryV2IntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataFactoryV2IntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Update-AzDataLakeAnalyticsComputePolicy\",\"ListItemText\":\"Update-AzDataLakeAnalyticsComputePolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataLakeAnalyticsComputePolicy\\r\\n\"},{\"CompletionText\":\"Update-AzDataLakeGen2AclRecursive\",\"ListItemText\":\"Update-AzDataLakeGen2AclRecursive\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataLakeGen2AclRecursive\\r\\n\"},{\"CompletionText\":\"Update-AzDataLakeGen2Item\",\"ListItemText\":\"Update-AzDataLakeGen2Item\",\"ResultType\":2,\"ToolTip\":\"Update-AzDataLakeGen2Item\\r\\n\"},{\"CompletionText\":\"Update-AzDataProtectionBackupInstanceAssociatedPolicy\",\"ListItemText\":\"Update-AzDataProtectionBackupInstanceAssociatedPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDataProtectionBackupInstanceAssociatedPolicy \\r\\n\"},{\"CompletionText\":\"Update-AzDataProtectionBackupVault\",\"ListItemText\":\"Update-AzDataProtectionBackupVault\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDataProtectionBackupVault \\r\\n\"},{\"CompletionText\":\"Update-AzDataProtectionResourceGuard\",\"ListItemText\":\"Update-AzDataProtectionResourceGuard\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzDataProtectionResourceGuard \\r\\n\"},{\"CompletionText\":\"Update-AzDisk\",\"ListItemText\":\"Update-AzDisk\",\"ResultType\":2,\"ToolTip\":\"Update-AzDisk\\r\\n\"},{\"CompletionText\":\"Update-AzDiskEncryptionSet\",\"ListItemText\":\"Update-AzDiskEncryptionSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzDiskEncryptionSet\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridChannel\",\"ListItemText\":\"Update-AzEventGridChannel\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridChannel\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridPartnerConfiguration\",\"ListItemText\":\"Update-AzEventGridPartnerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridPartnerConfiguration\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridPartnerTopic\",\"ListItemText\":\"Update-AzEventGridPartnerTopic\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridPartnerTopic\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridPartnerTopicEventSubscription\",\"ListItemText\":\"Update-AzEventGridPartnerTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridPartnerTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridSubscription\",\"ListItemText\":\"Update-AzEventGridSubscription\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridSubscription\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridSystemTopic\",\"ListItemText\":\"Update-AzEventGridSystemTopic\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridSystemTopic\\r\\n\"},{\"CompletionText\":\"Update-AzEventGridSystemTopicEventSubscription\",\"ListItemText\":\"Update-AzEventGridSystemTopicEventSubscription\",\"ResultType\":2,\"ToolTip\":\"Update-AzEventGridSystemTopicEventSubscription\\r\\n\"},{\"CompletionText\":\"Update-AzFederatedIdentityCredentials\",\"ListItemText\":\"Update-AzFederatedIdentityCredentials\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFederatedIdentityCredentials \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnCustomDomain\",\"ListItemText\":\"Update-AzFrontDoorCdnCustomDomain\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnCustomDomain \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnCustomDomainValidationToken\",\"ListItemText\":\"Update-AzFrontDoorCdnCustomDomainValidationToken\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnCustomDomainValidationToken \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnEndpoint\",\"ListItemText\":\"Update-AzFrontDoorCdnEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnOrigin\",\"ListItemText\":\"Update-AzFrontDoorCdnOrigin\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnOrigin \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnOriginGroup\",\"ListItemText\":\"Update-AzFrontDoorCdnOriginGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnOriginGroup \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnProfile\",\"ListItemText\":\"Update-AzFrontDoorCdnProfile\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnProfile \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnProfileSku\",\"ListItemText\":\"Update-AzFrontDoorCdnProfileSku\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnProfileSku \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnRoute\",\"ListItemText\":\"Update-AzFrontDoorCdnRoute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnRoute \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnRule\",\"ListItemText\":\"Update-AzFrontDoorCdnRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnRule \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorCdnSecurityPolicy\",\"ListItemText\":\"Update-AzFrontDoorCdnSecurityPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFrontDoorCdnSecurityPolicy \\r\\n\"},{\"CompletionText\":\"Update-AzFrontDoorWafPolicy\",\"ListItemText\":\"Update-AzFrontDoorWafPolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AzFrontDoorWafPolicy\\r\\n\"},{\"CompletionText\":\"Update-AzFunctionApp\",\"ListItemText\":\"Update-AzFunctionApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFunctionApp \\r\\n\"},{\"CompletionText\":\"Update-AzFunctionAppPlan\",\"ListItemText\":\"Update-AzFunctionAppPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFunctionAppPlan \\r\\n\"},{\"CompletionText\":\"Update-AzFunctionAppSetting\",\"ListItemText\":\"Update-AzFunctionAppSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzFunctionAppSetting \\r\\n\"},{\"CompletionText\":\"Update-AzGallery\",\"ListItemText\":\"Update-AzGallery\",\"ResultType\":2,\"ToolTip\":\"Update-AzGallery\\r\\n\"},{\"CompletionText\":\"Update-AzGalleryApplication\",\"ListItemText\":\"Update-AzGalleryApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzGalleryApplication \\r\\n\"},{\"CompletionText\":\"Update-AzGalleryApplicationVersion\",\"ListItemText\":\"Update-AzGalleryApplicationVersion\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzGalleryApplicationVersion \\r\\n\"},{\"CompletionText\":\"Update-AzGalleryImageDefinition\",\"ListItemText\":\"Update-AzGalleryImageDefinition\",\"ResultType\":2,\"ToolTip\":\"Update-AzGalleryImageDefinition\\r\\n\"},{\"CompletionText\":\"Update-AzGalleryImageVersion\",\"ListItemText\":\"Update-AzGalleryImageVersion\",\"ResultType\":2,\"ToolTip\":\"Update-AzGalleryImageVersion\\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareApisService\",\"ListItemText\":\"Update-AzHealthcareApisService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareApisService \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareApisWorkspace\",\"ListItemText\":\"Update-AzHealthcareApisWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareApisWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareDicomService\",\"ListItemText\":\"Update-AzHealthcareDicomService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareDicomService \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareFhirService\",\"ListItemText\":\"Update-AzHealthcareFhirService\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareFhirService \\r\\n\"},{\"CompletionText\":\"Update-AzHealthcareIotConnector\",\"ListItemText\":\"Update-AzHealthcareIotConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzHealthcareIotConnector \\r\\n\"},{\"CompletionText\":\"Update-AzImage\",\"ListItemText\":\"Update-AzImage\",\"ResultType\":2,\"ToolTip\":\"Update-AzImage\\r\\n\"},{\"CompletionText\":\"Update-AzInsightsPrivateLinkScope\",\"ListItemText\":\"Update-AzInsightsPrivateLinkScope\",\"ResultType\":2,\"ToolTip\":\"Update-AzInsightsPrivateLinkScope\\r\\n\"},{\"CompletionText\":\"Update-AzIotHub\",\"ListItemText\":\"Update-AzIotHub\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotHub\\r\\n\"},{\"CompletionText\":\"Update-AzIotHubDeviceTwin\",\"ListItemText\":\"Update-AzIotHubDeviceTwin\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotHubDeviceTwin\\r\\n\"},{\"CompletionText\":\"Update-AzIotHubModuleTwin\",\"ListItemText\":\"Update-AzIotHubModuleTwin\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotHubModuleTwin\\r\\n\"},{\"CompletionText\":\"Update-AzIotSecuritySolution\",\"ListItemText\":\"Update-AzIotSecuritySolution\",\"ResultType\":2,\"ToolTip\":\"Update-AzIotSecuritySolution\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVault\",\"ListItemText\":\"Update-AzKeyVault\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVault\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultCertificate\",\"ListItemText\":\"Update-AzKeyVaultCertificate\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultCertificate\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultKey\",\"ListItemText\":\"Update-AzKeyVaultKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultKey\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultManagedHsm\",\"ListItemText\":\"Update-AzKeyVaultManagedHsm\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultManagedHsm\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultManagedStorageAccount\",\"ListItemText\":\"Update-AzKeyVaultManagedStorageAccount\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultManagedStorageAccount\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultManagedStorageAccountKey\",\"ListItemText\":\"Update-AzKeyVaultManagedStorageAccountKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultManagedStorageAccountKey\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultNetworkRuleSet\",\"ListItemText\":\"Update-AzKeyVaultNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Update-AzKeyVaultSecret\",\"ListItemText\":\"Update-AzKeyVaultSecret\",\"ResultType\":2,\"ToolTip\":\"Update-AzKeyVaultSecret\\r\\n\"},{\"CompletionText\":\"Update-AzKustoCluster\",\"ListItemText\":\"Update-AzKustoCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoCluster \\r\\n\"},{\"CompletionText\":\"Update-AzKustoDatabase\",\"ListItemText\":\"Update-AzKustoDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoDatabase \\r\\n\"},{\"CompletionText\":\"Update-AzKustoDataConnection\",\"ListItemText\":\"Update-AzKustoDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoDataConnection \\r\\n\"},{\"CompletionText\":\"Update-AzKustoManagedPrivateEndpoint\",\"ListItemText\":\"Update-AzKustoManagedPrivateEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoManagedPrivateEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzKustoScript\",\"ListItemText\":\"Update-AzKustoScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzKustoScript \\r\\n\"},{\"CompletionText\":\"Update-AzLoad\",\"ListItemText\":\"Update-AzLoad\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzLoad \\r\\n\"},{\"CompletionText\":\"Update-AzMaintenanceConfiguration\",\"ListItemText\":\"Update-AzMaintenanceConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-AzMaintenanceConfiguration\\r\\n\"},{\"CompletionText\":\"Update-AzManagedCassandraCluster\",\"ListItemText\":\"Update-AzManagedCassandraCluster\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagedCassandraCluster\\r\\n\"},{\"CompletionText\":\"Update-AzManagedCassandraDataCenter\",\"ListItemText\":\"Update-AzManagedCassandraDataCenter\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagedCassandraDataCenter\\r\\n\"},{\"CompletionText\":\"Update-AzManagementGroup\",\"ListItemText\":\"Update-AzManagementGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagementGroup\\r\\n\"},{\"CompletionText\":\"Update-AzManagementGroupHierarchySetting\",\"ListItemText\":\"Update-AzManagementGroupHierarchySetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzManagementGroupHierarchySetting\\r\\n\"},{\"CompletionText\":\"Update-AzMlCommitmentPlan\",\"ListItemText\":\"Update-AzMlCommitmentPlan\",\"ResultType\":2,\"ToolTip\":\"Update-AzMlCommitmentPlan\\r\\n\"},{\"CompletionText\":\"Update-AzMLServiceQuota\",\"ListItemText\":\"Update-AzMLServiceQuota\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLServiceQuota \\r\\n\"},{\"CompletionText\":\"Update-AzMlWebService\",\"ListItemText\":\"Update-AzMlWebService\",\"ResultType\":2,\"ToolTip\":\"Update-AzMlWebService\\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspace\",\"ListItemText\":\"Update-AzMLWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceBatchDeployment\",\"ListItemText\":\"Update-AzMLWorkspaceBatchDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceBatchDeployment \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceBatchEndpoint\",\"ListItemText\":\"Update-AzMLWorkspaceBatchEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceBatchEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceCompute\",\"ListItemText\":\"Update-AzMLWorkspaceCompute\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceCompute \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceOnlineDeployment\",\"ListItemText\":\"Update-AzMLWorkspaceOnlineDeployment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceOnlineDeployment \\r\\n\"},{\"CompletionText\":\"Update-AzMLWorkspaceOnlineEndpoint\",\"ListItemText\":\"Update-AzMLWorkspaceOnlineEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMLWorkspaceOnlineEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzMonitorWorkspace\",\"ListItemText\":\"Update-AzMonitorWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMonitorWorkspace \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlConfiguration\",\"ListItemText\":\"Update-AzMySqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFirewallRule\",\"ListItemText\":\"Update-AzMySqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFlexibleServer\",\"ListItemText\":\"Update-AzMySqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFlexibleServerConfiguration\",\"ListItemText\":\"Update-AzMySqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlFlexibleServerFirewallRule\",\"ListItemText\":\"Update-AzMySqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlServer\",\"ListItemText\":\"Update-AzMySqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlServer \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlServerConfigurationsList\",\"ListItemText\":\"Update-AzMySqlServerConfigurationsList\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlServerConfigurationsList \\r\\n\"},{\"CompletionText\":\"Update-AzMySqlVirtualNetworkRule\",\"ListItemText\":\"Update-AzMySqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzMySqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Update-AzNetworkVirtualAppliance\",\"ListItemText\":\"Update-AzNetworkVirtualAppliance\",\"ResultType\":2,\"ToolTip\":\"Update-AzNetworkVirtualAppliance\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsCluster\",\"ListItemText\":\"Update-AzOperationalInsightsCluster\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsCluster\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsDataExport\",\"ListItemText\":\"Update-AzOperationalInsightsDataExport\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsDataExport\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsTable\",\"ListItemText\":\"Update-AzOperationalInsightsTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsTable\\r\\n\"},{\"CompletionText\":\"Update-AzOperationalInsightsWorkspaceSharedKey\",\"ListItemText\":\"Update-AzOperationalInsightsWorkspaceSharedKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzOperationalInsightsWorkspaceSharedKey\\r\\n\"},{\"CompletionText\":\"Update-AzP2sVpnGateway\",\"ListItemText\":\"Update-AzP2sVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Update-AzP2sVpnGateway\\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlConfiguration\",\"ListItemText\":\"Update-AzPostgreSqlConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFirewallRule\",\"ListItemText\":\"Update-AzPostgreSqlFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFlexibleServer\",\"ListItemText\":\"Update-AzPostgreSqlFlexibleServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFlexibleServer \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFlexibleServerConfiguration\",\"ListItemText\":\"Update-AzPostgreSqlFlexibleServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFlexibleServerConfiguration \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlFlexibleServerFirewallRule\",\"ListItemText\":\"Update-AzPostgreSqlFlexibleServerFirewallRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlFlexibleServerFirewallRule \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlServer\",\"ListItemText\":\"Update-AzPostgreSqlServer\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlServer \\r\\n\"},{\"CompletionText\":\"Update-AzPostgreSqlVirtualNetworkRule\",\"ListItemText\":\"Update-AzPostgreSqlVirtualNetworkRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzPostgreSqlVirtualNetworkRule \\r\\n\"},{\"CompletionText\":\"Update-AzPowerBIEmbeddedCapacity\",\"ListItemText\":\"Update-AzPowerBIEmbeddedCapacity\",\"ResultType\":2,\"ToolTip\":\"Update-AzPowerBIEmbeddedCapacity\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrMobilityService\",\"ListItemText\":\"Update-AzRecoveryServicesAsrMobilityService\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrMobilityService\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrNetworkMapping\",\"ListItemText\":\"Update-AzRecoveryServicesAsrNetworkMapping\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrNetworkMapping\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrPolicy\",\"ListItemText\":\"Update-AzRecoveryServicesAsrPolicy\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrPolicy\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrProtectionContainerMapping\",\"ListItemText\":\"Update-AzRecoveryServicesAsrProtectionContainerMapping\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrProtectionContainerMapping\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrProtectionDirection\",\"ListItemText\":\"Update-AzRecoveryServicesAsrProtectionDirection\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrProtectionDirection\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrRecoveryPlan\",\"ListItemText\":\"Update-AzRecoveryServicesAsrRecoveryPlan\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrRecoveryPlan\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrServicesProvider\",\"ListItemText\":\"Update-AzRecoveryServicesAsrServicesProvider\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrServicesProvider\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesAsrvCenter\",\"ListItemText\":\"Update-AzRecoveryServicesAsrvCenter\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesAsrvCenter\\r\\n\"},{\"CompletionText\":\"Update-AzRecoveryServicesVault\",\"ListItemText\":\"Update-AzRecoveryServicesVault\",\"ResultType\":2,\"ToolTip\":\"Update-AzRecoveryServicesVault\\r\\n\"},{\"CompletionText\":\"Update-AzRedisEnterpriseCache\",\"ListItemText\":\"Update-AzRedisEnterpriseCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRedisEnterpriseCache \\r\\n\"},{\"CompletionText\":\"Update-AzRedisEnterpriseCacheDatabase\",\"ListItemText\":\"Update-AzRedisEnterpriseCacheDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRedisEnterpriseCacheDatabase \\r\\n\"},{\"CompletionText\":\"Update-AzRelayNamespace\",\"ListItemText\":\"Update-AzRelayNamespace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRelayNamespace \\r\\n\"},{\"CompletionText\":\"Update-AzResourceMoverMoveResource\",\"ListItemText\":\"Update-AzResourceMoverMoveResource\",\"ResultType\":2,\"ToolTip\":\"Update-AzResourceMoverMoveResource\"},{\"CompletionText\":\"Update-AzRestorePointCollection\",\"ListItemText\":\"Update-AzRestorePointCollection\",\"ResultType\":2,\"ToolTip\":\"Update-AzRestorePointCollection\\r\\n\"},{\"CompletionText\":\"Update-AzRmStorageContainer\",\"ListItemText\":\"Update-AzRmStorageContainer\",\"ResultType\":2,\"ToolTip\":\"Update-AzRmStorageContainer\\r\\n\"},{\"CompletionText\":\"Update-AzRmStorageShare\",\"ListItemText\":\"Update-AzRmStorageShare\",\"ResultType\":2,\"ToolTip\":\"Update-AzRmStorageShare\\r\\n\"},{\"CompletionText\":\"Update-AzRoleManagementPolicy\",\"ListItemText\":\"Update-AzRoleManagementPolicy\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzRoleManagementPolicy \\r\\n\"},{\"CompletionText\":\"Update-AzRouteMap\",\"ListItemText\":\"Update-AzRouteMap\",\"ResultType\":2,\"ToolTip\":\"Update-AzRouteMap\\r\\n\"},{\"CompletionText\":\"Update-AzRouteServer\",\"ListItemText\":\"Update-AzRouteServer\",\"ResultType\":2,\"ToolTip\":\"Update-AzRouteServer\\r\\n\"},{\"CompletionText\":\"Update-AzRouteServerPeer\",\"ListItemText\":\"Update-AzRouteServerPeer\",\"ResultType\":2,\"ToolTip\":\"Update-AzRouteServerPeer\\r\\n\"},{\"CompletionText\":\"Update-AzScheduledQueryRule\",\"ListItemText\":\"Update-AzScheduledQueryRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzScheduledQueryRule \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelAlertRule\",\"ListItemText\":\"Update-AzSentinelAlertRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelAlertRule \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelAlertRuleAction\",\"ListItemText\":\"Update-AzSentinelAlertRuleAction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelAlertRuleAction \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelAutomationRule\",\"ListItemText\":\"Update-AzSentinelAutomationRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelAutomationRule \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelBookmark\",\"ListItemText\":\"Update-AzSentinelBookmark\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelBookmark \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelBookmarkRelation\",\"ListItemText\":\"Update-AzSentinelBookmarkRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelBookmarkRelation \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelDataConnector\",\"ListItemText\":\"Update-AzSentinelDataConnector\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelDataConnector \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelEntityQuery\",\"ListItemText\":\"Update-AzSentinelEntityQuery\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelEntityQuery \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelIncident\",\"ListItemText\":\"Update-AzSentinelIncident\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelIncident \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelIncidentComment\",\"ListItemText\":\"Update-AzSentinelIncidentComment\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelIncidentComment \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelIncidentRelation\",\"ListItemText\":\"Update-AzSentinelIncidentRelation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelIncidentRelation \\r\\n\"},{\"CompletionText\":\"Update-AzSentinelSetting\",\"ListItemText\":\"Update-AzSentinelSetting\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSentinelSetting \\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricApplication\",\"ListItemText\":\"Update-AzServiceFabricApplication\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricApplication\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricDurability\",\"ListItemText\":\"Update-AzServiceFabricDurability\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricDurability\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricNodeType\",\"ListItemText\":\"Update-AzServiceFabricNodeType\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricNodeType\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricReliability\",\"ListItemText\":\"Update-AzServiceFabricReliability\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricReliability\\r\\n\"},{\"CompletionText\":\"Update-AzServiceFabricVmImage\",\"ListItemText\":\"Update-AzServiceFabricVmImage\",\"ResultType\":2,\"ToolTip\":\"Update-AzServiceFabricVmImage\\r\\n\"},{\"CompletionText\":\"Update-AzServiceLinkerForContainerApp\",\"ListItemText\":\"Update-AzServiceLinkerForContainerApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzServiceLinkerForContainerApp \\r\\n\"},{\"CompletionText\":\"Update-AzServiceLinkerForSpringCloud\",\"ListItemText\":\"Update-AzServiceLinkerForSpringCloud\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzServiceLinkerForSpringCloud \\r\\n\"},{\"CompletionText\":\"Update-AzServiceLinkerForWebApp\",\"ListItemText\":\"Update-AzServiceLinkerForWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzServiceLinkerForWebApp \\r\\n\"},{\"CompletionText\":\"Update-AzSignalR\",\"ListItemText\":\"Update-AzSignalR\",\"ResultType\":2,\"ToolTip\":\"Update-AzSignalR\\r\\n\"},{\"CompletionText\":\"Update-AzSignalRNetworkAcl\",\"ListItemText\":\"Update-AzSignalRNetworkAcl\",\"ResultType\":2,\"ToolTip\":\"Update-AzSignalRNetworkAcl\\r\\n\"},{\"CompletionText\":\"Update-AzSnapshot\",\"ListItemText\":\"Update-AzSnapshot\",\"ResultType\":2,\"ToolTip\":\"Update-AzSnapshot\\r\\n\"},{\"CompletionText\":\"Update-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlDatabaseLongTermRetentionBackup\",\"ListItemText\":\"Update-AzSqlDatabaseLongTermRetentionBackup\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseLongTermRetentionBackup\\r\\n\"},{\"CompletionText\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Update-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlInstanceAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceDatabaseAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\"},{\"CompletionText\":\"Update-AzSqlInstanceLink\",\"ListItemText\":\"Update-AzSqlInstanceLink\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceLink\\r\\n\"},{\"CompletionText\":\"Update-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlInstanceVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlServerAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSqlServerAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlServerAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlServerVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlServerVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlServerVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSqlSyncGroup\",\"ListItemText\":\"Update-AzSqlSyncGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlSyncGroup\\r\\n\"},{\"CompletionText\":\"Update-AzSqlSyncMember\",\"ListItemText\":\"Update-AzSqlSyncMember\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlSyncMember\\r\\n\"},{\"CompletionText\":\"Update-AzSqlSyncSchema\",\"ListItemText\":\"Update-AzSqlSyncSchema\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlSyncSchema\\r\\n\"},{\"CompletionText\":\"Update-AzSqlVM\",\"ListItemText\":\"Update-AzSqlVM\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSqlVM \\r\\n\"},{\"CompletionText\":\"Update-AzSqlVMGroup\",\"ListItemText\":\"Update-AzSqlVMGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSqlVMGroup \\r\\n\"},{\"CompletionText\":\"Update-AzSshKey\",\"ListItemText\":\"Update-AzSshKey\",\"ResultType\":2,\"ToolTip\":\"Update-AzSshKey\\r\\n\"},{\"CompletionText\":\"Update-AzStackHciCluster\",\"ListItemText\":\"Update-AzStackHciCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStackHciCluster \\r\\n\"},{\"CompletionText\":\"Update-AzStaticWebApp\",\"ListItemText\":\"Update-AzStaticWebApp\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStaticWebApp \\r\\n\"},{\"CompletionText\":\"Update-AzStaticWebAppUser\",\"ListItemText\":\"Update-AzStaticWebAppUser\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStaticWebAppUser \\r\\n\"},{\"CompletionText\":\"Update-AzStorageAccountNetworkRuleSet\",\"ListItemText\":\"Update-AzStorageAccountNetworkRuleSet\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageAccountNetworkRuleSet\\r\\n\"},{\"CompletionText\":\"Update-AzStorageBlobServiceProperty\",\"ListItemText\":\"Update-AzStorageBlobServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageBlobServiceProperty\\r\\n\"},{\"CompletionText\":\"Update-AzStorageEncryptionScope\",\"ListItemText\":\"Update-AzStorageEncryptionScope\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageEncryptionScope\\r\\n\"},{\"CompletionText\":\"Update-AzStorageFileServiceProperty\",\"ListItemText\":\"Update-AzStorageFileServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageFileServiceProperty\\r\\n\"},{\"CompletionText\":\"Update-AzStorageMover\",\"ListItemText\":\"Update-AzStorageMover\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMover \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverAgent\",\"ListItemText\":\"Update-AzStorageMoverAgent\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverAgent \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverAzStorageContainerEndpoint\",\"ListItemText\":\"Update-AzStorageMoverAzStorageContainerEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverAzStorageContainerEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverJobDefinition\",\"ListItemText\":\"Update-AzStorageMoverJobDefinition\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverJobDefinition \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverNfsEndpoint\",\"ListItemText\":\"Update-AzStorageMoverNfsEndpoint\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverNfsEndpoint \\r\\n\"},{\"CompletionText\":\"Update-AzStorageMoverProject\",\"ListItemText\":\"Update-AzStorageMoverProject\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStorageMoverProject \\r\\n\"},{\"CompletionText\":\"Update-AzStorageServiceProperty\",\"ListItemText\":\"Update-AzStorageServiceProperty\",\"ResultType\":2,\"ToolTip\":\"Update-AzStorageServiceProperty\\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsCluster\",\"ListItemText\":\"Update-AzStreamAnalyticsCluster\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsCluster \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsFunction\",\"ListItemText\":\"Update-AzStreamAnalyticsFunction\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsFunction \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsInput\",\"ListItemText\":\"Update-AzStreamAnalyticsInput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsInput \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsJob\",\"ListItemText\":\"Update-AzStreamAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsJob \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsOutput\",\"ListItemText\":\"Update-AzStreamAnalyticsOutput\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsOutput \\r\\n\"},{\"CompletionText\":\"Update-AzStreamAnalyticsTransformation\",\"ListItemText\":\"Update-AzStreamAnalyticsTransformation\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzStreamAnalyticsTransformation \\r\\n\"},{\"CompletionText\":\"Update-AzSupportTicket\",\"ListItemText\":\"Update-AzSupportTicket\",\"ResultType\":2,\"ToolTip\":\"Update-AzSupportTicket\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseFirewallRule\",\"ListItemText\":\"Update-AzSynapseFirewallRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseFirewallRule\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseIntegrationRuntime\",\"ListItemText\":\"Update-AzSynapseIntegrationRuntime\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseIntegrationRuntime\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseIntegrationRuntimeNode\",\"ListItemText\":\"Update-AzSynapseIntegrationRuntimeNode\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseIntegrationRuntimeNode\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseKustoPool\",\"ListItemText\":\"Update-AzSynapseKustoPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSynapseKustoPool \\r\\n\"},{\"CompletionText\":\"Update-AzSynapseKustoPoolDatabase\",\"ListItemText\":\"Update-AzSynapseKustoPoolDatabase\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSynapseKustoPoolDatabase \\r\\n\"},{\"CompletionText\":\"Update-AzSynapseKustoPoolDataConnection\",\"ListItemText\":\"Update-AzSynapseKustoPoolDataConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzSynapseKustoPoolDataConnection \\r\\n\"},{\"CompletionText\":\"Update-AzSynapseLinkConnectionLandingZoneCredential\",\"ListItemText\":\"Update-AzSynapseLinkConnectionLandingZoneCredential\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseLinkConnectionLandingZoneCredential\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseManagedVirtualNetworkConfig\",\"ListItemText\":\"Update-AzSynapseManagedVirtualNetworkConfig\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseManagedVirtualNetworkConfig\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSparkPool\",\"ListItemText\":\"Update-AzSynapseSparkPool\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSparkPool\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSynapseSqlAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlDatabase\",\"ListItemText\":\"Update-AzSynapseSqlDatabase\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlDatabase\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlPool\",\"ListItemText\":\"Update-AzSynapseSqlPool\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlPool\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ListItemText\":\"Update-AzSynapseSqlPoolAdvancedThreatProtectionSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlPoolAdvancedThreatProtectionSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSynapseSqlPoolVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlPoolVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSynapseSqlVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseSqlVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Update-AzSynapseWorkspace\",\"ListItemText\":\"Update-AzSynapseWorkspace\",\"ResultType\":2,\"ToolTip\":\"Update-AzSynapseWorkspace\\r\\n\"},{\"CompletionText\":\"Update-AzTag\",\"ListItemText\":\"Update-AzTag\",\"ResultType\":2,\"ToolTip\":\"Update-AzTag\\r\\n\"},{\"CompletionText\":\"Update-AzUserAssignedIdentity\",\"ListItemText\":\"Update-AzUserAssignedIdentity\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzUserAssignedIdentity \\r\\n\"},{\"CompletionText\":\"Update-AzVHubRouteTable\",\"ListItemText\":\"Update-AzVHubRouteTable\",\"ResultType\":2,\"ToolTip\":\"Update-AzVHubRouteTable\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualApplianceSite\",\"ListItemText\":\"Update-AzVirtualApplianceSite\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualApplianceSite\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualHub\",\"ListItemText\":\"Update-AzVirtualHub\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualHub\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualHubBgpConnection\",\"ListItemText\":\"Update-AzVirtualHubBgpConnection\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualHubBgpConnection\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualHubVnetConnection\",\"ListItemText\":\"Update-AzVirtualHubVnetConnection\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualHubVnetConnection\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualNetworkGatewayNatRule\",\"ListItemText\":\"Update-AzVirtualNetworkGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualNetworkGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualRouter\",\"ListItemText\":\"Update-AzVirtualRouter\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualRouter\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualRouterPeer\",\"ListItemText\":\"Update-AzVirtualRouterPeer\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualRouterPeer\\r\\n\"},{\"CompletionText\":\"Update-AzVirtualWan\",\"ListItemText\":\"Update-AzVirtualWan\",\"ResultType\":2,\"ToolTip\":\"Update-AzVirtualWan\\r\\n\"},{\"CompletionText\":\"Update-AzVM\",\"ListItemText\":\"Update-AzVM\",\"ResultType\":2,\"ToolTip\":\"Update-AzVM\\r\\n\"},{\"CompletionText\":\"Update-AzVmss\",\"ListItemText\":\"Update-AzVmss\",\"ResultType\":2,\"ToolTip\":\"Update-AzVmss\\r\\n\"},{\"CompletionText\":\"Update-AzVmssInstance\",\"ListItemText\":\"Update-AzVmssInstance\",\"ResultType\":2,\"ToolTip\":\"Update-AzVmssInstance\\r\\n\"},{\"CompletionText\":\"Update-AzVmssVM\",\"ListItemText\":\"Update-AzVmssVM\",\"ResultType\":2,\"ToolTip\":\"Update-AzVmssVM\\r\\n\"},{\"CompletionText\":\"Update-AzVpnConnection\",\"ListItemText\":\"Update-AzVpnConnection\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnConnection\\r\\n\"},{\"CompletionText\":\"Update-AzVpnGateway\",\"ListItemText\":\"Update-AzVpnGateway\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnGateway\\r\\n\"},{\"CompletionText\":\"Update-AzVpnGatewayNatRule\",\"ListItemText\":\"Update-AzVpnGatewayNatRule\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnGatewayNatRule\\r\\n\"},{\"CompletionText\":\"Update-AzVpnServerConfiguration\",\"ListItemText\":\"Update-AzVpnServerConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnServerConfiguration\\r\\n\"},{\"CompletionText\":\"Update-AzVpnServerConfigurationPolicyGroup\",\"ListItemText\":\"Update-AzVpnServerConfigurationPolicyGroup\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnServerConfigurationPolicyGroup\\r\\n\"},{\"CompletionText\":\"Update-AzVpnSite\",\"ListItemText\":\"Update-AzVpnSite\",\"ResultType\":2,\"ToolTip\":\"Update-AzVpnSite\\r\\n\"},{\"CompletionText\":\"Update-AzWebAppAccessRestrictionConfig\",\"ListItemText\":\"Update-AzWebAppAccessRestrictionConfig\",\"ResultType\":2,\"ToolTip\":\"Update-AzWebAppAccessRestrictionConfig\\r\\n\"},{\"CompletionText\":\"Update-AzWebAppTrafficRouting\",\"ListItemText\":\"Update-AzWebAppTrafficRouting\",\"ResultType\":2,\"ToolTip\":\"Update-AzWebAppTrafficRouting\\r\\n\"},{\"CompletionText\":\"Update-AzWebPubSub\",\"ListItemText\":\"Update-AzWebPubSub\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWebPubSub \\r\\n\"},{\"CompletionText\":\"Update-AzWvdApplication\",\"ListItemText\":\"Update-AzWvdApplication\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdApplication \\r\\n\"},{\"CompletionText\":\"Update-AzWvdApplicationGroup\",\"ListItemText\":\"Update-AzWvdApplicationGroup\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdApplicationGroup \\r\\n\"},{\"CompletionText\":\"Update-AzWvdDesktop\",\"ListItemText\":\"Update-AzWvdDesktop\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdDesktop \\r\\n\"},{\"CompletionText\":\"Update-AzWvdHostPool\",\"ListItemText\":\"Update-AzWvdHostPool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdHostPool \\r\\n\"},{\"CompletionText\":\"Update-AzWvdMsixPackage\",\"ListItemText\":\"Update-AzWvdMsixPackage\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdMsixPackage \\r\\n\"},{\"CompletionText\":\"Update-AzWvdScalingPlan\",\"ListItemText\":\"Update-AzWvdScalingPlan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdScalingPlan \\r\\n\"},{\"CompletionText\":\"Update-AzWvdScalingPlanPooledSchedule\",\"ListItemText\":\"Update-AzWvdScalingPlanPooledSchedule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdScalingPlanPooledSchedule \\r\\n\"},{\"CompletionText\":\"Update-AzWvdSessionHost\",\"ListItemText\":\"Update-AzWvdSessionHost\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdSessionHost \\r\\n\"},{\"CompletionText\":\"Update-AzWvdWorkspace\",\"ListItemText\":\"Update-AzWvdWorkspace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-AzWvdWorkspace \\r\\n\"},{\"CompletionText\":\"Update-Disk\",\"ListItemText\":\"Update-Disk\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Disk \\r\\n\"},{\"CompletionText\":\"Update-DscConfiguration\",\"ListItemText\":\"Update-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-DscConfiguration \\r\\n\"},{\"CompletionText\":\"Update-EtwTraceSession\",\"ListItemText\":\"Update-EtwTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-EtwTraceSession \\r\\n\"},{\"CompletionText\":\"Update-FormatData\",\"ListItemText\":\"Update-FormatData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-FormatData [[-AppendPath] ] [-PrependPath ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Update-Help\",\"ListItemText\":\"Update-Help\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Help [[-Module] ] [[-SourcePath] ] [[-UICulture] ] [-FullyQualifiedModule ] [-Recurse] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUpdate-Help [[-Module] ] [[-UICulture] ] [-FullyQualifiedModule ] [-LiteralPath ] [-Recurse] [-Credential ] [-UseDefaultCredentials] [-Force] [-Scope ] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Update-HostStorageCache\",\"ListItemText\":\"Update-HostStorageCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-HostStorageCache \\r\\n\"},{\"CompletionText\":\"Update-IscsiTarget\",\"ListItemText\":\"Update-IscsiTarget\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-IscsiTarget \\r\\n\"},{\"CompletionText\":\"Update-IscsiTargetPortal\",\"ListItemText\":\"Update-IscsiTargetPortal\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-IscsiTargetPortal \\r\\n\"},{\"CompletionText\":\"Update-LapsADSchema\",\"ListItemText\":\"Update-LapsADSchema\",\"ResultType\":2,\"ToolTip\":\"Update-LapsADSchema\\r\\n\"},{\"CompletionText\":\"Update-List\",\"ListItemText\":\"Update-List\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-List [[-Property] ] [-Add ] [-Remove ] [-InputObject ] []\\r\\n\\r\\nUpdate-List [[-Property] ] -Replace [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"Update-Module\",\"ListItemText\":\"Update-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Module \\r\\n\"},{\"CompletionText\":\"Update-ModuleManifest\",\"ListItemText\":\"Update-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ModuleManifest \\r\\n\"},{\"CompletionText\":\"Update-MpSignature\",\"ListItemText\":\"Update-MpSignature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-MpSignature \\r\\n\"},{\"CompletionText\":\"Update-NetFirewallDynamicKeywordAddress\",\"ListItemText\":\"Update-NetFirewallDynamicKeywordAddress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-NetFirewallDynamicKeywordAddress \\r\\n\"},{\"CompletionText\":\"Update-NetIPsecRule\",\"ListItemText\":\"Update-NetIPsecRule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-NetIPsecRule \\r\\n\"},{\"CompletionText\":\"Update-PSModuleManifest\",\"ListItemText\":\"Update-PSModuleManifest\",\"ResultType\":2,\"ToolTip\":\"Update-PSModuleManifest\\r\\n\"},{\"CompletionText\":\"Update-PSResource\",\"ListItemText\":\"Update-PSResource\",\"ResultType\":2,\"ToolTip\":\"Update-PSResource\\r\\n\"},{\"CompletionText\":\"Update-PSScriptFileInfo\",\"ListItemText\":\"Update-PSScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"Update-PSScriptFileInfo\\r\\n\"},{\"CompletionText\":\"Update-Script\",\"ListItemText\":\"Update-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Script \\r\\n\"},{\"CompletionText\":\"Update-ScriptFileInfo\",\"ListItemText\":\"Update-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"Update-SmbMultichannelConnection\",\"ListItemText\":\"Update-SmbMultichannelConnection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-SmbMultichannelConnection \\r\\n\"},{\"CompletionText\":\"Update-StorageBusCache\",\"ListItemText\":\"Update-StorageBusCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StorageBusCache \\r\\n\"},{\"CompletionText\":\"Update-StorageFirmware\",\"ListItemText\":\"Update-StorageFirmware\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StorageFirmware \\r\\n\"},{\"CompletionText\":\"Update-StoragePool\",\"ListItemText\":\"Update-StoragePool\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StoragePool \\r\\n\"},{\"CompletionText\":\"Update-StorageProviderCache\",\"ListItemText\":\"Update-StorageProviderCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-StorageProviderCache \\r\\n\"},{\"CompletionText\":\"Update-TypeData\",\"ListItemText\":\"Update-TypeData\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-TypeData [[-AppendPath] ] [-PrependPath ] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUpdate-TypeData -TypeName [-MemberType ] [-MemberName ] [-Value ] [-SecondValue ] [-TypeConverter ] [-TypeAdapter ] [-SerializationMethod ] [-TargetTypeForDeserialization ] [-SerializationDepth ] [-DefaultDisplayProperty ] [-InheritPropertySerializationSet ] [-StringSerializationSource ] [-DefaultDisplayPropertySet ] [-DefaultKeyPropertySet ] [-PropertySerializationSet ] [-Force] [-WhatIf] [-Confirm] []\\r\\n\\r\\nUpdate-TypeData [-TypeData] [-Force] [-WhatIf] [-Confirm] []\\r\\n\"},{\"CompletionText\":\"Update-VMVersion\",\"ListItemText\":\"Update-VMVersion\",\"ResultType\":2,\"ToolTip\":\"Update-VMVersion\\r\\n\"},{\"CompletionText\":\"Update-WIMBootEntry\",\"ListItemText\":\"Update-WIMBootEntry\",\"ResultType\":2,\"ToolTip\":\"Update-WIMBootEntry\\r\\n\"},{\"CompletionText\":\"upfc.exe\",\"ListItemText\":\"upfc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\upfc.exe\"},{\"CompletionText\":\"UpgradeResultsUI.exe\",\"ListItemText\":\"UpgradeResultsUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UpgradeResultsUI.exe\"},{\"CompletionText\":\"upmo\",\"ListItemText\":\"upmo\",\"ResultType\":2,\"ToolTip\":\"upmo\"},{\"CompletionText\":\"upnpcont.exe\",\"ListItemText\":\"upnpcont.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\upnpcont.exe\"},{\"CompletionText\":\"UPPrinterInstaller.exe\",\"ListItemText\":\"UPPrinterInstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UPPrinterInstaller.exe\"},{\"CompletionText\":\"Use-AzHDInsightCluster\",\"ListItemText\":\"Use-AzHDInsightCluster\",\"ResultType\":2,\"ToolTip\":\"Use-AzHDInsightCluster\\r\\n\"},{\"CompletionText\":\"Use-AzSqlDatabaseServerAuditingPolicy\",\"ListItemText\":\"Use-AzSqlDatabaseServerAuditingPolicy\",\"ResultType\":2,\"ToolTip\":\"Use-AzSqlDatabaseServerAuditingPolicy\"},{\"CompletionText\":\"Use-WindowsUnattend\",\"ListItemText\":\"Use-WindowsUnattend\",\"ResultType\":2,\"ToolTip\":\"Use-WindowsUnattend\\r\\n\"},{\"CompletionText\":\"UserAccountBroker.exe\",\"ListItemText\":\"UserAccountBroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UserAccountBroker.exe\"},{\"CompletionText\":\"UserAccountControlSettings.exe\",\"ListItemText\":\"UserAccountControlSettings.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UserAccountControlSettings.exe\"},{\"CompletionText\":\"UserDataSource.exe\",\"ListItemText\":\"UserDataSource.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UserDataSource.exe\"},{\"CompletionText\":\"userinit.exe\",\"ListItemText\":\"userinit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\userinit.exe\"},{\"CompletionText\":\"UsoClient.exe\",\"ListItemText\":\"UsoClient.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UsoClient.exe\"},{\"CompletionText\":\"UtcDecoderHost.exe\",\"ListItemText\":\"UtcDecoderHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\UtcDecoderHost.exe\"},{\"CompletionText\":\"Utilman.exe\",\"ListItemText\":\"Utilman.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Utilman.exe\"},{\"CompletionText\":\"V:\",\"ListItemText\":\"V:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nV: \\r\\n\"},{\"CompletionText\":\"Validate-AzDataShare\",\"ListItemText\":\"Validate-AzDataShare\",\"ResultType\":2,\"ToolTip\":\"Validate-AzDataShare\"},{\"CompletionText\":\"VaultCmd.exe\",\"ListItemText\":\"VaultCmd.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VaultCmd.exe\"},{\"CompletionText\":\"vds.exe\",\"ListItemText\":\"vds.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vds.exe\"},{\"CompletionText\":\"vdsldr.exe\",\"ListItemText\":\"vdsldr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vdsldr.exe\"},{\"CompletionText\":\"verclsid.exe\",\"ListItemText\":\"verclsid.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\verclsid.exe\"},{\"CompletionText\":\"verifier.exe\",\"ListItemText\":\"verifier.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\verifier.exe\"},{\"CompletionText\":\"verifiergui.exe\",\"ListItemText\":\"verifiergui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\verifiergui.exe\"},{\"CompletionText\":\"vfpctrl.exe\",\"ListItemText\":\"vfpctrl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vfpctrl.exe\"},{\"CompletionText\":\"virtmgmt.msc\",\"ListItemText\":\"virtmgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\virtmgmt.msc\"},{\"CompletionText\":\"vmcompute.exe\",\"ListItemText\":\"vmcompute.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmcompute.exe\"},{\"CompletionText\":\"vmconnect.exe\",\"ListItemText\":\"vmconnect.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmconnect.exe\"},{\"CompletionText\":\"vmms.exe\",\"ListItemText\":\"vmms.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmms.exe\"},{\"CompletionText\":\"vmplatformca.exe\",\"ListItemText\":\"vmplatformca.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmplatformca.exe\"},{\"CompletionText\":\"vmsp.exe\",\"ListItemText\":\"vmsp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmsp.exe\"},{\"CompletionText\":\"vmwp.exe\",\"ListItemText\":\"vmwp.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vmwp.exe\"},{\"CompletionText\":\"VoiceAccess.exe\",\"ListItemText\":\"VoiceAccess.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VoiceAccess.exe\"},{\"CompletionText\":\"vsce.cmd\",\"ListItemText\":\"vsce.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\vsce.cmd\"},{\"CompletionText\":\"vsce.ps1\",\"ListItemText\":\"vsce.ps1\",\"ResultType\":2,\"ToolTip\":\"vsce.ps1 \\r\\n\"},{\"CompletionText\":\"vscode-bisect.cmd\",\"ListItemText\":\"vscode-bisect.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\vscode-bisect.cmd\"},{\"CompletionText\":\"vscode-bisect.ps1\",\"ListItemText\":\"vscode-bisect.ps1\",\"ResultType\":2,\"ToolTip\":\"vscode-bisect.ps1 \\r\\n\"},{\"CompletionText\":\"VsGraphicsDesktopEngine.exe\",\"ListItemText\":\"VsGraphicsDesktopEngine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VsGraphicsDesktopEngine.exe\"},{\"CompletionText\":\"VsGraphicsRemoteEngine.exe\",\"ListItemText\":\"VsGraphicsRemoteEngine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VsGraphicsRemoteEngine.exe\"},{\"CompletionText\":\"vssadmin.exe\",\"ListItemText\":\"vssadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vssadmin.exe\"},{\"CompletionText\":\"VSSVC.exe\",\"ListItemText\":\"VSSVC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\VSSVC.exe\"},{\"CompletionText\":\"vulkaninfo-1-999-0-0-0.exe\",\"ListItemText\":\"vulkaninfo-1-999-0-0-0.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vulkaninfo-1-999-0-0-0.exe\"},{\"CompletionText\":\"vulkaninfo.exe\",\"ListItemText\":\"vulkaninfo.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\vulkaninfo.exe\"},{\"CompletionText\":\"w32tm.exe\",\"ListItemText\":\"w32tm.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\w32tm.exe\"},{\"CompletionText\":\"W:\",\"ListItemText\":\"W:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nW: \\r\\n\"},{\"CompletionText\":\"Wait-AdlJob\",\"ListItemText\":\"Wait-AdlJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AdlJob\"},{\"CompletionText\":\"Wait-AzDataLakeAnalyticsJob\",\"ListItemText\":\"Wait-AzDataLakeAnalyticsJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzDataLakeAnalyticsJob\\r\\n\"},{\"CompletionText\":\"Wait-AzHDInsightJob\",\"ListItemText\":\"Wait-AzHDInsightJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzHDInsightJob\\r\\n\"},{\"CompletionText\":\"Wait-AzRecoveryServicesBackupJob\",\"ListItemText\":\"Wait-AzRecoveryServicesBackupJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzRecoveryServicesBackupJob\\r\\n\"},{\"CompletionText\":\"Wait-AzSynapseSparkJob\",\"ListItemText\":\"Wait-AzSynapseSparkJob\",\"ResultType\":2,\"ToolTip\":\"Wait-AzSynapseSparkJob\\r\\n\"},{\"CompletionText\":\"Wait-Debugger\",\"ListItemText\":\"Wait-Debugger\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Debugger []\\r\\n\"},{\"CompletionText\":\"Wait-Event\",\"ListItemText\":\"Wait-Event\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Event [[-SourceIdentifier] ] [-Timeout ] []\\r\\n\"},{\"CompletionText\":\"Wait-Job\",\"ListItemText\":\"Wait-Job\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Job [-Id] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-Job] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-Name] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-InstanceId] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-State] [-Any] [-Timeout ] [-Force] []\\r\\n\\r\\nWait-Job [-Filter] [-Any] [-Timeout ] [-Force] []\\r\\n\"},{\"CompletionText\":\"Wait-Process\",\"ListItemText\":\"Wait-Process\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWait-Process [-Name] [[-Timeout] ] [-Any] [-PassThru] []\\r\\n\\r\\nWait-Process [-Id] [[-Timeout] ] [-Any] [-PassThru] []\\r\\n\\r\\nWait-Process [[-Timeout] ] -InputObject [-Any] [-PassThru] []\\r\\n\"},{\"CompletionText\":\"Wait-VM\",\"ListItemText\":\"Wait-VM\",\"ResultType\":2,\"ToolTip\":\"Wait-VM\\r\\n\"},{\"CompletionText\":\"waitfor.exe\",\"ListItemText\":\"waitfor.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\waitfor.exe\"},{\"CompletionText\":\"WallpaperHost.exe\",\"ListItemText\":\"WallpaperHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WallpaperHost.exe\"},{\"CompletionText\":\"wbadmin.exe\",\"ListItemText\":\"wbadmin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wbadmin.exe\"},{\"CompletionText\":\"wbemtest.exe\",\"ListItemText\":\"wbemtest.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\wbemtest.exe\"},{\"CompletionText\":\"wbengine.exe\",\"ListItemText\":\"wbengine.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wbengine.exe\"},{\"CompletionText\":\"WdfPerfEnhancedVerifier.cmd\",\"ListItemText\":\"WdfPerfEnhancedVerifier.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\WdfPerfEnhancedVerifier.cmd\"},{\"CompletionText\":\"wecutil.exe\",\"ListItemText\":\"wecutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wecutil.exe\"},{\"CompletionText\":\"WerFault.exe\",\"ListItemText\":\"WerFault.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WerFault.exe\"},{\"CompletionText\":\"WerFaultSecure.exe\",\"ListItemText\":\"WerFaultSecure.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WerFaultSecure.exe\"},{\"CompletionText\":\"wermgr.exe\",\"ListItemText\":\"wermgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wermgr.exe\"},{\"CompletionText\":\"wevtutil.exe\",\"ListItemText\":\"wevtutil.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wevtutil.exe\"},{\"CompletionText\":\"wextract.exe\",\"ListItemText\":\"wextract.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wextract.exe\"},{\"CompletionText\":\"WF.msc\",\"ListItemText\":\"WF.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WF.msc\"},{\"CompletionText\":\"WFS.exe\",\"ListItemText\":\"WFS.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WFS.exe\"},{\"CompletionText\":\"where\",\"ListItemText\":\"where\",\"ResultType\":2,\"ToolTip\":\"Where-Object\"},{\"CompletionText\":\"Where-Object\",\"ListItemText\":\"Where-Object\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWhere-Object [-Property] [[-Value] ] [-InputObject ] [-EQ] []\\r\\n\\r\\nWhere-Object [-FilterScript] [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CEQ [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -GT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CGT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -LT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CLT [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -GE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CGE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -LE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CLE [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Like [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CLike [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotLike [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotLike [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Match [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CMatch [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotMatch [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotMatch [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Contains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CContains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotContains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotContains [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -In [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CIn [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -NotIn [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -CNotIn [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -Is [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] [[-Value] ] -IsNot [-InputObject ] []\\r\\n\\r\\nWhere-Object [-Property] -Not [-InputObject ] []\\r\\n\"},{\"CompletionText\":\"where.exe\",\"ListItemText\":\"where.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\where.exe\"},{\"CompletionText\":\"whoami.exe\",\"ListItemText\":\"whoami.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\whoami.exe\"},{\"CompletionText\":\"wiaacmgr.exe\",\"ListItemText\":\"wiaacmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wiaacmgr.exe\"},{\"CompletionText\":\"wiawow64.exe\",\"ListItemText\":\"wiawow64.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wiawow64.exe\"},{\"CompletionText\":\"wifitask.exe\",\"ListItemText\":\"wifitask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wifitask.exe\"},{\"CompletionText\":\"wimserv.exe\",\"ListItemText\":\"wimserv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wimserv.exe\"},{\"CompletionText\":\"WinBioDataModelOOBE.exe\",\"ListItemText\":\"WinBioDataModelOOBE.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WinBioDataModelOOBE.exe\"},{\"CompletionText\":\"Windows.Media.BackgroundPlayback.exe\",\"ListItemText\":\"Windows.Media.BackgroundPlayback.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Windows.Media.BackgroundPlayback.exe\"},{\"CompletionText\":\"Windows.WARP.JITService.exe\",\"ListItemText\":\"Windows.WARP.JITService.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\Windows.WARP.JITService.exe\"},{\"CompletionText\":\"WindowsActionDialog.exe\",\"ListItemText\":\"WindowsActionDialog.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WindowsActionDialog.exe\"},{\"CompletionText\":\"WindowsPackageManagerServer.exe\",\"ListItemText\":\"WindowsPackageManagerServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\WindowsPackageManagerServer.exe\"},{\"CompletionText\":\"WindowsUpdateElevatedInstaller.exe\",\"ListItemText\":\"WindowsUpdateElevatedInstaller.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WindowsUpdateElevatedInstaller.exe\"},{\"CompletionText\":\"winget.exe\",\"ListItemText\":\"winget.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\winget.exe\"},{\"CompletionText\":\"winhlp32.exe\",\"ListItemText\":\"winhlp32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\winhlp32.exe\"},{\"CompletionText\":\"wininit.exe\",\"ListItemText\":\"wininit.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wininit.exe\"},{\"CompletionText\":\"winload.exe\",\"ListItemText\":\"winload.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winload.exe\"},{\"CompletionText\":\"winlogon.exe\",\"ListItemText\":\"winlogon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winlogon.exe\"},{\"CompletionText\":\"WinMgmt.exe\",\"ListItemText\":\"WinMgmt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WinMgmt.exe\"},{\"CompletionText\":\"winresume.exe\",\"ListItemText\":\"winresume.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winresume.exe\"},{\"CompletionText\":\"winrm.cmd\",\"ListItemText\":\"winrm.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrm.cmd\"},{\"CompletionText\":\"winrm.vbs\",\"ListItemText\":\"winrm.vbs\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrm.vbs\"},{\"CompletionText\":\"winrs.exe\",\"ListItemText\":\"winrs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrs.exe\"},{\"CompletionText\":\"winrshost.exe\",\"ListItemText\":\"winrshost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winrshost.exe\"},{\"CompletionText\":\"WinRTNetMUAHostServer.exe\",\"ListItemText\":\"WinRTNetMUAHostServer.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WinRTNetMUAHostServer.exe\"},{\"CompletionText\":\"WinSAT.exe\",\"ListItemText\":\"WinSAT.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WinSAT.exe\"},{\"CompletionText\":\"winver.exe\",\"ListItemText\":\"winver.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\winver.exe\"},{\"CompletionText\":\"wjb\",\"ListItemText\":\"wjb\",\"ResultType\":2,\"ToolTip\":\"Wait-Job\"},{\"CompletionText\":\"wkspbroker.exe\",\"ListItemText\":\"wkspbroker.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wkspbroker.exe\"},{\"CompletionText\":\"wksprt.exe\",\"ListItemText\":\"wksprt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wksprt.exe\"},{\"CompletionText\":\"wlanext.exe\",\"ListItemText\":\"wlanext.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wlanext.exe\"},{\"CompletionText\":\"wlrmdr.exe\",\"ListItemText\":\"wlrmdr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wlrmdr.exe\"},{\"CompletionText\":\"WMIADAP.exe\",\"ListItemText\":\"WMIADAP.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WMIADAP.exe\"},{\"CompletionText\":\"WmiApSrv.exe\",\"ListItemText\":\"WmiApSrv.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WmiApSrv.exe\"},{\"CompletionText\":\"WMIC.exe\",\"ListItemText\":\"WMIC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WMIC.exe\"},{\"CompletionText\":\"WmiMgmt.msc\",\"ListItemText\":\"WmiMgmt.msc\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WmiMgmt.msc\"},{\"CompletionText\":\"WmiPrvSE.exe\",\"ListItemText\":\"WmiPrvSE.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\System32\\\\Wbem\\\\WmiPrvSE.exe\"},{\"CompletionText\":\"WMPDMC.exe\",\"ListItemText\":\"WMPDMC.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WMPDMC.exe\"},{\"CompletionText\":\"WorkFolders.exe\",\"ListItemText\":\"WorkFolders.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WorkFolders.exe\"},{\"CompletionText\":\"wowreg32.exe\",\"ListItemText\":\"wowreg32.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wowreg32.exe\"},{\"CompletionText\":\"wpa.exe\",\"ListItemText\":\"wpa.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpa.exe\"},{\"CompletionText\":\"wpaexporter.exe\",\"ListItemText\":\"wpaexporter.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpaexporter.exe\"},{\"CompletionText\":\"wpbbin.exe\",\"ListItemText\":\"wpbbin.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wpbbin.exe\"},{\"CompletionText\":\"WpcMon.exe\",\"ListItemText\":\"WpcMon.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WpcMon.exe\"},{\"CompletionText\":\"WpcTok.exe\",\"ListItemText\":\"WpcTok.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WpcTok.exe\"},{\"CompletionText\":\"WPDShextAutoplay.exe\",\"ListItemText\":\"WPDShextAutoplay.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WPDShextAutoplay.exe\"},{\"CompletionText\":\"wpnpinst.exe\",\"ListItemText\":\"wpnpinst.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wpnpinst.exe\"},{\"CompletionText\":\"wpr.exe\",\"ListItemText\":\"wpr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wpr.exe\"},{\"CompletionText\":\"WPRUI.exe\",\"ListItemText\":\"WPRUI.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\WPRUI.exe\"},{\"CompletionText\":\"write\",\"ListItemText\":\"write\",\"ResultType\":2,\"ToolTip\":\"Write-Output\"},{\"CompletionText\":\"Write-Debug\",\"ListItemText\":\"Write-Debug\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Debug [-Message] []\\r\\n\"},{\"CompletionText\":\"Write-DtcTransactionsTraceSession\",\"ListItemText\":\"Write-DtcTransactionsTraceSession\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-DtcTransactionsTraceSession \\r\\n\"},{\"CompletionText\":\"Write-Error\",\"ListItemText\":\"Write-Error\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Error [-Message] [-Category ] [-ErrorId ] [-TargetObject ] [-RecommendedAction ] [-CategoryActivity ] [-CategoryReason ] [-CategoryTargetName ] [-CategoryTargetType ] []\\r\\n\\r\\nWrite-Error [-Exception] [-Message ] [-Category ] [-ErrorId ] [-TargetObject ] [-RecommendedAction ] [-CategoryActivity ] [-CategoryReason ] [-CategoryTargetName ] [-CategoryTargetType ] []\\r\\n\\r\\nWrite-Error [-ErrorRecord] [-RecommendedAction ] [-CategoryActivity ] [-CategoryReason ] [-CategoryTargetName ] [-CategoryTargetType ] []\\r\\n\"},{\"CompletionText\":\"Write-FileSystemCache\",\"ListItemText\":\"Write-FileSystemCache\",\"ResultType\":2,\"ToolTip\":\"Write-FileSystemCache\"},{\"CompletionText\":\"Write-GitBranchName\",\"ListItemText\":\"Write-GitBranchName\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitBranchName \\r\\n\"},{\"CompletionText\":\"Write-GitBranchStatus\",\"ListItemText\":\"Write-GitBranchStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitBranchStatus \\r\\n\"},{\"CompletionText\":\"Write-GitIndexStatus\",\"ListItemText\":\"Write-GitIndexStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitIndexStatus \\r\\n\"},{\"CompletionText\":\"Write-GitStashCount\",\"ListItemText\":\"Write-GitStashCount\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitStashCount \\r\\n\"},{\"CompletionText\":\"Write-GitStatus\",\"ListItemText\":\"Write-GitStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitStatus \\r\\n\"},{\"CompletionText\":\"Write-GitWorkingDirStatus\",\"ListItemText\":\"Write-GitWorkingDirStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitWorkingDirStatus \\r\\n\"},{\"CompletionText\":\"Write-GitWorkingDirStatusSummary\",\"ListItemText\":\"Write-GitWorkingDirStatusSummary\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-GitWorkingDirStatusSummary \\r\\n\"},{\"CompletionText\":\"Write-Host\",\"ListItemText\":\"Write-Host\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Host [[-Object] ] [-NoNewline] [-Separator ] [-ForegroundColor ] [-BackgroundColor ] []\\r\\n\"},{\"CompletionText\":\"Write-Information\",\"ListItemText\":\"Write-Information\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Information [-MessageData] [[-Tags] ] []\\r\\n\"},{\"CompletionText\":\"Write-Output\",\"ListItemText\":\"Write-Output\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Output [-InputObject] [-NoEnumerate] []\\r\\n\"},{\"CompletionText\":\"Write-PrinterNfcTag\",\"ListItemText\":\"Write-PrinterNfcTag\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-PrinterNfcTag \\r\\n\"},{\"CompletionText\":\"Write-Progress\",\"ListItemText\":\"Write-Progress\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Progress [[-Activity] ] [[-Status] ] [[-Id] ] [-PercentComplete ] [-SecondsRemaining ] [-CurrentOperation ] [-ParentId ] [-Completed] [-SourceId ] []\\r\\n\"},{\"CompletionText\":\"Write-Prompt\",\"ListItemText\":\"Write-Prompt\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Prompt \\r\\n\"},{\"CompletionText\":\"Write-VcsStatus\",\"ListItemText\":\"Write-VcsStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-VcsStatus \\r\\n\"},{\"CompletionText\":\"Write-Verbose\",\"ListItemText\":\"Write-Verbose\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Verbose [-Message] []\\r\\n\"},{\"CompletionText\":\"Write-VolumeCache\",\"ListItemText\":\"Write-VolumeCache\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-VolumeCache \\r\\n\"},{\"CompletionText\":\"Write-Warning\",\"ListItemText\":\"Write-Warning\",\"ResultType\":2,\"ToolTip\":\"\\r\\nWrite-Warning [-Message] []\\r\\n\"},{\"CompletionText\":\"write.exe\",\"ListItemText\":\"write.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\write.exe\"},{\"CompletionText\":\"wscadminui.exe\",\"ListItemText\":\"wscadminui.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wscadminui.exe\"},{\"CompletionText\":\"WSCollect.exe\",\"ListItemText\":\"WSCollect.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WSCollect.exe\"},{\"CompletionText\":\"wscript.exe\",\"ListItemText\":\"wscript.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wscript.exe\"},{\"CompletionText\":\"wscui.cpl\",\"ListItemText\":\"wscui.cpl\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wscui.cpl\"},{\"CompletionText\":\"wsgen.exe\",\"ListItemText\":\"wsgen.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\wsgen.exe\"},{\"CompletionText\":\"wsimport.exe\",\"ListItemText\":\"wsimport.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\wsimport.exe\"},{\"CompletionText\":\"wsl.exe\",\"ListItemText\":\"wsl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wsl.exe\"},{\"CompletionText\":\"wslconfig.exe\",\"ListItemText\":\"wslconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wslconfig.exe\"},{\"CompletionText\":\"wslg.exe\",\"ListItemText\":\"wslg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wslg.exe\"},{\"CompletionText\":\"WSManHTTPConfig.exe\",\"ListItemText\":\"WSManHTTPConfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WSManHTTPConfig.exe\"},{\"CompletionText\":\"wsmprovhost.exe\",\"ListItemText\":\"wsmprovhost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wsmprovhost.exe\"},{\"CompletionText\":\"wsqmcons.exe\",\"ListItemText\":\"wsqmcons.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wsqmcons.exe\"},{\"CompletionText\":\"WSReset.exe\",\"ListItemText\":\"WSReset.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WSReset.exe\"},{\"CompletionText\":\"wt.exe\",\"ListItemText\":\"wt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wt.exe\"},{\"CompletionText\":\"wuapihost.exe\",\"ListItemText\":\"wuapihost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wuapihost.exe\"},{\"CompletionText\":\"wuauclt.exe\",\"ListItemText\":\"wuauclt.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wuauclt.exe\"},{\"CompletionText\":\"WUDFCompanionHost.exe\",\"ListItemText\":\"WUDFCompanionHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WUDFCompanionHost.exe\"},{\"CompletionText\":\"WUDFHost.exe\",\"ListItemText\":\"WUDFHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WUDFHost.exe\"},{\"CompletionText\":\"wusa.exe\",\"ListItemText\":\"wusa.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\wusa.exe\"},{\"CompletionText\":\"WWAHost.exe\",\"ListItemText\":\"WWAHost.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\WWAHost.exe\"},{\"CompletionText\":\"X:\",\"ListItemText\":\"X:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nX: \\r\\n\"},{\"CompletionText\":\"XblGameSaveTask.exe\",\"ListItemText\":\"XblGameSaveTask.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\XblGameSaveTask.exe\"},{\"CompletionText\":\"xbootmgr.exe\",\"ListItemText\":\"xbootmgr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\xbootmgr.exe\"},{\"CompletionText\":\"xbootmgrsleep.exe\",\"ListItemText\":\"xbootmgrsleep.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\xbootmgrsleep.exe\"},{\"CompletionText\":\"xcopy.exe\",\"ListItemText\":\"xcopy.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\xcopy.exe\"},{\"CompletionText\":\"xjc.exe\",\"ListItemText\":\"xjc.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Eclipse Adoptium\\\\jdk-8.0.345.1-hotspot\\\\bin\\\\xjc.exe\"},{\"CompletionText\":\"xperf.exe\",\"ListItemText\":\"xperf.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\xperf.exe\"},{\"CompletionText\":\"xwizard.exe\",\"ListItemText\":\"xwizard.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\xwizard.exe\"},{\"CompletionText\":\"Y:\",\"ListItemText\":\"Y:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nY: \\r\\n\"},{\"CompletionText\":\"yarn.cmd\",\"ListItemText\":\"yarn.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yarn.cmd\"},{\"CompletionText\":\"yarn.ps1\",\"ListItemText\":\"yarn.ps1\",\"ResultType\":2,\"ToolTip\":\"yarn.ps1 \\r\\n\"},{\"CompletionText\":\"yarnpkg.cmd\",\"ListItemText\":\"yarnpkg.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yarnpkg.cmd\"},{\"CompletionText\":\"yarnpkg.ps1\",\"ListItemText\":\"yarnpkg.ps1\",\"ResultType\":2,\"ToolTip\":\"yarnpkg.ps1 \\r\\n\"},{\"CompletionText\":\"yo-complete.cmd\",\"ListItemText\":\"yo-complete.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yo-complete.cmd\"},{\"CompletionText\":\"yo-complete.ps1\",\"ListItemText\":\"yo-complete.ps1\",\"ResultType\":2,\"ToolTip\":\"yo-complete.ps1 \\r\\n\"},{\"CompletionText\":\"yo.cmd\",\"ListItemText\":\"yo.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Roaming\\\\npm\\\\yo.cmd\"},{\"CompletionText\":\"yo.ps1\",\"ListItemText\":\"yo.ps1\",\"ResultType\":2,\"ToolTip\":\"yo.ps1 \\r\\n\"},{\"CompletionText\":\"Z:\",\"ListItemText\":\"Z:\",\"ResultType\":2,\"ToolTip\":\"\\r\\nZ: \\r\\n\"},{\"CompletionText\":\"__VSCode-Escape-Value\",\"ListItemText\":\"__VSCode-Escape-Value\",\"ResultType\":2,\"ToolTip\":\"\\r\\n__VSCode-Escape-Value [[-value] ]\\r\\n\"},{\"CompletionText\":\"Defender\\\\Add-MpPreference\",\"ListItemText\":\"Add-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nAdd-MpPreference \\r\\n\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\bash.exe\",\"ListItemText\":\"bash.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\bash.exe\"},{\"CompletionText\":\"Az.Sql\\\\Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Clear-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"'C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code-tunnel.exe'\",\"ListItemText\":\"code-tunnel.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code-tunnel.exe\"},{\"CompletionText\":\"'C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code.cmd'\",\"ListItemText\":\"code.cmd\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Microsoft VS Code\\\\bin\\\\code.cmd\"},{\"CompletionText\":\"Microsoft.PowerShell.Archive\\\\Compress-Archive\",\"ListItemText\":\"Compress-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nCompress-Archive \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Disable-PhysicalDiskIndication\",\"ListItemText\":\"Disable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Disable-PhysicalDiskIndication\"},{\"CompletionText\":\"PSDiagnostics\\\\Disable-PSTrace\",\"ListItemText\":\"Disable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSTrace \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Disable-PSWSManCombinedTrace\",\"ListItemText\":\"Disable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Disable-StorageDiagnosticLog\",\"ListItemText\":\"Disable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Disable-StorageDiagnosticLog\"},{\"CompletionText\":\"PSDiagnostics\\\\Disable-WSManTrace\",\"ListItemText\":\"Disable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nDisable-WSManTrace \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Enable-PhysicalDiskIndication\",\"ListItemText\":\"Enable-PhysicalDiskIndication\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Enable-PhysicalDiskIndication\"},{\"CompletionText\":\"PSDiagnostics\\\\Enable-PSTrace\",\"ListItemText\":\"Enable-PSTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSTrace \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Enable-PSWSManCombinedTrace\",\"ListItemText\":\"Enable-PSWSManCombinedTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-PSWSManCombinedTrace \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Enable-StorageDiagnosticLog\",\"ListItemText\":\"Enable-StorageDiagnosticLog\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Enable-StorageDiagnosticLog\"},{\"CompletionText\":\"PSDiagnostics\\\\Enable-WSManTrace\",\"ListItemText\":\"Enable-WSManTrace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nEnable-WSManTrace \\r\\n\"},{\"CompletionText\":\"Microsoft.PowerShell.Archive\\\\Expand-Archive\",\"ListItemText\":\"Expand-Archive\",\"ResultType\":2,\"ToolTip\":\"\\r\\nExpand-Archive \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Export-VMCheckpoint\",\"ListItemText\":\"Export-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Export-VMCheckpoint\"},{\"CompletionText\":\"PowerShellGet\\\\fimo\",\"ListItemText\":\"fimo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\fimo\"},{\"CompletionText\":\"PowerShellGet\\\\Find-Command\",\"ListItemText\":\"Find-Command\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Command \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-DscResource\",\"ListItemText\":\"Find-DscResource\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-DscResource \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-Module\",\"ListItemText\":\"Find-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-RoleCapability\",\"ListItemText\":\"Find-RoleCapability\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-RoleCapability \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Find-Script\",\"ListItemText\":\"Find-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nFind-Script \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Flush-Volume\",\"ListItemText\":\"Flush-Volume\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Flush-Volume\"},{\"CompletionText\":\"CimCmdlets\\\\gcai\",\"ListItemText\":\"gcai\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcai\"},{\"CompletionText\":\"CimCmdlets\\\\gcim\",\"ListItemText\":\"gcim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcim\"},{\"CompletionText\":\"CimCmdlets\\\\gcls\",\"ListItemText\":\"gcls\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcls\"},{\"CompletionText\":\"CimCmdlets\\\\gcms\",\"ListItemText\":\"gcms\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\gcms\"},{\"CompletionText\":\"Az.Sql\\\\Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Get-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-DiskSNV\",\"ListItemText\":\"Get-DiskSNV\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-DiskSNV\"},{\"CompletionText\":\"PowerShellGet\\\\Get-InstalledModule\",\"ListItemText\":\"Get-InstalledModule\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledModule \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Get-InstalledScript\",\"ListItemText\":\"Get-InstalledScript\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-InstalledScript \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Get-LogProperties\",\"ListItemText\":\"Get-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-LogProperties \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpComputerStatus\",\"ListItemText\":\"Get-MpComputerStatus\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpComputerStatus \\r\\n\"},{\"CompletionText\":\"DefenderPerformance\\\\Get-MpPerformanceReport\",\"ListItemText\":\"Get-MpPerformanceReport\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPerformanceReport \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpPreference\",\"ListItemText\":\"Get-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpPreference \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpThreat\",\"ListItemText\":\"Get-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreat \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpThreatCatalog\",\"ListItemText\":\"Get-MpThreatCatalog\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatCatalog \\r\\n\"},{\"CompletionText\":\"Defender\\\\Get-MpThreatDetection\",\"ListItemText\":\"Get-MpThreatDetection\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-MpThreatDetection \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-PhysicalDiskSNV\",\"ListItemText\":\"Get-PhysicalDiskSNV\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-PhysicalDiskSNV\"},{\"CompletionText\":\"PowerShellGet\\\\Get-PSRepository\",\"ListItemText\":\"Get-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nGet-PSRepository \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-StorageEnclosureSNV\",\"ListItemText\":\"Get-StorageEnclosureSNV\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-StorageEnclosureSNV\"},{\"CompletionText\":\"VMDirectStorage\\\\Get-VMCheckpoint\",\"ListItemText\":\"Get-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Get-VMCheckpoint\"},{\"CompletionText\":\"'C:\\\\Program Files\\\\Git\\\\cmd\\\\git-lfs.exe'\",\"ListItemText\":\"git-lfs.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files\\\\Git\\\\cmd\\\\git-lfs.exe\"},{\"CompletionText\":\"Hyper-V\\\\gvm\",\"ListItemText\":\"gvm\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\gvm\"},{\"CompletionText\":\"VMDirectStorage\\\\gvm\",\"ListItemText\":\"gvm\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\gvm\"},{\"CompletionText\":\"Hyper-V\\\\gvmr\",\"ListItemText\":\"gvmr\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\gvmr\"},{\"CompletionText\":\"VMDirectStorage\\\\gvmr\",\"ListItemText\":\"gvmr\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\gvmr\"},{\"CompletionText\":\"Hyper-V\\\\gvmrs\",\"ListItemText\":\"gvmrs\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\gvmrs\"},{\"CompletionText\":\"VMDirectStorage\\\\gvmrs\",\"ListItemText\":\"gvmrs\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\gvmrs\"},{\"CompletionText\":\"CimCmdlets\\\\icim\",\"ListItemText\":\"icim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\icim\"},{\"CompletionText\":\"VMDirectStorage\\\\Initialize-Volume\",\"ListItemText\":\"Initialize-Volum" - }, - { - "type": "output", - "data": "e\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Initialize-Volume\"},{\"CompletionText\":\"PowerShellGet\\\\inmo\",\"ListItemText\":\"inmo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\inmo\"},{\"CompletionText\":\"PowerShellGet\\\\Install-Module\",\"ListItemText\":\"Install-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Install-Script\",\"ListItemText\":\"Install-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nInstall-Script \\r\\n\"},{\"CompletionText\":\"C:\\\\WINDOWS\\\\system32\\\\klist.exe\",\"ListItemText\":\"klist.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\klist.exe\"},{\"CompletionText\":\"Hyper-V\\\\mvmr\",\"ListItemText\":\"mvmr\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\mvmr\"},{\"CompletionText\":\"VMDirectStorage\\\\mvmr\",\"ListItemText\":\"mvmr\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\mvmr\"},{\"CompletionText\":\"CimCmdlets\\\\ncim\",\"ListItemText\":\"ncim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\ncim\"},{\"CompletionText\":\"CimCmdlets\\\\ncms\",\"ListItemText\":\"ncms\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\ncms\"},{\"CompletionText\":\"CimCmdlets\\\\ncso\",\"ListItemText\":\"ncso\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\ncso\"},{\"CompletionText\":\"DefenderPerformance\\\\New-MpPerformanceRecording\",\"ListItemText\":\"New-MpPerformanceRecording\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-MpPerformanceRecording \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\New-ScriptFileInfo\",\"ListItemText\":\"New-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nNew-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"C:\\\\WINDOWS\\\\system32\\\\notepad.exe\",\"ListItemText\":\"notepad.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\notepad.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\notepad.exe\",\"ListItemText\":\"notepad.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\notepad.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip.exe\",\"ListItemText\":\"pip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip.exe\",\"ListItemText\":\"pip.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip3.exe\",\"ListItemText\":\"pip3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\Scripts\\\\pip3.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip3.exe\",\"ListItemText\":\"pip3.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pip3.exe\"},{\"CompletionText\":\"PSReadLine\\\\PSConsoleHostReadLine\",\"ListItemText\":\"PSConsoleHostReadLine\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPSConsoleHostReadLine \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Publish-Module\",\"ListItemText\":\"Publish-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Publish-Script\",\"ListItemText\":\"Publish-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nPublish-Script \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\pumo\",\"ListItemText\":\"pumo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\pumo\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh.exe\",\"ListItemText\":\"pwsh.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\python.exe\",\"ListItemText\":\"python.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\python.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python.exe\",\"ListItemText\":\"python.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\python.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\pythonw.exe\",\"ListItemText\":\"pythonw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python310\\\\pythonw.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw.exe\",\"ListItemText\":\"pythonw.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pythonw.exe\"},{\"CompletionText\":\"CimCmdlets\\\\rcie\",\"ListItemText\":\"rcie\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\rcie\"},{\"CompletionText\":\"CimCmdlets\\\\rcim\",\"ListItemText\":\"rcim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\rcim\"},{\"CompletionText\":\"CimCmdlets\\\\rcms\",\"ListItemText\":\"rcms\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\rcms\"},{\"CompletionText\":\"PowerShellGet\\\\Register-PSRepository\",\"ListItemText\":\"Register-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRegister-PSRepository \\r\\n\"},{\"CompletionText\":\"Defender\\\\Remove-MpPreference\",\"ListItemText\":\"Remove-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpPreference \\r\\n\"},{\"CompletionText\":\"Defender\\\\Remove-MpThreat\",\"ListItemText\":\"Remove-MpThreat\",\"ResultType\":2,\"ToolTip\":\"\\r\\nRemove-MpThreat \\r\\n\"},{\"CompletionText\":\"VMDirectStorage\\\\Remove-VMCheckpoint\",\"ListItemText\":\"Remove-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Remove-VMCheckpoint\"},{\"CompletionText\":\"VMDirectStorage\\\\Rename-VMCheckpoint\",\"ListItemText\":\"Rename-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Rename-VMCheckpoint\"},{\"CompletionText\":\"VMDirectStorage\\\\Restore-VMCheckpoint\",\"ListItemText\":\"Restore-VMCheckpoint\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Restore-VMCheckpoint\"},{\"CompletionText\":\"PowerShellGet\\\\Save-Module\",\"ListItemText\":\"Save-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Save-Script\",\"ListItemText\":\"Save-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSave-Script \\r\\n\"},{\"CompletionText\":\"Hyper-V\\\\savm\",\"ListItemText\":\"savm\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\savm\"},{\"CompletionText\":\"VMDirectStorage\\\\savm\",\"ListItemText\":\"savm\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\savm\"},{\"CompletionText\":\"CimCmdlets\\\\scim\",\"ListItemText\":\"scim\",\"ResultType\":2,\"ToolTip\":\"CimCmdlets\\\\scim\"},{\"CompletionText\":\"PSDiagnostics\\\\Set-LogProperties\",\"ListItemText\":\"Set-LogProperties\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-LogProperties \\r\\n\"},{\"CompletionText\":\"Defender\\\\Set-MpPreference\",\"ListItemText\":\"Set-MpPreference\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-MpPreference \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Set-PSRepository\",\"ListItemText\":\"Set-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nSet-PSRepository \\r\\n\"},{\"CompletionText\":\"Hyper-V\\\\spvm\",\"ListItemText\":\"spvm\",\"ResultType\":2,\"ToolTip\":\"Hyper-V\\\\spvm\"},{\"CompletionText\":\"VMDirectStorage\\\\spvm\",\"ListItemText\":\"spvm\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\spvm\"},{\"CompletionText\":\"Defender\\\\Start-MpRollback\",\"ListItemText\":\"Start-MpRollback\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpRollback \\r\\n\"},{\"CompletionText\":\"Defender\\\\Start-MpScan\",\"ListItemText\":\"Start-MpScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpScan \\r\\n\"},{\"CompletionText\":\"Defender\\\\Start-MpWDOScan\",\"ListItemText\":\"Start-MpWDOScan\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-MpWDOScan \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Start-Trace\",\"ListItemText\":\"Start-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStart-Trace \\r\\n\"},{\"CompletionText\":\"PSDiagnostics\\\\Stop-Trace\",\"ListItemText\":\"Stop-Trace\",\"ResultType\":2,\"ToolTip\":\"\\r\\nStop-Trace \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Test-ScriptFileInfo\",\"ListItemText\":\"Test-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nTest-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Uninstall-Module\",\"ListItemText\":\"Uninstall-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Uninstall-Script\",\"ListItemText\":\"Uninstall-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUninstall-Script \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Unregister-PSRepository\",\"ListItemText\":\"Unregister-PSRepository\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUnregister-PSRepository \\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"Az.Sql\\\\Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ListItemText\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\",\"ResultType\":2,\"ToolTip\":\"Update-AzSqlInstanceDatabaseVulnerabilityAssessmentSetting\\r\\n\"},{\"CompletionText\":\"PSDesiredStateConfiguration\\\\Update-DscConfiguration\",\"ListItemText\":\"Update-DscConfiguration\",\"ResultType\":2,\"ToolTip\":\"Update-DscConfiguration\\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-Module\",\"ListItemText\":\"Update-Module\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Module \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-ModuleManifest\",\"ListItemText\":\"Update-ModuleManifest\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ModuleManifest \\r\\n\"},{\"CompletionText\":\"Defender\\\\Update-MpSignature\",\"ListItemText\":\"Update-MpSignature\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-MpSignature \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-Script\",\"ListItemText\":\"Update-Script\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-Script \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\Update-ScriptFileInfo\",\"ListItemText\":\"Update-ScriptFileInfo\",\"ResultType\":2,\"ToolTip\":\"\\r\\nUpdate-ScriptFileInfo \\r\\n\"},{\"CompletionText\":\"PowerShellGet\\\\upmo\",\"ListItemText\":\"upmo\",\"ResultType\":2,\"ToolTip\":\"PowerShellGet\\\\upmo\"},{\"CompletionText\":\"'C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpr.exe'\",\"ListItemText\":\"wpr.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Program Files (x86)\\\\Windows Kits\\\\10\\\\Windows Performance Toolkit\\\\wpr.exe\"},{\"CompletionText\":\"VMDirectStorage\\\\Write-FileSystemCache\",\"ListItemText\":\"Write-FileSystemCache\",\"ResultType\":2,\"ToolTip\":\"VMDirectStorage\\\\Write-FileSystemCache\"},{\"CompletionText\":\"C:\\\\WINDOWS\\\\system32\\\\write.exe\",\"ListItemText\":\"write.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\WINDOWS\\\\system32\\\\write.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wsl.exe\",\"ListItemText\":\"wsl.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wsl.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslconfig.exe\",\"ListItemText\":\"wslconfig.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslconfig.exe\"},{\"CompletionText\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslg.exe\",\"ListItemText\":\"wslg.exe\",\"ResultType\":2,\"ToolTip\":\"C:\\\\Users\\\\Daniel\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\wslg.exe\"}]\u0007\u001b]633;A\u0007\u001b]633;P;Cwd=C:\\x5cGithub\\x5cTyriar\\x5cxterm.js\u0007\u001b]633;B\u0007\u001b[34m\r\n\u001b[38;2;17;17;17m\u001b[44m11:25:16 \u001b[34m\u001b[41mî‚° \u001b[38;2;17;17;17mxterm.js\u001b[39m \u001b[31m\u001b[43mî‚° \u001b[38;2;17;17;17mî‚  base64 \u001b[33m\u001b[46mî‚° \u001b[38;2;17;17;17m$? \u001b[36m\u001b[49mî‚° \u001b[mis \u001b[38;5;208m\u001b[1m v5.5.0\u001b[m via \u001b[32m\u001b[1m v20.14.0 \r\nâ¯\u001b[m " - }, - { - "type": "promptInputChange", - "data": "|" - }, - { - "type": "input", - "data": "g" - }, - { - "type": "output", - "data": "\u001b[93mg\u001b[97m\u001b[2m\u001b[3mit diff\u001b[9;4H" - }, - { - "type": "promptInputChange", - "data": "g|[it diff]" - }, - { - "type": "sendText", - "data": "\u001b[24~e" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "output", - "data": "\u001b]633;Completions;;;1;{\"CompletionText\":\"$Global:\",\"ListItemText\":\"Global:\",\"ResultType\":9,\"ToolTip\":\"Global:\"}\u0007" - }, - { - "type": "input", - "data": "e" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\bge\u001b[97m\u001b[2m\u001b[3mt-Content\u001b[9;5H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "ge|[t-Cont]" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "t" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget\u001b[97m\u001b[2m\u001b[3m-Content\u001b[9;6H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get|[-Cont]" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "-" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-\u001b[97m\u001b[2m\u001b[3mContent\u001b[9;7H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get-|[Cont]" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "c" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-c\u001b[97m\u001b[2m\u001b[3montent\u001b[9;8H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get-c|[ont]" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "o" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-co\u001b[97m\u001b[2m\u001b[3mntent\u001b[9;9H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get-co|[nt]" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "n" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-con\u001b[97m\u001b[2m\u001b[3mtent\u001b[9;10H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get-con|[t]" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "t" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-cont\u001b[97m\u001b[2m\u001b[3ment\r\u001b[?25h\u001b[m" - }, - { - "type": "promptInputChange", - "data": "get-conte|nt" - }, - { - "type": "input", - "data": "e" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-conte\u001b[97m\u001b[2m\u001b[3mnt\u001b[10;2H\u001b[?25h" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "n" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-conten\u001b[97m\u001b[2m\u001b[3mt\b\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get-conten|t" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "t" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3Hget-content\u001b[97m\u001b[2m\u001b[3m -ReadCount\u001b[10;4H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "get-content| -ReadC" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "command", - "id": "workbench.action.terminal.acceptSelectedSuggestion" - }, - { - "type": "sendText", - "data": "Get-Content" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content\u001b[97m\u001b[2m\u001b[3m -ReadCount\u001b[10;4H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "Get-Content| -ReadC" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": " " - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[97m\u001b[2m\u001b[3m-ReadCount\u001b[10;5H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "Get-Content |-ReadC" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "input", - "data": "-" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[m-\u001b[97m\u001b[2m\u001b[3mReadCount\u001b[10;6H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "Get-Content -|ReadC" - }, - { - "type": "sendText", - "data": "\u001b[24~e" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "output", - "data": "\u001b]633;Completions;12;1;13;[{\"CompletionText\":\"-ReadCount\",\"ListItemText\":\"ReadCount\",\"ResultType\":7,\"ToolTip\":\"[long] ReadCount\"},{\"CompletionText\":\"-TotalCount\",\"ListItemText\":\"TotalCount\",\"ResultType\":7,\"ToolTip\":\"[long] TotalCount\"},{\"CompletionText\":\"-Tail\",\"ListItemText\":\"Tail\",\"ResultType\":7,\"ToolTip\":\"[int] Tail\"},{\"CompletionText\":\"-Path\",\"ListItemText\":\"Path\",\"ResultType\":7,\"ToolTip\":\"[string[]] Path\"},{\"CompletionText\":\"-LiteralPath\",\"ListItemText\":\"LiteralPath\",\"ResultType\":7,\"ToolTip\":\"[string[]] LiteralPath\"},{\"CompletionText\":\"-Filter\",\"ListItemText\":\"Filter\",\"ResultType\":7,\"ToolTip\":\"[string] Filter\"},{\"CompletionText\":\"-Include\",\"ListItemText\":\"Include\",\"ResultType\":7,\"ToolTip\":\"[string[]] Include\"},{\"CompletionText\":\"-Exclude\",\"ListItemText\":\"Exclude\",\"ResultType\":7,\"ToolTip\":\"[string[]] Exclude\"},{\"CompletionText\":\"-Force\",\"ListItemText\":\"Force\",\"ResultType\":7,\"ToolTip\":\"[switch] Force\"},{\"CompletionText\":\"-Credential\",\"ListItemText\":\"Credential\",\"ResultType\":7,\"ToolTip\":\"[pscredential] Credential\"},{\"CompletionText\":\"-Delimiter\",\"ListItemText\":\"Delimiter\",\"ResultType\":7,\"ToolTip\":\"[string] Delimiter\"},{\"CompletionText\":\"-Wait\",\"ListItemText\":\"Wait\",\"ResultType\":7,\"ToolTip\":\"[switch] Wait\"},{\"CompletionText\":\"-Raw\",\"ListItemText\":\"Raw\",\"ResultType\":7,\"ToolTip\":\"[switch] Raw\"},{\"CompletionText\":\"-Encoding\",\"ListItemText\":\"Encoding\",\"ResultType\":7,\"ToolTip\":\"[Encoding] Encoding\"},{\"CompletionText\":\"-AsByteStream\",\"ListItemText\":\"AsByteStream\",\"ResultType\":7,\"ToolTip\":\"[switch] AsByteStream\"},{\"CompletionText\":\"-Stream\",\"ListItemText\":\"Stream\",\"ResultType\":7,\"ToolTip\":\"[string] Stream\"},{\"CompletionText\":\"-Verbose\",\"ListItemText\":\"Verbose\",\"ResultType\":7,\"ToolTip\":\"[switch] Verbose\"},{\"CompletionText\":\"-Debug\",\"ListItemText\":\"Debug\",\"ResultType\":7,\"ToolTip\":\"[switch] Debug\"},{\"CompletionText\":\"-ErrorAction\",\"ListItemText\":\"ErrorAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] ErrorAction\"},{\"CompletionText\":\"-WarningAction\",\"ListItemText\":\"WarningAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] WarningAction\"},{\"CompletionText\":\"-InformationAction\",\"ListItemText\":\"InformationAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] InformationAction\"},{\"CompletionText\":\"-ProgressAction\",\"ListItemText\":\"ProgressAction\",\"ResultType\":7,\"ToolTip\":\"[ActionPreference] ProgressAction\"},{\"CompletionText\":\"-ErrorVariable\",\"ListItemText\":\"ErrorVariable\",\"ResultType\":7,\"ToolTip\":\"[string] ErrorVariable\"},{\"CompletionText\":\"-WarningVariable\",\"ListItemText\":\"WarningVariable\",\"ResultType\":7,\"ToolTip\":\"[string] WarningVariable\"},{\"CompletionText\":\"-InformationVariable\",\"ListItemText\":\"InformationVariable\",\"ResultType\":7,\"ToolTip\":\"[string] InformationVariable\"},{\"CompletionText\":\"-OutVariable\",\"ListItemText\":\"OutVariable\",\"ResultType\":7,\"ToolTip\":\"[string] OutVariable\"},{\"CompletionText\":\"-OutBuffer\",\"ListItemText\":\"OutBuffer\",\"ResultType\":7,\"ToolTip\":\"[int] OutBuffer\"},{\"CompletionText\":\"-PipelineVariable\",\"ListItemText\":\"PipelineVariable\",\"ResultType\":7,\"ToolTip\":\"[string] PipelineVariable\"}]\u0007" - }, - { - "type": "input", - "data": "r" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[90m-r\u001b[97m\u001b[2m\u001b[3meadCount\u001b[10;7H\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "Get-Content -r|eadC" - }, - { - "type": "output", - "data": "\u001b[m" - }, - { - "type": "command", - "id": "workbench.action.terminal.acceptSelectedSuggestion" - }, - { - "type": "sendText", - "data": "-ReadCount" - }, - { - "type": "output", - "data": "\u001b[?25l\u001b[93m\u001b[9;3HGet-Content \u001b[90m-ReadCount\u001b[?25h" - }, - { - "type": "promptInputChange", - "data": "Get-Content -ReadCount|" - }, - { - "type": "output", - "data": "\u001b[m" - } -] diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts index 83950c2998034..90c2efa5e75a0 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts @@ -25,7 +25,6 @@ import { events as macos_bash_echo_simple } from 'vs/workbench/contrib/terminalC import { events as macos_bash_echo_multiline } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/macos_bash_echo_multiline'; import { events as windows11_pwsh_getcontent_delete_ghost } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_delete_ghost'; import { events as windows11_pwsh_getcontent_file } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_file'; -import { events as windows11_pwsh_getcontent_wrapped } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_getcontent_wrapped'; import { events as windows11_pwsh_input_ls_complete_ls } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_input_ls_complete_ls'; import { events as windows11_pwsh_namespace_completion } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_namespace_completion'; import { events as windows11_pwsh_type_before_prompt } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_type_before_prompt'; @@ -37,7 +36,6 @@ const recordedTestCases: { name: string; events: RecordedSessionEvent[] }[] = [ { name: 'macos_bash_echo_multiline', events: macos_bash_echo_multiline as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_getcontent_delete_ghost', events: windows11_pwsh_getcontent_delete_ghost as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_getcontent_file', events: windows11_pwsh_getcontent_file as any as RecordedSessionEvent[] }, - { name: 'windows11_pwsh_getcontent_wrapped', events: windows11_pwsh_getcontent_wrapped as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_input_ls_complete_ls', events: windows11_pwsh_input_ls_complete_ls as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_namespace_completion', events: windows11_pwsh_namespace_completion as any as RecordedSessionEvent[] }, { name: 'windows11_pwsh_type_before_prompt', events: windows11_pwsh_type_before_prompt as any as RecordedSessionEvent[] }, From 18d177df4c9715ff3dbb43f22b98d6179ff78477 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:55:51 -0700 Subject: [PATCH 315/755] Fix test as filtering changed --- .../windows11_pwsh_namespace_completion.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_namespace_completion.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_namespace_completion.ts index 01dcca0141a34..ee34782834a95 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_namespace_completion.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_namespace_completion.ts @@ -81,17 +81,25 @@ export const events = [ "type": "output", "data": "\u001b]633;Completions;1;1;2;[{\"CompletionText\":\"ref\",\"ListItemText\":\"PSReference\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.PSReference\"},{\"CompletionText\":\"System.Random\",\"ListItemText\":\"Random\",\"ResultType\":11,\"ToolTip\":\"System.Random\"},{\"CompletionText\":\"System.IO.RandomAccess\",\"ListItemText\":\"RandomAccess\",\"ResultType\":11,\"ToolTip\":\"System.IO.RandomAccess\"},{\"CompletionText\":\"System.Security.Cryptography.RandomNumberGenerator\",\"ListItemText\":\"RandomNumberGenerator\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RandomNumberGenerator\"},{\"CompletionText\":\"System.Range\",\"ListItemText\":\"Range\",\"ResultType\":11,\"ToolTip\":\"System.Range\"},{\"CompletionText\":\"System.ComponentModel.DataAnnotations.RangeAttribute\",\"ListItemText\":\"RangeAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.DataAnnotations.RangeAttribute\"},{\"CompletionText\":\"System.Net.Http.Headers.RangeConditionHeaderValue\",\"ListItemText\":\"RangeConditionHeaderValue\",\"ResultType\":11,\"ToolTip\":\"System.Net.Http.Headers.RangeConditionHeaderValue\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RangeExpressionSyntax\",\"ListItemText\":\"RangeExpressionSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RangeExpressionSyntax\"},{\"CompletionText\":\"System.Net.Http.Headers.RangeHeaderValue\",\"ListItemText\":\"RangeHeaderValue\",\"ResultType\":11,\"ToolTip\":\"System.Net.Http.Headers.RangeHeaderValue\"},{\"CompletionText\":\"System.Net.Http.Headers.RangeItemHeaderValue\",\"ListItemText\":\"RangeItemHeaderValue\",\"ResultType\":11,\"ToolTip\":\"System.Net.Http.Headers.RangeItemHeaderValue\"},{\"CompletionText\":\"System.RankException\",\"ListItemText\":\"RankException\",\"ResultType\":11,\"ToolTip\":\"System.RankException\"},{\"CompletionText\":\".Interop+Gdi32+RasterOp\",\"ListItemText\":\"RasterOp\",\"ResultType\":11,\"ToolTip\":\".Interop+Gdi32+RasterOp\"},{\"CompletionText\":\"System.Security.AccessControl.RawAcl\",\"ListItemText\":\"RawAcl\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.RawAcl\"},{\"CompletionText\":\"System.Security.AccessControl.RawSecurityDescriptor\",\"ListItemText\":\"RawSecurityDescriptor\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.RawSecurityDescriptor\"},{\"CompletionText\":\"Microsoft.Cci.MetadataWriter+RawTokenEncoding\",\"ListItemText\":\"RawTokenEncoding\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Cci.MetadataWriter+RawTokenEncoding\"},{\"CompletionText\":\"JetBrains.Annotations.RazorDirectiveAttribute\",\"ListItemText\":\"RazorDirectiveAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorDirectiveAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorHelperCommonAttribute\",\"ListItemText\":\"RazorHelperCommonAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorHelperCommonAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorImportNamespaceAttribute\",\"ListItemText\":\"RazorImportNamespaceAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorImportNamespaceAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorInjectionAttribute\",\"ListItemText\":\"RazorInjectionAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorInjectionAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorLayoutAttribute\",\"ListItemText\":\"RazorLayoutAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorLayoutAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorPageBaseTypeAttribute\",\"ListItemText\":\"RazorPageBaseTypeAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorPageBaseTypeAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorSectionAttribute\",\"ListItemText\":\"RazorSectionAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorSectionAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorWriteLiteralMethodAttribute\",\"ListItemText\":\"RazorWriteLiteralMethodAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorWriteLiteralMethodAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorWriteMethodAttribute\",\"ListItemText\":\"RazorWriteMethodAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorWriteMethodAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RazorWriteMethodParameterAttribute\",\"ListItemText\":\"RazorWriteMethodParameterAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RazorWriteMethodParameterAttribute\"},{\"CompletionText\":\"System.Security.Cryptography.RC2\",\"ListItemText\":\"RC2\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RC2\"},{\"CompletionText\":\"System.Security.Cryptography.RC2CryptoServiceProvider\",\"ListItemText\":\"RC2CryptoServiceProvider\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RC2CryptoServiceProvider\"},{\"CompletionText\":\"System.Runtime.Intrinsics.Arm.Rdm\",\"ListItemText\":\"Rdm\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.Intrinsics.Arm.Rdm\"},{\"CompletionText\":\"System.Xml.Linq.ReaderOptions\",\"ListItemText\":\"ReaderOptions\",\"ResultType\":11,\"ToolTip\":\"System.Xml.Linq.ReaderOptions\"},{\"CompletionText\":\"System.Threading.ReaderWriterLock\",\"ListItemText\":\"ReaderWriterLock\",\"ResultType\":11,\"ToolTip\":\"System.Threading.ReaderWriterLock\"},{\"CompletionText\":\"System.Threading.ReaderWriterLockSlim\",\"ListItemText\":\"ReaderWriterLockSlim\",\"ResultType\":11,\"ToolTip\":\"System.Threading.ReaderWriterLockSlim\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.ReadHostCommand\",\"ListItemText\":\"ReadHostCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.ReadHostCommand\"},{\"CompletionText\":\"System.Management.Automation.Host.ReadKeyOptions\",\"ListItemText\":\"ReadKeyOptions\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Host.ReadKeyOptions\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyActiveDirectorySchemaClassCollection\",\"ListItemText\":\"ReadOnlyActiveDirectorySchemaClassCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyActiveDirectorySchemaClassCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyActiveDirectorySchemaPropertyCollection\",\"ListItemText\":\"ReadOnlyActiveDirectorySchemaPropertyCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyActiveDirectorySchemaPropertyCollection\"},{\"CompletionText\":\"System.ComponentModel.ReadOnlyAttribute\",\"ListItemText\":\"ReadOnlyAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.ReadOnlyAttribute\"},{\"CompletionText\":\"System.Collections.ObjectModel.ReadOnlyCollection\",\"ListItemText\":\"ReadOnlyCollection<>\",\"ResultType\":11,\"ToolTip\":\"System.Collections.ObjectModel.ReadOnlyCollection[T]\"},{\"CompletionText\":\"System.Collections.ReadOnlyCollectionBase\",\"ListItemText\":\"ReadOnlyCollectionBase\",\"ResultType\":11,\"ToolTip\":\"System.Collections.ReadOnlyCollectionBase\"},{\"CompletionText\":\"System.Runtime.CompilerServices.ReadOnlyCollectionBuilder\",\"ListItemText\":\"ReadOnlyCollectionBuilder<>\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.ReadOnlyCollectionBuilder[T]\"},{\"CompletionText\":\"System.Collections.ObjectModel.ReadOnlyDictionary\",\"ListItemText\":\"ReadOnlyDictionary<>\",\"ResultType\":11,\"ToolTip\":\"System.Collections.ObjectModel.ReadOnlyDictionary[T1, T2]\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyDirectoryServerCollection\",\"ListItemText\":\"ReadOnlyDirectoryServerCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyDirectoryServerCollection\"},{\"CompletionText\":\"System.Data.ReadOnlyException\",\"ListItemText\":\"ReadOnlyException\",\"ResultType\":11,\"ToolTip\":\"System.Data.ReadOnlyException\"},{\"CompletionText\":\"Json.Schema.ReadOnlyKeyword\",\"ListItemText\":\"ReadOnlyKeyword\",\"ResultType\":11,\"ToolTip\":\"Json.Schema.ReadOnlyKeyword\"},{\"CompletionText\":\"System.ReadOnlyMemory\",\"ListItemText\":\"ReadOnlyMemory<>\",\"ResultType\":11,\"ToolTip\":\"System.ReadOnlyMemory[T]\"},{\"CompletionText\":\"System.Net.Http.ReadOnlyMemoryContent\",\"ListItemText\":\"ReadOnlyMemoryContent\",\"ResultType\":11,\"ToolTip\":\"System.Net.Http.ReadOnlyMemoryContent\"},{\"CompletionText\":\"System.Collections.ObjectModel.ReadOnlyObservableCollection\",\"ListItemText\":\"ReadOnlyObservableCollection<>\",\"ResultType\":11,\"ToolTip\":\"System.Collections.ObjectModel.ReadOnlyObservableCollection[T]\"},{\"CompletionText\":\"System.Management.Automation.ReadOnlyPSMemberInfoCollection\",\"ListItemText\":\"ReadOnlyPSMemberInfoCollection<>\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.ReadOnlyPSMemberInfoCollection[T]\"},{\"CompletionText\":\"System.Buffers.ReadOnlySequence\",\"ListItemText\":\"ReadOnlySequence<>\",\"ResultType\":11,\"ToolTip\":\"System.Buffers.ReadOnlySequence[T]\"},{\"CompletionText\":\"System.Buffers.ReadOnlySequenceSegment\",\"ListItemText\":\"ReadOnlySequenceSegment<>\",\"ResultType\":11,\"ToolTip\":\"System.Buffers.ReadOnlySequenceSegment[T]\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlySiteCollection\",\"ListItemText\":\"ReadOnlySiteCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlySiteCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlySiteLinkBridgeCollection\",\"ListItemText\":\"ReadOnlySiteLinkBridgeCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlySiteLinkBridgeCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlySiteLinkCollection\",\"ListItemText\":\"ReadOnlySiteLinkCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlySiteLinkCollection\"},{\"CompletionText\":\"System.ReadOnlySpan\",\"ListItemText\":\"ReadOnlySpan<>\",\"ResultType\":11,\"ToolTip\":\"System.ReadOnlySpan[T]\"},{\"CompletionText\":\"System.Buffers.ReadOnlySpanAction\",\"ListItemText\":\"ReadOnlySpanAction<>\",\"ResultType\":11,\"ToolTip\":\"System.Buffers.ReadOnlySpanAction[T1, T2]\"},{\"CompletionText\":\"System.Runtime.InteropServices.Marshalling.ReadOnlySpanMarshaller\",\"ListItemText\":\"ReadOnlySpanMarshaller<>\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.InteropServices.Marshalling.ReadOnlySpanMarshaller[T1, T2]\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyStringCollection\",\"ListItemText\":\"ReadOnlyStringCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReadOnlyStringCollection\"},{\"CompletionText\":\"System.Xml.ReadState\",\"ListItemText\":\"ReadState\",\"ResultType\":11,\"ToolTip\":\"System.Xml.ReadState\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.ReceiveJobCommand\",\"ListItemText\":\"ReceiveJobCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.ReceiveJobCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.ReceivePSSessionCommand\",\"ListItemText\":\"ReceivePSSessionCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.ReceivePSSessionCommand\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.RecipientInfo\",\"ListItemText\":\"RecipientInfo\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.RecipientInfo\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.RecipientInfoCollection\",\"ListItemText\":\"RecipientInfoCollection\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.RecipientInfoCollection\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.RecipientInfoEnumerator\",\"ListItemText\":\"RecipientInfoEnumerator\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.RecipientInfoEnumerator\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.RecipientInfoType\",\"ListItemText\":\"RecipientInfoType\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.RecipientInfoType\"},{\"CompletionText\":\"System.Speech.Recognition.RecognitionEventArgs\",\"ListItemText\":\"RecognitionEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognitionEventArgs\"},{\"CompletionText\":\"System.Speech.Recognition.RecognitionResult\",\"ListItemText\":\"RecognitionResult\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognitionResult\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizeCompletedEventArgs\",\"ListItemText\":\"RecognizeCompletedEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizeCompletedEventArgs\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizedAudio\",\"ListItemText\":\"RecognizedAudio\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizedAudio\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizedPhrase\",\"ListItemText\":\"RecognizedPhrase\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizedPhrase\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizedWordUnit\",\"ListItemText\":\"RecognizedWordUnit\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizedWordUnit\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizeMode\",\"ListItemText\":\"RecognizeMode\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizeMode\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizerInfo\",\"ListItemText\":\"RecognizerInfo\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizerInfo\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizerState\",\"ListItemText\":\"RecognizerState\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizerState\"},{\"CompletionText\":\"System.Speech.Recognition.RecognizerUpdateReachedEventArgs\",\"ListItemText\":\"RecognizerUpdateReachedEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.RecognizerUpdateReachedEventArgs\"},{\"CompletionText\":\"System.ComponentModel.RecommendedAsConfigurableAttribute\",\"ListItemText\":\"RecommendedAsConfigurableAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RecommendedAsConfigurableAttribute\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax\",\"ListItemText\":\"RecordDeclarationSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax\"},{\"CompletionText\":\".Interop+Gdi32+RECT\",\"ListItemText\":\"RECT\",\"ResultType\":11,\"ToolTip\":\".Interop+Gdi32+RECT\"},{\"CompletionText\":\"System.Drawing.Rectangle\",\"ListItemText\":\"Rectangle\",\"ResultType\":11,\"ToolTip\":\"System.Drawing.Rectangle\"},{\"CompletionText\":\"System.Management.Automation.Host.Rectangle\",\"ListItemText\":\"Rectangle\",\"ResultType\":11,\"ToolTip\":\"Struct System.Management.Automation.Host.Rectangle\"},{\"CompletionText\":\"System.Drawing.RectangleConverter\",\"ListItemText\":\"RectangleConverter\",\"ResultType\":11,\"ToolTip\":\"System.Drawing.RectangleConverter\"},{\"CompletionText\":\"System.Drawing.RectangleF\",\"ListItemText\":\"RectangleF\",\"ResultType\":11,\"ToolTip\":\"System.Drawing.RectangleF\"},{\"CompletionText\":\"Json.Schema.RecursiveAnchorKeyword\",\"ListItemText\":\"RecursiveAnchorKeyword\",\"ResultType\":11,\"ToolTip\":\"Json.Schema.RecursiveAnchorKeyword\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RecursivePatternSyntax\",\"ListItemText\":\"RecursivePatternSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RecursivePatternSyntax\"},{\"CompletionText\":\"Json.Schema.RecursiveRefKeyword\",\"ListItemText\":\"RecursiveRefKeyword\",\"ResultType\":11,\"ToolTip\":\"Json.Schema.RecursiveRefKeyword\"},{\"CompletionText\":\"Microsoft.VisualBasic.FileIO.RecycleOption\",\"ListItemText\":\"RecycleOption\",\"ResultType\":11,\"ToolTip\":\"Microsoft.VisualBasic.FileIO.RecycleOption\"},{\"CompletionText\":\"System.Management.Automation.RedirectedException\",\"ListItemText\":\"RedirectedException\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RedirectedException\"},{\"CompletionText\":\"System.Management.Automation.Language.RedirectionAst\",\"ListItemText\":\"RedirectionAst\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Language.RedirectionAst\"},{\"CompletionText\":\"System.Management.Automation.Language.RedirectionStream\",\"ListItemText\":\"RedirectionStream\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Language.RedirectionStream\"},{\"CompletionText\":\"System.Management.Automation.Language.RedirectionToken\",\"ListItemText\":\"RedirectionToken\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Language.RedirectionToken\"},{\"CompletionText\":\"System.Security.Cryptography.Xml.Reference\",\"ListItemText\":\"Reference\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Xml.Reference\"},{\"CompletionText\":\"System.Runtime.CompilerServices.ReferenceAssemblyAttribute\",\"ListItemText\":\"ReferenceAssemblyAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.ReferenceAssemblyAttribute\"},{\"CompletionText\":\"System.ComponentModel.ReferenceConverter\",\"ListItemText\":\"ReferenceConverter\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.ReferenceConverter\"},{\"CompletionText\":\"System.ServiceModel.Syndication.ReferencedCategoriesDocument\",\"ListItemText\":\"ReferencedCategoriesDocument\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.Syndication.ReferencedCategoriesDocument\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.ReferenceDirectiveTriviaSyntax\",\"ListItemText\":\"ReferenceDirectiveTriviaSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.ReferenceDirectiveTriviaSyntax\"},{\"CompletionText\":\"System.Collections.Generic.ReferenceEqualityComparer\",\"ListItemText\":\"ReferenceEqualityComparer\",\"ResultType\":11,\"ToolTip\":\"System.Collections.Generic.ReferenceEqualityComparer\"},{\"CompletionText\":\"System.Text.Json.Serialization.ReferenceHandler\",\"ListItemText\":\"ReferenceHandler\",\"ResultType\":11,\"ToolTip\":\"System.Text.Json.Serialization.ReferenceHandler\"},{\"CompletionText\":\"System.Security.Cryptography.Xml.ReferenceList\",\"ListItemText\":\"ReferenceList\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Xml.ReferenceList\"},{\"CompletionText\":\"Newtonsoft.Json.ReferenceLoopHandling\",\"ListItemText\":\"ReferenceLoopHandling\",\"ResultType\":11,\"ToolTip\":\"Newtonsoft.Json.ReferenceLoopHandling\"},{\"CompletionText\":\"System.Text.Json.Serialization.ReferenceResolver\",\"ListItemText\":\"ReferenceResolver\",\"ResultType\":11,\"ToolTip\":\"System.Text.Json.Serialization.ReferenceResolver\"},{\"CompletionText\":\"System.DirectoryServices.Protocols.ReferralCallback\",\"ListItemText\":\"ReferralCallback\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.Protocols.ReferralCallback\"},{\"CompletionText\":\"System.DirectoryServices.ReferralChasingOption\",\"ListItemText\":\"ReferralChasingOption\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ReferralChasingOption\"},{\"CompletionText\":\"System.DirectoryServices.Protocols.ReferralChasingOptions\",\"ListItemText\":\"ReferralChasingOptions\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.Protocols.ReferralChasingOptions\"},{\"CompletionText\":\"Markdig.Extensions.ReferralLinks.ReferralLinksExtension\",\"ListItemText\":\"ReferralLinksExtension\",\"ResultType\":11,\"ToolTip\":\"Markdig.Extensions.ReferralLinks.ReferralLinksExtension\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax\",\"ListItemText\":\"RefExpressionSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax\"},{\"CompletionText\":\"Json.Schema.RefKeyword\",\"ListItemText\":\"RefKeyword\",\"ResultType\":11,\"ToolTip\":\"Json.Schema.RefKeyword\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.RefKind\",\"ListItemText\":\"RefKind\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.RefKind\"},{\"CompletionText\":\"Newtonsoft.Json.Serialization.ReflectionAttributeProvider\",\"ListItemText\":\"ReflectionAttributeProvider\",\"ResultType\":11,\"ToolTip\":\"Newtonsoft.Json.Serialization.ReflectionAttributeProvider\"},{\"CompletionText\":\"System.Reflection.ReflectionContext\",\"ListItemText\":\"ReflectionContext\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.ReflectionContext\"},{\"CompletionText\":\"System.ComponentModel.Composition.ReflectionModel.ReflectionModelServices\",\"ListItemText\":\"ReflectionModelServices\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.Composition.ReflectionModel.ReflectionModelServices\"},{\"CompletionText\":\"System.Security.Permissions.ReflectionPermission\",\"ListItemText\":\"ReflectionPermission\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.ReflectionPermission\"},{\"CompletionText\":\"System.Security.Permissions.ReflectionPermissionAttribute\",\"ListItemText\":\"ReflectionPermissionAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.ReflectionPermissionAttribute\"},{\"CompletionText\":\"System.Security.Permissions.ReflectionPermissionFlag\",\"ListItemText\":\"ReflectionPermissionFlag\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.ReflectionPermissionFlag\"},{\"CompletionText\":\"System.Reflection.ReflectionTypeLoadException\",\"ListItemText\":\"ReflectionTypeLoadException\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.ReflectionTypeLoadException\"},{\"CompletionText\":\"System.Management.Automation.Language.ReflectionTypeName\",\"ListItemText\":\"ReflectionTypeName\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Language.ReflectionTypeName\"},{\"CompletionText\":\"Newtonsoft.Json.Serialization.ReflectionValueProvider\",\"ListItemText\":\"ReflectionValueProvider\",\"ResultType\":11,\"ToolTip\":\"Newtonsoft.Json.Serialization.ReflectionValueProvider\"},{\"CompletionText\":\"System.ComponentModel.RefreshEventArgs\",\"ListItemText\":\"RefreshEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RefreshEventArgs\"},{\"CompletionText\":\"System.ComponentModel.RefreshEventHandler\",\"ListItemText\":\"RefreshEventHandler\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RefreshEventHandler\"},{\"CompletionText\":\"System.ComponentModel.RefreshProperties\",\"ListItemText\":\"RefreshProperties\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RefreshProperties\"},{\"CompletionText\":\"System.ComponentModel.RefreshPropertiesAttribute\",\"ListItemText\":\"RefreshPropertiesAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RefreshPropertiesAttribute\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RefSafetyRulesAttribute\",\"ListItemText\":\"RefSafetyRulesAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RefSafetyRulesAttribute\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeExpressionSyntax\",\"ListItemText\":\"RefTypeExpressionSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeExpressionSyntax\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax\",\"ListItemText\":\"RefTypeSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefValueExpressionSyntax\",\"ListItemText\":\"RefValueExpressionSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RefValueExpressionSyntax\"},{\"CompletionText\":\"regex\",\"ListItemText\":\"Regex\",\"ResultType\":11,\"ToolTip\":\"Class System.Text.RegularExpressions.Regex\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexCompilationInfo\",\"ListItemText\":\"RegexCompilationInfo\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexCompilationInfo\"},{\"CompletionText\":\"Newtonsoft.Json.Converters.RegexConverter\",\"ListItemText\":\"RegexConverter\",\"ResultType\":11,\"ToolTip\":\"Newtonsoft.Json.Converters.RegexConverter\"},{\"CompletionText\":\"Json.Schema.RegexFormat\",\"ListItemText\":\"RegexFormat\",\"ResultType\":11,\"ToolTip\":\"Json.Schema.RegexFormat\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexMatchTimeoutException\",\"ListItemText\":\"RegexMatchTimeoutException\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexMatchTimeoutException\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexOptions\",\"ListItemText\":\"RegexOptions\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexOptions\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexParseError\",\"ListItemText\":\"RegexParseError\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexParseError\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexParseException\",\"ListItemText\":\"RegexParseException\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexParseException\"},{\"CompletionText\":\"JetBrains.Annotations.RegexPatternAttribute\",\"ListItemText\":\"RegexPatternAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RegexPatternAttribute\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexRunner\",\"ListItemText\":\"RegexRunner\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexRunner\"},{\"CompletionText\":\"System.Text.RegularExpressions.RegexRunnerFactory\",\"ListItemText\":\"RegexRunnerFactory\",\"ResultType\":11,\"ToolTip\":\"System.Text.RegularExpressions.RegexRunnerFactory\"},{\"CompletionText\":\"System.Configuration.RegexStringValidator\",\"ListItemText\":\"RegexStringValidator\",\"ResultType\":11,\"ToolTip\":\"System.Configuration.RegexStringValidator\"},{\"CompletionText\":\"System.Configuration.RegexStringValidatorAttribute\",\"ListItemText\":\"RegexStringValidatorAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Configuration.RegexStringValidatorAttribute\"},{\"CompletionText\":\"System.Drawing.Region\",\"ListItemText\":\"Region\",\"ResultType\":11,\"ToolTip\":\"System.Drawing.Region\"},{\"CompletionText\":\"System.Drawing.Drawing2D.RegionData\",\"ListItemText\":\"RegionData\",\"ResultType\":11,\"ToolTip\":\"System.Drawing.Drawing2D.RegionData\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RegionDirectiveTriviaSyntax\",\"ListItemText\":\"RegionDirectiveTriviaSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RegionDirectiveTriviaSyntax\"},{\"CompletionText\":\"System.Globalization.RegionInfo\",\"ListItemText\":\"RegionInfo\",\"ResultType\":11,\"ToolTip\":\"System.Globalization.RegionInfo\"},{\"CompletionText\":\"System.Management.Automation.RegisterArgumentCompleterCommand\",\"ListItemText\":\"RegisterArgumentCompleterCommand\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RegisterArgumentCompleterCommand\"},{\"CompletionText\":\"System.Threading.RegisteredWaitHandle\",\"ListItemText\":\"RegisteredWaitHandle\",\"ResultType\":11,\"ToolTip\":\"System.Threading.RegisteredWaitHandle\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RegisterEngineEventCommand\",\"ListItemText\":\"RegisterEngineEventCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RegisterEngineEventCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RegisterObjectEventCommand\",\"ListItemText\":\"RegisterObjectEventCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RegisterObjectEventCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RegisterPSSessionConfigurationCommand\",\"ListItemText\":\"RegisterPSSessionConfigurationCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RegisterPSSessionConfigurationCommand\"},{\"CompletionText\":\"System.ComponentModel.Composition.Registration.RegistrationBuilder\",\"ListItemText\":\"RegistrationBuilder\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.Composition.Registration.RegistrationBuilder\"},{\"CompletionText\":\"Microsoft.Win32.Registry\",\"ListItemText\":\"Registry\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.Registry\"},{\"CompletionText\":\"System.Security.AccessControl.RegistryAccessRule\",\"ListItemText\":\"RegistryAccessRule\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.RegistryAccessRule\"},{\"CompletionText\":\"Microsoft.Win32.RegistryAclExtensions\",\"ListItemText\":\"RegistryAclExtensions\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryAclExtensions\"},{\"CompletionText\":\"System.Security.AccessControl.RegistryAuditRule\",\"ListItemText\":\"RegistryAuditRule\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.RegistryAuditRule\"},{\"CompletionText\":\"Microsoft.Win32.RegistryHive\",\"ListItemText\":\"RegistryHive\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryHive\"},{\"CompletionText\":\"Microsoft.Win32.RegistryKey\",\"ListItemText\":\"RegistryKey\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryKey\"},{\"CompletionText\":\"Microsoft.Win32.RegistryKeyPermissionCheck\",\"ListItemText\":\"RegistryKeyPermissionCheck\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryKeyPermissionCheck\"},{\"CompletionText\":\"Microsoft.Win32.RegistryOptions\",\"ListItemText\":\"RegistryOptions\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryOptions\"},{\"CompletionText\":\"System.Security.Permissions.RegistryPermission\",\"ListItemText\":\"RegistryPermission\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.RegistryPermission\"},{\"CompletionText\":\"System.Security.Permissions.RegistryPermissionAccess\",\"ListItemText\":\"RegistryPermissionAccess\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.RegistryPermissionAccess\"},{\"CompletionText\":\"System.Security.Permissions.RegistryPermissionAttribute\",\"ListItemText\":\"RegistryPermissionAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.RegistryPermissionAttribute\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RegistryProvider\",\"ListItemText\":\"RegistryProvider\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RegistryProvider\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RegistryProviderSetItemDynamicParameter\",\"ListItemText\":\"RegistryProviderSetItemDynamicParameter\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RegistryProviderSetItemDynamicParameter\"},{\"CompletionText\":\"System.Security.AccessControl.RegistryRights\",\"ListItemText\":\"RegistryRights\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.RegistryRights\"},{\"CompletionText\":\"System.Security.AccessControl.RegistrySecurity\",\"ListItemText\":\"RegistrySecurity\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.RegistrySecurity\"},{\"CompletionText\":\"Microsoft.Win32.RegistryValueKind\",\"ListItemText\":\"RegistryValueKind\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryValueKind\"},{\"CompletionText\":\"Microsoft.Win32.RegistryValueOptions\",\"ListItemText\":\"RegistryValueOptions\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryValueOptions\"},{\"CompletionText\":\"Microsoft.Win32.RegistryView\",\"ListItemText\":\"RegistryView\",\"ResultType\":11,\"ToolTip\":\"Microsoft.Win32.RegistryView\"},{\"CompletionText\":\"System.ComponentModel.DataAnnotations.RegularExpressionAttribute\",\"ListItemText\":\"RegularExpressionAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.DataAnnotations.RegularExpressionAttribute\"},{\"CompletionText\":\"System.Management.RelatedObjectQuery\",\"ListItemText\":\"RelatedObjectQuery\",\"ResultType\":11,\"ToolTip\":\"System.Management.RelatedObjectQuery\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RelationalPatternSyntax\",\"ListItemText\":\"RelationalPatternSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.RelationalPatternSyntax\"},{\"CompletionText\":\"System.Management.RelationshipQuery\",\"ListItemText\":\"RelationshipQuery\",\"ResultType\":11,\"ToolTip\":\"System.Management.RelationshipQuery\"},{\"CompletionText\":\"Json.Pointer.RelativeJsonPointer\",\"ListItemText\":\"RelativeJsonPointer\",\"ResultType\":11,\"ToolTip\":\"Json.Pointer.RelativeJsonPointer\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.PooledObjects.PooledDelegates+Releaser\",\"ListItemText\":\"Releaser\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.PooledObjects.PooledDelegates+Releaser\"},{\"CompletionText\":\"System.Runtime.ConstrainedExecution.ReliabilityContractAttribute\",\"ListItemText\":\"ReliabilityContractAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.ConstrainedExecution.ReliabilityContractAttribute\"},{\"CompletionText\":\"System.ServiceModel.ReliableMessagingVersion\",\"ListItemText\":\"ReliableMessagingVersion\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.ReliableMessagingVersion\"},{\"CompletionText\":\"System.ServiceModel.ReliableSession\",\"ListItemText\":\"ReliableSession\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.ReliableSession\"},{\"CompletionText\":\"System.ServiceModel.Channels.ReliableSessionBindingElement\",\"ListItemText\":\"ReliableSessionBindingElement\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.Channels.ReliableSessionBindingElement\"},{\"CompletionText\":\"System.Net.Security.RemoteCertificateValidationCallback\",\"ListItemText\":\"RemoteCertificateValidationCallback\",\"ResultType\":11,\"ToolTip\":\"System.Net.Security.RemoteCertificateValidationCallback\"},{\"CompletionText\":\"System.Management.Automation.RemoteCommandInfo\",\"ListItemText\":\"RemoteCommandInfo\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RemoteCommandInfo\"},{\"CompletionText\":\"System.Management.Automation.RemoteException\",\"ListItemText\":\"RemoteException\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RemoteException\"},{\"CompletionText\":\"System.Management.Automation.Remoting.RemoteSessionNamedPipeServer\",\"ListItemText\":\"RemoteSessionNamedPipeServer\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Remoting.RemoteSessionNamedPipeServer\"},{\"CompletionText\":\"System.Management.Automation.RemoteStreamOptions\",\"ListItemText\":\"RemoteStreamOptions\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.RemoteStreamOptions\"},{\"CompletionText\":\"System.Management.Automation.RemotingBehavior\",\"ListItemText\":\"RemotingBehavior\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.RemotingBehavior\"},{\"CompletionText\":\"System.Management.Automation.RemotingCapability\",\"ListItemText\":\"RemotingCapability\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.RemotingCapability\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RemotingDebugRecord\",\"ListItemText\":\"RemotingDebugRecord\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RemotingDebugRecord\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RemotingErrorRecord\",\"ListItemText\":\"RemotingErrorRecord\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RemotingErrorRecord\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.Internal.RemotingErrorResources\",\"ListItemText\":\"RemotingErrorResources\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.Internal.RemotingErrorResources\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RemotingInformationRecord\",\"ListItemText\":\"RemotingInformationRecord\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RemotingInformationRecord\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RemotingProgressRecord\",\"ListItemText\":\"RemotingProgressRecord\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RemotingProgressRecord\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RemotingVerboseRecord\",\"ListItemText\":\"RemotingVerboseRecord\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RemotingVerboseRecord\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RemotingWarningRecord\",\"ListItemText\":\"RemotingWarningRecord\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RemotingWarningRecord\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveAliasCommand\",\"ListItemText\":\"RemoveAliasCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveAliasCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveEventCommand\",\"ListItemText\":\"RemoveEventCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveEventCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveItemCommand\",\"ListItemText\":\"RemoveItemCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveItemCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveItemPropertyCommand\",\"ListItemText\":\"RemoveItemPropertyCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveItemPropertyCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveJobCommand\",\"ListItemText\":\"RemoveJobCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveJobCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.RemoveKeyHandlerCommand\",\"ListItemText\":\"RemoveKeyHandlerCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.RemoveKeyHandlerCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveModuleCommand\",\"ListItemText\":\"RemoveModuleCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveModuleCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemovePSBreakpointCommand\",\"ListItemText\":\"RemovePSBreakpointCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemovePSBreakpointCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemovePSDriveCommand\",\"ListItemText\":\"RemovePSDriveCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemovePSDriveCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemovePSSessionCommand\",\"ListItemText\":\"RemovePSSessionCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemovePSSessionCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveServiceCommand\",\"ListItemText\":\"RemoveServiceCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveServiceCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveTypeDataCommand\",\"ListItemText\":\"RemoveTypeDataCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveTypeDataCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RemoveVariableCommand\",\"ListItemText\":\"RemoveVariableCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RemoveVariableCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RenameComputerChangeInfo\",\"ListItemText\":\"RenameComputerChangeInfo\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RenameComputerChangeInfo\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RenameComputerCommand\",\"ListItemText\":\"RenameComputerCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RenameComputerCommand\"},{\"CompletionText\":\"System.IO.RenamedEventArgs\",\"ListItemText\":\"RenamedEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.IO.RenamedEventArgs\"},{\"CompletionText\":\"System.IO.RenamedEventHandler\",\"ListItemText\":\"RenamedEventHandler\",\"ResultType\":11,\"ToolTip\":\"System.IO.RenamedEventHandler\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RenameItemCommand\",\"ListItemText\":\"RenameItemCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RenameItemCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RenameItemPropertyCommand\",\"ListItemText\":\"RenameItemPropertyCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RenameItemPropertyCommand\"},{\"CompletionText\":\"Markdig.Renderers.RendererBase\",\"ListItemText\":\"RendererBase\",\"ResultType\":11,\"ToolTip\":\"Markdig.Renderers.RendererBase\"},{\"CompletionText\":\"System.Speech.Recognition.ReplacementText\",\"ListItemText\":\"ReplacementText\",\"ResultType\":11,\"ToolTip\":\"System.Speech.Recognition.ReplacementText\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationConnection\",\"ListItemText\":\"ReplicationConnection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationConnection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationConnectionCollection\",\"ListItemText\":\"ReplicationConnectionCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationConnectionCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationCursor\",\"ListItemText\":\"ReplicationCursor\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationCursor\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationCursorCollection\",\"ListItemText\":\"ReplicationCursorCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationCursorCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationFailure\",\"ListItemText\":\"ReplicationFailure\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationFailure\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationFailureCollection\",\"ListItemText\":\"ReplicationFailureCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationFailureCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationNeighbor\",\"ListItemText\":\"ReplicationNeighbor\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationNeighbor\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationNeighborCollection\",\"ListItemText\":\"ReplicationNeighborCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationNeighborCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationNeighbor+ReplicationNeighborOptions\",\"ListItemText\":\"ReplicationNeighborOptions\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationNeighbor+ReplicationNeighborOptions\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperation\",\"ListItemText\":\"ReplicationOperation\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperation\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperationCollection\",\"ListItemText\":\"ReplicationOperationCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperationCollection\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperationInformation\",\"ListItemText\":\"ReplicationOperationInformation\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperationInformation\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperationType\",\"ListItemText\":\"ReplicationOperationType\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationOperationType\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationSecurityLevel\",\"ListItemText\":\"ReplicationSecurityLevel\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationSecurityLevel\"},{\"CompletionText\":\"System.DirectoryServices.ActiveDirectory.ReplicationSpan\",\"ListItemText\":\"ReplicationSpan\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ActiveDirectory.ReplicationSpan\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.ReportDiagnostic\",\"ListItemText\":\"ReportDiagnostic\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.ReportDiagnostic\"},{\"CompletionText\":\"System.Management.Automation.Repository\",\"ListItemText\":\"Repository<>\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Repository[T]\"},{\"CompletionText\":\"Microsoft.ApplicationInsights.Extensibility.Implementation.Metrics.MetricTerms+Autocollection+Request\",\"ListItemText\":\"Request\",\"ResultType\":11,\"ToolTip\":\"Microsoft.ApplicationInsights.Extensibility.Implementation.Metrics.MetricTerms+Autocollection+Request\"},{\"CompletionText\":\"System.Net.Cache.RequestCacheLevel\",\"ListItemText\":\"RequestCacheLevel\",\"ResultType\":11,\"ToolTip\":\"System.Net.Cache.RequestCacheLevel\"},{\"CompletionText\":\"System.Net.Cache.RequestCachePolicy\",\"ListItemText\":\"RequestCachePolicy\",\"ResultType\":11,\"ToolTip\":\"System.Net.Cache.RequestCachePolicy\"},{\"CompletionText\":\"System.ServiceModel.Channels.RequestContext\",\"ListItemText\":\"RequestContext\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.Channels.RequestContext\"},{\"CompletionText\":\"Microsoft.ApplicationInsights.Extensibility.Implementation.Metrics.MetricTerms+Autocollection+Metric+RequestDuration\",\"ListItemText\":\"RequestDuration\",\"ResultType\":11,\"ToolTip\":\"Microsoft.ApplicationInsights.Extensibility.Implementation.Metrics.MetricTerms+Autocollection+Metric+RequestDuration\"},{\"CompletionText\":\"Microsoft.ApplicationInsights.DataContracts.RequestTelemetry\",\"ListItemText\":\"RequestTelemetry\",\"ResultType\":11,\"ToolTip\":\"Microsoft.ApplicationInsights.DataContracts.RequestTelemetry\"},{\"CompletionText\":\"Newtonsoft.Json.Required\",\"ListItemText\":\"Required\",\"ResultType\":11,\"ToolTip\":\"Newtonsoft.Json.Required\"},{\"CompletionText\":\"System.ComponentModel.DataAnnotations.RequiredAttribute\",\"ListItemText\":\"RequiredAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.DataAnnotations.RequiredAttribute\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RequiredAttributeAttribute\",\"ListItemText\":\"RequiredAttributeAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RequiredAttributeAttribute\"},{\"CompletionText\":\"Json.Schema.RequiredKeyword\",\"ListItemText\":\"RequiredKeyword\",\"ResultType\":11,\"ToolTip\":\"Json.Schema.RequiredKeyword\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RequiredMemberAttribute\",\"ListItemText\":\"RequiredMemberAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RequiredMemberAttribute\"},{\"CompletionText\":\"System.Diagnostics.CodeAnalysis.RequiresAssemblyFilesAttribute\",\"ListItemText\":\"RequiresAssemblyFilesAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Diagnostics.CodeAnalysis.RequiresAssemblyFilesAttribute\"},{\"CompletionText\":\"System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute\",\"ListItemText\":\"RequiresDynamicCodeAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RequiresLocationAttribute\",\"ListItemText\":\"RequiresLocationAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RequiresLocationAttribute\"},{\"CompletionText\":\"System.Runtime.Versioning.RequiresPreviewFeaturesAttribute\",\"ListItemText\":\"RequiresPreviewFeaturesAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.Versioning.RequiresPreviewFeaturesAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RequireStaticDelegateAttribute\",\"ListItemText\":\"RequireStaticDelegateAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RequireStaticDelegateAttribute\"},{\"CompletionText\":\"System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute\",\"ListItemText\":\"RequiresUnreferencedCodeAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute\"},{\"CompletionText\":\"System.Reflection.Metadata.ReservedBlob\",\"ListItemText\":\"ReservedBlob<>\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.Metadata.ReservedBlob[T]\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.ResetCapability\",\"ListItemText\":\"ResetCapability\",\"ResultType\":11,\"ToolTip\":\"Enum Microsoft.PowerShell.Commands.ResetCapability\"},{\"CompletionText\":\"System.Management.Automation.ResolutionPurpose\",\"ListItemText\":\"ResolutionPurpose\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.ResolutionPurpose\"},{\"CompletionText\":\"System.ResolveEventArgs\",\"ListItemText\":\"ResolveEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.ResolveEventArgs\"},{\"CompletionText\":\"System.ResolveEventHandler\",\"ListItemText\":\"ResolveEventHandler\",\"ResultType\":11,\"ToolTip\":\"System.ResolveEventHandler\"},{\"CompletionText\":\"System.ComponentModel.Design.Serialization.ResolveNameEventArgs\",\"ListItemText\":\"ResolveNameEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.Design.Serialization.ResolveNameEventArgs\"},{\"CompletionText\":\"System.ComponentModel.Design.Serialization.ResolveNameEventHandler\",\"ListItemText\":\"ResolveNameEventHandler\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.Design.Serialization.ResolveNameEventHandler\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.ResolvePathCommand\",\"ListItemText\":\"ResolvePathCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.ResolvePathCommand\"},{\"CompletionText\":\"System.Reflection.ResourceAttributes\",\"ListItemText\":\"ResourceAttributes\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.ResourceAttributes\"},{\"CompletionText\":\"System.ServiceModel.Syndication.ResourceCollectionInfo\",\"ListItemText\":\"ResourceCollectionInfo\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.Syndication.ResourceCollectionInfo\"},{\"CompletionText\":\"System.Runtime.Versioning.ResourceConsumptionAttribute\",\"ListItemText\":\"ResourceConsumptionAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.Versioning.ResourceConsumptionAttribute\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.ResourceDescription\",\"ListItemText\":\"ResourceDescription\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.ResourceDescription\"},{\"CompletionText\":\"System.Runtime.Versioning.ResourceExposureAttribute\",\"ListItemText\":\"ResourceExposureAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.Versioning.ResourceExposureAttribute\"},{\"CompletionText\":\"System.Reflection.ResourceLocation\",\"ListItemText\":\"ResourceLocation\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.ResourceLocation\"},{\"CompletionText\":\"System.Resources.ResourceManager\",\"ListItemText\":\"ResourceManager\",\"ResultType\":11,\"ToolTip\":\"System.Resources.ResourceManager\"},{\"CompletionText\":\"System.Security.Permissions.ResourcePermissionBase\",\"ListItemText\":\"ResourcePermissionBase\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.ResourcePermissionBase\"},{\"CompletionText\":\"System.Security.Permissions.ResourcePermissionBaseEntry\",\"ListItemText\":\"ResourcePermissionBaseEntry\",\"ResultType\":11,\"ToolTip\":\"System.Security.Permissions.ResourcePermissionBaseEntry\"},{\"CompletionText\":\"System.Resources.ResourceReader\",\"ListItemText\":\"ResourceReader\",\"ResultType\":11,\"ToolTip\":\"System.Resources.ResourceReader\"},{\"CompletionText\":\"System.Runtime.Versioning.ResourceScope\",\"ListItemText\":\"ResourceScope\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.Versioning.ResourceScope\"},{\"CompletionText\":\"System.Reflection.PortableExecutable.ResourceSectionBuilder\",\"ListItemText\":\"ResourceSectionBuilder\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.PortableExecutable.ResourceSectionBuilder\"},{\"CompletionText\":\"System.Resources.ResourceSet\",\"ListItemText\":\"ResourceSet\",\"ResultType\":11,\"ToolTip\":\"System.Resources.ResourceSet\"},{\"CompletionText\":\"System.Security.AccessControl.ResourceType\",\"ListItemText\":\"ResourceType\",\"ResultType\":11,\"ToolTip\":\"System.Security.AccessControl.ResourceType\"},{\"CompletionText\":\"System.Resources.ResourceWriter\",\"ListItemText\":\"ResourceWriter\",\"ResultType\":11,\"ToolTip\":\"System.Resources.ResourceWriter\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RestartComputerCommand\",\"ListItemText\":\"RestartComputerCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RestartComputerCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RestartComputerTimeoutException\",\"ListItemText\":\"RestartComputerTimeoutException\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RestartComputerTimeoutException\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.RestartServiceCommand\",\"ListItemText\":\"RestartServiceCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.RestartServiceCommand\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.InvokeRestMethodCommand+RestReturnType\",\"ListItemText\":\"RestReturnType\",\"ResultType\":11,\"ToolTip\":\"Enum Microsoft.PowerShell.Commands.InvokeRestMethodCommand+RestReturnType\"},{\"CompletionText\":\"System.DirectoryServices.Protocols.ResultCode\",\"ListItemText\":\"ResultCode\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.Protocols.ResultCode\"},{\"CompletionText\":\"System.DirectoryServices.ResultPropertyCollection\",\"ListItemText\":\"ResultPropertyCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ResultPropertyCollection\"},{\"CompletionText\":\"System.DirectoryServices.ResultPropertyValueCollection\",\"ListItemText\":\"ResultPropertyValueCollection\",\"ResultType\":11,\"ToolTip\":\"System.DirectoryServices.ResultPropertyValueCollection\"},{\"CompletionText\":\"Microsoft.PowerShell.Commands.ResumeServiceCommand\",\"ListItemText\":\"ResumeServiceCommand\",\"ResultType\":11,\"ToolTip\":\"Class Microsoft.PowerShell.Commands.ResumeServiceCommand\"},{\"CompletionText\":\"System.Data.Odbc.ODBC32+RETCODE\",\"ListItemText\":\"RETCODE\",\"ResultType\":11,\"ToolTip\":\"System.Data.Odbc.ODBC32+RETCODE\"},{\"CompletionText\":\"System.Net.Http.Headers.RetryConditionHeaderValue\",\"ListItemText\":\"RetryConditionHeaderValue\",\"ResultType\":11,\"ToolTip\":\"System.Net.Http.Headers.RetryConditionHeaderValue\"},{\"CompletionText\":\"System.Management.Automation.ReturnContainers\",\"ListItemText\":\"ReturnContainers\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.ReturnContainers\"},{\"CompletionText\":\"System.Management.Automation.Language.ReturnStatementAst\",\"ListItemText\":\"ReturnStatementAst\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Language.ReturnStatementAst\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.CSharp.Syntax.ReturnStatementSyntax\",\"ListItemText\":\"ReturnStatementSyntax\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.CSharp.Syntax.ReturnStatementSyntax\"},{\"CompletionText\":\"System.Reflection.Metadata.Ecma335.ReturnTypeEncoder\",\"ListItemText\":\"ReturnTypeEncoder\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.Metadata.Ecma335.ReturnTypeEncoder\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.IOperation+OperationList+Reversed\",\"ListItemText\":\"Reversed\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.IOperation+OperationList+Reversed\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.ChildSyntaxList+Reversed\",\"ListItemText\":\"Reversed\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.ChildSyntaxList+Reversed\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.SyntaxTriviaList+Reversed\",\"ListItemText\":\"Reversed\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.SyntaxTriviaList+Reversed\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.SyntaxTokenList+Reversed\",\"ListItemText\":\"Reversed\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.SyntaxTokenList+Reversed\"},{\"CompletionText\":\"System.Security.Cryptography.Rfc2898DeriveBytes\",\"ListItemText\":\"Rfc2898DeriveBytes\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Rfc2898DeriveBytes\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.Rfc3161TimestampRequest\",\"ListItemText\":\"Rfc3161TimestampRequest\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.Rfc3161TimestampRequest\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.Rfc3161TimestampToken\",\"ListItemText\":\"Rfc3161TimestampToken\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.Rfc3161TimestampToken\"},{\"CompletionText\":\"System.Security.Cryptography.Pkcs.Rfc3161TimestampTokenInfo\",\"ListItemText\":\"Rfc3161TimestampTokenInfo\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Pkcs.Rfc3161TimestampTokenInfo\"},{\"CompletionText\":\"System.Security.Cryptography.Rijndael\",\"ListItemText\":\"Rijndael\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Rijndael\"},{\"CompletionText\":\"System.Security.Cryptography.RijndaelManaged\",\"ListItemText\":\"RijndaelManaged\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RijndaelManaged\"},{\"CompletionText\":\"System.Security.Cryptography.RNGCryptoServiceProvider\",\"ListItemText\":\"RNGCryptoServiceProvider\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RNGCryptoServiceProvider\"},{\"CompletionText\":\"System.Management.Automation.RollbackSeverity\",\"ListItemText\":\"RollbackSeverity\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.RollbackSeverity\"},{\"CompletionText\":\"System.ComponentModel.Design.Serialization.RootDesignerSerializerAttribute\",\"ListItemText\":\"RootDesignerSerializerAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.Design.Serialization.RootDesignerSerializerAttribute\"},{\"CompletionText\":\"Roslyn\",\"ListItemText\":\"Roslyn\",\"ResultType\":10,\"ToolTip\":\"Namespace Roslyn\"},{\"CompletionText\":\"System.Drawing.RotateFlipType\",\"ListItemText\":\"RotateFlipType\",\"ResultType\":11,\"ToolTip\":\"System.Drawing.RotateFlipType\"},{\"CompletionText\":\"Markdig.Renderers.Roundtrip.Inlines.RoundtripHtmlEntityInlineRenderer\",\"ListItemText\":\"RoundtripHtmlEntityInlineRenderer\",\"ResultType\":11,\"ToolTip\":\"Markdig.Renderers.Roundtrip.Inlines.RoundtripHtmlEntityInlineRenderer\"},{\"CompletionText\":\"Markdig.Renderers.Roundtrip.Inlines.RoundtripHtmlInlineRenderer\",\"ListItemText\":\"RoundtripHtmlInlineRenderer\",\"ResultType\":11,\"ToolTip\":\"Markdig.Renderers.Roundtrip.Inlines.RoundtripHtmlInlineRenderer\"},{\"CompletionText\":\"Markdig.Renderers.Roundtrip.RoundtripObjectRenderer\",\"ListItemText\":\"RoundtripObjectRenderer<>\",\"ResultType\":11,\"ToolTip\":\"Markdig.Renderers.Roundtrip.RoundtripObjectRenderer[T]\"},{\"CompletionText\":\"Markdig.Renderers.Roundtrip.RoundtripRenderer\",\"ListItemText\":\"RoundtripRenderer\",\"ResultType\":11,\"ToolTip\":\"Markdig.Renderers.Roundtrip.RoundtripRenderer\"},{\"CompletionText\":\"JetBrains.Annotations.RouteParameterConstraintAttribute\",\"ListItemText\":\"RouteParameterConstraintAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RouteParameterConstraintAttribute\"},{\"CompletionText\":\"JetBrains.Annotations.RouteTemplateAttribute\",\"ListItemText\":\"RouteTemplateAttribute\",\"ResultType\":11,\"ToolTip\":\"JetBrains.Annotations.RouteTemplateAttribute\"},{\"CompletionText\":\"System.Data.RowNotInTableException\",\"ListItemText\":\"RowNotInTableException\",\"ResultType\":11,\"ToolTip\":\"System.Data.RowNotInTableException\"},{\"CompletionText\":\"System.Data.Common.RowUpdatedEventArgs\",\"ListItemText\":\"RowUpdatedEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.Data.Common.RowUpdatedEventArgs\"},{\"CompletionText\":\"System.Data.Common.RowUpdatingEventArgs\",\"ListItemText\":\"RowUpdatingEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.Data.Common.RowUpdatingEventArgs\"},{\"CompletionText\":\"System.Security.Cryptography.RSA\",\"ListItemText\":\"RSA\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSA\"},{\"CompletionText\":\"System.Security.Cryptography.X509Certificates.RSACertificateExtensions\",\"ListItemText\":\"RSACertificateExtensions\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.X509Certificates.RSACertificateExtensions\"},{\"CompletionText\":\"System.Security.Cryptography.RSACng\",\"ListItemText\":\"RSACng\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSACng\"},{\"CompletionText\":\"System.Security.Cryptography.RSACryptoServiceProvider\",\"ListItemText\":\"RSACryptoServiceProvider\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSACryptoServiceProvider\"},{\"CompletionText\":\"System.Security.Cryptography.RSAEncryptionPadding\",\"ListItemText\":\"RSAEncryptionPadding\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAEncryptionPadding\"},{\"CompletionText\":\"System.Security.Cryptography.RSAEncryptionPaddingMode\",\"ListItemText\":\"RSAEncryptionPaddingMode\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAEncryptionPaddingMode\"},{\"CompletionText\":\"System.Security.Cryptography.Xml.RSAKeyValue\",\"ListItemText\":\"RSAKeyValue\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.Xml.RSAKeyValue\"},{\"CompletionText\":\"System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter\",\"ListItemText\":\"RSAOAEPKeyExchangeDeformatter\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter\"},{\"CompletionText\":\"System.Security.Cryptography.RSAOAEPKeyExchangeFormatter\",\"ListItemText\":\"RSAOAEPKeyExchangeFormatter\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAOAEPKeyExchangeFormatter\"},{\"CompletionText\":\"System.Security.Cryptography.RSAOpenSsl\",\"ListItemText\":\"RSAOpenSsl\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAOpenSsl\"},{\"CompletionText\":\"System.Security.Cryptography.RSAParameters\",\"ListItemText\":\"RSAParameters\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAParameters\"},{\"CompletionText\":\"System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter\",\"ListItemText\":\"RSAPKCS1KeyExchangeDeformatter\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAPKCS1KeyExchangeDeformatter\"},{\"CompletionText\":\"System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter\",\"ListItemText\":\"RSAPKCS1KeyExchangeFormatter\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAPKCS1KeyExchangeFormatter\"},{\"CompletionText\":\"System.Security.Cryptography.RSAPKCS1SignatureDeformatter\",\"ListItemText\":\"RSAPKCS1SignatureDeformatter\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAPKCS1SignatureDeformatter\"},{\"CompletionText\":\"System.Security.Cryptography.RSAPKCS1SignatureFormatter\",\"ListItemText\":\"RSAPKCS1SignatureFormatter\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSAPKCS1SignatureFormatter\"},{\"CompletionText\":\"System.Configuration.RsaProtectedConfigurationProvider\",\"ListItemText\":\"RsaProtectedConfigurationProvider\",\"ResultType\":11,\"ToolTip\":\"System.Configuration.RsaProtectedConfigurationProvider\"},{\"CompletionText\":\"System.Security.Cryptography.RSASignaturePadding\",\"ListItemText\":\"RSASignaturePadding\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSASignaturePadding\"},{\"CompletionText\":\"System.Security.Cryptography.RSASignaturePaddingMode\",\"ListItemText\":\"RSASignaturePaddingMode\",\"ResultType\":11,\"ToolTip\":\"System.Security.Cryptography.RSASignaturePaddingMode\"},{\"CompletionText\":\"System.ServiceModel.Syndication.Rss20FeedFormatter\",\"ListItemText\":\"Rss20FeedFormatter\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.Syndication.Rss20FeedFormatter\"},{\"CompletionText\":\"System.ServiceModel.Syndication.Rss20ItemFormatter\",\"ListItemText\":\"Rss20ItemFormatter\",\"ResultType\":11,\"ToolTip\":\"System.ServiceModel.Syndication.Rss20ItemFormatter\"},{\"CompletionText\":\"System.Data.Rule\",\"ListItemText\":\"Rule\",\"ResultType\":11,\"ToolTip\":\"System.Data.Rule\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RuleCache\",\"ListItemText\":\"RuleCache<>\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RuleCache[T]\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.RuleSet\",\"ListItemText\":\"RuleSet\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.RuleSet\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.RuleSetInclude\",\"ListItemText\":\"RuleSetInclude\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.RuleSetInclude\"},{\"CompletionText\":\"System.Text.Rune\",\"ListItemText\":\"Rune\",\"ResultType\":11,\"ToolTip\":\"System.Text.Rune\"},{\"CompletionText\":\"System.ComponentModel.RunInstallerAttribute\",\"ListItemText\":\"RunInstallerAttribute\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RunInstallerAttribute\"},{\"CompletionText\":\"runspace\",\"ListItemText\":\"Runspace\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.Runspace\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceAttribute\",\"ListItemText\":\"RunspaceAttribute\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceAttribute\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceAvailability\",\"ListItemText\":\"RunspaceAvailability\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Runspaces.RunspaceAvailability\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceAvailabilityEventArgs\",\"ListItemText\":\"RunspaceAvailabilityEventArgs\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceAvailabilityEventArgs\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceCapability\",\"ListItemText\":\"RunspaceCapability\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Runspaces.RunspaceCapability\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceConnectionInfo\",\"ListItemText\":\"RunspaceConnectionInfo\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceConnectionInfo\"},{\"CompletionText\":\"runspacefactory\",\"ListItemText\":\"RunspaceFactory\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceFactory\"},{\"CompletionText\":\"System.Management.Automation.RunspaceMode\",\"ListItemText\":\"RunspaceMode\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.RunspaceMode\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceOpenModuleLoadException\",\"ListItemText\":\"RunspaceOpenModuleLoadException\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceOpenModuleLoadException\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspacePool\",\"ListItemText\":\"RunspacePool\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspacePool\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspacePoolAvailability\",\"ListItemText\":\"RunspacePoolAvailability\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Runspaces.RunspacePoolAvailability\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspacePoolCapability\",\"ListItemText\":\"RunspacePoolCapability\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Runspaces.RunspacePoolCapability\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspacePoolState\",\"ListItemText\":\"RunspacePoolState\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Runspaces.RunspacePoolState\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspacePoolStateChangedEventArgs\",\"ListItemText\":\"RunspacePoolStateChangedEventArgs\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspacePoolStateChangedEventArgs\"},{\"CompletionText\":\"System.Management.Automation.RunspacePoolStateInfo\",\"ListItemText\":\"RunspacePoolStateInfo\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RunspacePoolStateInfo\"},{\"CompletionText\":\"System.Management.Automation.RunspaceRepository\",\"ListItemText\":\"RunspaceRepository\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RunspaceRepository\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceState\",\"ListItemText\":\"RunspaceState\",\"ResultType\":11,\"ToolTip\":\"Enum System.Management.Automation.Runspaces.RunspaceState\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceStateEventArgs\",\"ListItemText\":\"RunspaceStateEventArgs\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceStateEventArgs\"},{\"CompletionText\":\"System.Management.Automation.Runspaces.RunspaceStateInfo\",\"ListItemText\":\"RunspaceStateInfo\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.Runspaces.RunspaceStateInfo\"},{\"CompletionText\":\"System.RuntimeArgumentHandle\",\"ListItemText\":\"RuntimeArgumentHandle\",\"ResultType\":11,\"ToolTip\":\"System.RuntimeArgumentHandle\"},{\"CompletionText\":\"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException\",\"ListItemText\":\"RuntimeBinderException\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException\"},{\"CompletionText\":\"Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException\",\"ListItemText\":\"RuntimeBinderInternalCompilerException\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException\"},{\"CompletionText\":\"Microsoft.CodeAnalysis.RuntimeCapability\",\"ListItemText\":\"RuntimeCapability\",\"ResultType\":11,\"ToolTip\":\"Microsoft.CodeAnalysis.RuntimeCapability\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RuntimeCompatibilityAttribute\",\"ListItemText\":\"RuntimeCompatibilityAttribute\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RuntimeCompatibilityAttribute\"},{\"CompletionText\":\"System.Management.Automation.RuntimeDefinedParameter\",\"ListItemText\":\"RuntimeDefinedParameter\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RuntimeDefinedParameter\"},{\"CompletionText\":\"System.Management.Automation.RuntimeDefinedParameterDictionary\",\"ListItemText\":\"RuntimeDefinedParameterDictionary\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RuntimeDefinedParameterDictionary\"},{\"CompletionText\":\"System.Runtime.InteropServices.RuntimeEnvironment\",\"ListItemText\":\"RuntimeEnvironment\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.InteropServices.RuntimeEnvironment\"},{\"CompletionText\":\"System.Management.Automation.RuntimeException\",\"ListItemText\":\"RuntimeException\",\"ResultType\":11,\"ToolTip\":\"Class System.Management.Automation.RuntimeException\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RuntimeFeature\",\"ListItemText\":\"RuntimeFeature\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RuntimeFeature\"},{\"CompletionText\":\"System.RuntimeFieldHandle\",\"ListItemText\":\"RuntimeFieldHandle\",\"ResultType\":11,\"ToolTip\":\"System.RuntimeFieldHandle\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RuntimeHelpers\",\"ListItemText\":\"RuntimeHelpers\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RuntimeHelpers\"},{\"CompletionText\":\"System.Runtime.InteropServices.RuntimeInformation\",\"ListItemText\":\"RuntimeInformation\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.InteropServices.RuntimeInformation\"},{\"CompletionText\":\"System.RuntimeMethodHandle\",\"ListItemText\":\"RuntimeMethodHandle\",\"ResultType\":11,\"ToolTip\":\"System.RuntimeMethodHandle\"},{\"CompletionText\":\"System.Reflection.RuntimeReflectionExtensions\",\"ListItemText\":\"RuntimeReflectionExtensions\",\"ResultType\":11,\"ToolTip\":\"System.Reflection.RuntimeReflectionExtensions\"},{\"CompletionText\":\"System.RuntimeTypeHandle\",\"ListItemText\":\"RuntimeTypeHandle\",\"ResultType\":11,\"ToolTip\":\"System.RuntimeTypeHandle\"},{\"CompletionText\":\"System.Linq.Expressions.RuntimeVariablesExpression\",\"ListItemText\":\"RuntimeVariablesExpression\",\"ResultType\":11,\"ToolTip\":\"System.Linq.Expressions.RuntimeVariablesExpression\"},{\"CompletionText\":\"System.Runtime.CompilerServices.RuntimeWrappedException\",\"ListItemText\":\"RuntimeWrappedException\",\"ResultType\":11,\"ToolTip\":\"System.Runtime.CompilerServices.RuntimeWrappedException\"},{\"CompletionText\":\"System.ComponentModel.RunWorkerCompletedEventArgs\",\"ListItemText\":\"RunWorkerCompletedEventArgs\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RunWorkerCompletedEventArgs\"},{\"CompletionText\":\"System.ComponentModel.RunWorkerCompletedEventHandler\",\"ListItemText\":\"RunWorkerCompletedEventHandler\",\"ResultType\":11,\"ToolTip\":\"System.ComponentModel.RunWorkerCompletedEventHandler\"}]\u0007" }, + { + "type": "input", + "data": "r" + }, { "type": "input", "data": "e" }, + { + "type": "input", + "data": "q" + }, { "type": "output", - "data": "\u001b[?25l\u001b[3;3H[re\u001b[?25h" + "data": "\u001b[?25l\u001b[3;3H[req\u001b[?25h" }, { "type": "promptInputChange", - "data": "[re|" + "data": "[req|" }, { "type": "command", @@ -99,14 +107,14 @@ export const events = [ }, { "type": "sendText", - "data": "System.Xml.Linq.ReaderOptions" + "data": "Json.Schema.RequiredKeyword" }, { "type": "output", - "data": "\u001b[?25l\u001b[3;3H[System.Xml.Linq.ReaderOptions\u001b[?25h" + "data": "\u001b[?25l\u001b[3;3H[Json.Schema.RequiredKeyword\u001b[?25h" }, { "type": "promptInputChange", - "data": "[System.Xml.Linq.ReaderOptions|" + "data": "[Json.Schema.RequiredKeyword|" } ]; From c6be7241b1ccdccfda1da53f2a6de83eae9b6469 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:29:16 -0700 Subject: [PATCH 316/755] Fix outdated examples in api jsdoc Fixes #216545 --- ...ode.proposed.terminalShellIntegration.d.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts index cdff579c2fb45..8e44e8e48d68b 100644 --- a/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts +++ b/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts @@ -125,7 +125,7 @@ declare module 'vscode' { /** * An object that contains [shell integration](https://code.visualstudio.com/docs/terminal/shell-integration)-powered * features for the terminal. This will always be `undefined` immediately after the terminal - * is created. Listen to {@link window.onDidActivateTerminalShellIntegration} to be notified + * is created. Listen to {@link window.onDidChangeTerminalShellIntegration} to be notified * when shell integration is activated for a terminal. * * Note that this object may remain undefined if shell integation never activates. For @@ -155,11 +155,13 @@ declare module 'vscode' { * @example * // Execute a command in a terminal immediately after being created * const myTerm = window.createTerminal(); - * window.onDidActivateTerminalShellIntegration(async ({ terminal, shellIntegration }) => { + * window.onDidChangeTerminalShellIntegration(async ({ terminal, shellIntegration }) => { * if (terminal === myTerm) { - * const command = shellIntegration.executeCommand('echo "Hello world"'); - * const code = await command.exitCode; - * console.log(`Command exited with code ${code}`); + * const execution = shellIntegration.executeCommand('echo "Hello world"'); + * window.onDidEndTerminalShellExecution(event => { + * if (event.execution === execution) { + * console.log(`Command exited with code ${event.exitCode}`); + * } * } * })); * // Fallback to sendText if there is no shell integration within 3 seconds of launching @@ -175,9 +177,11 @@ declare module 'vscode' { * // Send command to terminal that has been alive for a while * const commandLine = 'echo "Hello world"'; * if (term.shellIntegration) { - * const command = term.shellIntegration.executeCommand({ commandLine }); - * const code = await command.exitCode; - * console.log(`Command exited with code ${code}`); + * const execution = shellIntegration.executeCommand({ commandLine }); + * window.onDidEndTerminalShellExecution(event => { + * if (event.execution === execution) { + * console.log(`Command exited with code ${event.exitCode}`); + * } * } else { * term.sendText(commandLine); * // Without shell integration, we can't know when the command has finished or what the From f36a1edcf1e26b8837926f542feac137556b095c Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 18 Jun 2024 15:16:01 -0700 Subject: [PATCH 317/755] debug: fix uncaught error in watch tree (#216550) Not sure why this method existed, we were the only consumer of it and it didn't really work (it errored if the node didn't exist and never returned 'false') --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 4 ---- .../workbench/contrib/debug/browser/watchExpressionsView.ts | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index bfd5af6891483..debb1a0468589 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -569,10 +569,6 @@ export class AsyncDataTree implements IDisposable this.tree.resort(this.getDataNode(element), recursive); } - hasElement(element: TInput | T): boolean { - return this.tree.hasElement(this.getDataNode(element)); - } - hasNode(element: TInput | T): boolean { return element === this.root.element || this.nodes.has(element as T); } diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index 60024437fb3eb..07f6986534d80 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -157,7 +157,7 @@ export class WatchExpressionsView extends ViewPane { let horizontalScrolling: boolean | undefined; this._register(this.debugService.getViewModel().onDidSelectExpression(e => { const expression = e?.expression; - if (expression && this.tree.hasElement(expression)) { + if (expression && this.tree.hasNode(expression)) { horizontalScrolling = this.tree.options.horizontalScrolling; if (horizontalScrolling) { this.tree.updateOptions({ horizontalScrolling: false }); From 0dfcf2c82934ef40ed584d3d6a1764f0c0d78069 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 18 Jun 2024 15:22:21 -0700 Subject: [PATCH 318/755] debug: add location to evaluate expression hovers (#216551) Adopts https://github.com/microsoft/debug-adapter-protocol/pull/481 fyi @roblourens, I think hover is the only place where this is relevant and this adds it there --- .../contrib/debug/browser/debugHover.ts | 31 ++++++++++++------- .../contrib/debug/browser/debugSession.ts | 4 +-- .../workbench/contrib/debug/common/debug.ts | 8 ++++- .../contrib/debug/common/debugModel.ts | 12 ++++--- .../contrib/debug/common/debugProtocol.d.ts | 11 ++++++- 5 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index c3191626a327d..3b2bf38563954 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -451,8 +451,10 @@ interface IDebugHoverComputeResult { } class DebugHoverComputer { - private _currentRange: Range | undefined; - private _currentExpression: string | undefined; + private _current?: { + range: Range; + expression: string; + }; constructor( private editor: ICodeEditor, @@ -474,30 +476,35 @@ class DebugHoverComputer { } const { range, matchingExpression } = result; - const rangeChanged = this._currentRange ? - !this._currentRange.equalsRange(range) : - true; - this._currentExpression = matchingExpression; - this._currentRange = Range.lift(range); - return { rangeChanged, range: this._currentRange }; + const rangeChanged = !this._current?.range.equalsRange(range); + this._current = { expression: matchingExpression, range: Range.lift(range) }; + return { rangeChanged, range: this._current.range }; } async evaluate(session: IDebugSession): Promise { - if (!this._currentExpression) { + if (!this._current) { this.logService.error('No expression to evaluate'); return; } + const textModel = this.editor.getModel(); + const debugSource = textModel && session.getSourceForUri(textModel?.uri); + if (session.capabilities.supportsEvaluateForHovers) { - const expression = new Expression(this._currentExpression); - await expression.evaluate(session, this.debugService.getViewModel().focusedStackFrame, 'hover'); + const expression = new Expression(this._current.expression); + await expression.evaluate(session, this.debugService.getViewModel().focusedStackFrame, 'hover', undefined, debugSource ? { + line: this._current.range.startLineNumber, + column: this._current.range.startColumn, + source: debugSource.raw, + } : undefined); return expression; } else { const focusedStackFrame = this.debugService.getViewModel().focusedStackFrame; if (focusedStackFrame) { return await findExpressionInStackFrame( focusedStackFrame, - coalesce(this._currentExpression.split('.').map(word => word.trim()))); + coalesce(this._current.expression.split('.').map(word => word.trim())) + ); } } diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index a8d9cc9e562d2..79c3cc8c1237f 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -685,12 +685,12 @@ export class DebugSession implements IDebugSession, IDisposable { return this.raw.variables({ variablesReference, filter, start, count }, token); } - evaluate(expression: string, frameId: number, context?: string): Promise { + evaluate(expression: string, frameId: number, context?: string, location?: { line: number; column: number; source: DebugProtocol.Source }): Promise { if (!this.raw) { throw new Error(localize('noDebugAdapter', "No debugger available, can not send '{0}'", 'evaluate')); } - return this.raw.evaluate({ expression, frameId, context }); + return this.raw.evaluate({ expression, frameId, context, line: location?.line, column: location?.column, source: location?.source }); } async restartFrame(frameId: number, threadId: number): Promise { diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 319c0ba233396..c9ec64206bd05 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -346,6 +346,12 @@ export interface INewReplElementData { source?: IReplElementSource; } +export interface IDebugEvaluatePosition { + line: number; + column: number; + source: DebugProtocol.Source; +} + export interface IDebugSession extends ITreeElement { @@ -431,7 +437,7 @@ export interface IDebugSession extends ITreeElement { exceptionInfo(threadId: number): Promise; scopes(frameId: number, threadId: number): Promise; variables(variablesReference: number, threadId: number | undefined, filter: 'indexed' | 'named' | undefined, start: number | undefined, count: number | undefined): Promise; - evaluate(expression: string, frameId?: number, context?: string): Promise; + evaluate(expression: string, frameId?: number, context?: string, location?: IDebugEvaluatePosition): Promise; customRequest(request: string, args: any): Promise; cancel(progressId: string): Promise; disassemble(memoryReference: string, offset: number, instructionOffset: number, instructionCount: number): Promise; diff --git a/src/vs/workbench/contrib/debug/common/debugModel.ts b/src/vs/workbench/contrib/debug/common/debugModel.ts index 7a89fef9383da..b356fb899fd95 100644 --- a/src/vs/workbench/contrib/debug/common/debugModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugModel.ts @@ -22,7 +22,7 @@ import * as nls from 'vs/nls'; import { ILogService } from 'vs/platform/log/common/log'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IEditorPane } from 'vs/workbench/common/editor'; -import { DEBUG_MEMORY_SCHEME, DataBreakpointSetType, DataBreakpointSource, DebugTreeItemCollapsibleState, IBaseBreakpoint, IBreakpoint, IBreakpointData, IBreakpointUpdateData, IBreakpointsChangeEvent, IDataBreakpoint, IDebugModel, IDebugSession, IDebugVisualizationTreeItem, IEnablement, IExceptionBreakpoint, IExceptionInfo, IExpression, IExpressionContainer, IFunctionBreakpoint, IInstructionBreakpoint, IMemoryInvalidationEvent, IMemoryRegion, IRawModelUpdate, IRawStoppedDetails, IScope, IStackFrame, IThread, ITreeElement, MemoryRange, MemoryRangeType, State, isFrameDeemphasized } from 'vs/workbench/contrib/debug/common/debug'; +import { DEBUG_MEMORY_SCHEME, DataBreakpointSetType, DataBreakpointSource, DebugTreeItemCollapsibleState, IBaseBreakpoint, IBreakpoint, IBreakpointData, IBreakpointUpdateData, IBreakpointsChangeEvent, IDataBreakpoint, IDebugEvaluatePosition, IDebugModel, IDebugSession, IDebugVisualizationTreeItem, IEnablement, IExceptionBreakpoint, IExceptionInfo, IExpression, IExpressionContainer, IFunctionBreakpoint, IInstructionBreakpoint, IMemoryInvalidationEvent, IMemoryRegion, IRawModelUpdate, IRawStoppedDetails, IScope, IStackFrame, IThread, ITreeElement, MemoryRange, MemoryRangeType, State, isFrameDeemphasized } from 'vs/workbench/contrib/debug/common/debug'; import { Source, UNKNOWN_SOURCE_LABEL, getUriFromSource } from 'vs/workbench/contrib/debug/common/debugSource'; import { DebugStorage } from 'vs/workbench/contrib/debug/common/debugStorage'; import { IDebugVisualizerService } from 'vs/workbench/contrib/debug/common/debugVisualizers'; @@ -198,7 +198,9 @@ export class ExpressionContainer implements IExpressionContainer { session: IDebugSession | undefined, stackFrame: IStackFrame | undefined, context: string, - keepLazyVars = false): Promise { + keepLazyVars = false, + location?: IDebugEvaluatePosition, + ): Promise { if (!session || (!stackFrame && context !== 'repl')) { this.value = context === 'repl' ? nls.localize('startDebugFirst', "Please start a debug session to evaluate expressions") : Expression.DEFAULT_VALUE; @@ -208,7 +210,7 @@ export class ExpressionContainer implements IExpressionContainer { this.session = session; try { - const response = await session.evaluate(expression, stackFrame ? stackFrame.frameId : undefined, context); + const response = await session.evaluate(expression, stackFrame ? stackFrame.frameId : undefined, context, location); if (response && response.body) { this.value = response.body.result || ''; @@ -306,8 +308,8 @@ export class Expression extends ExpressionContainer implements IExpression { } } - async evaluate(session: IDebugSession | undefined, stackFrame: IStackFrame | undefined, context: string, keepLazyVars?: boolean): Promise { - this.available = await this.evaluateExpression(this.name, session, stackFrame, context, keepLazyVars); + async evaluate(session: IDebugSession | undefined, stackFrame: IStackFrame | undefined, context: string, keepLazyVars?: boolean, location?: IDebugEvaluatePosition): Promise { + this.available = await this.evaluateExpression(this.name, session, stackFrame, context, keepLazyVars, location); } override toString(): string { diff --git a/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts b/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts index 50eacfd65e25e..963e3d553e4df 100644 --- a/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts +++ b/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts @@ -1377,6 +1377,15 @@ declare module DebugProtocol { expression: string; /** Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. */ frameId?: number; + /** The contextual line where the expression should be evaluated. In the 'hover' context, this should be set to the start of the expression being hovered. */ + line?: number; + /** The contextual column where the expression should be evaluated. This may be provided if `line` is also provided. + + It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. + */ + column?: number; + /** The contextual source in which the `line` is found. This must be provided if `line` is provided. */ + source?: Source; /** The context in which the evaluate request is used. Values: 'watch': evaluate is called from a watch view context. @@ -2401,7 +2410,7 @@ declare module DebugProtocol { Values: 'source': In `SourceBreakpoint`s 'exception': In exception breakpoints applied in the `ExceptionFilterOptions` - 'data': In data breakpoints requested in the the `DataBreakpointInfo` request + 'data': In data breakpoints requested in the `DataBreakpointInfo` request 'instruction': In `InstructionBreakpoint`s etc. */ From 30cc181847deab40f0d8776544196b6d6d6383f4 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 18 Jun 2024 15:25:15 -0700 Subject: [PATCH 319/755] debug: finalize testRun in DebugSessionOptions (#216549) debug finalize testRun in DebugSessionOptions Closes #214486 --- .../tsconfig.json | 3 +-- .../common/extensionsApiProposals.ts | 1 - src/vscode-dts/vscode.d.ts | 7 +++++++ .../vscode.proposed.testRunInDebug.d.ts | 18 ------------------ 4 files changed, 8 insertions(+), 21 deletions(-) delete mode 100644 src/vscode-dts/vscode.proposed.testRunInDebug.d.ts diff --git a/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json b/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json index b95a70145c007..9725e14041e5f 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json +++ b/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json @@ -11,7 +11,6 @@ "src/**/*", "../../../src/vscode-dts/vscode.d.ts", "../../../src/vscode-dts/vscode.proposed.testObserver.d.ts", - "../../../src/vscode-dts/vscode.proposed.attributableCoverage.d.ts", - "../../../src/vscode-dts/vscode.proposed.testRunInDebug.d.ts", + "../../../src/vscode-dts/vscode.proposed.attributableCoverage.d.ts" ] } diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index a245c39d11df7..87f6b82ce86e6 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -118,7 +118,6 @@ export const allApiProposals = Object.freeze({ terminalSelection: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalSelection.d.ts', terminalShellIntegration: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts', testObserver: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testObserver.d.ts', - testRunInDebug: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts', textSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts', timeline: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.timeline.d.ts', tokenInformation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tokenInformation.d.ts', diff --git a/src/vscode-dts/vscode.d.ts b/src/vscode-dts/vscode.d.ts index a0e3675afba4a..8c22232e2b6e5 100644 --- a/src/vscode-dts/vscode.d.ts +++ b/src/vscode-dts/vscode.d.ts @@ -16183,6 +16183,13 @@ declare module 'vscode' { * When true, the debug viewlet will not be automatically revealed for this session. */ suppressDebugView?: boolean; + + /** + * Signals to the editor that the debug session was started from a test run + * request. This is used to link the lifecycle of the debug session and + * test run in UI actions. + */ + testRun?: TestRun; } /** diff --git a/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts b/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts deleted file mode 100644 index 8eb273e2a5e38..0000000000000 --- a/src/vscode-dts/vscode.proposed.testRunInDebug.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - // https://github.com/microsoft/vscode/issues/214486 - - export interface DebugSessionOptions { - /** - * Signals to the editor that the debug session was started from a test run - * request. This is used to link the lifecycle of the debug session and - * test run in UI actions. - */ - testRun?: TestRun; - } -} From 1fc7961ad5ef24502652d55b82c04e6721a6f24a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 18 Jun 2024 15:26:38 -0700 Subject: [PATCH 320/755] Pick up latest TS for building VS Code (#216552) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 876f075700e24..b1bf5df02765d 100644 --- a/package.json +++ b/package.json @@ -207,7 +207,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "tsec": "0.2.7", - "typescript": "^5.6.0-dev.20240612", + "typescript": "^5.6.0-dev.20240618", "util": "^0.12.4", "vscode-nls-dev": "^3.3.1", "webpack": "^5.91.0", diff --git a/yarn.lock b/yarn.lock index 73b954aaa6c15..c36fad6488c6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10076,10 +10076,10 @@ typescript@^4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^5.6.0-dev.20240612: - version "5.6.0-dev.20240612" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.0-dev.20240612.tgz#186d320d9ff7b1877c2e990be3b2a84b63c9b540" - integrity sha512-C5WDxLlEMZhdyZBkhZkysctw9uOpGnua48Zrq0FxJLx6+tFrNkanXn4Zhatjg1vbKjzk19FYggX4Gc6Wgz5flg== +typescript@^5.6.0-dev.20240618: + version "5.6.0-dev.20240618" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.0-dev.20240618.tgz#5ce1d67e5c9e36585349916a85a3f3d8cc806168" + integrity sha512-nUnATyFjcoenJB7S5oPGea2s0dd8MVl+2NisBLm7E+zpXkX0KSLy8Y7aFNSQ+r1Hs/MrKfSlV4O8yiQpCuOqrQ== typical@^4.0.0: version "4.0.0" From a41c11cd2221c4dd46f5043dd40cddb74ab0b18b Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 18 Jun 2024 15:58:03 -0700 Subject: [PATCH 321/755] Fix cut off participant avatar shadow in chat header (#216557) Fix cut off participant shadow in header --- src/vs/workbench/contrib/chat/browser/media/chat.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/media/chat.css b/src/vs/workbench/contrib/chat/browser/media/chat.css index dc41db67627ef..4f1630bc809ab 100644 --- a/src/vs/workbench/contrib/chat/browser/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/media/chat.css @@ -40,7 +40,7 @@ display: flex; align-items: center; gap: 8px; - overflow: hidden; + width: 100%; } .interactive-item-container .header .username { @@ -52,6 +52,7 @@ .interactive-item-container .detail-container { font-size: 12px; color: var(--vscode-descriptionForeground); + overflow: hidden; } .interactive-item-container .detail-container .detail .agentOrSlashCommandDetected A { From 1aec898f11bc35c1634a0fc1fdb03ff68612cc9b Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 18 Jun 2024 16:01:37 -0700 Subject: [PATCH 322/755] testing: update attributable coverage api with call feedback (#216558) --- .../src/extension.ts | 9 ++----- src/vs/workbench/api/common/extHostTesting.ts | 8 ++++-- .../vscode.proposed.attributableCoverage.d.ts | 27 ++++++++++--------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts index 36c23e68ac148..a6351cd15b59a 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts @@ -196,13 +196,8 @@ export async function activate(context: vscode.ExtensionContext) { true ); - (coverage as vscode.TestRunProfile2).loadDetailedCoverage = async (_run, coverage, _token, test) => { - if (coverage instanceof V8CoverageFile) { - return test ? coverage.testDetails(test) : coverage.details; - } - - return []; - }; + coverage.loadDetailedCoverage = async (_run, coverage) => coverage instanceof V8CoverageFile ? coverage.details : []; + coverage.loadDetailedCoverageForTest = async (_run, coverage, test) => coverage instanceof V8CoverageFile ? coverage.testDetails(test) : []; for (const [name, arg] of browserArgs) { const cfg = ctrl.createRunProfile( diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index 87e19f8342709..1271f74c7083d 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -591,7 +591,7 @@ class TestRunTracker extends Disposable { } /** Gets details for a previously-emitted coverage object. */ - public getCoverageDetails(id: string, testId: string | undefined, token: CancellationToken) { + public async getCoverageDetails(id: string, testId: string | undefined, token: CancellationToken): Promise { const [, taskId] = TestId.fromString(id).path; /** runId, taskId, URI */ const coverage = this.publishedCoverage.get(id); if (!coverage) { @@ -613,7 +613,11 @@ class TestRunTracker extends Disposable { testItem = report.fromTests[index]; } - return (this.profile as vscode.TestRunProfile2)?.loadDetailedCoverage?.(task.run, report, token, testItem) ?? []; + const details = testItem + ? this.profile?.loadDetailedCoverageForTest?.(task.run, report, testItem, token) + : this.profile?.loadDetailedCoverage?.(task.run, report, token); + + return (await details) ?? []; } /** Creates the public test run interface to give to extensions. */ diff --git a/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts b/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts index 86b8edbc41061..b717159885b5b 100644 --- a/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts +++ b/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts @@ -7,9 +7,8 @@ declare module 'vscode' { export class FileCoverage2 extends FileCoverage { /** * A list of {@link TestItem test cases} that generated coverage in this - * file. If set, test items may be passed in {@link TestRunProfile.loadDetailedCoverage} - * to request coverage information generated by a specific test case in - * the file. + * file. If set, then {@link TestRunProfile.loadDetailedCoverageForTest} + * should also be defined in order to retrieve detailed coverage information. */ fromTests: TestItem[]; @@ -22,22 +21,26 @@ declare module 'vscode' { ); } - export interface TestRunProfile2 { + export interface TestRunProfile { /** * An extension-provided function that provides detailed statement and - * function-level coverage for a file. The editor will call this when more - * detail is needed for a file, such as when it's opened in an editor or - * expanded in the **Test Coverage** view. + * function-level coverage for a single test in a file. This is the per-test + * sibling of {@link TestRunProfile.loadDetailedCoverage}, called only if + * a test item is provided in {@link FileCoverage.fromTests} and only for + * files where such data is reported. * - * The {@link FileCoverage} object passed to this function is the same instance - * emitted on {@link TestRun.addCoverage} calls associated with this profile. + * The editor will call this when user asks to view coverage for a test in + * a file, and the returned coverage information is used to display exactly + * what code was run by that test. + * + * The {@link FileCoverage} object passed to this function is the same + * instance emitted on {@link TestRun.addCoverage} calls associated with this profile. * * @param testRun The test run that generated the coverage data. * @param fileCoverage The file coverage object to load detailed coverage for. + * @param fromTestItem The test item to request coverage information for. * @param token A cancellation token that indicates the operation should be cancelled. - * @param fromTestItem If provided, requests coverage for a specific test in the - * file. This is only set if tests are added in {@link FileCoverage.fromTests}. */ - loadDetailedCoverage?: (testRun: TestRun, fileCoverage: FileCoverage, token: CancellationToken, fromTestItem?: TestItem) => Thenable; + loadDetailedCoverageForTest?: (testRun: TestRun, fileCoverage: FileCoverage, fromTestItem: TestItem, token: CancellationToken) => Thenable; } } From 5acb82336f8f1fba25fd9cf44f11b26dfb34f0fb Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 18 Jun 2024 16:09:56 -0700 Subject: [PATCH 323/755] testing: update some feedback on followup items (#216559) While I'm here, Fixes https://github.com/microsoft/vscode-copilot/issues/6258 Fixes https://github.com/microsoft/vscode-copilot/issues/6259 --- .../vscode-selfhost-test-provider/src/extension.ts | 2 +- .../workbench/contrib/testing/browser/testingOutputPeek.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts index a6351cd15b59a..491f67ee30080 100644 --- a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts +++ b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts @@ -44,7 +44,7 @@ export async function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.tests.registerTestFollowupProvider({ async provideFollowup(_result, test, taskIndex, messageIndex, _token) { return [{ - title: '$(sparkle) Ask copilot for help', + title: '$(sparkle) Fix with Copilot', command: 'github.copilot.tests.fixTestFailure', arguments: [{ source: 'peekFollowup', test, message: test.taskStates[taskIndex].messages[messageIndex] }] }]; diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index 35ad3cc3a8c83..6362d6acdf959 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -780,6 +780,7 @@ class FollowupActionWidget extends Disposable { constructor( private readonly container: HTMLElement, + private readonly editor: ICodeEditor | undefined, @ITestService private readonly testService: ITestService, @IQuickInputService private readonly quickInput: IQuickInputService, ) { @@ -871,6 +872,10 @@ class FollowupActionWidget extends Disposable { if (link.ariaDisabled !== 'true') { link.ariaDisabled = 'true'; fu.execute(); + + if (this.editor) { + TestingOutputPeekController.get(this.editor)?.removePeek(); + } } } } @@ -917,7 +922,7 @@ class TestResultsViewContent extends Disposable { const { historyVisible, showRevealLocationOnMessages } = this.options; const isInPeekView = this.editor !== undefined; const messageContainer = this.messageContainer = dom.append(containerElement, dom.$('.test-output-peek-message-container')); - this.followupWidget = this._register(this.instantiationService.createInstance(FollowupActionWidget, messageContainer)); + this.followupWidget = this._register(this.instantiationService.createInstance(FollowupActionWidget, messageContainer, this.editor)); this.contentProviders = [ this._register(this.instantiationService.createInstance(DiffContentProvider, this.editor, messageContainer)), this._register(this.instantiationService.createInstance(MarkdownTestMessagePeek, messageContainer)), From 88b4dc75bd4764eabeb27febf41688301b99626b Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 18 Jun 2024 16:38:20 -0700 Subject: [PATCH 324/755] Chat Tools API (#213273) * Implement a chat skills API * Move around * Rename to 'tools' and make variables part of it * Updates * value * Differentiate 'tool invocation' and 'reference' * Just one interface, ChatReference * dts updates * Rename "skills" to "tools" * Fix up * Add static registration of tools * string * Updates * Fix * Rename 'chat' in API * Rename "chatTool" --- .../api/browser/extensionHost.contribution.ts | 1 + .../browser/mainThreadLanguageModelTools.ts | 50 ++++++++++ .../workbench/api/common/extHost.api.impl.ts | 18 +++- .../workbench/api/common/extHost.protocol.ts | 15 +++ .../api/common/extHostLanguageModelTools.ts | 68 +++++++++++++ .../contrib/chat/browser/chat.contribution.ts | 4 + .../chat/common/languageModelToolsService.ts | 95 +++++++++++++++++++ .../chat/common/tools/toolsContributions.ts | 82 ++++++++++++++++ .../common/extensionsApiProposals.ts | 1 + src/vscode-dts/vscode.proposed.chatTools.d.ts | 35 +++++++ 10 files changed, 367 insertions(+), 2 deletions(-) create mode 100644 src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts create mode 100644 src/vs/workbench/api/common/extHostLanguageModelTools.ts create mode 100644 src/vs/workbench/contrib/chat/common/languageModelToolsService.ts create mode 100644 src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts create mode 100644 src/vscode-dts/vscode.proposed.chatTools.d.ts diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts index 9fdc4b3030618..1d563ea1dcefd 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts @@ -20,6 +20,7 @@ import './mainThreadBulkEdits'; import './mainThreadLanguageModels'; import './mainThreadChatAgents2'; import './mainThreadChatVariables'; +import './mainThreadLanguageModelTools'; import './mainThreadEmbeddings'; import './mainThreadCodeInsets'; import './mainThreadCLICommands'; diff --git a/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts b/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts new file mode 100644 index 0000000000000..d4247860254f6 --- /dev/null +++ b/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken } from 'vs/base/common/cancellation'; +import { Disposable, DisposableMap } from 'vs/base/common/lifecycle'; +import { ExtHostLanguageModelToolsShape, ExtHostContext, MainContext, MainThreadLanguageModelToolsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { IToolData, ILanguageModelToolsService } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; +import { IExtHostContext, extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; + +@extHostNamedCustomer(MainContext.MainThreadLanguageModelTools) +export class MainThreadLanguageModelTools extends Disposable implements MainThreadLanguageModelToolsShape { + + private readonly _proxy: ExtHostLanguageModelToolsShape; + private readonly _tools = this._register(new DisposableMap()); + + constructor( + extHostContext: IExtHostContext, + @ILanguageModelToolsService private readonly _languageModelToolsService: ILanguageModelToolsService, + ) { + super(); + this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostLanguageModelTools); + + this._register(this._languageModelToolsService.onDidChangeTools(e => this._proxy.$acceptToolDelta(e))); + } + + async $getTools(): Promise { + return Array.from(this._languageModelToolsService.getTools()); + } + + $invokeTool(name: string, parameters: any, token: CancellationToken): Promise { + return this._languageModelToolsService.invokeTool(name, parameters, token); + } + + $registerTool(id: string): void { + const disposable = this._languageModelToolsService.registerToolImplementation( + id, + { + invoke: async (parameters, token) => { + return await this._proxy.$invokeTool(id, parameters, token); + }, + }); + this._tools.set(id, disposable); + } + + $unregisterTool(id: string): void { + this._tools.deleteAndDispose(id); + } +} diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index f4c448d9e473f..6daff426cdaad 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -107,6 +107,7 @@ import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/serv import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { TextSearchCompleteMessageType } from 'vs/workbench/services/search/common/searchExtTypes'; import type * as vscode from 'vscode'; +import { ExtHostLanguageModelTools } from 'vs/workbench/api/common/extHostLanguageModelTools'; export interface IExtensionRegistries { mine: ExtensionDescriptionRegistry; @@ -211,6 +212,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I rpcProtocol.set(ExtHostContext.ExtHostInteractive, new ExtHostInteractive(rpcProtocol, extHostNotebook, extHostDocumentsAndEditors, extHostCommands, extHostLogService)); const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, initData.quality)); const extHostChatVariables = rpcProtocol.set(ExtHostContext.ExtHostChatVariables, new ExtHostChatVariables(rpcProtocol)); + const extHostLanguageModelTools = rpcProtocol.set(ExtHostContext.ExtHostLanguageModelTools, new ExtHostLanguageModelTools(rpcProtocol)); const extHostAiRelatedInformation = rpcProtocol.set(ExtHostContext.ExtHostAiRelatedInformation, new ExtHostRelatedInformation(rpcProtocol)); const extHostAiEmbeddingVector = rpcProtocol.set(ExtHostContext.ExtHostAiEmbeddingVector, new ExtHostAiEmbeddingVector(rpcProtocol)); const extHostStatusBar = rpcProtocol.set(ExtHostContext.ExtHostStatusBar, new ExtHostStatusBar(rpcProtocol, extHostCommands.converter)); @@ -1436,7 +1438,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I createDynamicChatParticipant(id: string, dynamicProps: vscode.DynamicChatParticipantProps, handler: vscode.ChatExtendedRequestHandler): vscode.ChatParticipant { checkProposedApiEnabled(extension, 'chatParticipantPrivate'); return extHostChatAgents2.createDynamicChatAgent(extension, id, dynamicProps, handler); - } + }, }; // namespace: lm @@ -1479,7 +1481,19 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I } else { return extHostEmbeddings.computeEmbeddings(embeddingsModel, input, token); } - } + }, + registerTool(toolId: string, tool: vscode.LanguageModelTool) { + checkProposedApiEnabled(extension, 'chatVariableResolver'); + return extHostLanguageModelTools.registerTool(extension, toolId, tool); + }, + invokeTool(toolId: string, parameters: Object, token: vscode.CancellationToken) { + checkProposedApiEnabled(extension, 'chatVariableResolver'); + return extHostLanguageModelTools.invokeTool(toolId, parameters, token); + }, + get tools() { + checkProposedApiEnabled(extension, 'chatVariableResolver'); + return extHostLanguageModelTools.tools; + }, }; // namespace: speech diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 67b467c93d1db..d98887fdb239a 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -53,6 +53,7 @@ import { CallHierarchyItem } from 'vs/workbench/contrib/callHierarchy/common/cal import { ChatAgentLocation, IChatAgentMetadata, IChatAgentRequest, IChatAgentResult } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IChatProgressResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; import { IChatFollowup, IChatProgress, IChatResponseErrorDetails, IChatTask, IChatTaskDto, IChatUserActionEvent, ChatAgentVoteDirection } from 'vs/workbench/contrib/chat/common/chatService'; +import { IToolData, IToolDelta } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; import { IChatRequestVariableValue, IChatVariableData, IChatVariableResolverProgress } from 'vs/workbench/contrib/chat/common/chatVariables'; import { IChatMessage, IChatResponseFragment, ILanguageModelChatMetadata, ILanguageModelChatSelector, ILanguageModelsChangeEvent } from 'vs/workbench/contrib/chat/common/languageModels'; import { DebugConfigurationProviderTriggerKind, IAdapterDescriptor, IConfig, IDebugSessionReplMode, IDebugTestRunReference, IDebugVisualization, IDebugVisualizationContext, IDebugVisualizationTreeItem, MainThreadDebugVisualization } from 'vs/workbench/contrib/debug/common/debug'; @@ -1294,12 +1295,24 @@ export interface MainThreadChatVariablesShape extends IDisposable { $unregisterVariable(handle: number): void; } +export interface MainThreadLanguageModelToolsShape extends IDisposable { + $getTools(): Promise; + $invokeTool(name: string, parameters: any, token: CancellationToken): Promise; + $registerTool(id: string): void; + $unregisterTool(name: string): void; +} + export type IChatRequestVariableValueDto = Dto; export interface ExtHostChatVariablesShape { $resolveVariable(handle: number, requestId: string, messageText: string, token: CancellationToken): Promise; } +export interface ExtHostLanguageModelToolsShape { + $acceptToolDelta(delta: IToolDelta): Promise; + $invokeTool(id: string, parameters: any, token: CancellationToken): Promise; +} + export interface MainThreadUrlsShape extends IDisposable { $registerUriHandler(handle: number, extensionId: ExtensionIdentifier, extensionDisplayName: string): Promise; $unregisterUriHandler(handle: number): Promise; @@ -2814,6 +2827,7 @@ export const MainContext = { MainThreadEmbeddings: createProxyIdentifier('MainThreadEmbeddings'), MainThreadChatAgents2: createProxyIdentifier('MainThreadChatAgents2'), MainThreadChatVariables: createProxyIdentifier('MainThreadChatVariables'), + MainThreadLanguageModelTools: createProxyIdentifier('MainThreadChatSkills'), MainThreadClipboard: createProxyIdentifier('MainThreadClipboard'), MainThreadCommands: createProxyIdentifier('MainThreadCommands'), MainThreadComments: createProxyIdentifier('MainThreadComments'), @@ -2933,6 +2947,7 @@ export const ExtHostContext = { ExtHostInteractive: createProxyIdentifier('ExtHostInteractive'), ExtHostChatAgents2: createProxyIdentifier('ExtHostChatAgents'), ExtHostChatVariables: createProxyIdentifier('ExtHostChatVariables'), + ExtHostLanguageModelTools: createProxyIdentifier('ExtHostChatSkills'), ExtHostChatProvider: createProxyIdentifier('ExtHostChatProvider'), ExtHostSpeech: createProxyIdentifier('ExtHostSpeech'), ExtHostEmbeddings: createProxyIdentifier('ExtHostEmbeddings'), diff --git a/src/vs/workbench/api/common/extHostLanguageModelTools.ts b/src/vs/workbench/api/common/extHostLanguageModelTools.ts new file mode 100644 index 0000000000000..46ea26e07d7ff --- /dev/null +++ b/src/vs/workbench/api/common/extHostLanguageModelTools.ts @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtHostLanguageModelToolsShape, IMainContext, MainContext, MainThreadLanguageModelToolsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { IToolData, IToolDelta } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; +import type * as vscode from 'vscode'; + +export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape { + /** A map of tools that were registered in this EH */ + private readonly _registeredTools = new Map(); + private readonly _proxy: MainThreadLanguageModelToolsShape; + + /** A map of all known tools, from other EHs or registered in vscode core */ + private readonly _allTools = new Map(); + + constructor(mainContext: IMainContext) { + this._proxy = mainContext.getProxy(MainContext.MainThreadLanguageModelTools); + + this._proxy.$getTools().then(tools => { + for (const tool of tools) { + this._allTools.set(tool.id, tool); + } + }); + } + + async invokeTool(name: string, parameters: any, token: CancellationToken): Promise { + // Making the round trip here because not all tools were necessarily registered in this EH + return await this._proxy.$invokeTool(name, parameters, token); + } + + async $acceptToolDelta(delta: IToolDelta): Promise { + if (delta.added) { + this._allTools.set(delta.added.id, delta.added); + } + + if (delta.removed) { + this._allTools.delete(delta.removed); + } + } + + get tools(): vscode.LanguageModelToolDescription[] { + return Array.from(this._allTools.values()); + } + + async $invokeTool(id: string, parameters: any, token: CancellationToken): Promise { + const item = this._registeredTools.get(id); + if (!item) { + throw new Error(`Unknown tool ${id}`); + } + + return await item.tool.invoke(parameters, token); + } + + registerTool(extension: IExtensionDescription, id: string, tool: vscode.LanguageModelTool): IDisposable { + this._registeredTools.set(id, { extension, tool }); + this._proxy.$registerTool(id); + + return toDisposable(() => { + this._registeredTools.delete(id); + this._proxy.$unregisterTool(id); + }); + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 96ba482b2ab5d..e05071ee76f80 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -48,6 +48,7 @@ import { ChatAgentLocation, ChatAgentNameService, ChatAgentService, IChatAgentNa import { chatVariableLeader } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { ChatService } from 'vs/workbench/contrib/chat/common/chatServiceImpl'; +import { LanguageModelToolsService, ILanguageModelToolsService } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; import { ChatSlashCommandService, IChatSlashCommandService } from 'vs/workbench/contrib/chat/common/chatSlashCommands'; import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import { ChatWidgetHistoryService, IChatWidgetHistoryService } from 'vs/workbench/contrib/chat/common/chatWidgetHistoryService'; @@ -59,6 +60,7 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import '../common/chatColors'; import { registerChatContextActions } from 'vs/workbench/contrib/chat/browser/actions/chatContextActions'; import { registerChatDeveloperActions } from 'vs/workbench/contrib/chat/browser/actions/chatDeveloperActions'; +import { LanguageModelToolsExtensionPointHandler } from 'vs/workbench/contrib/chat/common/tools/toolsContributions'; // Register configuration const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); @@ -238,6 +240,7 @@ registerWorkbenchContribution2(ChatResolverContribution.ID, ChatResolverContribu workbenchContributionsRegistry.registerWorkbenchContribution(ChatSlashStaticSlashCommandsContribution, LifecyclePhase.Eventually); Registry.as(EditorExtensions.EditorFactory).registerEditorSerializer(ChatEditorInput.TypeID, ChatEditorInputSerializer); registerWorkbenchContribution2(ChatExtensionPointHandler.ID, ChatExtensionPointHandler, WorkbenchPhase.BlockStartup); +registerWorkbenchContribution2(LanguageModelToolsExtensionPointHandler.ID, LanguageModelToolsExtensionPointHandler, WorkbenchPhase.Eventually); registerChatActions(); registerChatCopyActions(); @@ -264,5 +267,6 @@ registerSingleton(IChatSlashCommandService, ChatSlashCommandService, Instantiati registerSingleton(IChatAgentService, ChatAgentService, InstantiationType.Delayed); registerSingleton(IChatAgentNameService, ChatAgentNameService, InstantiationType.Delayed); registerSingleton(IChatVariablesService, ChatVariablesService, InstantiationType.Delayed); +registerSingleton(ILanguageModelToolsService, LanguageModelToolsService, InstantiationType.Delayed); registerSingleton(IVoiceChatService, VoiceChatService, InstantiationType.Delayed); registerSingleton(IChatCodeBlockContextProviderService, ChatCodeBlockContextProviderService, InstantiationType.Delayed); diff --git a/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts b/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts new file mode 100644 index 0000000000000..910ddb2dc52f4 --- /dev/null +++ b/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter, Event } from 'vs/base/common/event'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { Iterable } from 'vs/base/common/iterator'; + +export interface IToolData { + id: string; + displayName?: string; + description: string; + parametersSchema?: Object; +} + +interface IToolEntry { + data: IToolData; + impl?: IToolImpl; +} + +export interface IToolImpl { + invoke(parameters: any, token: CancellationToken): Promise; +} + +export const ILanguageModelToolsService = createDecorator('ILanguageModelToolsService'); + +export interface IToolDelta { + added?: IToolData; + removed?: string; +} + +export interface ILanguageModelToolsService { + _serviceBrand: undefined; + onDidChangeTools: Event; + registerToolData(toolData: IToolData): IDisposable; + registerToolImplementation(id: string, tool: IToolImpl): IDisposable; + getTools(): Iterable>; + invokeTool(name: string, parameters: any, token: CancellationToken): Promise; +} + +export class LanguageModelToolsService implements ILanguageModelToolsService { + _serviceBrand: undefined; + + private _onDidChangeTools = new Emitter(); + readonly onDidChangeTools = this._onDidChangeTools.event; + + private _tools = new Map(); + + registerToolData(toolData: IToolData): IDisposable { + if (this._tools.has(toolData.id)) { + throw new Error(`Tool "${toolData.id}" is already registered.`); + } + + this._tools.set(toolData.id, { data: toolData }); + this._onDidChangeTools.fire({ added: toolData }); + + return toDisposable(() => { + this._tools.delete(toolData.id); + this._onDidChangeTools.fire({ removed: toolData.id }); + }); + + } + + registerToolImplementation(id: string, tool: IToolImpl): IDisposable { + const entry = this._tools.get(id); + if (!entry) { + throw new Error(`Tool "${id}" was not contributed.`); + } + + if (entry.impl) { + throw new Error(`Tool "${id}" already has an implementation.`); + } + + entry.impl = tool; + return toDisposable(() => { + entry.impl = undefined; + }); + } + + getTools(): Iterable> { + return Iterable.map(this._tools.values(), i => i.data); + } + + invokeTool(name: string, parameters: any, token: CancellationToken): Promise { + const tool = this._tools.get(name); + if (!tool?.impl) { + throw new Error(`Tool ${name} not found`); + } + + return tool.impl.invoke(parameters, token); + } +} diff --git a/src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts b/src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts new file mode 100644 index 0000000000000..619a491b809dd --- /dev/null +++ b/src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts @@ -0,0 +1,82 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import { DisposableMap } from 'vs/base/common/lifecycle'; +import { localize } from 'vs/nls'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { ILanguageModelToolsService } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; +import * as extensionsRegistry from 'vs/workbench/services/extensions/common/extensionsRegistry'; + +interface IRawToolContribution { + id: string; + displayName?: string; + description: string; + parametersSchema?: IJSONSchema; +} + +const languageModelToolsExtensionPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint({ + extensionPoint: 'languageModelTools', + jsonSchema: { + description: localize('vscode.extension.contributes.tools', 'Contributes a tool that can be invoked by a language model.'), + type: 'array', + items: { + additionalProperties: false, + type: 'object', + defaultSnippets: [{ body: { id: '', description: '' } }], + required: ['id', 'description'], + properties: { + id: { + description: localize('toolId', "A unique id for this tool."), + type: 'string' + }, + description: { + description: localize('toolDescription', "A description of this tool that may be passed to a language model."), + type: 'string' + }, + displayName: { + description: localize('toolDisplayName', "A human-readable name for this tool that may be used to describe it in the UI."), + type: 'string' + }, + parametersSchema: { + description: localize('parametersSchema', "A JSON schema for the parameters this tool accepts."), + type: 'object', + $ref: 'http://json-schema.org/draft-07/schema#' + } + } + } + } +}); + +function toToolKey(extensionIdentifier: ExtensionIdentifier, toolId: string) { + return `${extensionIdentifier.value}/${toolId}`; +} + +export class LanguageModelToolsExtensionPointHandler implements IWorkbenchContribution { + static readonly ID = 'workbench.contrib.toolsExtensionPointHandler'; + + private _registrationDisposables = new DisposableMap(); + + constructor( + @ILanguageModelToolsService languageModelToolsService: ILanguageModelToolsService + ) { + languageModelToolsExtensionPoint.setHandler((extensions, delta) => { + for (const extension of delta.added) { + for (const tool of extension.value) { + const disposable = languageModelToolsService.registerToolData(tool); + this._registrationDisposables.set(toToolKey(extension.description.identifier, tool.id), disposable); + } + } + + for (const extension of delta.removed) { + for (const tool of extension.value) { + this._registrationDisposables.deleteAndDispose(toToolKey(extension.description.identifier, tool.id)); + } + } + }); + } +} diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 87f6b82ce86e6..bf1db2ba23843 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -18,6 +18,7 @@ export const allApiProposals = Object.freeze({ chatParticipantPrivate: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', chatProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatProvider.d.ts', chatTab: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTab.d.ts', + chatTools: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTools.d.ts', chatVariableResolver: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts', codeActionAI: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionAI.d.ts', codeActionRanges: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionRanges.d.ts', diff --git a/src/vscode-dts/vscode.proposed.chatTools.d.ts b/src/vscode-dts/vscode.proposed.chatTools.d.ts new file mode 100644 index 0000000000000..97740f665a4a4 --- /dev/null +++ b/src/vscode-dts/vscode.proposed.chatTools.d.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + export namespace lm { + /** + * Register a LanguageModelTool. The tool must also be registered in the package.json `languageModelTools` contribution point. + */ + export function registerTool(toolId: string, tool: LanguageModelTool): Disposable; + + /** + * A list of all available tools. + */ + export const tools: ReadonlyArray; + + /** + * Invoke a tool with the given parameters. + */ + export function invokeTool(toolId: string, parameters: Object, token: CancellationToken): Thenable; + } + + export interface LanguageModelToolDescription { + id: string; + description: string; + parametersSchema?: JSONSchema; + displayName?: string; + } + + export interface LanguageModelTool { + invoke(parameters: any, token: CancellationToken): Thenable; + } +} From 54e0cddffb51553e76fb8d65474ba855c30621e8 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Tue, 18 Jun 2024 16:38:38 -0700 Subject: [PATCH 325/755] Remove accounts first before adding or updating (#216560) --- src/vs/workbench/browser/parts/globalCompositeBar.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/globalCompositeBar.ts b/src/vs/workbench/browser/parts/globalCompositeBar.ts index 5d203718ce4f7..533fbd0750834 100644 --- a/src/vs/workbench/browser/parts/globalCompositeBar.ts +++ b/src/vs/workbench/browser/parts/globalCompositeBar.ts @@ -337,6 +337,11 @@ export class AccountsActivityActionViewItem extends AbstractGlobalActivityAction })); this._register(this.authenticationService.onDidChangeSessions(async e => { + if (e.event.removed) { + for (const removed of e.event.removed) { + this.removeAccount(e.providerId, removed.account); + } + } for (const changed of [...(e.event.changed ?? []), ...(e.event.added ?? [])]) { try { await this.addOrUpdateAccount(e.providerId, changed.account); @@ -344,11 +349,6 @@ export class AccountsActivityActionViewItem extends AbstractGlobalActivityAction this.logService.error(e); } } - if (e.event.removed) { - for (const removed of e.event.removed) { - this.removeAccount(e.providerId, removed.account); - } - } })); } From 23c85ae40f202e0febdeba4a50b7b55d8d2c42ea Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 18 Jun 2024 18:09:42 -0700 Subject: [PATCH 326/755] Add "Toggle Breakpoint" to command palette (#216561) Fix #207167 --- src/vs/workbench/contrib/debug/browser/debugEditorActions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts index 5f4bbc06b00f5..4f613027aaf69 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts @@ -40,6 +40,7 @@ class ToggleBreakpointAction extends Action2 { ...nls.localize2('toggleBreakpointAction', "Debug: Toggle Breakpoint"), mnemonicTitle: nls.localize({ key: 'miToggleBreakpoint', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breakpoint"), }, + f1: true, precondition: CONTEXT_DEBUGGERS_AVAILABLE, keybinding: { when: ContextKeyExpr.or(EditorContextKeys.editorTextFocus, CONTEXT_DISASSEMBLY_VIEW_FOCUS), From c2e20cb17fae44eb26611cb9a4690059cea0e605 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2024 03:55:06 +0200 Subject: [PATCH 327/755] Silent warning when argv.json has syntax errors (fix #212671) (#215551) --- src/main.js | 4 +- src/vs/base/common/json.ts | 34 --------- .../common/{stripComments.d.ts => jsonc.d.ts} | 10 +++ .../common/{stripComments.js => jsonc.js} | 25 +++++-- ...tripComments.test.ts => jsonParse.test.ts} | 70 +++++++++++++++---- src/vs/code/electron-main/app.ts | 9 ++- .../encryption.contribution.ts | 4 +- src/vs/workbench/electron-sandbox/window.ts | 26 ++++++- .../electron-sandbox/localeService.ts | 4 +- 9 files changed, 122 insertions(+), 64 deletions(-) rename src/vs/base/common/{stripComments.d.ts => jsonc.d.ts} (74%) rename src/vs/base/common/{stripComments.js => jsonc.js} (78%) rename src/vs/base/test/common/{stripComments.test.ts => jsonParse.test.ts} (58%) diff --git a/src/main.js b/src/main.js index d4bc388fb7ff0..6294a15298c6e 100644 --- a/src/main.js +++ b/src/main.js @@ -21,7 +21,7 @@ const os = require('os'); const bootstrap = require('./bootstrap'); const bootstrapNode = require('./bootstrap-node'); const { getUserDataPath } = require('./vs/platform/environment/node/userDataPath'); -const { stripComments } = require('./vs/base/common/stripComments'); +const { parse } = require('./vs/base/common/jsonc'); const { getUNCHost, addUNCHostToAllowlist } = require('./vs/base/node/unc'); /** @type {Partial} */ // @ts-ignore @@ -316,7 +316,7 @@ function readArgvConfigSync() { const argvConfigPath = getArgvConfigPath(); let argvConfig; try { - argvConfig = JSON.parse(stripComments(fs.readFileSync(argvConfigPath).toString())); + argvConfig = parse(fs.readFileSync(argvConfigPath).toString()); } catch (error) { if (error && error.code === 'ENOENT') { createDefaultArgvConfigSync(argvConfigPath); diff --git a/src/vs/base/common/json.ts b/src/vs/base/common/json.ts index dadcbaf74f17e..e4adc59003e8f 100644 --- a/src/vs/base/common/json.ts +++ b/src/vs/base/common/json.ts @@ -1308,40 +1308,6 @@ export function visit(text: string, visitor: JSONVisitor, options: ParseOptions return true; } -/** - * Takes JSON with JavaScript-style comments and remove - * them. Optionally replaces every none-newline character - * of comments with a replaceCharacter - */ -export function stripComments(text: string, replaceCh?: string): string { - - const _scanner = createScanner(text); - const parts: string[] = []; - let kind: SyntaxKind; - let offset = 0; - let pos: number; - - do { - pos = _scanner.getPosition(); - kind = _scanner.scan(); - switch (kind) { - case SyntaxKind.LineCommentTrivia: - case SyntaxKind.BlockCommentTrivia: - case SyntaxKind.EOF: - if (offset !== pos) { - parts.push(text.substring(offset, pos)); - } - if (replaceCh !== undefined) { - parts.push(_scanner.getTokenValue().replace(/[^\r\n]/g, replaceCh)); - } - offset = _scanner.getPosition(); - break; - } - } while (kind !== SyntaxKind.EOF); - - return parts.join(''); -} - export function getNodeType(value: any): NodeType { switch (typeof value) { case 'boolean': return 'boolean'; diff --git a/src/vs/base/common/stripComments.d.ts b/src/vs/base/common/jsonc.d.ts similarity index 74% rename from src/vs/base/common/stripComments.d.ts rename to src/vs/base/common/jsonc.d.ts index af5b182b5bfba..504e6c60f9f85 100644 --- a/src/vs/base/common/stripComments.d.ts +++ b/src/vs/base/common/jsonc.d.ts @@ -3,11 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/** + * A drop-in replacement for JSON.parse that can parse + * JSON with comments and trailing commas. + * + * @param content the content to strip comments from + * @returns the parsed content as JSON +*/ +export function parse(content: string): any; + /** * Strips single and multi line JavaScript comments from JSON * content. Ignores characters in strings BUT doesn't support * string continuation across multiple lines since it is not * supported in JSON. + * * @param content the content to strip comments from * @returns the content without comments */ diff --git a/src/vs/base/common/stripComments.js b/src/vs/base/common/jsonc.js similarity index 78% rename from src/vs/base/common/stripComments.js rename to src/vs/base/common/jsonc.js index c59205e14ab79..7d8eacfdc10b8 100644 --- a/src/vs/base/common/stripComments.js +++ b/src/vs/base/common/jsonc.js @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; +/// //@ts-check +'use strict'; (function () { function factory(path, os, productName, cwd) { @@ -17,7 +18,6 @@ const regexp = /("[^"\\]*(?:\\.[^"\\]*)*")|('[^'\\]*(?:\\.[^'\\]*)*')|(\/\*[^\/\*]*(?:(?:\*|\/)[^\/\*]*)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))|(,\s*[}\]])/g; /** - * * @param {string} content * @returns {string} */ @@ -46,12 +46,27 @@ } }); } + + /** + * @param {string} content + * @returns {any} + */ + function parse(content) { + const commentsStripped = stripComments(content); + + try { + return JSON.parse(commentsStripped); + } catch (error) { + const trailingCommasStriped = commentsStripped.replace(/,\s*([}\]])/g, '$1'); + return JSON.parse(trailingCommasStriped); + } + } return { - stripComments + stripComments, + parse }; } - if (typeof define === 'function') { // amd define([], function () { return factory(); }); @@ -59,6 +74,6 @@ // commonjs module.exports = factory(); } else { - console.trace('strip comments defined in UNKNOWN context (neither requirejs or commonjs)'); + console.trace('jsonc defined in UNKNOWN context (neither requirejs or commonjs)'); } })(); diff --git a/src/vs/base/test/common/stripComments.test.ts b/src/vs/base/test/common/jsonParse.test.ts similarity index 58% rename from src/vs/base/test/common/stripComments.test.ts rename to src/vs/base/test/common/jsonParse.test.ts index e3bdff0c27847..48aa377b2f86f 100644 --- a/src/vs/base/test/common/stripComments.test.ts +++ b/src/vs/base/test/common/jsonParse.test.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { stripComments } from 'vs/base/common/stripComments'; +import { parse, stripComments } from 'vs/base/common/jsonc'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; -// We use this regular expression quite often to strip comments in JSON files. - -suite('Strip Comments', () => { +suite('JSON Parse', () => { ensureNoDisposablesAreLeakedInTestSuite(); test('Line comment', () => { @@ -23,7 +21,7 @@ suite('Strip Comments', () => { " \"prop\": 10 ", "}", ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Line comment - EOF', () => { const content: string = [ @@ -36,7 +34,7 @@ suite('Strip Comments', () => { "}", "" ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Line comment - \\r\\n', () => { const content: string = [ @@ -49,7 +47,7 @@ suite('Strip Comments', () => { " \"prop\": 10 ", "}", ].join('\r\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Line comment - EOF - \\r\\n', () => { const content: string = [ @@ -62,7 +60,7 @@ suite('Strip Comments', () => { "}", "" ].join('\r\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Block comment - single line', () => { const content: string = [ @@ -75,7 +73,7 @@ suite('Strip Comments', () => { " \"prop\": 10", "}", ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Block comment - multi line', () => { const content: string = [ @@ -92,7 +90,7 @@ suite('Strip Comments', () => { " \"prop\": 10", "}", ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Block comment - shortest match', () => { const content = "/* abc */ */"; @@ -110,7 +108,7 @@ suite('Strip Comments', () => { " \"/* */\": 10", "}" ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('No strings - single quote', () => { const content: string = [ @@ -136,7 +134,7 @@ suite('Strip Comments', () => { ` "a": 10`, "}" ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); }); test('Trailing comma in array', () => { const content: string = [ @@ -145,6 +143,52 @@ suite('Strip Comments', () => { const expected: string = [ `[ "a", "b", "c" ]` ].join('\n'); - assert.strictEqual(stripComments(content), expected); + assert.deepEqual(parse(content), JSON.parse(expected)); + }); + + test('Trailing comma', () => { + const content: string = [ + "{", + " \"propA\": 10, // a comment", + " \"propB\": false, // a trailing comma", + "}", + ].join('\n'); + const expected = [ + "{", + " \"propA\": 10,", + " \"propB\": false", + "}", + ].join('\n'); + assert.deepEqual(parse(content), JSON.parse(expected)); + }); + + test('Trailing comma - EOF', () => { + const content = ` +// This configuration file allows you to pass permanent command line arguments to VS Code. +// Only a subset of arguments is currently supported to reduce the likelihood of breaking +// the installation. +// +// PLEASE DO NOT CHANGE WITHOUT UNDERSTANDING THE IMPACT +// +// NOTE: Changing this file requires a restart of VS Code. +{ + // Use software rendering instead of hardware accelerated rendering. + // This can help in cases where you see rendering issues in VS Code. + // "disable-hardware-acceleration": true, + // Allows to disable crash reporting. + // Should restart the app if the value is changed. + "enable-crash-reporter": true, + // Unique id used for correlating crash reports sent from this instance. + // Do not edit this value. + "crash-reporter-id": "aaaaab31-7453-4506-97d0-93411b2c21c7", + "locale": "en", + // "log-level": "trace" +} +`; + assert.deepEqual(parse(content), { + "enable-crash-reporter": true, + "crash-reporter-id": "aaaaab31-7453-4506-97d0-93411b2c21c7", + "locale": "en" + }); }); }); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 9d84281819d35..0f538770a8940 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -12,7 +12,7 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import { isSigPipeError, onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { isEqualOrParent } from 'vs/base/common/extpath'; import { Event } from 'vs/base/common/event'; -import { stripComments } from 'vs/base/common/json'; +import { parse } from 'vs/base/common/jsonc'; import { getPathLabel } from 'vs/base/common/labels'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas, VSCODE_AUTHORITY } from 'vs/base/common/network'; @@ -1394,10 +1394,10 @@ export class CodeApplication extends Disposable { // Crash reporter this.updateCrashReporterEnablement(); + // macOS: rosetta translation warning if (isMacintosh && app.runningUnderARM64Translation) { this.windowsMainService?.sendToFocused('vscode:showTranslatedBuildWarning'); } - } private async installMutex(): Promise { @@ -1437,7 +1437,7 @@ export class CodeApplication extends Disposable { try { const argvContent = await this.fileService.readFile(this.environmentMainService.argvResource); const argvString = argvContent.value.toString(); - const argvJSON = JSON.parse(stripComments(argvString)); + const argvJSON = parse(argvString); const telemetryLevel = getTelemetryLevel(this.configurationService); const enableCrashReporter = telemetryLevel >= TelemetryLevel.CRASH; @@ -1468,6 +1468,9 @@ export class CodeApplication extends Disposable { } } catch (error) { this.logService.error(error); + + // Inform the user via notification + this.windowsMainService?.sendToFocused('vscode:showArgvParseWarning'); } } } diff --git a/src/vs/workbench/contrib/encryption/electron-sandbox/encryption.contribution.ts b/src/vs/workbench/contrib/encryption/electron-sandbox/encryption.contribution.ts index 9969928a2b528..48580f61c8229 100644 --- a/src/vs/workbench/contrib/encryption/electron-sandbox/encryption.contribution.ts +++ b/src/vs/workbench/contrib/encryption/electron-sandbox/encryption.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { isLinux } from 'vs/base/common/platform'; -import { stripComments } from 'vs/base/common/stripComments'; +import { parse } from 'vs/base/common/jsonc'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -34,7 +34,7 @@ class EncryptionContribution implements IWorkbenchContribution { } try { const content = await this.fileService.readFile(this.environmentService.argvResource); - const argv = JSON.parse(stripComments(content.value.toString())); + const argv = parse(content.value.toString()); if (argv['password-store'] === 'gnome' || argv['password-store'] === 'gnome-keyring') { this.jsonEditingService.write(this.environmentService.argvResource, [{ path: ['password-store'], value: 'gnome-libsecret' }], true); } diff --git a/src/vs/workbench/electron-sandbox/window.ts b/src/vs/workbench/electron-sandbox/window.ts index 73ebdb1b2a959..7d8a1901d7a52 100644 --- a/src/vs/workbench/electron-sandbox/window.ts +++ b/src/vs/workbench/electron-sandbox/window.ts @@ -204,7 +204,10 @@ export class NativeWindow extends BaseWindow { [{ label: localize('restart', "Restart"), run: () => this.nativeHostService.relaunch() - }] + }], + { + priority: NotificationPriority.URGENT + } ); }); @@ -248,7 +251,7 @@ export class NativeWindow extends BaseWindow { ); }); - ipcRenderer.on('vscode:showTranslatedBuildWarning', (event: unknown, message: string) => { + ipcRenderer.on('vscode:showTranslatedBuildWarning', () => { this.notificationService.prompt( Severity.Warning, localize("runningTranslated", "You are running an emulated version of {0}. For better performance download the native arm64 version of {0} build for your machine.", this.productService.nameLong), @@ -260,7 +263,24 @@ export class NativeWindow extends BaseWindow { const insidersURL = 'https://code.visualstudio.com/docs/?dv=osx&build=insiders'; this.openerService.open(quality === 'stable' ? stableURL : insidersURL); } - }] + }], + { + priority: NotificationPriority.URGENT + } + ); + }); + + ipcRenderer.on('vscode:showArgvParseWarning', (event: unknown, message: string) => { + this.notificationService.prompt( + Severity.Warning, + localize("showArgvParseWarning", "The runtime arguments file 'argv.json' contains errors. Please correct them and restart."), + [{ + label: localize('showArgvParseWarningAction', "Open File"), + run: () => this.editorService.openEditor({ resource: this.nativeEnvironmentService.argvResource }) + }], + { + priority: NotificationPriority.URGENT + } ); }); diff --git a/src/vs/workbench/services/localization/electron-sandbox/localeService.ts b/src/vs/workbench/services/localization/electron-sandbox/localeService.ts index d7124758e38bc..9786b3c73de23 100644 --- a/src/vs/workbench/services/localization/electron-sandbox/localeService.ts +++ b/src/vs/workbench/services/localization/electron-sandbox/localeService.ts @@ -16,7 +16,7 @@ import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/ import { localize } from 'vs/nls'; import { toAction } from 'vs/base/common/actions'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { stripComments } from 'vs/base/common/stripComments'; +import { parse } from 'vs/base/common/jsonc'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; @@ -57,7 +57,7 @@ class NativeLocaleService implements ILocaleService { // This is the same logic that we do where argv.json is parsed so mirror that: // https://github.com/microsoft/vscode/blob/32d40cf44e893e87ac33ac4f08de1e5f7fe077fc/src/main.js#L238-L246 - JSON.parse(stripComments(content.value)); + parse(content.value); } catch (error) { this.notificationService.notify({ severity: Severity.Error, From 83f03bbb7bf979e05299a6240e81f3cdb3c41ad5 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 19 Jun 2024 08:35:55 +0200 Subject: [PATCH 328/755] debt - enlist most JS files in `tsconfig.json` (#216566) --- build/lib/layersChecker.js | 55 +++-------------- build/lib/layersChecker.ts | 61 +++---------------- src/tsconfig.json | 11 ++++ src/tsconfig.tsec.json | 1 + .../processExplorer/processExplorer.js | 2 +- .../electron-sandbox/workbench/workbench.js | 13 ++-- .../issue/electron-sandbox/issueReporter.js | 2 +- .../webview/browser/pre/service-worker.js | 2 +- 8 files changed, 38 insertions(+), 109 deletions(-) diff --git a/build/lib/layersChecker.js b/build/lib/layersChecker.js index dce2b85d6589a..7494b71bb6651 100644 --- a/build/lib/layersChecker.js +++ b/build/lib/layersChecker.js @@ -68,7 +68,8 @@ const CORE_TYPES = [ 'fetch', 'RequestInit', 'Headers', - 'Response' + 'Response', + '__global' ]; // Types that are defined in a common layer but are known to be only // available in native environments should not be allowed in browser @@ -170,59 +171,17 @@ const RULES = [ '@types/node' // no node.js ] }, - // Common: vs/workbench/api/common/extHostTypes.ts + // Common: vs/base/parts/sandbox/electron-sandbox/preload.js { - target: '**/vs/workbench/api/common/extHostTypes.ts', + target: '**/vs/base/parts/sandbox/electron-sandbox/preload.js', allowedTypes: [ ...CORE_TYPES, - // Safe access to global - '__global' - ], - disallowedTypes: NATIVE_TYPES, - disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM - '@types/node' // no node.js - ] - }, - // Common: vs/workbench/api/common/extHostChatAgents2.ts - { - target: '**/vs/workbench/api/common/extHostChatAgents2.ts', - allowedTypes: [ - ...CORE_TYPES, - // Safe access to global - '__global' + // Safe access to a very small subset of node.js + 'process', + 'NodeJS' ], disallowedTypes: NATIVE_TYPES, disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM - '@types/node' // no node.js - ] - }, - // Common: vs/workbench/api/common/extHostChatVariables.ts - { - target: '**/vs/workbench/api/common/extHostChatVariables.ts', - allowedTypes: [ - ...CORE_TYPES, - // Safe access to global - '__global' - ], - disallowedTypes: NATIVE_TYPES, - disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM - '@types/node' // no node.js - ] - }, - // Common: vs/workbench/api/common/extensionHostMain.ts - { - target: '**/vs/workbench/api/common/extensionHostMain.ts', - allowedTypes: [ - ...CORE_TYPES, - // Safe access to global - '__global' - ], - disallowedTypes: NATIVE_TYPES, - disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM '@types/node' // no node.js ] }, diff --git a/build/lib/layersChecker.ts b/build/lib/layersChecker.ts index 039f222135d5f..4861fa6d86e91 100644 --- a/build/lib/layersChecker.ts +++ b/build/lib/layersChecker.ts @@ -69,7 +69,8 @@ const CORE_TYPES = [ 'fetch', 'RequestInit', 'Headers', - 'Response' + 'Response', + '__global' ]; // Types that are defined in a common layer but are known to be only @@ -185,66 +186,18 @@ const RULES: IRule[] = [ ] }, - // Common: vs/workbench/api/common/extHostTypes.ts + // Common: vs/base/parts/sandbox/electron-sandbox/preload.js { - target: '**/vs/workbench/api/common/extHostTypes.ts', + target: '**/vs/base/parts/sandbox/electron-sandbox/preload.js', allowedTypes: [ ...CORE_TYPES, - // Safe access to global - '__global' + // Safe access to a very small subset of node.js + 'process', + 'NodeJS' ], disallowedTypes: NATIVE_TYPES, disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM - '@types/node' // no node.js - ] - }, - - // Common: vs/workbench/api/common/extHostChatAgents2.ts - { - target: '**/vs/workbench/api/common/extHostChatAgents2.ts', - allowedTypes: [ - ...CORE_TYPES, - - // Safe access to global - '__global' - ], - disallowedTypes: NATIVE_TYPES, - disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM - '@types/node' // no node.js - ] - }, - - // Common: vs/workbench/api/common/extHostChatVariables.ts - { - target: '**/vs/workbench/api/common/extHostChatVariables.ts', - allowedTypes: [ - ...CORE_TYPES, - - // Safe access to global - '__global' - ], - disallowedTypes: NATIVE_TYPES, - disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM - '@types/node' // no node.js - ] - }, - - // Common: vs/workbench/api/common/extensionHostMain.ts - { - target: '**/vs/workbench/api/common/extensionHostMain.ts', - allowedTypes: [ - ...CORE_TYPES, - - // Safe access to global - '__global' - ], - disallowedTypes: NATIVE_TYPES, - disallowedDefinitions: [ - 'lib.dom.d.ts', // no DOM '@types/node' // no node.js ] }, diff --git a/src/tsconfig.json b/src/tsconfig.json index 35421bb1aaafc..257ea8879f4b0 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -34,6 +34,17 @@ "./main.js", "./server-main.js", "./server-cli.js", + "./vs/base/common/jsonc.js", + "./vs/base/common/performance.js", + "./vs/base/node/unc.js", + "./vs/base/node/languagePacks.js", + "./vs/platform/environment/node/userDataPath.js", + "./vs/base/parts/sandbox/electron-sandbox/preload-aux.js", + "./vs/base/parts/sandbox/electron-sandbox/preload.js", + "./vs/code/electron-sandbox/processExplorer/processExplorer.js", + "./vs/code/electron-sandbox/workbench/workbench.js", + "./vs/workbench/contrib/issue/electron-sandbox/issueReporter.js", + "./vs/workbench/contrib/webview/browser/pre/service-worker.js", "./typings", "./vs/**/*.ts", "vscode-dts/vscode.proposed.*.d.ts", diff --git a/src/tsconfig.tsec.json b/src/tsconfig.tsec.json index d2524df22d462..d822b0a4e8979 100644 --- a/src/tsconfig.tsec.json +++ b/src/tsconfig.tsec.json @@ -10,6 +10,7 @@ ] }, "exclude": [ + "./vs/workbench/contrib/webview/browser/pre/service-worker.js", "*/test/*", "**/*.test.ts" ] diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer.js b/src/vs/code/electron-sandbox/processExplorer/processExplorer.js index 8234b734d06ca..ca61af7d50f2a 100644 --- a/src/vs/code/electron-sandbox/processExplorer/processExplorer.js +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer.js @@ -26,7 +26,7 @@ * @returns {{ * load: ( * modules: string[], - * resultCallback: (result, configuration: ISandboxConfiguration) => unknown, + * resultCallback: (result: any, configuration: ISandboxConfiguration) => unknown, * options?: { * configureDeveloperSettings?: (config: ISandboxConfiguration) => { * forceEnableDeveloperKeybindings?: boolean, diff --git a/src/vs/code/electron-sandbox/workbench/workbench.js b/src/vs/code/electron-sandbox/workbench/workbench.js index 35e8368d3c9f6..450b99a85f785 100644 --- a/src/vs/code/electron-sandbox/workbench/workbench.js +++ b/src/vs/code/electron-sandbox/workbench/workbench.js @@ -45,6 +45,7 @@ showSplash(windowConfig); }, beforeLoaderConfig: function (loaderConfig) { + // @ts-ignore loaderConfig.recordStats = true; }, beforeRequire: function (windowConfig) { @@ -81,7 +82,7 @@ * @returns {{ * load: ( * modules: string[], - * resultCallback: (result, configuration: INativeWindowConfiguration & NativeParsedArgs) => unknown, + * resultCallback: (result: any, configuration: INativeWindowConfiguration & NativeParsedArgs) => unknown, * options?: { * configureDeveloperSettings?: (config: INativeWindowConfiguration & NativeParsedArgs) => { * forceDisableShowDevtoolsOnError?: boolean, @@ -129,7 +130,9 @@ } // minimal color configuration (works with or without persisted data) - let baseTheme, shellBackground, shellForeground; + let baseTheme; + let shellBackground; + let shellForeground; if (data) { baseTheme = data.baseTheme; shellBackground = data.colorInfo.editorBackground; @@ -162,7 +165,9 @@ style.textContent = `body { background-color: ${shellBackground}; color: ${shellForeground}; margin: 0; padding: 0; }`; // set zoom level as soon as possible + // @ts-ignore if (typeof data?.zoomLevel === 'number' && typeof globalThis.vscode?.webFrame?.setZoomLevel === 'function') { + // @ts-ignore globalThis.vscode.webFrame.setZoomLevel(data.zoomLevel); } @@ -172,9 +177,9 @@ const splash = document.createElement('div'); splash.id = 'monaco-parts-splash'; - splash.className = baseTheme; + splash.className = baseTheme ?? 'vs-dark'; - if (layoutInfo.windowBorder) { + if (layoutInfo.windowBorder && colorInfo.windowBorder) { splash.style.position = 'relative'; splash.style.height = 'calc(100vh - 2px)'; splash.style.width = 'calc(100vw - 2px)'; diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js index cad5ddba090d4..03f3200ce5995 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js @@ -29,7 +29,7 @@ * @returns {{ * load: ( * modules: string[], - * resultCallback: (result, configuration: ISandboxConfiguration) => unknown, + * resultCallback: (result: any, configuration: ISandboxConfiguration) => unknown, * options?: { * configureDeveloperSettings?: (config: ISandboxConfiguration) => { * forceEnableDeveloperKeybindings?: boolean, diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index a6e9943b8669d..1da9709c314c5 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -168,7 +168,7 @@ sw.addEventListener('message', async (event) => { sw.addEventListener('fetch', (event) => { const requestUrl = new URL(event.request.url); - if (requestUrl.protocol === 'https:' && requestUrl.hostname.endsWith('.' + resourceBaseAuthority)) { + if (typeof resourceBaseAuthority === 'string' && requestUrl.protocol === 'https:' && requestUrl.hostname.endsWith('.' + resourceBaseAuthority)) { switch (event.request.method) { case 'GET': case 'HEAD': { From d196a315d606f696b119e002e354f607fdc82e3e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2024 08:53:55 +0200 Subject: [PATCH 329/755] make sure telemetry source for inline widget toolbar is set (#216580) --- src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index f378f83f709f6..ea1fe1355f7ab 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -204,6 +204,7 @@ export class InlineChatWidget { // TEXT-ONLY bar const statusToolbarMenu = scopedInstaService.createInstance(MenuWorkbenchToolBar, this._elements.statusToolbar, statusMenuId, { hiddenItemStrategy: HiddenItemStrategy.NoHide, + telemetrySource: options.chatWidgetViewOptions?.menus?.telemetrySource, actionViewItemProvider: action => action instanceof MenuItemAction ? this._instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { conversational: true }) : undefined, toolbarOptions: { primaryGroup: '0_main' }, menuOptions: { renderShortTitle: true }, @@ -218,6 +219,7 @@ export class InlineChatWidget { const statusMenuOptions = options.statusMenuId instanceof MenuId ? undefined : options.statusMenuId.options; const statusButtonBar = scopedInstaService.createInstance(MenuWorkbenchButtonBar, this._elements.statusToolbar, statusMenuId, { toolbarOptions: { primaryGroup: '0_main' }, + telemetrySource: options.chatWidgetViewOptions?.menus?.telemetrySource, menuOptions: { renderShortTitle: true }, ...statusMenuOptions, }); From a95b0a0ca70633ec13b27f4808fd0a13dafd6d13 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2024 09:46:36 +0200 Subject: [PATCH 330/755] fix a few more leaking listeners (#216584) https://github.com/microsoft/vscode/issues/214234 --- src/vs/workbench/contrib/logs/common/logs.contribution.ts | 4 ++-- .../extensions/electron-sandbox/localProcessExtensionHost.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/logs/common/logs.contribution.ts b/src/vs/workbench/contrib/logs/common/logs.contribution.ts index b96ba30f68c7d..a5c4206346387 100644 --- a/src/vs/workbench/contrib/logs/common/logs.contribution.ts +++ b/src/vs/workbench/contrib/logs/common/logs.contribution.ts @@ -70,11 +70,11 @@ class LogOutputChannels extends Disposable implements IWorkbenchContribution { super(); const contextKey = CONTEXT_LOG_LEVEL.bindTo(contextKeyService); contextKey.set(LogLevelToString(loggerService.getLogLevel())); - loggerService.onDidChangeLogLevel(e => { + this._register(loggerService.onDidChangeLogLevel(e => { if (isLogLevel(e)) { contextKey.set(LogLevelToString(loggerService.getLogLevel())); } - }); + })); this.onDidAddLoggers(loggerService.getRegisteredLoggers()); this._register(loggerService.onDidChangeLoggers(({ added, removed }) => { diff --git a/src/vs/workbench/services/extensions/electron-sandbox/localProcessExtensionHost.ts b/src/vs/workbench/services/extensions/electron-sandbox/localProcessExtensionHost.ts index 0074c58d815cf..911ae77eab687 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/localProcessExtensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/localProcessExtensionHost.ts @@ -281,7 +281,7 @@ export class NativeLocalProcessExtensionHost implements IExtensionHost { // Lifecycle - this._extensionHostProcess.onExit(({ code, signal }) => this._onExtHostProcessExit(code, signal)); + this._toDispose.add(this._extensionHostProcess.onExit(({ code, signal }) => this._onExtHostProcessExit(code, signal))); // Notify debugger that we are ready to attach to the process if we run a development extension if (portNumber) { From 984c143f321310c53766f1f74a655d2cba13be69 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2024 10:19:06 +0200 Subject: [PATCH 331/755] add experimental setting to enable variable completions for all chat locations (editor, notebook, terminal) (#216588) --- .../contrib/chat/browser/chat.contribution.ts | 17 +++++++++++++++-- .../browser/contrib/chatInputCompletions.ts | 13 ++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index e05071ee76f80..f6c0a8b70bf14 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -101,10 +101,23 @@ configurationRegistry.registerConfiguration({ deprecated: true, default: false }, + 'chat.experimental.variables.editor': { + type: 'boolean', + description: nls.localize('chat.experimental.variables.editor', "Enables variables for editor chat."), + default: false + }, + 'chat.experimental.variables.notebook': { + type: 'boolean', + description: nls.localize('chat.experimental.variables.notebook', "Enables variables for notebook chat."), + default: false + }, + 'chat.experimental.variables.terminal': { + type: 'boolean', + description: nls.localize('chat.experimental.variables.terminal', "Enables variables for terminal chat."), + default: false + }, } }); - - Registry.as(EditorExtensions.EditorPane).registerEditorPane( EditorPaneDescriptor.create( ChatEditor, diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts index 1dbda1e1150e4..9509e38f8d1e9 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts @@ -13,6 +13,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { localize } from 'vs/nls'; import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; @@ -361,6 +362,7 @@ class VariableCompletions extends Disposable { @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, @IChatWidgetService private readonly chatWidgetService: IChatWidgetService, @IChatVariablesService private readonly chatVariablesService: IChatVariablesService, + @IConfigurationService configService: IConfigurationService, ) { super(); @@ -369,8 +371,17 @@ class VariableCompletions extends Disposable { triggerCharacters: [chatVariableLeader], provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, _token: CancellationToken) => { + const locations = new Set(); + locations.add(ChatAgentLocation.Panel); + + for (const value of Object.values(ChatAgentLocation)) { + if (typeof value === 'string' && configService.getValue(`chat.experimental.variables.${value}`)) { + locations.add(value); + } + } + const widget = this.chatWidgetService.getWidgetByInputUri(model.uri); - if (!widget || widget.location !== ChatAgentLocation.Panel /* TODO@jrieken - enable when agents are adopted*/) { + if (!widget || !locations.has(widget.location)) { return null; } From 6ce431530043a60208c2573ba5c3581923327e2f Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 19 Jun 2024 12:31:19 +0200 Subject: [PATCH 332/755] Update file comment proposal (#216600) Part of #214327 --- .../workbench/api/common/extHostComments.ts | 2 +- ...e.proposed.commentThreadApplicability.d.ts | 10 +++ .../vscode.proposed.fileComments.d.ts | 68 ++++--------------- 3 files changed, 23 insertions(+), 57 deletions(-) diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index fea2727292578..53b5176c25bbb 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -215,7 +215,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo } else if (rangesResult) { ranges = { ranges: rangesResult.ranges || [], - fileComments: rangesResult.fileComments || false + fileComments: rangesResult.enableFileComments || false }; } else { ranges = rangesResult ?? undefined; diff --git a/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts b/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts index e09f5a34d6bc2..547ee182227ea 100644 --- a/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts +++ b/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts @@ -28,5 +28,15 @@ declare module 'vscode' { * Worth noting that we already have this problem for the `comments` property. */ state?: CommentThreadState | { resolved?: CommentThreadState; applicability?: CommentThreadApplicability }; + readonly uri: Uri; + range: Range | undefined; + comments: readonly Comment[]; + collapsibleState: CommentThreadCollapsibleState; + canReply: boolean; + contextValue?: string; + label?: string; + dispose(): void; + // Part of the comment reveal proposal + reveal(options?: CommentThreadRevealOptions): Thenable; } } diff --git a/src/vscode-dts/vscode.proposed.fileComments.d.ts b/src/vscode-dts/vscode.proposed.fileComments.d.ts index e21b3abfb7af3..8f8c7d2d9436e 100644 --- a/src/vscode-dts/vscode.proposed.fileComments.d.ts +++ b/src/vscode-dts/vscode.proposed.fileComments.d.ts @@ -6,71 +6,27 @@ declare module 'vscode' { export interface CommentThread2 { - /** - * The uri of the document the thread has been created on. - */ - readonly uri: Uri; - /** * The range the comment thread is located within the document. The thread icon will be shown - * at the last line of the range. + * at the last line of the range. When set to undefined, the comment will be associated with the + * file, and not a specific range. */ range: Range | undefined; + } + /** + * The ranges a CommentingRangeProvider enables commenting on. + */ + export interface CommentingRanges { /** - * The ordered comments of the thread. - */ - comments: readonly Comment[]; - - /** - * Whether the thread should be collapsed or expanded when opening the document. - * Defaults to Collapsed. - */ - collapsibleState: CommentThreadCollapsibleState; - - /** - * Whether the thread supports reply. - * Defaults to true. - */ - canReply: boolean; - - /** - * Context value of the comment thread. This can be used to contribute thread specific actions. - * For example, a comment thread is given a context value as `editable`. When contributing actions to `comments/commentThread/title` - * using `menus` extension point, you can specify context value for key `commentThread` in `when` expression like `commentThread == editable`. - * ```json - * "contributes": { - * "menus": { - * "comments/commentThread/title": [ - * { - * "command": "extension.deleteCommentThread", - * "when": "commentThread == editable" - * } - * ] - * } - * } - * ``` - * This will show action `extension.deleteCommentThread` only for comment threads with `contextValue` is `editable`. - */ - contextValue?: string; - - /** - * The optional human-readable label describing the {@link CommentThread Comment Thread} + * Enables comments to be added to a file without a specific range. */ - label?: string; - - // from the commentThreadRelevance proposal - state?: CommentThreadState | { resolved?: CommentThreadState; applicability?: CommentThreadApplicability }; + enableFileComments: boolean; /** - * Dispose this comment thread. - * - * Once disposed, this comment thread will be removed from visible editors and Comment Panel when appropriate. + * The ranges which allow new comment threads creation. */ - dispose(): void; - - // Part of the comment reveal proposal - reveal(options?: CommentThreadRevealOptions): Thenable; + ranges?: Range[] } export interface CommentController { @@ -81,6 +37,6 @@ declare module 'vscode' { /** * Provide a list of ranges which allow new comment threads creation or null for a given document */ - provideCommentingRanges(document: TextDocument, token: CancellationToken): ProviderResult; + provideCommentingRanges(document: TextDocument, token: CancellationToken): ProviderResult; } } From bf74ad22b47ce51f23877ea92f02fe3357b1863a Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:12:58 +0200 Subject: [PATCH 333/755] SCM - keep logging but switch the trace level (#216611) --- src/vs/workbench/api/browser/mainThreadSCM.ts | 9 +--- .../workbench/contrib/scm/browser/activity.ts | 48 +++++++------------ 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index b3c3f8b88485f..1aea5f1db905e 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -28,7 +28,6 @@ import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/s import { Schemas } from 'vs/base/common/network'; import { ITextModel } from 'vs/editor/common/model'; import { ILogService } from 'vs/platform/log/common/log'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; function getIconFromIconDto(iconDto?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon): URI | { light: URI; dark: URI } | ThemeIcon | undefined { if (iconDto === undefined) { @@ -273,7 +272,6 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { private readonly _quickDiffService: IQuickDiffService, private readonly _uriIdentService: IUriIdentityService, private readonly _workspaceContextService: IWorkspaceContextService, - private readonly _environmentService: IWorkbenchEnvironmentService, private readonly _logService: ILogService ) { if (_rootUri) { @@ -299,9 +297,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (typeof features.statusBarCommands !== 'undefined') { - if (this._environmentService.enableSmokeTestDriver) { - this._logService.info(`MainThreadSCMProvider#updateSourceControl (${this._id}): ${features.statusBarCommands.map(c => c.title).join(', ')}`); - } + this._logService.trace(`MainThreadSCMProvider#updateSourceControl (${this._id}): ${features.statusBarCommands.map(c => c.title).join(', ')}`); this._statusBarCommands.set(features.statusBarCommands, undefined); } @@ -483,7 +479,6 @@ export class MainThreadSCM implements MainThreadSCMShape { @IQuickDiffService private readonly quickDiffService: IQuickDiffService, @IUriIdentityService private readonly _uriIdentService: IUriIdentityService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @ILogService private readonly logService: ILogService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSCM); @@ -505,7 +500,7 @@ export class MainThreadSCM implements MainThreadSCMShape { this._repositoryBarriers.set(handle, new Barrier()); const inputBoxTextModelRef = await this.textModelService.createModelReference(URI.revive(inputBoxDocumentUri)); - const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService, this.environmentService, this.logService); + const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService, this.logService); const repository = this.scmService.registerSCMProvider(provider); this._repositories.set(handle, repository); diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index b50b677271b63..718c14752333c 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -28,7 +28,6 @@ import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts import { Command } from 'vs/editor/common/languages'; import { ISCMHistoryItemGroup } from 'vs/workbench/contrib/scm/common/history'; import { ILogService } from 'vs/platform/log/common/log'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -50,17 +49,13 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private readonly _activeEditorRepository = derivedObservableWithCache(this, (reader, lastValue) => { const activeResource = EditorResourceAccessor.getOriginalUri(this._activeEditor.read(reader)); if (!activeResource) { - if (this.environmentService.enableSmokeTestDriver) { - this.logService.info('SCMActiveRepositoryController (activeEditorRepository derived): no activeResource'); - } + this.logService.trace('SCMActiveRepositoryController (activeEditorRepository derived): no activeResource'); return lastValue; } const repository = this.scmService.getRepository(activeResource); if (!repository) { - if (this.environmentService.enableSmokeTestDriver) { - this.logService.info(`SCMActiveRepositoryController (activeEditorRepository derived): no repository for '${activeResource.toString()}'`); - } + this.logService.trace(`SCMActiveRepositoryController (activeEditorRepository derived): no repository for '${activeResource.toString()}'`); return lastValue; } @@ -115,8 +110,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe @ISCMService private readonly scmService: ISCMService, @ISCMViewService private readonly scmViewService: ISCMViewService, @IStatusbarService private readonly statusbarService: IStatusbarService, - @ITitleService private readonly titleService: ITitleService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService + @ITitleService private readonly titleService: ITitleService ) { super(); @@ -128,23 +122,21 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe { name: 'activeRepositoryBranchName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryBranchName.key, } ]); - if (this.environmentService.enableSmokeTestDriver) { - this._register(autorun(reader => { - const repository = this._focusedRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader); + this._register(autorun(reader => { + const repository = this._focusedRepository.read(reader); + const commands = repository?.provider.statusBarCommands.read(reader); - this.logService.info('SCMActiveRepositoryController (focusedRepository):', repository?.id ?? 'no id'); - this.logService.info('SCMActiveRepositoryController (focusedRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); - })); + this.logService.trace('SCMActiveRepositoryController (focusedRepository):', repository?.id ?? 'no id'); + this.logService.trace('SCMActiveRepositoryController (focusedRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); + })); - this._register(autorun(reader => { - const repository = this._activeEditorRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader); + this._register(autorun(reader => { + const repository = this._activeEditorRepository.read(reader); + const commands = repository?.provider.statusBarCommands.read(reader); - this.logService.info('SCMActiveRepositoryController (activeEditorRepository):', repository?.id ?? 'no id'); - this.logService.info('SCMActiveRepositoryController (activeEditorRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); - })); - } + this.logService.trace('SCMActiveRepositoryController (activeEditorRepository):', repository?.id ?? 'no id'); + this.logService.trace('SCMActiveRepositoryController (activeEditorRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); + })); this._register(autorunWithStore((reader, store) => { this._updateActivityCountBadge(this._countBadge.read(reader), store); @@ -154,10 +146,8 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe const repository = this._activeRepository.read(reader); const commands = repository?.provider.statusBarCommands.read(reader); - if (this.environmentService.enableSmokeTestDriver) { - this.logService.info('SCMActiveRepositoryController (status bar):', repository?.id ?? 'no id'); - this.logService.info('SCMActiveRepositoryController (status bar):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); - } + this.logService.trace('SCMActiveRepositoryController (status bar):', repository?.id ?? 'no id'); + this.logService.trace('SCMActiveRepositoryController (status bar):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); this._updateStatusBar(repository, commands ?? [], store); })); @@ -185,9 +175,7 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private _updateStatusBar(repository: ISCMRepository | undefined, commands: readonly Command[], store: DisposableStore): void { if (!repository) { - if (this.environmentService.enableSmokeTestDriver) { - this.logService.info('SCMActiveRepositoryController (status bar): repository is undefined'); - } + this.logService.trace('SCMActiveRepositoryController (status bar): repository is undefined'); return; } From ca601132ef5ff0a072d0076bddf8950d1d883030 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Wed, 19 Jun 2024 06:17:58 -0700 Subject: [PATCH 334/755] Interactive window execution hint (#216524) * use similar textRenderer function to get hint element * formatted execution hint with gear * make the keybinding a link * link to settings * remove configure link * clean up element to update * wrap properly and fix aria status * cleanup --- .../browser/accessibilityConfiguration.ts | 5 + .../browser/interactive.contribution.ts | 23 ++- .../interactive/browser/interactiveCommon.ts | 4 +- .../interactive/browser/interactiveEditor.ts | 68 ++++---- .../browser/replInputHintContentWidget.ts | 155 ++++++++++++++++++ 5 files changed, 204 insertions(+), 51 deletions(-) create mode 100644 src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts index 0ed847ca9fde0..6c280084f2ff9 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts @@ -56,6 +56,7 @@ export const enum AccessibilityVerbositySettingId { Hover = 'accessibility.verbosity.hover', Notification = 'accessibility.verbosity.notification', EmptyEditorHint = 'accessibility.verbosity.emptyEditorHint', + ReplInputHint = 'accessibility.verbosity.replInputHint', Comments = 'accessibility.verbosity.comments', DiffEditorActive = 'accessibility.verbosity.diffEditorActive' } @@ -158,6 +159,10 @@ const configuration: IConfigurationNode = { description: localize('verbosity.emptyEditorHint', 'Provide information about relevant actions in an empty text editor.'), ...baseVerbosityProperty }, + [AccessibilityVerbositySettingId.ReplInputHint]: { + description: localize('verbosity.replInputHint', 'Provide information about relevant actions For the Repl input.'), + ...baseVerbosityProperty + }, [AccessibilityVerbositySettingId.Comments]: { description: localize('verbosity.comments', 'Provide information about actions that can be taken in the comment widget or in a file which contains comments.'), ...baseVerbosityProperty diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index 03b88f1f7af93..a79006781edf2 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -51,7 +51,7 @@ import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/note import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; import { CellEditType, CellKind, CellUri, INTERACTIVE_WINDOW_EDITOR_ID, NotebookSetting, NotebookWorkingCopyTypeIdentifier } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { InteractiveWindowOpen, NOTEBOOK_CELL_LIST_FOCUSED, REPL_NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { InteractiveWindowOpen } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { executeReplInput } from 'vs/workbench/contrib/replNotebook/browser/repl.contribution'; @@ -454,16 +454,6 @@ registerAction2(class extends Action2 { }, { // when: NOTEBOOK_CELL_LIST_FOCUSED, when: ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'), - primary: KeyMod.WinCtrl | KeyCode.Enter, - win: { - primary: KeyMod.CtrlCmd | KeyCode.Enter - }, - weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT - }, { - when: ContextKeyExpr.and( - REPL_NOTEBOOK_IS_ACTIVE_EDITOR, - NOTEBOOK_CELL_LIST_FOCUSED.toNegated() - ), primary: KeyMod.CtrlCmd | KeyCode.Enter, weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT }], @@ -853,10 +843,17 @@ Registry.as(ConfigurationExtensions.Configuration).regis default: false, markdownDescription: localize('interactiveWindow.promptToSaveOnClose', "Prompt to save the interactive window when it is closed. Only new interactive windows will be affected by this setting change.") }, - ['interactiveWindow.executeWithShiftEnter']: { + [InteractiveWindowSetting.executeWithShiftEnter]: { type: 'boolean', default: false, - markdownDescription: localize('interactiveWindow.executeWithShiftEnter', "Execute the interactive window (REPL) input box with shift+enter, so that enter can be used to create a newline.") + markdownDescription: localize('interactiveWindow.executeWithShiftEnter', "Execute the Interactive Window (REPL) input box with shift+enter, so that enter can be used to create a newline."), + tags: ['replExecute'] + }, + [InteractiveWindowSetting.showExecutionHint]: { + type: 'boolean', + default: true, + markdownDescription: localize('interactiveWindow.showExecutionHint', "Display a hint in the Interactive Window (REPL) input box to indicate how to execute code."), + tags: ['replExecute'] } } }); diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveCommon.ts b/src/vs/workbench/contrib/interactive/browser/interactiveCommon.ts index 46a52d9b844d0..20ce01d8e3469 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveCommon.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveCommon.ts @@ -8,5 +8,7 @@ import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; export const INTERACTIVE_INPUT_CURSOR_BOUNDARY = new RawContextKey<'none' | 'top' | 'bottom' | 'both'>('interactiveInputCursorAtBoundary', 'none'); export const InteractiveWindowSetting = { - interactiveWindowAlwaysScrollOnNewCell: 'interactiveWindow.alwaysScrollOnNewCell' + interactiveWindowAlwaysScrollOnNewCell: 'interactiveWindow.alwaysScrollOnNewCell', + executeWithShiftEnter: 'interactiveWindow.executeWithShiftEnter', + showExecutionHint: 'interactiveWindow.showExecutionHint' }; diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index 5f00a8ae37f5c..d272234b138b4 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -4,19 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/interactive'; -import * as nls from 'vs/nls'; import * as DOM from 'vs/base/browser/dom'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; -import { ICodeEditorViewState, IDecorationOptions } from 'vs/editor/common/editorCommon'; +import { ICodeEditorViewState } from 'vs/editor/common/editorCommon'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { editorForeground, resolveColorValue } from 'vs/platform/theme/common/colorRegistry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { EditorPaneSelectionChangeReason, IEditorMemento, IEditorOpenContext, IEditorPaneScrollPosition, IEditorPaneSelectionChangeEvent, IEditorPaneWithScrolling } from 'vs/workbench/common/editor'; @@ -63,6 +61,7 @@ import 'vs/css!./interactiveEditor'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { deepClone } from 'vs/base/common/objects'; import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; +import { ReplInputHintContentWidget } from 'vs/workbench/contrib/interactive/browser/replInputHintContentWidget'; const DECORATION_KEY = 'interactiveInputDecoration'; const INTERACTIVE_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'InteractiveEditorViewState'; @@ -71,6 +70,7 @@ const INPUT_CELL_VERTICAL_PADDING = 8; const INPUT_CELL_HORIZONTAL_PADDING_RIGHT = 10; const INPUT_EDITOR_PADDING = 8; + export interface InteractiveEditorViewState { readonly notebook?: INotebookEditorViewState; readonly input?: ICodeEditorViewState | null; @@ -109,6 +109,7 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro private _editorMemento: IEditorMemento; private readonly _groupListener = this._register(new MutableDisposable()); private _runbuttonToolbar: ToolBar | undefined; + private _hintElement: ReplInputHintContentWidget | undefined; private _onDidFocusWidget = this._register(new Emitter()); override get onDidFocus(): Event { return this._onDidFocusWidget.event; } @@ -167,7 +168,7 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro this._editorMemento = this.getEditorMemento(editorGroupService, textResourceConfigurationService, INTERACTIVE_EDITOR_VIEW_STATE_PREFERENCE_KEY); codeEditorService.registerDecorationType('interactive-decoration', DECORATION_KEY, {}); - this._register(this._keybindingService.onDidUpdateKeybindings(this._updateInputDecoration, this)); + this._register(this._keybindingService.onDidUpdateKeybindings(this._updateInputHint, this)); this._register(this._notebookExecutionStateService.onDidChangeExecution((e) => { if (e.type === NotebookExecutionType.cell && isEqual(e.notebook, this._notebookWidget.value?.viewModel?.notebookDocument.uri)) { const cell = this._notebookWidget.value?.getCellByHandle(e.cellHandle); @@ -485,16 +486,26 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro this._widgetDisposableStore.add(this.themeService.onDidColorThemeChange(() => { if (this.isVisible()) { - this._updateInputDecoration(); + this._updateInputHint(); } })); this._widgetDisposableStore.add(this._codeEditorWidget.onDidChangeModelContent(() => { if (this.isVisible()) { - this._updateInputDecoration(); + this._updateInputHint(); } })); + this._widgetDisposableStore.add(this._codeEditorWidget.onDidChangeModel(() => { + this._updateInputHint(); + })); + + this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(InteractiveWindowSetting.showExecutionHint)) { + this._updateInputHint(); + } + }); + const cursorAtBoundaryContext = INTERACTIVE_INPUT_CURSOR_BOUNDARY.bindTo(this._contextKeyService); if (input.resource && input.historyService.has(input.resource)) { cursorAtBoundaryContext.set('top'); @@ -535,6 +546,8 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro this._widgetDisposableStore.add(this._notebookWidget.value!.onDidScroll(() => this._onDidChangeScroll.fire())); this._syncWithKernel(); + + this._updateInputHint(); } override setOptions(options: INotebookEditorOptions | undefined): void { @@ -591,8 +604,6 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro NOTEBOOK_KERNEL.bindTo(this._contextKeyService).set(selectedOrSuggested.id); } } - - this._updateInputDecoration(); } layout(dimension: DOM.Dimension, position: DOM.IDomPosition): void { @@ -632,41 +643,22 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro return new DOM.Dimension(Math.max(0, width), Math.max(0, height)); } - private _updateInputDecoration(): void { + private _updateInputHint(): void { if (!this._codeEditorWidget) { return; } - if (!this._codeEditorWidget.hasModel()) { - return; - } + const shouldHide = + !this._codeEditorWidget.hasModel() || + this._configurationService.getValue(InteractiveWindowSetting.showExecutionHint) === false || + this._codeEditorWidget.getModel()!.getValueLength() !== 0; - const model = this._codeEditorWidget.getModel(); - - const decorations: IDecorationOptions[] = []; - - if (model?.getValueLength() === 0) { - const transparentForeground = resolveColorValue(editorForeground, this.themeService.getColorTheme())?.transparent(0.4); - const languageId = model.getLanguageId(); - const keybinding = this._keybindingService.lookupKeybinding('interactive.execute', this._contextKeyService)?.getLabel(); - const text = nls.localize('interactiveInputPlaceHolder', "Type '{0}' code here and press {1} to run", languageId, keybinding ?? 'ctrl+enter'); - decorations.push({ - range: { - startLineNumber: 0, - endLineNumber: 0, - startColumn: 0, - endColumn: 1 - }, - renderOptions: { - after: { - contentText: text, - color: transparentForeground ? transparentForeground.toString() : undefined - } - } - }); + if (!this._hintElement && !shouldHide) { + this._hintElement = this._instantiationService.createInstance(ReplInputHintContentWidget, this._codeEditorWidget); + } else if (this._hintElement && shouldHide) { + this._hintElement.dispose(); + this._hintElement = undefined; } - - this._codeEditorWidget.setDecorationsByType('interactive-decoration', DECORATION_KEY, decorations); } getScrollPosition(): IEditorPaneScrollPosition { @@ -701,6 +693,8 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro this._notebookWidget.value.onWillHide(); } } + + this._updateInputHint(); } override clearInput() { diff --git a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts new file mode 100644 index 0000000000000..a7b8f0a9d0659 --- /dev/null +++ b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts @@ -0,0 +1,155 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { status } from 'vs/base/browser/ui/aria/aria'; +import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; +import { Event } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { OS } from 'vs/base/common/platform'; +import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; +import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; +import { localize } from 'vs/nls'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { editorForeground } from 'vs/platform/theme/common/colorRegistry'; +import { resolveColorValue } from 'vs/platform/theme/common/colorUtils'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; +import { InteractiveWindowSetting } from 'vs/workbench/contrib/interactive/browser/interactiveCommon'; + + +export class ReplInputHintContentWidget extends Disposable implements IContentWidget { + + private static readonly ID = 'replInput.widget.emptyHint'; + + private domNode: HTMLElement | undefined; + private ariaLabel: string = ''; + + constructor( + private readonly editor: ICodeEditor, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IKeybindingService private readonly keybindingService: IKeybindingService, + @IThemeService private readonly themeService: IThemeService, + ) { + super(); + + this._register(this.editor.onDidChangeConfiguration((e: ConfigurationChangedEvent) => { + if (this.domNode && e.hasChanged(EditorOption.fontInfo)) { + this.editor.applyFontInfo(this.domNode); + } + })); + const onDidFocusEditorText = Event.debounce(this.editor.onDidFocusEditorText, () => undefined, 500); + this._register(onDidFocusEditorText(() => { + if (this.editor.hasTextFocus() && this.ariaLabel && configurationService.getValue(AccessibilityVerbositySettingId.ReplInputHint)) { + status(this.ariaLabel); + } + })); + this._register(configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(InteractiveWindowSetting.executeWithShiftEnter)) { + this.setHint(); + } + })); + this.editor.addContentWidget(this); + } + + getId(): string { + return ReplInputHintContentWidget.ID; + } + + getPosition(): IContentWidgetPosition | null { + return { + position: { lineNumber: 1, column: 1 }, + preference: [ContentWidgetPositionPreference.EXACT] + }; + } + + getDomNode(): HTMLElement { + if (!this.domNode) { + this.domNode = dom.$('.repl-input-hint'); + this.domNode.style.width = 'max-content'; + this.domNode.style.paddingLeft = '4px'; + + this.setHint(); + + this._register(dom.addDisposableListener(this.domNode, 'click', () => { + this.editor.focus(); + })); + + this.editor.applyFontInfo(this.domNode); + } + + return this.domNode; + } + + private setHint() { + if (!this.domNode) { + return; + } + while (this.domNode.firstChild) { + this.domNode.removeChild(this.domNode.firstChild); + } + const transparentForeground = resolveColorValue(editorForeground, this.themeService.getColorTheme())?.transparent(0.4); + + const hintElement = dom.$('div.empty-hint-text'); + hintElement.style.cursor = 'text'; + hintElement.style.whiteSpace = 'nowrap'; + hintElement.style.color = transparentForeground?.toString() || ''; + + const keybinding = this.getKeybinding(); + const keybindingHintLabel = keybinding?.getLabel(); + + if (keybinding && keybindingHintLabel) { + const actionPart = localize('emptyHintText', 'Press {0} to execute. ', keybindingHintLabel); + + const [before, after] = actionPart.split(keybindingHintLabel).map((fragment) => { + const hintPart = dom.$('span', undefined, fragment); + hintPart.style.fontStyle = 'italic'; + return hintPart; + }); + + hintElement.appendChild(before); + + const label = new KeybindingLabel(hintElement, OS); + label.set(keybinding); + label.element.style.width = 'min-content'; + label.element.style.display = 'inline'; + + hintElement.appendChild(after); + this.domNode.append(hintElement); + + this.ariaLabel = actionPart.concat(localize('disableHint', ' Toggle {0} in settings to disable this hint.', AccessibilityVerbositySettingId.ReplInputHint)); + } + } + + private getKeybinding() { + const keybindings = this.keybindingService.lookupKeybindings('interactive.execute'); + const shiftEnterConfig = this.configurationService.getValue(InteractiveWindowSetting.executeWithShiftEnter); + + if (shiftEnterConfig) { + const keybinding = keybindings.find(kb => kb.getLabel() === 'Shift+Enter'); + if (keybinding) { + return keybinding; + } + } else { + let keybinding = keybindings.find(kb => kb.getLabel() === 'Enter'); + if (keybinding) { + return keybinding; + } + keybinding = this.keybindingService.lookupKeybindings('python.execInREPLEnter') + .find(kb => kb.getLabel() === 'Enter'); + if (keybinding) { + return keybinding; + } + } + + return undefined; + } + + override dispose(): void { + super.dispose(); + this.editor.removeContentWidget(this); + } +} From 3cb3a37238888e5546e1c406d8bb6a99ea955098 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 19 Jun 2024 06:30:25 -0700 Subject: [PATCH 335/755] Fix warning when running yarn test-browser Fixes #216597 --- .../capabilities/commandDetection/promptInputModel.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts index 4566eb4b00817..725b3ffa12d37 100644 --- a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts +++ b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts @@ -3,8 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +// HACK: Ignore warnings, technically this requires browser/ but it's run on renderer.html anyway so +// it's fine in tests. Importing @xterm/headless appears to prevent `yarn test-browser` from running +// at all. // eslint-disable-next-line local/code-import-patterns, local/code-amd-node-module -import { Terminal } from '@xterm/headless'; +import { Terminal } from '@xterm/xterm'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; From f97a14715e0e834c681cf876a7423d9ab13522cd Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 19 Jun 2024 08:20:29 -0700 Subject: [PATCH 336/755] Fix floating debug toolbar zindex (#216627) Fix #216421 --- src/vs/workbench/contrib/debug/browser/media/debugToolBar.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css b/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css index fbe36b38c1a51..fc948f97b4a54 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css +++ b/src/vs/workbench/contrib/debug/browser/media/debugToolBar.css @@ -5,7 +5,7 @@ .monaco-workbench .debug-toolbar { position: absolute; - z-index: 3000; + z-index: 2520; /* Below quick input at 2550, above custom titlebar toolbar at 2500 */ height: 26px; display: flex; padding-left: 7px; From a764c2ac80912b0afafd36e8c402ccdbee6bbcc7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2024 18:01:46 +0200 Subject: [PATCH 337/755] Support version for proposed APIs (#216608) Support version for proposed APIs --- build/lib/compilation.js | 33 +- build/lib/compilation.ts | 36 +- .../extension-editing/src/extensionLinter.ts | 3 +- .../common/extensionsScannerService.ts | 3 +- .../platform/extensions/common/extensions.ts | 10 +- .../common/extensionsApiProposals.ts | 377 ++++++++++++++++++ .../extensions/test/common/extensions.test.ts | 22 + .../api/common/extHostDebugService.ts | 4 +- src/vs/workbench/api/common/extHostDialogs.ts | 4 +- .../api/common/extHostExtensionService.ts | 6 +- src/vs/workbench/api/common/extHostTesting.ts | 12 +- .../workbench/api/common/extensionHostMain.ts | 4 +- .../api/test/browser/extHostTelemetry.test.ts | 3 +- .../api/test/browser/extHostTesting.test.ts | 4 +- .../common/extHostExtensionActivator.test.ts | 12 +- .../api/test/common/extensionHostMain.test.ts | 4 +- .../contrib/debug/common/debugVisualizers.ts | 4 +- .../contrib/debug/test/node/debugger.test.ts | 9 +- .../contrib/issue/browser/issueQuickAccess.ts | 4 +- .../contrib/remote/browser/remote.ts | 6 +- .../actions/common/menusExtensionPoint.ts | 2 +- .../services/extensions/common/extensions.ts | 6 +- .../common/extensionsApiProposals.ts | 132 ------ .../common/extensionsProposedApi.ts | 9 +- .../extensions/common/extensionsRegistry.ts | 8 +- .../extensions/common/extensionsUtil.ts | 7 +- .../test/browser/extensionService.test.ts | 4 +- .../extensionDescriptionRegistry.test.ts | 3 +- .../remote/common/remoteExtensionsScanner.ts | 5 +- src/vscode-dts/README.md | 2 +- 30 files changed, 525 insertions(+), 213 deletions(-) create mode 100644 src/vs/platform/extensions/common/extensionsApiProposals.ts create mode 100644 src/vs/platform/extensions/test/common/extensions.test.ts delete mode 100644 src/vs/workbench/services/extensions/common/extensionsApiProposals.ts diff --git a/build/lib/compilation.js b/build/lib/compilation.js index b44cbefe78a95..2f408d562ced9 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -234,7 +234,7 @@ class MonacoGenerator { function generateApiProposalNames() { let eol; try { - const src = fs.readFileSync('src/vs/workbench/services/extensions/common/extensionsApiProposals.ts', 'utf-8'); + const src = fs.readFileSync('src/vs/platform/extensions/common/extensionsApiProposals.ts', 'utf-8'); const match = /\r?\n/m.exec(src); eol = match ? match[0] : os.EOL; } @@ -242,18 +242,27 @@ function generateApiProposalNames() { eol = os.EOL; } const pattern = /vscode\.proposed\.([a-zA-Z\d]+)\.d\.ts$/; - const proposalNames = new Set(); + const versionPattern = /^\s*\/\/\s*version\s*:\s*(\d+)\s*$/mi; + const proposals = new Map(); const input = es.through(); const output = input .pipe(util.filter((f) => pattern.test(f.path))) .pipe(es.through((f) => { const name = path.basename(f.path); const match = pattern.exec(name); - if (match) { - proposalNames.add(match[1]); + if (!match) { + return; } + const proposalName = match[1]; + const contents = f.contents.toString('utf8'); + const versionMatch = versionPattern.exec(contents); + const version = versionMatch ? versionMatch[1] : undefined; + proposals.set(proposalName, { + proposal: `https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${proposalName}.d.ts`, + version: version ? parseInt(version) : undefined + }); }, function () { - const names = [...proposalNames.values()].sort(); + const names = [...proposals.keys()].sort(); const contents = [ '/*---------------------------------------------------------------------------------------------', ' * Copyright (c) Microsoft Corporation. All rights reserved.', @@ -262,14 +271,18 @@ function generateApiProposalNames() { '', '// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.', '', - 'export const allApiProposals = Object.freeze({', - `${names.map(name => `\t${name}: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${name}.d.ts'`).join(`,${eol}`)}`, - '});', - 'export type ApiProposalName = keyof typeof allApiProposals;', + 'const _allApiProposals = {', + `${names.map(proposalName => { + const proposal = proposals.get(proposalName); + return `\t${proposalName}: {${eol}\t\tproposal: '${proposal.proposal}',${eol}${proposal.version ? `\t\tversion: ${proposal.version}${eol}` : ''}\t}`; + }).join(`,${eol}`)}`, + '};', + 'export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals);', + 'export type ApiProposalName = keyof typeof _allApiProposals;', '', ].join(eol); this.emit('data', new File({ - path: 'vs/workbench/services/extensions/common/extensionsApiProposals.ts', + path: 'vs/platform/extensions/common/extensionsApiProposals.ts', contents: Buffer.from(contents) })); this.emit('end'); diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index b88d0d290031b..3b6fa2df33960 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -275,7 +275,7 @@ function generateApiProposalNames() { let eol: string; try { - const src = fs.readFileSync('src/vs/workbench/services/extensions/common/extensionsApiProposals.ts', 'utf-8'); + const src = fs.readFileSync('src/vs/platform/extensions/common/extensionsApiProposals.ts', 'utf-8'); const match = /\r?\n/m.exec(src); eol = match ? match[0] : os.EOL; } catch { @@ -283,7 +283,8 @@ function generateApiProposalNames() { } const pattern = /vscode\.proposed\.([a-zA-Z\d]+)\.d\.ts$/; - const proposalNames = new Set(); + const versionPattern = /^\s*\/\/\s*version\s*:\s*(\d+)\s*$/mi; + const proposals = new Map(); const input = es.through(); const output = input @@ -292,11 +293,22 @@ function generateApiProposalNames() { const name = path.basename(f.path); const match = pattern.exec(name); - if (match) { - proposalNames.add(match[1]); + if (!match) { + return; } + + const proposalName = match[1]; + + const contents = f.contents.toString('utf8'); + const versionMatch = versionPattern.exec(contents); + const version = versionMatch ? versionMatch[1] : undefined; + + proposals.set(proposalName, { + proposal: `https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${proposalName}.d.ts`, + version: version ? parseInt(version) : undefined + }); }, function () { - const names = [...proposalNames.values()].sort(); + const names = [...proposals.keys()].sort(); const contents = [ '/*---------------------------------------------------------------------------------------------', ' * Copyright (c) Microsoft Corporation. All rights reserved.', @@ -305,15 +317,19 @@ function generateApiProposalNames() { '', '// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.', '', - 'export const allApiProposals = Object.freeze({', - `${names.map(name => `\t${name}: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${name}.d.ts'`).join(`,${eol}`)}`, - '});', - 'export type ApiProposalName = keyof typeof allApiProposals;', + 'const _allApiProposals = {', + `${names.map(proposalName => { + const proposal = proposals.get(proposalName)!; + return `\t${proposalName}: {${eol}\t\tproposal: '${proposal.proposal}',${eol}${proposal.version ? `\t\tversion: ${proposal.version}${eol}` : ''}\t}`; + }).join(`,${eol}`)}`, + '};', + 'export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals);', + 'export type ApiProposalName = keyof typeof _allApiProposals;', '', ].join(eol); this.emit('data', new File({ - path: 'vs/workbench/services/extensions/common/extensionsApiProposals.ts', + path: 'vs/platform/extensions/common/extensionsApiProposals.ts', contents: Buffer.from(contents) })); this.emit('end'); diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts index dd1727edb7b0a..b69dac0e2dd35 100644 --- a/extensions/extension-editing/src/extensionLinter.ts +++ b/extensions/extension-editing/src/extensionLinter.ts @@ -149,7 +149,8 @@ export class ExtensionLinter { const effectiveProposalNames = extensionEnabledApiProposals[extensionId]; if (Array.isArray(effectiveProposalNames) && enabledApiProposals.children) { for (const child of enabledApiProposals.children) { - if (child.type === 'string' && !effectiveProposalNames.includes(getNodeValue(child))) { + const proposalName = child.type === 'string' ? getNodeValue(child) : undefined; + if (typeof proposalName === 'string' && !effectiveProposalNames.includes(proposalName.split('@')[0])) { const start = document.positionAt(child.offset); const end = document.positionAt(child.offset + child.length); diagnostics.push(new Diagnostic(new Range(start, end), apiProposalNotListed, DiagnosticSeverity.Error)); diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index e78d87f3c8bb5..d29baae7a975b 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -24,7 +24,7 @@ import { localize } from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IProductVersion, Metadata } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, computeTargetPlatform, ExtensionKey, getExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { ExtensionType, ExtensionIdentifier, IExtensionManifest, TargetPlatform, IExtensionIdentifier, IRelaxedExtensionManifest, UNDEFINED_PUBLISHER, IExtensionDescription, BUILTIN_MANIFEST_CACHE_FILE, USER_MANIFEST_CACHE_FILE, ExtensionIdentifierMap } from 'vs/platform/extensions/common/extensions'; +import { ExtensionType, ExtensionIdentifier, IExtensionManifest, TargetPlatform, IExtensionIdentifier, IRelaxedExtensionManifest, UNDEFINED_PUBLISHER, IExtensionDescription, BUILTIN_MANIFEST_CACHE_FILE, USER_MANIFEST_CACHE_FILE, ExtensionIdentifierMap, parseEnabledApiProposalNames } from 'vs/platform/extensions/common/extensions'; import { validateExtensionManifest } from 'vs/platform/extensions/common/extensionValidator'; import { FileOperationResult, IFileService, toFileOperationResult } from 'vs/platform/files/common/files'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -983,6 +983,7 @@ export function toExtensionDescription(extension: IScannedExtension, isUnderDeve targetPlatform: extension.targetPlatform, publisherDisplayName: extension.publisherDisplayName, ...extension.manifest, + enabledApiProposals: extension.manifest.enabledApiProposals ? parseEnabledApiProposalNames([...extension.manifest.enabledApiProposals]) : undefined, }; } diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index f4af25dcabb3d..5ccdd4744fcbc 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -458,7 +458,7 @@ export class ExtensionIdentifierMap { } } -export interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest { +interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest { id?: string; identifier: ExtensionIdentifier; uuid?: string; @@ -470,7 +470,9 @@ export interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest extensionLocation: URI; } -export type IExtensionDescription = Readonly; +export type IExtensionDescription = Readonly & { + enabledApiProposals: string[] | undefined; // This needs to be updated while validating & updating the proposals. +}; export function isApplicationScopedExtension(manifest: IExtensionManifest): boolean { return isLanguagePackExtension(manifest); @@ -492,6 +494,10 @@ export function isResolverExtension(manifest: IExtensionManifest, remoteAuthorit return false; } +export function parseEnabledApiProposalNames(enabledApiProposals: string[]): string[] { + return enabledApiProposals.map(proposal => proposal.split('@')[0]); +} + export const IBuiltinExtensionsScannerService = createDecorator('IBuiltinExtensionsScannerService'); export interface IBuiltinExtensionsScannerService { readonly _serviceBrand: undefined; diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts new file mode 100644 index 0000000000000..9c6e94d1c4c92 --- /dev/null +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -0,0 +1,377 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. + +const _allApiProposals = { + activeComment: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.activeComment.d.ts', + }, + aiRelatedInformation: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.aiRelatedInformation.d.ts', + }, + aiTextSearchProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts', + }, + attributableCoverage: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts', + }, + authGetSessions: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authGetSessions.d.ts', + }, + authLearnMore: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authLearnMore.d.ts', + }, + authSession: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authSession.d.ts', + }, + canonicalUriProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.canonicalUriProvider.d.ts', + }, + chatParticipantAdditions: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts', + }, + chatParticipantPrivate: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', + }, + chatProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatProvider.d.ts', + }, + chatTab: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTab.d.ts', + }, + chatTools: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTools.d.ts', + }, + chatVariableResolver: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts', + }, + codeActionAI: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionAI.d.ts', + }, + codeActionRanges: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionRanges.d.ts', + }, + codiconDecoration: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codiconDecoration.d.ts', + }, + commentReactor: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentReactor.d.ts', + }, + commentReveal: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentReveal.d.ts', + }, + commentThreadApplicability: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts', + }, + commentingRangeHint: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentingRangeHint.d.ts', + }, + commentsDraftState: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentsDraftState.d.ts', + }, + contribAccessibilityHelpContent: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribAccessibilityHelpContent.d.ts', + }, + contribCommentEditorActionsMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentEditorActionsMenu.d.ts', + }, + contribCommentPeekContext: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentPeekContext.d.ts', + }, + contribCommentThreadAdditionalMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentThreadAdditionalMenu.d.ts', + }, + contribCommentsViewThreadMenus: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentsViewThreadMenus.d.ts', + }, + contribDiffEditorGutterToolBarMenus: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribDiffEditorGutterToolBarMenus.d.ts', + }, + contribEditSessions: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribEditSessions.d.ts', + }, + contribEditorContentMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribEditorContentMenu.d.ts', + }, + contribIssueReporter: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribIssueReporter.d.ts', + }, + contribLabelFormatterWorkspaceTooltip: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribLabelFormatterWorkspaceTooltip.d.ts', + }, + contribMenuBarHome: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribMenuBarHome.d.ts', + }, + contribMergeEditorMenus: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribMergeEditorMenus.d.ts', + }, + contribMultiDiffEditorMenus: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribMultiDiffEditorMenus.d.ts', + }, + contribNotebookStaticPreloads: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribNotebookStaticPreloads.d.ts', + }, + contribRemoteHelp: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribRemoteHelp.d.ts', + }, + contribShareMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribShareMenu.d.ts', + }, + contribSourceControlHistoryItemGroupMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemGroupMenu.d.ts', + }, + contribSourceControlHistoryItemMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts', + }, + contribSourceControlInputBoxMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts', + }, + contribSourceControlTitleMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlTitleMenu.d.ts', + }, + contribStatusBarItems: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribStatusBarItems.d.ts', + }, + contribViewsRemote: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsRemote.d.ts', + }, + contribViewsWelcome: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsWelcome.d.ts', + }, + createFileSystemWatcher: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts', + }, + customEditorMove: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.customEditorMove.d.ts', + }, + debugVisualization: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.debugVisualization.d.ts', + }, + defaultChatParticipant: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts', + }, + diffCommand: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.diffCommand.d.ts', + }, + diffContentOptions: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.diffContentOptions.d.ts', + }, + documentFiltersExclusive: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.documentFiltersExclusive.d.ts', + }, + documentPaste: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.documentPaste.d.ts', + }, + editSessionIdentityProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.editSessionIdentityProvider.d.ts', + }, + editorHoverVerbosityLevel: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.editorHoverVerbosityLevel.d.ts', + }, + editorInsets: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.editorInsets.d.ts', + }, + embeddings: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.embeddings.d.ts', + }, + extensionRuntime: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.extensionRuntime.d.ts', + }, + extensionsAny: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.extensionsAny.d.ts', + }, + externalUriOpener: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.externalUriOpener.d.ts', + }, + fileComments: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fileComments.d.ts', + }, + fileSearchProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts', + }, + findFiles2: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findFiles2.d.ts', + }, + findTextInFiles: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findTextInFiles.d.ts', + }, + fsChunks: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fsChunks.d.ts', + }, + idToken: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.idToken.d.ts', + }, + inlineCompletionsAdditions: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts', + }, + inlineEdit: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.inlineEdit.d.ts', + }, + interactive: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.interactive.d.ts', + }, + interactiveWindow: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.interactiveWindow.d.ts', + }, + ipc: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.ipc.d.ts', + }, + languageModelSystem: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageModelSystem.d.ts', + }, + languageStatusText: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageStatusText.d.ts', + }, + lmTools: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.lmTools.d.ts', + }, + mappedEditsProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts', + }, + multiDocumentHighlightProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.multiDocumentHighlightProvider.d.ts', + }, + newSymbolNamesProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.newSymbolNamesProvider.d.ts', + }, + notebookCellExecution: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecution.d.ts', + }, + notebookCellExecutionState: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecutionState.d.ts', + }, + notebookControllerAffinityHidden: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerAffinityHidden.d.ts', + }, + notebookDeprecated: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookDeprecated.d.ts', + }, + notebookExecution: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookExecution.d.ts', + }, + notebookKernelSource: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts', + }, + notebookLiveShare: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts', + }, + notebookMessaging: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts', + }, + notebookMime: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMime.d.ts', + }, + notebookVariableProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookVariableProvider.d.ts', + }, + portsAttributes: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.portsAttributes.d.ts', + }, + profileContentHandlers: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.profileContentHandlers.d.ts', + }, + quickDiffProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickDiffProvider.d.ts', + }, + quickPickItemTooltip: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickItemTooltip.d.ts', + }, + quickPickSortByLabel: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickSortByLabel.d.ts', + }, + resolvers: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.resolvers.d.ts', + }, + scmActionButton: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts', + }, + scmHistoryProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts', + }, + scmMultiDiffEditor: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmMultiDiffEditor.d.ts', + }, + scmSelectedProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts', + }, + scmTextDocument: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmTextDocument.d.ts', + }, + scmValidation: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts', + }, + shareProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.shareProvider.d.ts', + }, + showLocal: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.showLocal.d.ts', + }, + speech: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.speech.d.ts', + }, + tabInputMultiDiff: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabInputMultiDiff.d.ts', + }, + tabInputTextMerge: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabInputTextMerge.d.ts', + }, + taskPresentationGroup: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts', + }, + telemetry: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts', + }, + terminalDataWriteEvent: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDataWriteEvent.d.ts', + }, + terminalDimensions: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDimensions.d.ts', + }, + terminalExecuteCommandEvent: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalExecuteCommandEvent.d.ts', + }, + terminalQuickFixProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalQuickFixProvider.d.ts', + }, + terminalSelection: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalSelection.d.ts', + }, + terminalShellIntegration: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts', + }, + testObserver: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testObserver.d.ts', + }, + textSearchProvider: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts', + }, + timeline: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.timeline.d.ts', + }, + tokenInformation: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tokenInformation.d.ts', + }, + treeViewActiveItem: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.treeViewActiveItem.d.ts', + }, + treeViewMarkdownMessage: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.treeViewMarkdownMessage.d.ts', + }, + treeViewReveal: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.treeViewReveal.d.ts', + }, + tunnelFactory: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tunnelFactory.d.ts', + }, + tunnels: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tunnels.d.ts', + }, + workspaceTrust: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.workspaceTrust.d.ts', + } +}; +export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals); +export type ApiProposalName = keyof typeof _allApiProposals; diff --git a/src/vs/platform/extensions/test/common/extensions.test.ts b/src/vs/platform/extensions/test/common/extensions.test.ts new file mode 100644 index 0000000000000..7b81268b3476a --- /dev/null +++ b/src/vs/platform/extensions/test/common/extensions.test.ts @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import assert from 'assert'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { parseEnabledApiProposalNames } from 'vs/platform/extensions/common/extensions'; + +suite('Parsing Enabled Api Proposals', () => { + + ensureNoDisposablesAreLeakedInTestSuite(); + + test('parsingEnabledApiProposals', () => { + assert.deepStrictEqual(['activeComment', 'commentsDraftState'], parseEnabledApiProposalNames(['activeComment', 'commentsDraftState'])); + assert.deepStrictEqual(['activeComment', 'commentsDraftState'], parseEnabledApiProposalNames(['activeComment', 'commentsDraftState@1'])); + assert.deepStrictEqual(['activeComment', 'commentsDraftState'], parseEnabledApiProposalNames(['activeComment', 'commentsDraftState@'])); + assert.deepStrictEqual(['activeComment', 'commentsDraftState'], parseEnabledApiProposalNames(['activeComment', 'commentsDraftState@randomstring'])); + assert.deepStrictEqual(['activeComment', 'commentsDraftState'], parseEnabledApiProposalNames(['activeComment', 'commentsDraftState@1234'])); + assert.deepStrictEqual(['activeComment', 'commentsDraftState'], parseEnabledApiProposalNames(['activeComment', 'commentsDraftState@1234_random'])); + }); + +}); diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index bcd436663cc7f..a5e22aa3dee1a 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -8,7 +8,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Disposable as DisposableCls, toDisposable } from 'vs/base/common/lifecycle'; -import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ISignService } from 'vs/platform/sign/common/sign'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -173,7 +173,7 @@ export abstract class ExtHostDebugServiceBase extends DisposableCls implements I return item ? this.convertVisualizerTreeItem(treeId, item) : undefined; } - public registerDebugVisualizationTree(manifest: Readonly, id: string, provider: vscode.DebugVisualizationTree): vscode.Disposable { + public registerDebugVisualizationTree(manifest: IExtensionDescription, id: string, provider: vscode.DebugVisualizationTree): vscode.Disposable { const extensionId = ExtensionIdentifier.toKey(manifest.identifier); const key = this.extensionVisKey(extensionId, id); if (this._debugVisualizationProviders.has(key)) { diff --git a/src/vs/workbench/api/common/extHostDialogs.ts b/src/vs/workbench/api/common/extHostDialogs.ts index c33cb0704dd91..372037aa3419f 100644 --- a/src/vs/workbench/api/common/extHostDialogs.ts +++ b/src/vs/workbench/api/common/extHostDialogs.ts @@ -7,7 +7,7 @@ import type * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; import { MainContext, MainThreadDiaglogsShape, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; -import { IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; export class ExtHostDialogs { @@ -17,7 +17,7 @@ export class ExtHostDialogs { this._proxy = mainContext.getProxy(MainContext.MainThreadDialogs); } - showOpenDialog(extension: IRelaxedExtensionDescription, options?: vscode.OpenDialogOptions): Promise { + showOpenDialog(extension: IExtensionDescription, options?: vscode.OpenDialogOptions): Promise { if (options?.allowUIResources) { checkProposedApiEnabled(extension, 'showLocal'); } diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 4ea250c3bf8d6..6947479c2b894 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -24,7 +24,7 @@ import { MissingExtensionDependency, ActivationKind, checkProposedApiEnabled, is import { ExtensionDescriptionRegistry, IActivationEventsReader } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import * as errors from 'vs/base/common/errors'; import type * as vscode from 'vscode'; -import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { VSBuffer } from 'vs/base/common/buffer'; import { ExtensionGlobalMemento, ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; import { RemoteAuthorityResolverError, ExtensionKind, ExtensionMode, ExtensionRuntime, ManagedResolvedAuthority as ExtHostManagedResolvedAuthority } from 'vs/workbench/api/common/extHostTypes'; @@ -615,7 +615,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme }); } - private _activateAllStartupFinishedDeferred(extensions: Readonly[], start: number = 0): void { + private _activateAllStartupFinishedDeferred(extensions: IExtensionDescription[], start: number = 0): void { const timeBudget = 50; // 50 milliseconds const startTime = Date.now(); @@ -1230,7 +1230,7 @@ class SyncedActivationEventsReader implements IActivationEventsReader { this.addActivationEvents(activationEvents); } - public readActivationEvents(extensionDescription: Readonly): string[] { + public readActivationEvents(extensionDescription: IExtensionDescription): string[] { return this._map.get(extensionDescription.identifier) ?? []; } diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index 1271f74c7083d..1ef9c81d439c8 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -15,7 +15,7 @@ import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecy import { MarshalledId } from 'vs/base/common/marshallingIds'; import { isDefined } from 'vs/base/common/types'; import { generateUuid } from 'vs/base/common/uuid'; -import { IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostTestingShape, ILocationDto, MainContext, MainThreadTestingShape } from 'vs/workbench/api/common/extHost.protocol'; @@ -36,7 +36,7 @@ interface ControllerInfo { controller: vscode.TestController; profiles: Map; collection: ExtHostTestItemCollection; - extension: Readonly; + extension: IExtensionDescription; activeProfiles: Set; } @@ -552,7 +552,7 @@ class TestRunTracker extends Disposable { private readonly proxy: MainThreadTestingShape, private readonly logService: ILogService, private readonly profile: vscode.TestRunProfile | undefined, - private readonly extension: IRelaxedExtensionDescription, + private readonly extension: IExtensionDescription, parentToken?: CancellationToken, ) { super(); @@ -836,7 +836,7 @@ export class TestRunCoordinator { * `$startedExtensionTestRun` is not invoked. The run must eventually * be cancelled manually. */ - public prepareForMainThreadTestRun(extension: IRelaxedExtensionDescription, req: vscode.TestRunRequest, dto: TestRunDto, profile: vscode.TestRunProfile, token: CancellationToken) { + public prepareForMainThreadTestRun(extension: IExtensionDescription, req: vscode.TestRunRequest, dto: TestRunDto, profile: vscode.TestRunProfile, token: CancellationToken) { return this.getTracker(req, dto, profile, extension, token); } @@ -859,7 +859,7 @@ export class TestRunCoordinator { /** * Implements the public `createTestRun` API. */ - public createTestRun(extension: IRelaxedExtensionDescription, controllerId: string, collection: ExtHostTestItemCollection, request: vscode.TestRunRequest, name: string | undefined, persist: boolean): vscode.TestRun { + public createTestRun(extension: IExtensionDescription, controllerId: string, collection: ExtHostTestItemCollection, request: vscode.TestRunRequest, name: string | undefined, persist: boolean): vscode.TestRun { const existing = this.tracked.get(request); if (existing) { return existing.createRun(name); @@ -888,7 +888,7 @@ export class TestRunCoordinator { return tracker.createRun(name); } - private getTracker(req: vscode.TestRunRequest, dto: TestRunDto, profile: vscode.TestRunProfile | undefined, extension: IRelaxedExtensionDescription, token?: CancellationToken) { + private getTracker(req: vscode.TestRunRequest, dto: TestRunDto, profile: vscode.TestRunProfile | undefined, extension: IExtensionDescription, token?: CancellationToken) { const tracker = new TestRunTracker(dto, this.proxy, this.logService, profile, extension, token); this.tracked.set(req, tracker); this.trackedById.set(tracker.id, tracker); diff --git a/src/vs/workbench/api/common/extensionHostMain.ts b/src/vs/workbench/api/common/extensionHostMain.ts index 2bd275cbc21c4..50c47ba98a852 100644 --- a/src/vs/workbench/api/common/extensionHostMain.ts +++ b/src/vs/workbench/api/common/extensionHostMain.ts @@ -11,7 +11,7 @@ import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; import { IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { RPCProtocol } from 'vs/workbench/services/extensions/common/rpcProtocol'; -import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; import { getSingletonServiceDescriptors } from 'vs/platform/instantiation/common/extensions'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -195,7 +195,7 @@ export class ExtensionHostMain { private static _transform(initData: IExtensionHostInitData, rpcProtocol: RPCProtocol): IExtensionHostInitData { initData.extensions.allExtensions.forEach((ext) => { - (>ext).extensionLocation = URI.revive(rpcProtocol.transformIncomingURIs(ext.extensionLocation)); + (>ext).extensionLocation = URI.revive(rpcProtocol.transformIncomingURIs(ext.extensionLocation)); }); initData.environment.appRoot = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.appRoot)); const extDevLocs = initData.environment.extensionDevelopmentLocationURI; diff --git a/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts b/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts index 789ffcd0bf4a0..54878ddb0cd3e 100644 --- a/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts @@ -64,7 +64,8 @@ suite('ExtHostTelemetry', function () { publisher: 'vscode', version: '1.0.0', engines: { vscode: '*' }, - extensionLocation: URI.parse('fake') + extensionLocation: URI.parse('fake'), + enabledApiProposals: undefined, }; const createExtHostTelemetry = () => { diff --git a/src/vs/workbench/api/test/browser/extHostTesting.test.ts b/src/vs/workbench/api/test/browser/extHostTesting.test.ts index 251ead7ac948f..c4515796d05dd 100644 --- a/src/vs/workbench/api/test/browser/extHostTesting.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTesting.test.ts @@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri'; import { mock, mockObject, MockObject } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import * as editorRange from 'vs/editor/common/core/range'; -import { ExtensionIdentifier, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { NullLogService } from 'vs/platform/log/common/log'; import { MainThreadTestingShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; @@ -637,7 +637,7 @@ suite('ExtHost Testing', () => { let req: TestRunRequest; let dto: TestRunDto; - const ext: IRelaxedExtensionDescription = {} as any; + const ext: IExtensionDescription = {} as any; teardown(() => { for (const { id } of c.trackers) { diff --git a/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts b/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts index 04b5fc7847e0b..bfd874acf2e60 100644 --- a/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts +++ b/src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts @@ -5,9 +5,10 @@ import assert from 'assert'; import { promiseWithResolvers, timeout } from 'vs/base/common/async'; +import { Mutable } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; -import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, TargetPlatform } from 'vs/platform/extensions/common/extensions'; import { NullLogService } from 'vs/platform/log/common/log'; import { ActivatedExtension, EmptyExtension, ExtensionActivationTimes, ExtensionsActivator, IExtensionsActivatorHost } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtensionDescriptionRegistry, IActivationEventsReader } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; @@ -85,8 +86,8 @@ suite('ExtensionsActivator', () => { test('Supports having resolved extensions', async () => { const host = new SimpleExtensionsActivatorHost(); const bExt = desc(idB); - delete (bExt).main; - delete (bExt).browser; + delete (>bExt).main; + delete (>bExt).browser; const activator = createActivator(host, [ desc(idA, [idB]) ], [bExt]); @@ -103,7 +104,7 @@ suite('ExtensionsActivator', () => { [idB, extActivationB] ]); const bExt = desc(idB); - (bExt).api = 'none'; + (>bExt).api = 'none'; const activator = createActivator(host, [ desc(idA, [idB]) ], [bExt]); @@ -274,7 +275,8 @@ suite('ExtensionsActivator', () => { activationEvents, main: 'index.js', targetPlatform: TargetPlatform.UNDEFINED, - extensionDependencies: deps.map(d => d.value) + extensionDependencies: deps.map(d => d.value), + enabledApiProposals: undefined, }; } diff --git a/src/vs/workbench/api/test/common/extensionHostMain.test.ts b/src/vs/workbench/api/test/common/extensionHostMain.test.ts index 1c5acf0e88821..1608511b5274f 100644 --- a/src/vs/workbench/api/test/common/extensionHostMain.test.ts +++ b/src/vs/workbench/api/test/common/extensionHostMain.test.ts @@ -10,7 +10,7 @@ import { TernarySearchTree } from 'vs/base/common/ternarySearchTree'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; -import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; @@ -48,7 +48,7 @@ suite('ExtensionHostMain#ErrorHandler - Wrapping prepareStackTrace can cause slo declare readonly _serviceBrand: undefined; getExtensionPathIndex() { return new class extends ExtensionPaths { - override findSubstr(key: URI): Readonly | undefined { + override findSubstr(key: URI): IExtensionDescription | undefined { findSubstrCount++; return nullExtensionDescription; } diff --git a/src/vs/workbench/contrib/debug/common/debugVisualizers.ts b/src/vs/workbench/contrib/debug/common/debugVisualizers.ts index 45d19aee6f95f..47baa50ee414c 100644 --- a/src/vs/workbench/contrib/debug/common/debugVisualizers.ts +++ b/src/vs/workbench/contrib/debug/common/debugVisualizers.ts @@ -7,7 +7,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IDisposable, IReference, toDisposable } from 'vs/base/common/lifecycle'; import { isDefined } from 'vs/base/common/types'; import { ContextKeyExpr, ContextKeyExpression, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ExtensionIdentifier, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { CONTEXT_VARIABLE_NAME, CONTEXT_VARIABLE_TYPE, CONTEXT_VARIABLE_VALUE, MainThreadDebugVisualization, IDebugVisualization, IDebugVisualizationContext, IExpression, IExpressionContainer, IDebugVisualizationTreeItem } from 'vs/workbench/contrib/debug/common/debug'; @@ -250,7 +250,7 @@ export class DebugVisualizerService implements IDebugVisualizerService { return context; } - private processExtensionRegistration(ext: Readonly) { + private processExtensionRegistration(ext: IExtensionDescription) { const viz = ext.contributes?.debugVisualizers; if (!(viz instanceof Array)) { return; diff --git a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts index e6891cec75f67..e618a4552da03 100644 --- a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -64,7 +64,8 @@ suite('Debug - Debugger', () => { 'debuggers': [ debuggerContribution ] - } + }, + enabledApiProposals: undefined, }; const extensionDescriptor1 = { @@ -89,7 +90,8 @@ suite('Debug - Debugger', () => { args: ['parg'] } ] - } + }, + enabledApiProposals: undefined, }; const extensionDescriptor2 = { @@ -122,7 +124,8 @@ suite('Debug - Debugger', () => { } } ] - } + }, + enabledApiProposals: undefined, }; diff --git a/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts b/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts index 37d52199b5bed..61ca99ac1c2e1 100644 --- a/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts +++ b/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts @@ -11,7 +11,7 @@ import { IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { localize } from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ThemeIcon } from 'vs/base/common/themables'; import { Codicon } from 'vs/base/common/codicons'; import { IssueSource } from 'vs/platform/issue/common/issue'; @@ -107,7 +107,7 @@ export class IssueQuickAccess extends PickerQuickAccessProvider; + extensionDescription: IExtensionDescription; }[]> { return (await Promise.all(this.values.map(async (value) => { return { @@ -419,7 +419,7 @@ class IssueReporterItem extends HelpItemBase { label: string; description: string; url: string; - extensionDescription: Readonly; + extensionDescription: IExtensionDescription; }[]> { return Promise.all(this.values.map(async (value) => { return { diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index 6791e00042cc0..583f2654928cb 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -15,7 +15,6 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ThemeIcon } from 'vs/base/common/themables'; import { index } from 'vs/base/common/arrays'; import { isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; -import { ApiProposalName } from 'vs/workbench/services/extensions/common/extensionsApiProposals'; import { ILocalizedString } from 'vs/platform/action/common/action'; import { IExtensionFeatureTableRenderer, IExtensionFeaturesRegistry, IRenderedData, IRowData, ITableData, Extensions as ExtensionFeaturesExtensions } from 'vs/workbench/services/extensionManagement/common/extensionFeatures'; import { IExtensionManifest, IKeyBinding } from 'vs/platform/extensions/common/extensions'; @@ -25,6 +24,7 @@ import { platform } from 'vs/base/common/process'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { ResolvedKeybinding } from 'vs/base/common/keybindings'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { ApiProposalName } from 'vs/platform/extensions/common/extensionsApiProposals'; interface IAPIMenu { readonly key: string; diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index 4bd3fea7dfd9b..bc9ce39aa7002 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -9,13 +9,13 @@ import { URI } from 'vs/base/common/uri'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { getExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ImplicitActivationEvents } from 'vs/platform/extensionManagement/common/implicitActivationEvents'; -import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, ExtensionType, IExtension, IExtensionContributions, IExtensionDescription, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, ExtensionType, IExtension, IExtensionContributions, IExtensionDescription, parseEnabledApiProposalNames, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { ApiProposalName } from 'vs/platform/extensions/common/extensionsApiProposals'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IV8Profile } from 'vs/platform/profiling/common/profiling'; import { ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensionHostKind'; import { IExtensionDescriptionDelta, IExtensionDescriptionSnapshot } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ExtensionRunningLocation } from 'vs/workbench/services/extensions/common/extensionRunningLocation'; -import { ApiProposalName } from 'vs/workbench/services/extensions/common/extensionsApiProposals'; import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; export const nullExtensionDescription = Object.freeze({ @@ -29,6 +29,7 @@ export const nullExtensionDescription = Object.freeze({ targetPlatform: TargetPlatform.UNDEFINED, isUserBuiltin: false, isUnderDevelopment: false, + enabledApiProposals: undefined, }); export type WebWorkerExtHostConfigValue = boolean | 'auto'; @@ -570,6 +571,7 @@ export function toExtensionDescription(extension: IExtension, isUnderDevelopment targetPlatform: extension.targetPlatform, publisherDisplayName: extension.publisherDisplayName, ...extension.manifest, + enabledApiProposals: extension.manifest.enabledApiProposals ? parseEnabledApiProposalNames([...extension.manifest.enabledApiProposals]) : undefined, }; } diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts deleted file mode 100644 index bf1db2ba23843..0000000000000 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ /dev/null @@ -1,132 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. - -export const allApiProposals = Object.freeze({ - activeComment: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.activeComment.d.ts', - aiRelatedInformation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.aiRelatedInformation.d.ts', - aiTextSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts', - attributableCoverage: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.attributableCoverage.d.ts', - authGetSessions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authGetSessions.d.ts', - authLearnMore: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authLearnMore.d.ts', - authSession: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authSession.d.ts', - canonicalUriProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.canonicalUriProvider.d.ts', - chatParticipantAdditions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts', - chatParticipantPrivate: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', - chatProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatProvider.d.ts', - chatTab: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTab.d.ts', - chatTools: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTools.d.ts', - chatVariableResolver: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts', - codeActionAI: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionAI.d.ts', - codeActionRanges: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codeActionRanges.d.ts', - codiconDecoration: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.codiconDecoration.d.ts', - commentReactor: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentReactor.d.ts', - commentReveal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentReveal.d.ts', - commentThreadApplicability: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentThreadApplicability.d.ts', - commentingRangeHint: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentingRangeHint.d.ts', - commentsDraftState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentsDraftState.d.ts', - contribAccessibilityHelpContent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribAccessibilityHelpContent.d.ts', - contribCommentEditorActionsMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentEditorActionsMenu.d.ts', - contribCommentPeekContext: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentPeekContext.d.ts', - contribCommentThreadAdditionalMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentThreadAdditionalMenu.d.ts', - contribCommentsViewThreadMenus: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribCommentsViewThreadMenus.d.ts', - contribDiffEditorGutterToolBarMenus: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribDiffEditorGutterToolBarMenus.d.ts', - contribEditSessions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribEditSessions.d.ts', - contribEditorContentMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribEditorContentMenu.d.ts', - contribIssueReporter: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribIssueReporter.d.ts', - contribLabelFormatterWorkspaceTooltip: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribLabelFormatterWorkspaceTooltip.d.ts', - contribMenuBarHome: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribMenuBarHome.d.ts', - contribMergeEditorMenus: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribMergeEditorMenus.d.ts', - contribMultiDiffEditorMenus: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribMultiDiffEditorMenus.d.ts', - contribNotebookStaticPreloads: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribNotebookStaticPreloads.d.ts', - contribRemoteHelp: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribRemoteHelp.d.ts', - contribShareMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribShareMenu.d.ts', - contribSourceControlHistoryItemGroupMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemGroupMenu.d.ts', - contribSourceControlHistoryItemMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemMenu.d.ts', - contribSourceControlInputBoxMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlInputBoxMenu.d.ts', - contribSourceControlTitleMenu: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlTitleMenu.d.ts', - contribStatusBarItems: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribStatusBarItems.d.ts', - contribViewsRemote: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsRemote.d.ts', - contribViewsWelcome: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribViewsWelcome.d.ts', - createFileSystemWatcher: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.createFileSystemWatcher.d.ts', - customEditorMove: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.customEditorMove.d.ts', - debugVisualization: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.debugVisualization.d.ts', - defaultChatParticipant: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts', - diffCommand: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.diffCommand.d.ts', - diffContentOptions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.diffContentOptions.d.ts', - documentFiltersExclusive: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.documentFiltersExclusive.d.ts', - documentPaste: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.documentPaste.d.ts', - editSessionIdentityProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.editSessionIdentityProvider.d.ts', - editorHoverVerbosityLevel: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.editorHoverVerbosityLevel.d.ts', - editorInsets: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.editorInsets.d.ts', - embeddings: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.embeddings.d.ts', - extensionRuntime: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.extensionRuntime.d.ts', - extensionsAny: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.extensionsAny.d.ts', - externalUriOpener: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.externalUriOpener.d.ts', - fileComments: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fileComments.d.ts', - fileSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts', - findFiles2: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findFiles2.d.ts', - findTextInFiles: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findTextInFiles.d.ts', - fsChunks: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fsChunks.d.ts', - idToken: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.idToken.d.ts', - inlineCompletionsAdditions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts', - inlineEdit: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.inlineEdit.d.ts', - interactive: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.interactive.d.ts', - interactiveWindow: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.interactiveWindow.d.ts', - ipc: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.ipc.d.ts', - languageModelSystem: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageModelSystem.d.ts', - languageStatusText: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageStatusText.d.ts', - lmTools: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.lmTools.d.ts', - mappedEditsProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts', - multiDocumentHighlightProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.multiDocumentHighlightProvider.d.ts', - newSymbolNamesProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.newSymbolNamesProvider.d.ts', - notebookCellExecution: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecution.d.ts', - notebookCellExecutionState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecutionState.d.ts', - notebookControllerAffinityHidden: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerAffinityHidden.d.ts', - notebookDeprecated: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookDeprecated.d.ts', - notebookExecution: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookExecution.d.ts', - notebookKernelSource: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts', - notebookLiveShare: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts', - notebookMessaging: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts', - notebookMime: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMime.d.ts', - notebookVariableProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookVariableProvider.d.ts', - portsAttributes: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.portsAttributes.d.ts', - profileContentHandlers: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.profileContentHandlers.d.ts', - quickDiffProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickDiffProvider.d.ts', - quickPickItemTooltip: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickItemTooltip.d.ts', - quickPickSortByLabel: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickSortByLabel.d.ts', - resolvers: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.resolvers.d.ts', - scmActionButton: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts', - scmHistoryProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts', - scmMultiDiffEditor: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmMultiDiffEditor.d.ts', - scmSelectedProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts', - scmTextDocument: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmTextDocument.d.ts', - scmValidation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts', - shareProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.shareProvider.d.ts', - showLocal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.showLocal.d.ts', - speech: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.speech.d.ts', - tabInputMultiDiff: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabInputMultiDiff.d.ts', - tabInputTextMerge: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabInputTextMerge.d.ts', - taskPresentationGroup: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts', - telemetry: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts', - terminalDataWriteEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDataWriteEvent.d.ts', - terminalDimensions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDimensions.d.ts', - terminalExecuteCommandEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalExecuteCommandEvent.d.ts', - terminalQuickFixProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalQuickFixProvider.d.ts', - terminalSelection: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalSelection.d.ts', - terminalShellIntegration: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts', - testObserver: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testObserver.d.ts', - textSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts', - timeline: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.timeline.d.ts', - tokenInformation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tokenInformation.d.ts', - treeViewActiveItem: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.treeViewActiveItem.d.ts', - treeViewMarkdownMessage: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.treeViewMarkdownMessage.d.ts', - treeViewReveal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.treeViewReveal.d.ts', - tunnelFactory: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tunnelFactory.d.ts', - tunnels: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tunnels.d.ts', - workspaceTrust: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.workspaceTrust.d.ts' -}); -export type ApiProposalName = keyof typeof allApiProposals; diff --git a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts index e92c5e0a50ef3..cad7f99d45cad 100644 --- a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts +++ b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts @@ -5,10 +5,10 @@ import { isNonEmptyArray } from 'vs/base/common/arrays'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { allApiProposals, ApiProposalName } from 'vs/platform/extensions/common/extensionsApiProposals'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { ApiProposalName, allApiProposals } from 'vs/workbench/services/extensions/common/extensionsApiProposals'; export class ExtensionsProposedApi { @@ -54,12 +54,9 @@ export class ExtensionsProposedApi { } } - private doUpdateEnabledApiProposals(_extension: IExtensionDescription): void { + private doUpdateEnabledApiProposals(extension: IExtensionDescription): void { - // this is a trick to make the extension description writeable... - type Writeable = { -readonly [P in keyof T]: Writeable }; - const extension = >_extension; - const key = ExtensionIdentifier.toKey(_extension.identifier); + const key = ExtensionIdentifier.toKey(extension.identifier); // warn about invalid proposal and remove them from the list if (isNonEmptyArray(extension.enabledApiProposals)) { diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index f39fd30b602f5..dd879d2b70df2 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -13,10 +13,10 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IMessage } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionDescription, EXTENSION_CATEGORIES, ExtensionIdentifierSet } from 'vs/platform/extensions/common/extensions'; import { ExtensionKind } from 'vs/platform/environment/common/environment'; -import { allApiProposals } from 'vs/workbench/services/extensions/common/extensionsApiProposals'; import { productSchemaId } from 'vs/platform/product/common/productService'; import { ImplicitActivationEvents, IActivationEventsGenerator } from 'vs/platform/extensionManagement/common/implicitActivationEvents'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { allApiProposals } from 'vs/platform/extensions/common/extensionsApiProposals'; const schemaRegistry = Registry.as(Extensions.JSONContribution); @@ -242,8 +242,8 @@ export const schema: IJSONSchema = { uniqueItems: true, items: { type: 'string', - enum: Object.keys(allApiProposals), - markdownEnumDescriptions: Object.values(allApiProposals) + enum: Object.keys(allApiProposals).map(proposalName => allApiProposals[proposalName].version ? `${proposalName}@${allApiProposals[proposalName].version}` : proposalName), + markdownEnumDescriptions: Object.values(allApiProposals).map(value => value.proposal) } }, api: { @@ -652,7 +652,7 @@ schemaRegistry.registerSchema(productSchemaId, { items: { type: 'string', enum: Object.keys(allApiProposals), - markdownEnumDescriptions: Object.values(allApiProposals) + markdownEnumDescriptions: Object.values(allApiProposals).map(value => value.proposal) } }] } diff --git a/src/vs/workbench/services/extensions/common/extensionsUtil.ts b/src/vs/workbench/services/extensions/common/extensionsUtil.ts index a1d2090c747bc..71d384aaa9d95 100644 --- a/src/vs/workbench/services/extensions/common/extensionsUtil.ts +++ b/src/vs/workbench/services/extensions/common/extensionsUtil.ts @@ -3,10 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ExtensionIdentifierMap, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifierMap, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { localize } from 'vs/nls'; import { ILogService } from 'vs/platform/log/common/log'; import * as semver from 'vs/base/common/semver/semver'; +import { Mutable } from 'vs/base/common/types'; // TODO: @sandy081 merge this with deduping in extensionsScannerService.ts export function dedupExtensions(system: IExtensionDescription[], user: IExtensionDescription[], workspace: IExtensionDescription[], development: IExtensionDescription[], logService: ILogService): IExtensionDescription[] { @@ -27,7 +28,7 @@ export function dedupExtensions(system: IExtensionDescription[], user: IExtensio return; } // Overwriting a builtin extension inherits the `isBuiltin` property and it doesn't show a warning - (userExtension).isBuiltin = true; + (>userExtension).isBuiltin = true; } else { logService.warn(localize('overwritingExtension', "Overwriting extension {0} with {1}.", extension.extensionLocation.fsPath, userExtension.extensionLocation.fsPath)); } @@ -50,7 +51,7 @@ export function dedupExtensions(system: IExtensionDescription[], user: IExtensio if (extension) { if (extension.isBuiltin) { // Overwriting a builtin extension inherits the `isBuiltin` property - (developedExtension).isBuiltin = true; + (>developedExtension).isBuiltin = true; } } result.set(developedExtension.identifier, developedExtension); diff --git a/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts b/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts index b6b2edb844bf7..69c2463958c5f 100644 --- a/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts +++ b/src/vs/workbench/services/extensions/test/browser/extensionService.test.ts @@ -12,7 +12,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogService'; import { ExtensionKind, IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ExtensionIdentifier, IExtension, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtension, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TestInstantiationService, createServices } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; @@ -209,7 +209,7 @@ suite('ExtensionService', () => { protected _resolveExtensions(): Promise { throw new Error('Method not implemented.'); } - protected _scanSingleExtension(extension: IExtension): Promise | null> { + protected _scanSingleExtension(extension: IExtension): Promise { throw new Error('Method not implemented.'); } protected _onExtensionHostExit(code: number): void { diff --git a/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts b/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts index 7ac88d4cdad82..603894a3eabed 100644 --- a/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts +++ b/src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts @@ -44,7 +44,8 @@ suite('ExtensionDescriptionRegistry', () => { activationEvents, main: 'index.js', targetPlatform: TargetPlatform.UNDEFINED, - extensionDependencies: [] + extensionDependencies: [], + enabledApiProposals: undefined, }; } }); diff --git a/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts b/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts index f1d2482908335..ce9954eb03de4 100644 --- a/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts +++ b/src/vs/workbench/services/remote/common/remoteExtensionsScanner.ts @@ -7,7 +7,7 @@ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteA import { IRemoteExtensionsScannerService, RemoteExtensionsScannerChannelName } from 'vs/platform/remote/common/remoteExtensionsScanner'; import * as platform from 'vs/base/common/platform'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import { IRemoteUserDataProfilesService } from 'vs/workbench/services/userDataProfile/common/remoteUserDataProfiles'; @@ -16,6 +16,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IActiveLanguagePackService } from 'vs/workbench/services/localization/common/locale'; import { IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { Mutable } from 'vs/base/common/types'; class RemoteExtensionsScannerService implements IRemoteExtensionsScannerService { @@ -44,7 +45,7 @@ class RemoteExtensionsScannerService implements IRemoteExtensionsScannerService return await this.withChannel( async (channel) => { const profileLocation = this.userDataProfileService.currentProfile.isDefault ? undefined : (await this.remoteUserDataProfilesService.getRemoteProfile(this.userDataProfileService.currentProfile)).extensionsResource; - const scannedExtensions = await channel.call('scanExtensions', [ + const scannedExtensions = await channel.call[]>('scanExtensions', [ platform.language, profileLocation, this.extensionManagementService.getInstalledWorkspaceExtensionLocations(), diff --git a/src/vscode-dts/README.md b/src/vscode-dts/README.md index 9b3640d920887..7d8c057c4808b 100644 --- a/src/vscode-dts/README.md +++ b/src/vscode-dts/README.md @@ -14,7 +14,7 @@ This is the place for the stable API and for API proposals. ## Add a new proposal 1. create a _new_ file in this directory, its name must follow this pattern `vscode.proposed.[a-zA-Z]+.d.ts` -1. creating the proposal-file will automatically update `src/vs/workbench/services/extensions/common/extensionsApiProposals.ts` (make sure to run `yarn watch`) +1. creating the proposal-file will automatically update `src/vs/platform/extensions/common/extensionsApiProposals.ts` (make sure to run `yarn watch`) 1. declare and implement your proposal 1. make sure to use the `checkProposedApiEnabled` and/or `isProposedApiEnabled`-utils to enforce the API being proposed. Make sure to invoke them with your proposal's name which got generated into `extensionsApiProposals.ts` 1. Most likely will need to add your proposed api to vscode-api-tests as well From a11602734be998fc3b1fe1152b1d90d8aae88399 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 19 Jun 2024 18:10:43 +0200 Subject: [PATCH 338/755] inline chat positioning polish (#216630) * make sure to show close button when having just message responses * * no more intented rendering of inline chat * make sure the top of the view zone is always revealed --- .../inlineChat/browser/inlineChatActions.ts | 2 +- .../browser/inlineChatStrategies.ts | 1 - .../inlineChat/browser/inlineChatWidget.ts | 2 + .../browser/inlineChatZoneWidget.ts | 90 +++++++------------ 4 files changed, 35 insertions(+), 60 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index cd21b9cbd3c37..32e617d945219 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -368,7 +368,7 @@ export class CloseAction extends AbstractInlineChatAction { group: '0_main', order: 1, when: ContextKeyExpr.and( - CTX_INLINE_CHAT_CONFIG_TXT_BTNS, + // CTX_INLINE_CHAT_CONFIG_TXT_BTNS, ContextKeyExpr.or( CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.Messages), CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Preview) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index a5259dd82dc2a..518b7fcca6a45 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -531,7 +531,6 @@ export class LiveStrategy extends EditModeStrategy { if (widgetData) { this._zone.updatePositionAndHeight(widgetData.position); - this._editor.revealPositionInCenterIfOutsideViewport(widgetData.position); const remainingHunks = this._session.hunkData.pending; this._updateSummaryMessage(remainingHunks, this._session.hunkData.size); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index ea1fe1355f7ab..4bc0e13939fac 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -537,6 +537,8 @@ export class InlineChatWidget { this._elements.feedbackToolbar.classList.add('hidden'); this.updateInfo(''); + this.chatWidget.setModel(this._defaultChatModel, {}); + this._elements.accessibleViewer.classList.toggle('hidden', true); this._onDidChangeHeight.fire(); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index 0af64ee8e45f4..a57b2b9ba4fbc 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -28,7 +28,6 @@ export class InlineChatZoneWidget extends ZoneWidget { private readonly _ctxCursorPosition: IContextKey<'above' | 'below' | ''>; private _dimension?: Dimension; - private _indentationWidth: number | undefined; constructor( location: ChatAgentLocation, @@ -87,8 +86,11 @@ export class InlineChatZoneWidget extends ZoneWidget { if (this.position) { // only relayout when visible scrollState ??= StableEditorBottomScrollState.capture(this.editor); - this._relayout(this._computeHeight().linesValue); + const height = this._computeHeight(); + this._relayout(height.linesValue); scrollState.restore(this.editor); + scrollState = undefined; + this._revealTopOfZoneWidget(this.position, height); } })); @@ -122,16 +124,14 @@ export class InlineChatZoneWidget extends ZoneWidget { container.appendChild(this.widget.domNode); } - protected override _doLayout(heightInPixel: number): void { - const width = Math.min(640, this._availableSpaceGivenIndentation(this._indentationWidth)); - this._dimension = new Dimension(width, heightInPixel); - this.widget.layout(this._dimension); - } - private _availableSpaceGivenIndentation(indentationWidth: number | undefined): number { const info = this.editor.getLayoutInfo(); - return info.contentWidth - (info.glyphMarginWidth + info.decorationsWidth + (indentationWidth ?? 0)); + let width = info.contentWidth - (info.glyphMarginWidth + info.decorationsWidth); + width = Math.min(640, width); + + this._dimension = new Dimension(width, heightInPixel); + this.widget.layout(this._dimension); } private _computeHeight(): { linesValue: number; pixelsValue: number } { @@ -159,74 +159,48 @@ export class InlineChatZoneWidget extends ZoneWidget { const height = this._computeHeight(); super.show(position, height.linesValue); - this._setWidgetMargins(position); this.widget.chatWidget.setVisible(true); this.widget.focus(); scrollState.restore(this.editor); - if (position.lineNumber > 1) { - this.editor.revealRangeNearTopIfOutsideViewport(Range.fromPositions(position.delta(-1)), ScrollType.Immediate); - } else { - // reveal top of zone widget - const lineTop = this.editor.getTopForLineNumber(position.lineNumber); - const zoneTop = lineTop - height.pixelsValue; - const spaceBelowLine = this.editor.getScrollHeight() - this.editor.getBottomForLineNumber(position.lineNumber); - const minTop = this.editor.getScrollTop() - spaceBelowLine; - const newTop = Math.max(zoneTop, minTop); - - if (newTop < this.editor.getScrollTop()) { - this.editor.setScrollTop(newTop, ScrollType.Immediate); - } - } + this._revealTopOfZoneWidget(position, height); } override updatePositionAndHeight(position: Position): void { const scrollState = StableEditorBottomScrollState.capture(this.editor); - super.updatePositionAndHeight(position, this._computeHeight().linesValue); - this._setWidgetMargins(position); + const height = this._computeHeight(); + super.updatePositionAndHeight(position, height.linesValue); scrollState.restore(this.editor); - } - protected override _getWidth(info: EditorLayoutInfo): number { - return info.width - info.minimap.minimapWidth; + this._revealTopOfZoneWidget(position, height); } - private _calculateIndentationWidth(position: Position): number { - const viewModel = this.editor._getViewModel(); - if (!viewModel) { - return 0; - } + private _revealTopOfZoneWidget(position: Position, height: { linesValue: number; pixelsValue: number }) { - const visibleRange = viewModel.getCompletelyVisibleViewRange(); - if (!visibleRange.containsPosition(position)) { - // this is needed because `getOffsetForColumn` won't work when the position - // isn't visible/rendered - return 0; - } + // reveal top of zone widget - let indentationLevel = viewModel.getLineFirstNonWhitespaceColumn(position.lineNumber); - let indentationLineNumber = position.lineNumber; - for (let lineNumber = position.lineNumber; lineNumber >= visibleRange.startLineNumber; lineNumber--) { - const currentIndentationLevel = viewModel.getLineFirstNonWhitespaceColumn(lineNumber); - if (currentIndentationLevel !== 0) { - indentationLineNumber = lineNumber; - indentationLevel = currentIndentationLevel; - break; - } + const lineNumber = position.lineNumber <= 1 ? 1 : 1 + position.lineNumber; + + const lineTop = this.editor.getTopForLineNumber(lineNumber); + const zoneTop = lineTop - height.pixelsValue; + // const spaceBelowLine = this.editor.getScrollHeight() - this.editor.getBottomForLineNumber(position.lineNumber); + // const minTop = this.editor.getScrollTop() - spaceBelowLine; + // const newTop = Math.max(zoneTop, minTop); + const newTop = zoneTop; + const currentTop = this.editor.getScrollTop(); + + if (newTop < currentTop) { + this.editor.setScrollTop(newTop, ScrollType.Immediate); } + } - return Math.max(0, this.editor.getOffsetForColumn(indentationLineNumber, indentationLevel)); // double-guard against invalie getOffsetForColumn-calls + protected override revealRange(range: Range, isLastLine: boolean): void { + // noop } - private _setWidgetMargins(position: Position): void { - const indentationWidth = this._calculateIndentationWidth(position); - if (this._indentationWidth === indentationWidth) { - return; - } - this._indentationWidth = this._availableSpaceGivenIndentation(indentationWidth) > 400 ? indentationWidth : 0; - this.widget.domNode.style.marginLeft = `${this._indentationWidth}px`; - this.widget.domNode.style.marginRight = `${this.editor.getLayoutInfo().minimap.minimapWidth}px`; + protected override _getWidth(info: EditorLayoutInfo): number { + return info.width - info.minimap.minimapWidth; } override hide(): void { From 8939d4f4678b9ca634525f6b1ae27fb548c73ea9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2024 10:17:10 -0700 Subject: [PATCH 339/755] Show progress spinner while resolving paste edits (#216553) --- .../browser/copyPasteController.ts | 31 ++++++++++++++----- .../inlineProgress/browser/inlineProgress.ts | 4 +-- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts b/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts index 7be0296af9114..ad79eb6a01f91 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.ts @@ -5,7 +5,7 @@ import { addDisposableListener, getActiveDocument } from 'vs/base/browser/dom'; import { coalesce } from 'vs/base/common/arrays'; -import { CancelablePromise, createCancelablePromise, raceCancellation } from 'vs/base/common/async'; +import { CancelablePromise, createCancelablePromise, DeferredPromise, raceCancellation } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { UriList, VSDataTransfer, createStringDataTransferItem, matchesMimeType } from 'vs/base/common/dataTransfer'; import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; @@ -36,7 +36,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { PostEditWidgetManager } from './postEditWidget'; -import { isCancellationError } from 'vs/base/common/errors'; +import { CancellationError, isCancellationError } from 'vs/base/common/errors'; export const changePasteTypeCommandId = 'editor.changePasteType'; @@ -354,12 +354,27 @@ export class CopyPasteController extends Disposable implements IEditorContributi if (editSession.edits.length) { const canShowWidget = editor.getOption(EditorOption.pasteAs).showPasteSelector === 'afterPaste'; - return this._postPasteWidgetManager.applyEditAndShowIfNeeded(selections, { activeEditIndex: 0, allEdits: editSession.edits }, canShowWidget, async (edit, token) => { - const resolved = await edit.provider.resolveDocumentPasteEdit?.(edit, token); - if (resolved) { - edit.additionalEdit = resolved.additionalEdit; - } - return edit; + return this._postPasteWidgetManager.applyEditAndShowIfNeeded(selections, { activeEditIndex: 0, allEdits: editSession.edits }, canShowWidget, (edit, token) => { + return new Promise((resolve, reject) => { + (async () => { + try { + const resolveP = edit.provider.resolveDocumentPasteEdit?.(edit, token); + const showP = new DeferredPromise(); + const resolved = resolveP && await this._pasteProgressManager.showWhile(selections[0].getEndPosition(), localize('resolveProcess', "Resolving paste edit. Click to cancel"), Promise.race([showP.p, resolveP]), { + cancel: () => { + showP.cancel(); + return reject(new CancellationError()); + } + }, 0); + if (resolved) { + edit.additionalEdit = resolved.additionalEdit; + } + return resolve(edit); + } catch (err) { + return reject(err); + } + })(); + }); }, token); } diff --git a/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts b/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts index 61082438e6e4e..25f273c126288 100644 --- a/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts +++ b/src/vs/editor/contrib/inlineProgress/browser/inlineProgress.ts @@ -134,7 +134,7 @@ export class InlineProgressManager extends Disposable { this._currentDecorations.clear(); } - public async showWhile(position: IPosition, title: string, promise: Promise, delegate: InlineProgressDelegate): Promise { + public async showWhile(position: IPosition, title: string, promise: Promise, delegate: InlineProgressDelegate, delayOverride?: number): Promise { const operationId = this._operationIdPool++; this._currentOperation = operationId; @@ -150,7 +150,7 @@ export class InlineProgressManager extends Disposable { if (decorationIds.length > 0) { this._currentWidget.value = this._instantiationService.createInstance(InlineProgressWidget, this.id, this._editor, range, title, delegate); } - }, this._showDelay); + }, delayOverride ?? this._showDelay); try { return await promise; From d662a014f4b7357bd17ba4fd471ff2d2cabf7f20 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2024 10:22:00 -0700 Subject: [PATCH 340/755] Make pasting canceling ongoing geterr requests (#216089) Should speed up pasting --- .../src/languageFeatures/copyPaste.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts index 393d1768dca2e..83a7bb38639cc 100644 --- a/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts +++ b/extensions/typescript-language-features/src/languageFeatures/copyPaste.ts @@ -99,13 +99,13 @@ class DocumentPasteProvider implements vscode.DocumentPasteEditProvider { return; } - const response = await this._client.execute('getPasteEdits', { + const response = await this._client.interruptGetErr(() => this._client.execute('getPasteEdits', { file, // TODO: only supports a single paste for now pastedText: [text], pasteLocations: ranges.map(typeConverters.Range.toTextSpan), copiedFrom - }, token); + }, token)); if (response.type !== 'response' || !response.body || token.isCancellationRequested) { return; } From 0a8e930a73c8f260119321f3eef519fb154bc8ab Mon Sep 17 00:00:00 2001 From: y0sh1ne <150506715+y0sh1ne@users.noreply.github.com> Date: Thu, 20 Jun 2024 02:24:44 +0900 Subject: [PATCH 341/755] Update language-configuration.json(fix #215999) (#216394) Update language-configuration.json add "~" in surroundingPairs --- extensions/markdown-basics/language-configuration.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/markdown-basics/language-configuration.json b/extensions/markdown-basics/language-configuration.json index f1e7859ccca57..6e1766db02cdc 100644 --- a/extensions/markdown-basics/language-configuration.json +++ b/extensions/markdown-basics/language-configuration.json @@ -79,6 +79,10 @@ [ "<", ">" + ], + [ + "~", + "~" ] ], "folding": { From 1330e6d2b854034ac1b0dd9814381c533c7d36a6 Mon Sep 17 00:00:00 2001 From: George Garside <191085+grgar@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:38:29 +0100 Subject: [PATCH 342/755] Fix merged table cells in extension marketplace readme rendering unmerged (#211666) Fix merged table cells not rendering like marketplace Marketplace website supports merged cells in tables for rendering the readme for an extension, but not inside VS Code causing tables to be broken. Add colspan and rowspan attributes to the allow list for parity with marketplace.visualstudio.com. --- src/vs/base/browser/markdownRenderer.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index a957171c3a44e..61e10f19359ad 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -482,6 +482,7 @@ export const allowedMarkdownAttr = [ 'alt', 'checked', 'class', + 'colspan', 'controls', 'data-code', 'data-href', @@ -493,6 +494,7 @@ export const allowedMarkdownAttr = [ 'muted', 'playsinline', 'poster', + 'rowspan', 'src', 'style', 'target', From 484cd68eff220ebb03b41b0e04d6956c1c742cb2 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 19 Jun 2024 19:45:06 +0200 Subject: [PATCH 343/755] SCM - history view (#216629) * Hacked up the starting point * More progress * More progress * Simplified algo, basic support for colors * Add the concept of secondary colors for merge commits * Further optimizations of the algo * Bug fixes to clean-up algo * Add support for curved branches * Keep track of nodes that are moved so that the second parent for the merge commit is rendered in the correct swimlane * Account for offset when drawing a base commit * Algo rework completed * Revert some of the hacks that were put in place to quickly get going * Add caching to the history items used in the graph Remove more hacks that were in place * Added initial tests * More work so that incoming/outgoing works along history * Uncomment more code * Bug fixes to edge cases * Experiment with a new rendering for curved branches * Handle repository with a single commit * Maintain swimlanes * Fix condition * Saving my changes * More polish and clean-up * Remove code that is not needed * Revert change * Revert more changes * More fixes * Rename interface * One last minor change * Pull request feedback * More refactoring * More pull request feedback * Fix layering issues --- extensions/git/src/api/git.d.ts | 1 + extensions/git/src/git.ts | 5 + extensions/git/src/historyProvider.ts | 124 ++++- src/vs/workbench/api/browser/mainThreadSCM.ts | 22 +- .../workbench/api/common/extHost.protocol.ts | 11 + src/vs/workbench/api/common/extHostSCM.ts | 41 +- .../contrib/scm/browser/media/scm.css | 25 + .../contrib/scm/browser/scmHistory.ts | 238 +++++++++ .../contrib/scm/browser/scmViewPane.ts | 197 ++++++- src/vs/workbench/contrib/scm/browser/util.ts | 6 +- .../workbench/contrib/scm/common/history.ts | 27 + .../scm/test/browser/scmHistory.test.ts | 503 ++++++++++++++++++ .../vscode.proposed.scmHistoryProvider.d.ts | 16 +- 13 files changed, 1180 insertions(+), 36 deletions(-) create mode 100644 src/vs/workbench/contrib/scm/browser/scmHistory.ts create mode 100644 src/vs/workbench/contrib/scm/test/browser/scmHistory.test.ts diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index a9c766b95dc9e..ce27e91424441 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -145,6 +145,7 @@ export interface LogOptions { readonly sortByAuthorDate?: boolean; readonly shortStats?: boolean; readonly author?: string; + readonly refNames?: string[]; } export interface CommitOptions { diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 46fcd6069a66a..0d27026c9ea1e 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1165,6 +1165,11 @@ export class Repository { args.push(`--author="${options.author}"`); } + if (options?.refNames) { + args.push('--topo-order'); + args.push(...options.refNames); + } + if (options?.path) { args.push('--', options.path); } diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index f238010e14c22..df86c284a3b1c 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ -import { Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, SourceControlHistoryItem, SourceControlHistoryItemChange, SourceControlHistoryItemGroup, SourceControlHistoryOptions, SourceControlHistoryProvider, ThemeIcon, Uri, window, LogOutputChannel } from 'vscode'; +import { Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, SourceControlHistoryItem, SourceControlHistoryItemChange, SourceControlHistoryItemGroup, SourceControlHistoryOptions, SourceControlHistoryProvider, ThemeIcon, Uri, window, LogOutputChannel, SourceControlHistoryItemLabel } from 'vscode'; import { Repository, Resource } from './repository'; import { IDisposable, dispose, filterEvent } from './util'; import { toGitUri } from './uri'; import { Branch, RefType, UpstreamRef } from './api/git'; import { emojify, ensureEmojis } from './emoji'; import { Operation } from './operation'; +import { Commit } from './git'; export class GitHistoryProvider implements SourceControlHistoryProvider, FileDecorationProvider, IDisposable { @@ -112,6 +113,47 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return historyItems; } + async provideHistoryItems2(options: SourceControlHistoryOptions): Promise { + if (!this.currentHistoryItemGroup || !options.historyItemGroupIds) { + return []; + } + + // Deduplicate refNames + const refNames = new Set(options.historyItemGroupIds); + + // Get the merge base of the refNames + const refsMergeBase = await this.resolveHistoryItemGroupsMergeBase(refNames); + if (!refsMergeBase) { + return []; + } + + // Get the commits + const commits = await this.repository.log({ range: `${refsMergeBase}^..`, refNames: Array.from(refNames) }); + + await ensureEmojis(); + + const historyItems: SourceControlHistoryItem[] = []; + historyItems.push(...commits.map(commit => { + const newLineIndex = commit.message.indexOf('\n'); + const subject = newLineIndex !== -1 ? commit.message.substring(0, newLineIndex) : commit.message; + + const labels = this.resolveHistoryItemLabels(commit, refNames); + + return { + id: commit.hash, + parentIds: commit.parents, + message: emojify(subject), + author: commit.authorName, + icon: new ThemeIcon('git-commit'), + timestamp: commit.authorDate?.getTime(), + statistics: commit.shortStat ?? { files: 0, insertions: 0, deletions: 0 }, + labels: labels.length !== 0 ? labels : undefined + }; + })); + + return historyItems; + } + async provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise { if (!historyItemParentId) { const commit = await this.repository.getCommit(historyItemId); @@ -159,9 +201,23 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return historyItemChanges; } + async resolveHistoryItemGroupBase(historyItemGroupId: string): Promise { + // Base (config -> reflog -> default) + const remoteBranch = await this.repository.getBranchBase(historyItemGroupId); + if (!remoteBranch?.remote || !remoteBranch?.name || !remoteBranch?.commit || remoteBranch?.type !== RefType.RemoteHead) { + this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupBase - Failed to resolve history item group base for '${historyItemGroupId}'`); + return undefined; + } + + return { + id: `refs/remotes/${remoteBranch.remote}/${remoteBranch.name}`, + name: `${remoteBranch.remote}/${remoteBranch.name}`, + }; + } + async resolveHistoryItemGroupCommonAncestor(historyItemId1: string, historyItemId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined> { if (!historyItemId2) { - const upstreamRef = await this.resolveHistoryItemGroupBase(historyItemId1); + const upstreamRef = await this.resolveHistoryItemGroupUpstreamOrBase(historyItemId1); if (!upstreamRef) { this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to resolve history item group base for '${historyItemId1}'`); return undefined; @@ -191,7 +247,65 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return this.historyItemDecorations.get(uri.toString()); } - private async resolveHistoryItemGroupBase(historyItemId: string): Promise { + private async resolveHistoryItemGroupsMergeBase(refNames: Set): Promise { + let refsMergeBase: string | undefined = undefined; + + for (const refName of refNames) { + if (refsMergeBase === undefined) { + const commit = await this.repository.revParse(refName); + refsMergeBase = commit ?? refName; + continue; + } + + const newMergeBase = await this.repository.getMergeBase(refsMergeBase, refName); + refsMergeBase = newMergeBase ?? refsMergeBase; + } + + return refsMergeBase; + } + + private resolveHistoryItemLabels(commit: Commit, refNames: Set): SourceControlHistoryItemLabel[] { + const labels: SourceControlHistoryItemLabel[] = []; + + for (const label of commit.refNames) { + if (label === 'origin/HEAD' || label === '') { + continue; + } + + if (label.startsWith('HEAD -> ')) { + labels.push( + { + title: label.substring(8), + icon: new ThemeIcon('git-branch') + } + ); + continue; + } + + if (refNames.has(label)) { + if (label.startsWith('tag: ')) { + labels.push({ + title: label.substring(5), + icon: new ThemeIcon('tag') + }); + } else if (label.startsWith('origin/')) { + labels.push({ + title: label, + icon: new ThemeIcon('cloud') + }); + } else { + labels.push({ + title: label, + icon: new ThemeIcon('git-branch') + }); + } + } + } + + return labels; + } + + private async resolveHistoryItemGroupUpstreamOrBase(historyItemId: string): Promise { try { // Upstream const branch = await this.repository.getBranch(historyItemId); @@ -202,7 +316,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec // Base (config -> reflog -> default) const remoteBranch = await this.repository.getBranchBase(historyItemId); if (!remoteBranch?.remote || !remoteBranch?.name || !remoteBranch?.commit || remoteBranch?.type !== RefType.RemoteHead) { - this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupBase - Failed to resolve history item group base for '${historyItemId}'`); + this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupUpstreamOrBase - Failed to resolve history item group base for '${historyItemId}'`); return undefined; } @@ -213,7 +327,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec }; } catch (err) { - this.logger.error(`GitHistoryProvider:resolveHistoryItemGroupBase - Failed to get branch base for '${historyItemId}': ${err.message}`); + this.logger.error(`GitHistoryProvider:resolveHistoryItemGroupUpstreamOrBase - Failed to get branch base for '${historyItemId}': ${err.message}`); } return undefined; diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 1aea5f1db905e..41da49088836d 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -9,7 +9,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { observableValue } from 'vs/base/common/observable'; import { IDisposable, DisposableStore, combinedDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation, ISCMViewService, InputValidationType, ISCMActionButtonDescriptor } from 'vs/workbench/contrib/scm/common/scm'; -import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, SCMHistoryItemGroupDto } from '../common/extHost.protocol'; +import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, SCMHistoryItemGroupDto, SCMHistoryItemDto } from '../common/extHost.protocol'; import { Command } from 'vs/editor/common/languages'; import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -42,6 +42,13 @@ function getIconFromIconDto(iconDto?: UriComponents | { light: UriComponents; da } } +function toISCMHistoryItem(historyItemDto: SCMHistoryItemDto): ISCMHistoryItem { + const icon = getIconFromIconDto(historyItemDto.icon); + const labels = historyItemDto.labels?.map(l => ({ title: l.title, icon: getIconFromIconDto(l.icon) })); + + return { ...historyItemDto, icon, labels }; +} + class SCMInputBoxContentProvider extends Disposable implements ITextModelContentProvider { constructor( textModelService: ITextModelService, @@ -170,18 +177,27 @@ class MainThreadSCMHistoryProvider implements ISCMHistoryProvider { constructor(private readonly proxy: ExtHostSCMShape, private readonly handle: number) { } + async resolveHistoryItemGroupBase(historyItemGroupId: string): Promise { + return this.proxy.$resolveHistoryItemGroupBase(this.handle, historyItemGroupId, CancellationToken.None); + } + async resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined> { return this.proxy.$resolveHistoryItemGroupCommonAncestor(this.handle, historyItemGroupId1, historyItemGroupId2, CancellationToken.None); } async provideHistoryItems(historyItemGroupId: string, options: ISCMHistoryOptions): Promise { const historyItems = await this.proxy.$provideHistoryItems(this.handle, historyItemGroupId, options, CancellationToken.None); - return historyItems?.map(historyItem => ({ ...historyItem, icon: getIconFromIconDto(historyItem.icon) })); + return historyItems?.map(historyItem => toISCMHistoryItem(historyItem)); + } + + async provideHistoryItems2(options: ISCMHistoryOptions): Promise { + const historyItems = await this.proxy.$provideHistoryItems2(this.handle, options, CancellationToken.None); + return historyItems?.map(historyItem => toISCMHistoryItem(historyItem)); } async provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise { const historyItem = await this.proxy.$provideHistoryItemSummary(this.handle, historyItemId, historyItemParentId, CancellationToken.None); - return historyItem ? { ...historyItem, icon: getIconFromIconDto(historyItem.icon) } : undefined; + return historyItem ? toISCMHistoryItem(historyItem) : undefined; } async provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined): Promise { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index d98887fdb239a..a8cfaa6272a70 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1525,6 +1525,15 @@ export interface SCMHistoryItemDto { readonly author?: string; readonly icon?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon; readonly timestamp?: number; + readonly statistics?: { + readonly files: number; + readonly insertions: number; + readonly deletions: number; + }; + readonly labels?: { + readonly title: string; + readonly icon?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon; + }[]; } export interface SCMHistoryItemChangeDto { @@ -2317,8 +2326,10 @@ export interface ExtHostSCMShape { $validateInput(sourceControlHandle: number, value: string, cursorPosition: number): Promise<[string | IMarkdownString, number] | undefined>; $setSelectedSourceControl(selectedSourceControlHandle: number | undefined): Promise; $provideHistoryItems(sourceControlHandle: number, historyItemGroupId: string, options: any, token: CancellationToken): Promise; + $provideHistoryItems2(sourceControlHandle: number, options: any, token: CancellationToken): Promise; $provideHistoryItemSummary(sourceControlHandle: number, historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): Promise; $provideHistoryItemChanges(sourceControlHandle: number, historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): Promise; + $resolveHistoryItemGroupBase(sourceControlHandle: number, historyItemGroupId: string, token: CancellationToken): Promise; $resolveHistoryItemGroupCommonAncestor(sourceControlHandle: number, historyItemGroupId1: string, historyItemGroupId2: string | undefined, token: CancellationToken): Promise<{ id: string; ahead: number; behind: number } | undefined>; } diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 14dbf15e9e203..a0284629323c7 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -11,7 +11,7 @@ import { debounce } from 'vs/base/common/decorators'; import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { asPromise } from 'vs/base/common/async'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, ICommandDto, MainThreadTelemetryShape, SCMGroupFeatures, SCMHistoryItemDto, SCMHistoryItemChangeDto } from './extHost.protocol'; +import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, ICommandDto, MainThreadTelemetryShape, SCMGroupFeatures, SCMHistoryItemDto, SCMHistoryItemChangeDto, SCMHistoryItemGroupDto } from './extHost.protocol'; import { sortedDiff, equals } from 'vs/base/common/arrays'; import { comparePaths } from 'vs/base/common/comparers'; import type * as vscode from 'vscode'; @@ -58,19 +58,26 @@ function getIconResource(decorations?: vscode.SourceControlResourceThemableDecor } } -function getHistoryItemIconDto(historyItem: vscode.SourceControlHistoryItem): UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon | undefined { - if (!historyItem.icon) { +function getHistoryItemIconDto(icon: vscode.Uri | { light: vscode.Uri; dark: vscode.Uri } | vscode.ThemeIcon | undefined): UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon | undefined { + if (!icon) { return undefined; - } else if (URI.isUri(historyItem.icon)) { - return historyItem.icon; - } else if (ThemeIcon.isThemeIcon(historyItem.icon)) { - return historyItem.icon; + } else if (URI.isUri(icon)) { + return icon; + } else if (ThemeIcon.isThemeIcon(icon)) { + return icon; } else { - const icon = historyItem.icon as { light: URI; dark: URI }; - return { light: icon.light, dark: icon.dark }; + const iconDto = icon as { light: URI; dark: URI }; + return { light: iconDto.light, dark: iconDto.dark }; } } +function toSCMHistoryItemDto(historyItem: vscode.SourceControlHistoryItem): SCMHistoryItemDto { + const icon = getHistoryItemIconDto(historyItem.icon); + const labels = historyItem.labels?.map(l => ({ title: l.title, icon: getHistoryItemIconDto(l.icon) })); + + return { ...historyItem, icon, labels }; +} + function compareResourceThemableDecorations(a: vscode.SourceControlResourceThemableDecorations, b: vscode.SourceControlResourceThemableDecorations): number { if (!a.iconPath && !b.iconPath) { return 0; @@ -963,6 +970,11 @@ export class ExtHostSCM implements ExtHostSCMShape { return Promise.resolve(undefined); } + async $resolveHistoryItemGroupBase(sourceControlHandle: number, historyItemGroupId: string, token: CancellationToken): Promise { + const historyProvider = this._sourceControls.get(sourceControlHandle)?.historyProvider; + return await historyProvider?.resolveHistoryItemGroupBase(historyItemGroupId, token) ?? undefined; + } + async $resolveHistoryItemGroupCommonAncestor(sourceControlHandle: number, historyItemGroupId1: string, historyItemGroupId2: string | undefined, token: CancellationToken): Promise<{ id: string; ahead: number; behind: number } | undefined> { const historyProvider = this._sourceControls.get(sourceControlHandle)?.historyProvider; return await historyProvider?.resolveHistoryItemGroupCommonAncestor(historyItemGroupId1, historyItemGroupId2, token) ?? undefined; @@ -972,7 +984,14 @@ export class ExtHostSCM implements ExtHostSCMShape { const historyProvider = this._sourceControls.get(sourceControlHandle)?.historyProvider; const historyItems = await historyProvider?.provideHistoryItems(historyItemGroupId, options, token); - return historyItems?.map(item => ({ ...item, icon: getHistoryItemIconDto(item) })) ?? undefined; + return historyItems?.map(item => toSCMHistoryItemDto(item)) ?? undefined; + } + + async $provideHistoryItems2(sourceControlHandle: number, options: any, token: CancellationToken): Promise { + const historyProvider = this._sourceControls.get(sourceControlHandle)?.historyProvider; + const historyItems = await historyProvider?.provideHistoryItems2(options, token); + + return historyItems?.map(item => toSCMHistoryItemDto(item)) ?? undefined; } async $provideHistoryItemSummary(sourceControlHandle: number, historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): Promise { @@ -982,7 +1001,7 @@ export class ExtHostSCM implements ExtHostSCMShape { } const historyItem = await historyProvider.provideHistoryItemSummary(historyItemId, historyItemParentId, token); - return historyItem ? { ...historyItem, icon: getHistoryItemIconDto(historyItem) } : undefined; + return historyItem ? toSCMHistoryItemDto(historyItem) : undefined; } async $provideHistoryItemChanges(sourceControlHandle: number, historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): Promise { diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css index ca6716b258edf..a84c1dd22c972 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm.css +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -129,6 +129,31 @@ align-items: center; } +.scm-view .monaco-list-row .history-item > .graph-container { + display: flex; + flex-shrink: 0; + height: 22px; +} + +.scm-view .monaco-list-row .history-item > .graph-container > .graph > circle { + stroke: var(--vscode-sideBar-background); +} + +.scm-view .monaco-list-row .history-item > .label-container { + display: flex; + opacity: 0.75; + flex-shrink: 0; + gap: 4px; +} + +.scm-view .monaco-list-row .history-item > .label-container > .codicon { + font-size: 14px; + border: 1px solid var(--vscode-scm-historyItemStatisticsBorder); + border-radius: 2px; + margin: 1px 0; + padding: 2px +} + .scm-view .monaco-list-row .history-item .stats-container { display: flex; font-size: 11px; diff --git a/src/vs/workbench/contrib/scm/browser/scmHistory.ts b/src/vs/workbench/contrib/scm/browser/scmHistory.ts new file mode 100644 index 0000000000000..4fe5689e8347c --- /dev/null +++ b/src/vs/workbench/contrib/scm/browser/scmHistory.ts @@ -0,0 +1,238 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { lastOrDefault } from 'vs/base/common/arrays'; +import { deepClone } from 'vs/base/common/objects'; +import { ISCMHistoryItem, ISCMHistoryItemGraphNode, ISCMHistoryItemViewModel } from 'vs/workbench/contrib/scm/common/history'; + +const SWIMLANE_HEIGHT = 22; +const SWIMLANE_WIDTH = 11; +const CIRCLE_RADIUS = 4; +const SWIMLANE_CURVE_RADIUS = 5; + +const graphColors = ['#007ACC', '#BC3FBC', '#BF8803', '#CC6633', '#F14C4C', '#16825D']; + +function createPath(stroke: string): SVGPathElement { + const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); + path.setAttribute('fill', 'none'); + path.setAttribute('stroke', stroke); + path.setAttribute('stroke-width', '1px'); + path.setAttribute('stroke-linecap', 'round'); + + return path; +} + +function drawCircle(index: number, radius: number, fill: string): SVGCircleElement { + const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); + circle.setAttribute('cx', `${SWIMLANE_WIDTH * (index + 1)}`); + circle.setAttribute('cy', `${SWIMLANE_WIDTH}`); + circle.setAttribute('r', `${radius}`); + circle.setAttribute('fill', fill); + + return circle; +} + +function drawVerticalLine(x1: number, y1: number, y2: number, color: string): SVGPathElement { + const path = createPath(color); + path.setAttribute('d', `M ${x1} ${y1} V ${y2}`); + + return path; +} + +function findLastIndex(nodes: ISCMHistoryItemGraphNode[], id: string): number { + for (let i = nodes.length - 1; i >= 0; i--) { + if (nodes[i].id === id) { + return i; + } + } + + return -1; +} + +export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemViewModel): SVGElement { + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + svg.classList.add('graph'); + + const historyItem = historyItemViewModel.historyItem; + const inputSwimlanes = historyItemViewModel.inputSwimlanes; + const outputSwimlanes = historyItemViewModel.outputSwimlanes; + + const inputIndex = inputSwimlanes.findIndex(node => node.id === historyItem.id); + const outputIndex = historyItem.parentIds.length === 0 ? -1 : outputSwimlanes.findIndex(node => node.id === historyItem.parentIds[0]); + + const circleIndex = inputIndex !== -1 ? inputIndex : inputSwimlanes.length; + const circleColorIndex = inputIndex !== -1 ? inputSwimlanes[inputIndex].color : outputSwimlanes[circleIndex]?.color ?? 0; + + for (let index = 0; index < inputSwimlanes.length; index++) { + const node = inputSwimlanes[index]; + const color = graphColors[inputSwimlanes[index].color]; + + // Not the current commit + if (node.id !== historyItem.id) { + if (index < outputSwimlanes.length && node.id === outputSwimlanes[index].id) { + // Draw | + const path = drawVerticalLine(SWIMLANE_WIDTH * (index + 1), 0, SWIMLANE_HEIGHT, color); + svg.append(path); + } else { + const d: string[] = []; + const path = createPath(color); + + // Draw | + d.push(`M ${SWIMLANE_WIDTH * (index + 1)} 0`); + d.push(`V 6`); + + // Draw / + d.push(`A ${SWIMLANE_CURVE_RADIUS} ${SWIMLANE_CURVE_RADIUS} 0 0 1 ${(SWIMLANE_WIDTH * (index + 1)) - SWIMLANE_CURVE_RADIUS} ${SWIMLANE_HEIGHT / 2}`); + + // Start walking backwards from the current index and + // find the first occurrence in the output swimlanes + // array + let nodeOutputIndex = -1; + for (let j = Math.min(index, outputSwimlanes.length) - 1; j >= 0; j--) { + if (outputSwimlanes[j].id === node.id) { + nodeOutputIndex = j; + break; + } + } + + // Draw - + d.push(`H ${(SWIMLANE_WIDTH * (nodeOutputIndex + 1)) + SWIMLANE_CURVE_RADIUS}`); + + // Draw / + d.push(`A ${SWIMLANE_CURVE_RADIUS} ${SWIMLANE_CURVE_RADIUS} 0 0 0 ${SWIMLANE_WIDTH * (nodeOutputIndex + 1)} ${(SWIMLANE_HEIGHT / 2) + SWIMLANE_CURVE_RADIUS}`); + + // Draw | + d.push(`V ${SWIMLANE_HEIGHT}`); + + path.setAttribute('d', d.join(' ')); + svg.append(path); + } + + continue; + } + + // Base commit + if (index !== circleIndex) { + const d: string[] = []; + const path = createPath(color); + + // Draw / + d.push(`M ${SWIMLANE_WIDTH * (index + 1)} 0`); + d.push(`A ${SWIMLANE_WIDTH} ${SWIMLANE_WIDTH} 0 0 1 ${SWIMLANE_WIDTH * (index)} ${SWIMLANE_WIDTH}`); + + // Draw - + d.push(`H ${SWIMLANE_WIDTH * (circleIndex + 1)}`); + + path.setAttribute('d', d.join(' ')); + svg.append(path); + } + } + + // Add remaining parent(s) + for (let i = 1; i < historyItem.parentIds.length; i++) { + const parentOutputIndex = findLastIndex(outputSwimlanes, historyItem.parentIds[i]); + if (parentOutputIndex === -1) { + continue; + } + + // Draw -\ + const d: string[] = []; + const path = createPath(graphColors[outputSwimlanes[parentOutputIndex].color]); + + // Draw \ + d.push(`M ${SWIMLANE_WIDTH * parentOutputIndex} ${SWIMLANE_HEIGHT / 2}`); + d.push(`A ${SWIMLANE_WIDTH} ${SWIMLANE_WIDTH} 0 0 1 ${SWIMLANE_WIDTH * (parentOutputIndex + 1)} ${SWIMLANE_HEIGHT}`); + + // Draw - + d.push(`M ${SWIMLANE_WIDTH * parentOutputIndex} ${SWIMLANE_HEIGHT / 2}`); + d.push(`H ${SWIMLANE_WIDTH * (circleIndex + 1)} `); + + path.setAttribute('d', d.join(' ')); + svg.append(path); + } + + // Draw | to circle + if (inputIndex !== -1) { + const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), 0, SWIMLANE_HEIGHT / 2, graphColors[circleColorIndex]); + svg.append(path); + } + + // Draw | from circle + if (outputIndex !== -1) { + const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), SWIMLANE_HEIGHT / 2, SWIMLANE_HEIGHT, graphColors[circleColorIndex]); + svg.append(path); + } + + // Draw * + if (historyItem.parentIds.length > 1) { + // Multi-parent node + const circleOuter = drawCircle(circleIndex, CIRCLE_RADIUS + 1, graphColors[circleColorIndex]); + svg.append(circleOuter); + + const circleInner = drawCircle(circleIndex, CIRCLE_RADIUS - 1, graphColors[circleColorIndex]); + svg.append(circleInner); + } else { + // Node + const circle = drawCircle(circleIndex, CIRCLE_RADIUS, graphColors[circleColorIndex]); + svg.append(circle); + } + + // Set dimensions + svg.style.height = `${SWIMLANE_HEIGHT}px`; + svg.style.width = `${SWIMLANE_WIDTH * (Math.max(inputSwimlanes.length, outputSwimlanes.length, 1) + 1)}px`; + + return svg; +} + +export function toISCMHistoryItemViewModelArray(historyItems: ISCMHistoryItem[]): ISCMHistoryItemViewModel[] { + let colorIndex = -1; + const viewModels: ISCMHistoryItemViewModel[] = []; + + for (let index = 0; index < historyItems.length; index++) { + const historyItem = historyItems[index]; + + const outputSwimlanesFromPreviousItem = lastOrDefault(viewModels)?.outputSwimlanes ?? []; + const inputSwimlanes = outputSwimlanesFromPreviousItem.map(i => deepClone(i)); + const outputSwimlanes: ISCMHistoryItemGraphNode[] = []; + + if (historyItem.parentIds.length > 0) { + let firstParentAdded = false; + + // Add first parent to the output + for (const node of inputSwimlanes) { + if (node.id === historyItem.id) { + if (!firstParentAdded) { + outputSwimlanes.push({ + ...deepClone(node), + id: historyItem.parentIds[0] + }); + firstParentAdded = true; + } + + continue; + } + + outputSwimlanes.push(deepClone(node)); + } + + // Add unprocessed parent(s) to the output + for (let i = firstParentAdded ? 1 : 0; i < historyItem.parentIds.length; i++) { + colorIndex = colorIndex < graphColors.length - 1 ? colorIndex + 1 : 1; + outputSwimlanes.push({ + id: historyItem.parentIds[i], + color: colorIndex + }); + } + } + + viewModels.push({ + historyItem, + inputSwimlanes, + outputSwimlanes, + }); + } + + return viewModels; +} diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 98090e654eea7..7102acab96e7e 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -10,7 +10,7 @@ import { IDisposable, Disposable, DisposableStore, combinedDisposable, dispose, import { ViewPane, IViewPaneOptions, ViewAction } from 'vs/workbench/browser/parts/views/viewPane'; import { append, $, Dimension, asCSSUrl, trackFocus, clearNode, prepend, isPointerEvent, isActiveElement } from 'vs/base/browser/dom'; import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { ISCMHistoryItem, ISCMHistoryItemChange, ISCMHistoryProviderCacheEntry, SCMHistoryItemChangeTreeElement, SCMHistoryItemGroupTreeElement, SCMHistoryItemTreeElement, SCMViewSeparatorElement } from 'vs/workbench/contrib/scm/common/history'; +import { ISCMHistoryItem, ISCMHistoryItemChange, ISCMHistoryItemViewModel, SCMHistoryItemViewModelTreeElement, ISCMHistoryProviderCacheEntry, SCMHistoryItemChangeTreeElement, SCMHistoryItemGroupTreeElement, SCMHistoryItemTreeElement, SCMViewSeparatorElement } from 'vs/workbench/contrib/scm/common/history'; import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMRepository, ISCMInput, IInputValidation, ISCMViewService, ISCMViewVisibleRepositoryChangeEvent, ISCMService, SCMInputChangeReason, VIEW_PANE_ID, ISCMActionButton, ISCMActionButtonDescriptor, ISCMRepositorySortKey, ISCMInputValueProviderContext, ISCMProvider } from 'vs/workbench/contrib/scm/common/scm'; import { ResourceLabels, IResourceLabel, IFileLabelOptions } from 'vs/workbench/browser/labels'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; @@ -24,7 +24,7 @@ import { MenuItemAction, IMenuService, registerAction2, MenuId, IAction2Options, import { IAction, ActionRunner, Action, Separator, IActionRunner } from 'vs/base/common/actions'; import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService, IFileIconTheme } from 'vs/platform/theme/common/themeService'; -import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar, isSCMRepository, isSCMInput, collectContextMenuActions, getActionViewItemProvider, isSCMActionButton, isSCMViewService, isSCMHistoryItemGroupTreeElement, isSCMHistoryItemTreeElement, isSCMHistoryItemChangeTreeElement, toDiffEditorArguments, isSCMResourceNode, isSCMHistoryItemChangeNode, isSCMViewSeparator, connectPrimaryMenu } from './util'; +import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar, isSCMRepository, isSCMInput, collectContextMenuActions, getActionViewItemProvider, isSCMActionButton, isSCMViewService, isSCMHistoryItemGroupTreeElement, isSCMHistoryItemTreeElement, isSCMHistoryItemChangeTreeElement, toDiffEditorArguments, isSCMResourceNode, isSCMHistoryItemChangeNode, isSCMViewSeparator, connectPrimaryMenu, isSCMHistoryItemViewModelTreeElement } from './util'; import { WorkbenchCompressibleAsyncDataTree, IOpenEvent } from 'vs/platform/list/browser/listService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { disposableTimeout, Sequencer, ThrottledDelayer, Throttler } from 'vs/base/common/async'; @@ -102,7 +102,6 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; import { clamp, rot } from 'vs/base/common/numbers'; import { ILogService } from 'vs/platform/log/common/log'; -import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { MarkdownString } from 'vs/base/common/htmlContent'; import type { IManagedHover, IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; @@ -110,6 +109,8 @@ import { OpenScmGroupAction } from 'vs/workbench/contrib/multiDiffEditor/browser import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; import { ITextModel } from 'vs/editor/common/model'; import { autorun } from 'vs/base/common/observable'; +import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; +import { renderSCMHistoryItemGraph, toISCMHistoryItemViewModelArray } from 'vs/workbench/contrib/scm/browser/scmHistory'; // type SCMResourceTreeNode = IResourceNode; // type SCMHistoryItemChangeResourceTreeNode = IResourceNode; @@ -122,6 +123,7 @@ type TreeElement = IResourceNode | SCMHistoryItemGroupTreeElement | SCMHistoryItemTreeElement | + SCMHistoryItemViewModelTreeElement | SCMHistoryItemChangeTreeElement | IResourceNode | SCMViewSeparatorElement; @@ -1003,6 +1005,104 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer { + + static readonly TEMPLATE_ID = 'history-item-2'; + get templateId(): string { return HistoryItem2Renderer.TEMPLATE_ID; } + + constructor( + @IHoverService private readonly hoverService: IHoverService + ) { } + + renderTemplate(container: HTMLElement): HistoryItem2Template { + // hack + (container.parentElement!.parentElement!.querySelector('.monaco-tl-twistie')! as HTMLElement).classList.add('force-no-twistie'); + + const element = append(container, $('.history-item')); + const graphContainer = append(element, $('.graph-container')); + + const iconLabel = new IconLabel(element, { supportIcons: true, supportHighlights: true, supportDescriptionHighlights: true }); + + const labelContainer = append(element, $('.label-container')); + element.appendChild(labelContainer); + + return { graphContainer, label: iconLabel, labelContainer, elementDisposables: new DisposableStore(), disposables: new DisposableStore() }; + } + + renderElement(node: ITreeNode, index: number, templateData: HistoryItem2Template, height: number | undefined): void { + const historyItemViewModel = node.element.historyItemViewModel; + const historyItem = historyItemViewModel.historyItem; + + templateData.graphContainer.textContent = ''; + templateData.graphContainer.appendChild(renderSCMHistoryItemGraph(historyItemViewModel)); + + const title = this.getTooltip(historyItemViewModel); + const [matches, descriptionMatches] = this.processMatches(historyItemViewModel, node.filterData); + templateData.label.setLabel(historyItem.message, undefined, { title, matches, descriptionMatches }); + + templateData.labelContainer.textContent = ''; + if (historyItem.labels) { + for (const label of historyItem.labels) { + if (label.icon && ThemeIcon.isThemeIcon(label.icon)) { + const icon = append(templateData.labelContainer, $('div.label')); + icon.classList.add(...ThemeIcon.asClassNameArray(label.icon)); + + templateData.elementDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), icon, label.title)); + } + } + } + } + + renderCompressedElements(node: ITreeNode, LabelFuzzyScore>, index: number, templateData: HistoryItem2Template, height: number | undefined): void { + throw new Error('Should never happen since node is incompressible'); + } + + private getTooltip(historyItemViewModel: ISCMHistoryItemViewModel): IManagedHoverTooltipMarkdownString { + const historyItem = historyItemViewModel.historyItem; + const markdown = new MarkdownString('', { isTrusted: true, supportThemeIcons: true }); + + if (historyItem.author) { + markdown.appendMarkdown(`$(account) **${historyItem.author}**\n\n`); + } + + if (historyItem.timestamp) { + const dateFormatter = new Intl.DateTimeFormat(platform.language, { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' }); + markdown.appendMarkdown(`$(history) ${dateFormatter.format(historyItem.timestamp)}\n\n`); + } + + markdown.appendMarkdown(historyItem.message); + + return { markdown, markdownNotSupportedFallback: historyItem.message }; + } + + private processMatches(historyItemViewModel: ISCMHistoryItemViewModel, filterData: LabelFuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] { + if (!filterData) { + return [undefined, undefined]; + } + + return [ + historyItemViewModel.historyItem.message === filterData.label ? createMatches(filterData.score) : undefined, + historyItemViewModel.historyItem.author === filterData.label ? createMatches(filterData.score) : undefined + ]; + } + + disposeElement(element: ITreeNode, index: number, templateData: HistoryItem2Template, height: number | undefined): void { + templateData.elementDisposables.clear(); + } + + disposeTemplate(templateData: HistoryItem2Template): void { + templateData.disposables.dispose(); + } +} + interface HistoryItemChangeTemplate { readonly element: HTMLElement; readonly name: HTMLElement; @@ -1084,6 +1184,7 @@ class SeparatorRenderer implements ICompressibleTreeRenderer('scm.showHistoryGraph') !== true) { + const toolBar = new MenuWorkbenchToolBar(append(element, $('.actions')), MenuId.SCMChangesSeparator, { moreIcon: Codicon.gear }, this.menuService, this.contextKeyService, this.contextMenuService, this.keybindingService, this.commandService, this.telemetryService); + disposables.add(toolBar); + } return { label, disposables }; } @@ -1150,6 +1253,8 @@ class ListDelegate implements IListVirtualDelegate { return HistoryItemGroupRenderer.TEMPLATE_ID; } else if (isSCMHistoryItemTreeElement(element)) { return HistoryItemRenderer.TEMPLATE_ID; + } else if (isSCMHistoryItemViewModelTreeElement(element)) { + return HistoryItem2Renderer.TEMPLATE_ID; } else if (isSCMHistoryItemChangeTreeElement(element) || isSCMHistoryItemChangeNode(element)) { return HistoryItemChangeRenderer.TEMPLATE_ID; } else if (isSCMViewSeparator(element)) { @@ -1230,6 +1335,10 @@ export class SCMTreeSorter implements ITreeSorter { return 0; } + if (isSCMHistoryItemViewModelTreeElement(one)) { + return isSCMHistoryItemViewModelTreeElement(other) ? 0 : 1; + } + if (isSCMHistoryItemChangeTreeElement(one) || isSCMHistoryItemChangeNode(one)) { // List if (this.viewMode() === ViewMode.List) { @@ -1314,6 +1423,11 @@ export class SCMTreeKeyboardNavigationLabelProvider implements ICompressibleKeyb // the author. A match in the message takes precedence over // a match in the author. return [element.message, element.author]; + } else if (isSCMHistoryItemViewModelTreeElement(element)) { + // For a history item we want to match both the message and + // the author. A match in the message takes precedence over + // a match in the author. + return [element.historyItemViewModel.historyItem.message, element.historyItemViewModel.historyItem.author]; } else if (isSCMViewSeparator(element)) { return element.label; } else { @@ -1364,6 +1478,10 @@ function getSCMResourceId(element: TreeElement): string { const historyItemGroup = element.historyItemGroup; const provider = historyItemGroup.repository.provider; return `historyItem:${provider.id}/${historyItemGroup.id}/${element.id}/${element.parentIds.join(',')}`; + } else if (isSCMHistoryItemViewModelTreeElement(element)) { + const provider = element.repository.provider; + const historyItem = element.historyItemViewModel.historyItem; + return `historyItem2:${provider.id}/${historyItem.id}/${historyItem.parentIds.join(',')}`; } else if (isSCMHistoryItemChangeTreeElement(element)) { const historyItem = element.historyItem; const historyItemGroup = historyItem.historyItemGroup; @@ -1414,6 +1532,9 @@ export class SCMAccessibilityProvider implements IListAccessibilityProvider this.updateChildren(), this, this.visibilityDisposables); @@ -2973,6 +3095,7 @@ export class SCMViewPane extends ViewPane { this.instantiationService.createInstance(ResourceRenderer, () => this.viewMode, this.listLabels, getActionViewItemProvider(this.instantiationService), resourceActionRunner), this.instantiationService.createInstance(HistoryItemGroupRenderer, historyItemGroupActionRunner), this.instantiationService.createInstance(HistoryItemRenderer, historyItemActionRunner, getActionViewItemProvider(this.instantiationService)), + this.instantiationService.createInstance(HistoryItem2Renderer), this.instantiationService.createInstance(HistoryItemChangeRenderer, () => this.viewMode, this.listLabels), this.instantiationService.createInstance(SeparatorRenderer) ], @@ -3601,6 +3724,8 @@ class SCMTreeDataSource implements IAsyncDataSource 0) { + const label = localize('historySeparatorHeader', "History"); + const ariaLabel = localize('historySeparatorHeaderAriaLabel', "History"); + + children.push({ label, ariaLabel, repository: inputOrElement, type: 'separator' } satisfies SCMViewSeparatorElement); + } + + children.push(...historyItems); + return children; } else if (isSCMResourceGroup(inputOrElement)) { if (this.viewMode() === ViewMode.List) { @@ -3701,13 +3837,13 @@ class SCMTreeDataSource implements IAsyncDataSource { - const { showIncomingChanges, showOutgoingChanges } = this.getConfiguration(); + const { showIncomingChanges, showOutgoingChanges, showHistoryGraph } = this.getConfiguration(); const scmProvider = element.provider; const historyProvider = scmProvider.historyProvider; const currentHistoryItemGroup = historyProvider?.currentHistoryItemGroup; - if (!historyProvider || !currentHistoryItemGroup || (showIncomingChanges === 'never' && showOutgoingChanges === 'never')) { + if (!historyProvider || !currentHistoryItemGroup || (showIncomingChanges === 'never' && showOutgoingChanges === 'never') || showHistoryGraph) { return []; } @@ -3822,6 +3958,44 @@ class SCMTreeDataSource implements IAsyncDataSource { + const { showHistoryGraph } = this.getConfiguration(); + + const historyProvider = element.provider.historyProvider; + const currentHistoryItemGroup = historyProvider?.currentHistoryItemGroup; + + if (!currentHistoryItemGroup || !showHistoryGraph) { + return []; + } + + const historyProviderCacheEntry = this.getHistoryProviderCacheEntry(element); + let historyItemsElement = historyProviderCacheEntry.historyItems2.get(element.id); + const historyItemsMap = historyProviderCacheEntry.historyItems2; + + if (!historyItemsElement) { + const historyItemGroupBase = await historyProvider.resolveHistoryItemGroupBase(currentHistoryItemGroup.id); + const historyItemGroupIds = [ + currentHistoryItemGroup.id, + ...currentHistoryItemGroup.base ? [currentHistoryItemGroup.base.id] : [], + ...historyItemGroupBase ? [historyItemGroupBase.id] : [] + ]; + + historyItemsElement = await historyProvider.provideHistoryItems2({ historyItemGroupIds }) ?? []; + + this.historyProviderCache.set(element, { + ...historyProviderCacheEntry, + historyItems2: historyItemsMap.set(element.id, historyItemsElement) + }); + } + + return toISCMHistoryItemViewModelArray(historyItemsElement) + .map(v => ({ + repository: element, + historyItemViewModel: v, + type: 'historyItem2' + }) satisfies SCMHistoryItemViewModelTreeElement); + } + private async getHistoryItemChanges(element: SCMHistoryItemTreeElement): Promise<(SCMHistoryItemChangeTreeElement | IResourceNode)[]> { const repository = element.historyItemGroup.repository; const historyProvider = repository.provider.historyProvider; @@ -3919,13 +4093,15 @@ class SCMTreeDataSource implements IAsyncDataSource('scm.alwaysShowRepositories'), showActionButton: this.configurationService.getValue('scm.showActionButton'), showChangesSummary: this.configurationService.getValue('scm.showChangesSummary'), showIncomingChanges: this.configurationService.getValue('scm.showIncomingChanges'), - showOutgoingChanges: this.configurationService.getValue('scm.showOutgoingChanges') + showOutgoingChanges: this.configurationService.getValue('scm.showOutgoingChanges'), + showHistoryGraph: this.configurationService.getValue('scm.showHistoryGraph') }; } @@ -3963,6 +4139,7 @@ class SCMTreeDataSource implements IAsyncDataSource(), + historyItems2: new Map(), historyItemChanges: new Map() }; } diff --git a/src/vs/workbench/contrib/scm/browser/util.ts b/src/vs/workbench/contrib/scm/browser/util.ts index 7ff931562205c..ed24dc67bf039 100644 --- a/src/vs/workbench/contrib/scm/browser/util.ts +++ b/src/vs/workbench/contrib/scm/browser/util.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as path from 'vs/base/common/path'; -import { SCMHistoryItemChangeTreeElement, SCMHistoryItemGroupTreeElement, SCMHistoryItemTreeElement, SCMViewSeparatorElement } from 'vs/workbench/contrib/scm/common/history'; +import { SCMHistoryItemChangeTreeElement, SCMHistoryItemGroupTreeElement, SCMHistoryItemTreeElement, SCMHistoryItemViewModelTreeElement, SCMViewSeparatorElement } from 'vs/workbench/contrib/scm/common/history'; import { ISCMResource, ISCMRepository, ISCMResourceGroup, ISCMInput, ISCMActionButton, ISCMViewService, ISCMProvider } from 'vs/workbench/contrib/scm/common/scm'; import { IMenu, MenuItemAction } from 'vs/platform/actions/common/actions'; import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -62,6 +62,10 @@ export function isSCMHistoryItemTreeElement(element: any): element is SCMHistory (element as SCMHistoryItemTreeElement).type === 'historyItem'; } +export function isSCMHistoryItemViewModelTreeElement(element: any): element is SCMHistoryItemViewModelTreeElement { + return (element as SCMHistoryItemViewModelTreeElement).type === 'historyItem2'; +} + export function isSCMHistoryItemChangeTreeElement(element: any): element is SCMHistoryItemChangeTreeElement { return (element as SCMHistoryItemChangeTreeElement).type === 'historyItemChange'; } diff --git a/src/vs/workbench/contrib/scm/common/history.ts b/src/vs/workbench/contrib/scm/common/history.ts index 67c2bb3f577ed..51e4a0dead3ad 100644 --- a/src/vs/workbench/contrib/scm/common/history.ts +++ b/src/vs/workbench/contrib/scm/common/history.ts @@ -26,8 +26,10 @@ export interface ISCMHistoryProvider { readonly currentHistoryItemGroupObs: IObservable; provideHistoryItems(historyItemGroupId: string, options: ISCMHistoryOptions): Promise; + provideHistoryItems2(options: ISCMHistoryOptions): Promise; provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise; provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined): Promise; + resolveHistoryItemGroupBase(historyItemGroupId: string): Promise; resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined>; } @@ -35,12 +37,14 @@ export interface ISCMHistoryProviderCacheEntry { readonly incomingHistoryItemGroup: SCMHistoryItemGroupTreeElement | undefined; readonly outgoingHistoryItemGroup: SCMHistoryItemGroupTreeElement | undefined; readonly historyItems: Map; + readonly historyItems2: Map; readonly historyItemChanges: Map; } export interface ISCMHistoryOptions { readonly cursor?: string; readonly limit?: number | { id?: string }; + readonly historyItemGroupIds?: readonly string[]; } export interface ISCMHistoryItemGroup { @@ -68,6 +72,11 @@ export interface ISCMHistoryItemStatistics { readonly deletions: number; } +export interface ISCMHistoryItemLabel { + readonly title: string; + readonly icon?: URI | { light: URI; dark: URI } | ThemeIcon; +} + export interface ISCMHistoryItem { readonly id: string; readonly parentIds: string[]; @@ -76,6 +85,24 @@ export interface ISCMHistoryItem { readonly icon?: URI | { light: URI; dark: URI } | ThemeIcon; readonly timestamp?: number; readonly statistics?: ISCMHistoryItemStatistics; + readonly labels?: ISCMHistoryItemLabel[]; +} + +export interface ISCMHistoryItemGraphNode { + readonly id: string; + readonly color: number; +} + +export interface ISCMHistoryItemViewModel { + readonly historyItem: ISCMHistoryItem; + readonly inputSwimlanes: ISCMHistoryItemGraphNode[]; + readonly outputSwimlanes: ISCMHistoryItemGraphNode[]; +} + +export interface SCMHistoryItemViewModelTreeElement { + readonly repository: ISCMRepository; + readonly historyItemViewModel: ISCMHistoryItemViewModel; + readonly type: 'historyItem2'; } export interface SCMHistoryItemTreeElement extends ISCMHistoryItem { diff --git a/src/vs/workbench/contrib/scm/test/browser/scmHistory.test.ts b/src/vs/workbench/contrib/scm/test/browser/scmHistory.test.ts new file mode 100644 index 0000000000000..5c64ccda40249 --- /dev/null +++ b/src/vs/workbench/contrib/scm/test/browser/scmHistory.test.ts @@ -0,0 +1,503 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { toISCMHistoryItemViewModelArray } from 'vs/workbench/contrib/scm/browser/scmHistory'; +import { ISCMHistoryItem } from 'vs/workbench/contrib/scm/common/history'; + +suite('toISCMHistoryItemViewModelArray', () => { + + ensureNoDisposablesAreLeakedInTestSuite(); + + test('empty graph', () => { + const viewModels = toISCMHistoryItemViewModelArray([]); + + assert.strictEqual(viewModels.length, 0); + }); + + + /** + * * a + */ + + test('single commit', () => { + const models = [ + { id: 'a', parentIds: [], message: '' }, + ] as ISCMHistoryItem[]; + + const viewModels = toISCMHistoryItemViewModelArray(models); + + assert.strictEqual(viewModels.length, 1); + + assert.strictEqual(viewModels[0].inputSwimlanes.length, 0); + assert.strictEqual(viewModels[0].outputSwimlanes.length, 0); + }); + + /** + * * a(b) + * * b(c) + * * c(d) + * * d(e) + * * e + */ + test('linear graph', () => { + const models = [ + { id: 'a', parentIds: ['b'] }, + { id: 'b', parentIds: ['c'] }, + { id: 'c', parentIds: ['d'] }, + { id: 'd', parentIds: ['e'] }, + { id: 'e', parentIds: [] }, + ] as ISCMHistoryItem[]; + + const viewModels = toISCMHistoryItemViewModelArray(models); + + assert.strictEqual(viewModels.length, 5); + + // node a + assert.strictEqual(viewModels[0].inputSwimlanes.length, 0); + + assert.strictEqual(viewModels[0].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[0].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[0].outputSwimlanes[0].color, 0); + + // node b + assert.strictEqual(viewModels[1].inputSwimlanes.length, 1); + assert.strictEqual(viewModels[1].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].inputSwimlanes[0].color, 0); + + assert.strictEqual(viewModels[1].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[1].outputSwimlanes[0].id, 'c'); + assert.strictEqual(viewModels[1].outputSwimlanes[0].color, 0); + + // node c + assert.strictEqual(viewModels[2].inputSwimlanes.length, 1); + assert.strictEqual(viewModels[2].inputSwimlanes[0].id, 'c'); + assert.strictEqual(viewModels[2].inputSwimlanes[0].color, 0); + + assert.strictEqual(viewModels[2].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[2].outputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[2].outputSwimlanes[0].color, 0); + + // node d + assert.strictEqual(viewModels[3].inputSwimlanes.length, 1); + assert.strictEqual(viewModels[3].inputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[3].inputSwimlanes[0].color, 0); + + assert.strictEqual(viewModels[3].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[3].outputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[3].outputSwimlanes[0].color, 0); + + // node e + assert.strictEqual(viewModels[4].inputSwimlanes.length, 1); + assert.strictEqual(viewModels[4].inputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[4].inputSwimlanes[0].color, 0); + + assert.strictEqual(viewModels[4].outputSwimlanes.length, 0); + }); + + /** + * * a(b) + * * b(c,d) + * |\ + * | * d(c) + * |/ + * * c(e) + * * e(f) + */ + test('merge commit (single commit in topic branch)', () => { + const models = [ + { id: 'a', parentIds: ['b'] }, + { id: 'b', parentIds: ['c', 'd'] }, + { id: 'd', parentIds: ['c'] }, + { id: 'c', parentIds: ['e'] }, + { id: 'e', parentIds: ['f'] }, + ] as ISCMHistoryItem[]; + + const viewModels = toISCMHistoryItemViewModelArray(models); + + assert.strictEqual(viewModels.length, 5); + + // node a + assert.strictEqual(viewModels[0].inputSwimlanes.length, 0); + + assert.strictEqual(viewModels[0].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[0].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[0].outputSwimlanes[0].color, 0); + + // node b + assert.strictEqual(viewModels[1].inputSwimlanes.length, 1); + assert.strictEqual(viewModels[1].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].inputSwimlanes[0].color, 0); + + assert.strictEqual(viewModels[1].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].outputSwimlanes[0].id, 'c'); + assert.strictEqual(viewModels[1].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[1].outputSwimlanes[1].color, 1); + + // node d + assert.strictEqual(viewModels[2].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].inputSwimlanes[0].id, 'c'); + assert.strictEqual(viewModels[2].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[2].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[2].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].outputSwimlanes[0].id, 'c'); + assert.strictEqual(viewModels[2].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].outputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[2].outputSwimlanes[1].color, 1); + + // node c + assert.strictEqual(viewModels[3].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[3].inputSwimlanes[0].id, 'c'); + assert.strictEqual(viewModels[3].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].inputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[3].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[3].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[3].outputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[3].outputSwimlanes[0].color, 0); + + // node e + assert.strictEqual(viewModels[4].inputSwimlanes.length, 1); + assert.strictEqual(viewModels[4].inputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[4].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[4].outputSwimlanes[0].id, 'f'); + assert.strictEqual(viewModels[4].outputSwimlanes[0].color, 0); + }); + + /** + * * a(b,c) + * |\ + * | * c(d) + * * | b(e) + * * | e(f) + * * | f(d) + * |/ + * * d(g) + */ + test('merge commit (multiple commits in topic branch)', () => { + const models = [ + { id: 'a', parentIds: ['b', 'c'] }, + { id: 'c', parentIds: ['d'] }, + { id: 'b', parentIds: ['e'] }, + { id: 'e', parentIds: ['f'] }, + { id: 'f', parentIds: ['d'] }, + { id: 'd', parentIds: ['g'] }, + ] as ISCMHistoryItem[]; + + const viewModels = toISCMHistoryItemViewModelArray(models); + + assert.strictEqual(viewModels.length, 6); + + // node a + assert.strictEqual(viewModels[0].inputSwimlanes.length, 0); + + assert.strictEqual(viewModels[0].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[0].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[0].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[0].outputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[0].outputSwimlanes[1].color, 1); + + // node c + assert.strictEqual(viewModels[1].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].inputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[1].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[1].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[1].outputSwimlanes[1].color, 1); + + // node b + assert.strictEqual(viewModels[2].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[2].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[2].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[2].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].outputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[2].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[2].outputSwimlanes[1].color, 1); + + // node e + assert.strictEqual(viewModels[3].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[3].inputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[3].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[3].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[3].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[3].outputSwimlanes[0].id, 'f'); + assert.strictEqual(viewModels[3].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[3].outputSwimlanes[1].color, 1); + + // node f + assert.strictEqual(viewModels[4].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[4].inputSwimlanes[0].id, 'f'); + assert.strictEqual(viewModels[4].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[4].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[4].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[4].outputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[4].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[4].outputSwimlanes[1].color, 1); + + // node d + assert.strictEqual(viewModels[5].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[5].inputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[5].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[5].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[5].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[5].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[5].outputSwimlanes[0].id, 'g'); + assert.strictEqual(viewModels[5].outputSwimlanes[0].color, 0); + }); + + /** + * * a(b,c) + * |\ + * | * c(b) + * |/ + * * b(d,e) + * |\ + * | * e(f) + * | * f(g) + * * | d(h) + */ + test('create brach from merge commit', () => { + const models = [ + { id: 'a', parentIds: ['b', 'c'] }, + { id: 'c', parentIds: ['b'] }, + { id: 'b', parentIds: ['d', 'e'] }, + { id: 'e', parentIds: ['f'] }, + { id: 'f', parentIds: ['g'] }, + { id: 'd', parentIds: ['h'] }, + ] as ISCMHistoryItem[]; + + const viewModels = toISCMHistoryItemViewModelArray(models); + + assert.strictEqual(viewModels.length, 6); + + // node a + assert.strictEqual(viewModels[0].inputSwimlanes.length, 0); + + assert.strictEqual(viewModels[0].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[0].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[0].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[0].outputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[0].outputSwimlanes[1].color, 1); + + // node c + assert.strictEqual(viewModels[1].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].inputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[1].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[1].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].outputSwimlanes[1].id, 'b'); + assert.strictEqual(viewModels[1].outputSwimlanes[1].color, 1); + + // node b + assert.strictEqual(viewModels[2].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[2].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].inputSwimlanes[1].id, 'b'); + assert.strictEqual(viewModels[2].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[2].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].outputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[2].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].outputSwimlanes[1].id, 'e'); + assert.strictEqual(viewModels[2].outputSwimlanes[1].color, 2); + + // node e + assert.strictEqual(viewModels[3].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[3].inputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[3].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].inputSwimlanes[1].id, 'e'); + assert.strictEqual(viewModels[3].inputSwimlanes[1].color, 2); + + assert.strictEqual(viewModels[3].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[3].outputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[3].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].outputSwimlanes[1].id, 'f'); + assert.strictEqual(viewModels[3].outputSwimlanes[1].color, 2); + + // node f + assert.strictEqual(viewModels[4].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[4].inputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[4].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].inputSwimlanes[1].id, 'f'); + assert.strictEqual(viewModels[4].inputSwimlanes[1].color, 2); + + assert.strictEqual(viewModels[4].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[4].outputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[4].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].outputSwimlanes[1].id, 'g'); + assert.strictEqual(viewModels[4].outputSwimlanes[1].color, 2); + + // node d + assert.strictEqual(viewModels[5].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[5].inputSwimlanes[0].id, 'd'); + assert.strictEqual(viewModels[5].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[5].inputSwimlanes[1].id, 'g'); + assert.strictEqual(viewModels[5].inputSwimlanes[1].color, 2); + + assert.strictEqual(viewModels[5].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[5].outputSwimlanes[0].id, 'h'); + assert.strictEqual(viewModels[5].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[5].outputSwimlanes[1].id, 'g'); + assert.strictEqual(viewModels[5].outputSwimlanes[1].color, 2); + }); + + + /** + * * a(b,c) + * |\ + * | * c(d) + * * | b(e,f) + * |\| + * | |\ + * | | * f(g) + * * | | e(g) + * | * | d(g) + * |/ / + * | / + * |/ + * * g(h) + */ + test('create multiple branches from a commit', () => { + const models = [ + { id: 'a', parentIds: ['b', 'c'] }, + { id: 'c', parentIds: ['d'] }, + { id: 'b', parentIds: ['e', 'f'] }, + { id: 'f', parentIds: ['g'] }, + { id: 'e', parentIds: ['g'] }, + { id: 'd', parentIds: ['g'] }, + { id: 'g', parentIds: ['h'] }, + ] as ISCMHistoryItem[]; + + const viewModels = toISCMHistoryItemViewModelArray(models); + + assert.strictEqual(viewModels.length, 7); + + // node a + assert.strictEqual(viewModels[0].inputSwimlanes.length, 0); + + assert.strictEqual(viewModels[0].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[0].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[0].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[0].outputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[0].outputSwimlanes[1].color, 1); + + // node c + assert.strictEqual(viewModels[1].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].inputSwimlanes[1].id, 'c'); + assert.strictEqual(viewModels[1].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[1].outputSwimlanes.length, 2); + assert.strictEqual(viewModels[1].outputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[1].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[1].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[1].outputSwimlanes[1].color, 1); + + // node b + assert.strictEqual(viewModels[2].inputSwimlanes.length, 2); + assert.strictEqual(viewModels[2].inputSwimlanes[0].id, 'b'); + assert.strictEqual(viewModels[2].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[2].inputSwimlanes[1].color, 1); + + assert.strictEqual(viewModels[2].outputSwimlanes.length, 3); + assert.strictEqual(viewModels[2].outputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[2].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[2].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[2].outputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[2].outputSwimlanes[2].id, 'f'); + assert.strictEqual(viewModels[2].outputSwimlanes[2].color, 2); + + // node f + assert.strictEqual(viewModels[3].inputSwimlanes.length, 3); + assert.strictEqual(viewModels[3].inputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[3].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[3].inputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[3].inputSwimlanes[2].id, 'f'); + assert.strictEqual(viewModels[3].inputSwimlanes[2].color, 2); + + assert.strictEqual(viewModels[3].outputSwimlanes.length, 3); + assert.strictEqual(viewModels[3].outputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[3].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[3].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[3].outputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[3].outputSwimlanes[2].id, 'g'); + assert.strictEqual(viewModels[3].outputSwimlanes[2].color, 2); + + // node e + assert.strictEqual(viewModels[4].inputSwimlanes.length, 3); + assert.strictEqual(viewModels[4].inputSwimlanes[0].id, 'e'); + assert.strictEqual(viewModels[4].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[4].inputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[4].inputSwimlanes[2].id, 'g'); + assert.strictEqual(viewModels[4].inputSwimlanes[2].color, 2); + + assert.strictEqual(viewModels[4].outputSwimlanes.length, 3); + assert.strictEqual(viewModels[4].outputSwimlanes[0].id, 'g'); + assert.strictEqual(viewModels[4].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[4].outputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[4].outputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[4].outputSwimlanes[2].id, 'g'); + assert.strictEqual(viewModels[4].outputSwimlanes[2].color, 2); + + // node d + assert.strictEqual(viewModels[5].inputSwimlanes.length, 3); + assert.strictEqual(viewModels[5].inputSwimlanes[0].id, 'g'); + assert.strictEqual(viewModels[5].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[5].inputSwimlanes[1].id, 'd'); + assert.strictEqual(viewModels[5].inputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[5].inputSwimlanes[2].id, 'g'); + assert.strictEqual(viewModels[5].inputSwimlanes[2].color, 2); + + assert.strictEqual(viewModels[5].outputSwimlanes.length, 3); + assert.strictEqual(viewModels[5].outputSwimlanes[0].id, 'g'); + assert.strictEqual(viewModels[5].outputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[5].outputSwimlanes[1].id, 'g'); + assert.strictEqual(viewModels[5].outputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[5].outputSwimlanes[2].id, 'g'); + assert.strictEqual(viewModels[5].outputSwimlanes[2].color, 2); + + // node g + assert.strictEqual(viewModels[6].inputSwimlanes.length, 3); + assert.strictEqual(viewModels[6].inputSwimlanes[0].id, 'g'); + assert.strictEqual(viewModels[6].inputSwimlanes[0].color, 0); + assert.strictEqual(viewModels[6].inputSwimlanes[1].id, 'g'); + assert.strictEqual(viewModels[6].inputSwimlanes[1].color, 1); + assert.strictEqual(viewModels[6].inputSwimlanes[2].id, 'g'); + assert.strictEqual(viewModels[6].inputSwimlanes[2].color, 2); + + assert.strictEqual(viewModels[6].outputSwimlanes.length, 1); + assert.strictEqual(viewModels[6].outputSwimlanes[0].id, 'h'); + assert.strictEqual(viewModels[6].outputSwimlanes[0].color, 0); + }); +}); diff --git a/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts b/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts index e7e7ca1c85bbe..ba720bb90caa5 100644 --- a/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts @@ -25,26 +25,24 @@ declare module 'vscode' { // onDidChangeHistoryItemGroups: Event; provideHistoryItems(historyItemGroupId: string, options: SourceControlHistoryOptions, token: CancellationToken): ProviderResult; + provideHistoryItems2(options: SourceControlHistoryOptions, token: CancellationToken): ProviderResult; provideHistoryItemSummary?(historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): ProviderResult; provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): ProviderResult; + resolveHistoryItemGroupBase(historyItemGroupId: string, token: CancellationToken): ProviderResult; resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined, token: CancellationToken): ProviderResult<{ id: string; ahead: number; behind: number }>; } export interface SourceControlHistoryOptions { readonly cursor?: string; readonly limit?: number | { id?: string }; + readonly historyItemGroupIds?: readonly string[]; } export interface SourceControlHistoryItemGroup { readonly id: string; readonly name: string; - readonly base?: Omit; - } - - export interface SourceControlRemoteHistoryItemGroup { - readonly id: string; - readonly name: string; + readonly base?: Omit; } export interface SourceControlHistoryItemStatistics { @@ -53,6 +51,11 @@ declare module 'vscode' { readonly deletions: number; } + export interface SourceControlHistoryItemLabel { + readonly title: string; + readonly icon?: Uri | { light: Uri; dark: Uri } | ThemeIcon; + } + export interface SourceControlHistoryItem { readonly id: string; readonly parentIds: string[]; @@ -61,6 +64,7 @@ declare module 'vscode' { readonly icon?: Uri | { light: Uri; dark: Uri } | ThemeIcon; readonly timestamp?: number; readonly statistics?: SourceControlHistoryItemStatistics; + readonly labels?: SourceControlHistoryItemLabel[]; } export interface SourceControlHistoryItemChange { From 54d9054371ce07556d1b5f2a503fe07a0c14312b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 19 Jun 2024 11:16:15 -0700 Subject: [PATCH 344/755] Fix event registration in webviewIconManager (#216635) For #214234 --- .../browser/webviewIconManager.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/webviewPanel/browser/webviewIconManager.ts b/src/vs/workbench/contrib/webviewPanel/browser/webviewIconManager.ts index f24731711d3ca..3777d363bbf5e 100644 --- a/src/vs/workbench/contrib/webviewPanel/browser/webviewIconManager.ts +++ b/src/vs/workbench/contrib/webviewPanel/browser/webviewIconManager.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; @@ -14,34 +14,31 @@ export interface WebviewIcons { readonly dark: URI; } -export class WebviewIconManager implements IDisposable { +export class WebviewIconManager extends Disposable { private readonly _icons = new Map(); private _styleElement: HTMLStyleElement | undefined; - private _styleElementDisposable: DisposableStore | undefined; constructor( @ILifecycleService private readonly _lifecycleService: ILifecycleService, @IConfigurationService private readonly _configService: IConfigurationService, ) { - this._configService.onDidChangeConfiguration(e => { + super(); + this._register(this._configService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('workbench.iconTheme')) { this.updateStyleSheet(); } - }); + })); } - - dispose() { - this._styleElementDisposable?.dispose(); - this._styleElementDisposable = undefined; + override dispose() { + super.dispose(); this._styleElement = undefined; } private get styleElement(): HTMLStyleElement { if (!this._styleElement) { - this._styleElementDisposable = new DisposableStore(); - this._styleElement = dom.createStyleSheet(undefined, undefined, this._styleElementDisposable); + this._styleElement = dom.createStyleSheet(undefined, undefined, this._store); this._styleElement.className = 'webview-icons'; } return this._styleElement; From 48ab2a6a9ad26e5b86be422cefbf81fbf79042f7 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 19 Jun 2024 11:17:50 -0700 Subject: [PATCH 345/755] debug: fix cannot read properties of undefined (reading 'scheduler') (#216636) Fixes #216576 --- src/vs/workbench/contrib/debug/common/debugModel.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/common/debugModel.ts b/src/vs/workbench/contrib/debug/common/debugModel.ts index b356fb899fd95..f9c67ec895892 100644 --- a/src/vs/workbench/contrib/debug/common/debugModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugModel.ts @@ -1549,7 +1549,13 @@ export class DebugModel extends Disposable implements IDebugModel { let topCallStack = Promise.resolve(); const wholeCallStack = new Promise((c, e) => { topCallStack = thread.fetchCallStack(1).then(() => { - if (!this.schedulers.has(thread.getId()) && fetchFullStack) { + if (!fetchFullStack) { + c(); + this._onDidChangeCallStack.fire(); + return; + } + + if (!this.schedulers.has(thread.getId())) { const deferred = new DeferredPromise(); this.schedulers.set(thread.getId(), { completeDeferred: deferred, From 2e6ee2cdc0c491df1cbb5fdbfd0a088fe52b1b1c Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Wed, 19 Jun 2024 11:21:51 -0700 Subject: [PATCH 346/755] add config gear icon and make empty hint text consistent (#216633) --- src/vs/platform/actions/common/actions.ts | 1 + .../browser/interactive.contribution.ts | 20 +++++++++++++ .../interactive/browser/interactiveEditor.ts | 30 +++++++++++++++++++ .../browser/replInputHintContentWidget.ts | 8 +---- .../contrib/notebook/browser/notebookIcons.ts | 1 + 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 1e7360f3064d6..c1d80dd2c50e3 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -171,6 +171,7 @@ export class MenuId { static readonly InteractiveCellDelete = new MenuId('InteractiveCellDelete'); static readonly InteractiveCellExecute = new MenuId('InteractiveCellExecute'); static readonly InteractiveInputExecute = new MenuId('InteractiveInputExecute'); + static readonly InteractiveInputConfig = new MenuId('InteractiveInputConfig'); static readonly ReplInputExecute = new MenuId('ReplInputExecute'); static readonly IssueReporter = new MenuId('IssueReporter'); static readonly NotebookToolbar = new MenuId('NotebookToolbar'); diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index a79006781edf2..5705f2e7f3ba2 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -23,6 +23,7 @@ import { Context as SuggestContext } from 'vs/editor/contrib/suggest/browser/sug import { localize, localize2 } from 'vs/nls'; import { ILocalizedString } from 'vs/platform/action/common/action'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; +import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -431,6 +432,25 @@ registerAction2(class extends Action2 { } }); +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'interactive.configure', + title: localize2('interactive.configExecute', 'Configure input box behavior'), + category: interactiveWindowCategory, + f1: false, + icon: icons.configIcon, + menu: { + id: MenuId.InteractiveInputConfig + } + }); + } + + override run(accessor: ServicesAccessor, ...args: any[]): void { + accessor.get(ICommandService).executeCommand('workbench.action.openSettings', '@tag:replExecute'); + } +}); + registerAction2(class extends Action2 { constructor() { super({ diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index d272234b138b4..a6b48582111b2 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -88,6 +88,7 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro private _inputCellContainer!: HTMLElement; private _inputFocusIndicator!: HTMLElement; private _inputRunButtonContainer!: HTMLElement; + private _inputConfigContainer!: HTMLElement; private _inputEditorContainer!: HTMLElement; private _codeEditorWidget!: CodeEditorWidget; private _notebookWidgetService: INotebookEditorService; @@ -198,9 +199,36 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro this._inputRunButtonContainer = DOM.append(this._inputCellContainer, DOM.$('.run-button-container')); this._setupRunButtonToolbar(this._inputRunButtonContainer); this._inputEditorContainer = DOM.append(this._inputCellContainer, DOM.$('.input-editor-container')); + this._setupConfigButtonToolbar(); this._createLayoutStyles(); } + private _setupConfigButtonToolbar() { + this._inputConfigContainer = DOM.append(this._inputEditorContainer, DOM.$('.input-toolbar-container')); + this._inputConfigContainer.style.position = 'absolute'; + this._inputConfigContainer.style.right = '0'; + this._inputConfigContainer.style.marginTop = '6px'; + this._inputConfigContainer.style.marginRight = '12px'; + this._inputConfigContainer.style.zIndex = '1'; + this._inputConfigContainer.style.display = 'none'; + + const menu = this._register(this._menuService.createMenu(MenuId.InteractiveInputConfig, this._contextKeyService)); + const toolbar = this._register(new ToolBar(this._inputConfigContainer, this._contextMenuService, { + getKeyBinding: action => this._keybindingService.lookupKeybinding(action.id), + actionViewItemProvider: (action, options) => { + return createActionViewItem(this._instantiationService, action, options); + }, + renderDropdownAsChildElement: true + })); + + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + + createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, result); + toolbar.setActions([...primary, ...secondary]); + } + private _setupRunButtonToolbar(runButtonContainer: HTMLElement) { const menu = this._register(this._menuService.createMenu(MenuId.InteractiveInputExecute, this._contextKeyService)); this._runbuttonToolbar = this._register(new ToolBar(runButtonContainer, this._contextMenuService, { @@ -655,9 +683,11 @@ export class InteractiveEditor extends EditorPane implements IEditorPaneWithScro if (!this._hintElement && !shouldHide) { this._hintElement = this._instantiationService.createInstance(ReplInputHintContentWidget, this._codeEditorWidget); + this._inputConfigContainer.style.display = 'block'; } else if (this._hintElement && shouldHide) { this._hintElement.dispose(); this._hintElement = undefined; + this._inputConfigContainer.style.display = 'none'; } } diff --git a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts index a7b8f0a9d0659..e7f72559e6200 100644 --- a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts +++ b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts @@ -14,9 +14,6 @@ import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { editorForeground } from 'vs/platform/theme/common/colorRegistry'; -import { resolveColorValue } from 'vs/platform/theme/common/colorUtils'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import { InteractiveWindowSetting } from 'vs/workbench/contrib/interactive/browser/interactiveCommon'; @@ -32,7 +29,6 @@ export class ReplInputHintContentWidget extends Disposable implements IContentWi private readonly editor: ICodeEditor, @IConfigurationService private readonly configurationService: IConfigurationService, @IKeybindingService private readonly keybindingService: IKeybindingService, - @IThemeService private readonly themeService: IThemeService, ) { super(); @@ -68,7 +64,7 @@ export class ReplInputHintContentWidget extends Disposable implements IContentWi getDomNode(): HTMLElement { if (!this.domNode) { - this.domNode = dom.$('.repl-input-hint'); + this.domNode = dom.$('.empty-editor-hint'); this.domNode.style.width = 'max-content'; this.domNode.style.paddingLeft = '4px'; @@ -91,12 +87,10 @@ export class ReplInputHintContentWidget extends Disposable implements IContentWi while (this.domNode.firstChild) { this.domNode.removeChild(this.domNode.firstChild); } - const transparentForeground = resolveColorValue(editorForeground, this.themeService.getColorTheme())?.transparent(0.4); const hintElement = dom.$('div.empty-hint-text'); hintElement.style.cursor = 'text'; hintElement.style.whiteSpace = 'nowrap'; - hintElement.style.color = transparentForeground?.toString() || ''; const keybinding = this.getKeybinding(); const keybindingHintLabel = keybinding?.getLabel(); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookIcons.ts b/src/vs/workbench/contrib/notebook/browser/notebookIcons.ts index 20ffe3867e833..63c683890808f 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookIcons.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookIcons.ts @@ -9,6 +9,7 @@ import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; export const selectKernelIcon = registerIcon('notebook-kernel-select', Codicon.serverEnvironment, localize('selectKernelIcon', 'Configure icon to select a kernel in notebook editors.')); export const executeIcon = registerIcon('notebook-execute', Codicon.play, localize('executeIcon', 'Icon to execute in notebook editors.')); +export const configIcon = registerIcon('notebook-config', Codicon.gear, localize('configIcon', 'Icon to configure in notebook editors.')); export const executeAboveIcon = registerIcon('notebook-execute-above', Codicon.runAbove, localize('executeAboveIcon', 'Icon to execute above cells in notebook editors.')); export const executeBelowIcon = registerIcon('notebook-execute-below', Codicon.runBelow, localize('executeBelowIcon', 'Icon to execute below cells in notebook editors.')); export const stopIcon = registerIcon('notebook-stop', Codicon.primitiveSquare, localize('stopIcon', 'Icon to stop an execution in notebook editors.')); From 5c1b006c49d2281fae66e4ab4ec2d76c5d9ab084 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 19 Jun 2024 20:33:11 +0200 Subject: [PATCH 347/755] Statusbar - support more than 2 items in a group (#216605) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Statusbar - support more than 2 items in a group * 💄 * some :lipstick: --------- Co-authored-by: Benjamin Pasero --- .../browser/parts/statusbar/statusbarModel.ts | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts b/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts index 8fd7e353217b3..8c0ecf356a2ec 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts @@ -258,19 +258,34 @@ export class StatusbarViewModel extends Disposable { // - those with `priority: number` that can be compared // - those with `priority: string` that must be sorted // relative to another entry if possible - const mapEntryWithNumberedPriorityToIndex = new Map(); - const mapEntryWithRelativePriority = new Map(); + const mapEntryWithNumberedPriorityToIndex = new Map(); + const mapEntryWithRelativePriority = new Map>(); for (let i = 0; i < this._entries.length; i++) { const entry = this._entries[i]; if (typeof entry.priority.primary === 'number') { mapEntryWithNumberedPriorityToIndex.set(entry, i); } else { - let entries = mapEntryWithRelativePriority.get(entry.priority.primary.id); + const referenceEntryId = entry.priority.primary.id; + let entries = mapEntryWithRelativePriority.get(referenceEntryId); if (!entries) { - entries = []; - mapEntryWithRelativePriority.set(entry.priority.primary.id, entries); + + // It is possible that this entry references another entry + // that itself references an entry. In that case, we want + // to add it to the entries of the referenced entry. + + for (const relativeEntries of mapEntryWithRelativePriority.values()) { + if (relativeEntries.has(referenceEntryId)) { + entries = relativeEntries; + break; + } + } + + if (!entries) { + entries = new Map(); + mapEntryWithRelativePriority.set(referenceEntryId, entries); + } } - entries.push(entry); + entries.set(entry.id, entry); } } @@ -311,7 +326,8 @@ export class StatusbarViewModel extends Disposable { sortedEntries = []; for (const entry of sortedEntriesWithNumberedPriority) { - const relativeEntries = mapEntryWithRelativePriority.get(entry.id); + const relativeEntriesMap = mapEntryWithRelativePriority.get(entry.id); + const relativeEntries = relativeEntriesMap ? Array.from(relativeEntriesMap.values()) : undefined; // Fill relative entries to LEFT if (relativeEntries) { @@ -333,7 +349,7 @@ export class StatusbarViewModel extends Disposable { // Finally, just append all entries that reference another entry // that does not exist to the end of the list for (const [, entries] of mapEntryWithRelativePriority) { - sortedEntries.push(...entries); + sortedEntries.push(...entries.values()); } } From 856fba0b674be0e2583ba65cf3c7b9e5f035e882 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 19 Jun 2024 22:05:10 +0200 Subject: [PATCH 348/755] SCM - more work related to history (#216641) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rename base to remote * introduce base * Remove resolveHistoryItemGroupBase * 💄 * More 💄 * Remove file that is out of scope --- extensions/git/package.json | 8 +-- extensions/git/src/decorationProvider.ts | 6 +- extensions/git/src/git.ts | 1 + extensions/git/src/historyProvider.ts | 65 ++++++++++--------- src/vs/workbench/api/browser/mainThreadSCM.ts | 4 -- .../workbench/api/common/extHost.protocol.ts | 4 +- src/vs/workbench/api/common/extHostSCM.ts | 7 +- src/vs/workbench/contrib/scm/browser/menus.ts | 2 +- .../contrib/scm/browser/scmViewPane.ts | 13 ++-- .../workbench/contrib/scm/common/history.ts | 4 +- .../vscode.proposed.scmHistoryProvider.d.ts | 4 +- 11 files changed, 58 insertions(+), 60 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 23b3220a00cb3..4fc372e21f77c 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1967,23 +1967,23 @@ { "command": "git.pushRef", "group": "navigation", - "when": "scmProvider == git && scmHistoryItemGroupHasUpstream" + "when": "scmProvider == git && scmHistoryItemGroupHasRemote" }, { "command": "git.publish", "group": "navigation", - "when": "scmProvider == git && !scmHistoryItemGroupHasUpstream" + "when": "scmProvider == git && !scmHistoryItemGroupHasRemote" } ], "scm/outgoingChanges/context": [ { "command": "git.pushRef", - "when": "scmProvider == git && scmHistoryItemGroupHasUpstream", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote", "group": "1_modification@1" }, { "command": "git.publish", - "when": "scmProvider == git && !scmHistoryItemGroupHasUpstream", + "when": "scmProvider == git && !scmHistoryItemGroupHasRemote", "group": "1_modification@1" } ], diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index 3f8553260e9c6..ace68c2252453 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -220,16 +220,16 @@ class GitIncomingChangesFileDecorationProvider implements FileDecorationProvider const historyProvider = this.repository.historyProvider; const currentHistoryItemGroup = historyProvider.currentHistoryItemGroup; - if (!currentHistoryItemGroup?.base) { + if (!currentHistoryItemGroup?.remote) { return []; } - const ancestor = await historyProvider.resolveHistoryItemGroupCommonAncestor(currentHistoryItemGroup.id, currentHistoryItemGroup.base.id); + const ancestor = await historyProvider.resolveHistoryItemGroupCommonAncestor(currentHistoryItemGroup.id, currentHistoryItemGroup.remote.id); if (!ancestor) { return []; } - const changes = await this.repository.diffBetween(ancestor.id, currentHistoryItemGroup.base.id); + const changes = await this.repository.diffBetween(ancestor.id, currentHistoryItemGroup.remote.id); return changes; } catch (err) { return []; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 0d27026c9ea1e..e6eed9607f76b 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1167,6 +1167,7 @@ export class Repository { if (options?.refNames) { args.push('--topo-order'); + args.push('--decorate=full'); args.push(...options.refNames); } diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index df86c284a3b1c..05d2dad7d67f4 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -22,6 +22,8 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec readonly onDidChangeFileDecorations: Event = this._onDidChangeDecorations.event; private _HEAD: Branch | undefined; + private _HEADMergeBase: Branch | undefined; + private _currentHistoryItemGroup: SourceControlHistoryItemGroup | undefined; get currentHistoryItemGroup(): SourceControlHistoryItemGroup | undefined { return this._currentHistoryItemGroup; } set currentHistoryItemGroup(value: SourceControlHistoryItemGroup | undefined) { @@ -44,18 +46,25 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD:', JSON.stringify(this._HEAD)); this.logger.trace('GitHistoryProvider:onDidRunGitStatus - repository.HEAD:', JSON.stringify(this.repository.HEAD)); + // Get the merge base of the current history item group + const mergeBase = await this.resolveHEADMergeBase(); + // Check if HEAD has changed if (!force && this._HEAD?.name === this.repository.HEAD?.name && this._HEAD?.commit === this.repository.HEAD?.commit && this._HEAD?.upstream?.name === this.repository.HEAD?.upstream?.name && this._HEAD?.upstream?.remote === this.repository.HEAD?.upstream?.remote && - this._HEAD?.upstream?.commit === this.repository.HEAD?.upstream?.commit) { + this._HEAD?.upstream?.commit === this.repository.HEAD?.upstream?.commit && + this._HEADMergeBase?.name === mergeBase?.name && + this._HEADMergeBase?.remote === mergeBase?.remote && + this._HEADMergeBase?.commit === mergeBase?.commit) { this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD has not changed'); return; } this._HEAD = this.repository.HEAD; + this._HEADMergeBase = mergeBase; // Check if HEAD does not support incoming/outgoing (detached commit, tag) if (!this.repository.HEAD?.name || !this.repository.HEAD?.commit || this.repository.HEAD.type === RefType.Tag) { @@ -68,11 +77,14 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec this.currentHistoryItemGroup = { id: `refs/heads/${this.repository.HEAD.name ?? ''}`, name: this.repository.HEAD.name ?? '', - base: this.repository.HEAD.upstream ? - { - id: `refs/remotes/${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`, - name: `${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`, - } : undefined + remote: this.repository.HEAD.upstream ? { + id: `refs/remotes/${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`, + name: `${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`, + } : undefined, + base: mergeBase ? { + id: `refs/remotes/${mergeBase.remote}/${mergeBase.name}`, + name: `${mergeBase.remote}/${mergeBase.name}`, + } : undefined }; this.logger.trace(`GitHistoryProvider:onDidRunGitStatus - currentHistoryItemGroup (${force}): ${JSON.stringify(this.currentHistoryItemGroup)}`); @@ -201,23 +213,9 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return historyItemChanges; } - async resolveHistoryItemGroupBase(historyItemGroupId: string): Promise { - // Base (config -> reflog -> default) - const remoteBranch = await this.repository.getBranchBase(historyItemGroupId); - if (!remoteBranch?.remote || !remoteBranch?.name || !remoteBranch?.commit || remoteBranch?.type !== RefType.RemoteHead) { - this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupBase - Failed to resolve history item group base for '${historyItemGroupId}'`); - return undefined; - } - - return { - id: `refs/remotes/${remoteBranch.remote}/${remoteBranch.name}`, - name: `${remoteBranch.remote}/${remoteBranch.name}`, - }; - } - async resolveHistoryItemGroupCommonAncestor(historyItemId1: string, historyItemId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined> { if (!historyItemId2) { - const upstreamRef = await this.resolveHistoryItemGroupUpstreamOrBase(historyItemId1); + const upstreamRef = await this.resolveHistoryItemGroupMergeBase(historyItemId1); if (!upstreamRef) { this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to resolve history item group base for '${historyItemId1}'`); return undefined; @@ -268,14 +266,14 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec const labels: SourceControlHistoryItemLabel[] = []; for (const label of commit.refNames) { - if (label === 'origin/HEAD' || label === '') { + if (label === 'refs/remotes/origin/HEAD' || label === '') { continue; } if (label.startsWith('HEAD -> ')) { labels.push( { - title: label.substring(8), + title: label.substring(19), icon: new ThemeIcon('git-branch') } ); @@ -283,19 +281,19 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } if (refNames.has(label)) { - if (label.startsWith('tag: ')) { + if (label.startsWith('refs/tags/')) { labels.push({ - title: label.substring(5), + title: label.substring(10), icon: new ThemeIcon('tag') }); - } else if (label.startsWith('origin/')) { + } else if (label.startsWith('refs/remotes/')) { labels.push({ - title: label, + title: label.substring(13), icon: new ThemeIcon('cloud') }); } else { labels.push({ - title: label, + title: label.substring(11), icon: new ThemeIcon('git-branch') }); } @@ -305,7 +303,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return labels; } - private async resolveHistoryItemGroupUpstreamOrBase(historyItemId: string): Promise { + private async resolveHistoryItemGroupMergeBase(historyItemId: string): Promise { try { // Upstream const branch = await this.repository.getBranch(historyItemId); @@ -333,6 +331,15 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return undefined; } + private async resolveHEADMergeBase(): Promise { + if (this.repository.HEAD?.type !== RefType.Head || !this.repository.HEAD?.name) { + return undefined; + } + + const mergeBase = await this.repository.getBranchBase(this.repository.HEAD.name); + return mergeBase; + } + dispose(): void { dispose(this.disposables); } diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 41da49088836d..5ae48f451068f 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -177,10 +177,6 @@ class MainThreadSCMHistoryProvider implements ISCMHistoryProvider { constructor(private readonly proxy: ExtHostSCMShape, private readonly handle: number) { } - async resolveHistoryItemGroupBase(historyItemGroupId: string): Promise { - return this.proxy.$resolveHistoryItemGroupBase(this.handle, historyItemGroupId, CancellationToken.None); - } - async resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined> { return this.proxy.$resolveHistoryItemGroupCommonAncestor(this.handle, historyItemGroupId1, historyItemGroupId2, CancellationToken.None); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index a8cfaa6272a70..793267c4a7c99 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1515,7 +1515,8 @@ export type SCMRawResourceSplices = [ export interface SCMHistoryItemGroupDto { readonly id: string; readonly name: string; - readonly base?: Omit; + readonly base?: Omit, 'remote'>; + readonly remote?: Omit, 'remote'>; } export interface SCMHistoryItemDto { @@ -2329,7 +2330,6 @@ export interface ExtHostSCMShape { $provideHistoryItems2(sourceControlHandle: number, options: any, token: CancellationToken): Promise; $provideHistoryItemSummary(sourceControlHandle: number, historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): Promise; $provideHistoryItemChanges(sourceControlHandle: number, historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): Promise; - $resolveHistoryItemGroupBase(sourceControlHandle: number, historyItemGroupId: string, token: CancellationToken): Promise; $resolveHistoryItemGroupCommonAncestor(sourceControlHandle: number, historyItemGroupId1: string, historyItemGroupId2: string | undefined, token: CancellationToken): Promise<{ id: string; ahead: number; behind: number } | undefined>; } diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index a0284629323c7..8b9dd0e6f1be4 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -11,7 +11,7 @@ import { debounce } from 'vs/base/common/decorators'; import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { asPromise } from 'vs/base/common/async'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, ICommandDto, MainThreadTelemetryShape, SCMGroupFeatures, SCMHistoryItemDto, SCMHistoryItemChangeDto, SCMHistoryItemGroupDto } from './extHost.protocol'; +import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, ICommandDto, MainThreadTelemetryShape, SCMGroupFeatures, SCMHistoryItemDto, SCMHistoryItemChangeDto } from './extHost.protocol'; import { sortedDiff, equals } from 'vs/base/common/arrays'; import { comparePaths } from 'vs/base/common/comparers'; import type * as vscode from 'vscode'; @@ -970,11 +970,6 @@ export class ExtHostSCM implements ExtHostSCMShape { return Promise.resolve(undefined); } - async $resolveHistoryItemGroupBase(sourceControlHandle: number, historyItemGroupId: string, token: CancellationToken): Promise { - const historyProvider = this._sourceControls.get(sourceControlHandle)?.historyProvider; - return await historyProvider?.resolveHistoryItemGroupBase(historyItemGroupId, token) ?? undefined; - } - async $resolveHistoryItemGroupCommonAncestor(sourceControlHandle: number, historyItemGroupId1: string, historyItemGroupId2: string | undefined, token: CancellationToken): Promise<{ id: string; ahead: number; behind: number } | undefined> { const historyProvider = this._sourceControls.get(sourceControlHandle)?.historyProvider; return await historyProvider?.resolveHistoryItemGroupCommonAncestor(historyItemGroupId1, historyItemGroupId2, token) ?? undefined; diff --git a/src/vs/workbench/contrib/scm/browser/menus.ts b/src/vs/workbench/contrib/scm/browser/menus.ts index 915abcb3e32ba..a571965192758 100644 --- a/src/vs/workbench/contrib/scm/browser/menus.ts +++ b/src/vs/workbench/contrib/scm/browser/menus.ts @@ -306,7 +306,7 @@ export class SCMHistoryProviderMenus implements ISCMHistoryProviderMenus, IDispo private getOutgoingHistoryItemGroupMenu(menuId: MenuId, historyItemGroup: SCMHistoryItemGroupTreeElement): IMenu { const contextKeyService = this.contextKeyService.createOverlay([ - ['scmHistoryItemGroupHasUpstream', !!historyItemGroup.repository.provider.historyProvider?.currentHistoryItemGroup?.base], + ['scmHistoryItemGroupHasRemote', !!historyItemGroup.repository.provider.historyProvider?.currentHistoryItemGroup?.remote], ]); return this.menuService.createMenu(menuId, contextKeyService); diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 7102acab96e7e..c7852d26d4cd8 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -3855,16 +3855,16 @@ class SCMTreeDataSource implements IAsyncDataSource; provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise; provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined): Promise; - resolveHistoryItemGroupBase(historyItemGroupId: string): Promise; resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined>; } @@ -50,7 +49,8 @@ export interface ISCMHistoryOptions { export interface ISCMHistoryItemGroup { readonly id: string; readonly name: string; - readonly base?: Omit; + readonly base?: Omit, 'remote'>; + readonly remote?: Omit, 'remote'>; } export interface SCMHistoryItemGroupTreeElement { diff --git a/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts b/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts index ba720bb90caa5..9d3151733aa99 100644 --- a/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.scmHistoryProvider.d.ts @@ -29,7 +29,6 @@ declare module 'vscode' { provideHistoryItemSummary?(historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): ProviderResult; provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined, token: CancellationToken): ProviderResult; - resolveHistoryItemGroupBase(historyItemGroupId: string, token: CancellationToken): ProviderResult; resolveHistoryItemGroupCommonAncestor(historyItemGroupId1: string, historyItemGroupId2: string | undefined, token: CancellationToken): ProviderResult<{ id: string; ahead: number; behind: number }>; } @@ -42,7 +41,8 @@ declare module 'vscode' { export interface SourceControlHistoryItemGroup { readonly id: string; readonly name: string; - readonly base?: Omit; + readonly base?: Omit, 'remote'>; + readonly remote?: Omit, 'remote'>; } export interface SourceControlHistoryItemStatistics { From 36d874f090289a2ac8934a622812d45cebfb63b5 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Wed, 19 Jun 2024 13:49:09 -0700 Subject: [PATCH 349/755] override pgup pgdown for SR users (#216638) --- .../browser/contrib/navigation/arrow.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts b/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts index e6656eaac7324..203839dfd8583 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts @@ -22,7 +22,7 @@ import { CTX_NOTEBOOK_CHAT_OUTER_FOCUS_POSITION } from 'vs/workbench/contrib/not import { INotebookActionContext, INotebookCellActionContext, NotebookAction, NotebookCellAction, NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT, findTargetCellEditor } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind, NOTEBOOK_EDITOR_CURSOR_BOUNDARY } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_CURSOR_NAVIGATION_MODE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_INPUT_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_CURSOR_NAVIGATION_MODE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_INPUT_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED, NOTEBOOK_CELL_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; const NOTEBOOK_FOCUS_TOP = 'notebook.focusTop'; const NOTEBOOK_FOCUS_BOTTOM = 'notebook.focusBottom'; @@ -104,10 +104,10 @@ registerAction2(class FocusNextCellAction extends NotebookCellAction { weight: KeybindingWeight.WorkbenchContrib }, { - when: NOTEBOOK_EDITOR_FOCUSED, - primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown, }, - weight: KeybindingWeight.WorkbenchContrib + when: ContextKeyExpr.and(NOTEBOOK_CELL_EDITOR_FOCUSED, CONTEXT_ACCESSIBILITY_MODE_ENABLED), + primary: KeyMod.CtrlCmd | KeyCode.PageDown, + mac: { primary: KeyMod.WinCtrl | KeyCode.PageUp, }, + weight: KeybindingWeight.WorkbenchContrib + 1 }, ] }); @@ -180,10 +180,10 @@ registerAction2(class FocusPreviousCellAction extends NotebookCellAction { weight: KeybindingWeight.WorkbenchContrib, // markdown keybinding, focus on list: higher weight to override list.focusDown }, { - when: NOTEBOOK_EDITOR_FOCUSED, - primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp }, - weight: KeybindingWeight.WorkbenchContrib + when: ContextKeyExpr.and(NOTEBOOK_CELL_EDITOR_FOCUSED, CONTEXT_ACCESSIBILITY_MODE_ENABLED), + primary: KeyMod.CtrlCmd | KeyCode.PageUp, + mac: { primary: KeyMod.WinCtrl | KeyCode.PageUp, }, + weight: KeybindingWeight.WorkbenchContrib + 1 }, ], }); From 51917e869e4d643f9ecd5cfc6b618ba264d905c1 Mon Sep 17 00:00:00 2001 From: Michael Sorensen Date: Wed, 19 Jun 2024 14:18:44 -0700 Subject: [PATCH 350/755] Fixes #182449 : Pressing Shift re-enables webview during Drag and Drop Events (#209211) * added shift key listener to re-enable drag events for webview https://github.com/microsoft/vscode/issues/182449 * adding drag and drag over listeners to webview iframe(s) updating html hash adding shift release listener to drag and drag over events adding new custom drag event handler to allow event bubbling adding new event types correcting comment: removing drag over listener from drag monitor since we are converting this to drag events making webview drag monitor stateful and adding missing events to iframe dom html file Revert "Merge remote-tracking branch 'microsoft/main' into swordensen" This reverts commit 47e38770cc69511ef7f35687ed087ec0e1b5ec9e, reversing changes made to 8f719275613cd30cadf5b06d6a3c55d617e2406f. Revert "making webview drag monitor stateful and adding missing events to iframe dom html file" This reverts commit 8f719275613cd30cadf5b06d6a3c55d617e2406f. Revert "removing drag over listener from drag monitor since we are converting this to drag events" This reverts commit bfae5f1880bfc165eb99b34ffa24d59ce6c3b2dc. Revert "correcting comment:" This reverts commit 696facbbcae31f1899d94cd2ef21fcc94e08acce. Revert "Merge branch 'main' into main" This reverts commit 78ed36c09132045131d23a981406dedc76dcd745, reversing changes made to 7b96d0eb9b21ce558e8d69b49ece1344da83e0d2. Revert "adding new event types" This reverts commit 7b96d0eb9b21ce558e8d69b49ece1344da83e0d2. Revert "adding new custom drag event handler to allow event bubbling" This reverts commit 39971e0367f2bf21f4e9b952b7c0d47bbb0725d8. Revert "adding shift release listener to drag and drag over events" This reverts commit 4f5d9e87dc355ae6dd7fccac0d44942b45ad3d07. Revert "updating html hash" This reverts commit 6a474cb4157b90bf07cf4862f583d3db324040aa. Revert "adding drag and drag over listeners to webview iframe(s)" This reverts commit 6688ec615686529b86413f68b55216c7e856fd85. adding harmless change to see if this causes smoketests and integration tests to fail adding sha hash Revert "adding sha hash" This reverts commit 830baa81d337ca4c22027083d6699b765fdee7b5. Revert "adding harmless change to see if this causes smoketests and integration tests to fail" This reverts commit ceb55f9f48c3b31c497826ee9b9f091c2d3f6d89. Revert "Revert "adding drag and drag over listeners to webview iframe(s)"" This reverts commit 1baf4834090fc7b8b6cabfc2a2195a691fcf400a. Revert "Revert "adding shift release listener to drag and drag over events"" This reverts commit 40bc29c1c21a0ff23c6b03abc6a5ec7a34a82a98. Revert "Revert "adding new custom drag event handler to allow event bubbling"" This reverts commit 44f4fdacd9d981d5f3f85333d99c1e09ba91aa5f. Revert "Revert "adding new event types"" This reverts commit 67f1aaa6a1f9d99140ab394c3549a129d90b6bdf. removing internal drag listener removing types. Maybe it's causing build issues? renaming drag event to WebviewDragEvent to avoid collision with native DragEvent type resolving conflict with correcting comment Revert "Revert "Merge branch 'main' into main"" This reverts commit 1a4d711810762af8943c6095ccfb9c6847dd3923. Revert "Revert "Merge branch 'main' into main"" This reverts commit 8520787fb68ae197bac5fae61131ec88a0be3809. resolving conflict Revert "resolving conflict" This reverts commit c5b3f7fc40f3015fee5d9123a4d3d19dca3d1987. Revert "Merge remote-tracking branch 'microsoft/main' into swordensen" somehow i got assigned these changes in the process of unreverting my merges fix: serialization of newline characters removing console log forgot the security hash when removing console log * updating sha --- .../contrib/webview/browser/pre/index.html | 22 +++++++++++++--- .../contrib/webview/browser/webviewElement.ts | 17 +++++++++++- .../webview/browser/webviewMessages.d.ts | 5 ++++ .../browser/webviewWindowDragMonitor.ts | 26 +++++++++++++++++-- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 7629db38a295c..0c6829c08f8b0 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -5,7 +5,9 @@ + + content="default-src 'none'; script-src 'sha256-EJBlYt9sOvo6RhZZJG+duTqIZCB8pctk1a62h/ZIElc=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> + void} callback */ @@ -881,7 +894,9 @@ window.addEventListener('keydown', handleInnerKeydown); window.addEventListener('keyup', handleInnerKeyup); window.addEventListener('dragenter', handleInnerDragStartEvent); - window.addEventListener('dragover', handleInnerDragStartEvent); + window.addEventListener('dragover', handleInnerDragEvent); + window.addEventListener('drag', handleInnerDragEvent); + onDomReady(() => { if (!document.body) { @@ -1163,7 +1178,8 @@ }); contentWindow.addEventListener('dragenter', handleInnerDragStartEvent); - contentWindow.addEventListener('dragover', handleInnerDragStartEvent); + contentWindow.addEventListener('dragover', handleInnerDragEvent); + contentWindow.addEventListener('drag', handleInnerDragEvent); unloadMonitor.onIframeLoaded(newFrame); } diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 3d5d21f080f7f..5d6e403159f46 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -34,7 +34,7 @@ import { loadLocalResource, WebviewResourceResponse } from 'vs/workbench/contrib import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { areWebviewContentOptionsEqual, IWebview, WebviewContentOptions, WebviewExtensionDescription, WebviewInitInfo, WebviewMessageReceivedEvent, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; import { WebviewFindDelegate, WebviewFindWidget } from 'vs/workbench/contrib/webview/browser/webviewFindWidget'; -import { FromWebviewMessage, KeyEvent, ToWebviewMessage } from 'vs/workbench/contrib/webview/browser/webviewMessages'; +import { FromWebviewMessage, KeyEvent, ToWebviewMessage, WebViewDragEvent } from 'vs/workbench/contrib/webview/browser/webviewMessages'; import { decodeAuthority, webviewGenericCspSource, webviewRootResourceAuthority } from 'vs/workbench/contrib/webview/common/webview'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { CodeWindow } from 'vs/base/browser/window'; @@ -310,6 +310,10 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this._startBlockingIframeDragEvents(); })); + this._register(this.on('drag', (event) => { + this.handleDragEvent('drag', event); + })); + if (initInfo.options.enableFindWidget) { this._webviewFindWidget = this._register(instantiationService.createInstance(WebviewFindWidget, this)); } @@ -697,6 +701,17 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this.window?.dispatchEvent(emulatedKeyboardEvent); } + private handleDragEvent(type: 'drag', event: WebViewDragEvent) { + // Create a fake DragEvent from the data provided + const emulatedDragEvent = new DragEvent(type, event); + // Force override the target + Object.defineProperty(emulatedDragEvent, 'target', { + get: () => this.element, + }); + // And re-dispatch + this.window?.dispatchEvent(emulatedDragEvent); + } + windowDidDragStart(): void { // Webview break drag and dropping around the main window (no events are generated when you are over them) // Work around this by disabling pointer events during the drag. diff --git a/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts b/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts index eae9c80fa6872..dde553ec05724 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts @@ -17,6 +17,10 @@ type KeyEvent = { repeat: boolean; } +type WebViewDragEvent = { + shiftKey: boolean; +} + export type FromWebviewMessage = { 'onmessage': { message: any; transfer?: ArrayBuffer[] }; 'did-click-link': { uri: string }; @@ -36,6 +40,7 @@ export type FromWebviewMessage = { 'did-keyup': KeyEvent; 'did-context-menu': { clientX: number; clientY: number; context: { [key: string]: unknown } }; 'drag-start': void; + 'drag': WebViewDragEvent }; interface UpdateContentEvent { diff --git a/src/vs/workbench/contrib/webview/browser/webviewWindowDragMonitor.ts b/src/vs/workbench/contrib/webview/browser/webviewWindowDragMonitor.ts index e4dc5eaf0e904..d009ae186da59 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewWindowDragMonitor.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewWindowDragMonitor.ts @@ -18,19 +18,41 @@ export class WebviewWindowDragMonitor extends Disposable { constructor(targetWindow: CodeWindow, getWebview: () => IWebview | undefined) { super(); - this._register(DOM.addDisposableListener(targetWindow, DOM.EventType.DRAG_START, () => { + const onDragStart = () => { getWebview()?.windowDidDragStart(); - })); + }; const onDragEnd = () => { getWebview()?.windowDidDragEnd(); }; + this._register(DOM.addDisposableListener(targetWindow, DOM.EventType.DRAG_START, () => { + onDragStart(); + })); + this._register(DOM.addDisposableListener(targetWindow, DOM.EventType.DRAG_END, onDragEnd)); + this._register(DOM.addDisposableListener(targetWindow, DOM.EventType.MOUSE_MOVE, currentEvent => { if (currentEvent.buttons === 0) { onDragEnd(); } })); + + this._register(DOM.addDisposableListener(targetWindow, DOM.EventType.DRAG, (event) => { + if (event.shiftKey) { + onDragEnd(); + } else { + onDragStart(); + } + })); + + this._register(DOM.addDisposableListener(targetWindow, DOM.EventType.DRAG_OVER, (event) => { + if (event.shiftKey) { + onDragEnd(); + } else { + onDragStart(); + } + })); + } } From 0cce95eac91c3a34e1abc0b2ffbca1209459f12f Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:23:15 -0700 Subject: [PATCH 351/755] Bump braces (#216643) --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index c36fad6488c6a..05de6b41206bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2618,11 +2618,11 @@ braces@^2.3.1, braces@^2.3.2: to-regex "^3.0.1" braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browser-stdout@1.3.1: version "1.3.1" @@ -4569,10 +4569,10 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" From 7717059b2e27430852acdc1d78a61329ed726ec3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 19 Jun 2024 23:57:39 +0200 Subject: [PATCH 352/755] fix #214294 (#216644) * fix #214294 * fix version message * finetune message --- .../abstractExtensionManagementService.ts | 5 ++ .../common/extensionGalleryService.ts | 44 +++++++++++++++-- .../common/extensionManagement.ts | 2 + .../extensions/common/extensionValidator.ts | 49 +++++++++++++++++-- .../platform/extensions/common/extensions.ts | 7 +++ .../test/common/extensionValidator.test.ts | 19 ++++++- .../userDataSync/common/extensionsSync.ts | 2 +- .../extensions/browser/extensionsActions.ts | 2 +- .../remoteExtensionManagementService.ts | 5 ++ .../common/extensionsProposedApi.ts | 40 ++++++++++++++- 10 files changed, 164 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index f7834854d97d3..284658e08d61b 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -23,6 +23,7 @@ import { } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, ExtensionKey, getGalleryExtensionId, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, IExtensionManifest, isApplicationScopedExtension, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { areApiProposalsCompatible } from 'vs/platform/extensions/common/extensionValidator'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -548,6 +549,10 @@ export abstract class AbstractExtensionManagementService extends Disposable impl compatibleExtension = await this.getCompatibleVersion(extension, sameVersion, installPreRelease, productVersion); if (!compatibleExtension) { + const incompatibleApiProposalsMessages: string[] = []; + if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [], incompatibleApiProposalsMessages)) { + throw new ExtensionManagementError(nls.localize('incompatibleAPI', "Can't install '{0}' extension. {1}", extension.displayName ?? extension.identifier.id, incompatibleApiProposalsMessages[0]), ExtensionManagementErrorCode.IncompatibleApi); + } /** If no compatible release version is found, check if the extension has a release version or not and throw relevant error */ if (!installPreRelease && extension.properties.isPreReleaseVersion && (await this.galleryService.getExtensions([extension.identifier], CancellationToken.None))[0]) { throw new ExtensionManagementError(nls.localize('notFoundReleaseExtension', "Can't install release version of '{0}' extension because it has no release version.", extension.displayName ?? extension.identifier.id), ExtensionManagementErrorCode.ReleaseVersionNotFound); diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 5548b8eefb94a..955d3bd3a20e9 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -18,7 +18,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { getTargetPlatform, IExtensionGalleryService, IExtensionIdentifier, IExtensionInfo, IGalleryExtension, IGalleryExtensionAsset, IGalleryExtensionAssets, IGalleryExtensionVersion, InstallOperation, IQueryOptions, IExtensionsControlManifest, isNotWebExtensionInWebTargetPlatform, isTargetPlatformCompatible, ITranslation, SortBy, SortOrder, StatisticType, toTargetPlatform, WEB_EXTENSION_TAG, IExtensionQueryOptions, IDeprecationInfo, ISearchPrefferedResults, ExtensionGalleryError, ExtensionGalleryErrorCode, IProductVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; import { adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId, getGalleryExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions'; -import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator'; +import { areApiProposalsCompatible, isEngineValid } from 'vs/platform/extensions/common/extensionValidator'; import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -209,6 +209,7 @@ const PropertyType = { ExtensionPack: 'Microsoft.VisualStudio.Code.ExtensionPack', Engine: 'Microsoft.VisualStudio.Code.Engine', PreRelease: 'Microsoft.VisualStudio.Code.PreRelease', + EnabledApiProposals: 'Microsoft.VisualStudio.Code.EnabledApiProposals', LocalizedLanguages: 'Microsoft.VisualStudio.Code.LocalizedLanguages', WebExtension: 'Microsoft.VisualStudio.Code.WebExtension', SponsorLink: 'Microsoft.VisualStudio.Code.SponsorLink', @@ -430,6 +431,12 @@ function isPreReleaseVersion(version: IRawGalleryExtensionVersion): boolean { return values.length > 0 && values[0].value === 'true'; } +function getEnabledApiProposals(version: IRawGalleryExtensionVersion): string[] { + const values = version.properties ? version.properties.filter(p => p.key === PropertyType.EnabledApiProposals) : []; + const value = (values.length > 0 && values[0].value) || ''; + return value ? value.split(',') : []; +} + function getLocalizedLanguages(version: IRawGalleryExtensionVersion): string[] { const values = version.properties ? version.properties.filter(p => p.key === PropertyType.LocalizedLanguages) : []; const value = (values.length > 0 && values[0].value) || ''; @@ -548,6 +555,7 @@ function toExtension(galleryExtension: IRawGalleryExtension, version: IRawGaller dependencies: getExtensions(version, PropertyType.Dependency), extensionPack: getExtensions(version, PropertyType.ExtensionPack), engine: getEngine(version), + enabledApiProposals: getEnabledApiProposals(version), localizedLanguages: getLocalizedLanguages(version), targetPlatform: getTargetPlatformForExtensionVersion(version), isPreReleaseVersion: isPreReleaseVersion(version) @@ -704,7 +712,16 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi } engine = manifest.engines.vscode; } - return isEngineValid(engine, productVersion.version, productVersion.date); + + if (!isEngineValid(engine, productVersion.version, productVersion.date)) { + return false; + } + + if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [])) { + return false; + } + + return true; } private async isValidVersion(extension: string, rawGalleryExtensionVersion: IRawGalleryExtensionVersion, versionType: 'release' | 'prerelease' | 'any', compatible: boolean, allTargetPlatforms: TargetPlatform[], targetPlatform: TargetPlatform, productVersion: IProductVersion = { version: this.productService.version, date: this.productService.date }): Promise { @@ -915,7 +932,18 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi continue; } // Allow any version if includePreRelease flag is set otherwise only release versions are allowed - if (await this.isValidVersion(getGalleryExtensionId(rawGalleryExtension.publisher.publisherName, rawGalleryExtension.extensionName), rawGalleryExtensionVersion, includePreRelease ? 'any' : 'release', criteria.compatible, allTargetPlatforms, criteria.targetPlatform, criteria.productVersion)) { + if (await this.isValidVersion( + getGalleryExtensionId(rawGalleryExtension.publisher.publisherName, rawGalleryExtension.extensionName), + rawGalleryExtensionVersion, + includePreRelease ? 'any' : 'release', + criteria.compatible, + allTargetPlatforms, + criteria.targetPlatform, + criteria.productVersion) + ) { + if (criteria.compatible && !areApiProposalsCompatible(getEnabledApiProposals(rawGalleryExtensionVersion))) { + return null; + } return toExtension(rawGalleryExtension, rawGalleryExtensionVersion, allTargetPlatforms, queryContext); } if (version && rawGalleryExtensionVersion.version === version) { @@ -1161,7 +1189,15 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi const validVersions: IRawGalleryExtensionVersion[] = []; await Promise.all(galleryExtensions[0].versions.map(async (version) => { try { - if (await this.isValidVersion(extension.identifier.id, version, includePreRelease ? 'any' : 'release', true, allTargetPlatforms, targetPlatform)) { + if ( + (await this.isValidVersion( + extension.identifier.id, + version, includePreRelease ? 'any' : 'release', + true, + allTargetPlatforms, + targetPlatform)) + && areApiProposalsCompatible(getEnabledApiProposals(version)) + ) { validVersions.push(version); } } catch (error) { /* Ignore error and skip version */ } diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 0f608249f78d9..61c9716cc56a1 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -159,6 +159,7 @@ export interface IGalleryExtensionProperties { dependencies?: string[]; extensionPack?: string[]; engine?: string; + enabledApiProposals?: string[]; localizedLanguages?: string[]; targetPlatform: TargetPlatform; isPreReleaseVersion: boolean; @@ -437,6 +438,7 @@ export const enum ExtensionManagementErrorCode { Deprecated = 'Deprecated', Malicious = 'Malicious', Incompatible = 'Incompatible', + IncompatibleApi = 'IncompatibleApi', IncompatibleTargetPlatform = 'IncompatibleTargetPlatform', ReleaseVersionNotFound = 'ReleaseVersionNotFound', Invalid = 'Invalid', diff --git a/src/vs/platform/extensions/common/extensionValidator.ts b/src/vs/platform/extensions/common/extensionValidator.ts index cee5eaeedefc5..93ac055431384 100644 --- a/src/vs/platform/extensions/common/extensionValidator.ts +++ b/src/vs/platform/extensions/common/extensionValidator.ts @@ -8,7 +8,8 @@ import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; import * as semver from 'vs/base/common/semver/semver'; -import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; +import { IExtensionManifest, parseApiProposals } from 'vs/platform/extensions/common/extensions'; +import { allApiProposals } from 'vs/platform/extensions/common/extensionsApiProposals'; export interface IParsedVersion { hasCaret: boolean; @@ -314,12 +315,22 @@ export function validateExtensionManifest(productVersion: string, productDate: P } const notices: string[] = []; - const isValid = isValidExtensionVersion(productVersion, productDate, extensionManifest, extensionIsBuiltin, notices); - if (!isValid) { + const validExtensionVersion = isValidExtensionVersion(productVersion, productDate, extensionManifest, extensionIsBuiltin, notices); + if (!validExtensionVersion) { for (const notice of notices) { validations.push([Severity.Error, notice]); } } + + if (extensionManifest.enabledApiProposals?.length) { + const incompatibleNotices: string[] = []; + if (!areApiProposalsCompatible([...extensionManifest.enabledApiProposals], incompatibleNotices)) { + for (const notice of incompatibleNotices) { + validations.push([Severity.Error, notice]); + } + } + } + return validations; } @@ -338,6 +349,38 @@ export function isEngineValid(engine: string, version: string, date: ProductDate return engine === '*' || isVersionValid(version, date, engine); } +export function areApiProposalsCompatible(apiProposals: string[]): boolean; +export function areApiProposalsCompatible(apiProposals: string[], notices: string[]): boolean; +export function areApiProposalsCompatible(apiProposals: string[], productApiProposals: Readonly<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>): boolean; +export function areApiProposalsCompatible(apiProposals: string[], arg1?: any): boolean { + if (apiProposals.length === 0) { + return true; + } + const notices: string[] | undefined = Array.isArray(arg1) ? arg1 : undefined; + const productApiProposals: Readonly<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }> = (notices ? undefined : arg1) ?? allApiProposals; + const incompatibleNotices: string[] = []; + const parsedProposals = parseApiProposals(apiProposals); + for (const { proposalName, version } of parsedProposals) { + const existingProposal = productApiProposals[proposalName]; + if (!existingProposal) { + continue; + } + if (!version) { + continue; + } + if (existingProposal.version !== version) { + if (existingProposal.version) { + incompatibleNotices.push(nls.localize('apiProposalMismatch', "Extension is not compatible with API proposal {0}. Extension requires version {1} but product has version {2}.", proposalName, version, existingProposal.version)); + } else { + incompatibleNotices.push(nls.localize('apiProposalMismatchNoVersion', "Extension is not compatible with API proposal {0}. Extension requires version {1} but product has no version defined.", proposalName, version)); + } + } + } + notices?.push(...incompatibleNotices); + return incompatibleNotices.length === 0; + +} + function isVersionValid(currentVersion: string, date: ProductDate, requestedVersion: string, notices: string[] = []): boolean { const desiredVersion = normalizeVersion(parseVersion(requestedVersion)); diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index 5ccdd4744fcbc..dc022ce00985c 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -494,6 +494,13 @@ export function isResolverExtension(manifest: IExtensionManifest, remoteAuthorit return false; } +export function parseApiProposals(enabledApiProposals: string[]): { proposalName: string; version?: number }[] { + return enabledApiProposals.map(proposal => { + const [proposalName, version] = proposal.split('@'); + return { proposalName, version: version ? parseInt(version) : undefined }; + }); +} + export function parseEnabledApiProposalNames(enabledApiProposals: string[]): string[] { return enabledApiProposals.map(proposal => proposal.split('@')[0]); } diff --git a/src/vs/platform/extensions/test/common/extensionValidator.test.ts b/src/vs/platform/extensions/test/common/extensionValidator.test.ts index a9e95e6dcc7a5..6ac5821e08a54 100644 --- a/src/vs/platform/extensions/test/common/extensionValidator.test.ts +++ b/src/vs/platform/extensions/test/common/extensionValidator.test.ts @@ -5,7 +5,7 @@ import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; -import { INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from 'vs/platform/extensions/common/extensionValidator'; +import { areApiProposalsCompatible, INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from 'vs/platform/extensions/common/extensionValidator'; suite('Extension Version Validator', () => { @@ -423,4 +423,21 @@ suite('Extension Version Validator', () => { }; assert.strictEqual(isValidExtensionVersion('1.44.0', undefined, manifest, false, []), false); }); + + test('areApiProposalsCompatible', () => { + assert.strictEqual(areApiProposalsCompatible([]), true); + assert.strictEqual(areApiProposalsCompatible([], ['hello']), true); + assert.strictEqual(areApiProposalsCompatible([], {}), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1'], {}), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '' } }), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '', version: 1 } }), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 1 } }), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal2': { proposal: '' } }), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], {}), true); + assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], { 'proposal1': { proposal: '' } }), true); + + assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 2 } }), false); + assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '' } }), false); + }); + }); diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 53561e249db7e..7af2df9134a8d 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -533,7 +533,7 @@ export class LocalExtensionsProvider { addToSkipped.push(e); this.logService.info(`${syncResourceLogLabel}: Skipped synchronizing extension`, gallery.displayName || gallery.identifier.id); } - if (error instanceof ExtensionManagementError && [ExtensionManagementErrorCode.Incompatible, ExtensionManagementErrorCode.IncompatibleTargetPlatform].includes(error.code)) { + if (error instanceof ExtensionManagementError && [ExtensionManagementErrorCode.Incompatible, ExtensionManagementErrorCode.IncompatibleApi, ExtensionManagementErrorCode.IncompatibleTargetPlatform].includes(error.code)) { this.logService.info(`${syncResourceLogLabel}: Skipped synchronizing extension because the compatible extension is not found.`, gallery.displayName || gallery.identifier.id); } else if (error) { this.logService.error(error); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index fec28e85da529..975ebf2c9a681 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -134,7 +134,7 @@ export class PromptExtensionInstallFailureAction extends Action { return; } - if ([ExtensionManagementErrorCode.Incompatible, ExtensionManagementErrorCode.IncompatibleTargetPlatform, ExtensionManagementErrorCode.Malicious, ExtensionManagementErrorCode.Deprecated].includes(this.error.name)) { + if ([ExtensionManagementErrorCode.Incompatible, ExtensionManagementErrorCode.IncompatibleApi, ExtensionManagementErrorCode.IncompatibleTargetPlatform, ExtensionManagementErrorCode.Malicious, ExtensionManagementErrorCode.Deprecated].includes(this.error.name)) { await this.dialogService.info(getErrorMessage(this.error)); return; } diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/remoteExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/remoteExtensionManagementService.ts index 79cf8b0ad4e3e..3ca587e7c8b25 100644 --- a/src/vs/workbench/services/extensionManagement/electron-sandbox/remoteExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/remoteExtensionManagementService.ts @@ -24,6 +24,7 @@ import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/use import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import { IRemoteUserDataProfilesService } from 'vs/workbench/services/userDataProfile/common/remoteUserDataProfiles'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { areApiProposalsCompatible } from 'vs/platform/extensions/common/extensionValidator'; export class NativeRemoteExtensionManagementService extends RemoteExtensionManagementService { @@ -134,6 +135,10 @@ export class NativeRemoteExtensionManagementService extends RemoteExtensionManag } if (!compatibleExtension) { + const incompatibleApiProposalsMessages: string[] = []; + if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [], incompatibleApiProposalsMessages)) { + throw new ExtensionManagementError(localize('incompatibleAPI', "Can't install '{0}' extension. {1}", extension.displayName ?? extension.identifier.id, incompatibleApiProposalsMessages[0]), ExtensionManagementErrorCode.IncompatibleApi); + } /** If no compatible release version is found, check if the extension has a release version or not and throw relevant error */ if (!includePreRelease && extension.properties.isPreReleaseVersion && (await this.galleryService.getExtensions([extension.identifier], CancellationToken.None))[0]) { throw new ExtensionManagementError(localize('notFoundReleaseExtension', "Can't install release version of '{0}' extension because it has no release version.", extension.identifier.id), ExtensionManagementErrorCode.ReleaseVersionNotFound); diff --git a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts index cad7f99d45cad..aad00bc62ccb8 100644 --- a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts +++ b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts @@ -4,11 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { localize } from 'vs/nls'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ExtensionIdentifier, IExtensionDescription, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { allApiProposals, ApiProposalName } from 'vs/platform/extensions/common/extensionsApiProposals'; +import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; +import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { Extensions, IExtensionFeatureMarkdownRenderer, IExtensionFeaturesRegistry, IRenderedData } from 'vs/workbench/services/extensionManagement/common/extensionFeatures'; +import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; export class ExtensionsProposedApi { @@ -107,3 +113,35 @@ export class ExtensionsProposedApi { } } } + +class ApiProposalsMarkdowneRenderer extends Disposable implements IExtensionFeatureMarkdownRenderer { + + readonly type = 'markdown'; + + shouldRender(manifest: IExtensionManifest): boolean { + return !!manifest.enabledApiProposals?.length; + } + + render(manifest: IExtensionManifest): IRenderedData { + const enabledApiProposals = manifest.enabledApiProposals || []; + const data = new MarkdownString(); + if (enabledApiProposals.length) { + for (const proposal of enabledApiProposals) { + data.appendMarkdown(`- \`${proposal}\`\n`); + } + } + return { + data, + dispose: () => { } + }; + } +} + +Registry.as(Extensions.ExtensionFeaturesRegistry).registerExtensionFeature({ + id: 'enabledApiProposals', + label: localize('enabledProposedAPIs', "API Proposals"), + access: { + canToggle: false + }, + renderer: new SyncDescriptor(ApiProposalsMarkdowneRenderer), +}); From 878af0771b2084516c8a0911f830d4cd0362a693 Mon Sep 17 00:00:00 2001 From: Gabriela Araujo Britto Date: Wed, 19 Jun 2024 15:12:57 -0700 Subject: [PATCH 353/755] [typescript-language-features] Region-based semantic diagnostics for TypeScript (#208713) * WIP * invalidate diagnostics in range * check whether should use region based diagnostics * add ts-expect-errors * make region opt off by default * bump to expected 5.6 * update comments to refer to 5.6 * make region diagnostics on by default for insiders --- .../typescript-language-features/package.json | 6 +++ .../package.nls.json | 1 + .../src/configuration/configuration.ts | 6 +++ .../src/languageFeatures/diagnostics.ts | 31 +++++++++++-- .../src/languageProvider.ts | 8 +++- .../src/tsServer/bufferSyncSupport.ts | 46 +++++++++++++++---- .../src/tsServer/protocol/protocol.const.ts | 1 + .../src/typeConverters.ts | 14 +++++- .../src/typeScriptServiceClientHost.ts | 10 ++-- .../src/typescriptServiceClient.ts | 9 +++- 10 files changed, 108 insertions(+), 24 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 01981b1db9529..3f7fdcf252f3d 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -1315,6 +1315,12 @@ "markdownDescription": "%typescript.workspaceSymbols.excludeLibrarySymbols%", "scope": "window" }, + "typescript.tsserver.enableRegionDiagnostics": { + "type": "boolean", + "default": true, + "description": "%typescript.tsserver.enableRegionDiagnostics%", + "scope": "window" + }, "javascript.experimental.updateImportsOnPaste": { "scope": "window", "type": "boolean", diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index cdc6264424c6d..cba24007314c4 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -16,6 +16,7 @@ "typescript.tsserver.pluginPaths": "Additional paths to discover TypeScript Language Service plugins.", "typescript.tsserver.pluginPaths.item": "Either an absolute or relative path. Relative path will be resolved against workspace folder(s).", "typescript.tsserver.trace": "Enables tracing of messages sent to the TS server. This trace can be used to diagnose TS Server issues. The trace may contain file paths, source code, and other potentially sensitive information from your project.", + "typescript.tsserver.enableRegionDiagnostics": "Enables region-based diagnostics in TypeScript. Requires using TypeScript 5.6+ in the workspace.", "typescript.validate.enable": "Enable/disable TypeScript validation.", "typescript.format.enable": "Enable/disable default TypeScript formatter.", "javascript.format.enable": "Enable/disable default JavaScript formatter.", diff --git a/extensions/typescript-language-features/src/configuration/configuration.ts b/extensions/typescript-language-features/src/configuration/configuration.ts index a08ca921e0ce6..639f3d346e0ad 100644 --- a/extensions/typescript-language-features/src/configuration/configuration.ts +++ b/extensions/typescript-language-features/src/configuration/configuration.ts @@ -124,6 +124,7 @@ export interface TypeScriptServiceConfiguration { readonly localNodePath: string | null; readonly globalNodePath: string | null; readonly workspaceSymbolsExcludeLibrarySymbols: boolean; + readonly enableRegionDiagnostics: boolean; } export function areServiceConfigurationsEqual(a: TypeScriptServiceConfiguration, b: TypeScriptServiceConfiguration): boolean { @@ -162,6 +163,7 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu localNodePath: this.readLocalNodePath(configuration), globalNodePath: this.readGlobalNodePath(configuration), workspaceSymbolsExcludeLibrarySymbols: this.readWorkspaceSymbolsExcludeLibrarySymbols(configuration), + enableRegionDiagnostics: this.readEnableRegionDiagnostics(configuration), }; } @@ -267,4 +269,8 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu private readWebTypeAcquisition(configuration: vscode.WorkspaceConfiguration): boolean { return configuration.get('typescript.tsserver.web.typeAcquisition.enabled', false); } + + private readEnableRegionDiagnostics(configuration: vscode.WorkspaceConfiguration): boolean { + return configuration.get('typescript.tsserver.enableRegionDiagnostics', true); + } } diff --git a/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts b/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts index 190e6a99bf789..990aefdfa56ae 100644 --- a/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts +++ b/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts @@ -34,6 +34,7 @@ export const enum DiagnosticKind { Syntax, Semantic, Suggestion, + RegionSemantic, } class FileDiagnostics { @@ -48,7 +49,8 @@ class FileDiagnostics { public updateDiagnostics( language: DiagnosticLanguage, kind: DiagnosticKind, - diagnostics: ReadonlyArray + diagnostics: ReadonlyArray, + ranges: ReadonlyArray | undefined ): boolean { if (language !== this.language) { this._diagnostics.clear(); @@ -61,6 +63,9 @@ class FileDiagnostics { return false; } + if (kind === DiagnosticKind.RegionSemantic) { + return this.updateRegionDiagnostics(diagnostics, ranges!); + } this._diagnostics.set(kind, diagnostics); return true; } @@ -83,6 +88,23 @@ class FileDiagnostics { } } + /** + * @param ranges The ranges whose diagnostics were updated. + */ + private updateRegionDiagnostics( + diagnostics: ReadonlyArray, + ranges: ReadonlyArray): boolean { + if (!this._diagnostics.get(DiagnosticKind.Semantic)) { + this._diagnostics.set(DiagnosticKind.Semantic, diagnostics); + return true; + } + const oldDiagnostics = this._diagnostics.get(DiagnosticKind.Semantic)!; + const newDiagnostics = oldDiagnostics.filter(diag => !ranges.some(range => diag.range.intersection(range))); + newDiagnostics.push(...diagnostics); + this._diagnostics.set(DiagnosticKind.Semantic, newDiagnostics); + return true; + } + private getSuggestionDiagnostics(settings: DiagnosticSettings) { const enableSuggestions = settings.getEnableSuggestions(this.language); return this.get(DiagnosticKind.Suggestion).filter(x => { @@ -284,15 +306,16 @@ export class DiagnosticsManager extends Disposable { file: vscode.Uri, language: DiagnosticLanguage, kind: DiagnosticKind, - diagnostics: ReadonlyArray + diagnostics: ReadonlyArray, + ranges: ReadonlyArray | undefined, ): void { let didUpdate = false; const entry = this._diagnostics.get(file); if (entry) { - didUpdate = entry.updateDiagnostics(language, kind, diagnostics); + didUpdate = entry.updateDiagnostics(language, kind, diagnostics, ranges); } else if (diagnostics.length) { const fileDiagnostics = new FileDiagnostics(file, language); - fileDiagnostics.updateDiagnostics(language, kind, diagnostics); + fileDiagnostics.updateDiagnostics(language, kind, diagnostics, ranges); this._diagnostics.set(file, fileDiagnostics); didUpdate = true; } diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index a192740986918..7b95591604bd0 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -138,7 +138,11 @@ export default class LanguageProvider extends Disposable { this.client.bufferSyncSupport.requestAllDiagnostics(); } - public diagnosticsReceived(diagnosticsKind: DiagnosticKind, file: vscode.Uri, diagnostics: (vscode.Diagnostic & { reportUnnecessary: any; reportDeprecated: any })[]): void { + public diagnosticsReceived( + diagnosticsKind: DiagnosticKind, + file: vscode.Uri, + diagnostics: (vscode.Diagnostic & { reportUnnecessary: any; reportDeprecated: any })[], + ranges: vscode.Range[] | undefined): void { if (diagnosticsKind !== DiagnosticKind.Syntax && !this.client.hasCapabilityForResource(file, ClientCapability.Semantic)) { return; } @@ -175,7 +179,7 @@ export default class LanguageProvider extends Disposable { } } return true; - })); + }), ranges); } public configFileDiagnosticsReceived(file: vscode.Uri, diagnostics: vscode.Diagnostic[]): void { diff --git a/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts b/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts index 87c715982c2b3..32707f1c0490a 100644 --- a/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts @@ -275,12 +275,12 @@ class SyncedBufferMap extends ResourceMap { } class PendingDiagnostics extends ResourceMap { - public getOrderedFileSet(): ResourceMap { + public getOrderedFileSet(): ResourceMap { const orderedResources = Array.from(this.entries()) .sort((a, b) => a.value - b.value) .map(entry => entry.resource); - const map = new ResourceMap(this._normalizePath, this.config); + const map = new ResourceMap(this._normalizePath, this.config); for (const resource of orderedResources) { map.set(resource, undefined); } @@ -292,7 +292,7 @@ class GetErrRequest { public static executeGetErrRequest( client: ITypeScriptServiceClient, - files: ResourceMap, + files: ResourceMap, onDone: () => void ) { return new GetErrRequest(client, files, onDone); @@ -303,7 +303,7 @@ class GetErrRequest { private constructor( private readonly client: ITypeScriptServiceClient, - public readonly files: ResourceMap, + public readonly files: ResourceMap, onDone: () => void ) { if (!this.isErrorReportingEnabled()) { @@ -313,19 +313,39 @@ class GetErrRequest { } const supportsSyntaxGetErr = this.client.apiVersion.gte(API.v440); - const allFiles = coalesce(Array.from(files.entries()) - .filter(entry => supportsSyntaxGetErr || client.hasCapabilityForResource(entry.resource, ClientCapability.Semantic)) + const fileEntries = Array.from(files.entries()).filter(entry => supportsSyntaxGetErr || client.hasCapabilityForResource(entry.resource, ClientCapability.Semantic)); + const allFiles = coalesce(fileEntries .map(entry => client.toTsFilePath(entry.resource))); if (!allFiles.length) { this._done = true; setImmediate(onDone); } else { - const request = this.areProjectDiagnosticsEnabled() + let request; + if (this.areProjectDiagnosticsEnabled()) { // Note that geterrForProject is almost certainly not the api we want here as it ends up computing far // too many diagnostics - ? client.executeAsync('geterrForProject', { delay: 0, file: allFiles[0] }, this._token.token) - : client.executeAsync('geterr', { delay: 0, files: allFiles }, this._token.token); + request = client.executeAsync('geterrForProject', { delay: 0, file: allFiles[0] }, this._token.token); + } + else { + let requestFiles; + if (this.areRegionDiagnosticsEnabled()) { + requestFiles = coalesce(fileEntries + .map(entry => { + const file = client.toTsFilePath(entry.resource); + const ranges = entry.value; + if (file && ranges) { + return typeConverters.Range.toFileRangesRequestArgs(file, ranges); + } + + return file; + })); + } + else { + requestFiles = allFiles; + } + request = client.executeAsync('geterr', { delay: 0, files: requestFiles }, this._token.token); + } request.finally(() => { if (this._done) { @@ -350,6 +370,10 @@ class GetErrRequest { return this.client.configuration.enableProjectDiagnostics && this.client.capabilities.has(ClientCapability.Semantic); } + private areRegionDiagnosticsEnabled() { + return this.client.configuration.enableRegionDiagnostics && this.client.apiVersion.gte(API.v560); + } + public cancel(): any { if (!this._done) { this._token.cancel(); @@ -722,7 +746,9 @@ export default class BufferSyncSupport extends Disposable { // Add all open TS buffers to the geterr request. They might be visible for (const buffer of this.syncedBuffers.values()) { - orderedFileSet.set(buffer.resource, undefined); + const editors = vscode.window.visibleTextEditors.filter(editor => editor.document.uri.toString() === buffer.resource.toString()); + const visibleRanges = editors.flatMap(editor => editor.visibleRanges); + orderedFileSet.set(buffer.resource, visibleRanges.length ? visibleRanges : undefined); } for (const { resource } of orderedFileSet.entries()) { diff --git a/extensions/typescript-language-features/src/tsServer/protocol/protocol.const.ts b/extensions/typescript-language-features/src/tsServer/protocol/protocol.const.ts index 4f02ed29427e0..f1b0cca26a480 100644 --- a/extensions/typescript-language-features/src/tsServer/protocol/protocol.const.ts +++ b/extensions/typescript-language-features/src/tsServer/protocol/protocol.const.ts @@ -78,6 +78,7 @@ export enum EventName { syntaxDiag = 'syntaxDiag', semanticDiag = 'semanticDiag', suggestionDiag = 'suggestionDiag', + regionSemanticDiag = 'regionSemanticDiag', configFileDiag = 'configFileDiag', telemetry = 'telemetry', projectLanguageServiceState = 'projectLanguageServiceState', diff --git a/extensions/typescript-language-features/src/typeConverters.ts b/extensions/typescript-language-features/src/typeConverters.ts index 58babe2bda39d..067a1ff3c0a90 100644 --- a/extensions/typescript-language-features/src/typeConverters.ts +++ b/extensions/typescript-language-features/src/typeConverters.ts @@ -26,14 +26,24 @@ export namespace Range { Math.max(0, start.line - 1), Math.max(start.offset - 1, 0), Math.max(0, end.line - 1), Math.max(0, end.offset - 1)); - export const toFileRangeRequestArgs = (file: string, range: vscode.Range): Proto.FileRangeRequestArgs => ({ - file, + // @ts-expect-error until ts 5.6 + export const toFileRange = (range: vscode.Range): Proto.FileRange => ({ startLine: range.start.line + 1, startOffset: range.start.character + 1, endLine: range.end.line + 1, endOffset: range.end.character + 1 }); + export const toFileRangeRequestArgs = (file: string, range: vscode.Range): Proto.FileRangeRequestArgs => ({ + file, + ...toFileRange(range) + }); + // @ts-expect-error until ts 5.6 + export const toFileRangesRequestArgs = (file: string, ranges: vscode.Range[]): Proto.FileRangesRequestArgs => ({ + file, + ranges: ranges.map(toFileRange) + }); + export const toFormattingRequestArgs = (file: string, range: vscode.Range): Proto.FormatRequestArgs => ({ file, line: range.start.line + 1, diff --git a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts index da651e71044f3..c44bfc3ac3fd2 100644 --- a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts +++ b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts @@ -90,8 +90,8 @@ export default class TypeScriptServiceClientHost extends Disposable { services, allModeIds)); - this.client.onDiagnosticsReceived(({ kind, resource, diagnostics }) => { - this.diagnosticsReceived(kind, resource, diagnostics); + this.client.onDiagnosticsReceived(({ kind, resource, diagnostics, spans }) => { + this.diagnosticsReceived(kind, resource, diagnostics, spans); }, null, this._disposables); this.client.onConfigDiagnosticsReceived(diag => this.configFileDiagnosticsReceived(diag), null, this._disposables); @@ -236,14 +236,16 @@ export default class TypeScriptServiceClientHost extends Disposable { private async diagnosticsReceived( kind: DiagnosticKind, resource: vscode.Uri, - diagnostics: Proto.Diagnostic[] + diagnostics: Proto.Diagnostic[], + spans: Proto.TextSpan[] | undefined, ): Promise { const language = await this.findLanguage(resource); if (language) { language.diagnosticsReceived( kind, resource, - this.createMarkerDatas(diagnostics, language.diagnosticSource)); + this.createMarkerDatas(diagnostics, language.diagnosticSource), + spans?.map(span => typeConverters.Range.fromTextSpan(span))); } } diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 24742f99219fb..da6408b827bee 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -37,6 +37,7 @@ export interface TsDiagnostics { readonly kind: DiagnosticKind; readonly resource: vscode.Uri; readonly diagnostics: Proto.Diagnostic[]; + readonly spans?: Proto.TextSpan[]; } interface ToCancelOnResourceChanged { @@ -947,7 +948,8 @@ export default class TypeScriptServiceClient extends Disposable implements IType switch (event.event) { case EventName.syntaxDiag: case EventName.semanticDiag: - case EventName.suggestionDiag: { + case EventName.suggestionDiag: + case EventName.regionSemanticDiag: { // This event also roughly signals that projects have been loaded successfully (since the TS server is synchronous) this.loadingIndicator.reset(); @@ -956,7 +958,9 @@ export default class TypeScriptServiceClient extends Disposable implements IType this._onDiagnosticsReceived.fire({ kind: getDiagnosticsKind(event), resource: this.toResource(diagnosticEvent.body.file), - diagnostics: diagnosticEvent.body.diagnostics + diagnostics: diagnosticEvent.body.diagnostics, + // @ts-expect-error until ts 5.6 + spans: diagnosticEvent.body.spans, }); } break; @@ -1261,6 +1265,7 @@ function getDiagnosticsKind(event: Proto.Event) { case 'syntaxDiag': return DiagnosticKind.Syntax; case 'semanticDiag': return DiagnosticKind.Semantic; case 'suggestionDiag': return DiagnosticKind.Suggestion; + case 'regionSemanticDiag': return DiagnosticKind.RegionSemantic; } throw new Error('Unknown dignostics kind'); } From c67b31f3f1ce1c141183611a834aa4fa8895b27a Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:26:05 +0200 Subject: [PATCH 354/755] SCM - open multi-file diff editor from history (#216645) --- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index c7852d26d4cd8..13e3a6a8652d7 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -3221,6 +3221,19 @@ export class SCMViewPane extends ViewPane { } else if (isSCMHistoryItemTreeElement(e.element)) { this.scmViewService.focus(e.element.historyItemGroup.repository); return; + } else if (isSCMHistoryItemViewModelTreeElement(e.element)) { + const historyItem = e.element.historyItemViewModel.historyItem; + const historyItemParentId = historyItem.parentIds.length > 0 ? historyItem.parentIds[0] : undefined; + + const historyProvider = e.element.repository.provider.historyProvider; + const historyItemChanges = await historyProvider?.provideHistoryItemChanges(historyItem.id, historyItemParentId); + if (historyItemChanges) { + const title = `${historyItem.id.substring(0, 8)} - ${historyItem.message}`; + await this.commandService.executeCommand('_workbench.openMultiDiffEditor', { title, resources: historyItemChanges }); + } + + this.scmViewService.focus(e.element.repository); + return; } else if (isSCMHistoryItemChangeTreeElement(e.element)) { if (e.element.originalUri && e.element.modifiedUri) { await this.commandService.executeCommand(API_OPEN_DIFF_EDITOR_COMMAND_ID, ...toDiffEditorArguments(e.element.uri, e.element.originalUri, e.element.modifiedUri), e); From a37d32986d9e04a0b001bfe15339b7486a2b6502 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:33:14 -0700 Subject: [PATCH 355/755] chore: add diagnostics to integration test runs (#216646) --- .../azure-pipelines/win32/product-build-win32-test.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build/azure-pipelines/win32/product-build-win32-test.yml b/build/azure-pipelines/win32/product-build-win32-test.yml index a3b251b71ac17..ce791c094e6b8 100644 --- a/build/azure-pipelines/win32/product-build-win32-test.yml +++ b/build/azure-pipelines/win32/product-build-win32-test.yml @@ -72,6 +72,11 @@ steps: } displayName: Build integration tests + - powershell: .\build\azure-pipelines\win32\listprocesses.bat + displayName: Diagnostics before integration test runs + continueOnError: true + condition: succeededOrFailed() + - ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}: - powershell: .\scripts\test-integration.bat --tfs "Integration Tests" displayName: Run integration tests (Electron) @@ -121,6 +126,11 @@ steps: displayName: Run integration tests (Remote) timeoutInMinutes: 20 + - powershell: .\build\azure-pipelines\win32\listprocesses.bat + displayName: Diagnostics after integration test runs + continueOnError: true + condition: succeededOrFailed() + - ${{ if eq(parameters.VSCODE_RUN_SMOKE_TESTS, true) }}: - powershell: .\build\azure-pipelines\win32\listprocesses.bat displayName: Diagnostics before smoke test run From f280d9980fdebd011d4e48a6281e9465d789a26c Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:01:02 +0200 Subject: [PATCH 356/755] =?UTF-8?q?Git=20-=20=F0=9F=92=84=20history=20prov?= =?UTF-8?q?ider=20cleanup=20(#216647)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/git/src/historyProvider.ts | 64 ++++++++++++--------------- 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index 05d2dad7d67f4..0cb0b13b0bec4 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -131,7 +131,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } // Deduplicate refNames - const refNames = new Set(options.historyItemGroupIds); + const refNames = Array.from(new Set(options.historyItemGroupIds)); // Get the merge base of the refNames const refsMergeBase = await this.resolveHistoryItemGroupsMergeBase(refNames); @@ -140,7 +140,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } // Get the commits - const commits = await this.repository.log({ range: `${refsMergeBase}^..`, refNames: Array.from(refNames) }); + const commits = await this.repository.log({ range: `${refsMergeBase}^..`, refNames }); await ensureEmojis(); @@ -245,31 +245,23 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return this.historyItemDecorations.get(uri.toString()); } - private async resolveHistoryItemGroupsMergeBase(refNames: Set): Promise { - let refsMergeBase: string | undefined = undefined; - - for (const refName of refNames) { - if (refsMergeBase === undefined) { - const commit = await this.repository.revParse(refName); - refsMergeBase = commit ?? refName; - continue; - } + private async resolveHistoryItemGroupsMergeBase(refNames: string[]): Promise { + if (refNames.length < 2) { + return undefined; + } - const newMergeBase = await this.repository.getMergeBase(refsMergeBase, refName); - refsMergeBase = newMergeBase ?? refsMergeBase; + let refsMergeBase = refNames[0]; + for (let index = 1; index < refNames.length; index++) { + refsMergeBase = await this.repository.getMergeBase(refsMergeBase, refNames[index]) ?? refsMergeBase; } return refsMergeBase; } - private resolveHistoryItemLabels(commit: Commit, refNames: Set): SourceControlHistoryItemLabel[] { + private resolveHistoryItemLabels(commit: Commit, refNames: string[]): SourceControlHistoryItemLabel[] { const labels: SourceControlHistoryItemLabel[] = []; for (const label of commit.refNames) { - if (label === 'refs/remotes/origin/HEAD' || label === '') { - continue; - } - if (label.startsWith('HEAD -> ')) { labels.push( { @@ -280,23 +272,25 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec continue; } - if (refNames.has(label)) { - if (label.startsWith('refs/tags/')) { - labels.push({ - title: label.substring(10), - icon: new ThemeIcon('tag') - }); - } else if (label.startsWith('refs/remotes/')) { - labels.push({ - title: label.substring(13), - icon: new ThemeIcon('cloud') - }); - } else { - labels.push({ - title: label.substring(11), - icon: new ThemeIcon('git-branch') - }); - } + if (!refNames.includes(label)) { + continue; + } + + if (label.startsWith('refs/tags/')) { + labels.push({ + title: label.substring(10), + icon: new ThemeIcon('tag') + }); + } else if (label.startsWith('refs/remotes/')) { + labels.push({ + title: label.substring(13), + icon: new ThemeIcon('cloud') + }); + } else { + labels.push({ + title: label.substring(11), + icon: new ThemeIcon('git-branch') + }); } } From eb4092a6de58185b4468ec4027592a5f23e7eeef Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:23:05 +0200 Subject: [PATCH 357/755] Git - more cleanup of the history item labels (#216648) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Git - 💄 history provider cleanup * Git - more cleanup of the history item labels --- extensions/git/src/historyProvider.ts | 41 ++++++++++----------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index 0cb0b13b0bec4..9bb627dd2fdc3 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -32,6 +32,12 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } private historyItemDecorations = new Map(); + private historyItemLabels = new Map([ + ['HEAD -> refs/heads/', 'target'], + ['refs/heads/', 'git-branch'], + ['refs/remotes/', 'cloud'], + ['refs/tags/', 'tag'] + ]); private disposables: Disposable[] = []; @@ -262,35 +268,18 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec const labels: SourceControlHistoryItemLabel[] = []; for (const label of commit.refNames) { - if (label.startsWith('HEAD -> ')) { - labels.push( - { - title: label.substring(19), - icon: new ThemeIcon('git-branch') - } - ); + if (!label.startsWith('HEAD -> ') && !refNames.includes(label)) { continue; } - if (!refNames.includes(label)) { - continue; - } - - if (label.startsWith('refs/tags/')) { - labels.push({ - title: label.substring(10), - icon: new ThemeIcon('tag') - }); - } else if (label.startsWith('refs/remotes/')) { - labels.push({ - title: label.substring(13), - icon: new ThemeIcon('cloud') - }); - } else { - labels.push({ - title: label.substring(11), - icon: new ThemeIcon('git-branch') - }); + for (const [key, value] of this.historyItemLabels) { + if (label.startsWith(key)) { + labels.push({ + title: label.substring(key.length), + icon: new ThemeIcon(value) + }); + break; + } } } From d550ede2c348fcb7f9150023225ca63f1d98b80a Mon Sep 17 00:00:00 2001 From: Robo Date: Thu, 20 Jun 2024 11:30:41 +0900 Subject: [PATCH 358/755] chore: update glibc version checker for remote (#215599) --- .../product-build-linux-legacy-server.yml | 30 +++++++++---- .../linux/product-build-linux.yml | 42 ++++++++++++++----- .../linux/verify-glibc-requirements.sh | 12 +++--- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-linux-legacy-server.yml b/build/azure-pipelines/linux/product-build-linux-legacy-server.yml index dc8424f26eea4..921bf2a9370af 100644 --- a/build/azure-pipelines/linux/product-build-linux-legacy-server.yml +++ b/build/azure-pipelines/linux/product-build-linux-legacy-server.yml @@ -133,14 +133,6 @@ steps: VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: vscodehub.azurecr.io/vscode-linux-build-agent:bionic-arm32v7 displayName: Install dependencies - - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}: - - script: | - set -e - EXPECTED_GLIBC_VERSION="2.17" \ - EXPECTED_GLIBCXX_VERSION="3.4.19" \ - ./build/azure-pipelines/linux/verify-glibc-requirements.sh - displayName: Check GLIBC and GLIBCXX dependencies in remote/node_modules - - script: node build/azure-pipelines/distro/mixin-npm displayName: Mixin distro node modules @@ -172,9 +164,11 @@ steps: yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci mv ../vscode-reh-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH) # TODO@joaomoreno ARCHIVE_PATH=".build/linux/server/vscode-server-linux-legacy-$(VSCODE_ARCH).tar.gz" + UNARCHIVE_PATH="`pwd`/../vscode-server-linux-$(VSCODE_ARCH)" mkdir -p $(dirname $ARCHIVE_PATH) tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH) echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH" + echo "##vso[task.setvariable variable=SERVER_UNARCHIVE_PATH]$UNARCHIVE_PATH" env: GITHUB_TOKEN: "$(github-distro-mixin-password)" displayName: Build server @@ -192,6 +186,26 @@ steps: GITHUB_TOKEN: "$(github-distro-mixin-password)" displayName: Build server (web) + - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}: + - script: | + set -e + EXPECTED_GLIBC_VERSION="2.17" \ + EXPECTED_GLIBCXX_VERSION="3.4.19" \ + ./build/azure-pipelines/linux/verify-glibc-requirements.sh + env: + SEARCH_PATH: $(SERVER_UNARCHIVE_PATH) + displayName: Check GLIBC and GLIBCXX dependencies in server archive + + - ${{ else }}: + - script: | + set -e + EXPECTED_GLIBC_VERSION="2.28" \ + EXPECTED_GLIBCXX_VERSION="3.4.22" \ + ./build/azure-pipelines/linux/verify-glibc-requirements.sh + env: + SEARCH_PATH: $(SERVER_UNARCHIVE_PATH) + displayName: Check GLIBC and GLIBCXX dependencies in server archive + - ${{ if eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true) }}: - template: product-build-linux-test.yml parameters: diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 352b31360f839..d1d6bdb9191b9 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -131,16 +131,6 @@ steps: displayName: Install dependencies condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true')) - - script: | - set -e - - EXPECTED_GLIBC_VERSION="2.28" \ - EXPECTED_GLIBCXX_VERSION="3.4.25" \ - ./build/azure-pipelines/linux/verify-glibc-requirements.sh - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true')) - displayName: Check GLIBC and GLIBCXX dependencies in remote/node_modules - - - ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}: - script: node build/azure-pipelines/distro/mixin-npm condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true')) @@ -213,9 +203,11 @@ steps: yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci mv ../vscode-reh-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH) # TODO@joaomoreno ARCHIVE_PATH=".build/linux/server/vscode-server-linux-$(VSCODE_ARCH).tar.gz" + UNARCHIVE_PATH="`pwd`/../vscode-server-linux-$(VSCODE_ARCH)" mkdir -p $(dirname $ARCHIVE_PATH) tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH) echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH" + echo "##vso[task.setvariable variable=SERVER_UNARCHIVE_PATH]$UNARCHIVE_PATH" env: GITHUB_TOKEN: "$(github-distro-mixin-password)" displayName: Build server @@ -232,6 +224,36 @@ steps: GITHUB_TOKEN: "$(github-distro-mixin-password)" displayName: Build server (web) + - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}: + - script: | + set -e + + source ./build/azure-pipelines/linux/setup-env.sh + + EXPECTED_GLIBC_VERSION="2.28" \ + EXPECTED_GLIBCXX_VERSION="3.4.25" \ + ./build/azure-pipelines/linux/verify-glibc-requirements.sh + env: + SEARCH_PATH: $(SERVER_UNARCHIVE_PATH) + npm_config_arch: $(NPM_ARCH) + VSCODE_ARCH: $(VSCODE_ARCH) + displayName: Check GLIBC and GLIBCXX dependencies in server archive + + - ${{ else }}: + - script: | + set -e + + source ./build/azure-pipelines/linux/setup-env.sh + + EXPECTED_GLIBC_VERSION="2.28" \ + EXPECTED_GLIBCXX_VERSION="3.4.26" \ + ./build/azure-pipelines/linux/verify-glibc-requirements.sh + env: + SEARCH_PATH: $(SERVER_UNARCHIVE_PATH) + npm_config_arch: $(NPM_ARCH) + VSCODE_ARCH: $(VSCODE_ARCH) + displayName: Check GLIBC and GLIBCXX dependencies in server archive + - ${{ else }}: - script: yarn gulp "transpile-client-swc" "transpile-extensions" env: diff --git a/build/azure-pipelines/linux/verify-glibc-requirements.sh b/build/azure-pipelines/linux/verify-glibc-requirements.sh index f07c0ba71b0e4..19482c242ea14 100755 --- a/build/azure-pipelines/linux/verify-glibc-requirements.sh +++ b/build/azure-pipelines/linux/verify-glibc-requirements.sh @@ -9,8 +9,8 @@ elif [ "$VSCODE_ARCH" == "armhf" ]; then TRIPLE="arm-rpi-linux-gnueabihf" fi -# Get all files with .node extension from remote/node_modules folder -files=$(find remote/node_modules -name "*.node" -not -path "*prebuilds*") +# Get all files with .node extension from server folder +files=$(find $SEARCH_PATH -name "*.node" -not -path "*prebuilds*" -o -type f -executable -name "node") echo "Verifying requirements for files: $files" @@ -19,13 +19,13 @@ for file in $files; do glibcxx_version="$EXPECTED_GLIBCXX_VERSION" while IFS= read -r line; do if [[ $line == *"GLIBC_"* ]]; then - version=$(echo "$line" | awk '{print $5}' | tr -d '()') + version=$(echo "$line" | awk '{if ($5 ~ /^[0-9a-fA-F]+$/) print $6; else print $5}' | tr -d '()') version=${version#*_} if [[ $(printf "%s\n%s" "$version" "$glibc_version" | sort -V | tail -n1) == "$version" ]]; then glibc_version=$version fi elif [[ $line == *"GLIBCXX_"* ]]; then - version=$(echo "$line" | awk '{print $5}' | tr -d '()') + version=$(echo "$line" | awk '{if ($5 ~ /^[0-9a-fA-F]+$/) print $6; else print $5}' | tr -d '()') version=${version#*_} if [[ $(printf "%s\n%s" "$version" "$glibcxx_version" | sort -V | tail -n1) == "$version" ]]; then glibcxx_version=$version @@ -34,11 +34,11 @@ for file in $files; do done < <("$PWD/.build/sysroots/$TRIPLE/$TRIPLE/bin/objdump" -T "$file") if [[ "$glibc_version" != "$EXPECTED_GLIBC_VERSION" ]]; then - echo "Error: File $file has dependency on GLIBC > $EXPECTED_GLIBC_VERSION" + echo "Error: File $file has dependency on GLIBC > $EXPECTED_GLIBC_VERSION, found $glibc_version" exit 1 fi if [[ "$glibcxx_version" != "$EXPECTED_GLIBCXX_VERSION" ]]; then - echo "Error: File $file has dependency on GLIBCXX > $EXPECTED_GLIBCXX_VERSION" + echo "Error: File $file has dependency on GLIBCXX > $EXPECTED_GLIBCXX_VERSION, found $glibcxx_version" exit 1 fi done From 6afc1c279374106ca4c60382c0d92ed661f4c7e4 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 19 Jun 2024 21:24:19 -0700 Subject: [PATCH 359/755] Finalize chat participant "when" (#216670) Fix #214379 --- .../contrib/chat/browser/chatParticipantContributions.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts b/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts index 43eb5d2be7bbe..80475055ca86d 100644 --- a/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts @@ -63,6 +63,10 @@ const chatParticipantExtensionPoint = extensionsRegistry.ExtensionsRegistry.regi description: localize('chatSampleRequest', "When the user clicks this participant in `/help`, this text will be submitted to the participant."), type: 'string' }, + when: { + description: localize('chatParticipantWhen', "A condition which must be true to enable this participant."), + type: 'string' + }, commands: { markdownDescription: localize('chatCommandsDescription', "Commands available for this chat participant, which the user can invoke with a `/`."), type: 'array', @@ -223,11 +227,6 @@ export class ChatExtensionPointHandler implements IWorkbenchContribution { store.add(this.registerDefaultParticipantView(providerDescriptor)); } - if (providerDescriptor.when && !isProposedApiEnabled(extension.description, 'chatParticipantAdditions')) { - this.logService.error(`Extension '${extension.description.identifier.value}' CANNOT use API proposal: chatParticipantAdditions.`); - continue; - } - store.add(this._chatAgentService.registerAgent( providerDescriptor.id, { From 4b19907cc8c2ce184326642f30ac606c3ebd2cb0 Mon Sep 17 00:00:00 2001 From: Robo Date: Thu, 20 Jun 2024 14:02:04 +0900 Subject: [PATCH 360/755] fix[x11]: crash in gpu process with software compositor (#216661) * fix[x11]: crash in gpu process with software compositor * chore: bump distro --- .yarnrc | 2 +- package.json | 2 +- resources/linux/snap/electron-launch | 2 +- resources/linux/snap/snapcraft.yaml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.yarnrc b/.yarnrc index b40fb7e7f58ab..b153fa4724f45 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,5 +1,5 @@ disturl "https://electronjs.org/headers" target "29.4.0" -ms_build_id "9593362" +ms_build_id "9728852" runtime "electron" build_from_source "true" diff --git a/package.json b/package.json index b1bf5df02765d..73ae52dd69abe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "170beceb9849568b8f7159757bc3fc3964af1986", + "distro": "361fc45f5932b161db29080d5b19bc5afb9baae6", "author": { "name": "Microsoft Corporation" }, diff --git a/resources/linux/snap/electron-launch b/resources/linux/snap/electron-launch index bd228cb9d222b..873b079161a45 100755 --- a/resources/linux/snap/electron-launch +++ b/resources/linux/snap/electron-launch @@ -261,4 +261,4 @@ fi wait_for_async_execs -exec "$@" "--no-sandbox" +exec "$@" diff --git a/resources/linux/snap/snapcraft.yaml b/resources/linux/snap/snapcraft.yaml index 7fd44021d5095..1d7412bdc71ff 100644 --- a/resources/linux/snap/snapcraft.yaml +++ b/resources/linux/snap/snapcraft.yaml @@ -77,8 +77,8 @@ parts: apps: @@NAME@@: - command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ + command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --no-sandbox common-id: @@NAME@@.desktop url-handler: - command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --open-url + command: electron-launch $SNAP/usr/share/@@NAME@@/bin/@@NAME@@ --open-url --no-sandbox From c8f444771069981fd069b83a884bef95dfc44a4d Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Wed, 19 Jun 2024 22:02:22 -0700 Subject: [PATCH 361/755] Don't use an emitter so ExtensionSecrets doesn't have to be disposable (#216672) ref https://github.com/microsoft/vscode/issues/214234 --- src/vs/workbench/api/common/extHostSecrets.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/api/common/extHostSecrets.ts b/src/vs/workbench/api/common/extHostSecrets.ts index d1af02ed1a233..4b1e284b60422 100644 --- a/src/vs/workbench/api/common/extHostSecrets.ts +++ b/src/vs/workbench/api/common/extHostSecrets.ts @@ -9,26 +9,23 @@ import type * as vscode from 'vscode'; import { ExtHostSecretState } from 'vs/workbench/api/common/extHostSecretState'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Event } from 'vs/base/common/event'; export class ExtensionSecrets implements vscode.SecretStorage { protected readonly _id: string; readonly #secretState: ExtHostSecretState; - private _onDidChange = new Emitter(); - readonly onDidChange: Event = this._onDidChange.event; - + readonly onDidChange: Event; constructor(extensionDescription: IExtensionDescription, secretState: ExtHostSecretState) { this._id = ExtensionIdentifier.toKey(extensionDescription.identifier); this.#secretState = secretState; - this.#secretState.onDidChangePassword(e => { - if (e.extensionId === this._id) { - this._onDidChange.fire({ key: e.key }); - } - }); + this.onDidChange = Event.map( + Event.filter(this.#secretState.onDidChangePassword, e => e.extensionId === this._id), + e => ({ key: e.key }) + ); } get(key: string): Promise { From a3017010e9846f36d4e2da88c5e782290ca77399 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Wed, 19 Jun 2024 23:41:51 -0700 Subject: [PATCH 362/755] Remove check for validity (#216675) --- .github/workflows/on-open.yml | 5 ----- .github/workflows/on-reopen.yml | 22 ---------------------- 2 files changed, 27 deletions(-) delete mode 100644 .github/workflows/on-reopen.yml diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index 679c1c65db87c..361ac11b94667 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -16,11 +16,6 @@ jobs: - name: Install Actions run: npm install --production --prefix ./actions - - name: Check for Validity - uses: ./actions/validity-checker - with: - token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - - name: Run CopyCat (VSCodeTriageBot/testissues) uses: ./actions/copycat with: diff --git a/.github/workflows/on-reopen.yml b/.github/workflows/on-reopen.yml deleted file mode 100644 index d29de326c53a3..0000000000000 --- a/.github/workflows/on-reopen.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: On Reopen -on: - issues: - types: [reopened] - -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "microsoft/vscode-github-triage-actions" - ref: stable - path: ./actions - - name: Install Actions - run: npm install --production --prefix ./actions - - - name: Check for Validity - uses: ./actions/validity-checker - with: - token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} From 13d82c160e382523f13e43177071cc09f8566c3a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 20 Jun 2024 09:28:27 +0200 Subject: [PATCH 363/755] Status bar: make neighbour items look good when there are multiple (fix #216637) (#216678) --- .../parts/statusbar/media/statusbarpart.css | 5 ++++ .../browser/parts/statusbar/statusbarPart.ts | 27 ++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css index d6897bf02d7c0..b30d2bee088aa 100644 --- a/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css +++ b/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css @@ -88,6 +88,11 @@ margin-left: 3px; } +.monaco-workbench .part.statusbar > .items-container > .statusbar-item.compact-left.compact-right > .statusbar-item-label { + margin-right:0; + margin-left: 0; +} + .monaco-workbench .part.statusbar > .items-container > .statusbar-item.left.first-visible-item { padding-left: 7px; /* Add padding to the most left status bar item */ } diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index f938ea7b3535e..bac67111eae1b 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -433,7 +433,7 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer { } // Figure out groups of entries with `compact` alignment - const compactEntryGroups = new Map>(); + const compactEntryGroups = new Map>(); for (const entry of mapIdToVisibleEntry.values()) { if ( isStatusbarEntryLocation(entry.priority.primary) && // entry references another entry as location @@ -448,11 +448,25 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer { // Build a map of entries that are compact among each other let compactEntryGroup = compactEntryGroups.get(locationId); if (!compactEntryGroup) { - compactEntryGroup = new Set([entry, location]); - compactEntryGroups.set(locationId, compactEntryGroup); - } else { - compactEntryGroup.add(entry); + + // It is possible that this entry references another entry + // that itself references an entry. In that case, we want + // to add it to the entries of the referenced entry. + + for (const group of compactEntryGroups.values()) { + if (group.has(locationId)) { + compactEntryGroup = group; + break; + } + } + + if (!compactEntryGroup) { + compactEntryGroup = new Map(); + compactEntryGroups.set(locationId, compactEntryGroup); + } } + compactEntryGroup.set(entry.id, entry); + compactEntryGroup.set(location.id, location); // Adjust CSS classes to move compact items closer together if (entry.priority.primary.alignment === StatusbarAlignment.LEFT) { @@ -465,7 +479,6 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer { } } - // Install mouse listeners to update hover feedback for // all compact entries that belong to each other const statusBarItemHoverBackground = this.getColor(STATUS_BAR_ITEM_HOVER_BACKGROUND); @@ -473,7 +486,7 @@ class StatusbarPart extends Part implements IStatusbarEntryContainer { this.compactEntriesDisposable.value = new DisposableStore(); if (statusBarItemHoverBackground && statusBarItemCompactHoverBackground && !isHighContrast(this.theme.type)) { for (const [, compactEntryGroup] of compactEntryGroups) { - for (const compactEntry of compactEntryGroup) { + for (const compactEntry of compactEntryGroup.values()) { if (!compactEntry.hasCommand) { continue; // only show hover feedback when we have a command } From 416476a0b1a25c0f615688fbd9fe99ae54a97676 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:48:33 +0200 Subject: [PATCH 364/755] SCM - maintain colors in history section (#216680) --- .../contrib/scm/browser/scmHistory.ts | 17 +++++++++++++++-- .../contrib/scm/browser/scmViewPane.ts | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmHistory.ts b/src/vs/workbench/contrib/scm/browser/scmHistory.ts index 4fe5689e8347c..28bc3861c8d2e 100644 --- a/src/vs/workbench/contrib/scm/browser/scmHistory.ts +++ b/src/vs/workbench/contrib/scm/browser/scmHistory.ts @@ -14,6 +14,10 @@ const SWIMLANE_CURVE_RADIUS = 5; const graphColors = ['#007ACC', '#BC3FBC', '#BF8803', '#CC6633', '#F14C4C', '#16825D']; +function getNextColorIndex(colorIndex: number): number { + return colorIndex < graphColors.length - 1 ? colorIndex + 1 : 1; +} + function createPath(stroke: string): SVGPathElement { const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute('fill', 'none'); @@ -186,7 +190,7 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV return svg; } -export function toISCMHistoryItemViewModelArray(historyItems: ISCMHistoryItem[]): ISCMHistoryItemViewModel[] { +export function toISCMHistoryItemViewModelArray(historyItems: ISCMHistoryItem[], colorMap = new Map()): ISCMHistoryItemViewModel[] { let colorIndex = -1; const viewModels: ISCMHistoryItemViewModel[] = []; @@ -219,7 +223,16 @@ export function toISCMHistoryItemViewModelArray(historyItems: ISCMHistoryItem[]) // Add unprocessed parent(s) to the output for (let i = firstParentAdded ? 1 : 0; i < historyItem.parentIds.length; i++) { - colorIndex = colorIndex < graphColors.length - 1 ? colorIndex + 1 : 1; + // Get color index based on the label + let labelColorIndex: number | undefined = undefined; + for (const label of historyItem.labels ?? []) { + labelColorIndex = colorMap.get(label.title); + if (labelColorIndex !== undefined) { + break; + } + } + + colorIndex = labelColorIndex ?? getNextColorIndex(colorIndex); outputSwimlanes.push({ id: historyItem.parentIds[i], color: colorIndex diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 13e3a6a8652d7..4be29180a9f79 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -4000,10 +4000,22 @@ class SCMTreeDataSource implements IAsyncDataSource ({ + // Create the color map + // TODO@lszomoru - use theme colors + const colorMap = new Map([ + [currentHistoryItemGroup.name, 0] + ]); + if (currentHistoryItemGroup.remote) { + colorMap.set(currentHistoryItemGroup.remote.name, 1); + } + if (currentHistoryItemGroup.base) { + colorMap.set(currentHistoryItemGroup.base.name, 2); + } + + return toISCMHistoryItemViewModelArray(historyItemsElement, colorMap) + .map(historyItemViewModel => ({ repository: element, - historyItemViewModel: v, + historyItemViewModel, type: 'historyItem2' }) satisfies SCMHistoryItemViewModelTreeElement); } From 4bd8cce18050f0b1ae9ff83e222046380cc1593a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2024 09:48:58 +0200 Subject: [PATCH 365/755] enable `inlineChat.experimental.textButtons` for the team (#216679) --- .vscode/settings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index 5d5d1f27589fc..ef93d2deda155 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -170,5 +170,6 @@ }, "css.format.spaceAroundSelectorSeparator": true, "inlineChat.mode": "live", + "inlineChat.experimental.textButtons": true, "typescript.enablePromptUseWorkspaceTsdk": true } From b41c889fec65a9c8e6d7896246c466dc6de8c851 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Thu, 20 Jun 2024 10:45:32 +0200 Subject: [PATCH 366/755] Increase the length of the drop-down shadow of sticky scroll (#216686) increasing the length of the sticky scroll drop down shadow --- src/vs/editor/contrib/stickyScroll/browser/stickyScroll.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/stickyScroll/browser/stickyScroll.css b/src/vs/editor/contrib/stickyScroll/browser/stickyScroll.css index 3bc52c6c9157f..276082256f6ef 100644 --- a/src/vs/editor/contrib/stickyScroll/browser/stickyScroll.css +++ b/src/vs/editor/contrib/stickyScroll/browser/stickyScroll.css @@ -61,7 +61,7 @@ .monaco-editor .sticky-widget { width: 100%; - box-shadow: var(--vscode-editorStickyScroll-shadow) 0 3px 2px -2px; + box-shadow: var(--vscode-editorStickyScroll-shadow) 0 4px 2px -2px; z-index: 4; background-color: var(--vscode-editorStickyScroll-background); right: initial !important; From d58a511a8933a529f42a57b800454e7a1f7344fd Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2024 11:07:07 +0200 Subject: [PATCH 367/755] fix #216687 (#216688) --- .../extensions/browser/extensionEditor.ts | 2 +- .../browser/extensions.contribution.ts | 44 ++++++++++++++- .../extensions/browser/extensionsActions.ts | 56 +++++++++++++------ 3 files changed, 81 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index a440979efdc36..5eacf022177dc 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -353,7 +353,7 @@ export class ExtensionEditor extends EditorPane { [ this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, false), this.instantiationService.createInstance(UninstallAction), - this.instantiationService.createInstance(InstallAnotherVersionAction), + this.instantiationService.createInstance(InstallAnotherVersionAction, null, true), ] ]), this.instantiationService.createInstance(TogglePreReleaseExtensionAction), diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 0ff4dca2f7189..df292067b7145 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -14,7 +14,7 @@ import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsServi import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg } from 'vs/workbench/contrib/extensions/common/extensions'; -import { ReinstallAction, InstallSpecificVersionOfExtensionAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, PromptExtensionInstallFailureAction, SearchExtensionsAction, SetColorThemeAction, SetFileIconThemeAction, SetProductIconThemeAction, ClearLanguageAction, ToggleAutoUpdateForExtensionAction, ToggleAutoUpdatesForPublisherAction, TogglePreReleaseExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { ReinstallAction, InstallSpecificVersionOfExtensionAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, PromptExtensionInstallFailureAction, SearchExtensionsAction, SetColorThemeAction, SetFileIconThemeAction, SetProductIconThemeAction, ClearLanguageAction, ToggleAutoUpdateForExtensionAction, ToggleAutoUpdatesForPublisherAction, TogglePreReleaseExtensionAction, InstallAnotherVersionAction, InstallAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor'; import { StatusUpdater, MaliciousExtensionChecker, ExtensionsViewletViewsContribution, ExtensionsViewPaneContainer, BuiltInExtensionsContext, SearchMarketplaceExtensionsContext, RecommendedExtensionsContext, DefaultViewsContext, ExtensionsSortByContext, SearchHasTextContext } from 'vs/workbench/contrib/extensions/browser/extensionsViewlet'; @@ -1467,6 +1467,46 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi } }); + this.registerExtensionAction({ + id: 'workbench.extensions.action.installAndDonotSync', + title: localize('install installAndDonotSync', "Install (Do not Sync)"), + menu: { + id: MenuId.ExtensionContext, + group: '0_install', + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), CONTEXT_SYNC_ENABLEMENT) + }, + run: async (accessor: ServicesAccessor, extensionId: string) => { + const instantiationService = accessor.get(IInstantiationService); + const extension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, { id: extensionId }))[0] + || (await this.extensionsWorkbenchService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; + if (extension) { + const action = instantiationService.createInstance(InstallAction, { + isMachineScoped: true, + }); + action.extension = extension; + return action.run(); + } + } + }); + + this.registerExtensionAction({ + id: InstallAnotherVersionAction.ID, + title: InstallAnotherVersionAction.LABEL, + menu: { + id: MenuId.ExtensionContext, + group: '0_install', + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension')) + }, + run: async (accessor: ServicesAccessor, extensionId: string) => { + const instantiationService = accessor.get(IInstantiationService); + const extension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, { id: extensionId }))[0] + || (await this.extensionsWorkbenchService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; + if (extension) { + return instantiationService.createInstance(InstallAnotherVersionAction, extension, false).run(); + } + } + }); + this.registerExtensionAction({ id: 'workbench.extensions.action.copyExtension', title: localize2('workbench.extensions.action.copyExtension', 'Copy'), @@ -1550,7 +1590,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi menu: { id: MenuId.ExtensionContext, group: '2_configure', - when: ContextKeyExpr.and(CONTEXT_SYNC_ENABLEMENT, ContextKeyExpr.equals('isWorkspaceScopedExtension', false)), + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'installed'), CONTEXT_SYNC_ENABLEMENT, ContextKeyExpr.equals('isWorkspaceScopedExtension', false)), order: 4 }, run: async (accessor: ServicesAccessor, id: string) => { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 975ebf2c9a681..82d4c36ba9087 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -15,7 +15,7 @@ import { disposeIfDisposable } from 'vs/base/common/lifecycle'; import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewPaneContainer, IExtensionContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, UPDATE_ACTIONS_GROUP, AutoUpdateConfigurationKey, AutoUpdateConfigurationValue, ExtensionEditorTab, ExtensionRuntimeActionType, IExtensionArg } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate'; import { IGalleryExtension, IExtensionGalleryService, ILocalExtension, InstallOptions, InstallOperation, TargetPlatformToString, ExtensionManagementErrorCode } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionRecommendationReason, IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { areSameExtensions, getExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, ExtensionIdentifier, IExtensionDescription, IExtensionManifest, isLanguagePackExtension, getWorkspaceSupportTypeMessage, TargetPlatform, isApplicationScopedExtension } from 'vs/platform/extensions/common/extensions'; @@ -392,7 +392,7 @@ export class InstallAction extends ExtensionAction { ) { super('extensions.install', localize('install', "Install"), InstallAction.CLASS, false); this.hideOnDisabled = false; - this.options = { ...options, isMachineScoped: false }; + this.options = { isMachineScoped: false, ...options }; this.update(); this._register(this.labelService.onDidChangeFormatters(() => this.updateLabel(), this)); } @@ -1140,6 +1140,7 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['isDefaultApplicationScopedExtension', extension.local && isApplicationScopedExtension(extension.local.manifest)]); cksOverlay.push(['isApplicationScopedExtension', extension.local && extension.local.isApplicationScoped]); cksOverlay.push(['isWorkspaceScopedExtension', extension.isWorkspaceScoped]); + cksOverlay.push(['isGalleryExtension', !!extension.gallery]); if (extension.local) { cksOverlay.push(['extensionSource', extension.local.source]); } @@ -1149,8 +1150,19 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['isExtensionRecommended', !!extensionRecommendationsService.getAllRecommendationsWithReason()[extension.identifier.id.toLowerCase()]]); cksOverlay.push(['isExtensionWorkspaceRecommended', extensionRecommendationsService.getAllRecommendationsWithReason()[extension.identifier.id.toLowerCase()]?.reasonId === ExtensionRecommendationReason.Workspace]); cksOverlay.push(['isUserIgnoredRecommendation', extensionIgnoredRecommendationsService.globalIgnoredRecommendations.some(e => e === extension.identifier.id.toLowerCase())]); - if (extension.state === ExtensionState.Installed) { - cksOverlay.push(['extensionStatus', 'installed']); + switch (extension.state) { + case ExtensionState.Installing: + cksOverlay.push(['extensionStatus', 'installing']); + break; + case ExtensionState.Installed: + cksOverlay.push(['extensionStatus', 'installed']); + break; + case ExtensionState.Uninstalling: + cksOverlay.push(['extensionStatus', 'uninstalling']); + break; + case ExtensionState.Uninstalled: + cksOverlay.push(['extensionStatus', 'uninstalled']); + break; } cksOverlay.push(['installedExtensionIsPreReleaseVersion', !!extension.local?.isPreReleaseVersion]); cksOverlay.push(['installedExtensionIsOptedToPreRelease', !!extension.local?.preRelease]); @@ -1246,7 +1258,7 @@ export class ManageExtensionAction extends DropDownExtensionAction { } groups.push([ ...(installActions.length ? installActions : []), - this.instantiationService.createInstance(InstallAnotherVersionAction), + this.instantiationService.createInstance(InstallAnotherVersionAction, this.extension, false), this.instantiationService.createInstance(UninstallAction), ]); @@ -1407,26 +1419,36 @@ export class InstallAnotherVersionAction extends ExtensionAction { static readonly LABEL = localize('install another version', "Install Another Version..."); constructor( + extension: IExtension | null, + private readonly whenInstalled: boolean, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, + @IWorkbenchExtensionManagementService private readonly extensionManagementService: IWorkbenchExtensionManagementService, @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IQuickInputService private readonly quickInputService: IQuickInputService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IDialogService private readonly dialogService: IDialogService, ) { super(InstallAnotherVersionAction.ID, InstallAnotherVersionAction.LABEL, ExtensionAction.LABEL_ACTION_CLASS); + this.extension = extension; this.update(); } update(): void { - this.enabled = !!this.extension && !this.extension.isBuiltin && !!this.extension.gallery && !!this.extension.local && !!this.extension.server && this.extension.state === ExtensionState.Installed && !this.extension.deprecationInfo; + this.enabled = !!this.extension && !this.extension.isBuiltin && !!this.extension.gallery && !this.extension.deprecationInfo; + if (this.enabled && this.whenInstalled) { + this.enabled = !!this.extension?.local && !!this.extension.server && this.extension.state === ExtensionState.Installed; + } } override async run(): Promise { if (!this.enabled) { return; } - const targetPlatform = await this.extension!.server!.extensionManagementService.getTargetPlatform(); - const allVersions = await this.extensionGalleryService.getAllCompatibleVersions(this.extension!.gallery!, this.extension!.local!.preRelease, targetPlatform); + if (!this.extension?.gallery) { + return; + } + const targetPlatform = this.extension.server ? await this.extension.server.extensionManagementService.getTargetPlatform() : await this.extensionManagementService.getTargetPlatform(); + const allVersions = await this.extensionGalleryService.getAllCompatibleVersions(this.extension.gallery, this.extension.local?.preRelease ?? this.extension.gallery.properties.isPreReleaseVersion, targetPlatform); if (!allVersions.length) { await this.dialogService.info(localize('no versions', "This extension has no other versions.")); return; @@ -1436,7 +1458,7 @@ export class InstallAnotherVersionAction extends ExtensionAction { return { id: v.version, label: v.version, - description: `${fromNow(new Date(Date.parse(v.date)), true)}${v.isPreReleaseVersion ? ` (${localize('pre-release', "pre-release")})` : ''}${v.version === this.extension!.version ? ` (${localize('current', "current")})` : ''}`, + description: `${fromNow(new Date(Date.parse(v.date)), true)}${v.isPreReleaseVersion ? ` (${localize('pre-release', "pre-release")})` : ''}${v.version === this.extension?.local?.manifest.version ? ` (${localize('current', "current")})` : ''}`, latest: i === 0, ariaLabel: `${v.isPreReleaseVersion ? 'Pre-Release version' : 'Release version'} ${v.version}`, isPreReleaseVersion: v.isPreReleaseVersion @@ -1448,18 +1470,18 @@ export class InstallAnotherVersionAction extends ExtensionAction { matchOnDetail: true }); if (pick) { - if (this.extension!.version === pick.id) { + if (this.extension.local?.manifest.version === pick.id) { return; } try { if (pick.latest) { - const [extension] = pick.id !== this.extension?.version ? await this.extensionsWorkbenchService.getExtensions([{ id: this.extension!.identifier.id, preRelease: pick.isPreReleaseVersion }], CancellationToken.None) : [this.extension]; - await this.extensionsWorkbenchService.install(extension ?? this.extension!, { installPreReleaseVersion: pick.isPreReleaseVersion }); + const [extension] = pick.id !== this.extension.version ? await this.extensionsWorkbenchService.getExtensions([{ id: this.extension.identifier.id, preRelease: pick.isPreReleaseVersion }], CancellationToken.None) : [this.extension]; + await this.extensionsWorkbenchService.install(extension ?? this.extension, { installPreReleaseVersion: pick.isPreReleaseVersion }); } else { - await this.extensionsWorkbenchService.install(this.extension!, { installPreReleaseVersion: pick.isPreReleaseVersion, version: pick.id }); + await this.extensionsWorkbenchService.install(this.extension, { installPreReleaseVersion: pick.isPreReleaseVersion, version: pick.id }); } } catch (error) { - this.instantiationService.createInstance(PromptExtensionInstallFailureAction, this.extension!, pick.latest ? this.extension!.latestVersion : pick.id, InstallOperation.Install, error).run(); + this.instantiationService.createInstance(PromptExtensionInstallFailureAction, this.extension, pick.latest ? this.extension.latestVersion : pick.id, InstallOperation.Install, error).run(); } } return null; @@ -2779,16 +2801,14 @@ export class InstallSpecificVersionOfExtensionAction extends Action { override async run(): Promise { const extensionPick = await this.quickInputService.pick(this.getExtensionEntries(), { placeHolder: localize('selectExtension', "Select Extension"), matchOnDetail: true }); if (extensionPick && extensionPick.extension) { - const action = this.instantiationService.createInstance(InstallAnotherVersionAction); - action.extension = extensionPick.extension; + const action = this.instantiationService.createInstance(InstallAnotherVersionAction, extensionPick.extension, true); await action.run(); await this.instantiationService.createInstance(SearchExtensionsAction, extensionPick.extension.identifier.id).run(); } } private isEnabled(extension: IExtension): boolean { - const action = this.instantiationService.createInstance(InstallAnotherVersionAction); - action.extension = extension; + const action = this.instantiationService.createInstance(InstallAnotherVersionAction, extension, true); return action.enabled && !!extension.local && this.extensionEnablementService.isEnabled(extension.local); } From 8ca1b8c195bcef349aa0ab8ca6fb440cd82933ff Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Thu, 20 Jun 2024 11:14:06 +0200 Subject: [PATCH 368/755] Keepins same indentation if increaseIndentPattern is satisifed on line `n` and increaseNextLinePattern is satisfied on line `n-1` (#216500) * adding code * polishing the code --- src/vs/editor/common/cursor/cursor.ts | 4 +- .../common/cursor/cursorTypeEditOperations.ts | 136 ++++++++++++------ src/vs/editor/common/languages/autoIndent.ts | 27 +++- .../test/browser/indentation.test.ts | 35 ++++- .../modes/supports/autoClosingPairsRules.ts | 12 +- 5 files changed, 169 insertions(+), 45 deletions(-) diff --git a/src/vs/editor/common/cursor/cursor.ts b/src/vs/editor/common/cursor/cursor.ts index 27491a38a6a36..f84b5135d13d1 100644 --- a/src/vs/editor/common/cursor/cursor.ts +++ b/src/vs/editor/common/cursor/cursor.ts @@ -11,6 +11,7 @@ import { CursorContext } from 'vs/editor/common/cursor/cursorContext'; import { DeleteOperations } from 'vs/editor/common/cursor/cursorDeleteOperations'; import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; import { CompositionOutcome, TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; +import { BaseTypeWithAutoClosingCommand } from 'vs/editor/common/cursor/cursorTypeEditOperations'; import { Position } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { ISelection, Selection, SelectionDirection } from 'vs/editor/common/core/selection'; @@ -21,7 +22,6 @@ import { VerticalRevealType, ViewCursorStateChangedEvent, ViewRevealRangeRequest import { dispose, Disposable } from 'vs/base/common/lifecycle'; import { ICoordinatesConverter } from 'vs/editor/common/viewModel'; import { CursorStateChangedEvent, ViewModelEventsCollector } from 'vs/editor/common/viewModelEventDispatcher'; -import { TypeWithAutoClosingCommand } from 'vs/editor/common/cursor/cursorTypeEditOperations'; export class CursorsController extends Disposable { @@ -368,7 +368,7 @@ export class CursorsController extends Disposable { for (let i = 0; i < opResult.commands.length; i++) { const command = opResult.commands[i]; - if (command instanceof TypeWithAutoClosingCommand && command.enclosingRange && command.closeCharacterRange) { + if (command instanceof BaseTypeWithAutoClosingCommand && command.enclosingRange && command.closeCharacterRange) { autoClosedCharactersRanges.push(command.closeCharacterRange); autoClosedEnclosingRanges.push(command.enclosingRange); } diff --git a/src/vs/editor/common/cursor/cursorTypeEditOperations.ts b/src/vs/editor/common/cursor/cursorTypeEditOperations.ts index ec8f484f39590..df17d2f3918cd 100644 --- a/src/vs/editor/common/cursor/cursorTypeEditOperations.ts +++ b/src/vs/editor/common/cursor/cursorTypeEditOperations.ts @@ -14,7 +14,7 @@ import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/co import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { Position } from 'vs/editor/common/core/position'; -import { ICommand, ICursorStateComputerData } from 'vs/editor/common/editorCommon'; +import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import { EnterAction, IndentAction, StandardAutoClosingPairConditional } from 'vs/editor/common/languages/languageConfiguration'; import { getIndentationAtPosition } from 'vs/editor/common/languages/languageConfigurationRegistry'; @@ -28,21 +28,17 @@ export class AutoIndentOperation { public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, isDoingComposition: boolean): EditOperationResult | undefined { if (!isDoingComposition && this._isAutoIndentType(config, model, selections)) { - const commands: Array = []; - let autoIndentFails = false; - for (let i = 0, len = selections.length; i < len; i++) { - commands[i] = this._runAutoIndentType(config, model, selections[i], ch); - if (!commands[i]) { - autoIndentFails = true; - break; + const indentationForSelections: { selection: Selection; indentation: string }[] = []; + for (const selection of selections) { + const indentation = this._findActualIndentationForSelection(config, model, selection, ch); + if (indentation === null) { + // Auto indentation failed + return; } + indentationForSelections.push({ selection, indentation }); } - if (!autoIndentFails) { - return new EditOperationResult(EditOperationType.TypingOther, commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false, - }); - } + const autoClosingPairClose = AutoClosingOpenCharTypeOperation.getAutoClosingPairClose(config, model, selections, ch, false); + return this._getIndentationAndAutoClosingPairEdits(config, model, indentationForSelections, ch, autoClosingPairClose); } return; } @@ -59,9 +55,8 @@ export class AutoIndentOperation { return true; } - private static _runAutoIndentType(config: CursorConfiguration, model: ITextModel, range: Range, ch: string): ICommand | null { - const currentIndentation = getIndentationAtPosition(model, range.startLineNumber, range.startColumn); - const actualIndentation = getIndentActionForType(config.autoIndent, model, range, ch, { + private static _findActualIndentationForSelection(config: CursorConfiguration, model: ITextModel, selection: Selection, ch: string): string | null { + const actualIndentation = getIndentActionForType(config, model, selection, ch, { shiftIndent: (indentation) => { return shiftIndent(config, indentation); }, @@ -74,24 +69,40 @@ export class AutoIndentOperation { return null; } - if (actualIndentation !== config.normalizeIndentation(currentIndentation)) { - const firstNonWhitespace = model.getLineFirstNonWhitespaceColumn(range.startLineNumber); - if (firstNonWhitespace === 0) { - return typeCommand( - new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn), - config.normalizeIndentation(actualIndentation) + ch, - false - ); + const currentIndentation = getIndentationAtPosition(model, selection.startLineNumber, selection.startColumn); + if (actualIndentation === config.normalizeIndentation(currentIndentation)) { + return null; + } + return actualIndentation; + } + + private static _getIndentationAndAutoClosingPairEdits(config: CursorConfiguration, model: ITextModel, indentationForSelections: { selection: Selection; indentation: string }[], ch: string, autoClosingPairClose: string | null): EditOperationResult { + const commands: ICommand[] = indentationForSelections.map(({ selection, indentation }) => { + if (autoClosingPairClose !== null) { + // Apply both auto closing pair edits and auto indentation edits + const indentationEdit = this._getEditFromIndentationAndSelection(config, model, indentation, selection, ch, false); + return new TypeWithIndentationAndAutoClosingCommand(indentationEdit, selection, ch, autoClosingPairClose); } else { - return typeCommand( - new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn), - config.normalizeIndentation(actualIndentation) + - model.getLineContent(range.startLineNumber).substring(firstNonWhitespace - 1, range.startColumn - 1) + ch, - false - ); + // Apply only auto indentation edits + const indentationEdit = this._getEditFromIndentationAndSelection(config, model, indentation, selection, ch, true); + return typeCommand(indentationEdit.range, indentationEdit.text, false); } + }); + const editOptions = { shouldPushStackElementBefore: true, shouldPushStackElementAfter: false }; + return new EditOperationResult(EditOperationType.TypingOther, commands, editOptions); + } + + private static _getEditFromIndentationAndSelection(config: CursorConfiguration, model: ITextModel, indentation: string, selection: Selection, ch: string, includeChInEdit: boolean = true): { range: Range; text: string } { + const startLineNumber = selection.startLineNumber; + const firstNonWhitespaceColumn = model.getLineFirstNonWhitespaceColumn(startLineNumber); + let text: string = config.normalizeIndentation(indentation); + if (firstNonWhitespaceColumn !== 0) { + const startLine = model.getLineContent(startLineNumber); + text += startLine.substring(firstNonWhitespaceColumn - 1, selection.startColumn - 1); } - return null; + text += includeChInEdit ? ch : ''; + const range = new Range(startLineNumber, 1, selection.endLineNumber, selection.endColumn); + return { range, text }; } } @@ -138,7 +149,7 @@ export class AutoClosingOpenCharTypeOperation { public static getEdits(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean, isDoingComposition: boolean): EditOperationResult | undefined { if (!isDoingComposition) { - const autoClosingPairClose = this._getAutoClosingPairClose(config, model, selections, ch, chIsAlreadyTyped); + const autoClosingPairClose = this.getAutoClosingPairClose(config, model, selections, ch, chIsAlreadyTyped); if (autoClosingPairClose !== null) { return this._runAutoClosingOpenCharType(selections, ch, chIsAlreadyTyped, autoClosingPairClose); } @@ -158,7 +169,7 @@ export class AutoClosingOpenCharTypeOperation { }); } - private static _getAutoClosingPairClose(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean): string | null { + public static getAutoClosingPairClose(config: CursorConfiguration, model: ITextModel, selections: Selection[], ch: string, chIsAlreadyTyped: boolean): string | null { for (const selection of selections) { if (!selection.isEmpty()) { return null; @@ -843,30 +854,75 @@ export class TabOperation { } } -export class TypeWithAutoClosingCommand extends ReplaceCommandWithOffsetCursorState { +export class BaseTypeWithAutoClosingCommand extends ReplaceCommandWithOffsetCursorState { private readonly _openCharacter: string; private readonly _closeCharacter: string; public closeCharacterRange: Range | null; public enclosingRange: Range | null; - constructor(selection: Selection, openCharacter: string, insertOpenCharacter: boolean, closeCharacter: string) { - super(selection, (insertOpenCharacter ? openCharacter : '') + closeCharacter, 0, -closeCharacter.length); + constructor(selection: Selection, text: string, lineNumberDeltaOffset: number, columnDeltaOffset: number, openCharacter: string, closeCharacter: string) { + super(selection, text, lineNumberDeltaOffset, columnDeltaOffset); this._openCharacter = openCharacter; this._closeCharacter = closeCharacter; this.closeCharacterRange = null; this.enclosingRange = null; } - public override computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection { - const inverseEditOperations = helper.getInverseEditOperations(); - const range = inverseEditOperations[0].range; + protected _computeCursorStateWithRange(model: ITextModel, range: Range, helper: ICursorStateComputerData): Selection { this.closeCharacterRange = new Range(range.startLineNumber, range.endColumn - this._closeCharacter.length, range.endLineNumber, range.endColumn); this.enclosingRange = new Range(range.startLineNumber, range.endColumn - this._openCharacter.length - this._closeCharacter.length, range.endLineNumber, range.endColumn); return super.computeCursorState(model, helper); } } +class TypeWithAutoClosingCommand extends BaseTypeWithAutoClosingCommand { + + constructor(selection: Selection, openCharacter: string, insertOpenCharacter: boolean, closeCharacter: string) { + const text = (insertOpenCharacter ? openCharacter : '') + closeCharacter; + const lineNumberDeltaOffset = 0; + const columnDeltaOffset = -closeCharacter.length; + super(selection, text, lineNumberDeltaOffset, columnDeltaOffset, openCharacter, closeCharacter); + } + + public override computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection { + const inverseEditOperations = helper.getInverseEditOperations(); + const range = inverseEditOperations[0].range; + return this._computeCursorStateWithRange(model, range, helper); + } +} + +class TypeWithIndentationAndAutoClosingCommand extends BaseTypeWithAutoClosingCommand { + + private readonly _autoIndentationEdit: { range: Range; text: string }; + private readonly _autoClosingEdit: { range: Range; text: string }; + + constructor(autoIndentationEdit: { range: Range; text: string }, selection: Selection, openCharacter: string, closeCharacter: string) { + const text = openCharacter + closeCharacter; + const lineNumberDeltaOffset = 0; + const columnDeltaOffset = openCharacter.length; + super(selection, text, lineNumberDeltaOffset, columnDeltaOffset, openCharacter, closeCharacter); + this._autoIndentationEdit = autoIndentationEdit; + this._autoClosingEdit = { range: selection, text }; + } + + public override getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void { + builder.addTrackedEditOperation(this._autoIndentationEdit.range, this._autoIndentationEdit.text); + builder.addTrackedEditOperation(this._autoClosingEdit.range, this._autoClosingEdit.text); + } + + public override computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection { + const inverseEditOperations = helper.getInverseEditOperations(); + if (inverseEditOperations.length !== 2) { + throw new Error('There should be two inverse edit operations!'); + } + const range1 = inverseEditOperations[0].range; + const range2 = inverseEditOperations[1].range; + const range = range1.plusRange(range2); + return this._computeCursorStateWithRange(model, range, helper); + } +} + function getTypingOperation(typedText: string, previousTypingOperation: EditOperationType): EditOperationType { if (typedText === ' ') { return previousTypingOperation === EditOperationType.TypingFirstSpace diff --git a/src/vs/editor/common/languages/autoIndent.ts b/src/vs/editor/common/languages/autoIndent.ts index 680d3a7d5f9f0..5c643b4fa604f 100644 --- a/src/vs/editor/common/languages/autoIndent.ts +++ b/src/vs/editor/common/languages/autoIndent.ts @@ -12,6 +12,7 @@ import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions' import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { IndentationContextProcessor, isLanguageDifferentFromLineStart, ProcessedIndentRulesSupport } from 'vs/editor/common/languages/supports/indentationLineProcessor'; +import { CursorConfiguration } from 'vs/editor/common/cursorCommon'; export interface IVirtualModel { tokenization: { @@ -357,13 +358,14 @@ export function getIndentForEnter( * this line doesn't match decreaseIndentPattern, we should not adjust the indentation. */ export function getIndentActionForType( - autoIndent: EditorAutoIndentStrategy, + cursorConfig: CursorConfiguration, model: ITextModel, range: Range, ch: string, indentConverter: IIndentConverter, languageConfigurationService: ILanguageConfigurationService ): string | null { + const autoIndent = cursorConfig.autoIndent; if (autoIndent < EditorAutoIndentStrategy.Full) { return null; } @@ -404,6 +406,29 @@ export function getIndentActionForType( return indentation; } + const previousLineNumber = range.startLineNumber - 1; + if (previousLineNumber > 0) { + const previousLine = model.getLineContent(previousLineNumber); + if (indentRulesSupport.shouldIndentNextLine(previousLine) && indentRulesSupport.shouldIncrease(textAroundRangeWithCharacter)) { + const inheritedIndentationData = getInheritIndentForLine(autoIndent, model, range.startLineNumber, false, languageConfigurationService); + const inheritedIndentation = inheritedIndentationData?.indentation; + if (inheritedIndentation !== undefined) { + const currentLine = model.getLineContent(range.startLineNumber); + const actualCurrentIndentation = strings.getLeadingWhitespace(currentLine); + const inferredCurrentIndentation = indentConverter.shiftIndent(inheritedIndentation); + // If the inferred current indentation is not equal to the actual current indentation, then the indentation has been intentionally changed, in that case keep it + const inferredIndentationEqualsActual = inferredCurrentIndentation === actualCurrentIndentation; + const textAroundRangeContainsOnlyWhitespace = /^\s*$/.test(textAroundRange); + const autoClosingPairs = cursorConfig.autoClosingPairs.autoClosingPairsOpenByEnd.get(ch); + const autoClosingPairExists = autoClosingPairs && autoClosingPairs.length > 0; + const isChFirstNonWhitespaceCharacterAndInAutoClosingPair = autoClosingPairExists && textAroundRangeContainsOnlyWhitespace; + if (inferredIndentationEqualsActual && isChFirstNonWhitespaceCharacterAndInAutoClosingPair) { + return inheritedIndentation; + } + } + } + } + return null; } diff --git a/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts index f689466ed5114..2beed4f823be3 100644 --- a/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts +++ b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts @@ -22,7 +22,7 @@ import { goIndentationRules, htmlIndentationRules, javascriptIndentationRules, l import { cppOnEnterRules, htmlOnEnterRules, javascriptOnEnterRules, phpOnEnterRules } from 'vs/editor/test/common/modes/supports/onEnterRules'; import { TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; import { cppBracketRules, goBracketRules, htmlBracketRules, latexBracketRules, luaBracketRules, phpBracketRules, rubyBracketRules, typescriptBracketRules, vbBracketRules } from 'vs/editor/test/common/modes/supports/bracketRules'; -import { latexAutoClosingPairsRules } from 'vs/editor/test/common/modes/supports/autoClosingPairsRules'; +import { javascriptAutoClosingPairsRules, latexAutoClosingPairsRules } from 'vs/editor/test/common/modes/supports/autoClosingPairsRules'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; @@ -60,6 +60,7 @@ export function registerLanguageConfiguration(languageConfigurationService: ILan lineComment: '//', blockComment: ['/*', '*/'] }, + autoClosingPairs: javascriptAutoClosingPairsRules, indentationRules: javascriptIndentationRules, onEnterRules: javascriptOnEnterRules }); @@ -1076,6 +1077,38 @@ suite('Auto Indent On Type - TypeScript/JavaScript', () => { }); }); + test('issue #209802: allman style braces in JavaScript', () => { + + // https://github.com/microsoft/vscode/issues/209802 + + const model = createTextModel([ + 'if (/*condition*/)', + ].join('\n'), languageId, {}); + disposables.add(model); + + withTestCodeEditor(model, { autoIndent: "full", serviceCollection }, (editor, viewModel) => { + editor.setSelection(new Selection(1, 19, 1, 19)); + viewModel.type("\n", 'keyboard'); + assert.strictEqual(model.getValue(), [ + 'if (/*condition*/)', + ' ' + ].join('\n')); + viewModel.type("{", 'keyboard'); + assert.strictEqual(model.getValue(), [ + 'if (/*condition*/)', + '{}' + ].join('\n')); + editor.setSelection(new Selection(2, 2, 2, 2)); + viewModel.type("\n", 'keyboard'); + assert.strictEqual(model.getValue(), [ + 'if (/*condition*/)', + '{', + ' ', + '}' + ].join('\n')); + }); + }); + // Failing tests... test.skip('issue #43244: indent after equal sign is detected', () => { diff --git a/src/vs/editor/test/common/modes/supports/autoClosingPairsRules.ts b/src/vs/editor/test/common/modes/supports/autoClosingPairsRules.ts index 968bd3508926c..0f5ebc499bd24 100644 --- a/src/vs/editor/test/common/modes/supports/autoClosingPairsRules.ts +++ b/src/vs/editor/test/common/modes/supports/autoClosingPairsRules.ts @@ -3,7 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IAutoClosingPair } from 'vs/editor/common/languages/languageConfiguration'; +import { IAutoClosingPair, IAutoClosingPairConditional } from 'vs/editor/common/languages/languageConfiguration'; + +export const javascriptAutoClosingPairsRules: IAutoClosingPairConditional[] = [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '\'', close: '\'', notIn: ['string', 'comment'] }, + { open: '"', close: '"', notIn: ['string'] }, + { open: '`', close: '`', notIn: ['string', 'comment'] }, + { open: '/**', close: ' */', notIn: ['string'] } +]; export const latexAutoClosingPairsRules: IAutoClosingPair[] = [ { open: '\\left(', close: '\\right)' }, From 570e45bf44ad6647cde4e3c62b9dbeb59d4469fa Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:17:25 +0200 Subject: [PATCH 369/755] SCM - distinct rendering for HEAD commit (#216691) --- src/vs/workbench/contrib/scm/browser/scmHistory.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/workbench/contrib/scm/browser/scmHistory.ts b/src/vs/workbench/contrib/scm/browser/scmHistory.ts index 28bc3861c8d2e..5388de77fe3f8 100644 --- a/src/vs/workbench/contrib/scm/browser/scmHistory.ts +++ b/src/vs/workbench/contrib/scm/browser/scmHistory.ts @@ -5,6 +5,7 @@ import { lastOrDefault } from 'vs/base/common/arrays'; import { deepClone } from 'vs/base/common/objects'; +import { ThemeIcon } from 'vs/base/common/themables'; import { ISCMHistoryItem, ISCMHistoryItemGraphNode, ISCMHistoryItemViewModel } from 'vs/workbench/contrib/scm/common/history'; const SWIMLANE_HEIGHT = 22; @@ -178,6 +179,13 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV const circleInner = drawCircle(circleIndex, CIRCLE_RADIUS - 1, graphColors[circleColorIndex]); svg.append(circleInner); } else { + // HEAD + // TODO@lszomoru - implement a better way to determine if the commit is HEAD + if (historyItem.labels?.some(l => ThemeIcon.isThemeIcon(l.icon) && l.icon.id === 'target')) { + const outerCircle = drawCircle(circleIndex, CIRCLE_RADIUS + 2, graphColors[circleColorIndex]); + svg.append(outerCircle); + } + // Node const circle = drawCircle(circleIndex, CIRCLE_RADIUS, graphColors[circleColorIndex]); svg.append(circle); From 7d07f6de4f0e8e2f8936216b038521cb00d67e0f Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 20 Jun 2024 11:32:24 +0200 Subject: [PATCH 370/755] Fixes #216434 --- .../inlineCompletions/browser/inlineCompletionsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts index c902a1f2ed9b2..a7c25e42677cf 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts @@ -45,7 +45,7 @@ export class InlineCompletionsController extends Disposable { } private readonly _editorObs = observableCodeEditor(this.editor); - private readonly _positions = derived(this, reader => this._editorObs.positions.read(reader) ?? [new Position(1, 1)]); + private readonly _positions = derived(this, reader => this._editorObs.selections.read(reader)?.map(s => s.getEndPosition()) ?? [new Position(1, 1)]); private readonly _suggestWidgetAdaptor = this._register(new SuggestWidgetAdaptor( this.editor, From 4795e48fb56628700979be339d287dfacd9ae880 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2024 12:54:30 +0200 Subject: [PATCH 371/755] enable install another version action for all gallery extensions (#216702) --- .../common/extensionGalleryService.ts | 10 +++++----- .../extensionManagement/common/extensionManagement.ts | 2 +- .../contrib/extensions/browser/extensionsActions.ts | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 955d3bd3a20e9..093a6694e99e3 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -1165,15 +1165,15 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi return ''; } - async getAllCompatibleVersions(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise { + async getAllCompatibleVersions(extensionIdentifier: IExtensionIdentifier, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise { let query = new Query() .withFlags(Flags.IncludeVersions, Flags.IncludeCategoryAndTags, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, 1); - if (extension.identifier.uuid) { - query = query.withFilter(FilterType.ExtensionId, extension.identifier.uuid); + if (extensionIdentifier.uuid) { + query = query.withFilter(FilterType.ExtensionId, extensionIdentifier.uuid); } else { - query = query.withFilter(FilterType.ExtensionName, extension.identifier.id); + query = query.withFilter(FilterType.ExtensionName, extensionIdentifier.id); } const { galleryExtensions } = await this.queryRawGalleryExtensions(query, CancellationToken.None); @@ -1191,7 +1191,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi try { if ( (await this.isValidVersion( - extension.identifier.id, + extensionIdentifier.id, version, includePreRelease ? 'any' : 'release', true, allTargetPlatforms, diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 61c9716cc56a1..d40ee80fc784f 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -368,7 +368,7 @@ export interface IExtensionGalleryService { getExtensions(extensionInfos: ReadonlyArray, options: IExtensionQueryOptions, token: CancellationToken): Promise; isExtensionCompatible(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform, productVersion?: IProductVersion): Promise; getCompatibleExtension(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform, productVersion?: IProductVersion): Promise; - getAllCompatibleVersions(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise; + getAllCompatibleVersions(extensionIdentifier: IExtensionIdentifier, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise; download(extension: IGalleryExtension, location: URI, operation: InstallOperation): Promise; downloadSignatureArchive(extension: IGalleryExtension, location: URI): Promise; reportStatistic(publisher: string, name: string, version: string, type: StatisticType): Promise; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 82d4c36ba9087..34c1862a06177 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -1140,7 +1140,7 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['isDefaultApplicationScopedExtension', extension.local && isApplicationScopedExtension(extension.local.manifest)]); cksOverlay.push(['isApplicationScopedExtension', extension.local && extension.local.isApplicationScoped]); cksOverlay.push(['isWorkspaceScopedExtension', extension.isWorkspaceScoped]); - cksOverlay.push(['isGalleryExtension', !!extension.gallery]); + cksOverlay.push(['isGalleryExtension', !!extension.identifier.uuid]); if (extension.local) { cksOverlay.push(['extensionSource', extension.local.source]); } @@ -1434,7 +1434,7 @@ export class InstallAnotherVersionAction extends ExtensionAction { } update(): void { - this.enabled = !!this.extension && !this.extension.isBuiltin && !!this.extension.gallery && !this.extension.deprecationInfo; + this.enabled = !!this.extension && !this.extension.isBuiltin && !!this.extension.identifier.uuid && !this.extension.deprecationInfo; if (this.enabled && this.whenInstalled) { this.enabled = !!this.extension?.local && !!this.extension.server && this.extension.state === ExtensionState.Installed; } @@ -1444,11 +1444,11 @@ export class InstallAnotherVersionAction extends ExtensionAction { if (!this.enabled) { return; } - if (!this.extension?.gallery) { + if (!this.extension) { return; } const targetPlatform = this.extension.server ? await this.extension.server.extensionManagementService.getTargetPlatform() : await this.extensionManagementService.getTargetPlatform(); - const allVersions = await this.extensionGalleryService.getAllCompatibleVersions(this.extension.gallery, this.extension.local?.preRelease ?? this.extension.gallery.properties.isPreReleaseVersion, targetPlatform); + const allVersions = await this.extensionGalleryService.getAllCompatibleVersions(this.extension.identifier, this.extension.local?.preRelease ?? this.extension.gallery?.properties.isPreReleaseVersion ?? false, targetPlatform); if (!allVersions.length) { await this.dialogService.info(localize('no versions', "This extension has no other versions.")); return; From 07dcb7aff441bb4b6a4e20271969887085cec327 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 20 Jun 2024 13:05:30 +0200 Subject: [PATCH 372/755] inline chat stable scroll should ensure first line stays visible (#216705) --- .../inlineChat/browser/inlineChatZoneWidget.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index a57b2b9ba4fbc..3dea5ecc72fc7 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -184,12 +184,21 @@ export class InlineChatZoneWidget extends ZoneWidget { const lineTop = this.editor.getTopForLineNumber(lineNumber); const zoneTop = lineTop - height.pixelsValue; - // const spaceBelowLine = this.editor.getScrollHeight() - this.editor.getBottomForLineNumber(position.lineNumber); - // const minTop = this.editor.getScrollTop() - spaceBelowLine; - // const newTop = Math.max(zoneTop, minTop); - const newTop = zoneTop; + + const editorHeight = this.editor.getLayoutInfo().height; + const newLineBottom = this.editor.getBottomForLineNumber(lineNumber); + + let newTop: number; + if (newLineBottom > editorHeight) { + newTop = newLineBottom - editorHeight; + } else { + newTop = zoneTop; + } + const currentTop = this.editor.getScrollTop(); + // console.log('REVEAL ZONE TOP', { zoneTop, newLineBottom, editorHeight, currentTop, newTop }); + if (newTop < currentTop) { this.editor.setScrollTop(newTop, ScrollType.Immediate); } From 05bd928e619865d63753931f84a4288679a1fe7d Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:50:58 +0200 Subject: [PATCH 373/755] SCM - support multiple colors on the same column (#216708) --- .../contrib/scm/browser/scmHistory.ts | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmHistory.ts b/src/vs/workbench/contrib/scm/browser/scmHistory.ts index 5388de77fe3f8..16349eaa7853c 100644 --- a/src/vs/workbench/contrib/scm/browser/scmHistory.ts +++ b/src/vs/workbench/contrib/scm/browser/scmHistory.ts @@ -19,6 +19,17 @@ function getNextColorIndex(colorIndex: number): number { return colorIndex < graphColors.length - 1 ? colorIndex + 1 : 1; } +function getLabelColorIndex(historyItem: ISCMHistoryItem, colorMap: Map): number | undefined { + for (const label of historyItem.labels ?? []) { + const colorIndex = colorMap.get(label.title); + if (colorIndex !== undefined) { + return colorIndex; + } + } + + return undefined; +} + function createPath(stroke: string): SVGPathElement { const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute('fill', 'none'); @@ -65,10 +76,12 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV const outputSwimlanes = historyItemViewModel.outputSwimlanes; const inputIndex = inputSwimlanes.findIndex(node => node.id === historyItem.id); - const outputIndex = historyItem.parentIds.length === 0 ? -1 : outputSwimlanes.findIndex(node => node.id === historyItem.parentIds[0]); + const outputIndex = historyItem.parentIds.length === 0 ? -1 : findLastIndex(outputSwimlanes, historyItem.parentIds[0]); const circleIndex = inputIndex !== -1 ? inputIndex : inputSwimlanes.length; - const circleColorIndex = inputIndex !== -1 ? inputSwimlanes[inputIndex].color : outputSwimlanes[circleIndex]?.color ?? 0; + const circleColorIndex = + outputIndex !== -1 ? outputSwimlanes[outputIndex].color : + inputIndex !== -1 ? inputSwimlanes[inputIndex].color : 0; for (let index = 0; index < inputSwimlanes.length; index++) { const node = inputSwimlanes[index]; @@ -158,15 +171,15 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV svg.append(path); } - // Draw | to circle + // Draw | to * if (inputIndex !== -1) { - const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), 0, SWIMLANE_HEIGHT / 2, graphColors[circleColorIndex]); + const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), 0, SWIMLANE_HEIGHT / 2, graphColors[inputSwimlanes[inputIndex].color]); svg.append(path); } - // Draw | from circle + // Draw | from * if (outputIndex !== -1) { - const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), SWIMLANE_HEIGHT / 2, SWIMLANE_HEIGHT, graphColors[circleColorIndex]); + const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), SWIMLANE_HEIGHT / 2, SWIMLANE_HEIGHT, graphColors[outputSwimlanes[outputIndex].color]); svg.append(path); } @@ -217,8 +230,8 @@ export function toISCMHistoryItemViewModelArray(historyItems: ISCMHistoryItem[], if (node.id === historyItem.id) { if (!firstParentAdded) { outputSwimlanes.push({ - ...deepClone(node), - id: historyItem.parentIds[0] + id: historyItem.parentIds[0], + color: getLabelColorIndex(historyItem, colorMap) ?? node.color }); firstParentAdded = true; } @@ -231,16 +244,9 @@ export function toISCMHistoryItemViewModelArray(historyItems: ISCMHistoryItem[], // Add unprocessed parent(s) to the output for (let i = firstParentAdded ? 1 : 0; i < historyItem.parentIds.length; i++) { - // Get color index based on the label - let labelColorIndex: number | undefined = undefined; - for (const label of historyItem.labels ?? []) { - labelColorIndex = colorMap.get(label.title); - if (labelColorIndex !== undefined) { - break; - } - } + // Color index (label -> next color) + colorIndex = getLabelColorIndex(historyItem, colorMap) ?? getNextColorIndex(colorIndex); - colorIndex = labelColorIndex ?? getNextColorIndex(colorIndex); outputSwimlanes.push({ id: historyItem.parentIds[i], color: colorIndex From b03fd7c49878d0431ab57d803c3f1f0f9a3488ed Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:40:52 +0200 Subject: [PATCH 374/755] SCM - switch to an experimental setting (#216713) --- src/vs/workbench/contrib/scm/browser/scm.contribution.ts | 5 +++++ src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index 9b912eb95d6e8..91129c1d6ca3e 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -349,6 +349,11 @@ Registry.as(ConfigurationExtensions.Configuration).regis ], description: localize('scm.workingSets.default', "Controls the default working set to use when switching to a source control history item group that does not have a working set."), default: 'current' + }, + 'scm.experimental.showHistoryGraph': { + type: 'boolean', + description: localize('scm.experimental.showHistoryGraph', "Controls whether to show the history graph instead of incoming/outgoing changes in the Source Control view."), + default: false } } }); diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 4be29180a9f79..494fa00971296 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -1203,7 +1203,7 @@ class SeparatorRenderer implements ICompressibleTreeRenderer('scm.showHistoryGraph') !== true) { + if (this.configurationService.getValue('scm.experimental.showHistoryGraph') !== true) { const toolBar = new MenuWorkbenchToolBar(append(element, $('.actions')), MenuId.SCMChangesSeparator, { moreIcon: Codicon.gear }, this.menuService, this.contextKeyService, this.contextMenuService, this.keybindingService, this.commandService, this.telemetryService); disposables.add(toolBar); } @@ -1609,7 +1609,7 @@ MenuRegistry.appendMenuItem(MenuId.SCMTitle, { MenuRegistry.appendMenuItem(MenuId.SCMTitle, { title: localize('scmChanges', "Incoming & Outgoing"), submenu: Menus.ChangesSettings, - when: ContextKeyExpr.and(ContextKeyExpr.equals('view', VIEW_PANE_ID), ContextKeys.RepositoryCount.notEqualsTo(0), ContextKeyExpr.equals('config.scm.showHistoryGraph', true).negate()), + when: ContextKeyExpr.and(ContextKeyExpr.equals('view', VIEW_PANE_ID), ContextKeys.RepositoryCount.notEqualsTo(0), ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', true).negate()), group: '0_view&sort', order: 2 }); @@ -3017,7 +3017,7 @@ export class SCMViewPane extends ViewPane { e.affectsConfiguration('scm.showChangesSummary') || e.affectsConfiguration('scm.showIncomingChanges') || e.affectsConfiguration('scm.showOutgoingChanges') || - e.affectsConfiguration('scm.showHistoryGraph'), + e.affectsConfiguration('scm.experimental.showHistoryGraph'), this.visibilityDisposables) (() => this.updateChildren(), this, this.visibilityDisposables); @@ -4125,7 +4125,7 @@ class SCMTreeDataSource implements IAsyncDataSource('scm.showChangesSummary'), showIncomingChanges: this.configurationService.getValue('scm.showIncomingChanges'), showOutgoingChanges: this.configurationService.getValue('scm.showOutgoingChanges'), - showHistoryGraph: this.configurationService.getValue('scm.showHistoryGraph') + showHistoryGraph: this.configurationService.getValue('scm.experimental.showHistoryGraph') }; } From 8993f76c9fc6f36f7838f1e6f21feb1f4d734e55 Mon Sep 17 00:00:00 2001 From: isidorn Date: Thu, 20 Jun 2024 15:54:10 +0200 Subject: [PATCH 375/755] add proxy-bypass-list as argv argument fixes #216642 --- src/main.js | 5 ++++- src/vs/workbench/electron-sandbox/desktop.contribution.ts | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index 6294a15298c6e..bda0610423073 100644 --- a/src/main.js +++ b/src/main.js @@ -205,7 +205,10 @@ function configureCommandlineSwitchesSync(cliArgs) { 'force-color-profile', // disable LCD font rendering, a Chromium flag - 'disable-lcd-text' + 'disable-lcd-text', + + // bypass any specified proxy for the given semi-colon-separated list of hosts + 'proxy-bypass-list' ]; if (process.platform === 'linux') { diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index 0fbe0079ed1ae..cb950f51b9f6d 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -360,6 +360,10 @@ import { MAX_ZOOM_LEVEL, MIN_ZOOM_LEVEL } from 'vs/platform/window/electron-sand type: 'boolean', description: localize('argv.disableLcdText', 'Disables LCD font antialiasing.') }, + 'proxy-bypass-list': { + type: 'string', + description: localize('argv.proxyBypassList', 'Bypass any specified proxy for the given semi-colon-separated list of hosts.') + }, 'disable-hardware-acceleration': { type: 'boolean', description: localize('argv.disableHardwareAcceleration', 'Disables hardware acceleration. ONLY change this option if you encounter graphic issues.') From d7792c102e30c8315fc9bb906f9e9b0f8a494e9b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2024 16:36:07 +0200 Subject: [PATCH 376/755] do not recommend version in the suggestions (#216718) --- .../workbench/services/extensions/common/extensionsRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index dd879d2b70df2..93951fbae70e1 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -242,7 +242,7 @@ export const schema: IJSONSchema = { uniqueItems: true, items: { type: 'string', - enum: Object.keys(allApiProposals).map(proposalName => allApiProposals[proposalName].version ? `${proposalName}@${allApiProposals[proposalName].version}` : proposalName), + enum: Object.keys(allApiProposals).map(proposalName => proposalName), markdownEnumDescriptions: Object.values(allApiProposals).map(value => value.proposal) } }, From 62fbb97723f436d91a0f69a3840dbd7c2086077d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2024 17:13:30 +0200 Subject: [PATCH 377/755] proposed support for proposed api versioning (#216719) --- src/vs/base/common/product.ts | 1 + .../common/extensionGalleryService.ts | 20 +++++++++++++++---- .../common/extensionsScannerService.ts | 13 +++++++++--- .../platform/extensions/common/extensions.ts | 6 ++---- .../services/extensions/common/extensions.ts | 8 +++----- .../common/extensionsProposedApi.ts | 3 ++- 6 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index c6e335aa3e757..026545ba4ae90 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -173,6 +173,7 @@ export interface IProductConfiguration { readonly extensionPointExtensionKind?: { readonly [extensionPointId: string]: ('ui' | 'workspace' | 'web')[] }; readonly extensionSyncedKeys?: { readonly [extensionId: string]: string[] }; + readonly extensionsEnabledWithApiProposalVersion?: string[]; readonly extensionEnabledApiProposals?: { readonly [extensionId: string]: string[] }; readonly extensionUntrustedWorkspaceSupport?: { readonly [extensionId: string]: ExtensionUntrustedWorkspaceSupport }; readonly extensionVirtualWorkspacesSupport?: { readonly [extensionId: string]: ExtensionVirtualWorkspaceSupport }; diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 093a6694e99e3..6c90b5a8f1922 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -598,6 +598,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi private readonly extensionsControlUrl: string | undefined; private readonly commonHeadersPromise: Promise>; + private readonly extensionsEnabledWithApiProposalVersion: string[]; constructor( storageService: IStorageService | undefined, @@ -614,6 +615,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi this.extensionsGalleryUrl = isPPEEnabled ? config.servicePPEUrl : config?.serviceUrl; this.extensionsGallerySearchUrl = isPPEEnabled ? undefined : config?.searchUrl; this.extensionsControlUrl = config?.controlUrl; + this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; this.commonHeadersPromise = resolveMarketplaceHeaders( productService.version, productService, @@ -717,13 +719,23 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi return false; } - if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [])) { + if (!this.areApiProposalsCompatible(extension.identifier, extension.properties.enabledApiProposals)) { return false; } return true; } + private areApiProposalsCompatible(extensionIdentifier: IExtensionIdentifier, enabledApiProposals: string[] | undefined): boolean { + if (!enabledApiProposals) { + return true; + } + if (!this.extensionsEnabledWithApiProposalVersion.includes(extensionIdentifier.id.toLowerCase())) { + return true; + } + return areApiProposalsCompatible(enabledApiProposals); + } + private async isValidVersion(extension: string, rawGalleryExtensionVersion: IRawGalleryExtensionVersion, versionType: 'release' | 'prerelease' | 'any', compatible: boolean, allTargetPlatforms: TargetPlatform[], targetPlatform: TargetPlatform, productVersion: IProductVersion = { version: this.productService.version, date: this.productService.date }): Promise { if (!isTargetPlatformCompatible(getTargetPlatformForExtensionVersion(rawGalleryExtensionVersion), allTargetPlatforms, targetPlatform)) { return false; @@ -933,7 +945,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi } // Allow any version if includePreRelease flag is set otherwise only release versions are allowed if (await this.isValidVersion( - getGalleryExtensionId(rawGalleryExtension.publisher.publisherName, rawGalleryExtension.extensionName), + extensionIdentifier.id, rawGalleryExtensionVersion, includePreRelease ? 'any' : 'release', criteria.compatible, @@ -941,7 +953,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi criteria.targetPlatform, criteria.productVersion) ) { - if (criteria.compatible && !areApiProposalsCompatible(getEnabledApiProposals(rawGalleryExtensionVersion))) { + if (criteria.compatible && !this.areApiProposalsCompatible(extensionIdentifier, getEnabledApiProposals(rawGalleryExtensionVersion))) { return null; } return toExtension(rawGalleryExtension, rawGalleryExtensionVersion, allTargetPlatforms, queryContext); @@ -1196,7 +1208,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi true, allTargetPlatforms, targetPlatform)) - && areApiProposalsCompatible(getEnabledApiProposals(version)) + && this.areApiProposalsCompatible(extensionIdentifier, getEnabledApiProposals(version)) ) { validVersions.push(version); } diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index d29baae7a975b..74c8eeaeb1f5e 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -554,14 +554,18 @@ type NlsConfiguration = { class ExtensionsScanner extends Disposable { + private readonly extensionsEnabledWithApiProposalVersion: string[]; + constructor( private readonly obsoleteFile: URI, @IExtensionsProfileScannerService protected readonly extensionsProfileScannerService: IExtensionsProfileScannerService, @IUriIdentityService protected readonly uriIdentityService: IUriIdentityService, @IFileService protected readonly fileService: IFileService, + @IProductService productService: IProductService, @ILogService protected readonly logService: ILogService ) { super(); + this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; } async scanExtensions(input: ExtensionScannerInput): Promise { @@ -653,6 +657,9 @@ class ExtensionsScanner extends Disposable { const type = metadata?.isSystem ? ExtensionType.System : input.type; const isBuiltin = type === ExtensionType.System || !!metadata?.isBuiltin; manifest = await this.translateManifest(input.location, manifest, ExtensionScannerInput.createNlsConfiguration(input)); + if (manifest.enabledApiProposals && !this.extensionsEnabledWithApiProposalVersion?.includes(id.toLowerCase())) { + manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); + } const extension: IRelaxedScannedExtension = { type, identifier, @@ -689,7 +696,7 @@ class ExtensionsScanner extends Disposable { return extension; } - async scanExtensionManifest(extensionLocation: URI): Promise { + private async scanExtensionManifest(extensionLocation: URI): Promise { const manifestLocation = joinPath(extensionLocation, 'package.json'); let content; try { @@ -878,9 +885,10 @@ class CachedExtensionsScanner extends ExtensionsScanner { @IExtensionsProfileScannerService extensionsProfileScannerService: IExtensionsProfileScannerService, @IUriIdentityService uriIdentityService: IUriIdentityService, @IFileService fileService: IFileService, + @IProductService productService: IProductService, @ILogService logService: ILogService ) { - super(obsoleteFile, extensionsProfileScannerService, uriIdentityService, fileService, logService); + super(obsoleteFile, extensionsProfileScannerService, uriIdentityService, fileService, productService, logService); } override async scanExtensions(input: ExtensionScannerInput): Promise { @@ -983,7 +991,6 @@ export function toExtensionDescription(extension: IScannedExtension, isUnderDeve targetPlatform: extension.targetPlatform, publisherDisplayName: extension.publisherDisplayName, ...extension.manifest, - enabledApiProposals: extension.manifest.enabledApiProposals ? parseEnabledApiProposalNames([...extension.manifest.enabledApiProposals]) : undefined, }; } diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index dc022ce00985c..24ba29d210f33 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -458,7 +458,7 @@ export class ExtensionIdentifierMap { } } -interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest { +export interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest { id?: string; identifier: ExtensionIdentifier; uuid?: string; @@ -470,9 +470,7 @@ interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest { extensionLocation: URI; } -export type IExtensionDescription = Readonly & { - enabledApiProposals: string[] | undefined; // This needs to be updated while validating & updating the proposals. -}; +export type IExtensionDescription = Readonly; export function isApplicationScopedExtension(manifest: IExtensionManifest): boolean { return isLanguagePackExtension(manifest); diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index bc9ce39aa7002..1ca33752d78c5 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { getExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ImplicitActivationEvents } from 'vs/platform/extensionManagement/common/implicitActivationEvents'; -import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, ExtensionType, IExtension, IExtensionContributions, IExtensionDescription, parseEnabledApiProposalNames, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, ExtensionType, IExtension, IExtensionContributions, IExtensionDescription, TargetPlatform } from 'vs/platform/extensions/common/extensions'; import { ApiProposalName } from 'vs/platform/extensions/common/extensionsApiProposals'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IV8Profile } from 'vs/platform/profiling/common/profiling'; @@ -28,8 +28,7 @@ export const nullExtensionDescription = Object.freeze({ isBuiltin: false, targetPlatform: TargetPlatform.UNDEFINED, isUserBuiltin: false, - isUnderDevelopment: false, - enabledApiProposals: undefined, + isUnderDevelopment: false }); export type WebWorkerExtHostConfigValue = boolean | 'auto'; @@ -570,8 +569,7 @@ export function toExtensionDescription(extension: IExtension, isUnderDevelopment uuid: extension.identifier.uuid, targetPlatform: extension.targetPlatform, publisherDisplayName: extension.publisherDisplayName, - ...extension.manifest, - enabledApiProposals: extension.manifest.enabledApiProposals ? parseEnabledApiProposalNames([...extension.manifest.enabledApiProposals]) : undefined, + ...extension.manifest }; } diff --git a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts index aad00bc62ccb8..76d560e77b126 100644 --- a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts +++ b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts @@ -15,6 +15,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { Extensions, IExtensionFeatureMarkdownRenderer, IExtensionFeaturesRegistry, IRenderedData } from 'vs/workbench/services/extensionManagement/common/extensionFeatures'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; +import { Mutable } from 'vs/base/common/types'; export class ExtensionsProposedApi { @@ -60,7 +61,7 @@ export class ExtensionsProposedApi { } } - private doUpdateEnabledApiProposals(extension: IExtensionDescription): void { + private doUpdateEnabledApiProposals(extension: Mutable): void { const key = ExtensionIdentifier.toKey(extension.identifier); From 8fc26cd2ec9b3c48bf9666e8b5737bf402f17344 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 20 Jun 2024 08:35:35 -0700 Subject: [PATCH 378/755] Don't allow suggest on Windows PowerShell Fixes #214869 --- .../contrib/terminal/browser/media/shellIntegration.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 index d3aafc0ecf470..53603022c2924 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 @@ -174,8 +174,9 @@ function Set-MappedKeyHandlers { Set-MappedKeyHandler -Chord Shift+Enter -Sequence 'F12,c' Set-MappedKeyHandler -Chord Shift+End -Sequence 'F12,d' - # Conditionally enable suggestions - if ($env:VSCODE_SUGGEST -eq '1') { + # Enable suggestions if the environment variable is set and Windows PowerShell is not being used + # as APIs are not available to support this feature + if ($env:VSCODE_SUGGEST -eq '1' -and $PSVersionTable.PSVersion -ge "6.0") { Remove-Item Env:VSCODE_SUGGEST # VS Code send completions request (may override Ctrl+Spacebar) From 4d858a68c94de594eb2646999ebd881cdcfa1452 Mon Sep 17 00:00:00 2001 From: Shoham Ben Shitrit <91195275+bsShoham@users.noreply.github.com> Date: Thu, 20 Jun 2024 18:38:44 +0300 Subject: [PATCH 379/755] allow usage of `extname(N)` template in custom labels (#213033) * allow usage of `filenamePart` template in custom labels * use extname(n) instead of filename part * change extname to return the full extensions and not just the last file extension * Fix regex to match extname Return match when N in `extname(N)` is larger than extensions amount * Add tests * Fix `.file` label assertion * Make sure `extname` doesn't include leading dots have filename return the file name from the start until the first non-leading `.` * :lipstick: --------- Co-authored-by: BeniBenj Co-authored-by: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> --- .../browser/workbench.contribution.ts | 5 +- .../editor/common/customEditorLabelService.ts | 80 ++++-- .../browser/customEditorLabelService.test.ts | 234 ++++++++++++++++++ 3 files changed, 296 insertions(+), 23 deletions(-) create mode 100644 src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 8494c963f3fa2..a5a3f44d17cae 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -102,9 +102,10 @@ const registry = Registry.as(ConfigurationExtensions.Con let customEditorLabelDescription = localize('workbench.editor.label.patterns', "Controls the rendering of the editor label. Each __Item__ is a pattern that matches a file path. Both relative and absolute file paths are supported. The relative path must include the WORKSPACE_FOLDER (e.g `WORKSPACE_FOLDER/src/**.tsx` or `*/src/**.tsx`). Absolute patterns must start with a `/`. In case multiple patterns match, the longest matching path will be picked. Each __Value__ is the template for the rendered editor when the __Item__ matches. Variables are substituted based on the context:"); customEditorLabelDescription += '\n- ' + [ localize('workbench.editor.label.dirname', "`${dirname}`: name of the folder in which the file is located (e.g. `WORKSPACE_FOLDER/folder/file.txt -> folder`)."), - localize('workbench.editor.label.nthdirname', "`${dirname(N)}`: name of the nth parent folder in which the file is located (e.g. `N=2: WORKSPACE_FOLDER/static/folder/file.txt -> WORKSPACE_FOLDER`). Folders can be picked from the start of the path by using negative numbers (e.g. `N=-1: WORKSPACE_FOLDER/folder/file.txt -> WORKSPACE_FOLDER`). If the __Item__ is an absolute pattern path, the first folder (`N=-1`) refers to the first folder in the absoulte path, otherwise it corresponds to the workspace folder."), + localize('workbench.editor.label.nthdirname', "`${dirname(N)}`: name of the nth parent folder in which the file is located (e.g. `N=2: WORKSPACE_FOLDER/static/folder/file.txt -> WORKSPACE_FOLDER`). Folders can be picked from the start of the path by using negative numbers (e.g. `N=-1: WORKSPACE_FOLDER/folder/file.txt -> WORKSPACE_FOLDER`). If the __Item__ is an absolute pattern path, the first folder (`N=-1`) refers to the first folder in the absolute path, otherwise it corresponds to the workspace folder."), localize('workbench.editor.label.filename', "`${filename}`: name of the file without the file extension (e.g. `WORKSPACE_FOLDER/folder/file.txt -> file`)."), localize('workbench.editor.label.extname', "`${extname}`: the file extension (e.g. `WORKSPACE_FOLDER/folder/file.txt -> txt`)."), + localize('workbench.editor.label.nthextname', "`${extname(N)}`: the nth extension of the file separated by '.' (e.g. `N=2: WORKSPACE_FOLDER/folder/file.ext1.ext2.ext3 -> ext1`). Extension can be picked from the start of the extension by using negative numbers (e.g. `N=-1: WORKSPACE_FOLDER/folder/file.ext1.ext2.ext3 -> ext2`)."), ].join('\n- '); // intentionally concatenated to not produce a string that is too long for translations customEditorLabelDescription += '\n\n' + localize('customEditorLabelDescriptionExample', "Example: `\"**/static/**/*.html\": \"${filename} - ${dirname} (${extname})\"` will render a file `WORKSPACE_FOLDER/static/folder/file.html` as `file - folder (html)`."); @@ -113,7 +114,7 @@ const registry = Registry.as(ConfigurationExtensions.Con additionalProperties: { type: 'string', - markdownDescription: localize('workbench.editor.label.template', "The template which should be rendered when the pattern mtches. May include the variables ${dirname}, ${filename} and ${extname}."), + markdownDescription: localize('workbench.editor.label.template', "The template which should be rendered when the pattern matches. May include the variables ${dirname}, ${filename} and ${extname}."), minLength: 1, pattern: '.*[a-zA-Z0-9].*' }, diff --git a/src/vs/workbench/services/editor/common/customEditorLabelService.ts b/src/vs/workbench/services/editor/common/customEditorLabelService.ts index 8264adcbd91c0..bd6633067a127 100644 --- a/src/vs/workbench/services/editor/common/customEditorLabelService.ts +++ b/src/vs/workbench/services/editor/common/customEditorLabelService.ts @@ -51,10 +51,10 @@ export class CustomEditorLabelService extends Disposable implements ICustomEdito this.storeEnablementState(); this.storeCustomPatterns(); - this.registerListernes(); + this.registerListeners(); } - private registerListernes(): void { + private registerListeners(): void { this._register(this.configurationService.onDidChangeConfiguration(e => { // Cache the enabled state if (e.affectsConfiguration(CustomEditorLabelService.SETTING_ID_ENABLED)) { @@ -148,29 +148,43 @@ export class CustomEditorLabelService extends Disposable implements ICustomEdito } if (pattern.parsedPattern(relevantPath)) { - return this.applyTempate(pattern.template, resource, relevantPath); + return this.applyTemplate(pattern.template, resource, relevantPath); } } return undefined; } - private readonly _parsedTemplateExpression = /\$\{(dirname|filename|extname|dirname\(([-+]?\d+)\))\}/g; - private applyTempate(template: string, resource: URI, relevantPath: string): string { + private readonly _parsedTemplateExpression = /\$\{(dirname|filename|extname|extname\((?[-+]?\d+)\)|dirname\((?[-+]?\d+)\))\}/g; + private readonly _filenameCaptureExpression = /(?^\.*[^.]*)/; + private applyTemplate(template: string, resource: URI, relevantPath: string): string { let parsedPath: undefined | ParsedPath; - return template.replace(this._parsedTemplateExpression, (match: string, variable: string, arg: string) => { + return template.replace(this._parsedTemplateExpression, (match: string, variable: string, ...args: any[]) => { parsedPath = parsedPath ?? parsePath(resource.path); - switch (variable) { - case 'filename': - return parsedPath.name; - case 'extname': - return parsedPath.ext.slice(1); - default: { // dirname and dirname(arg) - const n = variable === 'dirname' ? 0 : parseInt(arg); - const nthDir = this.getNthDirname(dirname(relevantPath), n); - if (nthDir) { - return nthDir; - } + // named group matches + const { dirnameN = '0', extnameN = '0' }: { dirnameN?: string; extnameN?: string } = args.pop(); + + if (variable === 'filename') { + const { filename } = this._filenameCaptureExpression.exec(parsedPath.base)?.groups ?? {}; + if (filename) { + return filename; + } + } else if (variable === 'extname') { + const extension = this.getExtnames(parsedPath.base); + if (extension) { + return extension; + } + } else if (variable.startsWith('extname')) { + const n = parseInt(extnameN); + const nthExtname = this.getNthExtname(parsedPath.base, n); + if (nthExtname) { + return nthExtname; + } + } else if (variable.startsWith('dirname')) { + const n = parseInt(dirnameN); + const nthDir = this.getNthDirname(dirname(relevantPath), n); + if (nthDir) { + return nthDir; } } @@ -178,12 +192,36 @@ export class CustomEditorLabelService extends Disposable implements ICustomEdito }); } + private removeLeadingDot(path: string): string { + let withoutLeadingDot = path; + while (withoutLeadingDot.startsWith('.')) { + withoutLeadingDot = withoutLeadingDot.slice(1); + } + return withoutLeadingDot; + } + private getNthDirname(path: string, n: number): string | undefined { // grand-parent/parent/filename.ext1.ext2 -> [grand-parent, parent] path = path.startsWith('/') ? path.slice(1) : path; const pathFragments = path.split('/'); - const length = pathFragments.length; + return this.getNthFragment(pathFragments, n); + } + + private getExtnames(fullFileName: string): string { + return this.removeLeadingDot(fullFileName).split('.').slice(1).join('.'); + } + + private getNthExtname(fullFileName: string, n: number): string | undefined { + // file.ext1.ext2.ext3 -> [file, ext1, ext2, ext3] + const extensionNameFragments = this.removeLeadingDot(fullFileName).split('.'); + extensionNameFragments.shift(); // remove the first element which is the file name + + return this.getNthFragment(extensionNameFragments, n); + } + + private getNthFragment(fragments: string[], n: number): string | undefined { + const length = fragments.length; let nth; if (n < 0) { @@ -192,11 +230,11 @@ export class CustomEditorLabelService extends Disposable implements ICustomEdito nth = length - n - 1; } - const nthDir = pathFragments[nth]; - if (nthDir === undefined || nthDir === '') { + const nthFragment = fragments[nth]; + if (nthFragment === undefined || nthFragment === '') { return undefined; } - return nthDir; + return nthFragment; } } diff --git a/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts b/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts new file mode 100644 index 0000000000000..343c70585d76b --- /dev/null +++ b/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts @@ -0,0 +1,234 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert from 'assert'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { CustomEditorLabelService } from 'vs/workbench/services/editor/common/customEditorLabelService'; +import { ITestInstantiationService, TestServiceAccessor, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; + +suite('Custom Editor Label Service', () => { + + const disposables = new DisposableStore(); + + setup(() => { }); + + teardown(async () => { + disposables.clear(); + }); + + ensureNoDisposablesAreLeakedInTestSuite(); + + async function createCustomLabelService(instantiationService: ITestInstantiationService = workbenchInstantiationService(undefined, disposables)): Promise<[CustomEditorLabelService, TestConfigurationService, TestServiceAccessor]> { + const configService = new TestConfigurationService(); + await configService.setUserConfiguration(CustomEditorLabelService.SETTING_ID_ENABLED, true); + instantiationService.stub(IConfigurationService, configService); + + const customLabelService = disposables.add(instantiationService.createInstance(CustomEditorLabelService)); + return [customLabelService, configService, instantiationService.createInstance(TestServiceAccessor)]; + } + + async function updatePattern(configService: TestConfigurationService, value: any): Promise { + await configService.setUserConfiguration(CustomEditorLabelService.SETTING_ID_PATTERNS, value); + configService.onDidChangeConfigurationEmitter.fire({ + affectsConfiguration: (key: string) => key === CustomEditorLabelService.SETTING_ID_PATTERNS, + source: ConfigurationTarget.USER, + affectedKeys: new Set(CustomEditorLabelService.SETTING_ID_PATTERNS), + change: { + keys: [], + overrides: [] + } + }); + } + + test('Custom Labels: filename.extname', async () => { + const [customLabelService, configService] = await createCustomLabelService(); + + await updatePattern(configService, { + '**': '${filename}.${extname}' + }); + + const filenames = [ + 'file.txt', + 'file.txt1.tx2', + '.file.txt', + ]; + + for (const filename of filenames) { + const label = customLabelService.getName(URI.file(filename)); + assert.strictEqual(label, filename); + } + + let label = customLabelService.getName(URI.file('file')); + assert.strictEqual(label, 'file.${extname}'); + + label = customLabelService.getName(URI.file('.file')); + assert.strictEqual(label, '.file.${extname}'); + }); + + test('Custom Labels: filename', async () => { + const [customLabelService, configService] = await createCustomLabelService(); + + await updatePattern(configService, { + '**': '${filename}', + }); + + assert.strictEqual(customLabelService.getName(URI.file('file')), 'file'); + assert.strictEqual(customLabelService.getName(URI.file('file.txt')), 'file'); + assert.strictEqual(customLabelService.getName(URI.file('file.txt1.txt2')), 'file'); + assert.strictEqual(customLabelService.getName(URI.file('folder/file.txt1.txt2')), 'file'); + + assert.strictEqual(customLabelService.getName(URI.file('.file')), '.file'); + assert.strictEqual(customLabelService.getName(URI.file('.file.txt')), '.file'); + assert.strictEqual(customLabelService.getName(URI.file('.file.txt1.txt2')), '.file'); + assert.strictEqual(customLabelService.getName(URI.file('folder/.file.txt1.txt2')), '.file'); + }); + + test('Custom Labels: extname(N)', async () => { + const [customLabelService, configService] = await createCustomLabelService(); + + await updatePattern(configService, { + '**/ext/**': '${extname}', + '**/ext0/**': '${extname(0)}', + '**/ext1/**': '${extname(1)}', + '**/ext2/**': '${extname(2)}', + '**/extMinus1/**': '${extname(-1)}', + '**/extMinus2/**': '${extname(-2)}', + }); + + interface IExt { + extname?: string; + ext0?: string; + ext1?: string; + ext2?: string; + extMinus1?: string; + extMinus2?: string; + } + + function assertExtname(filename: string, ext: IExt): void { + assert.strictEqual(customLabelService.getName(URI.file(`test/ext/${filename}`)), ext.extname ?? '${extname}', filename); + assert.strictEqual(customLabelService.getName(URI.file(`test/ext0/${filename}`)), ext.ext0 ?? '${extname(0)}', filename); + assert.strictEqual(customLabelService.getName(URI.file(`test/ext1/${filename}`)), ext.ext1 ?? '${extname(1)}', filename); + assert.strictEqual(customLabelService.getName(URI.file(`test/ext2/${filename}`)), ext.ext2 ?? '${extname(2)}', filename); + assert.strictEqual(customLabelService.getName(URI.file(`test/extMinus1/${filename}`)), ext.extMinus1 ?? '${extname(-1)}', filename); + assert.strictEqual(customLabelService.getName(URI.file(`test/extMinus2/${filename}`)), ext.extMinus2 ?? '${extname(-2)}', filename); + } + + assertExtname('file.txt', { + extname: 'txt', + ext0: 'txt', + extMinus1: 'txt', + }); + + assertExtname('file.txt1.txt2', { + extname: 'txt1.txt2', + ext0: 'txt2', + ext1: 'txt1', + extMinus1: 'txt1', + extMinus2: 'txt2', + }); + + assertExtname('.file.txt1.txt2', { + extname: 'txt1.txt2', + ext0: 'txt2', + ext1: 'txt1', + extMinus1: 'txt1', + extMinus2: 'txt2', + }); + + assertExtname('.file.txt1.txt2.txt3.txt4', { + extname: 'txt1.txt2.txt3.txt4', + ext0: 'txt4', + ext1: 'txt3', + ext2: 'txt2', + extMinus1: 'txt1', + extMinus2: 'txt2', + }); + + assertExtname('file', {}); + assertExtname('.file', {}); + }); + + test('Custom Labels: dirname(N)', async () => { + const [customLabelService, configService] = await createCustomLabelService(); + + await updatePattern(configService, { + '**': '${dirname},${dirname(0)},${dirname(1)},${dirname(2)},${dirname(-1)},${dirname(-2)}', + }); + + interface IDir { + dirname?: string; + dir0?: string; + dir1?: string; + dir2?: string; + dirMinus1?: string; + dirMinus2?: string; + } + + function assertDirname(path: string, dir: IDir): void { + assert.strictEqual(customLabelService.getName(URI.file(path))?.split(',')[0], dir.dirname ?? '${dirname}', path); + assert.strictEqual(customLabelService.getName(URI.file(path))?.split(',')[1], dir.dir0 ?? '${dirname(0)}', path); + assert.strictEqual(customLabelService.getName(URI.file(path))?.split(',')[2], dir.dir1 ?? '${dirname(1)}', path); + assert.strictEqual(customLabelService.getName(URI.file(path))?.split(',')[3], dir.dir2 ?? '${dirname(2)}', path); + assert.strictEqual(customLabelService.getName(URI.file(path))?.split(',')[4], dir.dirMinus1 ?? '${dirname(-1)}', path); + assert.strictEqual(customLabelService.getName(URI.file(path))?.split(',')[5], dir.dirMinus2 ?? '${dirname(-2)}', path); + } + + assertDirname('folder/file.txt', { + dirname: 'folder', + dir0: 'folder', + dirMinus1: 'folder', + }); + + assertDirname('root/folder/file.txt', { + dirname: 'folder', + dir0: 'folder', + dir1: 'root', + dirMinus1: 'root', + dirMinus2: 'folder', + }); + + assertDirname('root/.folder/file.txt', { + dirname: '.folder', + dir0: '.folder', + dir1: 'root', + dirMinus1: 'root', + dirMinus2: '.folder', + }); + + assertDirname('root/parent/folder/file.txt', { + dirname: 'folder', + dir0: 'folder', + dir1: 'parent', + dir2: 'root', + dirMinus1: 'root', + dirMinus2: 'parent', + }); + + assertDirname('file.txt', {}); + }); + + test('Custom Labels: no pattern match', async () => { + const [customLabelService, configService] = await createCustomLabelService(); + + await updatePattern(configService, { + '**/folder/**': 'folder', + 'file': 'file', + }); + + assert.strictEqual(customLabelService.getName(URI.file('file')), undefined); + assert.strictEqual(customLabelService.getName(URI.file('file.txt')), undefined); + assert.strictEqual(customLabelService.getName(URI.file('file.txt1.txt2')), undefined); + assert.strictEqual(customLabelService.getName(URI.file('folder1/file.txt1.txt2')), undefined); + + assert.strictEqual(customLabelService.getName(URI.file('.file')), undefined); + assert.strictEqual(customLabelService.getName(URI.file('.file.txt')), undefined); + assert.strictEqual(customLabelService.getName(URI.file('.file.txt1.txt2')), undefined); + assert.strictEqual(customLabelService.getName(URI.file('folder1/file.txt1.txt2')), undefined); + }); +}); From 6f013bf1a027ae5b6792621800e9d1e82d7fde6b Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:19:38 -0700 Subject: [PATCH 380/755] Tweak method and make comments smaller --- .../links/browser/terminalLinkOpeners.ts | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts index 6ed6a59d409b0..f021a32d23e0b 100644 --- a/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts +++ b/src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkOpeners.ts @@ -104,28 +104,19 @@ export class TerminalSearchLinkOpener implements ITerminalLinkOpener { text = osPath.normalize(text).replace(/^(\.+[\\/])+/, ''); // Try extract any trailing line and column numbers by matching the text against parsed - // links. For example if there is a line containing `"foo", line 10` and the user - // clicks 'foo', then `link.text` will be "foo" and not have any line number. - // We can detect links in the line, which will give a `parsedLink` whose `path.text` - // is also "foo" but it will also include the line number. We can take - // that line number and send the link to quick pick with `foo:10` as the contents. + // links. This will give a search link `foo` on a line like `"foo", line 10` to open the + // quick pick with `foo:10` as the contents. + // + // This also normalizes the path to remove suffixes like :10 or :5.0-4 if (link.contextLine) { const parsedLinks = detectLinks(link.contextLine, this._getOS()); - // At this point `link.text` may be something like `src/foo.ext:5.0-4`, whereas - // the `parsedLink.path.text` would be `src/foo.ext`. We need to strip the - // link/column numbers so that we can find the matching detected link in the line. - const linkTextWithoutLineNumbers = link.text.replace(/:[\d\.,-]*$/, ''); - const matchingParsedLink = parsedLinks.find(parsedLink => parsedLink.suffix && linkTextWithoutLineNumbers === parsedLink.path.text); + // Optimistically check that the link _starts with_ the parsed link text. If so, + // continue to use the parsed link + const matchingParsedLink = parsedLinks.find(parsedLink => parsedLink.suffix && link.text.startsWith(parsedLink.path.text)); if (matchingParsedLink) { if (matchingParsedLink.suffix?.row !== undefined) { - // The detected link has line & maybe column numbers extracted. Replace - // any that may have been present in `link` with the detected - // ones. So for example `src/foo.ext:5.0-4` would be stripped - // to `src/foo.ext` and then extended to `src/foo.ext:5:0` which - // the quick picker understands. - const numStrip = link.text.length - linkTextWithoutLineNumbers.length; - text = text.slice(0, text.length - numStrip); - + // Normalize the path based on the parsed link + text = matchingParsedLink.path.text; text += `:${matchingParsedLink.suffix.row}`; if (matchingParsedLink.suffix?.col !== undefined) { text += `:${matchingParsedLink.suffix.col}`; From e820af9c4cdbd3a0e585bc6770e560d334a0694b Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 20 Jun 2024 18:48:01 +0200 Subject: [PATCH 381/755] Comment Thread API: Newly created comment threads no longer auto-focus (#216732) Fixes #214661 --- src/vs/workbench/contrib/comments/browser/commentReply.ts | 2 +- .../workbench/contrib/comments/browser/commentsController.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentReply.ts b/src/vs/workbench/contrib/comments/browser/commentReply.ts index bf0506f3b01a9..3868281f8e518 100644 --- a/src/vs/workbench/contrib/comments/browser/commentReply.ts +++ b/src/vs/workbench/contrib/comments/browser/commentReply.ts @@ -121,7 +121,7 @@ export class CommentReply extends Disposable { this.expandReplyArea(); } else if (hasExistingComments) { this.createReplyButton(this.commentEditor, this.form); - } else if (focus && (this._commentThread.comments && this._commentThread.comments.length === 0)) { + } else if (focus && (!this._commentThread.comments || this._commentThread.comments.length === 0)) { this.expandReplyArea(); } this._error = dom.append(this.form, dom.$('.validation-error.hidden')); diff --git a/src/vs/workbench/contrib/comments/browser/commentsController.ts b/src/vs/workbench/contrib/comments/browser/commentsController.ts index 8f60630a00ef1..09aeddd25e6a0 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsController.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsController.ts @@ -869,7 +869,8 @@ export class CommentController implements IEditorContribution { const pendingCommentText = (this._pendingNewCommentCache[uniqueOwner] && this._pendingNewCommentCache[uniqueOwner][thread.threadId]) ?? continueOnCommentText; const pendingEdits = this._pendingEditsCache[uniqueOwner] && this._pendingEditsCache[uniqueOwner][thread.threadId]; - const shouldReveal = thread.canReply && thread.isTemplate && (!thread.comments || (thread.comments.length === 0)) && (!thread.editorId || (thread.editorId === editorId)); + const isThreadTemplateOrEmpty = (thread.isTemplate || (!thread.comments || (thread.comments.length === 0))); + const shouldReveal = thread.canReply && isThreadTemplateOrEmpty && (!thread.editorId || (thread.editorId === editorId)); await this.displayCommentThread(uniqueOwner, thread, shouldReveal, pendingCommentText, pendingEdits); this._commentInfos.filter(info => info.uniqueOwner === uniqueOwner)[0].threads.push(thread); this.tryUpdateReservedSpace(); From d6dcdf99c0f777d86cb6305ed7d7c474d2a6a001 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:58:13 -0700 Subject: [PATCH 382/755] Fix terminal sticky scroll on HC themes Fixes #216729 --- build/lib/stylelint/vscode-known-variables.json | 1 + .../stickyScroll/browser/media/stickyScroll.css | 1 + .../browser/terminalStickyScrollColorRegistry.ts | 12 +++++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index df6945112f617..9921547a9980e 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -714,6 +714,7 @@ "--vscode-terminalOverviewRuler-cursorForeground", "--vscode-terminalOverviewRuler-findMatchForeground", "--vscode-terminalStickyScroll-background", + "--vscode-terminalStickyScroll-border", "--vscode-terminalStickyScrollHover-background", "--vscode-testing-coverCountBadgeBackground", "--vscode-testing-coverCountBadgeForeground", diff --git a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/media/stickyScroll.css b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/media/stickyScroll.css index bc8e99fb00fc5..9f88f2757dbfa 100644 --- a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/media/stickyScroll.css +++ b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/media/stickyScroll.css @@ -11,6 +11,7 @@ z-index: 32; /* Must be higher than .xterm-viewport and decorations */ background: var(--vscode-terminalStickyScroll-background, var(--vscode-terminal-background, var(--vscode-panel-background))); box-shadow: var(--vscode-scrollbar-shadow) 0 3px 2px -2px; + border-bottom: 1px solid var(--vscode-terminalStickyScroll-border, transparent); } .part.sidebar .terminal-sticky-scroll, .part.auxiliarybar .terminal-sticky-scroll { diff --git a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts index 5ab1af0d0eb3c..bc18c7db09379 100644 --- a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts +++ b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Color } from 'vs/base/common/color'; import { localize } from 'vs/nls'; import { registerColor } from 'vs/platform/theme/common/colorUtils'; @@ -17,6 +16,13 @@ export const terminalStickyScrollBackground = registerColor('terminalStickyScrol export const terminalStickyScrollHoverBackground = registerColor('terminalStickyScrollHover.background', { dark: '#2A2D2E', light: '#F0F0F0', - hcDark: null, - hcLight: Color.fromHex('#0F4A85').transparent(0.1) + hcDark: '#E48B39', + hcLight: '#0f4a85' }, localize('terminalStickyScrollHover.background', 'The background color of the sticky scroll overlay in the terminal when hovered.')); + +registerColor('terminalStickyScroll.border', { + dark: null, + light: null, + hcDark: '#6fc3df', + hcLight: '#0f4a85' +}, localize('terminalStickyScroll.border', 'The border of the sticky scroll overlay in the terminal.')); From 05d0e6cd7ea5a982dc9707a73d75774a2cdd5c6e Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:35:11 -0700 Subject: [PATCH 383/755] Use fixed positioning for terminal suggest Fixes #211306 --- .../suggest/browser/terminalSuggestAddon.ts | 10 ++++------ .../services/suggest/browser/media/suggest.css | 3 +-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts index 740bc06c77122..cd52628b6dc99 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts @@ -220,11 +220,10 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest } // TODO: What do frozen and auto do? const xtermBox = this._screen!.getBoundingClientRect(); - const panelBox = this._panel!.offsetParent!.getBoundingClientRect(); this._suggestWidget.showSuggestions(0, false, false, { - left: (xtermBox.left - panelBox.left) + this._terminal.buffer.active.cursorX * dimensions.width, - top: (xtermBox.top - panelBox.top) + this._terminal.buffer.active.cursorY * dimensions.height, + left: xtermBox.left + this._terminal.buffer.active.cursorX * dimensions.width, + top: xtermBox.top + this._terminal.buffer.active.cursorY * dimensions.height, height: dimensions.height }); } @@ -435,7 +434,6 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest } // TODO: What do frozen and auto do? const xtermBox = this._screen!.getBoundingClientRect(); - const panelBox = this._panel!.offsetParent!.getBoundingClientRect(); this._initialPromptInputState = { value: this._promptInputModel.value, cursorIndex: this._promptInputModel.cursorIndex, @@ -443,8 +441,8 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest }; suggestWidget.setCompletionModel(model); suggestWidget.showSuggestions(0, false, false, { - left: (xtermBox.left - panelBox.left) + this._terminal.buffer.active.cursorX * dimensions.width, - top: (xtermBox.top - panelBox.top) + this._terminal.buffer.active.cursorY * dimensions.height, + left: xtermBox.left + this._terminal.buffer.active.cursorX * dimensions.width, + top: xtermBox.top + this._terminal.buffer.active.cursorY * dimensions.height, height: dimensions.height }); } diff --git a/src/vs/workbench/services/suggest/browser/media/suggest.css b/src/vs/workbench/services/suggest/browser/media/suggest.css index cf39f56b81602..b540839efa3cc 100644 --- a/src/vs/workbench/services/suggest/browser/media/suggest.css +++ b/src/vs/workbench/services/suggest/browser/media/suggest.css @@ -8,9 +8,8 @@ * layer breakers and shipping with the standalone monaco editor. */ -/* TODO: Position correctly */ .workbench-suggest-widget { - position: absolute; + position: fixed; left: 0; top: 0; } From 9a56f75db6b206881f7b56ec2102561b4eed4e34 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 20 Jun 2024 19:46:23 +0200 Subject: [PATCH 384/755] update distro (#216733) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 73ae52dd69abe..4bc1bf1385782 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "361fc45f5932b161db29080d5b19bc5afb9baae6", + "distro": "951ec3be152d660cf34920fc3d734d32691bd880", "author": { "name": "Microsoft Corporation" }, @@ -229,4 +229,4 @@ "optionalDependencies": { "windows-foreground-love": "0.5.0" } -} +} \ No newline at end of file From f08ce27b02b2bf7ae9b3e16afcc9dd125808617d Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 20 Jun 2024 11:13:53 -0700 Subject: [PATCH 385/755] Add activation event for languageModelTools (#216742) --- .../contrib/chat/browser/chat.contribution.ts | 2 +- .../chat/common/languageModelToolsService.ts | 23 +++++++++++++++---- ...s.ts => languageModelToolsContribution.ts} | 5 ++++ .../extensions/common/extensionsRegistry.ts | 10 ++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) rename src/vs/workbench/contrib/chat/common/tools/{toolsContributions.ts => languageModelToolsContribution.ts} (94%) diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index f6c0a8b70bf14..4937c6afbfd6d 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -60,7 +60,7 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import '../common/chatColors'; import { registerChatContextActions } from 'vs/workbench/contrib/chat/browser/actions/chatContextActions'; import { registerChatDeveloperActions } from 'vs/workbench/contrib/chat/browser/actions/chatDeveloperActions'; -import { LanguageModelToolsExtensionPointHandler } from 'vs/workbench/contrib/chat/common/tools/toolsContributions'; +import { LanguageModelToolsExtensionPointHandler } from 'vs/workbench/contrib/chat/common/tools/languageModelToolsContribution'; // Register configuration const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); diff --git a/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts b/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts index 910ddb2dc52f4..a498aff934656 100644 --- a/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts +++ b/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts @@ -8,6 +8,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Iterable } from 'vs/base/common/iterator'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export interface IToolData { id: string; @@ -49,6 +50,10 @@ export class LanguageModelToolsService implements ILanguageModelToolsService { private _tools = new Map(); + constructor( + @IExtensionService private readonly _extensionService: IExtensionService + ) { } + registerToolData(toolData: IToolData): IDisposable { if (this._tools.has(toolData.id)) { throw new Error(`Tool "${toolData.id}" is already registered.`); @@ -84,10 +89,20 @@ export class LanguageModelToolsService implements ILanguageModelToolsService { return Iterable.map(this._tools.values(), i => i.data); } - invokeTool(name: string, parameters: any, token: CancellationToken): Promise { - const tool = this._tools.get(name); - if (!tool?.impl) { - throw new Error(`Tool ${name} not found`); + async invokeTool(name: string, parameters: any, token: CancellationToken): Promise { + let tool = this._tools.get(name); + if (!tool) { + throw new Error(`Tool ${name} was not contributed`); + } + + if (!tool.impl) { + await this._extensionService.activateByEvent(`onLanguageModelTool:${name}`); + + // Extension should activate and register the tool implementation + tool = this._tools.get(name); + if (!tool?.impl) { + throw new Error(`Tool ${name} does not have an implementation registered.`); + } } return tool.impl.invoke(parameters, token); diff --git a/src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts b/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts similarity index 94% rename from src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts rename to src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts index 619a491b809dd..f75f30ff1c296 100644 --- a/src/vs/workbench/contrib/chat/common/tools/toolsContributions.ts +++ b/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts @@ -21,6 +21,11 @@ interface IRawToolContribution { const languageModelToolsExtensionPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint({ extensionPoint: 'languageModelTools', + activationEventsGenerator: (contributions: IRawToolContribution[], result) => { + for (const contrib of contributions) { + result.push(`onLanguageModelTool:${contrib.id}`); + } + }, jsonSchema: { description: localize('vscode.extension.contributes.tools', 'Contributes a tool that can be invoked by a language model.'), type: 'array', diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index 93951fbae70e1..b5ef3e6c9d593 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -385,6 +385,16 @@ export const schema: IJSONSchema = { body: 'onIssueReporterOpened', description: nls.localize('vscode.extension.activationEvents.onIssueReporterOpened', 'An activation event emitted when the issue reporter is opened.'), }, + { + label: 'onChatParticipant', + body: 'onChatParticipant:${1:participantId}', + description: nls.localize('vscode.extension.activationEvents.onChatParticipant', 'An activation event emitted when the specified chat participant is invoked.'), + }, + { + label: 'onLanguageModelTool', + body: 'onLanguageModelTool:${1:toolName}', + description: nls.localize('vscode.extension.activationEvents.onLanguageModelTool', 'An activation event emitted when the specified language model tool is invoked.'), + }, { label: '*', description: nls.localize('vscode.extension.activationEvents.star', 'An activation event emitted on VS Code startup. To ensure a great end user experience, please use this activation event in your extension only when no other activation events combination works in your use-case.'), From f4a72d079cb62c13d66ba8c965c05817f186a5f7 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 20 Jun 2024 19:50:47 +0200 Subject: [PATCH 386/755] Observable improvements --- .../base/common/observableInternal/promise.ts | 4 ++ src/vs/editor/browser/observableCodeEditor.ts | 57 +++++++++++++++++-- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/observableInternal/promise.ts b/src/vs/base/common/observableInternal/promise.ts index f405033bfc1cf..80d269c16bd2c 100644 --- a/src/vs/base/common/observableInternal/promise.ts +++ b/src/vs/base/common/observableInternal/promise.ts @@ -40,6 +40,10 @@ export class ObservableLazy { * A promise whose state is observable. */ export class ObservablePromise { + public static fromFn(fn: () => Promise): ObservablePromise { + return new ObservablePromise(fn()); + } + private readonly _value = observableValue | undefined>(this, undefined); /** diff --git a/src/vs/editor/browser/observableCodeEditor.ts b/src/vs/editor/browser/observableCodeEditor.ts index 0eeff056c052a..195aee2cf4fa0 100644 --- a/src/vs/editor/browser/observableCodeEditor.ts +++ b/src/vs/editor/browser/observableCodeEditor.ts @@ -4,10 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { equalsIfDefined, itemsEquals } from 'vs/base/common/equals'; -import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; -import { IObservable, ITransaction, autorunOpts, autorunWithStoreHandleChanges, derived, derivedOpts, observableFromEvent, observableSignal, observableValue, observableValueOpts } from 'vs/base/common/observable'; +import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IObservable, ITransaction, autorun, autorunOpts, autorunWithStoreHandleChanges, derived, derivedOpts, observableFromEvent, observableSignal, observableValue, observableValueOpts } from 'vs/base/common/observable'; import { TransactionImpl } from 'vs/base/common/observableInternal/base'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { derivedWithSetter } from 'vs/base/common/observableInternal/derived'; +import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { EditorOption, FindComputedEditorOptionValueById } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; @@ -168,12 +169,30 @@ export class ObservableCodeEditor extends Disposable { }; }, () => this.editor.hasWidgetFocus()); - public readonly value = derived(this, reader => { this.versionId.read(reader); return this.model.read(reader)?.getValue(); }); + public readonly value = derivedWithSetter(this, + reader => { this.versionId.read(reader); return this.model.read(reader)?.getValue() ?? ''; }, + (value, tx) => { + const model = this.model.get(); + if (model !== null) { + if (value !== model.getValue()) { + model.setValue(value); + } + } + } + ); public readonly valueIsEmpty = derived(this, reader => { this.versionId.read(reader); return this.editor.getModel()?.getValueLength() === 0; }); + public readonly cursorSelection = derivedOpts({ owner: this, equalsFn: equalsIfDefined(Selection.selectionsEqual) }, reader => this.selections.read(reader)?.[0] ?? null); public readonly cursorPosition = derivedOpts({ owner: this, equalsFn: Position.equals }, reader => this.selections.read(reader)?.[0]?.getPosition() ?? null); public readonly onDidType = observableSignal(this); + public readonly scrollTop = observableFromEvent(this.editor.onDidScrollChange, () => this.editor.getScrollTop()); + public readonly scrollLeft = observableFromEvent(this.editor.onDidScrollChange, () => this.editor.getScrollLeft()); + + public readonly layoutInfo = observableFromEvent(this.editor.onDidLayoutChange, () => this.editor.getLayoutInfo()); + + public readonly contentWidth = observableFromEvent(this.editor.onDidContentSizeChange, () => this.editor.getContentWidth()); + public getOption(id: T): IObservable> { return observableFromEvent(this, cb => this.editor.onDidChangeConfiguration(e => { if (e.hasChanged(id)) { cb(undefined); } @@ -194,6 +213,36 @@ export class ObservableCodeEditor extends Disposable { }); return d; } + + private _overlayWidgetCounter = 0; + + public createOverlayWidget(widget: IObservableOverlayWidget): IDisposable { + const overlayWidgetId = 'observableOverlayWidget' + (this._overlayWidgetCounter++); + const w: IOverlayWidget = { + getDomNode: () => widget.domNode, + getPosition: () => widget.position.get(), + getId: () => overlayWidgetId, + allowEditorOverflow: widget.allowEditorOverflow, + getMinContentWidthInPx: () => widget.minContentWidthInPx.get(), + }; + this.editor.addOverlayWidget(w); + const d = autorun(reader => { + widget.position.read(reader); + widget.minContentWidthInPx.read(reader); + this.editor.layoutOverlayWidget(w); + }); + return toDisposable(() => { + d.dispose(); + this.editor.removeOverlayWidget(w); + }); + } +} + +interface IObservableOverlayWidget { + get domNode(): HTMLElement; + readonly position: IObservable; + readonly minContentWidthInPx: IObservable; + get allowEditorOverflow(): boolean; } type RemoveUndefined = T extends undefined ? never : T; From 2fb5b16a23ff292e7d0777b0eeadd74ba767cc28 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 20 Jun 2024 19:53:38 +0200 Subject: [PATCH 387/755] Sets default placeholderText color --- .../editor/contrib/placeholderText/browser/placeholderText.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderText.css b/src/vs/editor/contrib/placeholderText/browser/placeholderText.css index 65843a23be784..3912e17fc2f67 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderText.css +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.css @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor { - --vscode-editor-placeholder-foreground: rgba(0, 0, 0, 0.5); + --vscode-editor-placeholder-foreground: var(--vscode-editorGhostText-foreground); } .monaco-editor .placeholder-text { From fae9ee17dd825c1a94811e781d7511029a3e511d Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 20 Jun 2024 20:33:25 +0200 Subject: [PATCH 388/755] SCM - do not show a single commit in the history (#216748) --- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 494fa00971296..6d579939f681d 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -3808,8 +3808,8 @@ class SCMTreeDataSource implements IAsyncDataSource 0) { - const label = localize('historySeparatorHeader', "History"); - const ariaLabel = localize('historySeparatorHeaderAriaLabel', "History"); + const label = localize('syncSeparatorHeader', "Incoming/Outgoing"); + const ariaLabel = localize('syncSeparatorHeaderAriaLabel', "Incoming and outgoing changes"); children.push({ label, ariaLabel, repository: inputOrElement, type: 'separator' } satisfies SCMViewSeparatorElement); } @@ -4000,6 +4000,13 @@ class SCMTreeDataSource implements IAsyncDataSource l.title === currentHistoryItemGroup.name)) { + return []; + } + // Create the color map // TODO@lszomoru - use theme colors const colorMap = new Map([ From e6c0d8285325a9e1f5558d0ecf0ee6355ee07c5c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 20 Jun 2024 21:45:53 +0200 Subject: [PATCH 389/755] watcher - await `parcel.subscribe` (#216751) --- .../node/watcher/parcel/parcelWatcher.ts | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts b/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts index afabd7aed1271..46d213c12e8da 100644 --- a/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts +++ b/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts @@ -226,7 +226,7 @@ export class ParcelWatcher extends BaseWatcher implements IRecursiveWatcherWithS if (request.pollingInterval) { this.startPolling(request, request.pollingInterval); } else { - this.startWatching(request); + await this.startWatching(request); } } } @@ -322,7 +322,7 @@ export class ParcelWatcher extends BaseWatcher implements IRecursiveWatcherWithS pollingWatcher.schedule(0); } - private startWatching(request: IRecursiveWatchRequest, restarts = 0): void { + private async startWatching(request: IRecursiveWatchRequest, restarts = 0): Promise { const cts = new CancellationTokenSource(); const instance = new DeferredPromise(); @@ -349,36 +349,38 @@ export class ParcelWatcher extends BaseWatcher implements IRecursiveWatcherWithS // Path checks for symbolic links / wrong casing const { realPath, realPathDiffers, realPathLength } = this.normalizePath(request); - parcelWatcher.subscribe(realPath, (error, parcelEvents) => { - if (watcher.token.isCancellationRequested) { - return; // return early when disposed - } + try { + const parcelWatcherInstance = await parcelWatcher.subscribe(realPath, (error, parcelEvents) => { + if (watcher.token.isCancellationRequested) { + return; // return early when disposed + } - // In any case of an error, treat this like a unhandled exception - // that might require the watcher to restart. We do not really know - // the state of parcel at this point and as such will try to restart - // up to our maximum of restarts. - if (error) { - this.onUnexpectedError(error, request); - } + // In any case of an error, treat this like a unhandled exception + // that might require the watcher to restart. We do not really know + // the state of parcel at this point and as such will try to restart + // up to our maximum of restarts. + if (error) { + this.onUnexpectedError(error, request); + } + + // Handle & emit events + this.onParcelEvents(parcelEvents, watcher, realPathDiffers, realPathLength); + }, { + backend: ParcelWatcher.PARCEL_WATCHER_BACKEND, + ignore: watcher.request.excludes + }); - // Handle & emit events - this.onParcelEvents(parcelEvents, watcher, realPathDiffers, realPathLength); - }, { - backend: ParcelWatcher.PARCEL_WATCHER_BACKEND, - ignore: watcher.request.excludes - }).then(parcelWatcher => { this.trace(`Started watching: '${realPath}' with backend '${ParcelWatcher.PARCEL_WATCHER_BACKEND}'`); - instance.complete(parcelWatcher); - }).catch(error => { + instance.complete(parcelWatcherInstance); + } catch (error) { this.onUnexpectedError(error, request); instance.complete(undefined); watcher.notifyWatchFailed(); this._onDidWatchFail.fire(request); - }); + } } private onParcelEvents(parcelEvents: parcelWatcher.Event[], watcher: ParcelWatcherInstance, realPathDiffers: boolean, realPathLength: number): void { @@ -662,7 +664,7 @@ export class ParcelWatcher extends BaseWatcher implements IRecursiveWatcherWithS if (watcher.request.pollingInterval) { this.startPolling(watcher.request, watcher.request.pollingInterval, watcher.restarts + 1); } else { - this.startWatching(watcher.request, watcher.restarts + 1); + await this.startWatching(watcher.request, watcher.restarts + 1); } } finally { restartPromise.complete(); From 34899a76086b1e489c9faca002e08c14e554e4b6 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 20 Jun 2024 22:00:07 +0200 Subject: [PATCH 390/755] Fixes observable leak --- .../base/common/observableInternal/derived.ts | 15 +++++++-- src/vs/base/test/common/observable.test.ts | 31 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/observableInternal/derived.ts b/src/vs/base/common/observableInternal/derived.ts index f0666517256dd..8de22247dbfbe 100644 --- a/src/vs/base/common/observableInternal/derived.ts +++ b/src/vs/base/common/observableInternal/derived.ts @@ -140,11 +140,15 @@ export function derivedDisposable(computeFnOr computeFn = computeFnOrUndefined as any; } - const store = new DisposableStore(); + let store: DisposableStore | undefined = undefined; return new Derived( new DebugNameData(owner, undefined, computeFn), r => { - store.clear(); + if (!store) { + store = new DisposableStore(); + } else { + store.clear(); + } const result = computeFn(r); if (result) { store.add(result); @@ -152,7 +156,12 @@ export function derivedDisposable(computeFnOr return result; }, undefined, undefined, - () => store.dispose(), + () => { + if (store) { + store.dispose(); + store = undefined; + } + }, strictEquals ); } diff --git a/src/vs/base/test/common/observable.test.ts b/src/vs/base/test/common/observable.test.ts index 411d4c64ea528..62c7579be128a 100644 --- a/src/vs/base/test/common/observable.test.ts +++ b/src/vs/base/test/common/observable.test.ts @@ -5,8 +5,10 @@ import assert from 'assert'; import { Emitter, Event } from 'vs/base/common/event'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ISettableObservable, autorun, derived, ITransaction, observableFromEvent, observableValue, transaction, keepObserved, waitForState, autorunHandleChanges, observableSignal } from 'vs/base/common/observable'; import { BaseObservable, IObservable, IObserver } from 'vs/base/common/observableInternal/base'; +import { derivedDisposable } from 'vs/base/common/observableInternal/derived'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; suite('observables', () => { @@ -1236,6 +1238,35 @@ suite('observables', () => { 'rejected {\"state\":\"error\"}' ]); }); + + test('derived as lazy', () => { + const store = new DisposableStore(); + const log = new Log(); + let i = 0; + const d = derivedDisposable(() => { + const id = i++; + log.log('myDerived ' + id); + return { + dispose: () => log.log(`disposed ${id}`) + }; + }); + + d.get(); + assert.deepStrictEqual(log.getAndClearEntries(), ['myDerived 0', 'disposed 0']); + d.get(); + assert.deepStrictEqual(log.getAndClearEntries(), ['myDerived 1', 'disposed 1']); + + d.keepObserved(store); + assert.deepStrictEqual(log.getAndClearEntries(), []); + d.get(); + assert.deepStrictEqual(log.getAndClearEntries(), ['myDerived 2']); + d.get(); + assert.deepStrictEqual(log.getAndClearEntries(), []); + + store.dispose(); + + assert.deepStrictEqual(log.getAndClearEntries(), ['disposed 2']); + }); }); test('observableValue', () => { From d6ffb9f68a653e2ca025da72a7d24a5d83847c89 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:16:57 -0700 Subject: [PATCH 391/755] chore: append SDL scan to main build pipeline (#215598) --- build/azure-pipelines/product-build.yml | 12 + build/azure-pipelines/sdl-scan.yml | 433 ++++++++---------------- 2 files changed, 156 insertions(+), 289 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 5f6eb230cda0c..5357697484eb9 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -315,6 +315,18 @@ extends: VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} VSCODE_BUILD_WIN32_ARM64: ${{ parameters.VSCODE_BUILD_WIN32_ARM64 }} + - stage: CustomSDL + dependsOn: [] + pool: + name: 1es-windows-2019-x64 + os: windows + jobs: + - job: WindowsSDL + variables: + - group: 'API Scan' + steps: + - template: build/azure-pipelines/sdl-scan.yml@self + - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true)) }}: - stage: Windows dependsOn: diff --git a/build/azure-pipelines/sdl-scan.yml b/build/azure-pipelines/sdl-scan.yml index 927cd5e04ae68..6be5f0ad95dbb 100644 --- a/build/azure-pipelines/sdl-scan.yml +++ b/build/azure-pipelines/sdl-scan.yml @@ -1,296 +1,151 @@ -trigger: none -pr: none - parameters: - name: NPM_REGISTRY displayName: "Custom NPM Registry" type: string default: "https://pkgs.dev.azure.com/monacotools/Monaco/_packaging/vscode/npm/registry/" - - name: SCAN_WINDOWS - displayName: "Scan Windows" - type: boolean - default: true - - name: SCAN_LINUX - displayName: "Scan Linux" - type: boolean - default: false - -variables: - - name: NPM_REGISTRY - value: ${{ parameters.NPM_REGISTRY }} - - name: SCAN_WINDOWS - value: ${{ eq(parameters.SCAN_WINDOWS, true) }} - - name: SCAN_LINUX - value: ${{ eq(parameters.SCAN_LINUX, true) }} - - name: VSCODE_MIXIN_REPO - value: microsoft/vscode-distro - - name: skipComponentGovernanceDetection - value: true - name: NPM_ARCH - value: x64 + type: string + default: x64 - name: VSCODE_ARCH - value: x64 - - name: Codeql.enabled - value: true - - name: Codeql.TSAEnabled - value: true - - name: Codeql.TSAOptionsPath - value: '$(Build.SourcesDirectory)\build\azure-pipelines\config\tsaoptions.json' - -stages: - - stage: Windows - condition: eq(variables.SCAN_WINDOWS, 'true') - pool: 1es-windows-2019-x64 - jobs: - - job: WindowsJob - timeoutInMinutes: 0 - steps: - - task: CredScan@3 - continueOnError: true - inputs: - scanFolder: "$(Build.SourcesDirectory)" - outputFormat: "pre" - - - task: NodeTool@0 - inputs: - versionSource: fromFile - versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - - - template: ./distro/download-distro.yml - - - task: AzureKeyVault@1 - displayName: "Azure Key Vault: Get Secrets" - inputs: - azureSubscription: "vscode-builds-subscription" - KeyVaultName: vscode-build-secrets - SecretsFilter: "github-distro-mixin-password" - - - powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { npm config set registry "$env:NPM_REGISTRY" --location=project } - # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb - # following is a workaround for yarn to send authorization header - # for GET requests to the registry. - exec { Add-Content -Path .npmrc -Value "always-auth=true" } - exec { yarn config set registry "$env:NPM_REGISTRY" } - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM & Yarn - - - task: npmAuthenticate@0 - inputs: - workingFile: .npmrc - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM Authentication - - - powershell: | - . build/azure-pipelines/win32/exec.ps1 - $ErrorActionPreference = "Stop" - exec { node build/setup-npm-registry.js $env:NPM_REGISTRY } - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM Registry - - - task: CodeQL3000Init@0 - displayName: CodeQL Initialize - condition: eq(variables['Codeql.enabled'], 'True') - - - powershell: | - . build/azure-pipelines/win32/exec.ps1 - . build/azure-pipelines/win32/retry.ps1 - $ErrorActionPreference = "Stop" - # TODO: remove custom node-gyp when updating to Node v20, - # refs https://github.com/npm/cli/releases/tag/v10.2.3 which is available with Node >= 20.10.0 - $nodeGypDir = "$(Agent.TempDirectory)/custom-packages" - mkdir "$nodeGypDir" - npm install node-gyp@10.0.1 -g --prefix "$nodeGypDir" - $env:npm_config_node_gyp = "${nodeGypDir}/node_modules/node-gyp/bin/node-gyp.js" - $env:npm_config_arch = "$(NPM_ARCH)" - retry { exec { yarn --frozen-lockfile --check-files } } - env: - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 - GITHUB_TOKEN: "$(github-distro-mixin-password)" - CHILD_CONCURRENCY: 1 - displayName: Install dependencies - - - script: node build/azure-pipelines/distro/mixin-npm - displayName: Mixin distro node modules - - - script: node build/azure-pipelines/distro/mixin-quality - displayName: Mixin distro quality - env: - VSCODE_QUALITY: stable - - - powershell: yarn compile - displayName: Compile - - - task: CodeQL3000Finalize@0 - displayName: CodeQL Finalize - condition: eq(variables['Codeql.enabled'], 'True') - - - powershell: yarn gulp "vscode-symbols-win32-$(VSCODE_ARCH)" - env: - GITHUB_TOKEN: "$(github-distro-mixin-password)" - displayName: Download Symbols - - - task: PSScriptAnalyzer@1 - inputs: - Path: '$(Build.SourcesDirectory)' - Settings: required - Recurse: true - - - task: BinSkim@4 - inputs: - InputType: "Basic" - Function: "analyze" - TargetPattern: "guardianGlob" - AnalyzeIgnorePdbLoadError: true - AnalyzeTargetGlob: '$(agent.builddirectory)\scanbin\**.dll;$(agent.builddirectory)\scanbin\**.exe;$(agent.builddirectory)\scanbin\**.node' - AnalyzeLocalSymbolDirectories: '$(agent.builddirectory)\scanbin\VSCode-win32-$(VSCODE_ARCH)\pdb' - - - task: AntiMalware@4 - inputs: - InputType: Basic - ScanType: CustomScan - FileDirPath: '$(Build.SourcesDirectory)' - EnableServices: true - SupportLogOnError: false - TreatSignatureUpdateFailureAs: 'Warning' - SignatureFreshness: 'OneDay' - TreatStaleSignatureAs: 'Error' - - - task: PublishSecurityAnalysisLogs@3 - inputs: - ArtifactName: CodeAnalysisLogs - ArtifactType: Container - PublishProcessedResults: false - AllTools: true - - - task: TSAUpload@2 - inputs: - GdnPublishTsaOnboard: true - GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\build\azure-pipelines\config\tsaoptions.json' - - - stage: Linux - dependsOn: [] - condition: eq(variables.SCAN_LINUX, 'true') - pool: - vmImage: "Ubuntu-18.04" - jobs: - - job: LinuxJob - steps: - - task: CredScan@2 - inputs: - toolMajorVersion: "V2" - - task: NodeTool@0 - inputs: - versionSource: fromFile - versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - - - template: ./distro/download-distro.yml - - - task: AzureKeyVault@1 - displayName: "Azure Key Vault: Get Secrets" - inputs: - azureSubscription: "vscode-builds-subscription" - KeyVaultName: vscode-build-secrets - SecretsFilter: "github-distro-mixin-password" - - - script: | - set -e - npm config set registry "$NPM_REGISTRY" --location=project - # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb - # following is a workaround for yarn to send authorization header - # for GET requests to the registry. - echo "always-auth=true" >> .npmrc - yarn config set registry "$NPM_REGISTRY" - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM & Yarn - - - task: npmAuthenticate@0 - inputs: - workingFile: .npmrc - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM Authentication - - - script: node build/setup-npm-registry.js $NPM_REGISTRY - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM Registry - - - script: | - set -e - for i in {1..5}; do # try 5 times - yarn --cwd build --frozen-lockfile --check-files && break - if [ $i -eq 3 ]; then - echo "Yarn failed too many times" >&2 - exit 1 - fi - echo "Yarn failed $i, trying again..." - done - displayName: Install build dependencies - - - script: | - set -e - export npm_config_arch=$(NPM_ARCH) - - if [ -z "$CC" ] || [ -z "$CXX" ]; then - # Download clang based on chromium revision used by vscode - curl -s https://raw.githubusercontent.com/chromium/chromium/96.0.4664.110/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux - # Download libcxx headers and objects from upstream electron releases - DEBUG=libcxx-fetcher \ - VSCODE_LIBCXX_OBJECTS_DIR=$PWD/.build/libcxx-objects \ - VSCODE_LIBCXX_HEADERS_DIR=$PWD/.build/libcxx_headers \ - VSCODE_LIBCXXABI_HEADERS_DIR=$PWD/.build/libcxxabi_headers \ - VSCODE_ARCH="$(NPM_ARCH)" \ - node build/linux/libcxx-fetcher.js - # Set compiler toolchain - export CC=$PWD/.build/CR_Clang/bin/clang - export CXX=$PWD/.build/CR_Clang/bin/clang++ - export CXXFLAGS="-std=c++17 -nostdinc++ -D__NO_INLINE__ -I$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit -D_LIBCPP_ABI_NAMESPACE=Cr" - export LDFLAGS="-stdlib=libc++ -fuse-ld=lld -flto=thin -fsplit-lto-unit -L$PWD/.build/libcxx-objects -lc++abi" - export VSCODE_REMOTE_CC=$(which gcc) - export VSCODE_REMOTE_CXX=$(which g++) - fi - - for i in {1..5}; do # try 5 times - yarn --frozen-lockfile --check-files && break - if [ $i -eq 3 ]; then - echo "Yarn failed too many times" >&2 - exit 1 - fi - echo "Yarn failed $i, trying again..." - done - env: - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 - GITHUB_TOKEN: "$(github-distro-mixin-password)" - displayName: Install dependencies - - - script: yarn --frozen-lockfile --check-files - workingDirectory: .build/distro/npm - env: - npm_config_arch: $(NPM_ARCH) - displayName: Install distro node modules - - - script: node build/azure-pipelines/distro/mixin-npm - displayName: Mixin distro node modules - - - script: node build/azure-pipelines/distro/mixin-quality - displayName: Mixin distro quality - env: - VSCODE_QUALITY: stable - - - script: yarn gulp vscode-symbols-linux-$(VSCODE_ARCH) - env: - GITHUB_TOKEN: "$(github-distro-mixin-password)" - displayName: Build - - - task: BinSkim@3 - inputs: - toolVersion: Latest - InputType: CommandLine - arguments: analyze $(agent.builddirectory)\scanbin\exe\*.* --recurse --local-symbol-directories $(agent.builddirectory)\scanbin\VSCode-linux-$(VSCODE_ARCH)\pdb - - - task: TSAUpload@2 - inputs: - GdnPublishTsaConfigFile: '$(Build.SourceDirectory)\build\azure-pipelines\config\tsaoptions.json' + type: string + default: x64 + +steps: + - task: NodeTool@0 + inputs: + versionSource: fromFile + versionFilePath: .nvmrc + nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + + - template: ./distro/download-distro.yml + + - task: AzureKeyVault@1 + displayName: "Azure Key Vault: Get Secrets" + inputs: + azureSubscription: "vscode-builds-subscription" + KeyVaultName: vscode-build-secrets + SecretsFilter: "github-distro-mixin-password" + + - powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { npm config set registry "${{ parameters.NPM_REGISTRY }}" --location=project } + # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb + # following is a workaround for yarn to send authorization header + # for GET requests to the registry. + exec { Add-Content -Path .npmrc -Value "always-auth=true" } + exec { yarn config set registry "${{ parameters.NPM_REGISTRY }}" } + condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne('${{ parameters.NPM_REGISTRY }}', 'none')) + displayName: Setup NPM & Yarn + + - task: npmAuthenticate@0 + inputs: + workingFile: .npmrc + condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne('${{ parameters.NPM_REGISTRY }}', 'none')) + displayName: Setup NPM Authentication + + - powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { node build/setup-npm-registry.js "${{ parameters.NPM_REGISTRY }}" } + condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne('${{ parameters.NPM_REGISTRY }}', 'none')) + displayName: Setup NPM Registry + + - pwsh: | + $includes = @' + { + 'target_defaults': { + 'conditions': [ + ['OS=="win"', { + 'msvs_configuration_attributes': { + 'SpectreMitigation': 'Spectre' + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalOptions': [ + '/Zi', + '/FS' + ], + }, + 'VCLinkerTool': { + 'AdditionalOptions': [ + '/profile' + ] + } + } + }] + ] + } + } + '@ + + if (!(Test-Path "~/.gyp")) { + mkdir "~/.gyp" + } + echo $includes > "~/.gyp/include.gypi" + displayName: Create include.gypi + + - powershell: | + . build/azure-pipelines/win32/exec.ps1 + . build/azure-pipelines/win32/retry.ps1 + $ErrorActionPreference = "Stop" + retry { exec { yarn --frozen-lockfile --check-files } } + env: + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + GITHUB_TOKEN: "$(github-distro-mixin-password)" + CHILD_CONCURRENCY: 1 + displayName: Install dependencies + + - script: node build/azure-pipelines/distro/mixin-npm + displayName: Mixin distro node modules + + - script: node build/azure-pipelines/distro/mixin-quality + displayName: Mixin distro quality + env: + VSCODE_QUALITY: stable + + - powershell: yarn compile + displayName: Compile + + - powershell: yarn gulp "vscode-symbols-win32-${{ parameters.VSCODE_ARCH }}" + env: + GITHUB_TOKEN: "$(github-distro-mixin-password)" + displayName: Download Symbols + + - task: BinSkim@4 + inputs: + InputType: "Basic" + Function: "analyze" + TargetPattern: "guardianGlob" + AnalyzeIgnorePdbLoadError: true + AnalyzeTargetGlob: '$(agent.builddirectory)\scanbin\**.dll;$(agent.builddirectory)\scanbin\**.exe;$(agent.builddirectory)\scanbin\**.node' + AnalyzeLocalSymbolDirectories: '$(agent.builddirectory)\scanbin\VSCode-win32-${{ parameters.VSCODE_ARCH }}\pdb' + + - task: CopyFiles@2 + displayName: 'Collect Symbols for API Scan' + inputs: + SourceFolder: $(Agent.BuildDirectory) + Contents: 'scanbin\**\*.pdb' + TargetFolder: '$(agent.builddirectory)\symbols' + flattenFolders: true + condition: succeeded() + + - task: APIScan@2 + inputs: + softwareFolder: $(agent.builddirectory)\scanbin + softwareName: 'vscode-client' + softwareVersionNum: '1' + symbolsFolder: 'SRV*http://symweb;$(agent.builddirectory)\symbols' + isLargeApp: false + toolVersion: 'Latest' + displayName: Run ApiScan + condition: succeeded() + env: + AzureServicesAuthConnectionString: $(apiscan-connectionstring) + + - task: PublishSecurityAnalysisLogs@3 + inputs: + ArtifactName: CodeAnalysisLogs + ArtifactType: Container + PublishProcessedResults: false + AllTools: true From 1e8fba74124da0475b90bbe12063d2716617a499 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Thu, 20 Jun 2024 15:30:38 -0700 Subject: [PATCH 392/755] Polish inline chat compact styles --- .../contrib/inlineChat/browser/media/inlineChat.css | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index 0f90ae5d20fdd..083f448ff69ef 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -35,11 +35,11 @@ } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list { - padding: 4px 0 0 0; + padding: 2px 0 0 0; } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.interactive-item-compact { - padding: 6px 0; + padding: 2px 0; gap: 6px; } @@ -47,6 +47,12 @@ outline-offset: -1px; } +.monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.interactive-item-compact .chat-notification-widget { + margin-bottom: 0; + padding: 0; + border: none; +} + .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-request { border: none; } From 309351259c318dc63ed8ead955a22dc82dc55e58 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 20 Jun 2024 22:05:42 +0200 Subject: [PATCH 393/755] Implements experimental inline edits Signed-off-by: Henning Dieterichs --- .../lib/stylelint/vscode-known-variables.json | 4 +- src/vs/base/browser/dom.ts | 101 +++++ src/vs/editor/common/languages.ts | 11 + .../browser/provideInlineCompletions.ts | 15 +- .../contrib/inlineEdits/browser/commands.ts | 185 ++++++++ .../contrib/inlineEdits/browser/consts.ts | 16 + .../browser/inlineEdits.contribution.ts | 19 + .../browser/inlineEditsController.ts | 97 +++++ .../inlineEdits/browser/inlineEditsModel.ts | 289 +++++++++++++ .../inlineEdits/browser/inlineEditsWidget.css | 49 +++ .../inlineEdits/browser/inlineEditsWidget.ts | 400 ++++++++++++++++++ src/vs/editor/editor.all.ts | 1 + src/vs/platform/actions/common/actions.ts | 1 + .../api/browser/mainThreadLanguageFeatures.ts | 3 + .../workbench/api/common/extHost.protocol.ts | 1 + .../api/common/extHostLanguageFeatures.ts | 86 +++- ...e.proposed.inlineCompletionsAdditions.d.ts | 6 + 17 files changed, 1277 insertions(+), 7 deletions(-) create mode 100644 src/vs/editor/contrib/inlineEdits/browser/commands.ts create mode 100644 src/vs/editor/contrib/inlineEdits/browser/consts.ts create mode 100644 src/vs/editor/contrib/inlineEdits/browser/inlineEdits.contribution.ts create mode 100644 src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts create mode 100644 src/vs/editor/contrib/inlineEdits/browser/inlineEditsModel.ts create mode 100644 src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.css create mode 100644 src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index 9921547a9980e..6d729ef5ea403 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -94,6 +94,7 @@ "--vscode-debugTokenExpression-name", "--vscode-debugTokenExpression-number", "--vscode-debugTokenExpression-string", + "--vscode-debugTokenExpression-type", "--vscode-debugTokenExpression-value", "--vscode-debugToolBar-background", "--vscode-debugToolBar-border", @@ -852,6 +853,7 @@ "--z-index-notebook-scrollbar", "--z-index-run-button-container", "--zoom-factor", - "--test-bar-width" + "--test-bar-width", + "--widget-color" ] } diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index c258342ad6f0a..66d30c3aca3f4 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -2373,6 +2373,107 @@ export function h(tag: string, ...args: [] | [attributes: { $: string } & Partia return result; } +export function svgElem + (tag: TTag): + TagToRecord extends infer Y ? { [TKey in keyof Y]: Y[TKey] } : never; + +export function svgElem + (tag: TTag, children: [...T]): + (ArrayToObj & TagToRecord) extends infer Y ? { [TKey in keyof Y]: Y[TKey] } : never; + +export function svgElem + (tag: TTag, attributes: Partial>>): + TagToRecord extends infer Y ? { [TKey in keyof Y]: Y[TKey] } : never; + +export function svgElem + (tag: TTag, attributes: Partial>>, children: [...T]): + (ArrayToObj & TagToRecord) extends infer Y ? { [TKey in keyof Y]: Y[TKey] } : never; + +export function svgElem(tag: string, ...args: [] | [attributes: { $: string } & Partial> | Record, children?: any[]] | [children: any[]]): Record { + let attributes: { $?: string } & Partial>; + let children: (Record | HTMLElement)[] | undefined; + + if (Array.isArray(args[0])) { + attributes = {}; + children = args[0]; + } else { + attributes = args[0] as any || {}; + children = args[1]; + } + + const match = H_REGEX.exec(tag); + + if (!match || !match.groups) { + throw new Error('Bad use of h'); + } + + const tagName = match.groups['tag'] || 'div'; + const el = document.createElementNS('http://www.w3.org/2000/svg', tagName) as any as HTMLElement; + + if (match.groups['id']) { + el.id = match.groups['id']; + } + + const classNames = []; + if (match.groups['class']) { + for (const className of match.groups['class'].split('.')) { + if (className !== '') { + classNames.push(className); + } + } + } + if (attributes.className !== undefined) { + for (const className of attributes.className.split('.')) { + if (className !== '') { + classNames.push(className); + } + } + } + if (classNames.length > 0) { + el.className = classNames.join(' '); + } + + const result: Record = {}; + + if (match.groups['name']) { + result[match.groups['name']] = el; + } + + if (children) { + for (const c of children) { + if (isHTMLElement(c)) { + el.appendChild(c); + } else if (typeof c === 'string') { + el.append(c); + } else if ('root' in c) { + Object.assign(result, c); + el.appendChild(c.root); + } + } + } + + for (const [key, value] of Object.entries(attributes)) { + if (key === 'className') { + continue; + } else if (key === 'style') { + for (const [cssKey, cssValue] of Object.entries(value)) { + el.style.setProperty( + camelCaseToHyphenCase(cssKey), + typeof cssValue === 'number' ? cssValue + 'px' : '' + cssValue + ); + } + } else if (key === 'tabIndex') { + el.tabIndex = value; + } else { + el.setAttribute(camelCaseToHyphenCase(key), value.toString()); + } + } + + result['root'] = el; + + return result; +} + function camelCaseToHyphenCase(str: string) { return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); } diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 96e743a2dcaf9..1d5c290117891 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -687,6 +687,11 @@ export interface InlineCompletionContext { */ readonly triggerKind: InlineCompletionTriggerKind; readonly selectedSuggestionInfo: SelectedSuggestionInfo | undefined; + /** + * @experimental + * @internal + */ + readonly userPrompt?: string | undefined; } export class SelectedSuggestionInfo { @@ -765,6 +770,12 @@ export type InlineCompletionProviderGroupId = string; export interface InlineCompletionsProvider { provideInlineCompletions(model: model.ITextModel, position: Position, context: InlineCompletionContext, token: CancellationToken): ProviderResult; + /** + * @experimental + * @internal + */ + provideInlineEdits?(model: model.ITextModel, range: Range, context: InlineCompletionContext, token: CancellationToken): ProviderResult; + /** * Will be called when an item is shown. * @param updatedInsertText Is useful to understand bracket completion. diff --git a/src/vs/editor/contrib/inlineCompletions/browser/provideInlineCompletions.ts b/src/vs/editor/contrib/inlineCompletions/browser/provideInlineCompletions.ts index 28052040c3296..25ccf4cd12598 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/provideInlineCompletions.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/provideInlineCompletions.ts @@ -18,19 +18,19 @@ import { ILanguageConfigurationService } from 'vs/editor/common/languages/langua import { ITextModel } from 'vs/editor/common/model'; import { fixBracketsInLine } from 'vs/editor/common/model/bracketPairsTextModelPart/fixBrackets'; import { SingleTextEdit } from 'vs/editor/common/core/textEdit'; -import { getReadonlyEmptyArray } from 'vs/editor/contrib/inlineCompletions/browser/utils'; +import { getReadonlyEmptyArray } from './utils'; import { SnippetParser, Text } from 'vs/editor/contrib/snippet/browser/snippetParser'; export async function provideInlineCompletions( registry: LanguageFeatureRegistry, - position: Position, + positionOrRange: Position | Range, model: ITextModel, context: InlineCompletionContext, token: CancellationToken = CancellationToken.None, languageConfigurationService?: ILanguageConfigurationService, ): Promise { // Important: Don't use position after the await calls, as the model could have been changed in the meantime! - const defaultReplaceRange = getDefaultRange(position, model); + const defaultReplaceRange = positionOrRange instanceof Position ? getDefaultRange(positionOrRange, model) : positionOrRange; const providers = registry.all(model); const multiMap = new SetMap>(); @@ -100,8 +100,13 @@ export async function provideInlineCompletions( } try { - const completions = await provider.provideInlineCompletions(model, position, context, token); - return completions; + if (positionOrRange instanceof Position) { + const completions = await provider.provideInlineCompletions(model, positionOrRange, context, token); + return completions; + } else { + const completions = await provider.provideInlineEdits?.(model, positionOrRange, context, token); + return completions; + } } catch (e) { onUnexpectedExternalError(e); return undefined; diff --git a/src/vs/editor/contrib/inlineEdits/browser/commands.ts b/src/vs/editor/contrib/inlineEdits/browser/commands.ts new file mode 100644 index 0000000000000..c5ce0e9029638 --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/commands.ts @@ -0,0 +1,185 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Codicon } from 'vs/base/common/codicons'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { transaction } from 'vs/base/common/observable'; +import { asyncTransaction } from 'vs/base/common/observableInternal/base'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { inlineEditAcceptId, inlineEditVisible, showNextInlineEditActionId, showPreviousInlineEditActionId } from 'vs/editor/contrib/inlineEdits/browser/consts'; +import { InlineEditsController } from 'vs/editor/contrib/inlineEdits/browser/inlineEditsController'; +import * as nls from 'vs/nls'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; + + +function labelAndAlias(str: nls.ILocalizedString): { label: string, alias: string } { + return { + label: str.value, + alias: str.original, + }; +} + +export class ShowNextInlineEditAction extends EditorAction { + public static ID = showNextInlineEditActionId; + constructor() { + super({ + id: ShowNextInlineEditAction.ID, + ...labelAndAlias(nls.localize2('action.inlineEdits.showNext', "Show Next Inline Edit")), + precondition: ContextKeyExpr.and(EditorContextKeys.writable, inlineEditVisible), + kbOpts: { + weight: 100, + primary: KeyMod.Alt | KeyCode.BracketRight, + }, + }); + } + + public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { + const controller = InlineEditsController.get(editor); + controller?.model.get()?.next(); + } +} + +export class ShowPreviousInlineEditAction extends EditorAction { + public static ID = showPreviousInlineEditActionId; + constructor() { + super({ + id: ShowPreviousInlineEditAction.ID, + ...labelAndAlias(nls.localize2('action.inlineEdits.showPrevious', "Show Previous Inline Edit")), + precondition: ContextKeyExpr.and(EditorContextKeys.writable, inlineEditVisible), + kbOpts: { + weight: 100, + primary: KeyMod.Alt | KeyCode.BracketLeft, + }, + }); + } + + public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { + const controller = InlineEditsController.get(editor); + controller?.model.get()?.previous(); + } +} + +export class TriggerInlineEditAction extends EditorAction { + constructor() { + super({ + id: 'editor.action.inlineEdits.trigger', + ...labelAndAlias(nls.localize2('action.inlineEdits.trigger', "Trigger Inline Edit")), + precondition: EditorContextKeys.writable + }); + } + + public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { + const controller = InlineEditsController.get(editor); + await asyncTransaction(async tx => { + /** @description triggerExplicitly from command */ + await controller?.model.get()?.triggerExplicitly(tx); + }); + } +} + +export class AcceptInlineEdit extends EditorAction { + constructor() { + super({ + id: inlineEditAcceptId, + ...labelAndAlias(nls.localize2('action.inlineEdits.accept', "Accept Inline Edit")), + precondition: inlineEditVisible, + menuOpts: { + menuId: MenuId.InlineEditsActions, + title: nls.localize('inlineEditsActions', "Accept Inline Edit"), + group: 'primary', + order: 1, + icon: Codicon.check, + }, + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.Space, + weight: 20000, + kbExpr: inlineEditVisible, + } + }); + } + + public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { + if (editor instanceof EmbeddedCodeEditorWidget) { + editor = editor.getParentEditor(); + } + const controller = InlineEditsController.get(editor); + if (controller) { + controller.model.get()?.accept(controller.editor); + controller.editor.focus(); + } + } +} + +/* +TODO@hediet +export class PinInlineEdit extends EditorAction { + constructor() { + super({ + id: 'editor.action.inlineEdits.pin', + ...labelAndAlias(nls.localize2('action.inlineEdits.pin', "Pin Inline Edit")), + precondition: undefined, + kbOpts: { + primary: KeyMod.Shift | KeyCode.Space, + weight: 20000, + } + }); + } + + public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { + const controller = InlineEditsController.get(editor); + if (controller) { + controller.model.get()?.togglePin(); + } + } +} + +MenuRegistry.appendMenuItem(MenuId.InlineEditsActions, { + command: { + id: 'editor.action.inlineEdits.pin', + title: nls.localize('Pin', "Pin"), + icon: Codicon.pin, + }, + group: 'primary', + order: 1, + when: isPinnedContextKey.negate(), +}); + +MenuRegistry.appendMenuItem(MenuId.InlineEditsActions, { + command: { + id: 'editor.action.inlineEdits.unpin', + title: nls.localize('Unpin', "Unpin"), + icon: Codicon.pinned, + }, + group: 'primary', + order: 1, + when: isPinnedContextKey, +});*/ + +export class HideInlineEdit extends EditorAction { + public static ID = 'editor.action.inlineEdits.hide'; + + constructor() { + super({ + id: HideInlineEdit.ID, + ...labelAndAlias(nls.localize2('action.inlineEdits.hide', "Hide Inline Edit")), + precondition: inlineEditVisible, + kbOpts: { + weight: 100, + primary: KeyCode.Escape, + } + }); + } + + public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { + const controller = InlineEditsController.get(editor); + transaction(tx => { + controller?.model.get()?.stop(tx); + }); + } +} diff --git a/src/vs/editor/contrib/inlineEdits/browser/consts.ts b/src/vs/editor/contrib/inlineEdits/browser/consts.ts new file mode 100644 index 0000000000000..9ad19e98a7655 --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/consts.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize } from 'vs/nls'; +import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; + +export const inlineEditAcceptId = 'editor.action.inlineEdits.accept'; + +export const showPreviousInlineEditActionId = 'editor.action.inlineEdits.showPrevious'; + +export const showNextInlineEditActionId = 'editor.action.inlineEdits.showNext'; + +export const inlineEditVisible = new RawContextKey('inlineEditsVisible', false, localize('inlineEditsVisible', "Whether an inline edit is visible")); +export const isPinnedContextKey = new RawContextKey('inlineEditsIsPinned', false, localize('isPinned', "Whether an inline edit is visible")); diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEdits.contribution.ts b/src/vs/editor/contrib/inlineEdits/browser/inlineEdits.contribution.ts new file mode 100644 index 0000000000000..ae8b7182a89e1 --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEdits.contribution.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { EditorContributionInstantiation, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { + TriggerInlineEditAction, ShowNextInlineEditAction, ShowPreviousInlineEditAction, + AcceptInlineEdit, HideInlineEdit, +} from 'vs/editor/contrib/inlineEdits/browser/commands'; +import { InlineEditsController } from 'vs/editor/contrib/inlineEdits/browser/inlineEditsController'; + +registerEditorContribution(InlineEditsController.ID, InlineEditsController, EditorContributionInstantiation.Eventually); + +registerEditorAction(TriggerInlineEditAction); +registerEditorAction(ShowNextInlineEditAction); +registerEditorAction(ShowPreviousInlineEditAction); +registerEditorAction(AcceptInlineEdit); +registerEditorAction(HideInlineEdit); diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts new file mode 100644 index 0000000000000..5d0afd8ca0efe --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts @@ -0,0 +1,97 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { derived, derivedObservableWithCache, IReader, ISettableObservable, observableValue } from 'vs/base/common/observable'; +import { derivedDisposable, derivedWithSetter } from 'vs/base/common/observableInternal/derived'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; +import { readHotReloadableExport } from 'vs/editor/browser/widget/diffEditor/utils'; +import { Selection } from 'vs/editor/common/core/selection'; +import { ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { inlineEditVisible, isPinnedContextKey } from 'vs/editor/contrib/inlineEdits/browser/consts'; +import { InlineEditsModel } from 'vs/editor/contrib/inlineEdits/browser/inlineEditsModel'; +import { InlineEditsWidget } from 'vs/editor/contrib/inlineEdits/browser/inlineEditsWidget'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { bindContextKey, observableConfigValue } from 'vs/platform/observable/common/platformObservableUtils'; + +export class InlineEditsController extends Disposable { + static ID = 'editor.contrib.inlineEditsController'; + + public static get(editor: ICodeEditor): InlineEditsController | null { + return editor.getContribution(InlineEditsController.ID); + } + + private readonly _enabled = observableConfigValue('editor.inlineEdits.enabled', false, this._configurationService); + private readonly _editorObs = observableCodeEditor(this.editor); + private readonly _selection = derived(this, reader => this._editorObs.cursorSelection.read(reader) ?? new Selection(1, 1, 1, 1)); + + private readonly _debounceValue = this._debounceService.for( + this._languageFeaturesService.inlineCompletionsProvider, + 'InlineEditsDebounce', + { min: 50, max: 50 } + ); + + public readonly model = derivedDisposable(this, reader => { + if (!this._enabled.read(reader)) { + return undefined; + } + if (this._editorObs.isReadonly.read(reader)) { return undefined; } + const textModel = this._editorObs.model.read(reader); + if (!textModel) { return undefined; } + + const model: InlineEditsModel = this._instantiationService.createInstance( + readHotReloadableExport(InlineEditsModel, reader), + textModel, + this._editorObs.versionId, + this._selection, + this._debounceValue, + ); + + return model; + }); + + private readonly _hadInlineEdit = derivedObservableWithCache(this, (reader, lastValue) => lastValue || this.model.read(reader)?.inlineEdit.read(reader) !== undefined); + + protected readonly _widget = derivedDisposable(this, reader => { + if (!this._hadInlineEdit.read(reader)) { return undefined; } + + return this._instantiationService.createInstance( + readHotReloadableExport(InlineEditsWidget, reader), + this.editor, + this.model.map((m, reader) => m?.inlineEdit.read(reader)), + flattenSettableObservable((reader) => this.model.read(reader)?.userPrompt ?? observableValue('empty', '')), + ); + }); + + constructor( + public readonly editor: ICodeEditor, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IContextKeyService private readonly _contextKeyService: IContextKeyService, + @ILanguageFeatureDebounceService private readonly _debounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + ) { + super(); + + this._register(bindContextKey(inlineEditVisible, this._contextKeyService, r => !!this.model.read(r)?.inlineEdit.read(r))); + this._register(bindContextKey(isPinnedContextKey, this._contextKeyService, r => !!this.model.read(r)?.isPinned.read(r))); + + this.model.recomputeInitiallyAndOnChange(this._store); + this._widget.recomputeInitiallyAndOnChange(this._store); + } +} + +function flattenSettableObservable(fn: (reader: IReader | undefined) => ISettableObservable): ISettableObservable { + return derivedWithSetter(undefined, reader => { + const obs = fn(reader); + return obs.read(reader); + }, (value, tx) => { + fn(undefined).set(value, tx); + }); +} diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsModel.ts b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsModel.ts new file mode 100644 index 0000000000000..812818c85b1a2 --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsModel.ts @@ -0,0 +1,289 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { timeout } from 'vs/base/common/async'; +import { CancellationToken, cancelOnDispose } from 'vs/base/common/cancellation'; +import { itemsEquals, structuralEquals } from 'vs/base/common/equals'; +import { BugIndicatingError } from 'vs/base/common/errors'; +import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { IObservable, ISettableObservable, ITransaction, ObservablePromise, derived, derivedHandleChanges, derivedOpts, disposableObservableValue, observableSignal, observableValue, recomputeInitiallyAndOnChange, subtransaction } from 'vs/base/common/observable'; +import { derivedDisposable } from 'vs/base/common/observableInternal/derived'; +import { URI } from 'vs/base/common/uri'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IDiffProviderFactoryService } from 'vs/editor/browser/widget/diffEditor/diffProviderFactoryService'; +import { LineRange } from 'vs/editor/common/core/lineRange'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { Command, InlineCompletionContext, InlineCompletionTriggerKind } from 'vs/editor/common/languages'; +import { ITextModel } from 'vs/editor/common/model'; +import { IFeatureDebounceInformation } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { IModelService } from 'vs/editor/common/services/model'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; +import { InlineCompletionItem, InlineCompletionProviderResult, provideInlineCompletions } from 'vs/editor/contrib/inlineCompletions/browser/provideInlineCompletions'; +import { InlineEdit } from 'vs/editor/contrib/inlineEdits/browser/inlineEditsWidget'; + +export class InlineEditsModel extends Disposable { + private static _modelId = 0; + private static _createUniqueUri(): URI { + return URI.from({ scheme: 'inline-edits', path: new Date().toString() + String(InlineEditsModel._modelId++) }); + } + + private readonly _forceUpdateExplicitlySignal = observableSignal(this); + + // We use a semantic id to keep the same inline completion selected even if the provider reorders the completions. + private readonly _selectedInlineCompletionId = observableValue(this, undefined); + + private readonly _isActive = observableValue(this, false); + + private readonly _originalModel = derivedDisposable(() => this._modelService.createModel('', null, InlineEditsModel._createUniqueUri())).keepObserved(this._store); + private readonly _modifiedModel = derivedDisposable(() => this._modelService.createModel('', null, InlineEditsModel._createUniqueUri())).keepObserved(this._store); + + private readonly _pinnedRange = new TrackedRange(this.textModel, this._textModelVersionId); + + public readonly isPinned = this._pinnedRange.range.map(range => !!range); + + public readonly userPrompt: ISettableObservable = observableValue(this, undefined); + + constructor( + public readonly textModel: ITextModel, + public readonly _textModelVersionId: IObservable, + private readonly _selection: IObservable, + protected readonly _debounceValue: IFeatureDebounceInformation, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, + @IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService, + @IModelService private readonly _modelService: IModelService, + ) { + super(); + + this._register(recomputeInitiallyAndOnChange(this._fetchInlineEditsPromise)); + } + + public readonly inlineEdit = derived(this, reader => { + return this._inlineEdit.read(reader)?.promiseResult.read(reader)?.data; + }); + + public readonly _inlineEdit = derived | undefined>(this, reader => { + const edit = this.selectedInlineEdit.read(reader); + if (!edit) { return undefined; } + const range = edit.inlineCompletion.range; + if (edit.inlineCompletion.insertText.trim() === '') { + return undefined; + } + + let newLines = edit.inlineCompletion.insertText.split(/\r\n|\r|\n/); + + function removeIndentation(lines: string[]): string[] { + const indentation = lines[0].match(/^\s*/)?.[0] ?? ''; + return lines.map(l => l.replace(new RegExp('^' + indentation), '')); + } + newLines = removeIndentation(newLines); + + const existing = this.textModel.getValueInRange(range); + let existingLines = existing.split(/\r\n|\r|\n/); + existingLines = removeIndentation(existingLines); + this._originalModel.get().setValue(existingLines.join('\n')); + this._modifiedModel.get().setValue(newLines.join('\n')); + + const d = this._diffProviderFactoryService.createDiffProvider({ diffAlgorithm: 'advanced' }); + return ObservablePromise.fromFn(async () => { + const result = await d.computeDiff(this._originalModel.get(), this._modifiedModel.get(), { + computeMoves: false, + ignoreTrimWhitespace: false, + maxComputationTimeMs: 1000, + }, CancellationToken.None); + + if (result.identical) { + return undefined; + } + + return new InlineEdit(LineRange.fromRangeInclusive(range), removeIndentation(newLines), result.changes); + }); + }); + + private readonly _fetchStore = this._register(new DisposableStore()); + + private readonly _inlineEditsFetchResult = disposableObservableValue(this, undefined); + private readonly _inlineEdits = derivedOpts({ owner: this, equalsFn: structuralEquals }, reader => { + return this._inlineEditsFetchResult.read(reader)?.completions.map(c => new InlineEditData(c)) ?? []; + }); + + private readonly _fetchInlineEditsPromise = derivedHandleChanges({ + owner: this, + createEmptyChangeSummary: () => ({ + inlineCompletionTriggerKind: InlineCompletionTriggerKind.Automatic + }), + handleChange: (ctx, changeSummary) => { + /** @description fetch inline completions */ + if (ctx.didChange(this._forceUpdateExplicitlySignal)) { + changeSummary.inlineCompletionTriggerKind = InlineCompletionTriggerKind.Explicit; + } + return true; + }, + }, async (reader, changeSummary) => { + this._fetchStore.clear(); + this._forceUpdateExplicitlySignal.read(reader); + /*if (!this._isActive.read(reader)) { + return undefined; + }*/ + this._textModelVersionId.read(reader); + + function mapValue(value: T, fn: (value: T) => TOut): TOut { + return fn(value); + } + + const selection = this._pinnedRange.range.read(reader) ?? mapValue(this._selection.read(reader), v => v.isEmpty() ? undefined : v); + if (!selection) { + this._inlineEditsFetchResult.set(undefined, undefined); + this.userPrompt.set(undefined, undefined); + return undefined; + } + const context: InlineCompletionContext = { + triggerKind: changeSummary.inlineCompletionTriggerKind, + selectedSuggestionInfo: undefined, + userPrompt: this.userPrompt.read(reader), + }; + + const token = cancelOnDispose(this._fetchStore); + await timeout(200, token); + const result = await provideInlineCompletions(this.languageFeaturesService.inlineCompletionsProvider, selection, this.textModel, context, token); + if (token.isCancellationRequested) { + return; + } + + this._inlineEditsFetchResult.set(result, undefined); + }); + + public async trigger(tx?: ITransaction): Promise { + this._isActive.set(true, tx); + await this._fetchInlineEditsPromise.get(); + } + + public async triggerExplicitly(tx?: ITransaction): Promise { + subtransaction(tx, tx => { + this._isActive.set(true, tx); + this._forceUpdateExplicitlySignal.trigger(tx); + }); + await this._fetchInlineEditsPromise.get(); + } + + public stop(tx?: ITransaction): void { + subtransaction(tx, tx => { + this.userPrompt.set(undefined, tx); + this._isActive.set(false, tx); + this._inlineEditsFetchResult.set(undefined, tx); + this._pinnedRange.setRange(undefined, tx); + //this._source.clear(tx); + }); + } + + private readonly _filteredInlineEditItems = derivedOpts({ owner: this, equalsFn: itemsEquals() }, reader => { + return this._inlineEdits.read(reader); + }); + + public readonly selectedInlineCompletionIndex = derived(this, (reader) => { + const selectedInlineCompletionId = this._selectedInlineCompletionId.read(reader); + const filteredCompletions = this._filteredInlineEditItems.read(reader); + const idx = this._selectedInlineCompletionId === undefined ? -1 + : filteredCompletions.findIndex(v => v.semanticId === selectedInlineCompletionId); + if (idx === -1) { + // Reset the selection so that the selection does not jump back when it appears again + this._selectedInlineCompletionId.set(undefined, undefined); + return 0; + } + return idx; + }); + + public readonly selectedInlineEdit = derived(this, (reader) => { + const filteredCompletions = this._filteredInlineEditItems.read(reader); + const idx = this.selectedInlineCompletionIndex.read(reader); + return filteredCompletions[idx]; + }); + + public readonly activeCommands = derivedOpts({ owner: this, equalsFn: itemsEquals() }, + r => this.selectedInlineEdit.read(r)?.inlineCompletion.source.inlineCompletions.commands ?? [] + ); + + private async _deltaSelectedInlineCompletionIndex(delta: 1 | -1): Promise { + await this.triggerExplicitly(); + + const completions = this._filteredInlineEditItems.get() || []; + if (completions.length > 0) { + const newIdx = (this.selectedInlineCompletionIndex.get() + delta + completions.length) % completions.length; + this._selectedInlineCompletionId.set(completions[newIdx].semanticId, undefined); + } else { + this._selectedInlineCompletionId.set(undefined, undefined); + } + } + + public async next(): Promise { + await this._deltaSelectedInlineCompletionIndex(1); + } + + public async previous(): Promise { + await this._deltaSelectedInlineCompletionIndex(-1); + } + + public togglePin(): void { + if (this.isPinned.get()) { + this._pinnedRange.setRange(undefined, undefined); + } else { + this._pinnedRange.setRange(this._selection.get(), undefined); + } + } + + public async accept(editor: ICodeEditor): Promise { + if (editor.getModel() !== this.textModel) { + throw new BugIndicatingError(); + } + const edit = this.selectedInlineEdit.get(); + if (!edit) { + return; + } + + editor.pushUndoStop(); + editor.executeEdits( + 'inlineSuggestion.accept', + [ + edit.inlineCompletion.toSingleTextEdit().toSingleEditOperation() + ] + ); + this.stop(); + } +} + +class InlineEditData { + public readonly semanticId = this.inlineCompletion.hash(); + + constructor(public readonly inlineCompletion: InlineCompletionItem) { + + } +} + +class TrackedRange extends Disposable { + private readonly _decorations = observableValue(this, []); + + constructor( + private readonly _textModel: ITextModel, + private readonly _versionId: IObservable, + ) { + super(); + this._register(toDisposable(() => { + this._textModel.deltaDecorations(this._decorations.get(), []); + })); + } + + setRange(range: Range | undefined, tx: ITransaction | undefined): void { + this._decorations.set(this._textModel.deltaDecorations(this._decorations.get(), range ? [{ range, options: { description: 'trackedRange' } }] : []), tx); + } + + public readonly range = derived(this, reader => { + this._versionId.read(reader); + const deco = this._decorations.read(reader)[0]; + if (!deco) { return null; } + + return this._textModel.getDecorationRange(deco) ?? null; + }); +} diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.css b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.css new file mode 100644 index 0000000000000..68910c883a69f --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.css @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-editor div.inline-edits-widget { + --widget-color: var(--vscode-notifications-background); + + .promptEditor .monaco-editor { + --vscode-editor-placeholder-foreground: var(--vscode-editorGhostText-foreground); + } + + .toolbar, .promptEditor { + opacity: 0; + transition: opacity 0.2s ease-in-out; + } + &:hover, &.focused { + .toolbar, .promptEditor { + opacity: 1; + } + } + + .preview .monaco-editor { + + .mtk1 { + /*color: rgba(215, 215, 215, 0.452);*/ + color: var(--vscode-editorGhostText-foreground); + } + .view-overlays .current-line-exact { + border: none; + } + + .current-line-margin { + border: none; + } + + --vscode-editor-background: var(--widget-color); + } + + svg { + .gradient-start { + stop-color: var(--vscode-editor-background); + } + + .gradient-stop { + stop-color: var(--widget-color); + } + } +} diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts new file mode 100644 index 0000000000000..0a1498915d481 --- /dev/null +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts @@ -0,0 +1,400 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { h, svgElem } from 'vs/base/browser/dom'; +import { DEFAULT_FONT_FAMILY } from 'vs/base/browser/fonts'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { autorun, constObservable, derived, IObservable, ISettableObservable } from 'vs/base/common/observable'; +import { derivedWithSetter } from 'vs/base/common/observableInternal/derived'; +import 'vs/css!./inlineEditsWidget'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; +import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; +import { diffAddDecoration, diffAddDecorationEmpty, diffDeleteDecoration, diffDeleteDecorationEmpty, diffLineAddDecorationBackgroundWithIndicator, diffLineDeleteDecorationBackgroundWithIndicator, diffWholeLineAddDecoration, diffWholeLineDeleteDecoration } from 'vs/editor/browser/widget/diffEditor/registrations.contribution'; +import { appendRemoveOnDispose, applyStyle } from 'vs/editor/browser/widget/diffEditor/utils'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { LineRange } from 'vs/editor/common/core/lineRange'; +import { DetailedLineRangeMapping } from 'vs/editor/common/diff/rangeMapping'; +import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; +import { IModelDeltaDecoration } from 'vs/editor/common/model'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { PlaceholderTextContribution } from 'vs/editor/contrib/placeholderText/browser/placeholderText.contribution'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; + +export class InlineEdit { + constructor( + public readonly range: LineRange, + public readonly newLines: string[], + public readonly changes: readonly DetailedLineRangeMapping[], + ) { + + } +} + +export class InlineEditsWidget extends Disposable { + private readonly _editorObs = observableCodeEditor(this._editor); + + private readonly _elements = h('div.inline-edits-widget', { + style: { + position: 'absolute', + overflow: 'visible', + top: '0px', + left: '0px', + }, + }, [ + h('div@editorContainer', { style: { position: 'absolute', top: '0px', left: '0px', width: '500px', height: '500px', } }, [ + h('div.toolbar@toolbar', { style: { position: 'absolute', top: '-25px', left: '0px' } }), + h('div.promptEditor@promptEditor', { style: { position: 'absolute', top: '-25px', left: '80px', width: '300px', height: '22px' } }), + h('div.preview@editor', { style: { position: 'absolute', top: '0px', left: '0px' } }), + ]), + svgElem('svg', { style: { overflow: 'visible', pointerEvents: 'none' }, }, [ + svgElem('defs', [ + svgElem('linearGradient', { + id: 'Gradient2', + x1: '0', + y1: '0', + x2: '1', + y2: '0', + }, [ + /*svgElem('stop', { offset: '0%', class: 'gradient-start', }), + svgElem('stop', { offset: '0%', class: 'gradient-start', }), + svgElem('stop', { offset: '20%', class: 'gradient-stop', }),*/ + svgElem('stop', { offset: '0%', class: 'gradient-stop', }), + svgElem('stop', { offset: '100%', class: 'gradient-stop', }), + ]), + ]), + svgElem('path@path', { + d: '', + fill: 'url(#Gradient2)', + }), + ]), + ]); + + protected readonly _toolbar = this._register(this._instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.toolbar, MenuId.InlineEditsActions, { + toolbarOptions: { + primaryGroup: g => g.startsWith('primary'), + }, + })); + private readonly _previewTextModel = this._register(this._instantiationService.createInstance( + TextModel, + '', + PLAINTEXT_LANGUAGE_ID, + TextModel.DEFAULT_CREATION_OPTIONS, + null + )); + + private readonly _setText = derived(reader => { + const edit = this._edit.read(reader); + if (!edit) { return; } + this._previewTextModel.setValue(edit.newLines.join('\n')); + }).recomputeInitiallyAndOnChange(this._store); + + + private readonly _promptTextModel = this._register(this._instantiationService.createInstance( + TextModel, + '', + PLAINTEXT_LANGUAGE_ID, + TextModel.DEFAULT_CREATION_OPTIONS, + null + )); + private readonly _promptEditor = this._register(this._instantiationService.createInstance( + EmbeddedCodeEditorWidget, + this._elements.promptEditor, + { + glyphMargin: false, + lineNumbers: 'off', + minimap: { enabled: false }, + guides: { + indentation: false, + bracketPairs: false, + bracketPairsHorizontal: false, + highlightActiveIndentation: false, + }, + folding: false, + selectOnLineNumbers: false, + selectionHighlight: false, + columnSelection: false, + overviewRulerBorder: false, + overviewRulerLanes: 0, + lineDecorationsWidth: 0, + lineNumbersMinChars: 0, + placeholder: 'Describe the change you want...', + fontFamily: DEFAULT_FONT_FAMILY, + }, + { + contributions: EditorExtensionsRegistry.getSomeEditorContributions([ + SuggestController.ID, + PlaceholderTextContribution.ID, + ContextMenuController.ID, + ]), + isSimpleWidget: true + }, + this._editor + )); + + private readonly _previewEditor = this._register(this._instantiationService.createInstance( + EmbeddedCodeEditorWidget, + this._elements.editor, + { + glyphMargin: false, + lineNumbers: 'off', + minimap: { enabled: false }, + guides: { + indentation: false, + bracketPairs: false, + bracketPairsHorizontal: false, + highlightActiveIndentation: false, + }, + folding: false, + selectOnLineNumbers: false, + selectionHighlight: false, + columnSelection: false, + overviewRulerBorder: false, + overviewRulerLanes: 0, + lineDecorationsWidth: 0, + lineNumbersMinChars: 0, + }, + { contributions: [], }, + this._editor + )); + + private readonly _previewEditorObs = observableCodeEditor(this._previewEditor); + + private readonly _decorations = derived(this, (reader) => { + this._setText.read(reader); + const diff = this._edit.read(reader)?.changes; + if (!diff) { return []; } + + const originalDecorations: IModelDeltaDecoration[] = []; + const modifiedDecorations: IModelDeltaDecoration[] = []; + + if (diff.length === 1 && diff[0].innerChanges![0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange())) { + return []; + } + + for (const m of diff) { + if (!m.original.isEmpty) { + originalDecorations.push({ range: m.original.toInclusiveRange()!, options: diffLineDeleteDecorationBackgroundWithIndicator }); + } + if (!m.modified.isEmpty) { + modifiedDecorations.push({ range: m.modified.toInclusiveRange()!, options: diffLineAddDecorationBackgroundWithIndicator }); + } + + if (m.modified.isEmpty || m.original.isEmpty) { + if (!m.original.isEmpty) { + originalDecorations.push({ range: m.original.toInclusiveRange()!, options: diffWholeLineDeleteDecoration }); + } + if (!m.modified.isEmpty) { + modifiedDecorations.push({ range: m.modified.toInclusiveRange()!, options: diffWholeLineAddDecoration }); + } + } else { + for (const i of m.innerChanges || []) { + // Don't show empty markers outside the line range + if (m.original.contains(i.originalRange.startLineNumber)) { + originalDecorations.push({ range: i.originalRange, options: i.originalRange.isEmpty() ? diffDeleteDecorationEmpty : diffDeleteDecoration }); + } + if (m.modified.contains(i.modifiedRange.startLineNumber)) { + modifiedDecorations.push({ range: i.modifiedRange, options: i.modifiedRange.isEmpty() ? diffAddDecorationEmpty : diffAddDecoration }); + } + } + } + } + + return modifiedDecorations; + }); + + private readonly _layout1 = derived(this, reader => { + const model = this._editor.getModel()!; + const inlineEdit = this._edit.read(reader); + if (!inlineEdit) { return null; } + + const range = inlineEdit.range; + + let maxLeft = 0; + for (let i = range.startLineNumber; i < range.endLineNumberExclusive; i++) { + const column = model.getLineMaxColumn(i); + const left = this._editor.getOffsetForColumn(i, column); + maxLeft = Math.max(maxLeft, left); + } + + const layoutInfo = this._editor.getLayoutInfo(); + const contentLeft = layoutInfo.contentLeft; + + return { left: contentLeft + maxLeft }; + }); + + private readonly _layout = derived(this, (reader) => { + const inlineEdit = this._edit.read(reader); + if (!inlineEdit) { return null; } + + const range = inlineEdit.range; + + const scrollLeft = this._editorObs.scrollLeft.read(reader); + + const left = this._layout1.read(reader)!.left + 20 - scrollLeft; + + const selectionTop = this._editor.getTopForLineNumber(range.startLineNumber) - this._editorObs.scrollTop.read(reader); + const selectionBottom = this._editor.getTopForLineNumber(range.endLineNumberExclusive) - this._editorObs.scrollTop.read(reader); + + const topCode = new Point(left, selectionTop); + const bottomCode = new Point(left, selectionBottom); + const codeHeight = selectionBottom - selectionTop; + + const codeEditDist = 50; + const editHeight = this._editor.getOption(EditorOption.lineHeight) * inlineEdit.newLines.length; + const difference = codeHeight - editHeight; + const topEdit = new Point(left + codeEditDist, selectionTop + (difference / 2)); + const bottomEdit = new Point(left + codeEditDist, selectionBottom - (difference / 2)); + + return { + topCode, + bottomCode, + codeHeight, + topEdit, + bottomEdit, + editHeight, + }; + }); + + constructor( + private readonly _editor: ICodeEditor, + private readonly _edit: IObservable, + private readonly _userPrompt: ISettableObservable, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { + super(); + const visible = derived(this, reader => this._edit.read(reader) !== undefined || this._userPrompt.read(reader) !== undefined); + this._register(applyStyle(this._elements.root, { + display: derived(this, reader => visible.read(reader) ? 'block' : 'none') + })); + + this._register(appendRemoveOnDispose(this._editor.getDomNode()!, this._elements.root)); + + this._register(observableCodeEditor(_editor).createOverlayWidget({ + domNode: this._elements.root, + position: constObservable(null), + allowEditorOverflow: false, + minContentWidthInPx: derived(reader => { + const x = this._layout1.read(reader)?.left; + if (x === undefined) { return 0; } + const width = this._previewEditorObs.contentWidth.read(reader); + return x + width; + }), + })); + + this._previewEditor.setModel(this._previewTextModel); + + this._register(this._previewEditorObs.setDecorations(this._decorations)); + + this._register(autorun(reader => { + const layoutInfo = this._layout.read(reader); + if (!layoutInfo) { return; } + + const { topCode, bottomCode, topEdit, bottomEdit, editHeight } = layoutInfo; + + const straightWidthCode = 10; + const straightWidthEdit = 0; + const bezierDist = 40; + + const path = new PathBuilder() + .moveTo(topCode) + .lineTo(topCode.deltaX(straightWidthCode)) + .curveTo( + topCode.deltaX(straightWidthCode + bezierDist), + topEdit.deltaX(-bezierDist - straightWidthEdit), + topEdit.deltaX(-straightWidthEdit), + ) + .lineTo(topEdit) + .lineTo(bottomEdit) + .lineTo(bottomEdit.deltaX(-straightWidthEdit)) + .curveTo( + bottomEdit.deltaX(-bezierDist - straightWidthEdit), + bottomCode.deltaX(straightWidthCode + bezierDist), + bottomCode.deltaX(straightWidthCode), + ) + .lineTo(bottomCode) + .build(); + + + this._elements.path.setAttribute('d', path); + + this._elements.editorContainer.style.top = `${topEdit.y}px`; + this._elements.editorContainer.style.left = `${topEdit.x}px`; + this._elements.editorContainer.style.height = `${editHeight}px`; + + const width = this._previewEditorObs.contentWidth.read(reader); + this._previewEditor.layout({ height: editHeight, width }); + })); + + this._promptEditor.setModel(this._promptTextModel); + this._promptEditor.layout(); + this._register(createTwoWaySync(mapSettableObservable(this._userPrompt, v => v ?? '', v => v), observableCodeEditor(this._promptEditor).value)); + + this._register(autorun(reader => { + const isFocused = observableCodeEditor(this._promptEditor).isFocused.read(reader); + this._elements.root.classList.toggle('focused', isFocused); + })); + } +} + +function mapSettableObservable(obs: ISettableObservable, fn1: (value: T) => T1, fn2: (value: T1) => T): ISettableObservable { + return derivedWithSetter(undefined, reader => fn1(obs.read(reader)), (value, tx) => obs.set(fn2(value), tx)); +} + +class Point { + constructor( + public readonly x: number, + public readonly y: number, + ) { } + + public add(other: Point): Point { + return new Point(this.x + other.x, this.y + other.y); + } + + public deltaX(delta: number): Point { + return new Point(this.x + delta, this.y); + } +} + +class PathBuilder { + private _data: string = ''; + + public moveTo(point: Point): this { + this._data += `M ${point.x} ${point.y} `; + return this; + } + + public lineTo(point: Point): this { + this._data += `L ${point.x} ${point.y} `; + return this; + } + + public curveTo(cp1: Point, cp2: Point, to: Point): this { + this._data += `C ${cp1.x} ${cp1.y} ${cp2.x} ${cp2.y} ${to.x} ${to.y} `; + return this; + } + + public build(): string { + return this._data; + } +} + +function createTwoWaySync(main: ISettableObservable, target: ISettableObservable): IDisposable { + const store = new DisposableStore(); + store.add(autorun(reader => { + const value = main.read(reader); + target.set(value, undefined); + })); + store.add(autorun(reader => { + const value = target.read(reader); + main.set(value, undefined); + })); + return store; +} diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index ed1e6badc5085..e40c7056aa7ad 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -42,6 +42,7 @@ import 'vs/editor/contrib/links/browser/links'; import 'vs/editor/contrib/longLinesHelper/browser/longLinesHelper'; import 'vs/editor/contrib/multicursor/browser/multicursor'; import 'vs/editor/contrib/inlineEdit/browser/inlineEdit.contribution'; +import 'vs/editor/contrib/inlineEdits/browser/inlineEdits.contribution'; import 'vs/editor/contrib/parameterHints/browser/parameterHints'; import 'vs/editor/contrib/placeholderText/browser/placeholderText.contribution'; import 'vs/editor/contrib/rename/browser/rename'; diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index c1d80dd2c50e3..d85af48eacffc 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -211,6 +211,7 @@ export class MenuId { static readonly TerminalStickyScrollContext = new MenuId('TerminalStickyScrollContext'); static readonly WebviewContext = new MenuId('WebviewContext'); static readonly InlineCompletionsActions = new MenuId('InlineCompletionsActions'); + static readonly InlineEditsActions = new MenuId('InlineEditsActions'); static readonly InlineEditActions = new MenuId('InlineEditActions'); static readonly NewFile = new MenuId('NewFile'); static readonly MergeInput1Toolbar = new MenuId('MergeToolbar1Toolbar'); diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 41ae1ab857c55..4aa61aeab4591 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -612,6 +612,9 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise => { return this._proxy.$provideInlineCompletions(handle, model.uri, position, context, token); }, + provideInlineEdits: async (model: ITextModel, range: EditorRange, context: languages.InlineCompletionContext, token: CancellationToken): Promise => { + return this._proxy.$provideInlineEdits(handle, model.uri, range, context, token); + }, handleItemDidShow: async (completions: IdentifiableInlineCompletions, item: IdentifiableInlineCompletion, updatedInsertText: string): Promise => { if (supportsHandleEvents) { await this._proxy.$handleInlineCompletionDidShow(handle, completions.pid, item.idx, updatedInsertText); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 793267c4a7c99..2543db5dcbacd 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2190,6 +2190,7 @@ export interface ExtHostLanguageFeaturesShape { $resolveCompletionItem(handle: number, id: ChainedCacheId, token: CancellationToken): Promise; $releaseCompletionItems(handle: number, id: number): void; $provideInlineCompletions(handle: number, resource: UriComponents, position: IPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise; + $provideInlineEdits(handle: number, resource: UriComponents, range: IRange, context: languages.InlineCompletionContext, token: CancellationToken): Promise; $handleInlineCompletionDidShow(handle: number, pid: number, idx: number, updatedInsertText: string): void; $handleInlineCompletionPartialAccept(handle: number, pid: number, idx: number, acceptedCharacters: number, info: languages.PartialAcceptInfo): void; $freeInlineCompletionsList(handle: number, pid: number): void; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index a4c8f96ca2015..0706a87cedb2b 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -33,7 +33,7 @@ import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostTelemetry, IExtHostTelemetry } from 'vs/workbench/api/common/extHostTelemetry'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import { CodeActionKind, CompletionList, Disposable, DocumentDropOrPasteEditKind, DocumentSymbol, InlineCompletionTriggerKind, InlineEditTriggerKind, InternalDataTransferItem, Location, NewSymbolNameTriggerKind, Range, SemanticTokens, SemanticTokensEdit, SemanticTokensEdits, SnippetString, SymbolInformation, SyntaxTokenType } from 'vs/workbench/api/common/extHostTypes'; -import { isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import type * as vscode from 'vscode'; import { Cache } from './cache'; import * as extHostProtocol from './extHost.protocol'; @@ -1287,6 +1287,10 @@ class InlineCompletionAdapterBase { return undefined; } + async provideInlineEdits(resource: URI, range: IRange, context: languages.InlineCompletionContext, token: CancellationToken): Promise { + return undefined; + } + disposeCompletions(pid: number): void { } handleDidShowCompletionItem(pid: number, idx: number, updatedInsertText: string): void { } @@ -1392,6 +1396,82 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase { }; } + override async provideInlineEdits(resource: URI, range: IRange, context: languages.InlineCompletionContext, token: CancellationToken): Promise { + if (!this._provider.provideInlineEdits) { + return undefined; + } + checkProposedApiEnabled(this._extension, 'inlineCompletionsAdditions'); + + const doc = this._documents.getDocument(resource); + const r = typeConvert.Range.to(range); + + const result = await this._provider.provideInlineEdits(doc, r, { + selectedCompletionInfo: + context.selectedSuggestionInfo + ? { + range: typeConvert.Range.to(context.selectedSuggestionInfo.range), + text: context.selectedSuggestionInfo.text + } + : undefined, + triggerKind: this.languageTriggerKindToVSCodeTriggerKind[context.triggerKind], + userPrompt: context.userPrompt, + }, token); + + if (!result) { + // undefined and null are valid results + return undefined; + } + + if (token.isCancellationRequested) { + // cancelled -> return without further ado, esp no caching + // of results as they will leak + return undefined; + } + + const normalizedResult = Array.isArray(result) ? result : result.items; + const commands = this._isAdditionsProposedApiEnabled ? Array.isArray(result) ? [] : result.commands || [] : []; + const enableForwardStability = this._isAdditionsProposedApiEnabled && !Array.isArray(result) ? result.enableForwardStability : undefined; + + let disposableStore: DisposableStore | undefined = undefined; + const pid = this._references.createReferenceId({ + dispose() { + disposableStore?.dispose(); + }, + items: normalizedResult + }); + + return { + pid, + items: normalizedResult.map((item, idx) => { + let command: languages.Command | undefined = undefined; + if (item.command) { + if (!disposableStore) { + disposableStore = new DisposableStore(); + } + command = this._commands.toInternal(item.command, disposableStore); + } + + const insertText = item.insertText; + return ({ + insertText: typeof insertText === 'string' ? insertText : { snippet: insertText.value }, + filterText: item.filterText, + range: item.range ? typeConvert.Range.from(item.range) : undefined, + command, + idx: idx, + completeBracketPairs: this._isAdditionsProposedApiEnabled ? item.completeBracketPairs : false, + }); + }), + commands: commands.map(c => { + if (!disposableStore) { + disposableStore = new DisposableStore(); + } + return this._commands.toInternal(c, disposableStore); + }), + suppressSuggestions: false, + enableForwardStability, + }; + } + override disposeCompletions(pid: number) { const data = this._references.disposeReferenceId(pid); data?.dispose(); @@ -2581,6 +2661,10 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._withAdapter(handle, InlineCompletionAdapterBase, adapter => adapter.provideInlineCompletions(URI.revive(resource), position, context, token), undefined, token); } + $provideInlineEdits(handle: number, resource: UriComponents, range: IRange, context: languages.InlineCompletionContext, token: CancellationToken): Promise { + return this._withAdapter(handle, InlineCompletionAdapterBase, adapter => adapter.provideInlineEdits(URI.revive(resource), range, context, token), undefined, token); + } + $handleInlineCompletionDidShow(handle: number, pid: number, idx: number, updatedInsertText: string): void { this._withAdapter(handle, InlineCompletionAdapterBase, async adapter => { adapter.handleDidShowCompletionItem(pid, idx, updatedInsertText); diff --git a/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts b/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts index 2715014a0a8f5..eccc51b53808c 100644 --- a/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts +++ b/src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts @@ -60,6 +60,12 @@ declare module 'vscode' { */ // eslint-disable-next-line local/vscode-dts-provider-naming handleDidPartiallyAcceptCompletionItem?(completionItem: InlineCompletionItem, info: PartialAcceptInfo): void; + + provideInlineEdits?(document: TextDocument, range: Range, context: InlineCompletionContext, token: CancellationToken): ProviderResult; + } + + export interface InlineCompletionContext { + readonly userPrompt?: string; } export interface PartialAcceptInfo { From 94e56caf84aba117ad742033aa9f927b479f63b5 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 21 Jun 2024 00:35:53 +0200 Subject: [PATCH 394/755] SCM - rendering bugfix (#216758) --- .../contrib/scm/browser/scmHistory.ts | 91 +++++++++---------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmHistory.ts b/src/vs/workbench/contrib/scm/browser/scmHistory.ts index 16349eaa7853c..cab113604dad9 100644 --- a/src/vs/workbench/contrib/scm/browser/scmHistory.ts +++ b/src/vs/workbench/contrib/scm/browser/scmHistory.ts @@ -83,68 +83,63 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV outputIndex !== -1 ? outputSwimlanes[outputIndex].color : inputIndex !== -1 ? inputSwimlanes[inputIndex].color : 0; + let outputSwimlaneIndex = 0; for (let index = 0; index < inputSwimlanes.length; index++) { - const node = inputSwimlanes[index]; const color = graphColors[inputSwimlanes[index].color]; - // Not the current commit - if (node.id !== historyItem.id) { - if (index < outputSwimlanes.length && node.id === outputSwimlanes[index].id) { - // Draw | - const path = drawVerticalLine(SWIMLANE_WIDTH * (index + 1), 0, SWIMLANE_HEIGHT, color); - svg.append(path); - } else { + // Current commit + if (inputSwimlanes[index].id === historyItem.id) { + // Base commit + if (index !== circleIndex) { const d: string[] = []; const path = createPath(color); - // Draw | - d.push(`M ${SWIMLANE_WIDTH * (index + 1)} 0`); - d.push(`V 6`); - // Draw / - d.push(`A ${SWIMLANE_CURVE_RADIUS} ${SWIMLANE_CURVE_RADIUS} 0 0 1 ${(SWIMLANE_WIDTH * (index + 1)) - SWIMLANE_CURVE_RADIUS} ${SWIMLANE_HEIGHT / 2}`); - - // Start walking backwards from the current index and - // find the first occurrence in the output swimlanes - // array - let nodeOutputIndex = -1; - for (let j = Math.min(index, outputSwimlanes.length) - 1; j >= 0; j--) { - if (outputSwimlanes[j].id === node.id) { - nodeOutputIndex = j; - break; - } - } + d.push(`M ${SWIMLANE_WIDTH * (index + 1)} 0`); + d.push(`A ${SWIMLANE_WIDTH} ${SWIMLANE_WIDTH} 0 0 1 ${SWIMLANE_WIDTH * (index)} ${SWIMLANE_WIDTH}`); // Draw - - d.push(`H ${(SWIMLANE_WIDTH * (nodeOutputIndex + 1)) + SWIMLANE_CURVE_RADIUS}`); - - // Draw / - d.push(`A ${SWIMLANE_CURVE_RADIUS} ${SWIMLANE_CURVE_RADIUS} 0 0 0 ${SWIMLANE_WIDTH * (nodeOutputIndex + 1)} ${(SWIMLANE_HEIGHT / 2) + SWIMLANE_CURVE_RADIUS}`); - - // Draw | - d.push(`V ${SWIMLANE_HEIGHT}`); + d.push(`H ${SWIMLANE_WIDTH * (circleIndex + 1)}`); path.setAttribute('d', d.join(' ')); svg.append(path); + } else { + outputSwimlaneIndex++; } + } else { + // Not the current commit + if (outputSwimlaneIndex < outputSwimlanes.length && + inputSwimlanes[index].id === outputSwimlanes[outputSwimlaneIndex].id) { + if (index === outputSwimlaneIndex) { + // Draw | + const path = drawVerticalLine(SWIMLANE_WIDTH * (index + 1), 0, SWIMLANE_HEIGHT, color); + svg.append(path); + } else { + const d: string[] = []; + const path = createPath(color); + + // Draw | + d.push(`M ${SWIMLANE_WIDTH * (index + 1)} 0`); + d.push(`V 6`); + + // Draw / + d.push(`A ${SWIMLANE_CURVE_RADIUS} ${SWIMLANE_CURVE_RADIUS} 0 0 1 ${(SWIMLANE_WIDTH * (index + 1)) - SWIMLANE_CURVE_RADIUS} ${SWIMLANE_HEIGHT / 2}`); + + // Draw - + d.push(`H ${(SWIMLANE_WIDTH * (outputSwimlaneIndex + 1)) + SWIMLANE_CURVE_RADIUS}`); + + // Draw / + d.push(`A ${SWIMLANE_CURVE_RADIUS} ${SWIMLANE_CURVE_RADIUS} 0 0 0 ${SWIMLANE_WIDTH * (outputSwimlaneIndex + 1)} ${(SWIMLANE_HEIGHT / 2) + SWIMLANE_CURVE_RADIUS}`); + + // Draw | + d.push(`V ${SWIMLANE_HEIGHT}`); + + path.setAttribute('d', d.join(' ')); + svg.append(path); + } - continue; - } - - // Base commit - if (index !== circleIndex) { - const d: string[] = []; - const path = createPath(color); - - // Draw / - d.push(`M ${SWIMLANE_WIDTH * (index + 1)} 0`); - d.push(`A ${SWIMLANE_WIDTH} ${SWIMLANE_WIDTH} 0 0 1 ${SWIMLANE_WIDTH * (index)} ${SWIMLANE_WIDTH}`); - - // Draw - - d.push(`H ${SWIMLANE_WIDTH * (circleIndex + 1)}`); - - path.setAttribute('d', d.join(' ')); - svg.append(path); + outputSwimlaneIndex++; + } } } From ec7a89ce131256836e6d3200f8c611157aaef41a Mon Sep 17 00:00:00 2001 From: Cody Beyer Date: Thu, 20 Jun 2024 16:05:08 -0700 Subject: [PATCH 395/755] updated file to include ai and vector db libs for py and js --- .../electron-sandbox/workspaceTagsService.ts | 98 ++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts index b560ed8999b52..fcf25cea7081d 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts @@ -178,7 +178,36 @@ const ModulesToLookFor = [ '@azure/web-pubsub-express', '@azure/openai', '@azure/arm-hybridkubernetes', - '@azure/arm-kubernetesconfiguration' + '@azure/arm-kubernetesconfiguration', + //AI and vector db dev packages + '@anthropic-ai/sdk', + '@anthropic-ai/tokenizer', + '@arizeai/openinference-instrumentation-langchain', + '@arizeai/openinference-instrumentation-openai', + '@aws-sdk-client-bedrock-runtime', + '@aws-sdk/client-bedrock', + '@datastax/astra-db-ts', + 'fireworks-js', + '@google-cloud/aiplatform', + '@huggingface/inference', + 'humanloop', + '@langchain/anthropic', + 'langsmith', + 'llamaindex', + 'mongodb', + 'neo4j-driver', + 'ollama', + 'onnxruntime-node', + 'onnxruntime-web', + 'pg', + 'postgresql', + 'redis', + '@supabase/supabase-js', + '@tensorflow/tfjs', + '@xenova/transformers', + 'tika', + 'weaviate-client', + '@zilliz/milvus2-sdk-node', ]; const PyMetaModulesToLookFor = [ @@ -311,7 +340,27 @@ const PyModulesToLookFor = [ 'guidance', 'openai', 'semantic-kernel', - 'sentence-transformers' + 'sentence-transformers', + // AI and vector db dev packages + 'anthropic', + 'aporia', + 'arize', + 'deepchecks', + 'fireworks-ai', + 'langchain-fireworks', + 'humanloop', + 'pymongo', + 'langchain-anthropic', + 'langchain-huggingface', + 'langchain-fireworks', + 'ollama', + 'onnxruntime', + 'pgvector', + 'sentence-transformers', + 'tika', + 'trulens', + 'trulens-eval', + 'wandb' ]; const GoModulesToLookFor = [ @@ -428,6 +477,12 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.react" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@angular/core" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.vue" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@anthropic-ai/sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@anthropic-ai/tokenizer" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@arizeai/openinference-instrumentation-langchain" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@arizeai/openinference-instrumentation-openai" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@aws-sdk-client-bedrock-runtime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@aws-sdk/client-bedrock" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.aws-sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.aws-amplify-sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -439,11 +494,13 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.@azure/keyvault" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/search" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@google-cloud/aiplatform:{"classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.azure" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.azure-storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@google-cloud/common" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.firebase" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.heroku-cli" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@huggingface/inference" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@microsoft/teams-js" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@microsoft/office-js" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@microsoft/office-js-helpers" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -470,15 +527,35 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.cypress" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.chroma" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.faiss" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.fireworks-js" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@datastax/astra-db-ts" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.humanloop" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.langchain" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@langchain/anthropic" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.langsmith' : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.llamaindex" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.milvus" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.mongodb" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.neo4j-driver" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.ollama" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.onnxruntime-node" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.onnxruntime-web" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.openai" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.pinecone" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.postgresql" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.pg" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.qdrant" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.redis" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@supabase/supabase-js" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@tensorflow/tfjs" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@xenova/transformers" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.weaviate-client" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@zilliz/milvus2-sdk-node" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.nightwatch" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.protractor" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.puppeteer" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.selenium-webdriver" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.tika" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.webdriverio" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.gherkin" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/app-configuration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -745,13 +822,30 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.py.azure-messaging-webpubsubservice" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-data-nspkg" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-data-tables" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.arize" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.aporia" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.anthropic" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.deepchecks" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.fireworks-ai" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.transformers" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.humanloop" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.langchain" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.langchain-anthropic" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.langchain-fireworks" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.langchain-huggingface" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.llama-index" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.guidance" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.ollama" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.onnxruntime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.openai" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.pymongo" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.pgvector" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.semantic-kernel" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.sentence-transformers" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.tika" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.trulens" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.trulens-eval" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.wandb" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.go.mod.github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.go.mod.github.com/Azure/azure-sdk-for-go/sdk/storage/azfile" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.go.mod.github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From a15f5726f1a584f96e3a7009da56cc7771906aab Mon Sep 17 00:00:00 2001 From: Cody Beyer Date: Thu, 20 Jun 2024 16:14:34 -0700 Subject: [PATCH 396/755] fixed missing quote on one line --- .../contrib/tags/electron-sandbox/workspaceTagsService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts index fcf25cea7081d..114ee452f2eff 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts @@ -494,7 +494,7 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.@azure/keyvault" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/search" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.@google-cloud/aiplatform:{"classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@google-cloud/aiplatform" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.azure" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.azure-storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@google-cloud/common" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From eeb82996395bcb4feb3954551ce3559ba8207b9e Mon Sep 17 00:00:00 2001 From: Cody Beyer Date: Thu, 20 Jun 2024 16:28:09 -0700 Subject: [PATCH 397/755] fixed bad quote type --- .../contrib/tags/electron-sandbox/workspaceTagsService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts index 114ee452f2eff..c77eadc1d0c59 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts @@ -532,7 +532,7 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.humanloop" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.langchain" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@langchain/anthropic" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.langsmith' : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.langsmith" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.llamaindex" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.milvus" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.mongodb" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From 0bb8c91f56b235fb9154e7a517f840fadbe667a8 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Thu, 20 Jun 2024 16:28:47 -0700 Subject: [PATCH 398/755] More polish --- .../contrib/inlineChat/browser/inlineChatStrategies.ts | 2 +- .../workbench/contrib/inlineChat/browser/media/inlineChat.css | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index 518b7fcca6a45..f2b8c7903e68f 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -577,7 +577,7 @@ export class LiveStrategy extends EditModeStrategy { message = localize('change.0', "Nothing changed."); } else if (remaining === 1) { message = needsReview - ? localize('review.1', "$(info) Accept or discard change") + ? localize('review.1', "Accept or Discard change") : localize('change.1', "1 change"); } else { message = needsReview diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index 083f448ff69ef..79fba8eddb9dc 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -157,7 +157,6 @@ font-size: 12px; line-height: 16px; padding: 2px; - margin: 2px 0; border-radius: 2px; } From 16fa357a0d508a9bd45c7c47442e2a3aa8eba3f6 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:38:44 -0700 Subject: [PATCH 399/755] chore: disable APIScan to fix build (#216767) --- build/azure-pipelines/sdl-scan.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/build/azure-pipelines/sdl-scan.yml b/build/azure-pipelines/sdl-scan.yml index 6be5f0ad95dbb..af20a305d9cdc 100644 --- a/build/azure-pipelines/sdl-scan.yml +++ b/build/azure-pipelines/sdl-scan.yml @@ -130,18 +130,18 @@ steps: flattenFolders: true condition: succeeded() - - task: APIScan@2 - inputs: - softwareFolder: $(agent.builddirectory)\scanbin - softwareName: 'vscode-client' - softwareVersionNum: '1' - symbolsFolder: 'SRV*http://symweb;$(agent.builddirectory)\symbols' - isLargeApp: false - toolVersion: 'Latest' - displayName: Run ApiScan - condition: succeeded() - env: - AzureServicesAuthConnectionString: $(apiscan-connectionstring) + # - task: APIScan@2 + # inputs: + # softwareFolder: $(agent.builddirectory)\scanbin + # softwareName: 'vscode-client' + # softwareVersionNum: '1' + # symbolsFolder: 'SRV*http://symweb;$(agent.builddirectory)\symbols' + # isLargeApp: false + # toolVersion: 'Latest' + # displayName: Run ApiScan + # condition: succeeded() + # env: + # AzureServicesAuthConnectionString: $(apiscan-connectionstring) - task: PublishSecurityAnalysisLogs@3 inputs: From 5f330d38645ed03f15202671e554d166d5d64552 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Thu, 20 Jun 2024 17:34:00 -0700 Subject: [PATCH 400/755] Fix sort order of chat variables in quick pick (#216773) --- .../chat/browser/actions/chatContextActions.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index f37af7c9d29a6..ee4b0beba482b 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -32,6 +32,7 @@ import { ISymbolQuickPickItem, SymbolsQuickAccessProvider } from 'vs/workbench/c import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorType } from 'vs/editor/common/editorCommon'; +import { compare } from 'vs/base/common/strings'; export function registerChatContextActions() { registerAction2(AttachContextAction); @@ -287,7 +288,21 @@ class AttachContextAction extends Action2 { prefix: SymbolsQuickAccessProvider.PREFIX }); - this._show(quickInputService, commandService, widget, quickPickItems); + function extractTextFromIconLabel(label: string | undefined): string { + if (!label) { + return ''; + } + const match = label.match(/\$\([^\)]+\)\s*(.+)/); + return match ? match[1] : label; + } + + this._show(quickInputService, commandService, widget, quickPickItems.sort(function (a, b) { + + const first = extractTextFromIconLabel(a.label).toUpperCase(); + const second = extractTextFromIconLabel(b.label).toUpperCase(); + + return compare(first, second); + })); } private _show(quickInputService: IQuickInputService, commandService: ICommandService, widget: IChatWidget, quickPickItems: (IChatContextQuickPickItem | QuickPickItem)[], query: string = '') { From ee173b0e65f64049fc6b6750d0dde4e51420a245 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 20 Jun 2024 18:54:00 -0700 Subject: [PATCH 401/755] Tools API tweaks, merge into lmTools (#216750) * Tools API tweaks, merge into lmTools * Rename more id -> name * Fix * Add lmTools API version --- extensions/vscode-api-tests/package.json | 3 +- .../common/extensionsApiProposals.ts | 4 +-- .../browser/mainThreadLanguageModelTools.ts | 12 +++---- .../workbench/api/common/extHost.api.impl.ts | 6 ++-- .../api/common/extHostChatAgents2.ts | 2 +- .../api/common/extHostLanguageModelTools.ts | 24 +++++++------ .../api/common/extHostTypeConverters.ts | 11 ++++++ .../chat/common/languageModelToolsService.ts | 22 ++++++------ .../tools/languageModelToolsContribution.ts | 29 +++++++++------ src/vscode-dts/vscode.proposed.chatTools.d.ts | 35 ------------------- src/vscode-dts/vscode.proposed.lmTools.d.ts | 34 +++++++++++++++++- 11 files changed, 99 insertions(+), 83 deletions(-) delete mode 100644 src/vscode-dts/vscode.proposed.chatTools.d.ts diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index 868f7cfd4e756..11d375461a290 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -53,7 +53,8 @@ "treeViewActiveItem", "treeViewReveal", "workspaceTrust", - "telemetry" + "telemetry", + "lmTools" ], "private": true, "activationEvents": [], diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index 9c6e94d1c4c92..abfd6c5228c52 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -42,9 +42,6 @@ const _allApiProposals = { chatTab: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTab.d.ts', }, - chatTools: { - proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatTools.d.ts', - }, chatVariableResolver: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatVariableResolver.d.ts', }, @@ -227,6 +224,7 @@ const _allApiProposals = { }, lmTools: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.lmTools.d.ts', + version: 2 }, mappedEditsProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts', diff --git a/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts b/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts index d4247860254f6..fbda6ced5a3e4 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts @@ -33,18 +33,18 @@ export class MainThreadLanguageModelTools extends Disposable implements MainThre return this._languageModelToolsService.invokeTool(name, parameters, token); } - $registerTool(id: string): void { + $registerTool(name: string): void { const disposable = this._languageModelToolsService.registerToolImplementation( - id, + name, { invoke: async (parameters, token) => { - return await this._proxy.$invokeTool(id, parameters, token); + return await this._proxy.$invokeTool(name, parameters, token); }, }); - this._tools.set(id, disposable); + this._tools.set(name, disposable); } - $unregisterTool(id: string): void { - this._tools.deleteAndDispose(id); + $unregisterTool(name: string): void { + this._tools.deleteAndDispose(name); } } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 6daff426cdaad..4493a01248a87 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1483,15 +1483,15 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I } }, registerTool(toolId: string, tool: vscode.LanguageModelTool) { - checkProposedApiEnabled(extension, 'chatVariableResolver'); + checkProposedApiEnabled(extension, 'lmTools'); return extHostLanguageModelTools.registerTool(extension, toolId, tool); }, invokeTool(toolId: string, parameters: Object, token: vscode.CancellationToken) { - checkProposedApiEnabled(extension, 'chatVariableResolver'); + checkProposedApiEnabled(extension, 'lmTools'); return extHostLanguageModelTools.invokeTool(toolId, parameters, token); }, get tools() { - checkProposedApiEnabled(extension, 'chatVariableResolver'); + checkProposedApiEnabled(extension, 'lmTools'); return extHostLanguageModelTools.tools; }, }; diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index 9e8bd3e587c19..2bdeacb491a43 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -22,7 +22,7 @@ import { CommandsConverter, ExtHostCommands } from 'vs/workbench/api/common/extH import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { ChatAgentLocation, IChatAgentRequest, IChatAgentResult } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { IChatContentReference, IChatFollowup, IChatUserActionEvent, ChatAgentVoteDirection, IChatResponseErrorDetails } from 'vs/workbench/contrib/chat/common/chatService'; +import { ChatAgentVoteDirection, IChatContentReference, IChatFollowup, IChatResponseErrorDetails, IChatUserActionEvent } from 'vs/workbench/contrib/chat/common/chatService'; import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { Dto } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import type * as vscode from 'vscode'; diff --git a/src/vs/workbench/api/common/extHostLanguageModelTools.ts b/src/vs/workbench/api/common/extHostLanguageModelTools.ts index 46ea26e07d7ff..e588f50ab6da2 100644 --- a/src/vs/workbench/api/common/extHostLanguageModelTools.ts +++ b/src/vs/workbench/api/common/extHostLanguageModelTools.ts @@ -7,6 +7,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtHostLanguageModelToolsShape, IMainContext, MainContext, MainThreadLanguageModelToolsShape } from 'vs/workbench/api/common/extHost.protocol'; +import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import { IToolData, IToolDelta } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; import type * as vscode from 'vscode'; @@ -23,7 +24,7 @@ export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape this._proxy.$getTools().then(tools => { for (const tool of tools) { - this._allTools.set(tool.id, tool); + this._allTools.set(tool.name, tool); } }); } @@ -35,7 +36,7 @@ export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape async $acceptToolDelta(delta: IToolDelta): Promise { if (delta.added) { - this._allTools.set(delta.added.id, delta.added); + this._allTools.set(delta.added.name, delta.added); } if (delta.removed) { @@ -44,25 +45,26 @@ export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape } get tools(): vscode.LanguageModelToolDescription[] { - return Array.from(this._allTools.values()); + return Array.from(this._allTools.values()) + .map(tool => typeConvert.LanguageModelToolDescription.to(tool)); } - async $invokeTool(id: string, parameters: any, token: CancellationToken): Promise { - const item = this._registeredTools.get(id); + async $invokeTool(name: string, parameters: any, token: CancellationToken): Promise { + const item = this._registeredTools.get(name); if (!item) { - throw new Error(`Unknown tool ${id}`); + throw new Error(`Unknown tool ${name}`); } return await item.tool.invoke(parameters, token); } - registerTool(extension: IExtensionDescription, id: string, tool: vscode.LanguageModelTool): IDisposable { - this._registeredTools.set(id, { extension, tool }); - this._proxy.$registerTool(id); + registerTool(extension: IExtensionDescription, name: string, tool: vscode.LanguageModelTool): IDisposable { + this._registeredTools.set(name, { extension, tool }); + this._proxy.$registerTool(name); return toDisposable(() => { - this._registeredTools.delete(id); - this._proxy.$unregisterTool(id); + this._registeredTools.delete(name); + this._proxy.$unregisterTool(name); }); } } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index fe20f202483cf..32d972e986224 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -53,6 +53,7 @@ import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/ed import { Dto } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import type * as vscode from 'vscode'; import * as types from './extHostTypes'; +import { IToolData } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; export namespace Command { @@ -2743,3 +2744,13 @@ export namespace DebugTreeItem { }; } } + +export namespace LanguageModelToolDescription { + export function to(item: IToolData): vscode.LanguageModelToolDescription { + return { + name: item.name, + description: item.description, + parametersSchema: item.parametersSchema, + }; + } +} diff --git a/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts b/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts index a498aff934656..a1c70e6d1a48b 100644 --- a/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts +++ b/src/vs/workbench/contrib/chat/common/languageModelToolsService.ts @@ -11,7 +11,7 @@ import { Iterable } from 'vs/base/common/iterator'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export interface IToolData { - id: string; + name: string; displayName?: string; description: string; parametersSchema?: Object; @@ -37,7 +37,7 @@ export interface ILanguageModelToolsService { _serviceBrand: undefined; onDidChangeTools: Event; registerToolData(toolData: IToolData): IDisposable; - registerToolImplementation(id: string, tool: IToolImpl): IDisposable; + registerToolImplementation(name: string, tool: IToolImpl): IDisposable; getTools(): Iterable>; invokeTool(name: string, parameters: any, token: CancellationToken): Promise; } @@ -55,28 +55,28 @@ export class LanguageModelToolsService implements ILanguageModelToolsService { ) { } registerToolData(toolData: IToolData): IDisposable { - if (this._tools.has(toolData.id)) { - throw new Error(`Tool "${toolData.id}" is already registered.`); + if (this._tools.has(toolData.name)) { + throw new Error(`Tool "${toolData.name}" is already registered.`); } - this._tools.set(toolData.id, { data: toolData }); + this._tools.set(toolData.name, { data: toolData }); this._onDidChangeTools.fire({ added: toolData }); return toDisposable(() => { - this._tools.delete(toolData.id); - this._onDidChangeTools.fire({ removed: toolData.id }); + this._tools.delete(toolData.name); + this._onDidChangeTools.fire({ removed: toolData.name }); }); } - registerToolImplementation(id: string, tool: IToolImpl): IDisposable { - const entry = this._tools.get(id); + registerToolImplementation(name: string, tool: IToolImpl): IDisposable { + const entry = this._tools.get(name); if (!entry) { - throw new Error(`Tool "${id}" was not contributed.`); + throw new Error(`Tool "${name}" was not contributed.`); } if (entry.impl) { - throw new Error(`Tool "${id}" already has an implementation.`); + throw new Error(`Tool "${name}" already has an implementation.`); } entry.impl = tool; diff --git a/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts b/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts index f75f30ff1c296..5cc34e72faff3 100644 --- a/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts +++ b/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.ts @@ -8,12 +8,13 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { DisposableMap } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { ILogService } from 'vs/platform/log/common/log'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { ILanguageModelToolsService } from 'vs/workbench/contrib/chat/common/languageModelToolsService'; import * as extensionsRegistry from 'vs/workbench/services/extensions/common/extensionsRegistry'; interface IRawToolContribution { - id: string; + name: string; displayName?: string; description: string; parametersSchema?: IJSONSchema; @@ -23,7 +24,7 @@ const languageModelToolsExtensionPoint = extensionsRegistry.ExtensionsRegistry.r extensionPoint: 'languageModelTools', activationEventsGenerator: (contributions: IRawToolContribution[], result) => { for (const contrib of contributions) { - result.push(`onLanguageModelTool:${contrib.id}`); + result.push(`onLanguageModelTool:${contrib.name}`); } }, jsonSchema: { @@ -32,11 +33,11 @@ const languageModelToolsExtensionPoint = extensionsRegistry.ExtensionsRegistry.r items: { additionalProperties: false, type: 'object', - defaultSnippets: [{ body: { id: '', description: '' } }], - required: ['id', 'description'], + defaultSnippets: [{ body: { name: '', description: '' } }], + required: ['name', 'description'], properties: { - id: { - description: localize('toolId', "A unique id for this tool."), + name: { + description: localize('toolname', "A name for this tool which must be unique across all tools."), type: 'string' }, description: { @@ -57,8 +58,8 @@ const languageModelToolsExtensionPoint = extensionsRegistry.ExtensionsRegistry.r } }); -function toToolKey(extensionIdentifier: ExtensionIdentifier, toolId: string) { - return `${extensionIdentifier.value}/${toolId}`; +function toToolKey(extensionIdentifier: ExtensionIdentifier, toolName: string) { + return `${extensionIdentifier.value}/${toolName}`; } export class LanguageModelToolsExtensionPointHandler implements IWorkbenchContribution { @@ -67,19 +68,25 @@ export class LanguageModelToolsExtensionPointHandler implements IWorkbenchContri private _registrationDisposables = new DisposableMap(); constructor( - @ILanguageModelToolsService languageModelToolsService: ILanguageModelToolsService + @ILanguageModelToolsService languageModelToolsService: ILanguageModelToolsService, + @ILogService logService: ILogService, ) { languageModelToolsExtensionPoint.setHandler((extensions, delta) => { for (const extension of delta.added) { for (const tool of extension.value) { + if (!tool.name || !tool.description) { + logService.warn(`Invalid tool contribution from ${extension.description.identifier.value}: ${JSON.stringify(tool)}`); + continue; + } + const disposable = languageModelToolsService.registerToolData(tool); - this._registrationDisposables.set(toToolKey(extension.description.identifier, tool.id), disposable); + this._registrationDisposables.set(toToolKey(extension.description.identifier, tool.name), disposable); } } for (const extension of delta.removed) { for (const tool of extension.value) { - this._registrationDisposables.deleteAndDispose(toToolKey(extension.description.identifier, tool.id)); + this._registrationDisposables.deleteAndDispose(toToolKey(extension.description.identifier, tool.name)); } } }); diff --git a/src/vscode-dts/vscode.proposed.chatTools.d.ts b/src/vscode-dts/vscode.proposed.chatTools.d.ts deleted file mode 100644 index 97740f665a4a4..0000000000000 --- a/src/vscode-dts/vscode.proposed.chatTools.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - export namespace lm { - /** - * Register a LanguageModelTool. The tool must also be registered in the package.json `languageModelTools` contribution point. - */ - export function registerTool(toolId: string, tool: LanguageModelTool): Disposable; - - /** - * A list of all available tools. - */ - export const tools: ReadonlyArray; - - /** - * Invoke a tool with the given parameters. - */ - export function invokeTool(toolId: string, parameters: Object, token: CancellationToken): Thenable; - } - - export interface LanguageModelToolDescription { - id: string; - description: string; - parametersSchema?: JSONSchema; - displayName?: string; - } - - export interface LanguageModelTool { - invoke(parameters: any, token: CancellationToken): Thenable; - } -} diff --git a/src/vscode-dts/vscode.proposed.lmTools.d.ts b/src/vscode-dts/vscode.proposed.lmTools.d.ts index 6aa0ac3a22562..589d6d8fef1ae 100644 --- a/src/vscode-dts/vscode.proposed.lmTools.d.ts +++ b/src/vscode-dts/vscode.proposed.lmTools.d.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +// version: 2 + declare module 'vscode' { // TODO@API capabilities @@ -13,7 +15,7 @@ declare module 'vscode' { export interface LanguageModelChatFunction { name: string; description: string; - parametersSchema: JSONSchema; + parametersSchema?: JSONSchema; } // API -> LM: add tools as request option @@ -55,4 +57,34 @@ declare module 'vscode' { export interface LanguageModelChatMessage { content2: string | LanguageModelChatMessageFunctionResultPart; } + + // Tool registration/invoking between extensions + + export namespace lm { + /** + * Register a LanguageModelTool. The tool must also be registered in the package.json `languageModelTools` contribution point. + */ + export function registerTool(name: string, tool: LanguageModelTool): Disposable; + + /** + * A list of all available tools. + */ + export const tools: ReadonlyArray; + + /** + * Invoke a tool with the given parameters. + */ + export function invokeTool(name: string, parameters: Object, token: CancellationToken): Thenable; + } + + // Is the same as LanguageModelChatFunction now, but could have more details in the future + export interface LanguageModelToolDescription { + name: string; + description: string; + parametersSchema?: JSONSchema; + } + + export interface LanguageModelTool { + invoke(parameters: any, token: CancellationToken): Thenable; + } } From 4bbebd8af922ed3b5a7a14eb0848c04918454c38 Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Thu, 20 Jun 2024 18:56:01 -0700 Subject: [PATCH 402/755] splits up process explorer and issue reporter services (#216766) * split up process explorer and issue reporter services * more cleanup * fix comment * remove comments --- src/vs/code/electron-main/app.ts | 11 +- src/vs/platform/issue/common/issue.ts | 21 +- .../issue/electron-main/issueMainService.ts | 232 +---------- .../issue/electron-main/processMainService.ts | 375 ++++++++++++++++++ .../workbench/contrib/issue/browser/issue.ts | 20 - .../issue/browser/issueReporterService.ts | 14 + .../workbench/contrib/issue/common/issue.ts | 7 + .../electron-sandbox/issue.contribution.ts | 91 +---- .../electron-sandbox/issueMainService.ts | 4 +- .../electron-sandbox/issueReporterMain.ts | 4 +- .../electron-sandbox/issueReporterService.ts | 11 +- .../electron-sandbox/issueReporterService2.ts | 31 +- .../issue/electron-sandbox/issueService.ts | 37 +- .../electron-sandbox/process.contribution.ts | 96 +++++ .../issue/electron-sandbox/processService.ts | 62 +++ src/vs/workbench/workbench.desktop.main.ts | 3 + src/vs/workbench/workbench.web.main.ts | 1 + 17 files changed, 629 insertions(+), 391 deletions(-) create mode 100644 src/vs/platform/issue/electron-main/processMainService.ts create mode 100644 src/vs/workbench/contrib/issue/electron-sandbox/process.contribution.ts create mode 100644 src/vs/workbench/contrib/issue/electron-sandbox/processService.ts diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 0f538770a8940..1c4a565adec4e 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -52,8 +52,9 @@ import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemPro import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { IIssueMainService } from 'vs/platform/issue/common/issue'; +import { IIssueMainService, IProcessMainService } from 'vs/platform/issue/common/issue'; import { IssueMainService } from 'vs/platform/issue/electron-main/issueMainService'; +import { ProcessMainService } from 'vs/platform/issue/electron-main/processMainService'; import { IKeyboardLayoutMainService, KeyboardLayoutMainService } from 'vs/platform/keyboardLayout/electron-main/keyboardLayoutMainService'; import { ILaunchMainService, LaunchMainService } from 'vs/platform/launch/electron-main/launchMainService'; import { ILifecycleMainService, LifecycleMainPhase, ShutdownReason } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; @@ -121,7 +122,6 @@ import { Lazy } from 'vs/base/common/lazy'; import { IAuxiliaryWindowsMainService } from 'vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows'; import { AuxiliaryWindowsMainService } from 'vs/platform/auxiliaryWindow/electron-main/auxiliaryWindowsMainService'; import { normalizeNFC } from 'vs/base/common/normalization'; - /** * The main VS Code application. There will only ever be one instance, * even if the user starts many instances (e.g. from the command line). @@ -1051,6 +1051,9 @@ export class CodeApplication extends Disposable { // Issues services.set(IIssueMainService, new SyncDescriptor(IssueMainService, [this.userEnv])); + // Process + services.set(IProcessMainService, new SyncDescriptor(ProcessMainService, [this.userEnv])); + // Encryption services.set(IEncryptionMainService, new SyncDescriptor(EncryptionMainService)); @@ -1183,6 +1186,10 @@ export class CodeApplication extends Disposable { const issueChannel = ProxyChannel.fromService(accessor.get(IIssueMainService), disposables); mainProcessElectronServer.registerChannel('issue', issueChannel); + // Process + const processChannel = ProxyChannel.fromService(accessor.get(IProcessMainService), disposables); + mainProcessElectronServer.registerChannel('process', processChannel); + // Encryption const encryptionChannel = ProxyChannel.fromService(accessor.get(IEncryptionMainService), disposables); mainProcessElectronServer.registerChannel('encryption', encryptionChannel); diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 81f3a8083caad..856c58c1873be 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -127,18 +127,25 @@ export const IIssueMainService = createDecorator('issueServic export interface IIssueMainService { readonly _serviceBrand: undefined; - stopTracing(): Promise; - openReporter(data: IssueReporterData): Promise; - openProcessExplorer(data: ProcessExplorerData): Promise; - getSystemStatus(): Promise; // Used by the issue reporter - - $getSystemInfo(): Promise; - $getPerformanceInfo(): Promise; + openReporter(data: IssueReporterData): Promise; $reloadWithExtensionsDisabled(): Promise; $showConfirmCloseDialog(): Promise; $showClipboardDialog(): Promise; $sendReporterMenu(extensionId: string, extensionName: string): Promise; $closeReporter(): Promise; } + +export const IProcessMainService = createDecorator('processService'); + +export interface IProcessMainService { + readonly _serviceBrand: undefined; + getSystemStatus(): Promise; + stopTracing(): Promise; + openProcessExplorer(data: ProcessExplorerData): Promise; + + // Used by the process explorer + $getSystemInfo(): Promise; + $getPerformanceInfo(): Promise; +} diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 62e2d9ff34108..40f1df2e7be4a 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -3,35 +3,26 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrowserWindow, BrowserWindowConstructorOptions, contentTracing, Display, IpcMainEvent, screen } from 'electron'; +import { BrowserWindow, BrowserWindowConstructorOptions, Display, screen } from 'electron'; import { arch, release, type } from 'os'; import { raceTimeout } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; -import { randomPath } from 'vs/base/common/extpath'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { FileAccess } from 'vs/base/common/network'; import { IProcessEnvironment, isMacintosh } from 'vs/base/common/platform'; -import { listProcesses } from 'vs/base/node/ps'; import { validatedIpcMain } from 'vs/base/parts/ipc/electron-main/ipcMain'; import { localize } from 'vs/nls'; -import { IDiagnosticsService, isRemoteDiagnosticError, PerformanceInfo, SystemInfo } from 'vs/platform/diagnostics/common/diagnostics'; -import { IDiagnosticsMainService } from 'vs/platform/diagnostics/electron-main/diagnosticsMainService'; import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogMainService'; import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; -import { IIssueMainService, IssueReporterData, IssueReporterWindowConfiguration, ProcessExplorerData, ProcessExplorerWindowConfiguration } from 'vs/platform/issue/common/issue'; +import { IIssueMainService, IssueReporterData, IssueReporterWindowConfiguration } from 'vs/platform/issue/common/issue'; import { ILogService } from 'vs/platform/log/common/log'; import { INativeHostMainService } from 'vs/platform/native/electron-main/nativeHostMainService'; import product from 'vs/platform/product/common/product'; -import { IProductService } from 'vs/platform/product/common/productService'; import { IIPCObjectUrl, IProtocolMainService } from 'vs/platform/protocol/electron-main/protocol'; -import { IStateService } from 'vs/platform/state/node/state'; -import { UtilityProcess } from 'vs/platform/utilityProcess/electron-main/utilityProcess'; import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window'; import { ICodeWindow, IWindowState } from 'vs/platform/window/electron-main/window'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -const processExplorerWindowState = 'issue.processExplorerWindowState'; - interface IBrowserWindowOptions { backgroundColor: string | undefined; title: string; @@ -50,94 +41,15 @@ export class IssueMainService implements IIssueMainService { private issueReporterWindow: BrowserWindow | null = null; private issueReporterParentWindow: BrowserWindow | null = null; - private processExplorerWindow: BrowserWindow | null = null; - private processExplorerParentWindow: BrowserWindow | null = null; - constructor( private userEnv: IProcessEnvironment, @IEnvironmentMainService private readonly environmentMainService: IEnvironmentMainService, @ILogService private readonly logService: ILogService, - @IDiagnosticsService private readonly diagnosticsService: IDiagnosticsService, - @IDiagnosticsMainService private readonly diagnosticsMainService: IDiagnosticsMainService, @IDialogMainService private readonly dialogMainService: IDialogMainService, @INativeHostMainService private readonly nativeHostMainService: INativeHostMainService, @IProtocolMainService private readonly protocolMainService: IProtocolMainService, - @IProductService private readonly productService: IProductService, - @IStateService private readonly stateService: IStateService, @IWindowsMainService private readonly windowsMainService: IWindowsMainService, - ) { - this.registerListeners(); - } - - //#region Register Listeners - - private registerListeners(): void { - validatedIpcMain.on('vscode:listProcesses', async event => { - const processes = []; - - try { - processes.push({ name: localize('local', "Local"), rootProcess: await listProcesses(process.pid) }); - - const remoteDiagnostics = await this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true }); - remoteDiagnostics.forEach(data => { - if (isRemoteDiagnosticError(data)) { - processes.push({ - name: data.hostName, - rootProcess: data - }); - } else { - if (data.processes) { - processes.push({ - name: data.hostName, - rootProcess: data.processes - }); - } - } - }); - } catch (e) { - this.logService.error(`Listing processes failed: ${e}`); - } - - this.safeSend(event, 'vscode:listProcessesResponse', processes); - }); - - validatedIpcMain.on('vscode:workbenchCommand', (_: unknown, commandInfo: { id: any; from: any; args: any }) => { - const { id, from, args } = commandInfo; - - let parentWindow: BrowserWindow | null; - switch (from) { - case 'processExplorer': - parentWindow = this.processExplorerParentWindow; - break; - default: - // The issue reporter does not use this anymore. - throw new Error(`Unexpected command source: ${from}`); - } - - parentWindow?.webContents.send('vscode:runAction', { id, from, args }); - }); - - validatedIpcMain.on('vscode:closeProcessExplorer', event => { - this.processExplorerWindow?.close(); - }); - - validatedIpcMain.on('vscode:pidToNameRequest', async event => { - const mainProcessInfo = await this.diagnosticsMainService.getMainDiagnostics(); - - const pidToNames: [number, string][] = []; - for (const window of mainProcessInfo.windows) { - pidToNames.push([window.pid, `window [${window.id}] (${window.title})`]); - } - - for (const { pid, name } of UtilityProcess.getAll()) { - pidToNames.push([pid, name]); - } - - this.safeSend(event, 'vscode:pidToNameResponse', pidToNames); - }); - } - - //#endregion + ) { } //#region Used by renderer @@ -196,125 +108,9 @@ export class IssueMainService implements IIssueMainService { } } - async openProcessExplorer(data: ProcessExplorerData): Promise { - if (!this.processExplorerWindow) { - this.processExplorerParentWindow = BrowserWindow.getFocusedWindow(); - if (this.processExplorerParentWindow) { - const processExplorerDisposables = new DisposableStore(); - - const processExplorerWindowConfigUrl = processExplorerDisposables.add(this.protocolMainService.createIPCObjectUrl()); - - const savedPosition = this.stateService.getItem(processExplorerWindowState, undefined); - const position = isStrictWindowState(savedPosition) ? savedPosition : this.getWindowPosition(this.processExplorerParentWindow, 800, 500); - - this.processExplorerWindow = this.createBrowserWindow(position, processExplorerWindowConfigUrl, { - backgroundColor: data.styles.backgroundColor, - title: localize('processExplorer', "Process Explorer"), - zoomLevel: data.zoomLevel, - alwaysOnTop: true - }, 'process-explorer'); - - // Store into config object URL - processExplorerWindowConfigUrl.update({ - appRoot: this.environmentMainService.appRoot, - windowId: this.processExplorerWindow.id, - userEnv: this.userEnv, - data, - product - }); - - this.processExplorerWindow.loadURL( - FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true) - ); - - this.processExplorerWindow.on('close', () => { - this.processExplorerWindow = null; - processExplorerDisposables.dispose(); - }); - - this.processExplorerParentWindow.on('close', () => { - if (this.processExplorerWindow) { - this.processExplorerWindow.close(); - this.processExplorerWindow = null; - - processExplorerDisposables.dispose(); - } - }); - - const storeState = () => { - if (!this.processExplorerWindow) { - return; - } - const size = this.processExplorerWindow.getSize(); - const position = this.processExplorerWindow.getPosition(); - if (!size || !position) { - return; - } - const state: IWindowState = { - width: size[0], - height: size[1], - x: position[0], - y: position[1] - }; - this.stateService.setItem(processExplorerWindowState, state); - }; - - this.processExplorerWindow.on('moved', storeState); - this.processExplorerWindow.on('resized', storeState); - } - } - - if (this.processExplorerWindow) { - this.focusWindow(this.processExplorerWindow); - } - } - - async stopTracing(): Promise { - if (!this.environmentMainService.args.trace) { - return; // requires tracing to be on - } - - const path = await contentTracing.stopRecording(`${randomPath(this.environmentMainService.userHome.fsPath, this.productService.applicationName)}.trace.txt`); - - // Inform user to report an issue - await this.dialogMainService.showMessageBox({ - type: 'info', - message: localize('trace.message', "Successfully created the trace file"), - detail: localize('trace.detail', "Please create an issue and manually attach the following file:\n{0}", path), - buttons: [localize({ key: 'trace.ok', comment: ['&& denotes a mnemonic'] }, "&&OK")], - }, BrowserWindow.getFocusedWindow() ?? undefined); - - // Show item in explorer - this.nativeHostMainService.showItemInFolder(undefined, path); - } - - async getSystemStatus(): Promise { - const [info, remoteData] = await Promise.all([this.diagnosticsMainService.getMainDiagnostics(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); - - return this.diagnosticsService.getDiagnostics(info, remoteData); - } - //#endregion //#region used by issue reporter window - - async $getSystemInfo(): Promise { - const [info, remoteData] = await Promise.all([this.diagnosticsMainService.getMainDiagnostics(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); - const msg = await this.diagnosticsService.getSystemInfo(info, remoteData); - return msg; - } - - async $getPerformanceInfo(): Promise { - try { - const [info, remoteData] = await Promise.all([this.diagnosticsMainService.getMainDiagnostics(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true })]); - return await this.diagnosticsService.getPerformanceInfo(info, remoteData); - } catch (error) { - this.logService.warn('issueService#getPerformanceInfo ', error.message); - - throw error; - } - } - async $reloadWithExtensionsDisabled(): Promise { if (this.issueReporterParentWindow) { try { @@ -389,10 +185,6 @@ export class IssueMainService implements IIssueMainService { this.issueReporterWindow?.close(); } - async closeProcessExplorer(): Promise { - this.processExplorerWindow?.close(); - } - //#endregion private focusWindow(window: BrowserWindow): void { @@ -403,12 +195,6 @@ export class IssueMainService implements IIssueMainService { window.focus(); } - private safeSend(event: IpcMainEvent, channel: string, ...args: unknown[]): void { - if (!event.sender.isDestroyed()) { - event.sender.send(channel, ...args); - } - } - private createBrowserWindow(position: IWindowState, ipcObjectUrl: IIPCObjectUrl, options: IBrowserWindowOptions, windowKind: string): BrowserWindow { const window = new BrowserWindow({ fullscreen: false, @@ -509,15 +295,3 @@ export class IssueMainService implements IIssueMainService { return state; } } - -function isStrictWindowState(obj: unknown): obj is IStrictWindowState { - if (typeof obj !== 'object' || obj === null) { - return false; - } - return ( - 'x' in obj && - 'y' in obj && - 'width' in obj && - 'height' in obj - ); -} diff --git a/src/vs/platform/issue/electron-main/processMainService.ts b/src/vs/platform/issue/electron-main/processMainService.ts new file mode 100644 index 0000000000000..9e2cc9d0fd38f --- /dev/null +++ b/src/vs/platform/issue/electron-main/processMainService.ts @@ -0,0 +1,375 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { BrowserWindow, BrowserWindowConstructorOptions, contentTracing, Display, IpcMainEvent, screen } from 'electron'; +import { randomPath } from 'vs/base/common/extpath'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { FileAccess } from 'vs/base/common/network'; +import { IProcessEnvironment, isMacintosh } from 'vs/base/common/platform'; +import { listProcesses } from 'vs/base/node/ps'; +import { validatedIpcMain } from 'vs/base/parts/ipc/electron-main/ipcMain'; +import { localize } from 'vs/nls'; +import { IDiagnosticsService, isRemoteDiagnosticError, PerformanceInfo, SystemInfo } from 'vs/platform/diagnostics/common/diagnostics'; +import { IDiagnosticsMainService } from 'vs/platform/diagnostics/electron-main/diagnosticsMainService'; +import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogMainService'; +import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; +import { IProcessMainService, ProcessExplorerData, ProcessExplorerWindowConfiguration } from 'vs/platform/issue/common/issue'; +import { ILogService } from 'vs/platform/log/common/log'; +import { INativeHostMainService } from 'vs/platform/native/electron-main/nativeHostMainService'; +import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { IIPCObjectUrl, IProtocolMainService } from 'vs/platform/protocol/electron-main/protocol'; +import { IStateService } from 'vs/platform/state/node/state'; +import { UtilityProcess } from 'vs/platform/utilityProcess/electron-main/utilityProcess'; +import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window'; +import { IWindowState } from 'vs/platform/window/electron-main/window'; + +const processExplorerWindowState = 'issue.processExplorerWindowState'; + +interface IBrowserWindowOptions { + backgroundColor: string | undefined; + title: string; + zoomLevel: number; + alwaysOnTop: boolean; +} + +type IStrictWindowState = Required>; + +export class ProcessMainService implements IProcessMainService { + + declare readonly _serviceBrand: undefined; + + private static readonly DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; + + private processExplorerWindow: BrowserWindow | null = null; + private processExplorerParentWindow: BrowserWindow | null = null; + + constructor( + private userEnv: IProcessEnvironment, + @IEnvironmentMainService private readonly environmentMainService: IEnvironmentMainService, + @ILogService private readonly logService: ILogService, + @IDiagnosticsService private readonly diagnosticsService: IDiagnosticsService, + @IDiagnosticsMainService private readonly diagnosticsMainService: IDiagnosticsMainService, + @IDialogMainService private readonly dialogMainService: IDialogMainService, + @INativeHostMainService private readonly nativeHostMainService: INativeHostMainService, + @IProtocolMainService private readonly protocolMainService: IProtocolMainService, + @IProductService private readonly productService: IProductService, + @IStateService private readonly stateService: IStateService, + ) { + this.registerListeners(); + } + + //#region Register Listeners + + private registerListeners(): void { + validatedIpcMain.on('vscode:listProcesses', async event => { + const processes = []; + + try { + processes.push({ name: localize('local', "Local"), rootProcess: await listProcesses(process.pid) }); + + const remoteDiagnostics = await this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true }); + remoteDiagnostics.forEach(data => { + if (isRemoteDiagnosticError(data)) { + processes.push({ + name: data.hostName, + rootProcess: data + }); + } else { + if (data.processes) { + processes.push({ + name: data.hostName, + rootProcess: data.processes + }); + } + } + }); + } catch (e) { + this.logService.error(`Listing processes failed: ${e}`); + } + + this.safeSend(event, 'vscode:listProcessesResponse', processes); + }); + + validatedIpcMain.on('vscode:workbenchCommand', (_: unknown, commandInfo: { id: any; from: any; args: any }) => { + const { id, from, args } = commandInfo; + + let parentWindow: BrowserWindow | null; + switch (from) { + case 'processExplorer': + parentWindow = this.processExplorerParentWindow; + break; + default: + // The issue reporter does not use this anymore. + throw new Error(`Unexpected command source: ${from}`); + } + + parentWindow?.webContents.send('vscode:runAction', { id, from, args }); + }); + + validatedIpcMain.on('vscode:closeProcessExplorer', event => { + this.processExplorerWindow?.close(); + }); + + validatedIpcMain.on('vscode:pidToNameRequest', async event => { + const mainProcessInfo = await this.diagnosticsMainService.getMainDiagnostics(); + + const pidToNames: [number, string][] = []; + for (const window of mainProcessInfo.windows) { + pidToNames.push([window.pid, `window [${window.id}] (${window.title})`]); + } + + for (const { pid, name } of UtilityProcess.getAll()) { + pidToNames.push([pid, name]); + } + + this.safeSend(event, 'vscode:pidToNameResponse', pidToNames); + }); + } + + async openProcessExplorer(data: ProcessExplorerData): Promise { + if (!this.processExplorerWindow) { + this.processExplorerParentWindow = BrowserWindow.getFocusedWindow(); + if (this.processExplorerParentWindow) { + const processExplorerDisposables = new DisposableStore(); + + const processExplorerWindowConfigUrl = processExplorerDisposables.add(this.protocolMainService.createIPCObjectUrl()); + + const savedPosition = this.stateService.getItem(processExplorerWindowState, undefined); + const position = isStrictWindowState(savedPosition) ? savedPosition : this.getWindowPosition(this.processExplorerParentWindow, 800, 500); + + this.processExplorerWindow = this.createBrowserWindow(position, processExplorerWindowConfigUrl, { + backgroundColor: data.styles.backgroundColor, + title: localize('processExplorer', "Process Explorer"), + zoomLevel: data.zoomLevel, + alwaysOnTop: true + }, 'process-explorer'); + + // Store into config object URL + processExplorerWindowConfigUrl.update({ + appRoot: this.environmentMainService.appRoot, + windowId: this.processExplorerWindow.id, + userEnv: this.userEnv, + data, + product + }); + + this.processExplorerWindow.loadURL( + FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true) + ); + + this.processExplorerWindow.on('close', () => { + this.processExplorerWindow = null; + processExplorerDisposables.dispose(); + }); + + this.processExplorerParentWindow.on('close', () => { + if (this.processExplorerWindow) { + this.processExplorerWindow.close(); + this.processExplorerWindow = null; + + processExplorerDisposables.dispose(); + } + }); + + const storeState = () => { + if (!this.processExplorerWindow) { + return; + } + const size = this.processExplorerWindow.getSize(); + const position = this.processExplorerWindow.getPosition(); + if (!size || !position) { + return; + } + const state: IWindowState = { + width: size[0], + height: size[1], + x: position[0], + y: position[1] + }; + this.stateService.setItem(processExplorerWindowState, state); + }; + + this.processExplorerWindow.on('moved', storeState); + this.processExplorerWindow.on('resized', storeState); + } + } + + if (this.processExplorerWindow) { + this.focusWindow(this.processExplorerWindow); + } + } + + private focusWindow(window: BrowserWindow): void { + if (window.isMinimized()) { + window.restore(); + } + + window.focus(); + } + + private getWindowPosition(parentWindow: BrowserWindow, defaultWidth: number, defaultHeight: number): IStrictWindowState { + + // We want the new window to open on the same display that the parent is in + let displayToUse: Display | undefined; + const displays = screen.getAllDisplays(); + + // Single Display + if (displays.length === 1) { + displayToUse = displays[0]; + } + + // Multi Display + else { + + // on mac there is 1 menu per window so we need to use the monitor where the cursor currently is + if (isMacintosh) { + const cursorPoint = screen.getCursorScreenPoint(); + displayToUse = screen.getDisplayNearestPoint(cursorPoint); + } + + // if we have a last active window, use that display for the new window + if (!displayToUse && parentWindow) { + displayToUse = screen.getDisplayMatching(parentWindow.getBounds()); + } + + // fallback to primary display or first display + if (!displayToUse) { + displayToUse = screen.getPrimaryDisplay() || displays[0]; + } + } + + const displayBounds = displayToUse.bounds; + + const state: IStrictWindowState = { + width: defaultWidth, + height: defaultHeight, + x: displayBounds.x + (displayBounds.width / 2) - (defaultWidth / 2), + y: displayBounds.y + (displayBounds.height / 2) - (defaultHeight / 2) + }; + + if (displayBounds.width > 0 && displayBounds.height > 0 /* Linux X11 sessions sometimes report wrong display bounds */) { + if (state.x < displayBounds.x) { + state.x = displayBounds.x; // prevent window from falling out of the screen to the left + } + + if (state.y < displayBounds.y) { + state.y = displayBounds.y; // prevent window from falling out of the screen to the top + } + + if (state.x > (displayBounds.x + displayBounds.width)) { + state.x = displayBounds.x; // prevent window from falling out of the screen to the right + } + + if (state.y > (displayBounds.y + displayBounds.height)) { + state.y = displayBounds.y; // prevent window from falling out of the screen to the bottom + } + + if (state.width > displayBounds.width) { + state.width = displayBounds.width; // prevent window from exceeding display bounds width + } + + if (state.height > displayBounds.height) { + state.height = displayBounds.height; // prevent window from exceeding display bounds height + } + } + + return state; + } + + async stopTracing(): Promise { + if (!this.environmentMainService.args.trace) { + return; // requires tracing to be on + } + + const path = await contentTracing.stopRecording(`${randomPath(this.environmentMainService.userHome.fsPath, this.productService.applicationName)}.trace.txt`); + + // Inform user to report an issue + await this.dialogMainService.showMessageBox({ + type: 'info', + message: localize('trace.message', "Successfully created the trace file"), + detail: localize('trace.detail', "Please create an issue and manually attach the following file:\n{0}", path), + buttons: [localize({ key: 'trace.ok', comment: ['&& denotes a mnemonic'] }, "&&OK")], + }, BrowserWindow.getFocusedWindow() ?? undefined); + + // Show item in explorer + this.nativeHostMainService.showItemInFolder(undefined, path); + } + + async getSystemStatus(): Promise { + const [info, remoteData] = await Promise.all([this.diagnosticsMainService.getMainDiagnostics(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); + return this.diagnosticsService.getDiagnostics(info, remoteData); + } + + async $getSystemInfo(): Promise { + const [info, remoteData] = await Promise.all([this.diagnosticsMainService.getMainDiagnostics(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); + const msg = await this.diagnosticsService.getSystemInfo(info, remoteData); + return msg; + } + + async $getPerformanceInfo(): Promise { + try { + const [info, remoteData] = await Promise.all([this.diagnosticsMainService.getMainDiagnostics(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true })]); + return await this.diagnosticsService.getPerformanceInfo(info, remoteData); + } catch (error) { + this.logService.warn('issueService#getPerformanceInfo ', error.message); + + throw error; + } + } + + private createBrowserWindow(position: IWindowState, ipcObjectUrl: IIPCObjectUrl, options: IBrowserWindowOptions, windowKind: string): BrowserWindow { + const window = new BrowserWindow({ + fullscreen: false, + skipTaskbar: false, + resizable: true, + width: position.width, + height: position.height, + minWidth: 300, + minHeight: 200, + x: position.x, + y: position.y, + title: options.title, + backgroundColor: options.backgroundColor || ProcessMainService.DEFAULT_BACKGROUND_COLOR, + webPreferences: { + preload: FileAccess.asFileUri('vs/base/parts/sandbox/electron-sandbox/preload.js').fsPath, + additionalArguments: [`--vscode-window-config=${ipcObjectUrl.resource.toString()}`], + v8CacheOptions: this.environmentMainService.useCodeCache ? 'bypassHeatCheck' : 'none', + enableWebSQL: false, + spellcheck: false, + zoomFactor: zoomLevelToZoomFactor(options.zoomLevel), + sandbox: true + }, + alwaysOnTop: options.alwaysOnTop, + experimentalDarkMode: true + } as BrowserWindowConstructorOptions & { experimentalDarkMode: boolean }); + + window.setMenuBarVisibility(false); + + return window; + } + + private safeSend(event: IpcMainEvent, channel: string, ...args: unknown[]): void { + if (!event.sender.isDestroyed()) { + event.sender.send(channel, ...args); + } + } + + async closeProcessExplorer(): Promise { + this.processExplorerWindow?.close(); + } +} + +function isStrictWindowState(obj: unknown): obj is IStrictWindowState { + if (typeof obj !== 'object' || obj === null) { + return false; + } + return ( + 'x' in obj && + 'y' in obj && + 'width' in obj && + 'height' in obj + ); +} diff --git a/src/vs/workbench/contrib/issue/browser/issue.ts b/src/vs/workbench/contrib/issue/browser/issue.ts index 2fe7f6879ab2a..3bc09a5a6c63f 100644 --- a/src/vs/workbench/contrib/issue/browser/issue.ts +++ b/src/vs/workbench/contrib/issue/browser/issue.ts @@ -240,26 +240,6 @@ export class BaseIssueReporterService extends Disposable { } public setEventHandlers(): void { - this.addEventListener('issue-type', 'change', (event: Event) => { - const issueType = parseInt((event.target).value); - this.issueReporterModel.update({ issueType: issueType }); - if (issueType === IssueType.PerformanceIssue && !this.receivedPerformanceInfo) { - this.issueMainService.$getPerformanceInfo().then(info => { - this.updatePerformanceInfo(info as Partial); - }); - } - - // Resets placeholder - const descriptionTextArea = this.getElementById('issue-title'); - if (descriptionTextArea) { - descriptionTextArea.placeholder = localize('undefinedPlaceholder', "Please enter a title"); - } - - this.updatePreviewButtonState(); - this.setSourceOptions(); - this.render(); - }); - (['includeSystemInfo', 'includeProcessInfo', 'includeWorkspaceInfo', 'includeExtensions', 'includeExperiments', 'includeExtensionData'] as const).forEach(elementId => { this.addEventListener(elementId, 'click', (event: Event) => { event.stopPropagation(); diff --git a/src/vs/workbench/contrib/issue/browser/issueReporterService.ts b/src/vs/workbench/contrib/issue/browser/issueReporterService.ts index 59eae428a919b..1c7b878ce394a 100644 --- a/src/vs/workbench/contrib/issue/browser/issueReporterService.ts +++ b/src/vs/workbench/contrib/issue/browser/issueReporterService.ts @@ -72,6 +72,20 @@ export class IssueWebReporter extends BaseIssueReporterService { public override setEventHandlers(): void { super.setEventHandlers(); + this.addEventListener('issue-type', 'change', (event: Event) => { + const issueType = parseInt((event.target).value); + this.issueReporterModel.update({ issueType: issueType }); + + // Resets placeholder + const descriptionTextArea = this.getElementById('issue-title'); + if (descriptionTextArea) { + descriptionTextArea.placeholder = localize('undefinedPlaceholder', "Please enter a title"); + } + + this.updatePreviewButtonState(); + this.setSourceOptions(); + this.render(); + }); this.previewButton.onDidClick(async () => { this.delayedSubmit.trigger(async () => { this.createIssue(); diff --git a/src/vs/workbench/contrib/issue/common/issue.ts b/src/vs/workbench/contrib/issue/common/issue.ts index 3ecd103cf589d..5834ba051be20 100644 --- a/src/vs/workbench/contrib/issue/common/issue.ts +++ b/src/vs/workbench/contrib/issue/common/issue.ts @@ -10,5 +10,12 @@ export const IWorkbenchIssueService = createDecorator('w export interface IWorkbenchIssueService { readonly _serviceBrand: undefined; openReporter(dataOverrides?: Partial): Promise; +} + +export const IWorkbenchProcessService = createDecorator('workbenchProcessService'); + +export interface IWorkbenchProcessService { + readonly _serviceBrand: undefined; openProcessExplorer(): Promise; } + diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issue.contribution.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issue.contribution.ts index 3b86046d12f43..9eacc2f757425 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issue.contribution.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issue.contribution.ts @@ -4,9 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { localize, localize2 } from 'vs/nls'; -import { MenuRegistry, MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; +import { registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/common/issue'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { BaseIssueContribution } from 'vs/workbench/contrib/issue/common/issue.contribution'; import { IProductService } from 'vs/platform/product/common/productService'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -14,11 +13,7 @@ import { Extensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { INativeHostService } from 'vs/platform/native/common/native'; -import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; -import { IIssueMainService, IssueType } from 'vs/platform/issue/common/issue'; +import { IssueType } from 'vs/platform/issue/common/issue'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IQuickAccessRegistry, Extensions as QuickAccessExtensions } from 'vs/platform/quickinput/common/quickAccess'; @@ -27,7 +22,6 @@ import 'vs/workbench/contrib/issue/electron-sandbox/issueMainService'; import 'vs/workbench/contrib/issue/electron-sandbox/issueService'; import 'vs/workbench/contrib/issue/browser/issueTroubleshoot'; - //#region Issue Contribution class NativeIssueContribution extends BaseIssueContribution { @@ -87,87 +81,10 @@ class ReportPerformanceIssueUsingReporterAction extends Action2 { } override async run(accessor: ServicesAccessor): Promise { - const issueService = accessor.get(IWorkbenchIssueService); + const issueService = accessor.get(IWorkbenchIssueService); // later can just get IIssueFormService return issueService.openReporter({ issueType: IssueType.PerformanceIssue }); } } -//#endregion - -//#region Commands - -class OpenProcessExplorer extends Action2 { - - static readonly ID = 'workbench.action.openProcessExplorer'; - - constructor() { - super({ - id: OpenProcessExplorer.ID, - title: localize2('openProcessExplorer', 'Open Process Explorer'), - category: Categories.Developer, - f1: true - }); - } - - override async run(accessor: ServicesAccessor): Promise { - const issueService = accessor.get(IWorkbenchIssueService); - - return issueService.openProcessExplorer(); - } -} -registerAction2(OpenProcessExplorer); -MenuRegistry.appendMenuItem(MenuId.MenubarHelpMenu, { - group: '5_tools', - command: { - id: OpenProcessExplorer.ID, - title: localize({ key: 'miOpenProcessExplorerer', comment: ['&& denotes a mnemonic'] }, "Open &&Process Explorer") - }, - order: 2 -}); - -class StopTracing extends Action2 { - - static readonly ID = 'workbench.action.stopTracing'; - - constructor() { - super({ - id: StopTracing.ID, - title: localize2('stopTracing', 'Stop Tracing'), - category: Categories.Developer, - f1: true - }); - } - - override async run(accessor: ServicesAccessor): Promise { - const issueService = accessor.get(IIssueMainService); - const environmentService = accessor.get(INativeEnvironmentService); - const dialogService = accessor.get(IDialogService); - const nativeHostService = accessor.get(INativeHostService); - const progressService = accessor.get(IProgressService); - - if (!environmentService.args.trace) { - const { confirmed } = await dialogService.confirm({ - message: localize('stopTracing.message', "Tracing requires to launch with a '--trace' argument"), - primaryButton: localize({ key: 'stopTracing.button', comment: ['&& denotes a mnemonic'] }, "&&Relaunch and Enable Tracing"), - }); - - if (confirmed) { - return nativeHostService.relaunch({ addArgs: ['--trace'] }); - } - } - - await progressService.withProgress({ - location: ProgressLocation.Dialog, - title: localize('stopTracing.title', "Creating trace file..."), - cancellable: false, - detail: localize('stopTracing.detail', "This can take up to one minute to complete.") - }, () => issueService.stopTracing()); - } -} -registerAction2(StopTracing); - -CommandsRegistry.registerCommand('_issues.getSystemStatus', (accessor) => { - return accessor.get(IIssueMainService).getSystemStatus(); -}); -//#endregion +// #endregion diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueMainService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueMainService.ts index a3cb28473af01..cf16313519ae5 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueMainService.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueMainService.ts @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { registerMainProcessRemoteService } from 'vs/platform/ipc/electron-sandbox/services'; -import { IIssueMainService } from 'vs/platform/issue/common/issue'; +import { IIssueMainService, IProcessMainService } from 'vs/platform/issue/common/issue'; registerMainProcessRemoteService(IIssueMainService, 'issue'); +registerMainProcessRemoteService(IProcessMainService, 'process'); + diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterMain.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterMain.ts index 05f002de5320e..ca9253bb1e94e 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterMain.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterMain.ts @@ -15,12 +15,13 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IMainProcessService } from 'vs/platform/ipc/common/mainProcessService'; import { ElectronIPCMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { registerMainProcessRemoteService } from 'vs/platform/ipc/electron-sandbox/services'; -import { IIssueMainService, IssueReporterWindowConfiguration } from 'vs/platform/issue/common/issue'; +import { IIssueMainService, IProcessMainService, IssueReporterWindowConfiguration } from 'vs/platform/issue/common/issue'; import { INativeHostService } from 'vs/platform/native/common/native'; import { NativeHostService } from 'vs/platform/native/common/nativeHostService'; import { IssueReporter2 } from 'vs/workbench/contrib/issue/electron-sandbox/issueReporterService2'; import { mainWindow } from 'vs/base/browser/window'; + export function startup(configuration: IssueReporterWindowConfiguration) { const platformClass = isWindows ? 'windows' : isLinux ? 'linux' : 'mac'; mainWindow.document.body.classList.add(platformClass); // used by our fonts @@ -50,3 +51,4 @@ function initServices(windowId: number) { } registerMainProcessRemoteService(IIssueMainService, 'issue'); +registerMainProcessRemoteService(IProcessMainService, 'process'); diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts index 88509ea533400..4fdf80be67df4 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService.ts @@ -19,7 +19,7 @@ import { URI } from 'vs/base/common/uri'; import { IssueReporterModel, IssueReporterData as IssueReporterModelData } from 'vs/workbench/contrib/issue/browser/issueReporterModel'; import { localize } from 'vs/nls'; import { isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnostics'; -import { IIssueMainService, IssueReporterData, IssueReporterExtensionData, IssueReporterStyles, IssueReporterWindowConfiguration, IssueType } from 'vs/platform/issue/common/issue'; +import { IIssueMainService, IProcessMainService, IssueReporterData, IssueReporterExtensionData, IssueReporterStyles, IssueReporterWindowConfiguration, IssueType } from 'vs/platform/issue/common/issue'; import { normalizeGitHubUrl } from 'vs/platform/issue/common/issueReporterUtil'; import { INativeHostService } from 'vs/platform/native/common/native'; import { getIconsStyleSheet } from 'vs/platform/theme/browser/iconsStyleSheet'; @@ -59,7 +59,8 @@ export class IssueReporter extends Disposable { constructor( private readonly configuration: IssueReporterWindowConfiguration, @INativeHostService private readonly nativeHostService: INativeHostService, - @IIssueMainService private readonly issueMainService: IIssueMainService + @IIssueMainService private readonly issueMainService: IIssueMainService, + @IProcessMainService private readonly processMainService: IProcessMainService ) { super(); const targetExtension = configuration.data.extensionId ? configuration.data.enabledExtensions.find(extension => extension.id.toLocaleLowerCase() === configuration.data.extensionId?.toLocaleLowerCase()) : undefined; @@ -107,7 +108,7 @@ export class IssueReporter extends Disposable { } } - this.issueMainService.$getSystemInfo().then(info => { + this.processMainService.$getSystemInfo().then(info => { this.issueReporterModel.update({ systemInfo: info }); this.receivedSystemInfo = true; @@ -115,7 +116,7 @@ export class IssueReporter extends Disposable { this.updatePreviewButtonState(); }); if (configuration.data.issueType === IssueType.PerformanceIssue) { - this.issueMainService.$getPerformanceInfo().then(info => { + this.processMainService.$getPerformanceInfo().then(info => { this.updatePerformanceInfo(info as Partial); }); } @@ -286,7 +287,7 @@ export class IssueReporter extends Disposable { const issueType = parseInt((event.target).value); this.issueReporterModel.update({ issueType: issueType }); if (issueType === IssueType.PerformanceIssue && !this.receivedPerformanceInfo) { - this.issueMainService.$getPerformanceInfo().then(info => { + this.processMainService.$getPerformanceInfo().then(info => { this.updatePerformanceInfo(info as Partial); }); } diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts index cac5030a2c632..abb6680a5d2f4 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts @@ -12,7 +12,7 @@ import { ThemeIcon } from 'vs/base/common/themables'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { isRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnostics'; -import { IIssueMainService, IssueReporterData, IssueReporterExtensionData, IssueReporterWindowConfiguration, IssueType } from 'vs/platform/issue/common/issue'; +import { IIssueMainService, IProcessMainService, IssueReporterData, IssueReporterExtensionData, IssueReporterWindowConfiguration, IssueType } from 'vs/platform/issue/common/issue'; import { INativeHostService } from 'vs/platform/native/common/native'; import { applyZoom, zoomIn, zoomOut } from 'vs/platform/window/electron-sandbox/window'; import { BaseIssueReporterService, hide, show } from 'vs/workbench/contrib/issue/browser/issue'; @@ -24,14 +24,17 @@ const MAX_URL_LENGTH = 7500; export class IssueReporter2 extends BaseIssueReporterService { + private readonly processMainService: IProcessMainService; constructor( private readonly configuration: IssueReporterWindowConfiguration, @INativeHostService private readonly nativeHostService: INativeHostService, - @IIssueMainService issueMainService: IIssueMainService + @IIssueMainService issueMainService: IIssueMainService, + @IProcessMainService processMainService: IProcessMainService ) { super(configuration.disableExtensions, configuration.data, configuration.os, configuration.product, mainWindow, false, issueMainService); - this.issueMainService.$getSystemInfo().then(info => { + this.processMainService = processMainService; + this.processMainService.$getSystemInfo().then(info => { this.issueReporterModel.update({ systemInfo: info }); this.receivedSystemInfo = true; @@ -39,7 +42,7 @@ export class IssueReporter2 extends BaseIssueReporterService { this.updatePreviewButtonState(); }); if (configuration.data.issueType === IssueType.PerformanceIssue) { - this.issueMainService.$getPerformanceInfo().then(info => { + this.processMainService.$getPerformanceInfo().then(info => { this.updatePerformanceInfo(info as Partial); }); } @@ -81,6 +84,26 @@ export class IssueReporter2 extends BaseIssueReporterService { public override setEventHandlers(): void { super.setEventHandlers(); + this.addEventListener('issue-type', 'change', (event: Event) => { + const issueType = parseInt((event.target).value); + this.issueReporterModel.update({ issueType: issueType }); + if (issueType === IssueType.PerformanceIssue && !this.receivedPerformanceInfo) { + this.processMainService.$getPerformanceInfo().then(info => { + this.updatePerformanceInfo(info as Partial); + }); + } + + // Resets placeholder + const descriptionTextArea = this.getElementById('issue-title'); + if (descriptionTextArea) { + descriptionTextArea.placeholder = localize('undefinedPlaceholder', "Please enter a title"); + } + + this.updatePreviewButtonState(); + this.setSourceOptions(); + this.render(); + }); + // Keep all event listerns involving window and issue creation this.previewButton.onDidClick(async () => { this.delayedSubmit.trigger(async () => { diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts index 3b5c8d26ed6c7..9986f5065f0bc 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts @@ -4,20 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import { getZoomLevel } from 'vs/base/browser/browser'; -import { platform } from 'vs/base/common/process'; import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionIdentifier, ExtensionType, ExtensionIdentifierSet } from 'vs/platform/extensions/common/extensions'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IIssueMainService, IssueReporterData, IssueReporterExtensionData, IssueReporterStyles, ProcessExplorerData } from 'vs/platform/issue/common/issue'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { activeContrastBorder, buttonBackground, buttonForeground, buttonHoverBackground, editorBackground, editorForeground, foreground, inputActiveOptionBorder, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, listActiveSelectionBackground, listActiveSelectionForeground, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { IIssueMainService, IssueReporterData, IssueReporterExtensionData, IssueReporterStyles } from 'vs/platform/issue/common/issue'; +import { buttonBackground, buttonForeground, buttonHoverBackground, foreground, inputActiveOptionBorder, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IWorkbenchAssignmentService } from 'vs/workbench/services/assignment/common/assignmentService'; import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IIntegrityService } from 'vs/workbench/services/integrity/common/integrity'; import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/common/issue'; @@ -34,9 +31,7 @@ export class NativeIssueService implements IWorkbenchIssueService { @IThemeService private readonly themeService: IThemeService, @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService, - @INativeWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, - @IProductService private readonly productService: IProductService, @IWorkbenchAssignmentService private readonly experimentService: IWorkbenchAssignmentService, @IAuthenticationService private readonly authenticationService: IAuthenticationService, @IIntegrityService private readonly integrityService: IIntegrityService, @@ -153,34 +148,6 @@ export class NativeIssueService implements IWorkbenchIssueService { return this.issueMainService.openReporter(issueReporterData); } - openProcessExplorer(): Promise { - const theme = this.themeService.getColorTheme(); - const data: ProcessExplorerData = { - pid: this.environmentService.mainPid, - zoomLevel: getZoomLevel(mainWindow), - styles: { - backgroundColor: getColor(theme, editorBackground), - color: getColor(theme, editorForeground), - listHoverBackground: getColor(theme, listHoverBackground), - listHoverForeground: getColor(theme, listHoverForeground), - listFocusBackground: getColor(theme, listFocusBackground), - listFocusForeground: getColor(theme, listFocusForeground), - listFocusOutline: getColor(theme, listFocusOutline), - listActiveSelectionBackground: getColor(theme, listActiveSelectionBackground), - listActiveSelectionForeground: getColor(theme, listActiveSelectionForeground), - listHoverOutline: getColor(theme, activeContrastBorder), - scrollbarShadowColor: getColor(theme, scrollbarShadow), - scrollbarSliderActiveBackgroundColor: getColor(theme, scrollbarSliderActiveBackground), - scrollbarSliderBackgroundColor: getColor(theme, scrollbarSliderBackground), - scrollbarSliderHoverBackgroundColor: getColor(theme, scrollbarSliderHoverBackground), - }, - platform: platform, - applicationName: this.productService.applicationName - }; - return this.issueMainService.openProcessExplorer(data); - } - - } export function getIssueReporterStyles(theme: IColorTheme): IssueReporterStyles { diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/process.contribution.ts b/src/vs/workbench/contrib/issue/electron-sandbox/process.contribution.ts new file mode 100644 index 0000000000000..43fe8fb39d2fe --- /dev/null +++ b/src/vs/workbench/contrib/issue/electron-sandbox/process.contribution.ts @@ -0,0 +1,96 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize, localize2 } from 'vs/nls'; +import { MenuRegistry, MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; +import { IWorkbenchProcessService } from 'vs/workbench/contrib/issue/common/issue'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { Categories } from 'vs/platform/action/common/actionCommonCategories'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { INativeHostService } from 'vs/platform/native/common/native'; +import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; +import { IProcessMainService } from 'vs/platform/issue/common/issue'; +import 'vs/workbench/contrib/issue/electron-sandbox/processService'; +import 'vs/workbench/contrib/issue/electron-sandbox/issueMainService'; + + +//#region Commands + +class OpenProcessExplorer extends Action2 { + + static readonly ID = 'workbench.action.openProcessExplorer'; + + constructor() { + super({ + id: OpenProcessExplorer.ID, + title: localize2('openProcessExplorer', 'Open Process Explorer'), + category: Categories.Developer, + f1: true + }); + } + + override async run(accessor: ServicesAccessor): Promise { + const processService = accessor.get(IWorkbenchProcessService); + + return processService.openProcessExplorer(); + } +} +registerAction2(OpenProcessExplorer); +MenuRegistry.appendMenuItem(MenuId.MenubarHelpMenu, { + group: '5_tools', + command: { + id: OpenProcessExplorer.ID, + title: localize({ key: 'miOpenProcessExplorerer', comment: ['&& denotes a mnemonic'] }, "Open &&Process Explorer") + }, + order: 2 +}); + +class StopTracing extends Action2 { + + static readonly ID = 'workbench.action.stopTracing'; + + constructor() { + super({ + id: StopTracing.ID, + title: localize2('stopTracing', 'Stop Tracing'), + category: Categories.Developer, + f1: true + }); + } + + override async run(accessor: ServicesAccessor): Promise { + const processService = accessor.get(IProcessMainService); + const environmentService = accessor.get(INativeEnvironmentService); + const dialogService = accessor.get(IDialogService); + const nativeHostService = accessor.get(INativeHostService); + const progressService = accessor.get(IProgressService); + + if (!environmentService.args.trace) { + const { confirmed } = await dialogService.confirm({ + message: localize('stopTracing.message', "Tracing requires to launch with a '--trace' argument"), + primaryButton: localize({ key: 'stopTracing.button', comment: ['&& denotes a mnemonic'] }, "&&Relaunch and Enable Tracing"), + }); + + if (confirmed) { + return nativeHostService.relaunch({ addArgs: ['--trace'] }); + } + } + + await progressService.withProgress({ + location: ProgressLocation.Dialog, + title: localize('stopTracing.title', "Creating trace file..."), + cancellable: false, + detail: localize('stopTracing.detail', "This can take up to one minute to complete.") + }, () => processService.stopTracing()); + } +} +registerAction2(StopTracing); + +CommandsRegistry.registerCommand('_issues.getSystemStatus', (accessor) => { + return accessor.get(IProcessMainService).getSystemStatus(); +}); +//#endregion diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/processService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/processService.ts new file mode 100644 index 0000000000000..60ebd4f898f2b --- /dev/null +++ b/src/vs/workbench/contrib/issue/electron-sandbox/processService.ts @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { getZoomLevel } from 'vs/base/browser/browser'; +import { platform } from 'vs/base/common/process'; +import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IProcessMainService, ProcessExplorerData } from 'vs/platform/issue/common/issue'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { activeContrastBorder, editorBackground, editorForeground, listActiveSelectionBackground, listActiveSelectionForeground, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; +import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; +import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; +import { IWorkbenchProcessService } from 'vs/workbench/contrib/issue/common/issue'; +import { mainWindow } from 'vs/base/browser/window'; + +export class ProcessService implements IWorkbenchProcessService { + declare readonly _serviceBrand: undefined; + + constructor( + @IProcessMainService private readonly processMainService: IProcessMainService, + @IThemeService private readonly themeService: IThemeService, + @INativeWorkbenchEnvironmentService private readonly environmentService: INativeWorkbenchEnvironmentService, + @IProductService private readonly productService: IProductService, + ) { } + + openProcessExplorer(): Promise { + const theme = this.themeService.getColorTheme(); + const data: ProcessExplorerData = { + pid: this.environmentService.mainPid, + zoomLevel: getZoomLevel(mainWindow), + styles: { + backgroundColor: getColor(theme, editorBackground), + color: getColor(theme, editorForeground), + listHoverBackground: getColor(theme, listHoverBackground), + listHoverForeground: getColor(theme, listHoverForeground), + listFocusBackground: getColor(theme, listFocusBackground), + listFocusForeground: getColor(theme, listFocusForeground), + listFocusOutline: getColor(theme, listFocusOutline), + listActiveSelectionBackground: getColor(theme, listActiveSelectionBackground), + listActiveSelectionForeground: getColor(theme, listActiveSelectionForeground), + listHoverOutline: getColor(theme, activeContrastBorder), + scrollbarShadowColor: getColor(theme, scrollbarShadow), + scrollbarSliderActiveBackgroundColor: getColor(theme, scrollbarSliderActiveBackground), + scrollbarSliderBackgroundColor: getColor(theme, scrollbarSliderBackground), + scrollbarSliderHoverBackgroundColor: getColor(theme, scrollbarSliderHoverBackground), + }, + platform: platform, + applicationName: this.productService.applicationName + }; + return this.processMainService.openProcessExplorer(data); + } + + +} + +function getColor(theme: IColorTheme, key: string): string | undefined { + const color = theme.getColor(key); + return color ? color.toString() : undefined; +} + +registerSingleton(IWorkbenchProcessService, ProcessService, InstantiationType.Delayed); diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index c4b6e9c27d032..d4db1d498963f 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -118,6 +118,9 @@ import 'vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution // Issues import 'vs/workbench/contrib/issue/electron-sandbox/issue.contribution'; +// Process +import 'vs/workbench/contrib/issue/electron-sandbox/process.contribution'; + // Remote import 'vs/workbench/contrib/remote/electron-sandbox/remote.contribution'; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index e4a0a7e3e7240..ca5c357ed7fa4 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -156,6 +156,7 @@ import 'vs/workbench/contrib/tags/browser/workspaceTagsService'; // Issues import 'vs/workbench/contrib/issue/browser/issue.contribution'; + // Splash import 'vs/workbench/contrib/splash/browser/splash.contribution'; From d701eb5a300ad87a2a8a41699ce3d0dccf8bd30c Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 21 Jun 2024 08:58:20 +0200 Subject: [PATCH 403/755] SCM - switch logs to trace level (#216784) --- src/vs/workbench/api/common/extHostSCM.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 8b9dd0e6f1be4..6ce319f73342e 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -654,9 +654,9 @@ class ExtHostSourceControl implements vscode.SourceControl { } set statusBarCommands(statusBarCommands: vscode.Command[] | undefined) { - this.logService.info('ExtHostSourceControl#statusBarCommands', (statusBarCommands ?? []).map(c => c.command).join(', ')); + this.logService.trace('ExtHostSourceControl#statusBarCommands', (statusBarCommands ?? []).map(c => c.command).join(', ')); if (this._statusBarCommands && statusBarCommands && commandListEquals(this._statusBarCommands, statusBarCommands)) { - this.logService.info('ExtHostSourceControl#statusBarCommands are equal'); + this.logService.trace('ExtHostSourceControl#statusBarCommands are equal'); return; } From 9bb13791c728d75c2625189a6b6dc138701b0a0d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2024 09:08:49 +0200 Subject: [PATCH 404/755] fix https://github.com/microsoft/vscode/issues/216720 (#216736) --- .../api/browser/mainThreadLanguageModels.ts | 74 +++++++++--- .../workbench/api/common/extHost.protocol.ts | 13 +-- .../api/common/extHostLanguageModels.ts | 108 ++++++++++-------- .../contrib/chat/common/languageModels.ts | 14 ++- .../chat/test/common/languageModels.test.ts | 4 +- 5 files changed, 131 insertions(+), 82 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadLanguageModels.ts b/src/vs/workbench/api/browser/mainThreadLanguageModels.ts index 0418e5676bcc4..6c97efbe0a0e2 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageModels.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageModels.ts @@ -3,16 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { AsyncIterableSource, DeferredPromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableMap, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; -import { IProgress, Progress } from 'vs/platform/progress/common/progress'; import { ExtHostLanguageModelsShape, ExtHostContext, MainContext, MainThreadLanguageModelsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ILanguageModelStatsService } from 'vs/workbench/contrib/chat/common/languageModelStats'; -import { ILanguageModelChatMetadata, IChatResponseFragment, ILanguageModelsService, IChatMessage, ILanguageModelChatSelector } from 'vs/workbench/contrib/chat/common/languageModels'; +import { ILanguageModelChatMetadata, IChatResponseFragment, ILanguageModelsService, IChatMessage, ILanguageModelChatSelector, ILanguageModelChatResponse } from 'vs/workbench/contrib/chat/common/languageModels'; import { IAuthenticationAccessService } from 'vs/workbench/services/authentication/browser/authenticationAccessService'; import { AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationService, INTERNAL_AUTH_PROVIDER_PREFIX } from 'vs/workbench/services/authentication/common/authentication'; import { IExtHostContext, extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; @@ -24,7 +24,7 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { private readonly _proxy: ExtHostLanguageModelsShape; private readonly _store = new DisposableStore(); private readonly _providerRegistrations = new DisposableMap(); - private readonly _pendingProgress = new Map>(); + private readonly _pendingProgress = new Map; stream: AsyncIterableSource }>(); constructor( extHostContext: IExtHostContext, @@ -49,14 +49,23 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { const dipsosables = new DisposableStore(); dipsosables.add(this._chatProviderService.registerLanguageModelChat(identifier, { metadata, - provideChatResponse: async (messages, from, options, progress, token) => { + sendChatRequest: async (messages, from, options, token) => { const requestId = (Math.random() * 1e6) | 0; - this._pendingProgress.set(requestId, progress); + const defer = new DeferredPromise(); + const stream = new AsyncIterableSource(); + try { - await this._proxy.$provideLanguageModelResponse(handle, requestId, from, messages, options, token); - } finally { + this._pendingProgress.set(requestId, { defer, stream }); + await this._proxy.$startChatRequest(handle, requestId, from, messages, options, token); + } catch (err) { this._pendingProgress.delete(requestId); + throw err; } + + return { + result: defer.p, + stream: stream.asyncIterable + } satisfies ILanguageModelChatResponse; }, provideTokenCount: (str, token) => { return this._proxy.$provideTokenLength(handle, str, token); @@ -68,8 +77,22 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { this._providerRegistrations.set(handle, dipsosables); } - async $handleProgressChunk(requestId: number, chunk: IChatResponseFragment): Promise { - this._pendingProgress.get(requestId)?.report(chunk); + async $handleResponsePart(requestId: number, chunk: IChatResponseFragment): Promise { + this._pendingProgress.get(requestId)?.stream.emitOne(chunk); + } + + async $handleResponseDone(requestId: number, error: any | undefined): Promise { + const data = this._pendingProgress.get(requestId); + if (data) { + this._pendingProgress.delete(requestId); + if (error) { + data.defer.error(error); + data.stream.reject(error); + } else { + data.defer.complete(undefined); + data.stream.resolve(); + } + } } $unregisterProvider(handle: number): void { @@ -84,21 +107,34 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { this._languageModelStatsService.update(identifier, extensionId, participant, tokenCount); } - async $fetchResponse(extension: ExtensionIdentifier, providerId: string, requestId: number, messages: IChatMessage[], options: {}, token: CancellationToken): Promise { + async $tryStartChatRequest(extension: ExtensionIdentifier, providerId: string, requestId: number, messages: IChatMessage[], options: {}, token: CancellationToken): Promise { this._logService.debug('[CHAT] extension request STARTED', extension.value, requestId); - const task = this._chatProviderService.makeLanguageModelChatRequest(providerId, extension, messages, options, new Progress(value => { - this._proxy.$handleResponseFragment(requestId, value); - }), token); + const response = await this._chatProviderService.sendChatRequest(providerId, extension, messages, options, token); - task.catch(err => { - this._logService.error('[CHAT] extension request ERRORED', err, extension.value, requestId); - throw err; - }).finally(() => { + // !!! IMPORTANT !!! + // This method must return before the response is done (has streamed all parts) + // and because of that we consume the stream without awaiting + // !!! IMPORTANT !!! + (async () => { + try { + for await (const part of response.stream) { + await this._proxy.$acceptResponsePart(requestId, part); + } + } catch (err) { + this._logService.error('[CHAT] extension request ERRORED in STREAM', err, extension.value, requestId); + this._proxy.$acceptResponseDone(requestId, err); + } + })(); + + // When the response is done (signaled via its result) we tell the EH + response.result.then(() => { this._logService.debug('[CHAT] extension request DONE', extension.value, requestId); + this._proxy.$acceptResponseDone(requestId, undefined); + }, err => { + this._logService.error('[CHAT] extension request ERRORED', err, extension.value, requestId); + this._proxy.$acceptResponseDone(requestId, err); }); - - return task; } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2543db5dcbacd..dba2a510810a2 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1202,12 +1202,10 @@ export interface ExtHostSpeechShape { export interface MainThreadLanguageModelsShape extends IDisposable { $registerLanguageModelProvider(handle: number, identifier: string, metadata: ILanguageModelChatMetadata): void; $unregisterProvider(handle: number): void; - $handleProgressChunk(requestId: number, chunk: IChatResponseFragment): Promise; - + $tryStartChatRequest(extension: ExtensionIdentifier, provider: string, requestId: number, messages: IChatMessage[], options: {}, token: CancellationToken): Promise; + $handleResponsePart(requestId: number, chunk: IChatResponseFragment): Promise; + $handleResponseDone(requestId: number, error: any | undefined): Promise; $selectChatModels(selector: ILanguageModelChatSelector): Promise; - - $fetchResponse(extension: ExtensionIdentifier, provider: string, requestId: number, messages: IChatMessage[], options: {}, token: CancellationToken): Promise; - $whenLanguageModelChatRequestMade(identifier: string, extension: ExtensionIdentifier, participant?: string, tokenCount?: number): void; $countTokens(provider: string, value: string | IChatMessage, token: CancellationToken): Promise; } @@ -1215,8 +1213,9 @@ export interface MainThreadLanguageModelsShape extends IDisposable { export interface ExtHostLanguageModelsShape { $acceptChatModelMetadata(data: ILanguageModelsChangeEvent): void; $updateModelAccesslist(data: { from: ExtensionIdentifier; to: ExtensionIdentifier; enabled: boolean }[]): void; - $provideLanguageModelResponse(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, token: CancellationToken): Promise; - $handleResponseFragment(requestId: number, chunk: IChatResponseFragment): Promise; + $startChatRequest(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, token: CancellationToken): Promise; + $acceptResponsePart(requestId: number, chunk: IChatResponseFragment): Promise; + $acceptResponseDone(requestId: number, error: any | undefined): Promise; $provideTokenLength(handle: number, value: string | IChatMessage, token: CancellationToken): Promise; } diff --git a/src/vs/workbench/api/common/extHostLanguageModels.ts b/src/vs/workbench/api/common/extHostLanguageModels.ts index 908bfff357dd5..2adfd33ea5ab9 100644 --- a/src/vs/workbench/api/common/extHostLanguageModels.ts +++ b/src/vs/workbench/api/common/extHostLanguageModels.ts @@ -3,8 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AsyncIterableObject, AsyncIterableSource, Barrier } from 'vs/base/common/async'; +import { AsyncIterableObject, AsyncIterableSource } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { toErrorMessage } from 'vs/base/common/errorMessage'; import { CancellationError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; @@ -53,21 +54,24 @@ class LanguageModelResponse { private readonly _responseStreams = new Map(); private readonly _defaultStream = new AsyncIterableSource(); private _isDone: boolean = false; - private _isStreaming: boolean = false; constructor() { const that = this; this.apiObject = { // result: promise, - stream: that._defaultStream.asyncIterable, - text: AsyncIterableObject.map(that._defaultStream.asyncIterable, part => { - if (part instanceof extHostTypes.LanguageModelTextPart) { - return part.value; - } else { - return undefined; - } - }).coalesce(), + get stream() { + return that._defaultStream.asyncIterable; + }, + get text() { + return AsyncIterableObject.map(that._defaultStream.asyncIterable, part => { + if (part instanceof extHostTypes.LanguageModelTextPart) { + return part.value; + } else { + return undefined; + } + }).coalesce(); + }, }; } @@ -85,7 +89,6 @@ class LanguageModelResponse { if (this._isDone) { return; } - this._isStreaming = true; let res = this._responseStreams.get(fragment.index); if (!res) { if (this._responseStreams.size === 0) { @@ -106,9 +109,6 @@ class LanguageModelResponse { res.stream.emitOne(out); } - get isStreaming(): boolean { - return this._isStreaming; - } reject(err: Error): void { this._isDone = true; @@ -189,10 +189,10 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { }); } - async $provideLanguageModelResponse(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: vscode.LanguageModelChatRequestOptions, token: CancellationToken): Promise { + async $startChatRequest(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: vscode.LanguageModelChatRequestOptions, token: CancellationToken): Promise { const data = this._languageModels.get(handle); if (!data) { - return; + throw new Error('Provider not found'); } const progress = new Progress(async fragment => { if (token.isCancellationRequested) { @@ -212,18 +212,20 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { return; } - this._proxy.$handleProgressChunk(requestId, { index: fragment.index, part }); + this._proxy.$handleResponsePart(requestId, { index: fragment.index, part }); }); + let p: Promise; + if (data.provider.provideLanguageModelResponse2) { - return data.provider.provideLanguageModelResponse2( + p = Promise.resolve(data.provider.provideLanguageModelResponse2( messages.map(typeConvert.LanguageModelChatMessage.to), options, ExtensionIdentifier.toKey(from), progress, token - ); + )); } else { @@ -231,16 +233,21 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { progress.report({ index: fragment.index, part: new extHostTypes.LanguageModelTextPart(fragment.part) }); }); - return data.provider.provideLanguageModelResponse( + p = Promise.resolve(data.provider.provideLanguageModelResponse( messages.map(typeConvert.LanguageModelChatMessage.to), options?.modelOptions ?? {}, ExtensionIdentifier.toKey(from), progress2, token - ); + )); } - } + p.then(() => { + this._proxy.$handleResponseDone(requestId, undefined); + }, err => { + this._proxy.$handleResponseDone(requestId, err); + }); + } //#region --- token counting @@ -354,45 +361,33 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { } } - const requestId = (Math.random() * 1e6) | 0; - const requestPromise = this._proxy.$fetchResponse(from, languageModelId, requestId, internalMessages, options, token); - - const barrier = new Barrier(); - - const res = new LanguageModelResponse(); - this._pendingRequest.set(requestId, { languageModelId, res }); + try { + const requestId = (Math.random() * 1e6) | 0; + const res = new LanguageModelResponse(); + this._pendingRequest.set(requestId, { languageModelId, res }); - let error: Error | undefined; + try { + await this._proxy.$tryStartChatRequest(from, languageModelId, requestId, internalMessages, options, token); - requestPromise.catch(err => { - if (barrier.isOpen()) { - // we received an error while streaming. this means we need to reject the "stream" - // because we have already returned the request object - res.reject(err); - } else { - error = err; + } catch (error) { + // error'ing here means that the request could NOT be started/made, e.g. wrong model, no access, etc, but + // later the response can fail as well. Those failures are communicated via the stream-object + this._pendingRequest.delete(requestId); + throw error; } - }).finally(() => { - this._pendingRequest.delete(requestId); - res.resolve(); - barrier.open(); - }); - await barrier.wait(); + return res.apiObject; - if (error) { + } catch (error) { if (error.name === extHostTypes.LanguageModelError.name) { throw error; } - throw new extHostTypes.LanguageModelError( - `Language model '${languageModelId}' errored, check cause for more details`, + `Language model '${languageModelId}' errored: ${toErrorMessage(error)}`, 'Unknown', error ); } - - return res.apiObject; } private _convertMessages(extension: IExtensionDescription, messages: vscode.LanguageModelChatMessage[]) { @@ -409,13 +404,28 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { return internalMessages; } - async $handleResponseFragment(requestId: number, chunk: IChatResponseFragment): Promise { + async $acceptResponsePart(requestId: number, chunk: IChatResponseFragment): Promise { const data = this._pendingRequest.get(requestId); if (data) { data.res.handleFragment(chunk); } } + async $acceptResponseDone(requestId: number, error: any | undefined): Promise { + const data = this._pendingRequest.get(requestId); + if (!data) { + return; + } + this._pendingRequest.delete(requestId); + if (error) { + // we error the stream because that's the only way to signal + // that the request has failed + data.res.reject(error); + } else { + data.res.resolve(); + } + } + // BIG HACK: Using AuthenticationProviders to check access to Language Models private async _getAuthAccess(from: IExtensionDescription, to: { identifier: ExtensionIdentifier; displayName: string }, justification: string | undefined, silent: boolean | undefined): Promise { // This needs to be done in both MainThread & ExtHost ChatProvider diff --git a/src/vs/workbench/contrib/chat/common/languageModels.ts b/src/vs/workbench/contrib/chat/common/languageModels.ts index 650d3a40c22a8..b19a50e5e44d5 100644 --- a/src/vs/workbench/contrib/chat/common/languageModels.ts +++ b/src/vs/workbench/contrib/chat/common/languageModels.ts @@ -13,7 +13,6 @@ import { localize } from 'vs/nls'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { IProgress } from 'vs/platform/progress/common/progress'; import { IExtensionService, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; @@ -79,9 +78,14 @@ export interface ILanguageModelChatMetadata { }; } +export interface ILanguageModelChatResponse { + stream: AsyncIterable; + result: Promise; +} + export interface ILanguageModelChat { metadata: ILanguageModelChatMetadata; - provideChatResponse(messages: IChatMessage[], from: ExtensionIdentifier, options: { [name: string]: any }, progress: IProgress, token: CancellationToken): Promise; + sendChatRequest(messages: IChatMessage[], from: ExtensionIdentifier, options: { [name: string]: any }, token: CancellationToken): Promise; provideTokenCount(message: string | IChatMessage, token: CancellationToken): Promise; } @@ -119,7 +123,7 @@ export interface ILanguageModelsService { registerLanguageModelChat(identifier: string, provider: ILanguageModelChat): IDisposable; - makeLanguageModelChatRequest(identifier: string, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, progress: IProgress, token: CancellationToken): Promise; + sendChatRequest(identifier: string, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, token: CancellationToken): Promise; computeTokenLength(identifier: string, message: string | IChatMessage, token: CancellationToken): Promise; } @@ -278,12 +282,12 @@ export class LanguageModelsService implements ILanguageModelsService { }); } - makeLanguageModelChatRequest(identifier: string, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, progress: IProgress, token: CancellationToken): Promise { + async sendChatRequest(identifier: string, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, token: CancellationToken): Promise { const provider = this._providers.get(identifier); if (!provider) { throw new Error(`Chat response provider with identifier ${identifier} is not registered.`); } - return provider.provideChatResponse(messages, from, options, progress, token); + return provider.sendChatRequest(messages, from, options, token); } computeTokenLength(identifier: string, message: string | IChatMessage, token: CancellationToken): Promise { diff --git a/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts b/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts index 3f396bd5184a9..edd6464537a89 100644 --- a/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts @@ -51,7 +51,7 @@ suite('LanguageModels', function () { maxInputTokens: 100, maxOutputTokens: 100, }, - provideChatResponse: async () => { + sendChatRequest: async () => { throw new Error(); }, provideTokenCount: async () => { @@ -70,7 +70,7 @@ suite('LanguageModels', function () { maxInputTokens: 100, maxOutputTokens: 100, }, - provideChatResponse: async () => { + sendChatRequest: async () => { throw new Error(); }, provideTokenCount: async () => { From 40e700a8d22459e75aa34ec7b30c30d8c8a1b4e7 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2024 23:15:40 +0200 Subject: [PATCH 405/755] Fix module patching (microsoft/vscode-copilot-release#1294) --- src/vs/workbench/api/node/proxyResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index 4935b3f7870c1..f020924ebe6e4 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -79,7 +79,7 @@ export function connectProxyResolver( function createPatchedModules(params: ProxyAgentParams, resolveProxy: ReturnType) { function mergeModules(module: any, patch: any) { - return Object.assign({}, module, patch); + return Object.assign(module.default || module, patch); } return { From e0a7112fd5c21c98712771fbcf2874f258359750 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 20 Jun 2024 17:49:47 +0200 Subject: [PATCH 406/755] Test custom root certificate (microsoft/vscode-copilot-release#1294) --- extensions/vscode-api-tests/package.json | 4 +- .../src/singlefolder-tests/proxy.test.ts | 77 +++++++++++++++++++ extensions/vscode-api-tests/yarn.lock | 19 +++++ src/vs/workbench/api/node/proxyResolver.ts | 5 ++ 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index 11d375461a290..cd4d67c307090 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -243,7 +243,9 @@ }, "devDependencies": { "@types/mocha": "^9.1.1", - "@types/node": "20.x" + "@types/node": "20.x", + "@types/node-forge": "^1.3.11", + "node-forge": "^1.3.1" }, "repository": { "type": "git", diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts new file mode 100644 index 0000000000000..60f100c7c1f11 --- /dev/null +++ b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts @@ -0,0 +1,77 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as https from 'https'; +import 'mocha'; +import { assertNoRpc } from '../utils'; +import { pki } from 'node-forge'; +import { AddressInfo } from 'net'; +import { resetCaches } from '@vscode/proxy-agent'; + +suite('vscode API - network proxy support', () => { + + teardown(async function () { + assertNoRpc(); + }); + + test('custom root certificate', async () => { + const keys = pki.rsa.generateKeyPair(2048); + const cert = pki.createCertificate(); + cert.publicKey = keys.publicKey; + cert.serialNumber = '01'; + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); + const attrs = [{ + name: 'commonName', + value: 'localhost-proxy-test' + }]; + cert.setSubject(attrs); + cert.setIssuer(attrs); + cert.sign(keys.privateKey); + const certPEM = pki.certificateToPem(cert); + const privateKeyPEM = pki.privateKeyToPem(keys.privateKey); + + let resolvePort: (port: number) => void; + let rejectPort: (err: any) => void; + const port = new Promise((resolve, reject) => { + resolvePort = resolve; + rejectPort = reject; + }); + const server = https.createServer({ + key: privateKeyPEM, + cert: certPEM, + }, (_req, res) => { + res.end(); + }).listen(0, '127.0.0.1', () => { + const address = server.address(); + resolvePort((address as AddressInfo).port); + }).on('error', err => { + rejectPort(err); + }); + + // Using https.globalAgent because it is shared with proxyResolver.ts and mutable. + (https.globalAgent as any).testCertificates = [certPEM]; + resetCaches(); + + try { + const portNumber = await port; + await new Promise((resolve, reject) => { + https.get(`https://127.0.0.1:${portNumber}`, { servername: 'localhost-proxy-test' }, res => { + if (res.statusCode === 200) { + resolve(); + } else { + reject(new Error(`Unexpected status code: ${res.statusCode}`)); + } + }) + .on('error', reject); + }); + } finally { + delete (https.globalAgent as any).testCertificates; + resetCaches(); + server.close(); + } + }); +}); diff --git a/extensions/vscode-api-tests/yarn.lock b/extensions/vscode-api-tests/yarn.lock index 484fa0c5ac54b..33a2f5119276c 100644 --- a/extensions/vscode-api-tests/yarn.lock +++ b/extensions/vscode-api-tests/yarn.lock @@ -7,6 +7,20 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== +"@types/node-forge@^1.3.11": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" + integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== + dependencies: + undici-types "~5.26.4" + "@types/node@20.x": version "20.11.24" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" @@ -14,6 +28,11 @@ dependencies: undici-types "~5.26.4" +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index f020924ebe6e4..f285450008374 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -67,6 +67,11 @@ export function connectProxyResolver( certs.then(certs => extHostLogService.trace('ProxyResolver#loadAdditionalCertificates: Loaded certificates from main process', certs.length)); promises.push(certs); } + // Using https.globalAgent because it is shared with proxy.test.ts and mutable. + if (initData.environment.extensionTestsLocationURI && (https.globalAgent as any).testCertificates?.length) { + extHostLogService.trace('ProxyResolver#loadAdditionalCertificates: Loading test certificates'); + promises.push(Promise.resolve((https.globalAgent as any).testCertificates as string[])); + } return (await Promise.all(promises)).flat(); }, env: process.env, From defc051a7ba0816c2119e6de9d9c84f86ca09617 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 21 Jun 2024 11:01:22 +0200 Subject: [PATCH 407/755] fix #214341 (#216790) * fix #214341 * remove unwanted --- .../common/extensionGalleryService.ts | 9 +++++++- .../common/extensionManagement.ts | 1 + .../browser/extensionsWorkbenchService.ts | 22 ++++++++++--------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 6c90b5a8f1922..e8698264bfabe 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -587,6 +587,7 @@ interface IRawExtensionsControlManifest { additionalInfo?: string; }>; search?: ISearchPrefferedResults[]; + extensionsEnabledWithPreRelease?: string[]; } abstract class AbstractExtensionGalleryService implements IExtensionGalleryService { @@ -1310,6 +1311,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi const malicious: IExtensionIdentifier[] = []; const deprecated: IStringDictionary = {}; const search: ISearchPrefferedResults[] = []; + const extensionsEnabledWithPreRelease: string[] = []; if (result) { for (const id of result.malicious) { malicious.push({ id }); @@ -1341,9 +1343,14 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi search.push(s); } } + if (Array.isArray(result.extensionsEnabledWithPreRelease)) { + for (const id of result.extensionsEnabledWithPreRelease) { + extensionsEnabledWithPreRelease.push(id.toLowerCase()); + } + } } - return { malicious, deprecated, search }; + return { malicious, deprecated, search, extensionsEnabledWithPreRelease }; } } diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index d40ee80fc784f..68f21988fc4a1 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -327,6 +327,7 @@ export interface IExtensionsControlManifest { readonly malicious: IExtensionIdentifier[]; readonly deprecated: IStringDictionary; readonly search: ISearchPrefferedResults[]; + readonly extensionsEnabledWithPreRelease?: string[]; } export const enum InstallOperation { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index f5a1bf6d01ae6..826da4474fbb3 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -341,8 +341,9 @@ export class Extension implements IExtension { return !!this.gallery?.properties.isPreReleaseVersion; } + private _extensionEnabledWithPreRelease: boolean | undefined; get hasPreReleaseVersion(): boolean { - return !!this.gallery?.hasPreReleaseVersion || !!this.local?.hasPreReleaseVersion; + return !!this.gallery?.hasPreReleaseVersion || !!this.local?.hasPreReleaseVersion || !!this._extensionEnabledWithPreRelease; } get hasReleaseVersion(): boolean { @@ -500,6 +501,12 @@ ${this.description} return []; } + setExtensionsControlManifest(extensionsControlManifest: IExtensionsControlManifest): void { + this.isMalicious = extensionsControlManifest.malicious.some(identifier => areSameExtensions(this.identifier, identifier)); + this.deprecationInfo = extensionsControlManifest.deprecated ? extensionsControlManifest.deprecated[this.identifier.id.toLowerCase()] : undefined; + this._extensionEnabledWithPreRelease = extensionsControlManifest?.extensionsEnabledWithPreRelease?.includes(this.identifier.id.toLowerCase()); + } + private getManifestFromLocalOrResource(): IExtensionManifest | null { if (this.local) { return this.local.manifest; @@ -515,11 +522,6 @@ const EXTENSIONS_AUTO_UPDATE_KEY = 'extensions.autoUpdate'; class Extensions extends Disposable { - static updateExtensionFromControlManifest(extension: Extension, extensionsControlManifest: IExtensionsControlManifest): void { - extension.isMalicious = extensionsControlManifest.malicious.some(identifier => areSameExtensions(extension.identifier, identifier)); - extension.deprecationInfo = extensionsControlManifest.deprecated ? extensionsControlManifest.deprecated[extension.identifier.id.toLowerCase()] : undefined; - } - private readonly _onChange = this._register(new Emitter<{ extension: Extension; operation?: InstallOperation } | undefined>()); get onChange() { return this._onChange.event; } @@ -723,7 +725,7 @@ class Extensions extends Disposable { const extension = byId[local.identifier.id] || this.instantiationService.createInstance(Extension, this.stateProvider, this.runtimeStateProvider, this.server, local, undefined, undefined); extension.local = local; extension.enablementState = this.extensionEnablementService.getEnablementState(local); - Extensions.updateExtensionFromControlManifest(extension, extensionsControlManifest); + extension.setExtensionsControlManifest(extensionsControlManifest); return extension; }); } @@ -759,7 +761,7 @@ class Extensions extends Disposable { if (!extension.gallery) { extension.gallery = gallery; } - Extensions.updateExtensionFromControlManifest(extension, await this.server.extensionManagementService.getExtensionsControlManifest()); + extension.setExtensionsControlManifest(await this.server.extensionManagementService.getExtensionsControlManifest()); extension.enablementState = this.extensionEnablementService.getEnablementState(local); } } @@ -1257,7 +1259,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension let extension = this.getInstalledExtensionMatchingGallery(gallery); if (!extension) { extension = this.instantiationService.createInstance(Extension, ext => this.getExtensionState(ext), ext => this.getRuntimeState(ext), undefined, undefined, gallery, undefined); - Extensions.updateExtensionFromControlManifest(extension, extensionsControlManifest); + (extension).setExtensionsControlManifest(extensionsControlManifest); } return extension; } @@ -2010,7 +2012,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } if (!extension && gallery) { extension = this.instantiationService.createInstance(Extension, ext => this.getExtensionState(ext), ext => this.getRuntimeState(ext), undefined, undefined, gallery, undefined); - Extensions.updateExtensionFromControlManifest(extension as Extension, await this.extensionManagementService.getExtensionsControlManifest()); + (extension).setExtensionsControlManifest(await this.extensionManagementService.getExtensionsControlManifest()); } if (extension?.isMalicious) { throw new Error(nls.localize('malicious', "This extension is reported to be problematic.")); From 63d06667600a2c40245a0ab1f9e2ea816d2fe849 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2024 11:25:42 +0200 Subject: [PATCH 408/755] fix https://github.com/microsoft/vscode/issues/216791 (#216794) --- .../browser/inlineChatZoneWidget.ts | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index 3dea5ecc72fc7..e4128063fc257 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -21,6 +21,7 @@ import { StableEditorBottomScrollState } from 'vs/editor/browser/stableEditorScr import { ScrollType } from 'vs/editor/common/editorCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { ILogService } from 'vs/platform/log/common/log'; export class InlineChatZoneWidget extends ZoneWidget { @@ -33,6 +34,7 @@ export class InlineChatZoneWidget extends ZoneWidget { location: ChatAgentLocation, editor: ICodeEditor, @IInstantiationService private readonly _instaService: IInstantiationService, + @ILogService private _logService: ILogService, @IContextKeyService contextKeyService: IContextKeyService, @IConfigurationService configurationService: IConfigurationService, ) { @@ -182,25 +184,26 @@ export class InlineChatZoneWidget extends ZoneWidget { const lineNumber = position.lineNumber <= 1 ? 1 : 1 + position.lineNumber; + const scrollTop = this.editor.getScrollTop(); const lineTop = this.editor.getTopForLineNumber(lineNumber); const zoneTop = lineTop - height.pixelsValue; const editorHeight = this.editor.getLayoutInfo().height; - const newLineBottom = this.editor.getBottomForLineNumber(lineNumber); + const lineBottom = this.editor.getBottomForLineNumber(lineNumber); - let newTop: number; - if (newLineBottom > editorHeight) { - newTop = newLineBottom - editorHeight; - } else { - newTop = zoneTop; - } - - const currentTop = this.editor.getScrollTop(); + let newScrollTop = zoneTop; + let forceScrollTop = false; - // console.log('REVEAL ZONE TOP', { zoneTop, newLineBottom, editorHeight, currentTop, newTop }); + if (lineBottom >= (scrollTop + editorHeight)) { + // revealing the top of the zone would pust out the line we are interested it and + // therefore we keep the line in the view port + newScrollTop = lineBottom - editorHeight; + forceScrollTop = true; + } - if (newTop < currentTop) { - this.editor.setScrollTop(newTop, ScrollType.Immediate); + if (newScrollTop < scrollTop || forceScrollTop) { + this._logService.trace('[IE] REVEAL zone', { zoneTop, lineTop, lineBottom, scrollTop, newScrollTop, forceScrollTop }); + this.editor.setScrollTop(newScrollTop, ScrollType.Immediate); } } From e341e59f1f3934c805be69c56d50c64977fdfc03 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 21 Jun 2024 11:28:07 +0200 Subject: [PATCH 409/755] Close All Editors action performs a soft revert skipping over change event for extensions (fix #215474) (#216795) --- .../browser/parts/editor/editorActions.ts | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 67d4b7173d42a..63e2103bcee60 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -37,6 +37,7 @@ import { ActiveEditorAvailableEditorIdsContext, ActiveEditorContext, ActiveEdito import { URI } from 'vs/base/common/uri'; import { getActiveDocument } from 'vs/base/browser/dom'; import { ICommandActionTitle } from 'vs/platform/action/common/action'; +import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; class ExecuteCommandAction extends Action2 { @@ -564,6 +565,8 @@ abstract class AbstractCloseAllAction extends Action2 { override async run(accessor: ServicesAccessor): Promise { const editorService = accessor.get(IEditorService); + const logService = accessor.get(ILogService); + const progressService = accessor.get(IProgressService); const editorGroupService = accessor.get(IEditorGroupsService); const filesConfigurationService = accessor.get(IFilesConfigurationService); const fileDialogService = accessor.get(IFileDialogService); @@ -636,7 +639,7 @@ abstract class AbstractCloseAllAction extends Action2 { case ConfirmResult.CANCEL: return; case ConfirmResult.DONT_SAVE: - await editorService.revert(editors, { soft: true }); + await this.revertEditors(editorService, logService, progressService, editors); break; case ConfirmResult.SAVE: await editorService.save(editors, { reason: SaveReason.EXPLICIT }); @@ -656,7 +659,7 @@ abstract class AbstractCloseAllAction extends Action2 { case ConfirmResult.CANCEL: return; case ConfirmResult.DONT_SAVE: - await editorService.revert(editors, { soft: true }); + await this.revertEditors(editorService, logService, progressService, editors); break; case ConfirmResult.SAVE: await editorService.save(editors, { reason: SaveReason.EXPLICIT }); @@ -686,6 +689,33 @@ abstract class AbstractCloseAllAction extends Action2 { return this.doCloseAll(editorGroupService); } + private revertEditors(editorService: IEditorService, logService: ILogService, progressService: IProgressService, editors: IEditorIdentifier[]): Promise { + return progressService.withProgress({ + location: ProgressLocation.Window, // use window progress to not be too annoying about this operation + delay: 800, // delay so that it only appears when operation takes a long time + title: localize('reverting', "Reverting Editors..."), + }, () => this.doRevertEditors(editorService, logService, editors)); + } + + private async doRevertEditors(editorService: IEditorService, logService: ILogService, editors: IEditorIdentifier[]): Promise { + try { + // We first attempt to revert all editors with `soft: false`, to ensure that + // working copies revert to their state on disk. Even though we close editors, + // it is possible that other parties hold a reference to the working copy + // and expect it to be in a certain state after the editor is closed without + // saving. + await editorService.revert(editors); + } catch (error) { + logService.error(error); + + // if that fails, since we are about to close the editor, we accept that + // the editor cannot be reverted and instead do a soft revert that just + // enables us to close the editor. With this, a user can always close a + // dirty editor even when reverting fails. + await editorService.revert(editors, { soft: true }); + } + } + private async revealEditorsToConfirm(editors: ReadonlyArray, editorGroupService: IEditorGroupsService): Promise { try { const handledGroups = new Set(); From abb277a55976abcf335403a8f41abd590918b9ad Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 21 Jun 2024 12:11:19 +0200 Subject: [PATCH 410/755] TS 5.5 - adopt @import JSDoc comments (#216796) --- src/bootstrap-window.js | 6 ++++-- src/main.js | 6 +++--- src/server-main.js | 7 ++++--- .../parts/sandbox/electron-sandbox/preload.js | 16 +++++++--------- .../processExplorer/processExplorer.js | 6 ++++-- .../code/electron-sandbox/workbench/workbench.js | 10 ++++++---- src/vs/platform/environment/node/userDataPath.js | 6 ++++-- .../issue/electron-sandbox/issueReporter.js | 6 ++++-- 8 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index 40d15e7c59e73..d231657094d88 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -8,6 +8,10 @@ //@ts-check 'use strict'; +/** + * @import { ISandboxConfiguration } from './vs/base/parts/sandbox/common/sandboxTypes' + */ + /* eslint-disable no-restricted-globals */ // Simple module style to support node.js and browser environments @@ -29,8 +33,6 @@ const safeProcess = preloadGlobals.process; /** - * @typedef {import('./vs/base/parts/sandbox/common/sandboxTypes').ISandboxConfiguration} ISandboxConfiguration - * * @param {string[]} modulePaths * @param {(result: unknown, configuration: ISandboxConfiguration) => Promise | undefined} resultCallback * @param {{ diff --git a/src/main.js b/src/main.js index 6294a15298c6e..05a38123b6eef 100644 --- a/src/main.js +++ b/src/main.js @@ -7,9 +7,9 @@ 'use strict'; /** - * @typedef {import('./vs/base/common/product').IProductConfiguration} IProductConfiguration - * @typedef {import('./vs/base/node/languagePacks').NLSConfiguration} NLSConfiguration - * @typedef {import('./vs/platform/environment/common/argv').NativeParsedArgs} NativeParsedArgs + * @import { IProductConfiguration } from './vs/base/common/product' + * @import { NLSConfiguration } from './vs/base/node/languagePacks' + * @import { NativeParsedArgs } from './vs/platform/environment/common/argv' */ const perf = require('./vs/base/common/performance'); diff --git a/src/server-main.js b/src/server-main.js index 81e88e118f739..e5feac4a62760 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -5,6 +5,10 @@ // @ts-check +/** + * @import { IServerAPI } from './vs/server/node/remoteExtensionHostAgentServer' + */ + const perf = require('./vs/base/common/performance'); const performance = require('perf_hooks').performance; const product = require('../product.json'); @@ -45,9 +49,6 @@ async function start() { return; } - /** - * @typedef { import('./vs/server/node/remoteExtensionHostAgentServer').IServerAPI } IServerAPI - */ /** @type {IServerAPI | null} */ let _remoteExtensionHostAgentServer = null; /** @type {Promise | null} */ diff --git a/src/vs/base/parts/sandbox/electron-sandbox/preload.js b/src/vs/base/parts/sandbox/electron-sandbox/preload.js index e216161648750..7e2339e49dad1 100644 --- a/src/vs/base/parts/sandbox/electron-sandbox/preload.js +++ b/src/vs/base/parts/sandbox/electron-sandbox/preload.js @@ -7,6 +7,13 @@ (function () { 'use strict'; + /** + * @import { ISandboxConfiguration } from '../common/sandboxTypes' + * @import { IpcRenderer } from './electronTypes' + * @import { IpcRendererEvent } from 'electron' + * @import { ISandboxNodeProcess } from './globals' + */ + const { ipcRenderer, webFrame, contextBridge, webUtils } = require('electron'); //#region Utilities @@ -41,10 +48,6 @@ //#region Resolve Configuration - /** - * @typedef {import('../common/sandboxTypes').ISandboxConfiguration} ISandboxConfiguration - */ - /** @type {ISandboxConfiguration | undefined} */ let configuration = undefined; @@ -123,9 +126,6 @@ * A minimal set of methods exposed from Electron's `ipcRenderer` * to support communication to main process. * - * @typedef {import('./electronTypes').IpcRenderer} IpcRenderer - * @typedef {import('electron').IpcRendererEvent} IpcRendererEvent - * * @type {IpcRenderer} */ @@ -256,8 +256,6 @@ * Note: when `sandbox` is enabled, the only properties available * are https://github.com/electron/electron/blob/master/docs/api/process.md#sandbox * - * @typedef {import('./globals').ISandboxNodeProcess} ISandboxNodeProcess - * * @type {ISandboxNodeProcess} */ process: { diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer.js b/src/vs/code/electron-sandbox/processExplorer/processExplorer.js index ca61af7d50f2a..a81bd8c04ed5e 100644 --- a/src/vs/code/electron-sandbox/processExplorer/processExplorer.js +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer.js @@ -7,6 +7,10 @@ (function () { 'use strict'; + /** + * @import { ISandboxConfiguration } from '../../../base/parts/sandbox/common/sandboxTypes' + */ + const bootstrapWindow = bootstrapWindowLib(); // Load process explorer into window @@ -21,8 +25,6 @@ }); /** - * @typedef {import('../../../base/parts/sandbox/common/sandboxTypes').ISandboxConfiguration} ISandboxConfiguration - * * @returns {{ * load: ( * modules: string[], diff --git a/src/vs/code/electron-sandbox/workbench/workbench.js b/src/vs/code/electron-sandbox/workbench/workbench.js index 450b99a85f785..2583062323776 100644 --- a/src/vs/code/electron-sandbox/workbench/workbench.js +++ b/src/vs/code/electron-sandbox/workbench/workbench.js @@ -9,6 +9,12 @@ (function () { 'use strict'; + /** + * @import {INativeWindowConfiguration} from '../../../platform/window/common/window' + * @import {NativeParsedArgs} from '../../../platform/environment/common/argv' + * @import {ISandboxConfiguration} from '../../../base/parts/sandbox/common/sandboxTypes' + */ + const bootstrapWindow = bootstrapWindowLib(); // Add a perf entry right from the top @@ -75,10 +81,6 @@ //#region Helpers /** - * @typedef {import('../../../platform/window/common/window').INativeWindowConfiguration} INativeWindowConfiguration - * @typedef {import('../../../platform/environment/common/argv').NativeParsedArgs} NativeParsedArgs - * @typedef {import('../../../base/parts/sandbox/common/sandboxTypes').ISandboxConfiguration} ISandboxConfiguration - * * @returns {{ * load: ( * modules: string[], diff --git a/src/vs/platform/environment/node/userDataPath.js b/src/vs/platform/environment/node/userDataPath.js index 92898523ed111..1e89f1fee06ed 100644 --- a/src/vs/platform/environment/node/userDataPath.js +++ b/src/vs/platform/environment/node/userDataPath.js @@ -10,8 +10,10 @@ 'use strict'; /** - * @typedef {import('../../environment/common/argv').NativeParsedArgs} NativeParsedArgs - * + * @import { NativeParsedArgs } from '../../environment/common/argv' + */ + + /** * @param {typeof import('path')} path * @param {typeof import('os')} os * @param {string} cwd diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js index 03f3200ce5995..aad5671f1f021 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.js @@ -7,6 +7,10 @@ (function () { 'use strict'; + /** + * @import { ISandboxConfiguration } from '../../../../base/parts/sandbox/common/sandboxTypes' + */ + const bootstrapWindow = bootstrapWindowLib(); // Load issue reporter into window @@ -24,8 +28,6 @@ ); /** - * @typedef {import('../../../../base/parts/sandbox/common/sandboxTypes').ISandboxConfiguration} ISandboxConfiguration - * * @returns {{ * load: ( * modules: string[], From ae248b74bf9293b2fc936dff30d011af820a6604 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:00:13 +0200 Subject: [PATCH 411/755] SCM - tracking down more rendering bugs (#216799) --- src/vs/workbench/contrib/scm/browser/scmHistory.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmHistory.ts b/src/vs/workbench/contrib/scm/browser/scmHistory.ts index cab113604dad9..f6505a2eec43c 100644 --- a/src/vs/workbench/contrib/scm/browser/scmHistory.ts +++ b/src/vs/workbench/contrib/scm/browser/scmHistory.ts @@ -75,13 +75,14 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV const inputSwimlanes = historyItemViewModel.inputSwimlanes; const outputSwimlanes = historyItemViewModel.outputSwimlanes; + // Find the history item in the input swimlanes const inputIndex = inputSwimlanes.findIndex(node => node.id === historyItem.id); - const outputIndex = historyItem.parentIds.length === 0 ? -1 : findLastIndex(outputSwimlanes, historyItem.parentIds[0]); + // Circle index - use the input swimlane index if present, otherwise add it to the end const circleIndex = inputIndex !== -1 ? inputIndex : inputSwimlanes.length; - const circleColorIndex = - outputIndex !== -1 ? outputSwimlanes[outputIndex].color : - inputIndex !== -1 ? inputSwimlanes[inputIndex].color : 0; + + // Circle color - use the output swimlane color if present, otherwise the input swimlane color + const circleColorIndex = circleIndex < outputSwimlanes.length ? outputSwimlanes[circleIndex].color : inputSwimlanes[circleIndex].color; let outputSwimlaneIndex = 0; for (let index = 0; index < inputSwimlanes.length; index++) { @@ -173,8 +174,8 @@ export function renderSCMHistoryItemGraph(historyItemViewModel: ISCMHistoryItemV } // Draw | from * - if (outputIndex !== -1) { - const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), SWIMLANE_HEIGHT / 2, SWIMLANE_HEIGHT, graphColors[outputSwimlanes[outputIndex].color]); + if (historyItem.parentIds.length > 0) { + const path = drawVerticalLine(SWIMLANE_WIDTH * (circleIndex + 1), SWIMLANE_HEIGHT / 2, SWIMLANE_HEIGHT, graphColors[circleColorIndex]); svg.append(path); } From d64446d9a2e3c12108b1bbc7cbe94fdc2111de76 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2024 13:12:27 +0200 Subject: [PATCH 412/755] filter send and cancel actions from execute toolbar (#216801) * * fixes https://github.com/microsoft/vscode/issues/216692 * make text-btn with command but with a little color * * don't show close/view-in-chat while request is in flight * filter send and cancel actions from execute toolbar fixes https://github.com/microsoft/vscode/issues/216772 --- .../suggest/browser/suggestWidgetStatus.ts | 2 +- .../browser/menuEntryActionViewItem.css | 2 +- .../browser/menuEntryActionViewItem.ts | 2 + .../browser/inlineChat.contribution.ts | 46 +++++++++++++++- .../inlineChat/browser/inlineChatActions.ts | 6 +-- .../browser/inlineChatContentWidget.ts | 11 +++- .../browser/inlineChatZoneWidget.ts | 4 +- .../inlineChat/browser/media/inlineChat.css | 52 +++++++++++-------- .../contrib/inlineChat/common/inlineChat.ts | 2 +- .../controller/chat/notebookChatController.ts | 4 +- 10 files changed, 93 insertions(+), 38 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts b/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts index 2db562cf9c9a1..4a1df5b9ce868 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts @@ -30,7 +30,7 @@ export class SuggestWidgetStatus { this.element = dom.append(container, dom.$('.suggest-status-bar')); const actionViewItemProvider = (action => { - return action instanceof MenuItemAction ? instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, undefined) : undefined; + return action instanceof MenuItemAction ? instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { useComma: true }) : undefined; }); this._leftActions = new ActionBar(this.element, { actionViewItemProvider }); this._rightActions = new ActionBar(this.element, { actionViewItemProvider }); diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.css b/src/vs/platform/actions/browser/menuEntryActionViewItem.css index 7a75d9f62fddd..7eb35af7e4b00 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.css +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.css @@ -17,7 +17,7 @@ border-radius: 2px; } -.monaco-action-bar .action-item.menu-entry.text-only:not(:last-of-type) .action-label::after { +.monaco-action-bar .action-item.menu-entry.text-only.use-comma:not(:last-of-type) .action-label::after { content: ', '; } diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index da6ca0985aeb2..68380cddacf8e 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -288,6 +288,7 @@ export class MenuEntryActionViewItem { @@ -297,6 +298,7 @@ export class TextOnlyMenuEntryActionViewItem extends MenuEntryActionViewItem void; + + constructor(@IConfigurationService configService: IConfigurationService,) { + + const store = new DisposableStore(); + function updateMenu() { + if (configService.getValue(InlineChatConfigKeys.ExpTextButtons)) { + store.clear(); + for (const item of MenuRegistry.getMenuItems(MenuId.ChatExecute)) { + if (isIMenuItem(item) && (item.command.id === SubmitAction.ID || item.command.id === CancelAction.ID)) { + continue; + } + store.add(MenuRegistry.appendMenuItem(MENU_INLINE_CHAT_EXECUTE, item)); + } + } + } + updateMenu(); + const listener = MenuRegistry.onDidChangeMenu(e => { + if (e.has(MenuId.ChatExecute)) { + updateMenu(); + } + }); + + this.dispose = () => { + listener.dispose(); + store.dispose(); + }; + } +} + +registerWorkbenchContribution2(MenuCopier.Id, MenuCopier, WorkbenchPhase.AfterRestored); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index 32e617d945219..063e2de835c7a 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -11,7 +11,7 @@ import { EmbeddedDiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/em import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { InlineChatController, InlineChatRunOptions } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; -import { ACTION_ACCEPT_CHANGES, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_HAS_STASHED_SESSION, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_DOCUMENT_CHANGED, CTX_INLINE_CHAT_EDIT_MODE, EditMode, MENU_INLINE_CHAT_WIDGET_STATUS, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, InlineChatResponseType, ACTION_REGENERATE_RESPONSE, MENU_INLINE_CHAT_CONTENT_STATUS, ACTION_VIEW_IN_CHAT, ACTION_TOGGLE_DIFF, CTX_INLINE_CHAT_CHANGE_HAS_DIFF, CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, CTX_INLINE_CHAT_CONFIG_TXT_BTNS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { ACTION_ACCEPT_CHANGES, CTX_INLINE_CHAT_HAS_AGENT, CTX_INLINE_CHAT_HAS_STASHED_SESSION, CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_DOCUMENT_CHANGED, CTX_INLINE_CHAT_EDIT_MODE, EditMode, MENU_INLINE_CHAT_WIDGET_STATUS, CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, InlineChatResponseType, ACTION_REGENERATE_RESPONSE, MENU_INLINE_CHAT_CONTENT_STATUS, ACTION_VIEW_IN_CHAT, ACTION_TOGGLE_DIFF, CTX_INLINE_CHAT_CHANGE_HAS_DIFF, CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { localize, localize2 } from 'vs/nls'; import { Action2, IAction2Options } from 'vs/platform/actions/common/actions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; @@ -368,7 +368,7 @@ export class CloseAction extends AbstractInlineChatAction { group: '0_main', order: 1, when: ContextKeyExpr.and( - // CTX_INLINE_CHAT_CONFIG_TXT_BTNS, + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.negate(), ContextKeyExpr.or( CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.Messages), CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Preview) @@ -498,7 +498,7 @@ export class ViewInChatAction extends AbstractInlineChatAction { order: 1, when: ContextKeyExpr.and( CTX_INLINE_CHAT_RESPONSE_TYPE.isEqualTo(InlineChatResponseType.Messages), - CTX_INLINE_CHAT_CONFIG_TXT_BTNS + CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.negate() ) }], keybinding: { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts index 199f66d0c42ba..a10f96a8be094 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts @@ -11,7 +11,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { inlineChatBackground, MENU_INLINE_CHAT_CONTENT_STATUS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { inlineChatBackground, InlineChatConfigKeys, MENU_INLINE_CHAT_CONTENT_STATUS, MENU_INLINE_CHAT_EXECUTE } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; @@ -25,6 +25,7 @@ import { ScrollType } from 'vs/editor/common/editorCommon'; import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { MenuItemAction } from 'vs/platform/actions/common/actions'; import { TextOnlyMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class InlineChatContentWidget implements IContentWidget { @@ -52,6 +53,7 @@ export class InlineChatContentWidget implements IContentWidget { private readonly _editor: ICodeEditor, @IInstantiationService instaService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, + @IConfigurationService configurationService: IConfigurationService ) { this._defaultChatModel = this._store.add(instaService.createInstance(ChatModel, undefined, ChatAgentLocation.Editor)); @@ -76,7 +78,8 @@ export class InlineChatContentWidget implements IContentWidget { renderFollowups: true, supportsFileReferences: false, menus: { - telemetrySource: 'inlineChat-content' + telemetrySource: 'inlineChat-content', + executeToolbar: MENU_INLINE_CHAT_EXECUTE, }, filter: _item => false }, @@ -98,6 +101,10 @@ export class InlineChatContentWidget implements IContentWidget { this._domNode.appendChild(this._inputContainer); this._toolbarContainer.classList.add('toolbar'); + if (!configurationService.getValue(InlineChatConfigKeys.ExpTextButtons)) { + this._toolbarContainer.style.display = 'none'; + this._domNode.style.paddingBottom = '6px'; + } this._domNode.appendChild(this._toolbarContainer); this._store.add(scopedInstaService.createInstance(MenuWorkbenchToolBar, this._toolbarContainer, MENU_INLINE_CHAT_CONTENT_STATUS, { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index e4128063fc257..793600ccf0c93 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -14,7 +14,7 @@ import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ACTION_ACCEPT_CHANGES, ACTION_REGENERATE_RESPONSE, ACTION_TOGGLE_DIFF, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, EditMode, InlineChatConfigKeys, MENU_INLINE_CHAT_WIDGET, MENU_INLINE_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { ACTION_ACCEPT_CHANGES, ACTION_REGENERATE_RESPONSE, ACTION_TOGGLE_DIFF, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, EditMode, InlineChatConfigKeys, MENU_INLINE_CHAT_EXECUTE, MENU_INLINE_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { EditorBasedInlineChatWidget } from './inlineChatWidget'; import { isEqual } from 'vs/base/common/resources'; import { StableEditorBottomScrollState } from 'vs/editor/browser/stableEditorScroll'; @@ -63,7 +63,7 @@ export class InlineChatZoneWidget extends ZoneWidget { }, chatWidgetViewOptions: { menus: { - inputSideToolbar: MENU_INLINE_CHAT_WIDGET, + executeToolbar: MENU_INLINE_CHAT_EXECUTE, telemetrySource: 'interactiveEditorWidget-toolbar', }, rendererOptions: { diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index 79fba8eddb9dc..b2efaecda491c 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -13,7 +13,7 @@ .monaco-workbench .inline-chat { color: inherit; - padding: 0 8px 8px 8px; + padding: 0 8px; border-radius: 4px; border: 1px solid var(--vscode-inlineChat-border); box-shadow: 0 2px 4px 0 var(--vscode-widget-shadow); @@ -21,10 +21,6 @@ background: var(--vscode-inlineChat-background); } -.monaco-workbench .inline-chat.toolbar { - padding-bottom: 4px; -} - .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-input-part .interactive-execute-toolbar { margin-bottom: 1px; } @@ -74,7 +70,6 @@ display: flex; justify-content: space-between; align-items: center; - margin-top: 3px; /*makes space for action focus borders: https://github.com/microsoft/vscode-copilot/issues/5814 */ } .monaco-workbench .inline-chat .status .actions.hidden { @@ -147,24 +142,35 @@ display: none; } -.monaco-workbench .inline-chat .status .actions { - display: flex; - padding-top: 3px; -} - -.monaco-workbench .inline-chat .status .actions .action-item.text-only .action-label, -.monaco-workbench .inline-chat-content-widget .status .actions .action-item.text-only .action-label { - font-size: 12px; - line-height: 16px; - padding: 2px; - border-radius: 2px; -} +.monaco-workbench .inline-chat .status .actions, +.monaco-workbench .inline-chat-content-widget .toolbar { -.monaco-action-bar .action-item.menu-entry.text-only + .action-item:not(.text-only) > .monaco-dropdown .action-label { - font-size: 12px; - line-height: 16px; - width: unset; - height: unset; + display: flex; + height: 18px; + padding: 3px 0; /* makes space for action focus borders: https://github.com/microsoft/vscode-copilot/issues/5814 */ + + .actions-container { + gap: 3px + } + + .action-item.text-only .action-label { + font-size: 12px; + line-height: 16px; + padding: 1px 2px; + border-radius: 3px; + } + + .monaco-action-bar .action-item.menu-entry.text-only:first-of-type .action-label{ + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); + } + + .monaco-action-bar .action-item.menu-entry.text-only + .action-item:not(.text-only) > .monaco-dropdown .action-label { + font-size: 12px; + line-height: 16px; + width: unset; + height: unset; + } } .monaco-workbench .inline-chat .status .actions > .monaco-button, diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index 7cb071748bea2..4039811d60d1c 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -116,7 +116,7 @@ export const ACTION_TOGGLE_DIFF = 'inlineChat.toggleDiff'; // --- menus -export const MENU_INLINE_CHAT_WIDGET = MenuId.for('inlineChatWidget'); +export const MENU_INLINE_CHAT_EXECUTE = MenuId.for('inlineChat.execute'); export const MENU_INLINE_CHAT_CONTENT_STATUS = MenuId.for('inlineChat.content.status'); export const MENU_INLINE_CHAT_WIDGET_STATUS = MenuId.for('inlineChatWidget.status'); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts index 5558c1a7b6914..fc164d21321a8 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts @@ -36,7 +36,6 @@ import { countWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; import { ProgressingEditsOptions } from 'vs/workbench/contrib/inlineChat/browser/inlineChatStrategies'; import { InlineChatWidget } from 'vs/workbench/contrib/inlineChat/browser/inlineChatWidget'; import { asProgressiveEdit, performAsyncTextEdit } from 'vs/workbench/contrib/inlineChat/browser/utils'; -import { MENU_INLINE_CHAT_WIDGET } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { insertCell, runDeleteAction } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { CTX_NOTEBOOK_CELL_CHAT_FOCUSED, CTX_NOTEBOOK_CHAT_HAS_ACTIVE_REQUEST, CTX_NOTEBOOK_CHAT_OUTER_FOCUS_POSITION, CTX_NOTEBOOK_CHAT_USER_DID_EDIT, MENU_CELL_CHAT_WIDGET_STATUS } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext'; import { ICellViewModel, INotebookEditor, INotebookEditorContribution, INotebookViewZone } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; @@ -423,8 +422,7 @@ export class NotebookChatController extends Disposable implements INotebookEdito } }, menus: { - telemetrySource: 'notebook-generate-cell', - inputSideToolbar: MENU_INLINE_CHAT_WIDGET, + telemetrySource: 'notebook-generate-cell' } } } From a759468250a30ec780246db87d599068e916919c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2024 13:22:42 +0200 Subject: [PATCH 413/755] add some testing language model streaming (#216789) * add some testing language model streaming https://github.com/microsoft/vscode/issues/216720 * fix tests --- .../chat/test/common/languageModels.test.ts | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts b/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts index edd6464537a89..ebdde0c0d2223 100644 --- a/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/languageModels.test.ts @@ -4,11 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; +import { AsyncIterableSource, DeferredPromise, timeout } from 'vs/base/common/async'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; -import { languageModelExtensionPoint, LanguageModelsService } from 'vs/workbench/contrib/chat/common/languageModels'; +import { ChatMessageRole, IChatResponseFragment, languageModelExtensionPoint, LanguageModelsService } from 'vs/workbench/contrib/chat/common/languageModels'; import { IExtensionService, nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; @@ -103,5 +105,56 @@ suite('LanguageModels', function () { assert.deepStrictEqual(result2.length, 0); }); + test('sendChatRequest returns a response-stream', async function () { + store.add(languageModels.registerLanguageModelChat('actual', { + metadata: { + extension: nullExtensionDescription.identifier, + name: 'Pretty Name', + vendor: 'test-vendor', + family: 'actual-family', + version: 'actual-version', + id: 'actual-lm', + maxInputTokens: 100, + maxOutputTokens: 100, + }, + sendChatRequest: async (messages, _from, _options, token) => { + // const message = messages.at(-1); + + const defer = new DeferredPromise(); + const stream = new AsyncIterableSource(); + + (async () => { + while (!token.isCancellationRequested) { + stream.emitOne({ index: 0, part: { type: 'text', value: Date.now().toString() } }); + await timeout(10); + } + defer.complete(undefined); + })(); + + return { + stream: stream.asyncIterable, + result: defer.p + }; + }, + provideTokenCount: async () => { + throw new Error(); + } + })); + + const models = await languageModels.selectLanguageModels({ identifier: 'actual-lm' }); + assert.ok(models.length === 1); + + const first = models[0]; + + const cts = new CancellationTokenSource(); + + const request = await languageModels.sendChatRequest(first, nullExtensionDescription.identifier, [{ role: ChatMessageRole.User, content: { type: 'text', value: 'hello' } }], {}, cts.token); + + assert.ok(request); + + cts.dispose(true); + + await request.result; + }); }); From 21b7ce1c8f8fdf74ffeff4ed7b67b3d2cb7d45d3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2024 13:23:35 +0200 Subject: [PATCH 414/755] fix https://github.com/microsoft/vscode-copilot/issues/6010 (#216802) --- src/vs/workbench/contrib/chat/browser/chatListRenderer.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 6c569ce11e951..20af23c10821d 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -436,13 +436,9 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer Date: Fri, 21 Jun 2024 14:14:47 +0200 Subject: [PATCH 415/755] Do not listen on tree menus (#216446) Fixes #213145 --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 1 + .../workbench/browser/parts/views/treeView.ts | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index debb1a0468589..ccfd84591a63e 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -345,6 +345,7 @@ export class AsyncDataTree implements IDisposable get onDidChangeSelection(): Event> { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); } get onKeyDown(): Event { return this.tree.onKeyDown; } + get onMouseOver(): Event> { return Event.map(this.tree.onMouseOver, asTreeMouseEvent); } get onMouseClick(): Event> { return Event.map(this.tree.onMouseClick, asTreeMouseEvent); } get onMouseDblClick(): Event> { return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent); } get onContextMenu(): Event> { return Event.map(this.tree.onContextMenu, asTreeContextMenuEvent); } diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index bf227c9911e56..155c5d6728b5a 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -709,6 +709,21 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { dnd: this.treeViewDnd, overrideStyles: getLocationBasedViewColors(this.viewLocation).listOverrideStyles }) as WorkbenchAsyncDataTree); + this.treeDisposables.add(this.tree.onMouseOver(e => { + if (e.element) { + this.tree?.rerender(e.element); + } + })); + this.treeDisposables.add(this.tree.contextKeyService.onDidChangeContext(e => { + const selection = this.tree?.getSelection(); + if (selection?.length) { + selection.map(item => this.tree?.rerender(item)); + } + const focus = this.tree?.getFocus(); + if (focus?.length) { + focus.map(item => this.tree?.rerender(item)); + } + })); this.treeDisposables.add(this.tree); treeMenus.setContextKeyService(this.tree.contextKeyService); aligner.tree = this.tree; @@ -1317,7 +1332,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer this._onDidChange.fire(element))); - listen.add(menu); - } else { - menu.dispose(); - } + menu.dispose(); } return { primary: this.buildMenu(primaryGroups), secondary: this.buildMenu(secondaryGroups) }; From c8f6bdc946ffbb8588a71d81836e5941a5e546c6 Mon Sep 17 00:00:00 2001 From: isidorn Date: Fri, 21 Jun 2024 14:24:12 +0200 Subject: [PATCH 416/755] add example in the description --- src/vs/workbench/electron-sandbox/desktop.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index cb950f51b9f6d..6fd2279a32061 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -362,7 +362,7 @@ import { MAX_ZOOM_LEVEL, MIN_ZOOM_LEVEL } from 'vs/platform/window/electron-sand }, 'proxy-bypass-list': { type: 'string', - description: localize('argv.proxyBypassList', 'Bypass any specified proxy for the given semi-colon-separated list of hosts.') + description: localize('argv.proxyBypassList', 'Bypass any specified proxy for the given semi-colon-separated list of hosts. Example value ";*.microsoft.com;*foo.com;1.2.3.4:5678", will use the proxy server for all hosts except for local addresses (localhost, 127.0.0.1 etc.), microsoft.com subdomains, hosts that contain the suffix foo.com and anything at 1.2.3.4:5678') }, 'disable-hardware-acceleration': { type: 'boolean', From a2cab7255c0df424027be05d58e1b7b941f4ea60 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 21 Jun 2024 15:41:43 +0200 Subject: [PATCH 417/755] don't move inline chat zone into selection when changes aren't far away (#216809) * return (?) of the info icon * don't move inline chat zone into selection when changes aren't far away --- .../inlineChat/browser/inlineChatController.ts | 14 +++++++++++++- .../inlineChat/browser/inlineChatStrategies.ts | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 7a18d13078c03..2bc8215c4dec9 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -771,7 +771,19 @@ export class InlineChatController implements IEditorContribution { // real response -> complex... this._ui.value.zone.widget.updateStatus(''); - newPosition = await this._strategy.renderChanges(response); + const position = await this._strategy.renderChanges(response); + if (position) { + // if the selection doesn't start far off we keep the widget at its current position + // because it makes reading this nicer + const selection = this._editor.getSelection(); + if (selection?.containsPosition(position)) { + if (position.lineNumber - selection.startLineNumber > 8) { + newPosition = position; + } + } else { + newPosition = position; + } + } } this._showWidget(false, newPosition); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index f2b8c7903e68f..05f3fde5e8812 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -577,7 +577,7 @@ export class LiveStrategy extends EditModeStrategy { message = localize('change.0', "Nothing changed."); } else if (remaining === 1) { message = needsReview - ? localize('review.1', "Accept or Discard change") + ? localize('review.1', "$(info) Accept or Discard change") : localize('change.1', "1 change"); } else { message = needsReview From 63430dae2712d69b21809ed2cf341b8383b3ec65 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 21 Jun 2024 16:51:18 +0200 Subject: [PATCH 418/755] fix #216808 (#216812) --- src/vs/platform/extensions/common/extensions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index 24ba29d210f33..4dd080da3aeb8 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -239,7 +239,9 @@ export interface IExtensionIdentifier { } export const EXTENSION_CATEGORIES = [ + 'AI', 'Azure', + 'Chat', 'Data Science', 'Debuggers', 'Extension Packs', @@ -256,8 +258,6 @@ export const EXTENSION_CATEGORIES = [ 'Testing', 'Themes', 'Visualization', - 'AI', - 'Chat', 'Other', ]; From 6ddf63fd3317d801544cbf7c3127340c3d296247 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 21 Jun 2024 08:14:57 -0700 Subject: [PATCH 419/755] Serialize PromptInputModel Fixes #210753 --- .../common/capabilities/capabilities.ts | 3 +- .../commandDetection/promptInputModel.ts | 28 +++++++++++++++++++ .../commandDetectionCapability.ts | 6 +++- .../terminal/common/terminalRecorder.ts | 3 +- .../common/xterm/shellIntegrationAddon.ts | 3 +- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/terminal/common/capabilities/capabilities.ts b/src/vs/platform/terminal/common/capabilities/capabilities.ts index 1ffe6ff109abb..5cd3d9be9552b 100644 --- a/src/vs/platform/terminal/common/capabilities/capabilities.ts +++ b/src/vs/platform/terminal/common/capabilities/capabilities.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; -import type { IPromptInputModel } from 'vs/platform/terminal/common/capabilities/commandDetection/promptInputModel'; +import type { IPromptInputModel, ISerializedPromptInputModel } from 'vs/platform/terminal/common/capabilities/commandDetection/promptInputModel'; import { ICurrentPartialCommand } from 'vs/platform/terminal/common/capabilities/commandDetection/terminalCommand'; import { ITerminalOutputMatch, ITerminalOutputMatcher } from 'vs/platform/terminal/common/terminal'; import { ReplayEntry } from 'vs/platform/terminal/common/terminalProcess'; @@ -301,6 +301,7 @@ export interface IMarkProperties { export interface ISerializedCommandDetectionCapability { isWindowsPty: boolean; commands: ISerializedTerminalCommand[]; + promptInputModel: ISerializedPromptInputModel | undefined; } export interface IPtyHostProcessReplayEvent { events: ReplayEntry[]; diff --git a/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts b/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts index f22b5181d4674..dbce8f5445817 100644 --- a/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts +++ b/src/vs/platform/terminal/common/capabilities/commandDetection/promptInputModel.ts @@ -49,6 +49,14 @@ export interface IPromptInputModelState { readonly ghostTextIndex: number; } +export interface ISerializedPromptInputModel { + readonly modelState: IPromptInputModelState; + readonly commandStartX: number; + readonly lastPromptLine: string | undefined; + readonly continuationPrompt: string | undefined; + readonly lastUserInput: string; +} + export class PromptInputModel extends Disposable implements IPromptInputModel { private _state: PromptInputState = PromptInputState.Unknown; @@ -142,6 +150,26 @@ export class PromptInputModel extends Disposable implements IPromptInputModel { return result; } + serialize(): ISerializedPromptInputModel { + return { + modelState: this._createStateObject(), + commandStartX: this._commandStartX, + lastPromptLine: this._lastPromptLine, + continuationPrompt: this._continuationPrompt, + lastUserInput: this._lastUserInput + }; + } + + deserialize(serialized: ISerializedPromptInputModel): void { + this._value = serialized.modelState.value; + this._cursorIndex = serialized.modelState.cursorIndex; + this._ghostTextIndex = serialized.modelState.ghostTextIndex; + this._commandStartX = serialized.commandStartX; + this._lastPromptLine = serialized.lastPromptLine; + this._continuationPrompt = serialized.continuationPrompt; + this._lastUserInput = serialized.lastUserInput; + } + private _handleCommandStart(command: { marker: IMarker }) { if (this._state === PromptInputState.Input) { return; diff --git a/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts b/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts index 024c79d5c6658..bef121fbff585 100644 --- a/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts +++ b/src/vs/platform/terminal/common/capabilities/commandDetectionCapability.ts @@ -408,7 +408,8 @@ export class CommandDetectionCapability extends Disposable implements ICommandDe } return { isWindowsPty: this._ptyHeuristics.value instanceof WindowsPtyHeuristics, - commands + commands, + promptInputModel: this._promptInputModel.serialize(), }; } @@ -443,6 +444,9 @@ export class CommandDetectionCapability extends Disposable implements ICommandDe this._logService.debug('CommandDetectionCapability#onCommandFinished', newCommand); this._onCommandFinished.fire(newCommand); } + if (serialized.promptInputModel) { + this._promptInputModel.deserialize(serialized.promptInputModel); + } } } diff --git a/src/vs/platform/terminal/common/terminalRecorder.ts b/src/vs/platform/terminal/common/terminalRecorder.ts index 79a828cc220a7..417527a976fc9 100644 --- a/src/vs/platform/terminal/common/terminalRecorder.ts +++ b/src/vs/platform/terminal/common/terminalRecorder.ts @@ -91,7 +91,8 @@ export class TerminalRecorder { // No command restoration is needed when relaunching terminals commands: { isWindowsPty: false, - commands: [] + commands: [], + promptInputModel: undefined, } }; } diff --git a/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts b/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts index cacc170e5cd3f..d335e2c27cd95 100644 --- a/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts +++ b/src/vs/platform/terminal/common/xterm/shellIntegrationAddon.ts @@ -577,7 +577,8 @@ export class ShellIntegrationAddon extends Disposable implements IShellIntegrati if (!this._terminal || !this.capabilities.has(TerminalCapability.CommandDetection)) { return { isWindowsPty: false, - commands: [] + commands: [], + promptInputModel: undefined, }; } const result = this._createOrGetCommandDetection(this._terminal).serialize(); From 68ca9a7f4c6ec11004294bd236244139473b0745 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 21 Jun 2024 17:53:13 +0200 Subject: [PATCH 420/755] SCM - improve merge-base detection (#216823) --- extensions/git/src/git.ts | 11 +++++++++-- extensions/git/src/historyProvider.ts | 6 +----- extensions/git/src/repository.ts | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index e6eed9607f76b..0e2b37af5b7ae 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1502,9 +1502,16 @@ export class Repository { return parseGitChanges(this.repositoryRoot, gitResult.stdout); } - async getMergeBase(ref1: string, ref2: string): Promise { + async getMergeBase(ref1: string, ref2: string, ...refs: string[]): Promise { try { - const args = ['merge-base', ref1, ref2]; + const args = ['merge-base']; + if (refs.length !== 0) { + args.push('--octopus'); + args.push(...refs); + } + + args.push(ref1, ref2); + const result = await this.exec(args); return result.stdout.trim(); diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index 9bb627dd2fdc3..22cbe9c493d1f 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -256,11 +256,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec return undefined; } - let refsMergeBase = refNames[0]; - for (let index = 1; index < refNames.length; index++) { - refsMergeBase = await this.repository.getMergeBase(refsMergeBase, refNames[index]) ?? refsMergeBase; - } - + const refsMergeBase = await this.repository.getMergeBase(refNames[0], refNames[1], ...refNames.slice(2)); return refsMergeBase; } diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 3863e74872602..deec56f9eaa77 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -1112,8 +1112,8 @@ export class Repository implements Disposable { return this.run(Operation.Diff, () => this.repository.diffBetweenShortStat(ref1, ref2)); } - getMergeBase(ref1: string, ref2: string): Promise { - return this.run(Operation.MergeBase, () => this.repository.getMergeBase(ref1, ref2)); + getMergeBase(ref1: string, ref2: string, ...refs: string[]): Promise { + return this.run(Operation.MergeBase, () => this.repository.getMergeBase(ref1, ref2, ...refs)); } async hashObject(data: string): Promise { From d09eaa488893894bd6c5d6d8ba8cd9b7ff8d33f4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:25:50 -0700 Subject: [PATCH 421/755] Resize terminal horizontal and vertical separately This allows vertical resizes to feel much smoother as the only reason resize was being debounced to begin with was that reflow is slow, only horizontal reflow is slow though so this should be fine. Part of #216810 --- .../terminal/browser/terminalInstance.ts | 98 +++++++++++-------- 1 file changed, 56 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 9445777d84880..21636d57540a7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1844,60 +1844,74 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } } - @debounce(50) - private async _resize(): Promise { - this._resizeNow(false); - } + private async _resize(immediate?: boolean): Promise { + if (!this.xterm) { + return; + } - private async _resizeNow(immediate: boolean): Promise { let cols = this.cols; let rows = this.rows; - if (this.xterm) { - // Only apply these settings when the terminal is visible so that - // the characters are measured correctly. - if (this._isVisible && this._layoutSettingsChanged) { - const font = this.xterm.getFont(); - const config = this._terminalConfigurationService.config; - this.xterm.raw.options.letterSpacing = font.letterSpacing; - this.xterm.raw.options.lineHeight = font.lineHeight; - this.xterm.raw.options.fontSize = font.fontSize; - this.xterm.raw.options.fontFamily = font.fontFamily; - this.xterm.raw.options.fontWeight = config.fontWeight; - this.xterm.raw.options.fontWeightBold = config.fontWeightBold; - - // Any of the above setting changes could have changed the dimensions of the - // terminal, re-evaluate now. - this._initDimensions(); - cols = this.cols; - rows = this.rows; - - this._layoutSettingsChanged = false; - } - - if (isNaN(cols) || isNaN(rows)) { - return; - } + // Only apply these settings when the terminal is visible so that + // the characters are measured correctly. + if (this._isVisible && this._layoutSettingsChanged) { + const font = this.xterm.getFont(); + const config = this._terminalConfigurationService.config; + this.xterm.raw.options.letterSpacing = font.letterSpacing; + this.xterm.raw.options.lineHeight = font.lineHeight; + this.xterm.raw.options.fontSize = font.fontSize; + this.xterm.raw.options.fontFamily = font.fontFamily; + this.xterm.raw.options.fontWeight = config.fontWeight; + this.xterm.raw.options.fontWeightBold = config.fontWeightBold; + + // Any of the above setting changes could have changed the dimensions of the + // terminal, re-evaluate now. + this._initDimensions(); + cols = this.cols; + rows = this.rows; - if (cols !== this.xterm.raw.cols || rows !== this.xterm.raw.rows) { - if (this._fixedRows || this._fixedCols) { - await this._updateProperty(ProcessPropertyType.FixedDimensions, { cols: this._fixedCols, rows: this._fixedRows }); - } - this._onDimensionsChanged.fire(); - } + this._layoutSettingsChanged = false; + } - this.xterm.raw.resize(cols, rows); - TerminalInstance._lastKnownGridDimensions = { cols, rows }; + if (isNaN(cols) || isNaN(rows)) { + return; + } + + if (cols !== this.xterm.raw.cols || rows !== this.xterm.raw.rows) { + if (this._fixedRows || this._fixedCols) { + await this._updateProperty(ProcessPropertyType.FixedDimensions, { cols: this._fixedCols, rows: this._fixedRows }); + } + this._onDimensionsChanged.fire(); } + TerminalInstance._lastKnownGridDimensions = { cols, rows }; + if (immediate) { - // do not await, call setDimensions synchronously - this._processManager.setDimensions(cols, rows, true); + this.xterm.raw.resize(cols, rows); + await this._updatePtyDimensions(this.xterm.raw); } else { - await this._processManager.setDimensions(cols, rows); + // Update dimensions independently as vertical resize is cheap but horizontal resize is + // expensive due to reflow. + this._resizeVertically(this.xterm.raw, rows); + this._resizeHorizontally(this.xterm.raw, cols); } } + private async _resizeVertically(rawXterm: XTermTerminal, rows: number): Promise { + rawXterm.resize(rawXterm.cols, rows); + await this._updatePtyDimensions(rawXterm); + } + + @debounce(50) + private async _resizeHorizontally(rawXterm: XTermTerminal, cols: number): Promise { + rawXterm.resize(cols, rawXterm.rows); + await this._updatePtyDimensions(rawXterm); + } + + private async _updatePtyDimensions(rawXterm: XTermTerminal): Promise { + await this._processManager.setDimensions(rawXterm.cols, rawXterm.rows); + } + setShellType(shellType: TerminalShellType | undefined) { if (this._shellType === shellType) { return; @@ -1977,7 +1991,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } this._dimensionsOverride = dimensions; if (immediate) { - this._resizeNow(true); + this._resize(true); } else { this._resize(); } From 1bd152d39e457d06f895ae98e4c6966cf39c9cdb Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 21 Jun 2024 09:44:51 -0700 Subject: [PATCH 422/755] Correct terminal row calculation This was doubling up the padding which made us ignore some row pixels. Fixes #216810 --- src/vs/workbench/contrib/terminal/browser/terminalInstance.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 9445777d84880..396c0fcc630eb 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -703,7 +703,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { const verticalPadding = parseInt(computedStyle.paddingTop) + parseInt(computedStyle.paddingBottom); TerminalInstance._lastKnownCanvasDimensions = new dom.Dimension( Math.min(Constants.MaxCanvasWidth, width - horizontalPadding), - height + (this._hasScrollBar && !this._horizontalScrollbar ? -5/* scroll bar height */ : 0) - 2/* bottom padding */ - verticalPadding); + height - verticalPadding + (this._hasScrollBar && this._horizontalScrollbar ? -5/* scroll bar height */ : 0)); return TerminalInstance._lastKnownCanvasDimensions; } From f44e0dad3bbf047212ac9f8697c90b9d3e3cb987 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 21 Jun 2024 18:45:33 +0200 Subject: [PATCH 423/755] fix #215410 (#216828) --- .../node/extensionManagementService.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 6b9405d389448..1444a63134c1c 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -971,16 +971,15 @@ class InstallExtensionInProfileTask extends AbstractExtensionTask Date: Fri, 21 Jun 2024 09:49:32 -0700 Subject: [PATCH 424/755] Pick up TS 5.5 stable release (#216827) --- extensions/package.json | 2 +- extensions/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/package.json b/extensions/package.json index 5475af18d409c..940bbe9b8a206 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -4,7 +4,7 @@ "license": "MIT", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "^5.5.0-dev.20240603" + "typescript": "^5.5.2" }, "scripts": { "postinstall": "node ./postinstall.mjs" diff --git a/extensions/yarn.lock b/extensions/yarn.lock index c0892f0655d94..b981143bdd00a 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -234,10 +234,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -typescript@^5.5.0-dev.20240603: - version "5.5.0-dev.20240603" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.0-dev.20240603.tgz#a1b7311df5039a8abbaaa2213c21cac6ec547490" - integrity sha512-gdm3Sh1A+Pjj9ZlfBEJY3o2rs3tvpcSbu3vYqcCijMe09BePQBtZlsuShuPn+zCnP+qBLxdKjFiw5v1tkna3tA== +typescript@^5.5.2: + version "5.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" + integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== vscode-grammar-updater@^1.1.0: version "1.1.0" From 795e2062682b860a9d8b1becf03990b5a00c3462 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 21 Jun 2024 19:32:44 +0200 Subject: [PATCH 425/755] do not allow creating multiple new profiles (#216833) --- .../browser/userDataProfilesEditor.ts | 17 ++--------------- .../browser/userDataProfilesEditorModel.ts | 14 +++++++++++++- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index f5175a3d8c101..6c47eb9557c4e 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -49,7 +49,7 @@ import { basename } from 'vs/base/common/resources'; import { RenderIndentGuides } from 'vs/base/browser/ui/tree/abstractTree'; import { DEFAULT_LABELS_CONTAINER, IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; -import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { AbstractUserDataProfileElement, isProfileResourceChildElement, isProfileResourceTypeElement, IProfileChildElement, IProfileResourceTypeChildElement, IProfileResourceTypeElement, NewProfileElement, UserDataProfileElement, UserDataProfilesEditorModel } from 'vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel'; import { Codicon } from 'vs/base/common/codicons'; @@ -77,7 +77,6 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi @IStorageService storageService: IStorageService, @IUserDataProfileManagementService private readonly userDataProfileManagementService: IUserDataProfileManagementService, @IQuickInputService private readonly quickInputService: IQuickInputService, - @IDialogService private readonly dialogService: IDialogService, @IFileDialogService private readonly fileDialogService: IFileDialogService, @IContextMenuService private readonly contextMenuService: IContextMenuService, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -293,19 +292,7 @@ export class UserDataProfilesEditor extends EditorPane implements IUserDataProfi } private async createNewProfile(copyFrom?: URI | IUserDataProfile): Promise { - if (this.model?.profiles.some(p => p instanceof NewProfileElement)) { - const result = await this.dialogService.confirm({ - type: 'info', - message: localize('new profile exists', "A new profile is already being created. Do you want to discard it and create a new one?"), - primaryButton: localize('discard', "Discard & Create"), - cancelButton: localize('cancel', "Cancel") - }); - if (!result.confirmed) { - return; - } - this.model.revert(); - } - this.model?.createNewProfile(copyFrom); + await this.model?.createNewProfile(copyFrom); } private async getProfileUriFromFileSystem(): Promise { diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 257625aed4d57..4b3d9947286a2 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -802,7 +802,19 @@ export class UserDataProfilesEditorModel extends EditorModel { return [profileElement, disposables]; } - createNewProfile(copyFrom?: URI | IUserDataProfile): AbstractUserDataProfileElement { + async createNewProfile(copyFrom?: URI | IUserDataProfile): Promise { + if (this.newProfileElement) { + const result = await this.dialogService.confirm({ + type: 'info', + message: localize('new profile exists', "A new profile is already being created. Do you want to discard it and create a new one?"), + primaryButton: localize('discard', "Discard & Create"), + cancelButton: localize('cancel', "Cancel") + }); + if (!result.confirmed) { + return; + } + this.revert(); + } if (!this.newProfileElement) { const disposables = new DisposableStore(); const cancellationTokenSource = new CancellationTokenSource(); From ce744ffb77b0df284074e94bc02b711935a0e764 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 21 Jun 2024 19:36:17 +0200 Subject: [PATCH 426/755] adopt to restart extensions (#216832) --- .../browser/extensions.contribution.ts | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index df292067b7145..89da697bf1973 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -13,7 +13,7 @@ import { EnablementState, IExtensionManagementServerService, IWorkbenchExtension import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg } from 'vs/workbench/contrib/extensions/common/extensions'; +import { VIEWLET_ID, IExtensionsWorkbenchService, IExtensionsViewPaneContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, IWorkspaceRecommendedExtensionsView, AutoUpdateConfigurationKey, HasOutdatedExtensionsContext, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, ExtensionEditorTab, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, IExtension, extensionsSearchActionsMenu, UPDATE_ACTIONS_GROUP, IExtensionArg, ExtensionRuntimeActionType } from 'vs/workbench/contrib/extensions/common/extensions'; import { ReinstallAction, InstallSpecificVersionOfExtensionAction, ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, PromptExtensionInstallFailureAction, SearchExtensionsAction, SetColorThemeAction, SetFileIconThemeAction, SetProductIconThemeAction, ClearLanguageAction, ToggleAutoUpdateForExtensionAction, ToggleAutoUpdatesForPublisherAction, TogglePreReleaseExtensionAction, InstallAnotherVersionAction, InstallAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor'; @@ -49,7 +49,6 @@ import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/brow import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { IExtensionRecommendationNotificationService } from 'vs/platform/extensionRecommendations/common/extensionRecommendations'; import { ExtensionRecommendationNotificationService } from 'vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService'; -import { IExtensionService, toExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { ResourceContextKey, WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; @@ -65,7 +64,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; -import { Promises } from 'vs/base/common/async'; import { EditorExtensions } from 'vs/workbench/common/editor'; import { WORKSPACE_TRUST_EXTENSION_SUPPORT } from 'vs/workbench/services/workspaces/common/workspaceTrust'; import { ExtensionsCompletionItemsProvider } from 'vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider'; @@ -854,29 +852,51 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi when: ContextKeyExpr.and(ResourceContextKey.Extension.isEqualTo('.vsix'), ContextKeyExpr.or(CONTEXT_HAS_LOCAL_SERVER, CONTEXT_HAS_REMOTE_SERVER)), }], run: async (accessor: ServicesAccessor, resources: URI[] | URI) => { - const extensionService = accessor.get(IExtensionService); const extensionsWorkbenchService = accessor.get(IExtensionsWorkbenchService); const hostService = accessor.get(IHostService); const notificationService = accessor.get(INotificationService); - const extensions = Array.isArray(resources) ? resources : [resources]; - await Promises.settled(extensions.map(async (vsix) => await extensionsWorkbenchService.install(vsix))) - .then(async (extensions) => { - for (const extension of extensions) { - const requireReload = !(extension.local && extensionService.canAddExtension(toExtensionDescription(extension.local))); - const message = requireReload ? localize('InstallVSIXAction.successReload', "Completed installing {0} extension from VSIX. Please reload Visual Studio Code to enable it.", extension.displayName || extension.name) - : localize('InstallVSIXAction.success', "Completed installing {0} extension from VSIX.", extension.displayName || extension.name); - const actions = requireReload ? [{ - label: localize('InstallVSIXAction.reloadNow', "Reload Now"), - run: () => hostService.reload() - }] : []; - notificationService.prompt( - Severity.Info, - message, - actions - ); - } - }); + const vsixs = Array.isArray(resources) ? resources : [resources]; + const result = await Promise.allSettled(vsixs.map(async (vsix) => await extensionsWorkbenchService.install(vsix))); + let error: Error | undefined, requireReload = false, requireRestart = false; + for (const r of result) { + if (r.status === 'rejected') { + error = new Error(r.reason); + break; + } + requireReload = requireReload || r.value.runtimeState?.action === ExtensionRuntimeActionType.ReloadWindow; + requireRestart = requireRestart || r.value.runtimeState?.action === ExtensionRuntimeActionType.RestartExtensions; + } + if (error) { + throw error; + } + if (requireReload) { + notificationService.prompt( + Severity.Info, + localize('InstallVSIXAction.successReload', "Completed installing extension from VSIX. Please reload Visual Studio Code to enable it."), + [{ + label: localize('InstallVSIXAction.reloadNow', "Reload Now"), + run: () => hostService.reload() + }] + ); + } + else if (requireRestart) { + notificationService.prompt( + Severity.Info, + localize('InstallVSIXAction.successRestart', "Completed installing extension from VSIX. Please restart extensions to enable it."), + [{ + label: localize('InstallVSIXAction.restartExtensions', "Restart Extensions"), + run: () => extensionsWorkbenchService.updateRunningExtensions() + }] + ); + } + else { + notificationService.prompt( + Severity.Info, + localize('InstallVSIXAction.successNoReload', "Completed installing extension."), + [] + ); + } } }); From 7fca5bc17274a43d8c4f936cb1e7888afd25ac52 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 21 Jun 2024 19:49:32 +0200 Subject: [PATCH 427/755] feedback: improve message and styling (#216835) --- .../extensions/common/extensionValidator.ts | 6 +---- .../extensions/browser/extensionsList.ts | 26 ++++--------------- .../browser/media/extensionActions.css | 6 ++--- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/src/vs/platform/extensions/common/extensionValidator.ts b/src/vs/platform/extensions/common/extensionValidator.ts index 93ac055431384..08cb360de78bb 100644 --- a/src/vs/platform/extensions/common/extensionValidator.ts +++ b/src/vs/platform/extensions/common/extensionValidator.ts @@ -369,11 +369,7 @@ export function areApiProposalsCompatible(apiProposals: string[], arg1?: any): b continue; } if (existingProposal.version !== version) { - if (existingProposal.version) { - incompatibleNotices.push(nls.localize('apiProposalMismatch', "Extension is not compatible with API proposal {0}. Extension requires version {1} but product has version {2}.", proposalName, version, existingProposal.version)); - } else { - incompatibleNotices.push(nls.localize('apiProposalMismatchNoVersion', "Extension is not compatible with API proposal {0}. Extension requires version {1} but product has no version defined.", proposalName, version)); - } + incompatibleNotices.push(nls.localize('apiProposalMismatch', "Extension is using an API proposal '{0}' that is not compatible with the current version of VS Code.", proposalName)); } } notices?.push(...incompatibleNotices); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 4b7ce4a794756..8a443609adc8b 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -16,10 +16,9 @@ import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchSe import { ManageExtensionAction, ExtensionRuntimeStateAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ButtonWithDropDownExtensionAction, InstallDropdownAction, InstallingLabelAction, ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction, ToggleAutoUpdateForExtensionAction, ExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, ExtensionPackCountWidget as ExtensionPackBadgeWidget, SyncIgnoredWidget, ExtensionHoverWidget, ExtensionActivationStatusWidget, PreReleaseBookmarkWidget, extensionVerifiedPublisherIconColor, VerifiedPublisherWidget } from 'vs/workbench/contrib/extensions/browser/extensionsWidgets'; -import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; -import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; import { registerThemingParticipant, IColorTheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { ThemeIcon } from 'vs/base/common/themables'; import { WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; @@ -69,8 +68,8 @@ export class Renderer implements IPagedRenderer { @IInstantiationService private readonly instantiationService: IInstantiationService, @INotificationService private readonly notificationService: INotificationService, @IExtensionService private readonly extensionService: IExtensionService, - @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, + @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService, @IContextMenuService private readonly contextMenuService: IContextMenuService, ) { } @@ -194,23 +193,8 @@ export class Renderer implements IPagedRenderer { data.extensionDisposables = dispose(data.extensionDisposables); - const computeEnablement = async () => { - if (extension.state === ExtensionState.Uninstalled) { - if (!!extension.deprecationInfo) { - return true; - } - if (this.extensionsWorkbenchService.canSetLanguage(extension)) { - return false; - } - return !(await this.extensionsWorkbenchService.canInstall(extension)); - } else if (extension.local && !isLanguagePackExtension(extension.local.manifest)) { - const runningExtension = this.extensionService.extensions.filter(e => areSameExtensions({ id: e.identifier.value }, extension.identifier))[0]; - return !(runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension))); - } - return false; - }; - const updateEnablement = async () => { - const disabled = await computeEnablement(); + const updateEnablement = () => { + const disabled = extension.local && !this.extensionEnablementService.isEnabled(extension.local); const deprecated = !!extension.deprecationInfo; data.element.classList.toggle('deprecated', deprecated); data.root.classList.toggle('disabled', disabled); diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css b/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css index bd3ae98514dd0..ed8c3395cccd1 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css @@ -74,15 +74,15 @@ border-bottom: 1px solid var(--vscode-contrastBorder); } -.monaco-action-bar .action-item .action-label.extension-action.extension-status-error { +.monaco-action-bar .action-item .action-label.extension-action.extension-status-error::before { color: var(--vscode-editorError-foreground); } -.monaco-action-bar .action-item .action-label.extension-action.extension-status-warning { +.monaco-action-bar .action-item .action-label.extension-action.extension-status-warning::before { color: var(--vscode-editorWarning-foreground); } -.monaco-action-bar .action-item .action-label.extension-action.extension-status-info { +.monaco-action-bar .action-item .action-label.extension-action.extension-status-info::before { color: var(--vscode-editorInfo-foreground); } From a3a8dd5b0143ab3a9c4567a176a9dbf078436643 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Fri, 21 Jun 2024 12:55:43 -0700 Subject: [PATCH 428/755] a11y: Add opt-in setting to underline links within p elements (#216842) --- .../lib/stylelint/vscode-known-variables.json | 3 +- .../browser/accessibilityService.ts | 29 +++++++++++++++++++ src/vs/workbench/browser/media/style.css | 9 ++++++ .../browser/accessibilityConfiguration.ts | 5 ++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index 6d729ef5ea403..97be6f79cefd1 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -854,6 +854,7 @@ "--z-index-run-button-container", "--zoom-factor", "--test-bar-width", - "--widget-color" + "--widget-color", + "--text-link-decoration" ] } diff --git a/src/vs/platform/accessibility/browser/accessibilityService.ts b/src/vs/platform/accessibility/browser/accessibilityService.ts index bd84abbc6dc9f..408fbc07b2ae2 100644 --- a/src/vs/platform/accessibility/browser/accessibilityService.ts +++ b/src/vs/platform/accessibility/browser/accessibilityService.ts @@ -24,6 +24,9 @@ export class AccessibilityService extends Disposable implements IAccessibilitySe protected _systemMotionReduced: boolean; protected readonly _onDidChangeReducedMotion = new Emitter(); + private _linkUnderlinesEnabled: boolean; + protected readonly _onDidChangeLinkUnderline = new Emitter(); + constructor( @IContextKeyService private readonly _contextKeyService: IContextKeyService, @ILayoutService private readonly _layoutService: ILayoutService, @@ -50,7 +53,10 @@ export class AccessibilityService extends Disposable implements IAccessibilitySe this._systemMotionReduced = reduceMotionMatcher.matches; this._configMotionReduced = this._configurationService.getValue<'auto' | 'on' | 'off'>('workbench.reduceMotion'); + this._linkUnderlinesEnabled = this._configurationService.getValue('accessibility.underlineLinks'); + this.initReducedMotionListeners(reduceMotionMatcher); + this.initLinkUnderlineListeners(); } private initReducedMotionListeners(reduceMotionMatcher: MediaQueryList) { @@ -72,6 +78,29 @@ export class AccessibilityService extends Disposable implements IAccessibilitySe this._register(this.onDidChangeReducedMotion(() => updateRootClasses())); } + private initLinkUnderlineListeners() { + this._register(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('accessibility.underlineLinks')) { + const linkUnderlinesEnabled = this._configurationService.getValue('accessibility.underlineLinks'); + this._linkUnderlinesEnabled = linkUnderlinesEnabled; + this._onDidChangeLinkUnderline.fire(); + } + })); + + const updateLinkUnderlineClasses = () => { + const underlineLinks = this._linkUnderlinesEnabled; + this._layoutService.mainContainer.classList.toggle('underline-links', underlineLinks); + }; + + updateLinkUnderlineClasses(); + + this._register(this.onDidChangeLinkUnderlines(() => updateLinkUnderlineClasses())); + } + + public onDidChangeLinkUnderlines(listener: () => void) { + return this._onDidChangeLinkUnderline.event(listener); + } + get onDidChangeScreenReaderOptimized(): Event { return this._onDidChangeScreenReaderOptimized.event; } diff --git a/src/vs/workbench/browser/media/style.css b/src/vs/workbench/browser/media/style.css index 35f856b931aa6..6c9dbb9a0c902 100644 --- a/src/vs/workbench/browser/media/style.css +++ b/src/vs/workbench/browser/media/style.css @@ -87,6 +87,15 @@ body.web { text-decoration: none; } + +.monaco-workbench p > a { + text-decoration: var(--text-link-decoration); +} + +.monaco-workbench.underline-links { + --text-link-decoration: underline; +} + .monaco-workbench.hc-black p > a, .monaco-workbench.hc-light p > a { text-decoration: underline !important; diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts index 6c280084f2ff9..fa4e47467d236 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration.ts @@ -662,6 +662,11 @@ const configuration: IConfigurationNode = { 'announcement': 'never' } }, + 'accessibility.underlineLinks': { + 'type': 'boolean', + 'description': localize('accessibility.underlineLinks', "Controls whether links should be underlined in the workbench."), + 'default': false, + }, } }; From 05e6e67fd7c6f32d84352d32dc8439fda7a8dc10 Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Fri, 21 Jun 2024 13:04:27 -0700 Subject: [PATCH 429/755] Update missing area label query for my-work.ghinb (#216846) update missing area label query --- .vscode/notebooks/my-work.github-issues | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues index ae56dcdd9f45a..27fc3c2ecb5be 100644 --- a/.vscode/notebooks/my-work.github-issues +++ b/.vscode/notebooks/my-work.github-issues @@ -102,7 +102,7 @@ { "kind": 2, "language": "github-issues", - "value": "repo:microsoft/vscode assignee:@me is:open type:issue -label:\"info-needed\" -label:api -label:api-finalization -label:api-proposal -label:authentication -label:bisect-ext -label:bracket-pair-colorization -label:bracket-pair-guides -label:breadcrumbs -label:callhierarchy -label:chrome-devtools -label:code-lens -label:command-center -label:comments -label:config -label:context-keys -label:custom-editors -label:debug -label:debug-console -label:debug-disassembly -label:dialogs -label:diff-editor -label:dropdown -label:editor-api -label:editor-autoclosing -label:editor-autoindent -label:editor-bracket-matching -label:editor-clipboard -label:editor-code-actions -label:editor-color-picker -label:editor-columnselect -label:editor-commands -label:editor-comments -label:editor-contrib -label:editor-core -label:editor-drag-and-drop -label:editor-error-widget -label:editor-find -label:editor-folding -label:editor-highlight -label:editor-hover -label:editor-indent-detection -label:editor-indent-guides -label:editor-input -label:editor-input-IME -label:editor-insets -label:editor-minimap -label:editor-multicursor -label:editor-parameter-hints -label:editor-render-whitespace -label:editor-rendering -label:editor-RTL -label:editor-scrollbar -label:editor-sorting -label:editor-sticky-scroll -label:editor-sticky-scroll-decorations -label:editor-symbols -label:editor-synced-region -label:editor-textbuffer -label:editor-theming -label:editor-wordnav -label:editor-wrapping -label:emmet-parse -label:extension-activation -label:extension-host -label:extension-prerelease -label:extension-recommendations -label:extension-signature -label:extensions -label:extensions-development -label:file-decorations -label:file-encoding -label:file-explorer -label:file-glob -label:file-io -label:file-nesting -label:file-watcher -label:font-rendering -label:formatting -label:getting-started -label:ghost-text -label:git -label:github -label:github-repositories -label:gpu -label:grammar -label:grid-widget -label:icon-brand -label:icons-product -label:icons-widget -label:inlay-hints -label:inline-chat -label:inline-completions -label:install-update -label:intellisense-config -label:interactive-playground -label:interactive-window -label:javascript -label:json -label:json-sorting -label:keybindings -label:keybindings-editor -label:keyboard-layout -label:L10N -label:l10n-platform -label:label-provider -label:languages-basic -label:languages-diagnostics -label:languages-guessing -label:layout -label:lcd-text-rendering -label:list-widget -label:live-preview -label:log -label:markdown -label:marketplace -label:menus -label:merge-conflict -label:merge-editor -label:merge-editor-workbench -label:monaco-editor -label:multi-monitor -label:native-file-dialog -label:network -label:notebook -label:notebook-accessibility -label:notebook-api -label:notebook-builtin-renderers -label:notebook-cell-editor -label:notebook-celltoolbar -label:notebook-clipboard -label:notebook-commands -label:notebook-commenting -label:notebook-debugging -label:notebook-diff -label:notebook-dnd -label:notebook-execution -label:notebook-find -label:notebook-folding -label:notebook-getting-started -label:notebook-globaltoolbar -label:notebook-ipynb -label:notebook-kernel -label:notebook-kernel-picker -label:notebook-language -label:notebook-layout -label:notebook-markdown -label:notebook-math -label:notebook-minimap -label:notebook-multiselect -label:notebook-output -label:notebook-perf -label:notebook-remote -label:notebook-rendering -label:notebook-serialization -label:notebook-serverless-web -label:notebook-statusbar -label:notebook-sticky-scroll -label:notebook-toc-outline -label:notebook-undo-redo -label:notebook-variables -label:notebook-workbench-integration -label:notebook-workflow -label:open-editors -label:opener -label:outline -label:output -label:packaging -label:panel-chat -label:perf -label:perf-bloat -label:perf-startup -label:php -label:portable-mode -label:proxy -label:quick-open -label:quick-pick -label:quickpick-chat -label:references-viewlet -label:release-notes -label:remote -label:remote-connection -label:remote-desktop -label:remote-explorer -label:remote-tunnel -label:rename -label:runCommands -label:sandbox -label:sash-widget -label:scm -label:screencast-mode -label:search -label:search-api -label:search-editor -label:search-replace -label:semantic-tokens -label:server -label:settings-editor -label:settings-search -label:settings-sync -label:settings-sync-server -label:shared-process -label:simple-file-dialog -label:smart-select -label:snap -label:snippets -label:splitview-widget -label:ssh -label:suggest -label:system-context-menu -label:table-widget -label:tasks -label:telemetry -label:terminal -label:terminal-accessibility -label:terminal-conpty -label:terminal-editors -label:terminal-external -label:terminal-find -label:terminal-input -label:terminal-layout -label:terminal-links -label:terminal-local-echo -label:terminal-persistence -label:terminal-process -label:terminal-profiles -label:terminal-quick-fix -label:terminal-rendering -label:terminal-shell-bash -label:terminal-shell-cmd -label:terminal-shell-fish -label:terminal-shell-git-bash -label:terminal-shell-integration -label:terminal-shell-pwsh -label:terminal-shell-zsh -label:terminal-tabs -label:terminal-winpty -label:testing -label:themes -label:timeline -label:timeline-git -label:timeline-local-history -label:titlebar -label:tokenization -label:touch/pointer -label:trackpad/scroll -label:tree-views -label:tree-widget -label:typescript -label:unc -label:undo-redo -label:unicode-highlight -label:uri -label:user-profiles -label:ux -label:variable-resolving -label:VIM -label:virtual-documents -label:virtual-workspaces -label:vscode-website -label:vscode.dev -label:web -label:webview -label:webview-views -label:workbench-actions -label:workbench-auxwindow -label:workbench-banner -label:workbench-cli -label:workbench-diagnostics -label:workbench-dnd -label:workbench-editor-grid -label:workbench-editor-groups -label:workbench-editor-resolver -label:workbench-editors -label:workbench-electron -label:workbench-feedback -label:workbench-fonts -label:workbench-history -label:workbench-hot-exit -label:workbench-hover -label:workbench-launch -label:workbench-link -label:workbench-multiroot -label:workbench-notifications -label:workbench-os-integration -label:workbench-rapid-render -label:workbench-run-as-admin -label:workbench-state -label:workbench-status -label:workbench-tabs -label:workbench-touchbar -label:workbench-untitled-editors -label:workbench-views -label:workbench-voice -label:workbench-welcome -label:workbench-window -label:workbench-workspace -label:workbench-zen -label:workspace-edit -label:workspace-symbols -label:workspace-trust -label:zoom -label:error-list -label:winget" + "value": "repo:microsoft/vscode assignee:@me is:open type:issue -label:\"info-needed\" -label:api -label:api-finalization -label:api-proposal -label:authentication -label:bisect-ext -label:bracket-pair-colorization -label:bracket-pair-guides -label:breadcrumbs -label:callhierarchy -label:chrome-devtools -label:code-lens -label:command-center -label:comments -label:config -label:context-keys -label:custom-editors -label:debug -label:debug-console -label:debug-disassembly -label:dialogs -label:diff-editor -label:dropdown -label:editor-api -label:editor-autoclosing -label:editor-autoindent -label:editor-bracket-matching -label:editor-clipboard -label:editor-code-actions -label:editor-color-picker -label:editor-columnselect -label:editor-commands -label:editor-comments -label:editor-contrib -label:editor-core -label:editor-drag-and-drop -label:editor-error-widget -label:editor-find -label:editor-folding -label:editor-highlight -label:editor-hover -label:editor-indent-detection -label:editor-indent-guides -label:editor-input -label:editor-input-IME -label:editor-insets -label:editor-minimap -label:editor-multicursor -label:editor-parameter-hints -label:editor-render-whitespace -label:editor-rendering -label:editor-RTL -label:editor-scrollbar -label:editor-sorting -label:editor-sticky-scroll -label:editor-sticky-scroll-decorations -label:editor-symbols -label:editor-synced-region -label:editor-textbuffer -label:editor-theming -label:editor-wordnav -label:editor-wrapping -label:emmet-parse -label:extension-activation -label:extension-host -label:extension-prerelease -label:extension-recommendations -label:extension-signature -label:extensions -label:extensions-development -label:file-decorations -label:file-encoding -label:file-explorer -label:file-glob -label:file-io -label:file-nesting -label:file-watcher -label:font-rendering -label:formatting -label:getting-started -label:ghost-text -label:git -label:github -label:github-repositories -label:gpu -label:grammar -label:grid-widget -label:icon-brand -label:icons-product -label:icons-widget -label:inlay-hints -label:inline-chat -label:inline-completions -label:install-update -label:intellisense-config -label:interactive-playground -label:interactive-window -label:javascript -label:json -label:json-sorting -label:keybindings -label:keybindings-editor -label:keyboard-layout -label:L10N -label:l10n-platform -label:label-provider -label:languages-basic -label:languages-diagnostics -label:languages-guessing -label:layout -label:lcd-text-rendering -label:list-widget -label:live-preview -label:log -label:markdown -label:marketplace -label:menus -label:merge-conflict -label:merge-editor -label:merge-editor-workbench -label:monaco-editor -label:multi-monitor -label:native-file-dialog -label:network -label:notebook -label:notebook-accessibility -label:notebook-api -label:notebook-builtin-renderers -label:notebook-cell-editor -label:notebook-celltoolbar -label:notebook-clipboard -label:notebook-code-actions -label:notebook-commands -label:notebook-commenting -label:notebook-debugging -label:notebook-diff -label:notebook-dnd -label:notebook-execution -label:notebook-find -label:notebook-folding -label:notebook-format -label:notebook-getting-started -label:notebook-globaltoolbar -label:notebook-ipynb -label:notebook-kernel -label:notebook-kernel-picker -label:notebook-language -label:notebook-layout -label:notebook-markdown -label:notebook-minimap -label:notebook-multiselect -label:notebook-output -label:notebook-perf -label:notebook-remote -label:notebook-rendering -label:notebook-serialization -label:notebook-statusbar -label:notebook-sticky-scroll -label:notebook-toc-outline -label:notebook-undo-redo -label:notebook-variables -label:notebook-workbench-integration -label:notebook-workflow -label:open-editors -label:opener -label:outline -label:output -label:packaging -label:panel-chat -label:perf -label:perf-bloat -label:perf-startup -label:php -label:portable-mode -label:proxy -label:quick-open -label:quick-pick -label:quickpick-chat -label:references-viewlet -label:release-notes -label:remote -label:remote-connection -label:remote-desktop -label:remote-explorer -label:remote-tunnel -label:rename -label:runCommands -label:sandbox -label:sash-widget -label:scm -label:screencast-mode -label:search -label:search-api -label:search-editor -label:search-replace -label:semantic-tokens -label:server -label:settings-editor -label:settings-search -label:settings-sync -label:settings-sync-server -label:shared-process -label:simple-file-dialog -label:smart-select -label:snap -label:snippets -label:splitview-widget -label:ssh -label:suggest -label:system-context-menu -label:table-widget -label:tasks -label:telemetry -label:terminal -label:terminal-accessibility -label:terminal-conpty -label:terminal-editors -label:terminal-external -label:terminal-find -label:terminal-input -label:terminal-layout -label:terminal-links -label:terminal-local-echo -label:terminal-persistence -label:terminal-process -label:terminal-profiles -label:terminal-quick-fix -label:terminal-rendering -label:terminal-shell-bash -label:terminal-shell-cmd -label:terminal-shell-fish -label:terminal-shell-git-bash -label:terminal-shell-integration -label:terminal-shell-pwsh -label:terminal-shell-zsh -label:terminal-tabs -label:testing -label:themes -label:timeline -label:timeline-git -label:timeline-local-history -label:titlebar -label:tokenization -label:touch/pointer -label:trackpad/scroll -label:tree-views -label:tree-widget -label:typescript -label:unc -label:undo-redo -label:unicode-highlight -label:uri -label:user-profiles -label:ux -label:variable-resolving -label:VIM -label:virtual-documents -label:virtual-workspaces -label:vscode-website -label:vscode.dev -label:web -label:webview -label:webview-views -label:workbench-actions -label:workbench-auxwindow -label:workbench-banner -label:workbench-cli -label:workbench-diagnostics -label:workbench-dnd -label:workbench-editor-grid -label:workbench-editor-groups -label:workbench-editor-resolver -label:workbench-editors -label:workbench-electron -label:workbench-fonts -label:workbench-history -label:workbench-hot-exit -label:workbench-hover -label:workbench-launch -label:workbench-link -label:workbench-multiroot -label:workbench-notifications -label:workbench-os-integration -label:workbench-rapid-render -label:workbench-run-as-admin -label:workbench-state -label:workbench-status -label:workbench-tabs -label:workbench-touchbar -label:workbench-untitled-editors -label:workbench-views -label:workbench-voice -label:workbench-welcome -label:workbench-window -label:workbench-workspace -label:workbench-zen -label:workspace-edit -label:workspace-symbols -label:workspace-trust -label:zoom -label:error-list -label:winget" }, { "kind": 1, From 7cee4289e892f8438fd4816a47c69b7834d377dc Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Fri, 21 Jun 2024 13:35:43 -0700 Subject: [PATCH 430/755] Larger default nb find widget size + in selection label verbage (#216847) Larger default nb find widget size + selection label verbage --- .../browser/contrib/find/notebookFindReplaceWidget.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts index 77daeaaf762d5..c8cc9eb218702 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts @@ -49,9 +49,8 @@ import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; const NLS_FIND_INPUT_LABEL = nls.localize('label.find', "Find"); const NLS_FIND_INPUT_PLACEHOLDER = nls.localize('placeholder.find', "Find"); const NLS_PREVIOUS_MATCH_BTN_LABEL = nls.localize('label.previousMatchButton', "Previous Match"); -// const NLS_FILTER_BTN_LABEL = nls.localize('label.findFilterButton', "Search in View"); const NLS_NEXT_MATCH_BTN_LABEL = nls.localize('label.nextMatchButton', "Next Match"); -const NLS_FIND_IN_CELL_SELECTION_BTN_LABEL = nls.localize('label.findInCellSelectionButton', "Find in Cell Selection"); +const NLS_TOGGLE_SELECTION_FIND_TITLE = nls.localize('label.toggleSelectionFind', "Find in Selection"); const NLS_CLOSE_BTN_LABEL = nls.localize('label.closeButton', "Close"); const NLS_TOGGLE_REPLACE_MODE_BTN_LABEL = nls.localize('label.toggleReplaceButton', "Toggle Replace"); const NLS_REPLACE_INPUT_LABEL = nls.localize('label.replace', "Replace"); @@ -66,7 +65,7 @@ const NOTEBOOK_FIND_IN_MARKUP_PREVIEW = nls.localize('notebook.find.filter.findI const NOTEBOOK_FIND_IN_CODE_INPUT = nls.localize('notebook.find.filter.findInCodeInput', "Code Cell Source"); const NOTEBOOK_FIND_IN_CODE_OUTPUT = nls.localize('notebook.find.filter.findInCodeOutput', "Code Cell Output"); -const NOTEBOOK_FIND_WIDGET_INITIAL_WIDTH = 318; +const NOTEBOOK_FIND_WIDGET_INITIAL_WIDTH = 419; const NOTEBOOK_FIND_WIDGET_INITIAL_HORIZONTAL_PADDING = 4; class NotebookFindFilterActionViewItem extends DropdownMenuActionViewItem { constructor(readonly filters: NotebookFindFilters, action: IAction, options: IActionViewItemOptions, actionRunner: IActionRunner, @IContextMenuService contextMenuService: IContextMenuService) { @@ -386,6 +385,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { null, this._contextViewService, { + // width:FIND_INPUT_AREA_WIDTH, label: NLS_FIND_INPUT_LABEL, placeholder: NLS_FIND_INPUT_PLACEHOLDER, validation: (value: string): InputBoxMessage | null => { @@ -462,7 +462,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { this.inSelectionToggle = this._register(new Toggle({ icon: findSelectionIcon, - title: NLS_FIND_IN_CELL_SELECTION_BTN_LABEL, + title: NLS_TOGGLE_SELECTION_FIND_TITLE, isChecked: false, inputActiveOptionBackground: asCssVariable(inputActiveOptionBackground), inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder), From 0a03218581021e6c896e48e561dfe098f516bf53 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 21 Jun 2024 13:47:18 -0700 Subject: [PATCH 431/755] Fix two chat history bugs (#216848) * Fix "show chats" before chat view is loaded Fix microsoft/vscode-copilot-release#1079 * Fix microsoft/vscode-copilot-release#1327 --- .../chat/browser/actions/chatActions.ts | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts index bf426bec1b809..b872b925229ae 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts @@ -15,13 +15,12 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IsLinuxContext, IsWindowsContext } from 'vs/platform/contextkey/common/contextkeys'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IQuickInputButton, IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { ViewAction } from 'vs/workbench/browser/parts/views/viewPane'; import { CHAT_VIEW_ID, IChatWidgetService, showChatView } from 'vs/workbench/contrib/chat/browser/chat'; import { IChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatEditor'; import { ChatEditorInput } from 'vs/workbench/contrib/chat/browser/chatEditorInput'; import { ChatViewPane } from 'vs/workbench/contrib/chat/browser/chatViewPane'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { CONTEXT_CHAT_INPUT_CURSOR_AT_TOP, CONTEXT_CHAT_LOCATION, CONTEXT_IN_CHAT_INPUT, CONTEXT_IN_CHAT_SESSION, CONTEXT_CHAT_ENABLED } from 'vs/workbench/contrib/chat/common/chatContextKeys'; +import { CONTEXT_CHAT_ENABLED, CONTEXT_CHAT_INPUT_CURSOR_AT_TOP, CONTEXT_CHAT_LOCATION, CONTEXT_IN_CHAT_INPUT, CONTEXT_IN_CHAT_SESSION } from 'vs/workbench/contrib/chat/common/chatContextKeys'; import { IChatDetail, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { IChatRequestViewModel, IChatResponseViewModel, isRequestVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { IChatWidgetHistoryService } from 'vs/workbench/contrib/chat/common/chatWidgetHistoryService'; @@ -102,10 +101,9 @@ class OpenChatGlobalAction extends Action2 { } } -class ChatHistoryAction extends ViewAction { +class ChatHistoryAction extends Action2 { constructor() { super({ - viewId: CHAT_VIEW_ID, id: `workbench.action.chat.history`, title: localize2('chat.history.label', "Show Chats..."), menu: { @@ -121,12 +119,11 @@ class ChatHistoryAction extends ViewAction { }); } - async runInView(accessor: ServicesAccessor, view: ChatViewPane) { + async run(accessor: ServicesAccessor) { const chatService = accessor.get(IChatService); const quickInputService = accessor.get(IQuickInputService); const viewsService = accessor.get(IViewsService); const editorService = accessor.get(IEditorService); - const items = chatService.getHistory(); const openInEditorButton: IQuickInputButton = { iconClass: ThemeIcon.asClassName(Codicon.file), @@ -140,25 +137,30 @@ class ChatHistoryAction extends ViewAction { interface IChatPickerItem extends IQuickPickItem { chat: IChatDetail; } - const picks: IChatPickerItem[] = items.map((i): IChatPickerItem => ({ - label: i.title, - chat: i, - buttons: [ - openInEditorButton, - deleteButton - ] - })); + + const getPicks = () => { + const items = chatService.getHistory(); + return items.map((i): IChatPickerItem => ({ + label: i.title, + chat: i, + buttons: [ + openInEditorButton, + deleteButton + ] + })); + }; + const store = new DisposableStore(); const picker = store.add(quickInputService.createQuickPick()); picker.placeholder = localize('interactiveSession.history.pick', "Switch to chat"); - picker.items = picks; + picker.items = getPicks(); store.add(picker.onDidTriggerItemButton(context => { if (context.button === openInEditorButton) { editorService.openEditor({ resource: ChatEditorInput.getNewEditorUri(), options: { target: { sessionId: context.item.chat.sessionId }, pinned: true } }, ACTIVE_GROUP); picker.hide(); } else if (context.button === deleteButton) { chatService.removeHistoryEntry(context.item.chat.sessionId); - picker.items = picks.filter(i => i !== context.item); + picker.items = getPicks(); } })); store.add(picker.onDidAccept(async () => { From c7a975543b03540d5770f30382754ca85f43bdcc Mon Sep 17 00:00:00 2001 From: Cody Beyer Date: Fri, 21 Jun 2024 15:43:18 -0700 Subject: [PATCH 432/755] adding auzre ai package tagging for js --- .../electron-sandbox/workspaceTagsService.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts index c77eadc1d0c59..ff253ad3f84ab 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts @@ -208,6 +208,29 @@ const ModulesToLookFor = [ 'tika', 'weaviate-client', '@zilliz/milvus2-sdk-node', + //Azure AI + '@azure-rest/ai-anomaly-detector', + '@azure-rest/ai-content-safety', + '@azure-rest/ai-document-intelligence', + '@azure-rest/ai-document-translator', + '@azure-rest/ai-personalizer', + '@azure-rest/ai-translation-text', + '@azure-rest/ai-vision-image-analysis', + '@azure/ai-anomaly-detector', + '@azure/ai-form-recognizer', + '@azure/ai-language-conversations', + '@azure/ai-language-text', + '@azure/ai-text-analytics', + '@azure/arm-botservice', + '@azure/arm-cognitiveservices', + '@azure/arm-machinelearning', + '@azure/cognitiveservices-contentmoderator', + '@azure/cognitiveservices-customvision-prediction', + '@azure/cognitiveservices-customvision-training', + '@azure/cognitiveservices-face', + '@azure/cognitiveservices-translatortext', + 'microsoft-cognitiveservices-speech-sdk' + ]; const PyMetaModulesToLookFor = [ @@ -567,6 +590,27 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.@azure/synapse-artifacts" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/synapse-access-control" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/ai-metrics-advisor" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-anomaly-detector" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-content-safety" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-document-intelligence" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-document-translator" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-personalizer" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-translation-text" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure-rest/ai-vision-image-analysis" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/ai-anomaly-detector" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/ai-form-recognizer" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/ai-language-conversations" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/ai-language-text" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/ai-text-analytics" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/arm-botservice" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/arm-cognitiveservices" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/arm-machinelearning" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/cognitiveservices-contentmoderator" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/cognitiveservices-customvision-prediction" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/cognitiveservices-customvision-training" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/cognitiveservices-face" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@azure/cognitiveservices-translatortext" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.microsoft-cognitiveservices-speech-sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/service-bus" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/keyvault-secrets" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@azure/keyvault-keys" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From 125f3581c38b3834ec9435de0719fbf264f40ab9 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 21 Jun 2024 16:16:04 -0700 Subject: [PATCH 433/755] Unleash the chat API (#216850) * Unleash the chat API * Fix * Fix --- .../workbench/api/common/extHost.api.impl.ts | 14 +++---------- .../api/common/extHostChatAgents2.ts | 20 +++---------------- .../browser/chatParticipantContributions.ts | 5 ----- 3 files changed, 6 insertions(+), 33 deletions(-) diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 4493a01248a87..fe15a50233db8 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -14,7 +14,7 @@ import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; import { score, targetsNotebooks } from 'vs/editor/common/languageSelector'; import * as languageConfiguration from 'vs/editor/common/languages/languageConfiguration'; import { OverviewRulerLane } from 'vs/editor/common/model'; -import { ExtensionIdentifier, ExtensionIdentifierSet, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifierSet, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as files from 'vs/platform/files/common/files'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ILogService, ILoggerService, LogLevel } from 'vs/platform/log/common/log'; @@ -55,6 +55,7 @@ import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitData import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive'; import { ExtHostLabelService } from 'vs/workbench/api/common/extHostLabelService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; +import { ExtHostLanguageModelTools } from 'vs/workbench/api/common/extHostLanguageModelTools'; import { IExtHostLanguageModels } from 'vs/workbench/api/common/extHostLanguageModels'; import { ExtHostLanguages } from 'vs/workbench/api/common/extHostLanguages'; import { IExtHostLocalizationService } from 'vs/workbench/api/common/extHostLocalizationService'; @@ -107,7 +108,6 @@ import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/serv import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { TextSearchCompleteMessageType } from 'vs/workbench/services/search/common/searchExtTypes'; import type * as vscode from 'vscode'; -import { ExtHostLanguageModelTools } from 'vs/workbench/api/common/extHostLanguageModelTools'; export interface IExtensionRegistries { mine: ExtensionDescriptionRegistry; @@ -210,7 +210,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostUriOpeners = rpcProtocol.set(ExtHostContext.ExtHostUriOpeners, new ExtHostUriOpeners(rpcProtocol)); const extHostProfileContentHandlers = rpcProtocol.set(ExtHostContext.ExtHostProfileContentHandlers, new ExtHostProfileContentHandlers(rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostInteractive, new ExtHostInteractive(rpcProtocol, extHostNotebook, extHostDocumentsAndEditors, extHostCommands, extHostLogService)); - const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, initData.quality)); + const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands)); const extHostChatVariables = rpcProtocol.set(ExtHostContext.ExtHostChatVariables, new ExtHostChatVariables(rpcProtocol)); const extHostLanguageModelTools = rpcProtocol.set(ExtHostContext.ExtHostLanguageModelTools, new ExtHostLanguageModelTools(rpcProtocol)); const extHostAiRelatedInformation = rpcProtocol.set(ExtHostContext.ExtHostAiRelatedInformation, new ExtHostRelatedInformation(rpcProtocol)); @@ -1444,17 +1444,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I // namespace: lm const lm: typeof vscode.lm = { selectChatModels: (selector) => { - if (initData.quality === 'stable') { - console.warn(`[${ExtensionIdentifier.toKey(extension.identifier)}] This API is disabled in '${initData.environment.appName}'-stable.`); - return Promise.resolve([]); - } return extHostLanguageModels.selectLanguageModels(extension, selector ?? {}); }, onDidChangeChatModels: (listener, thisArgs?, disposables?) => { - if (initData.quality === 'stable') { - console.warn(`[${ExtensionIdentifier.toKey(extension.identifier)}] This API is disabled in '${initData.environment.appName}'-stable.`); - return Event.None(listener, thisArgs, disposables); - } return extHostLanguageModels.onDidChangeProviders(listener, thisArgs, disposables); }, registerChatModelProvider: (id, provider, metadata) => { diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index 2bdeacb491a43..37a81b0034df9 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -263,7 +263,6 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS mainContext: IMainContext, private readonly _logService: ILogService, private readonly commands: ExtHostCommands, - private readonly quality: string | undefined ) { super(); this._proxy = mainContext.getProxy(MainContext.MainThreadChatAgents2); @@ -275,19 +274,16 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS createChatAgent(extension: IExtensionDescription, id: string, handler: vscode.ChatExtendedRequestHandler): vscode.ChatParticipant { const handle = ExtHostChatAgents2._idPool++; - const agent = new ExtHostChatAgent(extension, this.quality, id, this._proxy, handle, handler); + const agent = new ExtHostChatAgent(extension, id, this._proxy, handle, handler); this._agents.set(handle, agent); - if (agent.isAgentEnabled()) { - this._proxy.$registerAgent(handle, extension.identifier, id, {}, undefined); - } - + this._proxy.$registerAgent(handle, extension.identifier, id, {}, undefined); return agent.apiAgent; } createDynamicChatAgent(extension: IExtensionDescription, id: string, dynamicProps: vscode.DynamicChatParticipantProps, handler: vscode.ChatExtendedRequestHandler): vscode.ChatParticipant { const handle = ExtHostChatAgents2._idPool++; - const agent = new ExtHostChatAgent(extension, this.quality, id, this._proxy, handle, handler); + const agent = new ExtHostChatAgent(extension, id, this._proxy, handle, handler); this._agents.set(handle, agent); this._proxy.$registerAgent(handle, extension.identifier, id, { isSticky: true } satisfies IExtensionChatAgentMetadata, dynamicProps); @@ -498,7 +494,6 @@ class ExtHostChatAgent { constructor( public readonly extension: IExtensionDescription, - private readonly quality: string | undefined, public readonly id: string, private readonly _proxy: MainThreadChatAgentsShape2, private readonly _handle: number, @@ -521,11 +516,6 @@ class ExtHostChatAgent { return await this._agentVariableProvider.provider.provideCompletionItems(query, token) ?? []; } - public isAgentEnabled() { - // If in stable and this extension doesn't have the right proposed API, then don't register the agent - return !(this.quality === 'stable' && !isProposedApiEnabled(this.extension, 'chatParticipantPrivate')); - } - async provideFollowups(result: vscode.ChatResult, context: vscode.ChatContext, token: CancellationToken): Promise { if (!this._followupProvider) { return []; @@ -583,10 +573,6 @@ class ExtHostChatAgent { } updateScheduled = true; queueMicrotask(() => { - if (!that.isAgentEnabled()) { - return; - } - this._proxy.$updateAgent(this._handle, { icon: !this._iconPath ? undefined : this._iconPath instanceof URI ? this._iconPath : diff --git a/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts b/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts index 80475055ca86d..33c619735331d 100644 --- a/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts @@ -185,11 +185,6 @@ export class ChatExtensionPointHandler implements IWorkbenchContribution { continue; } - if (this.productService.quality === 'stable' && !isProposedApiEnabled(extension.description, 'chatParticipantPrivate')) { - this.logService.warn(`Chat participants are not yet enabled in VS Code Stable (${extension.description.identifier.value})`); - continue; - } - for (const providerDescriptor of extension.value) { if (!providerDescriptor.name.match(/^[\w0-9_-]+$/)) { this.logService.error(`Extension '${extension.description.identifier.value}' CANNOT register participant with invalid name: ${providerDescriptor.name}. Name must match /^[\\w0-9_-]+$/.`); From e47ec0a8791a6a79736bb14e29d6c0c7504b66bb Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Sat, 22 Jun 2024 01:52:04 +0200 Subject: [PATCH 434/755] fix settings editor memory leak (#216763) * try to fix settings editor memory leak * clean up code * remove unused clear --- .../contrib/preferences/browser/settingsEditor2.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index 0b0441c93560e..f583071dee18f 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -17,7 +17,7 @@ import { isCancellationError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, dispose, type IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/settingsEditor2'; @@ -219,6 +219,8 @@ export class SettingsEditor2 extends EditorPane { private installedExtensionIds: string[] = []; + private readonly inputChangeListener: MutableDisposable; + constructor( group: IEditorGroup, @ITelemetryService telemetryService: ITelemetryService, @@ -289,6 +291,7 @@ export class SettingsEditor2 extends EditorPane { if (ENABLE_LANGUAGE_FILTER && !SettingsEditor2.SUGGESTIONS.includes(`@${LANGUAGE_SETTING_TAG}`)) { SettingsEditor2.SUGGESTIONS.push(`@${LANGUAGE_SETTING_TAG}`); } + this.inputChangeListener = this._register(new MutableDisposable()); } override get minimumWidth(): number { return SettingsEditor2.EDITOR_MIN_WIDTH; } @@ -382,9 +385,9 @@ export class SettingsEditor2 extends EditorPane { // Don't block setInput on render (which can trigger an async search) this.onConfigUpdate(undefined, true).then(() => { - this._register(input.onWillDispose(() => { + this.inputChangeListener.value = input.onWillDispose(() => { this.searchWidget.setValue(''); - })); + }); // Init TOC selection this.updateTreeScrollSync(); From b6924a1d2e5249f97d1a5e6d3a1ad0edb2e33544 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Sat, 22 Jun 2024 17:28:42 +0200 Subject: [PATCH 435/755] use first mappedEditsProviders that returns a result (#216885) --- .../browser/actions/chatCodeblockActions.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts index 9204812e3becf..b896e746de071 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts @@ -275,7 +275,6 @@ export function registerChatCodeBlockActions() { let mappedEdits: WorkspaceEdit | null = null; if (mappedEditsProviders.length > 0) { - const mostRelevantProvider = mappedEditsProviders[0]; // TODO@ulugbekna: should we try all providers? // 0th sub-array - editor selections array if there are any selections // 1st sub-array - array with documents used to get the chat reply @@ -302,13 +301,17 @@ export function registerChatCodeBlockActions() { docRefs.push(usedDocuments); } - const cancellationTokenSource = new CancellationTokenSource(); + let i = 0; + do { + const cancellationTokenSource = new CancellationTokenSource(); - mappedEdits = await mostRelevantProvider.provideMappedEdits( - activeModel, - [codeBlockActionContext.code], - { documents: docRefs }, - cancellationTokenSource.token); + mappedEdits = await mappedEditsProviders[i].provideMappedEdits( + activeModel, + [codeBlockActionContext.code], + { documents: docRefs }, + cancellationTokenSource.token); + + } while (!mappedEdits && ++i < mappedEditsProviders.length); } if (mappedEdits) { From 111a6f72380eb66d91baf171692be2177df652e8 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 22 Jun 2024 23:07:10 -0700 Subject: [PATCH 436/755] Rework ChatListRenderer (#216897) * ChatListRenderer changes * Streaming fixes * Handle stored codeblocks from multiple renderMarkdown calls * Fixes to disposables and progress messages * Add element to render context * Add a content part for references * Add content part for task * Fix fillInIncompleteTokens * Delete usedReferences setting * Make references rendered the same as other chat parts * Comments * Clean up --- .../browser/actions/chatCodeblockActions.ts | 2 +- src/vs/workbench/contrib/chat/browser/chat.ts | 2 +- .../chatCommandContentPart.ts | 20 +- .../chatConfirmationContentPart.ts | 23 +- .../chatContentParts/chatContentParts.ts | 26 + .../chatMarkdownContentPart.ts | 48 +- .../chatProgressContentPart.ts | 39 +- .../chatReferencesContentPart.ts | 299 ++++++ .../chatContentParts/chatTaskContentPart.ts | 52 + .../chatTextEditContentPart.ts | 29 +- .../chatContentParts/chatTreeContentPart.ts | 19 +- .../chatWarningContentPart.ts | 16 +- .../contrib/chat/browser/chatListRenderer.ts | 897 ++++++------------ .../contrib/chat/browser/media/chat.css | 4 +- .../contrib/chat/common/annotations.ts | 2 +- .../contrib/chat/common/chatModel.ts | 2 +- .../contrib/chat/common/chatViewModel.ts | 30 +- .../contrib/chat/common/chatWordCounter.ts | 10 +- .../chat/test/common/chatWordCounter.test.ts | 2 +- 19 files changed, 828 insertions(+), 694 deletions(-) create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts create mode 100644 src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts index b896e746de071..a353556970d93 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts @@ -500,7 +500,7 @@ export function registerChatCodeBlockActions() { const currentResponse = curCodeBlockInfo ? curCodeBlockInfo.element : (focusedResponse ?? widget.viewModel?.getItems().reverse().find((item): item is IChatResponseViewModel => isResponseVM(item))); - if (!currentResponse) { + if (!currentResponse || !isResponseVM(currentResponse)) { return; } diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index b6b9a43127a17..c02338c87bedd 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -79,7 +79,7 @@ export interface IChatAccessibilityService { export interface IChatCodeBlockInfo { codeBlockIndex: number; - element: IChatResponseViewModel; + element: ChatTreeItem; uri: URI | undefined; focus(): void; } diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts index 56ce42a6d6a9f..3893117fd20ae 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart.ts @@ -9,32 +9,38 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; -import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; +import { IChatProgressRenderableResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; import { IChatCommandButton } from 'vs/workbench/contrib/chat/common/chatService'; import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; const $ = dom.$; -export class ChatCommandButtonContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatCommandButtonContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; constructor( commandButton: IChatCommandButton, - element: ChatTreeItem, + context: IChatContentPartRenderContext, @ICommandService private readonly commandService: ICommandService ) { super(); - this.element = $('.chat-command-button'); - const enabled = !isResponseVM(element) || !element.isStale; + this.domNode = $('.chat-command-button'); + const enabled = !isResponseVM(context.element) || !context.element.isStale; const tooltip = enabled ? commandButton.command.tooltip : localize('commandButtonDisabled', "Button not available in restored chat"); - const button = this._register(new Button(this.element, { ...defaultButtonStyles, supportIcons: true, title: tooltip })); + const button = this._register(new Button(this.domNode, { ...defaultButtonStyles, supportIcons: true, title: tooltip })); button.label = commandButton.command.title; button.enabled = enabled; // TODO still need telemetry for command buttons this._register(button.onDidClick(() => this.commandService.executeCommand(commandButton.command.id, ...(commandButton.command.arguments ?? [])))); } + + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + // No other change allowed for this content type + return other.kind === 'command'; + } } diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts index f79c78f0c1f9a..4159f07c91998 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts @@ -4,28 +4,30 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; import { ChatConfirmationWidget } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationWidget'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; +import { IChatProgressRenderableResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; import { IChatConfirmation, IChatSendRequestOptions, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; -export class ChatConfirmationContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatConfirmationContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; private readonly _onDidChangeHeight = this._register(new Emitter()); public readonly onDidChangeHeight = this._onDidChangeHeight.event; constructor( confirmation: IChatConfirmation, - element: ChatTreeItem, + context: IChatContentPartRenderContext, @IInstantiationService private readonly instantiationService: IInstantiationService, @IChatService private readonly chatService: IChatService, ) { super(); + const element = context.element; const confirmationWidget = this._register(this.instantiationService.createInstance(ChatConfirmationWidget, confirmation.title, confirmation.message, [ { label: localize('accept', "Accept"), data: confirmation.data }, { label: localize('dismiss', "Dismiss"), data: confirmation.data, isSecondary: true }, @@ -48,6 +50,15 @@ export class ChatConfirmationContentPart extends Disposable { } })); - this.element = confirmationWidget.domNode; + this.domNode = confirmationWidget.domNode; + } + + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + // No other change allowed for this content type + return other.kind === 'confirmation'; + } + + addDisposable(disposable: IDisposable): void { + this._register(disposable); } } diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts.ts new file mode 100644 index 0000000000000..80e3c44a05603 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IDisposable } from 'vs/base/common/lifecycle'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatRendererContent } from 'vs/workbench/contrib/chat/common/chatViewModel'; + +export interface IChatContentPart extends IDisposable { + domNode: HTMLElement; + + /** + * Returns true if the other content is equivalent to what is already rendered in this content part. + * Returns false if a rerender is needed. + * followingContent is all the content that will be rendered after this content part (to support progress messages' behavior). + */ + hasSameContent(other: IChatRendererContent, followingContent: IChatRendererContent[], element: ChatTreeItem): boolean; +} + +export interface IChatContentPartRenderContext { + element: ChatTreeItem; + index: number; + content: ReadonlyArray; + preceedingContentParts: ReadonlyArray; +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts index a0e21ffc005b3..29a2573374b08 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts @@ -14,32 +14,32 @@ import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/se import { MenuId } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ChatTreeItem, IChatCodeBlockInfo, IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatCodeBlockInfo, IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; import { IChatRendererDelegate } from 'vs/workbench/contrib/chat/browser/chatListRenderer'; import { ChatMarkdownDecorationsRenderer } from 'vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer'; import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions'; import { CodeBlockPart, ICodeBlockData, localFileLanguageId, parseLocalFileData } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; import { IMarkdownVulnerability } from 'vs/workbench/contrib/chat/common/annotations'; +import { IChatProgressRenderableResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; import { isRequestVM, isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { CodeBlockModelCollection } from 'vs/workbench/contrib/chat/common/codeBlockModelCollection'; const $ = dom.$; -export class ChatMarkdownContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatMarkdownContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; private readonly allRefs: IDisposableReference[] = []; private readonly _onDidChangeHeight = this._register(new Emitter()); public readonly onDidChangeHeight = this._onDidChangeHeight.event; - // TODO@roblourens this is weird, why are IChatCodeBlockInfo only for responses? public readonly codeblocks: IChatCodeBlockInfo[] = []; - public readonly codeBlockCount: number; constructor( - markdown: IMarkdownString, - element: ChatTreeItem, + private readonly markdown: IMarkdownString, + context: IChatContentPartRenderContext, private readonly editorPool: EditorPool, fillInIncompleteTokens = false, codeBlockStartIndex = 0, @@ -53,11 +53,11 @@ export class ChatMarkdownContentPart extends Disposable { ) { super(); + const element = context.element; const markdownDecorationsRenderer = instantiationService.createInstance(ChatMarkdownDecorationsRenderer); // We release editors in order so that it's more likely that the same editor will be assigned if this element is re-rendered right away, like it often is during progressive rendering const orderedDisposablesList: IDisposable[] = []; - const codeblocks: IChatCodeBlockInfo[] = []; let codeBlockIndex = codeBlockStartIndex; const result = this._register(renderer.render(markdown, { fillInIncompleteTokens, @@ -94,18 +94,15 @@ export class ChatMarkdownContentPart extends Disposable { // not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render) this._register(ref.object.onDidChangeContentHeight(() => this._onDidChangeHeight.fire())); - if (isResponseVM(element)) { - const info: IChatCodeBlockInfo = { - codeBlockIndex: index, - element, - focus() { - ref.object.focus(); - }, - uri: ref.object.uri - }; - codeblocks.push(info); - - } + const info: IChatCodeBlockInfo = { + codeBlockIndex: index, + element, + focus() { + ref.object.focus(); + }, + uri: ref.object.uri + }; + this.codeblocks.push(info); orderedDisposablesList.push(ref); return ref.object.element; }, @@ -115,8 +112,7 @@ export class ChatMarkdownContentPart extends Disposable { this._register(markdownDecorationsRenderer.walkTreeAndAnnotateReferenceLinks(result.element)); orderedDisposablesList.reverse().forEach(d => this._register(d)); - this.element = result.element; - this.codeBlockCount = codeBlockIndex - codeBlockStartIndex; + this.domNode = result.element; } private renderCodeBlock(data: ICodeBlockData, text: string, currentWidth: number, editableCodeBlock: boolean | undefined): IDisposableReference { @@ -131,9 +127,17 @@ export class ChatMarkdownContentPart extends Disposable { return ref; } + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + return other.kind === 'markdownContent' && other.content.value === this.markdown.value; + } + layout(width: number): void { this.allRefs.forEach(ref => ref.object.layout(width)); } + + addDisposable(disposable: IDisposable): void { + this._register(disposable); + } } export class EditorPool extends Disposable { diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts index eb672ed36f0d0..6545fdfe9adbf 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart.ts @@ -3,36 +3,63 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { $ } from 'vs/base/browser/dom'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { Codicon } from 'vs/base/common/codicons'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { Disposable } from 'vs/base/common/lifecycle'; import { ThemeIcon } from 'vs/base/common/themables'; import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; import { IChatProgressMessage, IChatTask } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatRendererContent, isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; -export class ChatProgressContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatProgressContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; + + private readonly showSpinner: boolean; constructor( progress: IChatProgressMessage | IChatTask, - showSpinner: boolean, renderer: MarkdownRenderer, + context: IChatContentPartRenderContext, + forceShowSpinner?: boolean, + forceShowMessage?: boolean ) { super(); - if (showSpinner) { + const followingContent = context.content.slice(context.index + 1); + this.showSpinner = forceShowSpinner ?? shouldShowSpinner(followingContent, context.element); + const hideMessage = forceShowMessage !== true && followingContent.some(part => part.kind !== 'progressMessage'); + if (hideMessage) { + // Placeholder, don't show the progress message + this.domNode = $(''); + return; + } + + if (this.showSpinner) { // TODO@roblourens is this the right place for this? // this step is in progress, communicate it to SR users alert(progress.content.value); } - const codicon = showSpinner ? ThemeIcon.modify(Codicon.loading, 'spin').id : Codicon.check.id; + const codicon = this.showSpinner ? ThemeIcon.modify(Codicon.loading, 'spin').id : Codicon.check.id; const markdown = new MarkdownString(`$(${codicon}) ${progress.content.value}`, { supportThemeIcons: true }); const result = this._register(renderer.render(markdown)); result.element.classList.add('progress-step'); - this.element = result.element; + this.domNode = result.element; } + + hasSameContent(other: IChatRendererContent, followingContent: IChatRendererContent[], element: ChatTreeItem): boolean { + // Needs rerender when spinner state changes + const showSpinner = shouldShowSpinner(followingContent, element); + return other.kind === 'progressMessage' && this.showSpinner === showSpinner; + } +} + +function shouldShowSpinner(followingContent: IChatRendererContent[], element: ChatTreeItem): boolean { + return isResponseVM(element) && !element.isComplete && followingContent.length === 0; } diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts new file mode 100644 index 0000000000000..b1305e8e160ae --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts @@ -0,0 +1,299 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { Button } from 'vs/base/browser/ui/button/button'; +import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { Codicon } from 'vs/base/common/codicons'; +import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { matchesSomeScheme, Schemas } from 'vs/base/common/network'; +import { basename } from 'vs/base/common/path'; +import { basenameOrAuthority } from 'vs/base/common/resources'; +import { ThemeIcon } from 'vs/base/common/themables'; +import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { FileKind } from 'vs/platform/files/common/files'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; +import { ColorScheme } from 'vs/workbench/browser/web.api'; +import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; +import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; +import { IChatContentReference, IChatWarningMessage } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; +import { IChatRendererContent, IChatResponseViewModel } from 'vs/workbench/contrib/chat/common/chatViewModel'; +import { createFileIconThemableTreeContainerScope } from 'vs/workbench/contrib/files/browser/views/explorerView'; + +const $ = dom.$; + +export class ChatReferencesContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; + + private readonly _onDidChangeHeight = this._register(new Emitter()); + public readonly onDidChangeHeight = this._onDidChangeHeight.event; + + constructor( + private readonly data: ReadonlyArray, + labelOverride: string | undefined, + element: IChatResponseViewModel, + contentReferencesListPool: ContentReferencesListPool, + @IOpenerService openerService: IOpenerService, + ) { + super(); + + const referencesLabel = labelOverride ?? (data.length > 1 ? + localize('usedReferencesPlural', "Used {0} references", data.length) : + localize('usedReferencesSingular', "Used {0} reference", 1)); + const iconElement = $('.chat-used-context-icon'); + const icon = (element: IChatResponseViewModel) => element.usedReferencesExpanded ? Codicon.chevronDown : Codicon.chevronRight; + iconElement.classList.add(...ThemeIcon.asClassNameArray(icon(element))); + const buttonElement = $('.chat-used-context-label', undefined); + + const collapseButton = this._register(new Button(buttonElement, { + buttonBackground: undefined, + buttonBorder: undefined, + buttonForeground: undefined, + buttonHoverBackground: undefined, + buttonSecondaryBackground: undefined, + buttonSecondaryForeground: undefined, + buttonSecondaryHoverBackground: undefined, + buttonSeparator: undefined + })); + this.domNode = $('.chat-used-context', undefined, buttonElement); + collapseButton.label = referencesLabel; + collapseButton.element.prepend(iconElement); + this.updateAriaLabel(collapseButton.element, referencesLabel, element.usedReferencesExpanded); + this.domNode.classList.toggle('chat-used-context-collapsed', !element.usedReferencesExpanded); + this._register(collapseButton.onDidClick(() => { + iconElement.classList.remove(...ThemeIcon.asClassNameArray(icon(element))); + element.usedReferencesExpanded = !element.usedReferencesExpanded; + iconElement.classList.add(...ThemeIcon.asClassNameArray(icon(element))); + this.domNode.classList.toggle('chat-used-context-collapsed', !element.usedReferencesExpanded); + this._onDidChangeHeight.fire(); + this.updateAriaLabel(collapseButton.element, referencesLabel, element.usedReferencesExpanded); + })); + + const ref = this._register(contentReferencesListPool.get()); + const list = ref.object; + this.domNode.appendChild(list.getHTMLElement().parentElement!); + + this._register(list.onDidOpen((e) => { + if (e.element && 'reference' in e.element) { + const uriOrLocation = 'variableName' in e.element.reference ? e.element.reference.value : e.element.reference; + const uri = URI.isUri(uriOrLocation) ? uriOrLocation : + uriOrLocation?.uri; + if (uri) { + openerService.open( + uri, + { + fromUserGesture: true, + editorOptions: { + ...e.editorOptions, + ...{ + selection: uriOrLocation && 'range' in uriOrLocation ? uriOrLocation.range : undefined + } + } + }); + } + } + })); + this._register(list.onContextMenu((e) => { + e.browserEvent.preventDefault(); + e.browserEvent.stopPropagation(); + })); + + const maxItemsShown = 6; + const itemsShown = Math.min(data.length, maxItemsShown); + const height = itemsShown * 22; + list.layout(height); + list.getHTMLElement().style.height = `${height}px`; + list.splice(0, list.length, data); + } + + hasSameContent(other: IChatRendererContent, followingContent: IChatRendererContent[], element: ChatTreeItem): boolean { + return other.kind === 'references' && other.references.length === this.data.length; + } + + private updateAriaLabel(element: HTMLElement, label: string, expanded?: boolean): void { + element.ariaLabel = expanded ? localize('usedReferencesExpanded', "{0}, expanded", label) : localize('usedReferencesCollapsed', "{0}, collapsed", label); + } + + addDisposable(disposable: IDisposable): void { + this._register(disposable); + } +} + +export class ContentReferencesListPool extends Disposable { + private _pool: ResourcePool>; + + public get inUse(): ReadonlySet> { + return this._pool.inUse; + } + + constructor( + private _onDidChangeVisibility: Event, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IThemeService private readonly themeService: IThemeService, + ) { + super(); + this._pool = this._register(new ResourcePool(() => this.listFactory())); + } + + private listFactory(): WorkbenchList { + const resourceLabels = this._register(this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this._onDidChangeVisibility })); + + const container = $('.chat-used-context-list'); + this._register(createFileIconThemableTreeContainerScope(container, this.themeService)); + + const list = this.instantiationService.createInstance( + WorkbenchList, + 'ChatListRenderer', + container, + new ContentReferencesListDelegate(), + [this.instantiationService.createInstance(ContentReferencesListRenderer, resourceLabels)], + { + alwaysConsumeMouseWheel: false, + accessibilityProvider: { + getAriaLabel: (element: IChatContentReference | IChatWarningMessage) => { + if (element.kind === 'warning') { + return element.content.value; + } + const reference = element.reference; + if ('variableName' in reference) { + return reference.variableName; + } else if (URI.isUri(reference)) { + return basename(reference.path); + } else { + return basename(reference.uri.path); + } + }, + + getWidgetAriaLabel: () => localize('usedReferences', "Used References") + }, + dnd: { + getDragURI: (element: IChatContentReference | IChatWarningMessage) => { + if (element.kind === 'warning') { + return null; + } + const { reference } = element; + if ('variableName' in reference) { + return null; + } else if (URI.isUri(reference)) { + return reference.toString(); + } else { + return reference.uri.toString(); + } + }, + dispose: () => { }, + onDragOver: () => false, + drop: () => { }, + }, + }); + + return list; + } + + get(): IDisposableReference> { + const object = this._pool.get(); + let stale = false; + return { + object, + isStale: () => stale, + dispose: () => { + stale = true; + this._pool.release(object); + } + }; + } +} + +class ContentReferencesListDelegate implements IListVirtualDelegate { + getHeight(element: IChatContentReference): number { + return 22; + } + + getTemplateId(element: IChatContentReference): string { + return ContentReferencesListRenderer.TEMPLATE_ID; + } +} + +interface IChatContentReferenceListTemplate { + label: IResourceLabel; + templateDisposables: IDisposable; +} + +class ContentReferencesListRenderer implements IListRenderer { + static TEMPLATE_ID = 'contentReferencesListRenderer'; + readonly templateId: string = ContentReferencesListRenderer.TEMPLATE_ID; + + constructor( + private labels: ResourceLabels, + @IThemeService private readonly themeService: IThemeService, + @IChatVariablesService private readonly chatVariablesService: IChatVariablesService, + ) { } + + renderTemplate(container: HTMLElement): IChatContentReferenceListTemplate { + const templateDisposables = new DisposableStore(); + const label = templateDisposables.add(this.labels.create(container, { supportHighlights: true })); + return { templateDisposables, label }; + } + + + private getReferenceIcon(data: IChatContentReference): URI | ThemeIcon | undefined { + if (ThemeIcon.isThemeIcon(data.iconPath)) { + return data.iconPath; + } else { + return this.themeService.getColorTheme().type === ColorScheme.DARK && data.iconPath?.dark + ? data.iconPath?.dark + : data.iconPath?.light; + } + } + + renderElement(data: IChatContentReference | IChatWarningMessage, index: number, templateData: IChatContentReferenceListTemplate, height: number | undefined): void { + if (data.kind === 'warning') { + templateData.label.setResource({ name: data.content.value }, { icon: Codicon.warning }); + return; + } + + const reference = data.reference; + const icon = this.getReferenceIcon(data); + templateData.label.element.style.display = 'flex'; + if ('variableName' in reference) { + if (reference.value) { + const uri = URI.isUri(reference.value) ? reference.value : reference.value.uri; + templateData.label.setResource( + { + resource: uri, + name: basenameOrAuthority(uri), + description: `#${reference.variableName}`, + range: 'range' in reference.value ? reference.value.range : undefined, + }, { icon }); + } else { + const variable = this.chatVariablesService.getVariable(reference.variableName); + templateData.label.setLabel(`#${reference.variableName}`, undefined, { title: variable?.description }); + } + } else { + const uri = 'uri' in reference ? reference.uri : reference; + if (matchesSomeScheme(uri, Schemas.mailto, Schemas.http, Schemas.https)) { + templateData.label.setResource({ resource: uri, name: uri.toString() }, { icon: icon ?? Codicon.globe }); + } else { + templateData.label.setFile(uri, { + fileKind: FileKind.FILE, + // Should not have this live-updating data on a historical reference + fileDecorations: { badges: false, colors: false }, + range: 'range' in reference ? reference.range : undefined + }); + } + } + } + + disposeTemplate(templateData: IChatContentReferenceListTemplate): void { + templateData.templateDisposables.dispose(); + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts new file mode 100644 index 0000000000000..ad493c4afc770 --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts @@ -0,0 +1,52 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { Event } from 'vs/base/common/event'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; +import { ChatProgressContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart'; +import { ChatReferencesContentPart, ContentReferencesListPool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart'; +import { IChatProgressRenderableResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; +import { IChatTask } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatResponseViewModel } from 'vs/workbench/contrib/chat/common/chatViewModel'; + +export class ChatTaskContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; + public readonly onDidChangeHeight: Event; + + constructor( + private readonly task: IChatTask, + contentReferencesListPool: ContentReferencesListPool, + renderer: MarkdownRenderer, + context: IChatContentPartRenderContext, + @IInstantiationService instantiationService: IInstantiationService, + ) { + super(); + + if (task.progress.length) { + const refsPart = this._register(instantiationService.createInstance(ChatReferencesContentPart, task.progress, task.content.value, context.element as IChatResponseViewModel, contentReferencesListPool)); + this.domNode = dom.$('.chat-progress-task'); + this.domNode.appendChild(refsPart.domNode); + this.onDidChangeHeight = refsPart.onDidChangeHeight; + } else { + const progressPart = this._register(instantiationService.createInstance(ChatProgressContentPart, task, renderer, context, !task.isSettled(), true)); + this.domNode = progressPart.domNode; + this.onDidChangeHeight = Event.None; + } + } + + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + return other.kind === 'progressTask' + && other.progress.length === this.task.progress.length + && other.isSettled() === this.task.isSettled(); + } + + addDisposable(disposable: IDisposable): void { + this._register(disposable); + } +} diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts index 9752ec4a0e50d..5232437f966aa 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts @@ -6,7 +6,7 @@ import * as dom from 'vs/base/browser/dom'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; @@ -20,19 +20,20 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { localize } from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ChatTreeItem, IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; +import { IChatListItemRendererOptions } from 'vs/workbench/contrib/chat/browser/chat'; import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; import { IChatRendererDelegate } from 'vs/workbench/contrib/chat/browser/chatListRenderer'; import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions'; import { CodeCompareBlockPart, ICodeCompareBlockData, ICodeCompareBlockDiffData } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; -import { IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; +import { IChatProgressRenderableResponseContent, IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { isResponseVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; const $ = dom.$; -export class ChatTextEditContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatTextEditContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; private readonly ref: IDisposableReference | undefined; private readonly _onDidChangeHeight = this._register(new Emitter()); @@ -40,7 +41,7 @@ export class ChatTextEditContentPart extends Disposable { constructor( chatTextEdit: IChatTextEditGroup, - element: ChatTreeItem, + context: IChatContentPartRenderContext, rendererOptions: IChatListItemRendererOptions, diffEditorPool: DiffEditorPool, currentWidth: number, @@ -49,13 +50,14 @@ export class ChatTextEditContentPart extends Disposable { @IChatService private readonly chatService: IChatService, ) { super(); + const element = context.element; // TODO@jrieken move this into the CompareCodeBlock and properly say what kind of changes happen if (rendererOptions.renderTextEditsAsSummary?.(chatTextEdit.uri)) { if (isResponseVM(element) && element.response.value.every(item => item.kind === 'textEditGroup')) { - this.element = $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")); + this.domNode = $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")); } else { - this.element = $('div'); + this.domNode = $('div'); } // TODO@roblourens this case is now handled outside this Part in ChatListRenderer, but can it be cleaned up? @@ -151,13 +153,22 @@ export class ChatTextEditContentPart extends Disposable { }; this.ref.object.render(data, currentWidth, cts.token); - this.element = this.ref.object.element; + this.domNode = this.ref.object.element; } } layout(width: number): void { this.ref?.object.layout(width); } + + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + // No other change allowed for this content type + return other.kind === 'textEditGroup'; + } + + addDisposable(disposable: IDisposable): void { + this._register(disposable); + } } export class DiffEditorPool extends Disposable { diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts index 6bdae0b311a05..8742d2da602e2 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart.ts @@ -10,7 +10,7 @@ import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTre import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; import { IAsyncDataSource, ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { FileKind, FileType } from 'vs/platform/files/common/files'; @@ -21,14 +21,16 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; +import { IChatContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; +import { IChatProgressRenderableResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; import { IChatResponseProgressFileTreeData } from 'vs/workbench/contrib/chat/common/chatService'; import { createFileIconThemableTreeContainerScope } from 'vs/workbench/contrib/files/browser/views/explorerView'; import { IFilesConfiguration } from 'vs/workbench/contrib/files/common/files'; const $ = dom.$; -export class ChatTreeContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatTreeContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; private readonly _onDidChangeHeight = this._register(new Emitter()); public readonly onDidChangeHeight = this._onDidChangeHeight.event; @@ -70,12 +72,21 @@ export class ChatTreeContentPart extends Disposable { } }); - this.element = this.tree.getHTMLElement().parentElement!; + this.domNode = this.tree.getHTMLElement().parentElement!; } domFocus() { this.tree.domFocus(); } + + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + // No other change allowed for this content type + return other.kind === 'treeData'; + } + + addDisposable(disposable: IDisposable): void { + this._register(disposable); + } } export class TreePool extends Disposable { diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts index 0c297b64ab5a2..3fd0b9fb239f6 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts @@ -9,11 +9,13 @@ import { Codicon } from 'vs/base/common/codicons'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Disposable } from 'vs/base/common/lifecycle'; import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { IChatContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; +import { IChatProgressRenderableResponseContent } from 'vs/workbench/contrib/chat/common/chatModel'; const $ = dom.$; -export class ChatWarningContentPart extends Disposable { - public readonly element: HTMLElement; +export class ChatWarningContentPart extends Disposable implements IChatContentPart { + public readonly domNode: HTMLElement; constructor( kind: 'info' | 'warning' | 'error', @@ -22,7 +24,7 @@ export class ChatWarningContentPart extends Disposable { ) { super(); - this.element = $('.chat-notification-widget'); + this.domNode = $('.chat-notification-widget'); let icon; let iconClass; switch (kind) { @@ -39,9 +41,13 @@ export class ChatWarningContentPart extends Disposable { iconClass = '.chat-info-codicon'; break; } - this.element.appendChild($(iconClass, undefined, renderIcon(icon))); + this.domNode.appendChild($(iconClass, undefined, renderIcon(icon))); const markdownContent = renderer.render(content); - this.element.appendChild(markdownContent.element); + this.domNode.appendChild(markdownContent.element); + } + hasSameContent(other: IChatProgressRenderableResponseContent): boolean { + // No other change allowed for this content type + return other.kind === 'warning'; } } diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 20af23c10821d..5a8915ba0ceb4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -7,27 +7,24 @@ import * as dom from 'vs/base/browser/dom'; import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; -import { Button } from 'vs/base/browser/ui/button/button'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { IAction } from 'vs/base/common/actions'; -import { distinct } from 'vs/base/common/arrays'; +import { coalesce, distinct } from 'vs/base/common/arrays'; import { Codicon } from 'vs/base/common/codicons'; import { Emitter, Event } from 'vs/base/common/event'; import { FuzzyScore } from 'vs/base/common/filters'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; -import { FileAccess, Schemas, matchesSomeScheme } from 'vs/base/common/network'; +import { FileAccess } from 'vs/base/common/network'; import { clamp } from 'vs/base/common/numbers'; import { autorun } from 'vs/base/common/observable'; -import { basename } from 'vs/base/common/path'; -import { basenameOrAuthority } from 'vs/base/common/resources'; import { ThemeIcon } from 'vs/base/common/themables'; import { URI } from 'vs/base/common/uri'; -import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; import { localize } from 'vs/nls'; import { IMenuEntryActionViewItemOptions, MenuEntryActionViewItem, createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; @@ -35,23 +32,21 @@ import { MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { FileKind } from 'vs/platform/files/common/files'; import { IHoverService } from 'vs/platform/hover/browser/hover'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { ILogService } from 'vs/platform/log/common/log'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { ChatTreeItem, GeneratingPhrase, IChatCodeBlockInfo, IChatFileTreeInfo } from 'vs/workbench/contrib/chat/browser/chat'; import { ChatAgentHover, getChatAgentHoverOptions } from 'vs/workbench/contrib/chat/browser/chatAgentHover'; -import { IDisposableReference, ResourcePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCollections'; import { ChatCommandButtonContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatCommandContentPart'; import { ChatConfirmationContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart'; +import { IChatContentPart, IChatContentPartRenderContext } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatContentParts'; import { ChatMarkdownContentPart, EditorPool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart'; import { ChatProgressContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatProgressContentPart'; +import { ChatReferencesContentPart, ContentReferencesListPool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart'; +import { ChatTaskContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart'; import { ChatTextEditContentPart, DiffEditorPool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart'; import { ChatTreeContentPart, TreePool } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatTreeContentPart'; import { ChatWarningContentPart } from 'vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart'; @@ -62,13 +57,11 @@ import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions import { ChatCodeBlockContentProvider } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; import { ChatAgentLocation, IChatAgentMetadata } from 'vs/workbench/contrib/chat/common/chatAgents'; import { CONTEXT_CHAT_RESPONSE_SUPPORT_ISSUE_REPORTING, CONTEXT_REQUEST, CONTEXT_RESPONSE, CONTEXT_RESPONSE_DETECTED_AGENT_COMMAND, CONTEXT_RESPONSE_FILTERED, CONTEXT_RESPONSE_VOTE } from 'vs/workbench/contrib/chat/common/chatContextKeys'; -import { IChatProgressRenderableResponseContent, IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; +import { IChatTextEditGroup } from 'vs/workbench/contrib/chat/common/chatModel'; import { chatSubcommandLeader } from 'vs/workbench/contrib/chat/common/chatParserTypes'; -import { ChatAgentVoteDirection, IChatCommandButton, IChatConfirmation, IChatContentReference, IChatFollowup, IChatProgressMessage, IChatResponseProgressFileTreeData, IChatTask, IChatWarningMessage } from 'vs/workbench/contrib/chat/common/chatService'; -import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; -import { IChatProgressMessageRenderData, IChatRenderData, IChatResponseMarkdownRenderData, IChatResponseViewModel, IChatTaskRenderData, IChatWelcomeMessageViewModel, isRequestVM, isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; -import { IWordCountResult, getNWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; -import { createFileIconThemableTreeContainerScope } from 'vs/workbench/contrib/files/browser/views/explorerView'; +import { ChatAgentVoteDirection, IChatConfirmation, IChatFollowup, IChatTask, IChatTreeData } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatReferences, IChatRendererContent, IChatResponseViewModel, IChatWelcomeMessageViewModel, isRequestVM, isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; +import { getNWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; import { annotateSpecialMarkdownContent } from '../common/annotations'; import { CodeBlockModelCollection } from '../common/codeBlockModelCollection'; import { IChatListItemRendererOptions } from './chat'; @@ -77,13 +70,13 @@ const $ = dom.$; interface IChatListItemTemplate { currentElement?: ChatTreeItem; + renderedParts?: IChatContentPart[]; readonly rowContainer: HTMLElement; readonly titleToolbar?: MenuWorkbenchToolBar; readonly avatarContainer: HTMLElement; readonly username: HTMLElement; readonly detail: HTMLElement; readonly value: HTMLElement; - readonly referencesListContainer: HTMLElement; readonly contextKeyService: IContextKeyService; readonly instantiationService: IInstantiationService; readonly templateDisposables: IDisposable; @@ -96,11 +89,9 @@ interface IItemHeightChangeParams { height: number; } -interface IChatMarkdownRenderResult extends IMarkdownRenderResult { - codeBlockCount: number; -} - -const forceVerboseLayoutTracing = false; +const forceVerboseLayoutTracing = false + // || Boolean("TRUE") // causes a linter warning so that it cannot be pushed + ; export interface IChatRendererDelegate { getListLength(): number; @@ -138,8 +129,6 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer()); - private _usedReferencesEnabled = false; - constructor( editorOptions: ChatEditorOptions, private readonly location: ChatAgentLocation, @@ -150,7 +139,6 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { - if (e.affectsConfiguration('chat.experimental.usedReferences')) { - this._usedReferencesEnabled = configService.getValue('chat.experimental.usedReferences') ?? true; - } - })); } get templateId(): string { @@ -261,7 +242,6 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { try { - if (this.doNextProgressiveRender(element, index, templateData, !!initial, progressiveRenderingDisposables)) { + if (this.doNextProgressiveRender(element, index, templateData, !!initial)) { timer.cancel(); } } catch (err) { // Kill the timer if anything went wrong, avoid getting stuck in a nasty rendering loop. timer.cancel(); - throw err; + this.logService.error(err); } }; timer.cancelAndSet(runProgressiveRender, 50, dom.getWindow(templateData.rowContainer)); runProgressiveRender(true); } else if (isResponseVM(element)) { - const renderableResponse = annotateSpecialMarkdownContent(element.response.value); - this.basicRenderElement(renderableResponse, element, index, templateData); + this.basicRenderElement(element, index, templateData); } else if (isRequestVM(element)) { - const markdown = 'message' in element.message ? - element.message.message : - this.markdownDecorationsRenderer.convertParsedRequestToMarkdown(element.message); // TODO@roblourens can be a ChatMarkdownContentPart - this.basicRenderElement([{ content: new MarkdownString(markdown), kind: 'markdownContent' }], element, index, templateData); + this.basicRenderElement(element, index, templateData); } else { this.renderWelcomeMessage(element, templateData); } @@ -481,47 +453,46 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer, element: ChatTreeItem, index: number, templateData: IChatListItemTemplate) { - const fillInIncompleteTokens = isResponseVM(element) && (!element.isComplete || element.isCanceled || element.errorDetails?.responseIsFiltered || element.errorDetails?.responseIsIncomplete); + private basicRenderElement(element: ChatTreeItem, index: number, templateData: IChatListItemTemplate) { + let value: IChatRendererContent[] = []; + if (isRequestVM(element)) { + const markdown = 'message' in element.message ? + element.message.message : + this.markdownDecorationsRenderer.convertParsedRequestToMarkdown(element.message); + value = [{ content: new MarkdownString(markdown), kind: 'markdownContent' }]; + } else if (isResponseVM(element)) { + value = annotateSpecialMarkdownContent(element.response.value); + if (element.contentReferences.length) { + value.unshift({ kind: 'references', references: element.contentReferences }); + } + } dom.clearNode(templateData.value); - dom.clearNode(templateData.referencesListContainer); if (isResponseVM(element)) { this.renderDetail(element, templateData); } - this.renderContentReferencesIfNeeded(element, templateData, templateData.elementDisposables); - - let fileTreeIndex = 0; - let codeBlockIndex = 0; + const parts: IChatContentPart[] = []; value.forEach((data, index) => { - const result = data.kind === 'treeData' - ? this.renderTreeData(data.treeData, element, templateData, fileTreeIndex++) - : data.kind === 'markdownContent' - ? this.renderMarkdown(data.content, element, templateData, fillInIncompleteTokens, codeBlockIndex) - : data.kind === 'progressMessage' && onlyProgressMessagesAfterI(value, index) ? this.renderProgressMessage(data, false) - : data.kind === 'progressTask' ? this.renderProgressTask(data, false, element, templateData) - : data.kind === 'command' ? this.instantiationService.createInstance(ChatCommandButtonContentPart, data, element) - : data.kind === 'textEditGroup' ? this.renderTextEdit(element, data, templateData) - : data.kind === 'warning' ? this.instantiationService.createInstance(ChatWarningContentPart, 'warning', data.content, this.renderer) - : data.kind === 'confirmation' ? this.renderConfirmation(element, data, templateData) - : undefined; - - if (result) { - templateData.value.appendChild(result.element); - templateData.elementDisposables.add(result); - - if ('codeBlockCount' in result) { - codeBlockIndex += (result as IChatMarkdownRenderResult).codeBlockCount; - } + const context: IChatContentPartRenderContext = { + element, + index, + content: value, + preceedingContentParts: parts, + }; + const newPart = this.renderChatContentPart(data, templateData, context); + if (newPart) { + templateData.value.appendChild(newPart.domNode); + parts.push(newPart); } }); + templateData.renderedParts = parts; if (isResponseVM(element) && element.errorDetails?.message) { const renderedError = this.instantiationService.createInstance(ChatWarningContentPart, element.errorDetails.responseIsFiltered ? 'info' : 'error', new MarkdownString(element.errorDetails.message), this.renderer); templateData.elementDisposables.add(renderedError); - templateData.value.appendChild(renderedError.element); + templateData.value.appendChild(renderedError.domNode); } const newHeight = templateData.rowContainer.offsetHeight; @@ -550,10 +521,8 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { if (Array.isArray(item)) { const scopedInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, templateData.contextKeyService])); templateData.elementDisposables.add( @@ -565,11 +534,18 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer this._onDidClickFollowup.fire(followup))); } else { - const result = this.renderMarkdown(item as IMarkdownString, element, templateData); - templateData.value.appendChild(result.element); + const context: IChatContentPartRenderContext = { + element, + index: i, + // NA for welcome msg + content: [], + preceedingContentParts: [] + }; + const result = this.renderMarkdown(item, templateData, context); + templateData.value.appendChild(result.domNode); templateData.elementDisposables.add(result); } - } + }); const newHeight = templateData.rowContainer.offsetHeight; const fireEvent = !element.currentRenderedHeight || element.currentRenderedHeight !== newHeight; @@ -588,172 +564,33 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { - const renderedPart = renderedParts[index]; - // Is this part completely new? - if (!renderedPart) { - if (part.kind === 'treeData') { - partsToRender[index] = part.treeData; - } else if (part.kind === 'progressMessage') { - partsToRender[index] = { - progressMessage: part, - isAtEndOfResponse: onlyProgressMessagesAfterI(renderableResponse, index), - isLast: index === renderableResponse.length - 1, - } satisfies IChatProgressMessageRenderData; - } else if (part.kind === 'command' || - part.kind === 'textEditGroup' || - part.kind === 'confirmation' || - part.kind === 'warning') { - partsToRender[index] = part; - } else if (part.kind === 'progressTask') { - partsToRender[index] = { - task: part, - isSettled: part.isSettled?.() ?? true, - progressLength: part.progress.length, - }; - } else { - const wordCountResult = this.getDataForProgressiveRender(element, contentToMarkdown(part.content), { renderedWordCount: 0, lastRenderTime: 0 }); - if (wordCountResult !== undefined) { - this.traceLayout('doNextProgressiveRender', `Rendering new part ${index}, wordCountResult=${wordCountResult.actualWordCount}, rate=${wordCountResult.rate}`); - partsToRender[index] = { - renderedWordCount: wordCountResult.actualWordCount, - lastRenderTime: Date.now(), - isFullyRendered: wordCountResult.isFullString, - originalMarkdown: part.content, - }; - wordCountResults[index] = wordCountResult; - } - } - } - - // Did this part's content change? - else if ((part.kind === 'markdownContent' || part.kind === 'progressMessage') && isMarkdownRenderData(renderedPart)) { // TODO - const wordCountResult = this.getDataForProgressiveRender(element, contentToMarkdown(part.content), renderedPart); - // Check if there are any new words to render - if (wordCountResult !== undefined && renderedPart.renderedWordCount !== wordCountResult?.actualWordCount) { - this.traceLayout('doNextProgressiveRender', `Rendering changed part ${index}, wordCountResult=${wordCountResult.actualWordCount}, rate=${wordCountResult.rate}`); - partsToRender[index] = { - renderedWordCount: wordCountResult.actualWordCount, - lastRenderTime: Date.now(), - isFullyRendered: wordCountResult.isFullString, - originalMarkdown: part.content, - }; - wordCountResults[index] = wordCountResult; - } else if (!renderedPart.isFullyRendered && !wordCountResult) { - // This part is not fully rendered, but not enough time has passed to render more content - somePartIsNotFullyRendered = true; - } - } - - // Is it a progress message that needs to be rerendered? - else if (part.kind === 'progressMessage' && isProgressMessageRenderData(renderedPart) && ( - (renderedPart.isAtEndOfResponse !== onlyProgressMessagesAfterI(renderableResponse, index)) || - renderedPart.isLast !== (index === renderableResponse.length - 1))) { - partsToRender[index] = { - progressMessage: part, - isAtEndOfResponse: onlyProgressMessagesAfterI(renderableResponse, index), - isLast: index === renderableResponse.length - 1, - } satisfies IChatProgressMessageRenderData; - } - - else if (part.kind === 'progressTask' && isProgressTaskRenderData(renderedPart)) { - const isSettled = part.isSettled?.() ?? true; - if (renderedPart.isSettled !== isSettled || part.progress.length !== renderedPart.progressLength || isSettled) { - partsToRender[index] = { task: part, isSettled, progressLength: part.progress.length }; - } - } - }); - - isFullyRendered = partsToRender.filter((p) => !('isSettled' in p) || !p.isSettled).length === 0 && !somePartIsNotFullyRendered; + this.traceLayout('doNextProgressiveRender', `START progressive render, index=${index}, renderData=${JSON.stringify(element.renderData)}`); + const contentForThisTurn = this.getNextProgressiveRenderContent(element); + const partsToRender = this.diff(templateData.renderedParts ?? [], contentForThisTurn, element); + isFullyRendered = partsToRender.every(part => part === null); if (isFullyRendered && element.isComplete) { // Response is done and content is rendered, so do a normal render - this.traceLayout('runProgressiveRender', `end progressive render, index=${index} and clearing renderData, response is complete, index=${index}`); + this.traceLayout('doNextProgressiveRender', `END progressive render, index=${index} and clearing renderData, response is complete`); element.renderData = undefined; - disposables.clear(); - this.basicRenderElement(renderableResponse, element, index, templateData); + this.basicRenderElement(element, index, templateData); + // TODO return here } else if (!isFullyRendered) { - disposables.clear(); - this.renderContentReferencesIfNeeded(element, templateData, disposables); - let hasRenderedOneMarkdownBlock = false; - partsToRender.forEach((partToRender, index) => { - if (!partToRender) { - return; - } - - // Undefined => don't do anything. null => remove the rendered element - let result: { element: HTMLElement } & IDisposable | undefined | null; - if (isInteractiveProgressTreeData(partToRender)) { - result = this.renderTreeData(partToRender, element, templateData, index); - } else if (isProgressMessageRenderData(partToRender)) { - if (onlyProgressMessageRenderDatasAfterI(partsToRender, index)) { - result = this.renderProgressMessage(partToRender.progressMessage, index === partsToRender.length - 1); - } else { - result = null; - } - } else if (isProgressTaskRenderData(partToRender)) { - result = this.renderProgressTask(partToRender.task, !partToRender.isSettled, element, templateData); - } else if (isCommandButtonRenderData(partToRender)) { - result = this.instantiationService.createInstance(ChatCommandButtonContentPart, partToRender, element); - } else if (isTextEditRenderData(partToRender)) { - result = this.renderTextEdit(element, partToRender, templateData); - } else if (isConfirmationRenderData(partToRender)) { - result = this.renderConfirmation(element, partToRender, templateData); - } else if (isWarningRenderData(partToRender)) { - result = this.instantiationService.createInstance(ChatWarningContentPart, 'warning', partToRender.content, this.renderer); - } - - // Avoid doing progressive rendering for multiple markdown parts simultaneously - else if (!hasRenderedOneMarkdownBlock && wordCountResults[index]) { - const { value } = wordCountResults[index]; - const part = partsToRender[index]; - const originalMarkdown = 'originalMarkdown' in part ? part.originalMarkdown : undefined; - const markdownToRender = new MarkdownString(value, originalMarkdown); - result = this.renderMarkdown(markdownToRender, element, templateData, true); - hasRenderedOneMarkdownBlock = true; - } - - if (result === undefined) { - return; - } - - // Doing the progressive render - renderedParts[index] = partToRender; - const existingElement = templateData.value.children[index]; - if (existingElement) { - if (result === null) { - templateData.value.replaceChild($('span.placeholder-for-deleted-thing'), existingElement); - } else { - templateData.value.replaceChild(result.element, existingElement); - } - } else if (result) { - templateData.value.appendChild(result.element); - } - - if (result) { - disposables.add(result); - } - }); + this.traceLayout('doNextProgressiveRender', `doing progressive render, ${partsToRender.length} parts to render`); + this.renderChatContentDiff(partsToRender, contentForThisTurn, element, templateData); } else { // Nothing new to render, not done, keep waiting return false; @@ -770,228 +607,265 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer void } { - const store = new DisposableStore(); - const treePart = store.add(this.instantiationService.createInstance(ChatTreeContentPart, data, element, this._treePool, treeDataIndex)); + private renderChatContentDiff(partsToRender: ReadonlyArray, contentForThisTurn: ReadonlyArray, element: IChatResponseViewModel, templateData: IChatListItemTemplate): void { + const renderedParts = templateData.renderedParts ?? []; + templateData.renderedParts = renderedParts; + partsToRender.forEach((partToRender, index) => { + if (!partToRender) { + // null=no change + return; + } - store.add(treePart.onDidChangeHeight(() => { - this.updateItemHeight(templateData); - })); + const alreadyRenderedPart = templateData.renderedParts?.[index]; + if (alreadyRenderedPart) { + alreadyRenderedPart.dispose(); + } - if (isResponseVM(element)) { - const fileTreeFocusInfo = { - treeDataId: data.uri.toString(), - treeIndex: treeDataIndex, - focus() { - treePart.domFocus(); - } + const preceedingContentParts = renderedParts.slice(0, index); + const context: IChatContentPartRenderContext = { + element, + content: contentForThisTurn, + preceedingContentParts, + index }; + const newPart = this.renderChatContentPart(partToRender, templateData, context); + if (newPart) { + // Maybe the part can't be rendered in this context, but this shouldn't really happen + if (alreadyRenderedPart) { + try { + // This method can throw HierarchyRequestError + alreadyRenderedPart.domNode.replaceWith(newPart.domNode); + } catch (err) { + this.logService.error('ChatListItemRenderer#renderChatContentDiff: error replacing part', err); + } + } else { + templateData.value.appendChild(newPart.domNode); + } - // TODO@roblourens there's got to be a better way to navigate trees - store.add(treePart.onDidFocus(() => { - this.focusedFileTreesByResponseId.set(element.id, fileTreeFocusInfo.treeIndex); - })); + renderedParts[index] = newPart; + } else if (alreadyRenderedPart) { + alreadyRenderedPart.domNode.remove(); + } + }); + } - const fileTrees = this.fileTreesByResponseId.get(element.id) ?? []; - fileTrees.push(fileTreeFocusInfo); - this.fileTreesByResponseId.set(element.id, distinct(fileTrees, (v) => v.treeDataId)); - store.add(toDisposable(() => this.fileTreesByResponseId.set(element.id, fileTrees.filter(v => v.treeDataId !== data.uri.toString())))); + /** + * Returns all content parts that should be rendered, and trimmed markdown content. We will diff this with the current rendered set. + */ + private getNextProgressiveRenderContent(element: IChatResponseViewModel): IChatRendererContent[] { + const data = this.getDataForProgressiveRender(element); + + const renderableResponse = annotateSpecialMarkdownContent(element.response.value); + + this.traceLayout('getNextProgressiveRenderContent', `Want to render ${data.numWordsToRender}, counting...`); + let numNeededWords = data.numWordsToRender; + const partsToRender: IChatRendererContent[] = []; + if (element.contentReferences.length) { + partsToRender.push({ kind: 'references', references: element.contentReferences }); + } + + for (const part of renderableResponse) { + if (numNeededWords <= 0) { + break; + } + + if (part.kind === 'markdownContent') { + const wordCountResult = getNWords(part.content.value, numNeededWords); + if (wordCountResult.isFullString) { + partsToRender.push(part); + } else { + partsToRender.push({ kind: 'markdownContent', content: new MarkdownString(wordCountResult.value, part.content) }); + } + + this.traceLayout('getNextProgressiveRenderContent', ` Want to render ${numNeededWords} words and found ${wordCountResult.returnedWordCount} words. Total words in chunk: ${wordCountResult.totalWordCount}`); + numNeededWords -= wordCountResult.returnedWordCount; + } else { + partsToRender.push(part); + } + } + + this.traceLayout('getNextProgressiveRenderContent', `Want to render ${data.numWordsToRender} words and ${data.numWordsToRender - numNeededWords} words available`); + const newRenderedWordCount = data.numWordsToRender - numNeededWords; + if (newRenderedWordCount !== element.renderData?.renderedWordCount) { + // Only update lastRenderTime when we actually render new content + element.renderData = { lastRenderTime: Date.now(), renderedWordCount: newRenderedWordCount, renderedParts: partsToRender }; } + return partsToRender; + } + + private getDataForProgressiveRender(element: IChatResponseViewModel) { + const renderData = element.renderData ?? { lastRenderTime: 0, renderedWordCount: 0 }; + + const rate = this.getProgressiveRenderRate(element); + const numWordsToRender = renderData.lastRenderTime === 0 ? + 1 : + renderData.renderedWordCount + + // Additional words to render beyond what's already rendered + Math.floor((Date.now() - renderData.lastRenderTime) / 1000 * rate); + return { - element: treePart.element, - dispose: () => store.dispose() + numWordsToRender, + rate }; } - private renderContentReferencesIfNeeded(element: ChatTreeItem, templateData: IChatListItemTemplate, disposables: DisposableStore): void { - if (isResponseVM(element) && this._usedReferencesEnabled && element.contentReferences.length) { - dom.show(templateData.referencesListContainer); - const contentReferencesListResult = this.renderContentReferencesListData(null, element.contentReferences, element, templateData); - if (templateData.referencesListContainer.firstChild) { - templateData.referencesListContainer.replaceChild(contentReferencesListResult.element, templateData.referencesListContainer.firstChild!); + private diff(renderedParts: ReadonlyArray, contentToRender: ReadonlyArray, element: ChatTreeItem): ReadonlyArray { + const diff: (IChatRendererContent | null)[] = []; + for (let i = 0; i < contentToRender.length; i++) { + const content = contentToRender[i]; + const renderedPart = renderedParts[i]; + + if (!renderedPart || !renderedPart.hasSameContent(content, contentToRender.slice(i + 1), element)) { + diff.push(content); } else { - templateData.referencesListContainer.appendChild(contentReferencesListResult.element); + // null -> no change + diff.push(null); } - disposables.add(contentReferencesListResult); - } else { - dom.hide(templateData.referencesListContainer); } + + return diff; } - private renderContentReferencesListData(task: IChatTask | null, data: ReadonlyArray, element: IChatResponseViewModel, templateData: IChatListItemTemplate): { element: HTMLElement; dispose: () => void } { - const listDisposables = new DisposableStore(); - const referencesLabel = task?.content.value ?? (data.length > 1 ? - localize('usedReferencesPlural', "Used {0} references", data.length) : - localize('usedReferencesSingular', "Used {0} reference", 1)); - const iconElement = $('.chat-used-context-icon'); - const icon = (element: IChatResponseViewModel) => element.usedReferencesExpanded ? Codicon.chevronDown : Codicon.chevronRight; - iconElement.classList.add(...ThemeIcon.asClassNameArray(icon(element))); - const buttonElement = $('.chat-used-context-label', undefined); - - const collapseButton = listDisposables.add(new Button(buttonElement, { - buttonBackground: undefined, - buttonBorder: undefined, - buttonForeground: undefined, - buttonHoverBackground: undefined, - buttonSecondaryBackground: undefined, - buttonSecondaryForeground: undefined, - buttonSecondaryHoverBackground: undefined, - buttonSeparator: undefined - })); - const container = $('.chat-used-context', undefined, buttonElement); - collapseButton.label = referencesLabel; - collapseButton.element.prepend(iconElement); - this.updateAriaLabel(collapseButton.element, referencesLabel, element.usedReferencesExpanded); - container.classList.toggle('chat-used-context-collapsed', !element.usedReferencesExpanded); - listDisposables.add(collapseButton.onDidClick(() => { - iconElement.classList.remove(...ThemeIcon.asClassNameArray(icon(element))); - element.usedReferencesExpanded = !element.usedReferencesExpanded; - iconElement.classList.add(...ThemeIcon.asClassNameArray(icon(element))); - container.classList.toggle('chat-used-context-collapsed', !element.usedReferencesExpanded); + private renderChatContentPart(content: IChatRendererContent, templateData: IChatListItemTemplate, context: IChatContentPartRenderContext): IChatContentPart | undefined { + if (content.kind === 'treeData') { + return this.renderTreeData(content, templateData, context); + } else if (content.kind === 'progressMessage') { + return this.instantiationService.createInstance(ChatProgressContentPart, content, this.renderer, context); + } else if (content.kind === 'progressTask') { + return this.renderProgressTask(content, templateData, context); + } else if (content.kind === 'command') { + return this.instantiationService.createInstance(ChatCommandButtonContentPart, content, context); + } else if (content.kind === 'textEditGroup') { + return this.renderTextEdit(context, content, templateData); + } else if (content.kind === 'confirmation') { + return this.renderConfirmation(context, content, templateData); + } else if (content.kind === 'warning') { + return this.instantiationService.createInstance(ChatWarningContentPart, 'warning', content.content, this.renderer); + } else if (content.kind === 'markdownContent') { + return this.renderMarkdown(content.content, templateData, context); + } else if (content.kind === 'references') { + return this.renderContentReferencesListData(content, undefined, context, templateData); + } + + return undefined; + } + + private renderTreeData(content: IChatTreeData, templateData: IChatListItemTemplate, context: IChatContentPartRenderContext): IChatContentPart { + const data = content.treeData; + const treeDataIndex = context.preceedingContentParts.filter(part => part instanceof ChatTreeContentPart).length; + const treePart = this.instantiationService.createInstance(ChatTreeContentPart, data, context.element, this._treePool, treeDataIndex); + + treePart.addDisposable(treePart.onDidChangeHeight(() => { this.updateItemHeight(templateData); - this.updateAriaLabel(collapseButton.element, referencesLabel, element.usedReferencesExpanded); })); - const ref = listDisposables.add(this._contentReferencesListPool.get()); - const list = ref.object; - container.appendChild(list.getHTMLElement().parentElement!); - - listDisposables.add(list.onDidOpen((e) => { - if (e.element && 'reference' in e.element) { - const uriOrLocation = 'variableName' in e.element.reference ? e.element.reference.value : e.element.reference; - const uri = URI.isUri(uriOrLocation) ? uriOrLocation : - uriOrLocation?.uri; - if (uri) { - this.openerService.open( - uri, - { - fromUserGesture: true, - editorOptions: { - ...e.editorOptions, - ...{ - selection: uriOrLocation && 'range' in uriOrLocation ? uriOrLocation.range : undefined - } - } - }); + if (isResponseVM(context.element)) { + const fileTreeFocusInfo = { + treeDataId: data.uri.toString(), + treeIndex: treeDataIndex, + focus() { + treePart.domFocus(); } - } - })); - listDisposables.add(list.onContextMenu((e) => { - e.browserEvent.preventDefault(); - e.browserEvent.stopPropagation(); - })); + }; - const maxItemsShown = 6; - const itemsShown = Math.min(data.length, maxItemsShown); - const height = itemsShown * 22; - list.layout(height); - list.getHTMLElement().style.height = `${height}px`; - list.splice(0, list.length, data); + // TODO@roblourens there's got to be a better way to navigate trees + treePart.addDisposable(treePart.onDidFocus(() => { + this.focusedFileTreesByResponseId.set(context.element.id, fileTreeFocusInfo.treeIndex); + })); - return { - element: container, - dispose: () => { - listDisposables.dispose(); - } - }; + const fileTrees = this.fileTreesByResponseId.get(context.element.id) ?? []; + fileTrees.push(fileTreeFocusInfo); + this.fileTreesByResponseId.set(context.element.id, distinct(fileTrees, (v) => v.treeDataId)); + treePart.addDisposable(toDisposable(() => this.fileTreesByResponseId.set(context.element.id, fileTrees.filter(v => v.treeDataId !== data.uri.toString())))); + } + + return treePart; } - private updateAriaLabel(element: HTMLElement, label: string, expanded?: boolean): void { - element.ariaLabel = expanded ? localize('usedReferencesExpanded', "{0}, expanded", label) : localize('usedReferencesCollapsed', "{0}, collapsed", label); + private renderContentReferencesListData(references: IChatReferences, labelOverride: string | undefined, context: IChatContentPartRenderContext, templateData: IChatListItemTemplate): ChatReferencesContentPart { + const referencesPart = this.instantiationService.createInstance(ChatReferencesContentPart, references.references, labelOverride, context.element as IChatResponseViewModel, this._contentReferencesListPool); + referencesPart.addDisposable(referencesPart.onDidChangeHeight(() => { + this.updateItemHeight(templateData); + })); + + return referencesPart; } - private renderProgressTask(task: IChatTask, showSpinner: boolean, element: ChatTreeItem, templateData: IChatListItemTemplate): IMarkdownRenderResult | undefined { - if (!isResponseVM(element)) { + private renderProgressTask(task: IChatTask, templateData: IChatListItemTemplate, context: IChatContentPartRenderContext): IChatContentPart | undefined { + if (!isResponseVM(context.element)) { return; } - if (task.progress.length) { - const refs = this.renderContentReferencesListData(task, task.progress, element, templateData); - const node = dom.$('.chat-progress-task'); - node.appendChild(refs.element); - return { element: node, dispose: refs.dispose }; - } - - return this.renderProgressMessage(task, showSpinner); + const taskPart = this.instantiationService.createInstance(ChatTaskContentPart, task, this._contentReferencesListPool, this.renderer, context); + taskPart.addDisposable(taskPart.onDidChangeHeight(() => { + this.updateItemHeight(templateData); + })); + return taskPart; } - private renderProgressMessage(progress: IChatProgressMessage | IChatTask, showSpinner: boolean): IMarkdownRenderResult { - return this.instantiationService.createInstance(ChatProgressContentPart, progress, showSpinner, this.renderer); + private renderConfirmation(context: IChatContentPartRenderContext, confirmation: IChatConfirmation, templateData: IChatListItemTemplate): IChatContentPart { + const part = this.instantiationService.createInstance(ChatConfirmationContentPart, confirmation, context); + part.addDisposable(part.onDidChangeHeight(() => this.updateItemHeight(templateData))); + return part; } - private renderConfirmation(element: ChatTreeItem, confirmation: IChatConfirmation, templateData: IChatListItemTemplate): IMarkdownRenderResult | undefined { - const store = new DisposableStore(); - const part = store.add(this.instantiationService.createInstance(ChatConfirmationContentPart, confirmation, element)); - store.add(part.onDidChangeHeight(() => this.updateItemHeight(templateData))); - return { - element: part.element, - dispose() { store.dispose(); } - }; - } - - private renderTextEdit(element: ChatTreeItem, chatTextEdit: IChatTextEditGroup, templateData: IChatListItemTemplate): IMarkdownRenderResult | undefined { - - const store = new DisposableStore(); - const textEditPart = store.add(this.instantiationService.createInstance(ChatTextEditContentPart, chatTextEdit, element, this.rendererOptions, this._diffEditorPool, this._currentLayoutWidth)); - store.add(textEditPart.onDidChangeHeight(() => { + private renderTextEdit(context: IChatContentPartRenderContext, chatTextEdit: IChatTextEditGroup, templateData: IChatListItemTemplate): IChatContentPart { + const textEditPart = this.instantiationService.createInstance(ChatTextEditContentPart, chatTextEdit, context, this.rendererOptions, this._diffEditorPool, this._currentLayoutWidth); + textEditPart.addDisposable(textEditPart.onDidChangeHeight(() => { textEditPart.layout(this._currentLayoutWidth); this.updateItemHeight(templateData); })); - return { - element: textEditPart.element, - dispose() { store.dispose(); } - }; + return textEditPart; } - private renderMarkdown(markdown: IMarkdownString, element: ChatTreeItem, templateData: IChatListItemTemplate, fillInIncompleteTokens = false, codeBlockStartIndex = 0): IChatMarkdownRenderResult { - const store = new DisposableStore(); - // TODO@roblourens too many parameters - const markdownPart = store.add(this.instantiationService.createInstance(ChatMarkdownContentPart, markdown, element, this._editorPool, fillInIncompleteTokens, codeBlockStartIndex, this.renderer, this._currentLayoutWidth, this.codeBlockModelCollection, this.rendererOptions)); - store.add(markdownPart.onDidChangeHeight(() => { + private renderMarkdown(markdown: IMarkdownString, templateData: IChatListItemTemplate, context: IChatContentPartRenderContext): IChatContentPart { + const element = context.element; + const fillInIncompleteTokens = isResponseVM(element) && (!element.isComplete || element.isCanceled || element.errorDetails?.responseIsFiltered || element.errorDetails?.responseIsIncomplete); + const codeBlockStartIndex = context.preceedingContentParts.reduce((acc, part) => acc + (part instanceof ChatMarkdownContentPart ? part.codeblocks.length : 0), 0); + const markdownPart = this.instantiationService.createInstance(ChatMarkdownContentPart, markdown, context, this._editorPool, fillInIncompleteTokens, codeBlockStartIndex, this.renderer, this._currentLayoutWidth, this.codeBlockModelCollection, this.rendererOptions); + markdownPart.addDisposable(markdownPart.onDidChangeHeight(() => { markdownPart.layout(this._currentLayoutWidth); this.updateItemHeight(templateData); })); - this.codeBlocksByResponseId.set(element.id, markdownPart.codeblocks); - store.add(toDisposable(() => this.codeBlocksByResponseId.delete(element.id))); - markdownPart.codeblocks.forEach(info => { + const codeBlocksByResponseId = this.codeBlocksByResponseId.get(element.id) ?? []; + this.codeBlocksByResponseId.set(element.id, codeBlocksByResponseId); + markdownPart.addDisposable(toDisposable(() => { + const codeBlocksByResponseId = this.codeBlocksByResponseId.get(element.id); + if (codeBlocksByResponseId) { + markdownPart.codeblocks.forEach((info, i) => delete codeBlocksByResponseId[codeBlockStartIndex + i]); + } + })); + + markdownPart.codeblocks.forEach((info, i) => { + codeBlocksByResponseId[codeBlockStartIndex + i] = info; if (info.uri) { const uri = info.uri; this.codeBlocksByEditorUri.set(uri, info); - this._register(toDisposable(() => this.codeBlocksByEditorUri.delete(uri))); + markdownPart.addDisposable(toDisposable(() => this.codeBlocksByEditorUri.delete(uri))); } }); - return { - codeBlockCount: markdownPart.codeBlockCount, - element: markdownPart.element, - dispose() { - store.dispose(); - } - }; + return markdownPart; } - private getDataForProgressiveRender(element: IChatResponseViewModel, data: IMarkdownString, renderData: Pick): IWordCountResult & { rate: number } | undefined { - const rate = this.getProgressiveRenderRate(element); - const numWordsToRender = renderData.lastRenderTime === 0 ? - 1 : - renderData.renderedWordCount + - // Additional words to render beyond what's already rendered - Math.floor((Date.now() - renderData.lastRenderTime) / 1000 * rate); - - if (numWordsToRender === renderData.renderedWordCount) { - return undefined; + disposeElement(node: ITreeNode, index: number, templateData: IChatListItemTemplate): void { + this.traceLayout('disposeElement', `Disposing element, index=${index}`); + + // We could actually reuse a template across a renderElement call? + if (templateData.renderedParts) { + try { + dispose(coalesce(templateData.renderedParts)); + templateData.renderedParts = undefined; + dom.clearNode(templateData.value); + } catch (err) { + throw err; + } } - return { - ...getNWords(data.value, numWordsToRender), - rate - }; - } - - disposeElement(node: ITreeNode, index: number, templateData: IChatListItemTemplate): void { + templateData.currentElement = undefined; templateData.elementDisposables.clear(); } @@ -1030,226 +904,9 @@ export class ChatListDelegate implements IListVirtualDelegate { } } -class ContentReferencesListPool extends Disposable { - private _pool: ResourcePool>; - - public get inUse(): ReadonlySet> { - return this._pool.inUse; - } - - constructor( - private _onDidChangeVisibility: Event, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IThemeService private readonly themeService: IThemeService, - ) { - super(); - this._pool = this._register(new ResourcePool(() => this.listFactory())); - } - - private listFactory(): WorkbenchList { - const resourceLabels = this._register(this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this._onDidChangeVisibility })); - - const container = $('.chat-used-context-list'); - this._register(createFileIconThemableTreeContainerScope(container, this.themeService)); - - const list = this.instantiationService.createInstance( - WorkbenchList, - 'ChatListRenderer', - container, - new ContentReferencesListDelegate(), - [this.instantiationService.createInstance(ContentReferencesListRenderer, resourceLabels)], - { - alwaysConsumeMouseWheel: false, - accessibilityProvider: { - getAriaLabel: (element: IChatContentReference | IChatWarningMessage) => { - if (element.kind === 'warning') { - return element.content.value; - } - const reference = element.reference; - if ('variableName' in reference) { - return reference.variableName; - } else if (URI.isUri(reference)) { - return basename(reference.path); - } else { - return basename(reference.uri.path); - } - }, - - getWidgetAriaLabel: () => localize('usedReferences', "Used References") - }, - dnd: { - getDragURI: (element: IChatContentReference | IChatWarningMessage) => { - if (element.kind === 'warning') { - return null; - } - const { reference } = element; - if ('variableName' in reference) { - return null; - } else if (URI.isUri(reference)) { - return reference.toString(); - } else { - return reference.uri.toString(); - } - }, - dispose: () => { }, - onDragOver: () => false, - drop: () => { }, - }, - }); - - return list; - } - - get(): IDisposableReference> { - const object = this._pool.get(); - let stale = false; - return { - object, - isStale: () => stale, - dispose: () => { - stale = true; - this._pool.release(object); - } - }; - } -} - -class ContentReferencesListDelegate implements IListVirtualDelegate { - getHeight(element: IChatContentReference): number { - return 22; - } - - getTemplateId(element: IChatContentReference): string { - return ContentReferencesListRenderer.TEMPLATE_ID; - } -} - -interface IChatContentReferenceListTemplate { - label: IResourceLabel; - templateDisposables: IDisposable; -} - -class ContentReferencesListRenderer implements IListRenderer { - static TEMPLATE_ID = 'contentReferencesListRenderer'; - readonly templateId: string = ContentReferencesListRenderer.TEMPLATE_ID; - - constructor( - private labels: ResourceLabels, - @IThemeService private readonly themeService: IThemeService, - @IChatVariablesService private readonly chatVariablesService: IChatVariablesService, - ) { } - - renderTemplate(container: HTMLElement): IChatContentReferenceListTemplate { - const templateDisposables = new DisposableStore(); - const label = templateDisposables.add(this.labels.create(container, { supportHighlights: true })); - return { templateDisposables, label }; - } - - - private getReferenceIcon(data: IChatContentReference): URI | ThemeIcon | undefined { - if (ThemeIcon.isThemeIcon(data.iconPath)) { - return data.iconPath; - } else { - return this.themeService.getColorTheme().type === ColorScheme.DARK && data.iconPath?.dark - ? data.iconPath?.dark - : data.iconPath?.light; - } - } - - renderElement(data: IChatContentReference | IChatWarningMessage, index: number, templateData: IChatContentReferenceListTemplate, height: number | undefined): void { - if (data.kind === 'warning') { - templateData.label.setResource({ name: data.content.value }, { icon: Codicon.warning }); - return; - } - - const reference = data.reference; - const icon = this.getReferenceIcon(data); - templateData.label.element.style.display = 'flex'; - if ('variableName' in reference) { - if (reference.value) { - const uri = URI.isUri(reference.value) ? reference.value : reference.value.uri; - templateData.label.setResource( - { - resource: uri, - name: basenameOrAuthority(uri), - description: `#${reference.variableName}`, - range: 'range' in reference.value ? reference.value.range : undefined, - }, { icon }); - } else { - const variable = this.chatVariablesService.getVariable(reference.variableName); - templateData.label.setLabel(`#${reference.variableName}`, undefined, { title: variable?.description }); - } - } else { - const uri = 'uri' in reference ? reference.uri : reference; - if (matchesSomeScheme(uri, Schemas.mailto, Schemas.http, Schemas.https)) { - templateData.label.setResource({ resource: uri, name: uri.toString() }, { icon: icon ?? Codicon.globe }); - } else { - templateData.label.setFile(uri, { - fileKind: FileKind.FILE, - // Should not have this live-updating data on a historical reference - fileDecorations: { badges: false, colors: false }, - range: 'range' in reference ? reference.range : undefined - }); - } - } - } - - disposeTemplate(templateData: IChatContentReferenceListTemplate): void { - templateData.templateDisposables.dispose(); - } -} - class ChatVoteButton extends MenuEntryActionViewItem { override render(container: HTMLElement): void { super.render(container); container.classList.toggle('checked', this.action.checked); } } - -function isInteractiveProgressTreeData(item: Object): item is IChatResponseProgressFileTreeData { - return 'label' in item; -} - -function contentToMarkdown(str: string | IMarkdownString): IMarkdownString { - return typeof str === 'string' ? { value: str } : str; -} - -function isProgressMessage(item: any): item is IChatProgressMessage { - return item && 'kind' in item && item.kind === 'progressMessage'; -} - -function isProgressTaskRenderData(item: any): item is IChatTaskRenderData { - return item && 'isSettled' in item; -} - -function isWarningRenderData(item: any): item is IChatWarningMessage { - return item && 'kind' in item && item.kind === 'warning'; -} - -function isProgressMessageRenderData(item: IChatRenderData): item is IChatProgressMessageRenderData { - return item && 'isAtEndOfResponse' in item; -} - -function isCommandButtonRenderData(item: IChatRenderData): item is IChatCommandButton { - return item && 'kind' in item && item.kind === 'command'; -} - -function isTextEditRenderData(item: IChatRenderData): item is IChatTextEditGroup { - return item && 'kind' in item && item.kind === 'textEditGroup'; -} - -function isConfirmationRenderData(item: IChatRenderData): item is IChatConfirmation { - return item && 'kind' in item && item.kind === 'confirmation'; -} - -function isMarkdownRenderData(item: IChatRenderData): item is IChatResponseMarkdownRenderData { - return item && 'renderedWordCount' in item; -} - -function onlyProgressMessagesAfterI(items: ReadonlyArray, i: number): boolean { - return items.slice(i).every(isProgressMessage); -} - -function onlyProgressMessageRenderDatasAfterI(items: ReadonlyArray, i: number): boolean { - return items.slice(i).every(isProgressMessageRenderData); -} diff --git a/src/vs/workbench/contrib/chat/browser/media/chat.css b/src/vs/workbench/contrib/chat/browser/media/chat.css index 4f1630bc809ab..15187d25da4c2 100644 --- a/src/vs/workbench/contrib/chat/browser/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/media/chat.css @@ -172,8 +172,8 @@ width: 100%; } -.interactive-item-container .chat-progress-task { - padding-bottom: 8px; +.interactive-item-container > .value .chat-used-context { + margin-bottom: 8px; } .interactive-item-container .value .rendered-markdown table { diff --git a/src/vs/workbench/contrib/chat/common/annotations.ts b/src/vs/workbench/contrib/chat/common/annotations.ts index 8a57732c95daf..449ff1bc2dd95 100644 --- a/src/vs/workbench/contrib/chat/common/annotations.ts +++ b/src/vs/workbench/contrib/chat/common/annotations.ts @@ -11,7 +11,7 @@ import { IChatAgentVulnerabilityDetails, IChatMarkdownContent } from 'vs/workben export const contentRefUrl = 'http://_vscodecontentref_'; // must be lowercase for URI -export function annotateSpecialMarkdownContent(response: ReadonlyArray): ReadonlyArray { +export function annotateSpecialMarkdownContent(response: ReadonlyArray): IChatProgressRenderableResponseContent[] { const result: IChatProgressRenderableResponseContent[] = []; for (const item of response) { const previousItem = result[result.length - 1]; diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index d03364fab2a82..3e71298a2cb2a 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -232,7 +232,7 @@ export class Response implements IResponse { // Replace the resolving part's content with the resolved response if (typeof content === 'string') { - this._responseParts[responsePosition] = { ...progress, content: new MarkdownString(content) }; + (this._responseParts[responsePosition] as IChatTask).content = new MarkdownString(content); } this._updateRepr(false); }); diff --git a/src/vs/workbench/contrib/chat/common/chatViewModel.ts b/src/vs/workbench/contrib/chat/common/chatViewModel.ts index 130ef76979b17..bde3c18d39916 100644 --- a/src/vs/workbench/contrib/chat/common/chatViewModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatViewModel.ts @@ -13,9 +13,9 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ILogService } from 'vs/platform/log/common/log'; import { annotateVulnerabilitiesInText } from 'vs/workbench/contrib/chat/common/annotations'; import { getFullyQualifiedId, IChatAgentCommand, IChatAgentData, IChatAgentNameService, IChatAgentResult } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { ChatModelInitState, IChatModel, IChatRequestModel, IChatResponseModel, IChatTextEditGroup, IChatWelcomeMessageContent, IResponse } from 'vs/workbench/contrib/chat/common/chatModel'; +import { ChatModelInitState, IChatModel, IChatProgressRenderableResponseContent, IChatRequestModel, IChatResponseModel, IChatTextEditGroup, IChatWelcomeMessageContent, IResponse } from 'vs/workbench/contrib/chat/common/chatModel'; import { IParsedChatRequest } from 'vs/workbench/contrib/chat/common/chatParserTypes'; -import { ChatAgentVoteDirection, IChatCommandButton, IChatConfirmation, IChatContentReference, IChatFollowup, IChatProgressMessage, IChatResponseErrorDetails, IChatResponseProgressFileTreeData, IChatTask, IChatUsedContext, IChatWarningMessage } from 'vs/workbench/contrib/chat/common/chatService'; +import { ChatAgentVoteDirection, IChatContentReference, IChatFollowup, IChatProgressMessage, IChatResponseErrorDetails, IChatTask, IChatUsedContext } from 'vs/workbench/contrib/chat/common/chatService'; import { countWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; import { CodeBlockModelCollection } from './codeBlockModelCollection'; @@ -78,6 +78,13 @@ export interface IChatResponseMarkdownRenderData { originalMarkdown: IMarkdownString; } +export interface IChatResponseMarkdownRenderData2 { + renderedWordCount: number; + lastRenderTime: number; + isFullyRendered: boolean; + originalMarkdown: IMarkdownString; +} + export interface IChatProgressMessageRenderData { progressMessage: IChatProgressMessage; @@ -101,11 +108,26 @@ export interface IChatTaskRenderData { progressLength: number; } -export type IChatRenderData = IChatResponseProgressFileTreeData | IChatResponseMarkdownRenderData | IChatProgressMessageRenderData | IChatCommandButton | IChatTextEditGroup | IChatConfirmation | IChatTaskRenderData | IChatWarningMessage; export interface IChatResponseRenderData { - renderedParts: IChatRenderData[]; + renderedParts: IChatRendererContent[]; + + renderedWordCount: number; + lastRenderTime: number; } +/** + * Content type for references used during rendering, not in the model + */ +export interface IChatReferences { + references: ReadonlyArray; + kind: 'references'; +} + +/** + * Type for content parts rendered by IChatListRenderer + */ +export type IChatRendererContent = IChatProgressRenderableResponseContent | IChatReferences; + export interface IChatLiveUpdateData { loadingStartTime: number; lastUpdateTime: number; diff --git a/src/vs/workbench/contrib/chat/common/chatWordCounter.ts b/src/vs/workbench/contrib/chat/common/chatWordCounter.ts index c3b7ff8822c53..edd27ddc435d6 100644 --- a/src/vs/workbench/contrib/chat/common/chatWordCounter.ts +++ b/src/vs/workbench/contrib/chat/common/chatWordCounter.ts @@ -5,7 +5,8 @@ export interface IWordCountResult { value: string; - actualWordCount: number; + returnedWordCount: number; + totalWordCount: number; isFullString: boolean; } @@ -22,12 +23,13 @@ export function getNWords(str: string, numWordsToCount: number): IWordCountResul const value = str.substring(0, endIndex); return { value, - actualWordCount: targetWords.length === 0 ? (value.length ? 1 : 0) : targetWords.length, - isFullString: endIndex >= str.length + returnedWordCount: targetWords.length === 0 ? (value.length ? 1 : 0) : targetWords.length, + isFullString: endIndex >= str.length, + totalWordCount: allWordMatches.length }; } export function countWords(str: string): number { const result = getNWords(str, Number.MAX_SAFE_INTEGER); - return result.actualWordCount; + return result.returnedWordCount; } diff --git a/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts b/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts index c6d32a8d93643..9330dc5be750b 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts @@ -13,7 +13,7 @@ suite('ChatWordCounter', () => { function doTest(str: string, nWords: number, resultStr: string) { const result = getNWords(str, nWords); assert.strictEqual(result.value, resultStr); - assert.strictEqual(result.actualWordCount, nWords); + assert.strictEqual(result.returnedWordCount, nWords); } test('getNWords, matching actualWordCount', () => { From 524d1ecedd33104381e7e0a6715c13813128f89c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Sun, 23 Jun 2024 17:00:13 +0200 Subject: [PATCH 437/755] use progressService for code mapper (#216910) --- .../browser/actions/chatCodeblockActions.ts | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts index a353556970d93..01f026310defe 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts @@ -17,12 +17,14 @@ import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModel } from 'vs/editor/common/model'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { CopyAction } from 'vs/editor/contrib/clipboard/browser/clipboard'; -import { localize2 } from 'vs/nls'; +import { localize, localize2 } from 'vs/nls'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { TerminalLocation } from 'vs/platform/terminal/common/terminal'; import { IUntitledTextResourceEditorInput } from 'vs/workbench/common/editor'; import { accessibleViewInCodeBlock } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; @@ -267,6 +269,8 @@ export function registerChatCodeBlockActions() { const bulkEditService = accessor.get(IBulkEditService); const codeEditorService = accessor.get(ICodeEditorService); + const progressService = accessor.get(IProgressService); + const notificationService = accessor.get(INotificationService); const mappedEditsProviders = accessor.get(ILanguageFeaturesService).mappedEditsProvider.ordered(activeModel); @@ -301,20 +305,39 @@ export function registerChatCodeBlockActions() { docRefs.push(usedDocuments); } - let i = 0; - do { - const cancellationTokenSource = new CancellationTokenSource(); - - mappedEdits = await mappedEditsProviders[i].provideMappedEdits( - activeModel, - [codeBlockActionContext.code], - { documents: docRefs }, - cancellationTokenSource.token); + const cancellationTokenSource = new CancellationTokenSource(); + + try { + mappedEdits = await progressService.withProgress( + { location: ProgressLocation.Notification, delay: 500, sticky: true, cancellable: true }, + async progress => { + progress.report({ message: localize('applyCodeBlock.progress', "Applying code block...") }); + + for (const provider of mappedEditsProviders) { + const mappedEdits = await provider.provideMappedEdits( + activeModel, + [codeBlockActionContext.code], + { documents: docRefs }, + cancellationTokenSource.token + ); + if (mappedEdits) { + return mappedEdits; + } + } + return null; + }, + () => cancellationTokenSource.cancel() + ); + } catch (e) { + notificationService.notify({ severity: Severity.Error, message: localize('applyCodeBlock.error', "Failed to apply code block: {0}", e.message) }); + } finally { + cancellationTokenSource.dispose(); + } - } while (!mappedEdits && ++i < mappedEditsProviders.length); } if (mappedEdits) { + console.log('Mapped edits:', mappedEdits); await bulkEditService.apply(mappedEdits); } else { const activeSelection = codeEditor.getSelection() ?? new Range(activeModel.getLineCount(), 1, activeModel.getLineCount(), 1); From 34107733c7c7f64e7ca2266e2b618ec695af3c81 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sun, 23 Jun 2024 23:45:19 -0700 Subject: [PATCH 438/755] Fix tsc -p ./src, remove no-default-lib (#216760) --- src/tsconfig.json | 1 - src/vs/workbench/contrib/webview/browser/pre/service-worker.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/tsconfig.json b/src/tsconfig.json index 257ea8879f4b0..27f975eb50281 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -44,7 +44,6 @@ "./vs/code/electron-sandbox/processExplorer/processExplorer.js", "./vs/code/electron-sandbox/workbench/workbench.js", "./vs/workbench/contrib/issue/electron-sandbox/issueReporter.js", - "./vs/workbench/contrib/webview/browser/pre/service-worker.js", "./typings", "./vs/**/*.ts", "vscode-dts/vscode.proposed.*.d.ts", diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index 1da9709c314c5..e5fa674ea8224 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check -/// /// const sw = /** @type {ServiceWorkerGlobalScope} */ (/** @type {any} */ (self)); From feae5bf5d6b6807a7723075b56451adbc7ac7d4d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2024 09:50:48 +0200 Subject: [PATCH 439/755] make sure errors are recreated when making LM requests (#216807) * add integration tests for LanguageModelChat#sendRequest * make sure errors are recreated when making LM requests * disable test with a note for later * fix remote integration tests --- extensions/vscode-api-tests/package.json | 20 ++- .../src/singlefolder-tests/lm.test.ts | 153 ++++++++++++++++++ src/vs/base/common/errors.ts | 13 ++ .../workbench/api/browser/mainThreadErrors.ts | 8 +- .../api/browser/mainThreadExtensionService.ts | 12 +- .../api/browser/mainThreadLanguageModels.ts | 31 ++-- .../workbench/api/common/extHost.protocol.ts | 6 +- .../api/common/extHostLanguageModels.ts | 12 +- test/integration/browser/src/index.ts | 4 + 9 files changed, 217 insertions(+), 42 deletions(-) create mode 100644 extensions/vscode-api-tests/src/singlefolder-tests/lm.test.ts diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index cd4d67c307090..7e8b96839f446 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -7,13 +7,14 @@ "enabledApiProposals": [ "activeComment", "authSession", - "defaultChatParticipant", "chatParticipantPrivate", + "chatProvider", "chatVariableResolver", - "contribViewsRemote", "contribStatusBarItems", + "contribViewsRemote", "createFileSystemWatcher", "customEditorMove", + "defaultChatParticipant", "diffCommand", "documentFiltersExclusive", "documentPaste", @@ -27,6 +28,8 @@ "findTextInFiles", "fsChunks", "interactive", + "languageStatusText", + "lmTools", "mappedEditsProvider", "notebookCellExecutionState", "notebookDeprecated", @@ -35,26 +38,24 @@ "notebookMime", "portsAttributes", "quickPickSortByLabel", - "languageStatusText", "resolvers", "scmActionButton", "scmSelectedProvider", "scmTextDocument", "scmValidation", "taskPresentationGroup", + "telemetry", "terminalDataWriteEvent", "terminalDimensions", "terminalShellIntegration", - "tunnels", "testObserver", "textSearchProvider", "timeline", "tokenInformation", "treeViewActiveItem", "treeViewReveal", - "workspaceTrust", - "telemetry", - "lmTools" + "tunnels", + "workspaceTrust" ], "private": true, "activationEvents": [], @@ -64,6 +65,11 @@ }, "icon": "media/icon.png", "contributes": { + "languageModels": [ + { + "vendor": "test-lm-vendor" + } + ], "chatParticipants": [ { "id": "api-test.participant", diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/lm.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/lm.test.ts new file mode 100644 index 0000000000000..178119a1197c7 --- /dev/null +++ b/extensions/vscode-api-tests/src/singlefolder-tests/lm.test.ts @@ -0,0 +1,153 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'mocha'; +import * as assert from 'assert'; +import * as vscode from 'vscode'; +import { assertNoRpc, closeAllEditors, DeferredPromise, disposeAll } from '../utils'; + + +suite('lm', function () { + + let disposables: vscode.Disposable[] = []; + + setup(function () { + disposables = []; + }); + + teardown(async function () { + assertNoRpc(); + await closeAllEditors(); + disposeAll(disposables); + }); + + + test('lm request and stream', async function () { + + let p: vscode.Progress | undefined; + const defer = new DeferredPromise(); + + disposables.push(vscode.lm.registerChatModelProvider('test-lm', { + async provideLanguageModelResponse(_messages, _options, _extensionId, progress, _token) { + p = progress; + return defer.p; + }, + async provideTokenCount(_text, _token) { + return 1; + }, + }, { + name: 'test-lm', + version: '1.0.0', + family: 'test', + vendor: 'test-lm-vendor', + maxInputTokens: 100, + maxOutputTokens: 100, + })); + + const models = await vscode.lm.selectChatModels({ id: 'test-lm' }); + assert.strictEqual(models.length, 1); + + const request = await models[0].sendRequest([vscode.LanguageModelChatMessage.User('Hello')]); + + // assert we have a request immediately + assert.ok(request); + assert.ok(p); + assert.strictEqual(defer.isSettled, false); + + let streamDone = false; + let responseText = ''; + + const pp = (async () => { + for await (const chunk of request.text) { + responseText += chunk; + } + streamDone = true; + })(); + + assert.strictEqual(responseText, ''); + assert.strictEqual(streamDone, false); + + p.report({ index: 0, part: 'Hello' }); + defer.complete(); + + await pp; + await new Promise(r => setTimeout(r, 1000)); + + assert.strictEqual(streamDone, true); + assert.strictEqual(responseText, 'Hello'); + }); + + test('lm request fail', async function () { + + disposables.push(vscode.lm.registerChatModelProvider('test-lm', { + async provideLanguageModelResponse(_messages, _options, _extensionId, _progress, _token) { + throw new Error('BAD'); + }, + async provideTokenCount(_text, _token) { + return 1; + }, + }, { + name: 'test-lm', + version: '1.0.0', + family: 'test', + vendor: 'test-lm-vendor', + maxInputTokens: 100, + maxOutputTokens: 100, + })); + + const models = await vscode.lm.selectChatModels({ id: 'test-lm' }); + assert.strictEqual(models.length, 1); + + try { + await models[0].sendRequest([vscode.LanguageModelChatMessage.User('Hello')]); + assert.ok(false, 'EXPECTED error'); + } catch (error) { + assert.ok(error instanceof Error); + } + }); + + test('lm stream fail', async function () { + + const defer = new DeferredPromise(); + + disposables.push(vscode.lm.registerChatModelProvider('test-lm', { + async provideLanguageModelResponse(_messages, _options, _extensionId, _progress, _token) { + return defer.p; + }, + async provideTokenCount(_text, _token) { + return 1; + }, + }, { + name: 'test-lm', + version: '1.0.0', + family: 'test', + vendor: 'test-lm-vendor', + maxInputTokens: 100, + maxOutputTokens: 100, + })); + + const models = await vscode.lm.selectChatModels({ id: 'test-lm' }); + assert.strictEqual(models.length, 1); + + const res = await models[0].sendRequest([vscode.LanguageModelChatMessage.User('Hello')]); + assert.ok(res); + + const result = (async () => { + for await (const _chunk of res.text) { + + } + })(); + + defer.error(new Error('STREAM FAIL')); + + try { + await result; + assert.ok(false, 'EXPECTED error'); + } catch (error) { + assert.ok(error); + // assert.ok(error instanceof Error); // todo@jrieken requires one more insiders + } + }); +}); diff --git a/src/vs/base/common/errors.ts b/src/vs/base/common/errors.ts index f0d9296057b3a..ce5d8b2985268 100644 --- a/src/vs/base/common/errors.ts +++ b/src/vs/base/common/errors.ts @@ -137,6 +137,19 @@ export function transformErrorForSerialization(error: any): any { return error; } +export function transformErrorFromSerialization(data: SerializedError): Error { + let error: Error; + if (data.noTelemetry) { + error = new ErrorNoTelemetry(); + } else { + error = new Error(); + error.name = data.name; + } + error.message = data.message; + error.stack = data.stack; + return error; +} + // see https://github.com/v8/v8/wiki/Stack%20Trace%20API#basic-stack-traces export interface V8CallSite { getThis(): unknown; diff --git a/src/vs/workbench/api/browser/mainThreadErrors.ts b/src/vs/workbench/api/browser/mainThreadErrors.ts index 2d05a6a0e4421..e159117994487 100644 --- a/src/vs/workbench/api/browser/mainThreadErrors.ts +++ b/src/vs/workbench/api/browser/mainThreadErrors.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SerializedError, onUnexpectedError, ErrorNoTelemetry } from 'vs/base/common/errors'; +import { SerializedError, onUnexpectedError, transformErrorFromSerialization } from 'vs/base/common/errors'; import { extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { MainContext, MainThreadErrorsShape } from 'vs/workbench/api/common/extHost.protocol'; @@ -16,11 +16,7 @@ export class MainThreadErrors implements MainThreadErrorsShape { $onUnexpectedError(err: any | SerializedError): void { if (err && err.$isError) { - const { name, message, stack } = err; - err = err.noTelemetry ? new ErrorNoTelemetry() : new Error(); - err.message = message; - err.name = name; - err.stack = stack; + err = transformErrorFromSerialization(err); } onUnexpectedError(err); } diff --git a/src/vs/workbench/api/browser/mainThreadExtensionService.ts b/src/vs/workbench/api/browser/mainThreadExtensionService.ts index 6732d38f5e670..7c4db0a5def96 100644 --- a/src/vs/workbench/api/browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/browser/mainThreadExtensionService.ts @@ -6,7 +6,7 @@ import { Action } from 'vs/base/common/actions'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { SerializedError } from 'vs/base/common/errors'; +import { SerializedError, transformErrorFromSerialization } from 'vs/base/common/errors'; import { FileAccess } from 'vs/base/common/network'; import Severity from 'vs/base/common/severity'; import { URI, UriComponents } from 'vs/base/common/uri'; @@ -73,19 +73,13 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha this._internalExtensionService._onDidActivateExtension(extensionId, codeLoadingTime, activateCallTime, activateResolvedTime, activationReason); } $onExtensionRuntimeError(extensionId: ExtensionIdentifier, data: SerializedError): void { - const error = new Error(); - error.name = data.name; - error.message = data.message; - error.stack = data.stack; + const error = transformErrorFromSerialization(data); this._internalExtensionService._onExtensionRuntimeError(extensionId, error); console.error(`[${extensionId.value}]${error.message}`); console.error(error.stack); } async $onExtensionActivationError(extensionId: ExtensionIdentifier, data: SerializedError, missingExtensionDependency: MissingExtensionDependency | null): Promise { - const error = new Error(); - error.name = data.name; - error.message = data.message; - error.stack = data.stack; + const error = transformErrorFromSerialization(data); this._internalExtensionService._onDidActivateExtensionError(extensionId, error); diff --git a/src/vs/workbench/api/browser/mainThreadLanguageModels.ts b/src/vs/workbench/api/browser/mainThreadLanguageModels.ts index 6c97efbe0a0e2..adea665487c16 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageModels.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageModels.ts @@ -5,6 +5,7 @@ import { AsyncIterableSource, DeferredPromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { SerializedError, transformErrorForSerialization, transformErrorFromSerialization } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableMap, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; @@ -77,20 +78,26 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { this._providerRegistrations.set(handle, dipsosables); } - async $handleResponsePart(requestId: number, chunk: IChatResponseFragment): Promise { - this._pendingProgress.get(requestId)?.stream.emitOne(chunk); + async $reportResponsePart(requestId: number, chunk: IChatResponseFragment): Promise { + const data = this._pendingProgress.get(requestId); + this._logService.trace('[LM] report response PART', Boolean(data), requestId, chunk); + if (data) { + data.stream.emitOne(chunk); + } } - async $handleResponseDone(requestId: number, error: any | undefined): Promise { + async $reportResponseDone(requestId: number, err: SerializedError | undefined): Promise { const data = this._pendingProgress.get(requestId); + this._logService.trace('[LM] report response DONE', Boolean(data), requestId, err); if (data) { this._pendingProgress.delete(requestId); - if (error) { - data.defer.error(error); + if (err) { + const error = transformErrorFromSerialization(err); data.stream.reject(error); + data.defer.error(error); } else { - data.defer.complete(undefined); data.stream.resolve(); + data.defer.complete(undefined); } } } @@ -108,7 +115,7 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { } async $tryStartChatRequest(extension: ExtensionIdentifier, providerId: string, requestId: number, messages: IChatMessage[], options: {}, token: CancellationToken): Promise { - this._logService.debug('[CHAT] extension request STARTED', extension.value, requestId); + this._logService.trace('[CHAT] request STARTED', extension.value, requestId); const response = await this._chatProviderService.sendChatRequest(providerId, extension, messages, options, token); @@ -116,24 +123,26 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape { // This method must return before the response is done (has streamed all parts) // and because of that we consume the stream without awaiting // !!! IMPORTANT !!! - (async () => { + const streaming = (async () => { try { for await (const part of response.stream) { + this._logService.trace('[CHAT] request PART', extension.value, requestId, part); await this._proxy.$acceptResponsePart(requestId, part); } + this._logService.trace('[CHAT] request DONE', extension.value, requestId); } catch (err) { this._logService.error('[CHAT] extension request ERRORED in STREAM', err, extension.value, requestId); - this._proxy.$acceptResponseDone(requestId, err); + this._proxy.$acceptResponseDone(requestId, transformErrorForSerialization(err)); } })(); // When the response is done (signaled via its result) we tell the EH - response.result.then(() => { + Promise.allSettled([response.result, streaming]).then(() => { this._logService.debug('[CHAT] extension request DONE', extension.value, requestId); this._proxy.$acceptResponseDone(requestId, undefined); }, err => { this._logService.error('[CHAT] extension request ERRORED', err, extension.value, requestId); - this._proxy.$acceptResponseDone(requestId, err); + this._proxy.$acceptResponseDone(requestId, transformErrorForSerialization(err)); }); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index dba2a510810a2..8fb7d046b4dfd 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1203,8 +1203,8 @@ export interface MainThreadLanguageModelsShape extends IDisposable { $registerLanguageModelProvider(handle: number, identifier: string, metadata: ILanguageModelChatMetadata): void; $unregisterProvider(handle: number): void; $tryStartChatRequest(extension: ExtensionIdentifier, provider: string, requestId: number, messages: IChatMessage[], options: {}, token: CancellationToken): Promise; - $handleResponsePart(requestId: number, chunk: IChatResponseFragment): Promise; - $handleResponseDone(requestId: number, error: any | undefined): Promise; + $reportResponsePart(requestId: number, chunk: IChatResponseFragment): Promise; + $reportResponseDone(requestId: number, error: SerializedError | undefined): Promise; $selectChatModels(selector: ILanguageModelChatSelector): Promise; $whenLanguageModelChatRequestMade(identifier: string, extension: ExtensionIdentifier, participant?: string, tokenCount?: number): void; $countTokens(provider: string, value: string | IChatMessage, token: CancellationToken): Promise; @@ -1215,7 +1215,7 @@ export interface ExtHostLanguageModelsShape { $updateModelAccesslist(data: { from: ExtensionIdentifier; to: ExtensionIdentifier; enabled: boolean }[]): void; $startChatRequest(handle: number, requestId: number, from: ExtensionIdentifier, messages: IChatMessage[], options: { [name: string]: any }, token: CancellationToken): Promise; $acceptResponsePart(requestId: number, chunk: IChatResponseFragment): Promise; - $acceptResponseDone(requestId: number, error: any | undefined): Promise; + $acceptResponseDone(requestId: number, error: SerializedError | undefined): Promise; $provideTokenLength(handle: number, value: string | IChatMessage, token: CancellationToken): Promise; } diff --git a/src/vs/workbench/api/common/extHostLanguageModels.ts b/src/vs/workbench/api/common/extHostLanguageModels.ts index 2adfd33ea5ab9..b67999350aff4 100644 --- a/src/vs/workbench/api/common/extHostLanguageModels.ts +++ b/src/vs/workbench/api/common/extHostLanguageModels.ts @@ -6,7 +6,7 @@ import { AsyncIterableObject, AsyncIterableSource } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { CancellationError } from 'vs/base/common/errors'; +import { CancellationError, SerializedError, transformErrorForSerialization, transformErrorFromSerialization } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -212,7 +212,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { return; } - this._proxy.$handleResponsePart(requestId, { index: fragment.index, part }); + this._proxy.$reportResponsePart(requestId, { index: fragment.index, part }); }); let p: Promise; @@ -243,9 +243,9 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { } p.then(() => { - this._proxy.$handleResponseDone(requestId, undefined); + this._proxy.$reportResponseDone(requestId, undefined); }, err => { - this._proxy.$handleResponseDone(requestId, err); + this._proxy.$reportResponseDone(requestId, transformErrorForSerialization(err)); }); } @@ -411,7 +411,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { } } - async $acceptResponseDone(requestId: number, error: any | undefined): Promise { + async $acceptResponseDone(requestId: number, error: SerializedError | undefined): Promise { const data = this._pendingRequest.get(requestId); if (!data) { return; @@ -420,7 +420,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape { if (error) { // we error the stream because that's the only way to signal // that the request has failed - data.res.reject(error); + data.res.reject(transformErrorFromSerialization(error)); } else { data.res.resolve(); } diff --git a/test/integration/browser/src/index.ts b/test/integration/browser/src/index.ts index 3af2d83bccaef..990b7cd19fda1 100644 --- a/test/integration/browser/src/index.ts +++ b/test/integration/browser/src/index.ts @@ -105,6 +105,10 @@ async function runTestsInBrowser(browserType: BrowserType, endpoint: url.UrlWith console.error(`Error saving web client logs (${error})`); } + if (args.debug) { + return; + } + try { await browser.close(); } catch (error) { From b01aaeda15d6aedbc219a7b7a0f1c24de08da888 Mon Sep 17 00:00:00 2001 From: Cody Beyer Date: Mon, 24 Jun 2024 01:01:58 -0700 Subject: [PATCH 440/755] adding missing azure ai py packages to tagging (#216861) --- .../electron-sandbox/workspaceTagsService.ts | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts index c77eadc1d0c59..7ed55df2bdfe8 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts @@ -360,7 +360,18 @@ const PyModulesToLookFor = [ 'tika', 'trulens', 'trulens-eval', - 'wandb' + 'wandb', + // Azure AI Services + 'azure-ai-contentsafety', + 'azure-ai-documentintelligence', + 'azure-ai-translation-text', + 'azure-ai-vision', + 'azure-cognitiveservices-language-luis', + 'azure-cognitiveservices-speech', + 'azure-cognitiveservices-vision-contentmoderator', + 'azure-cognitiveservices-vision-face', + 'azure-mgmt-cognitiveservices', + 'azure-mgmt-search' ]; const GoModulesToLookFor = [ @@ -707,6 +718,16 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.py.azure-ai-language-conversations" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-ai-language-questionanswering" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-ai-ml" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-ai-contentsafety" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-ai-documentintelligence" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-ai-translation-text" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-ai-vision" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-cognitiveservices-language-luis" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-cognitiveservices-speech" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-cognitiveservices-vision-contentmoderator" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-cognitiveservices-vision-face" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-mgmt-cognitiveservices" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.py.azure-mgmt-search" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-ai-translation-document" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-cognitiveservices" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.py.azure-core" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From 9d41b1cefcbacb7d3fa4b253ce56ac0cf01257c0 Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Mon, 24 Jun 2024 02:30:46 -0700 Subject: [PATCH 441/755] Support Textual Selections in notebook find widget (#216840) * support textual selections in notebook find widget * add textual selection decorations * union type * fix passed ranges, clear find scope text range decs * organize imports pass * remove auto find explorations --- .../browser/contrib/find/findFilters.ts | 43 ++--- .../browser/contrib/find/findModel.ts | 24 ++- .../contrib/find/media/notebookFind.css | 4 + .../browser/contrib/find/notebookFind.ts | 13 +- .../contrib/find/notebookFindReplaceWidget.ts | 158 +++++++++++------- .../contrib/find/notebookFindWidget.ts | 5 +- .../notebook/browser/notebook.contribution.ts | 5 - .../notebook/browser/notebookBrowser.ts | 4 +- .../notebook/browser/notebookEditorWidget.ts | 16 +- .../browser/viewModel/baseCellViewModel.ts | 17 +- .../browser/viewModel/codeCellViewModel.ts | 18 +- .../browser/viewModel/markupCellViewModel.ts | 4 +- .../viewModel/notebookViewModelImpl.ts | 19 +-- .../contrib/notebook/common/notebookCommon.ts | 33 ++-- .../test/browser/testNotebookEditor.ts | 4 +- .../contrib/search/browser/searchWidget.ts | 6 +- 16 files changed, 201 insertions(+), 172 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/findFilters.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/findFilters.ts index 0901d295edd06..cf98120913cdb 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findFilters.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findFilters.ts @@ -3,16 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter } from 'vs/base/common/event'; -import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; +import { INotebookFindScope, NotebookFindScopeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; export interface INotebookFindChangeEvent { markupInput?: boolean; markupPreview?: boolean; codeInput?: boolean; codeOutput?: boolean; - searchInRanges?: boolean; + findScope?: boolean; } export class NotebookFindFilters extends Disposable { @@ -70,31 +70,19 @@ export class NotebookFindFilters extends Disposable { } } - private _searchInRanges: boolean = false; + private _findScope: INotebookFindScope = { findScopeType: NotebookFindScopeType.None }; - get searchInRanges(): boolean { - return this._searchInRanges; + get findScope(): INotebookFindScope { + return this._findScope; } - set searchInRanges(value: boolean) { - if (this._searchInRanges !== value) { - this._searchInRanges = value; - this._onDidChange.fire({ searchInRanges: value }); + set findScope(value: INotebookFindScope) { + if (this._findScope !== value) { + this._findScope = value; + this._onDidChange.fire({ findScope: true }); } } - private _selectedRanges: ICellRange[] = []; - - get selectedRanges(): ICellRange[] { - return this._selectedRanges; - } - - set selectedRanges(value: ICellRange[]) { - if (this._selectedRanges !== value) { - this._selectedRanges = value; - this._onDidChange.fire({ searchInRanges: this._searchInRanges }); - } - } private readonly _initialMarkupInput: boolean; private readonly _initialMarkupPreview: boolean; @@ -106,8 +94,7 @@ export class NotebookFindFilters extends Disposable { markupPreview: boolean, codeInput: boolean, codeOutput: boolean, - searchInRanges: boolean, - selectedRanges: ICellRange[] + findScope: INotebookFindScope ) { super(); @@ -115,8 +102,7 @@ export class NotebookFindFilters extends Disposable { this._markupPreview = markupPreview; this._codeInput = codeInput; this._codeOutput = codeOutput; - this._searchInRanges = searchInRanges; - this._selectedRanges = selectedRanges; + this._findScope = findScope; this._initialMarkupInput = markupInput; this._initialMarkupPreview = markupPreview; @@ -125,7 +111,7 @@ export class NotebookFindFilters extends Disposable { } isModified(): boolean { - // do not include searchInRanges or selectedRanges in the check. This will incorrectly mark the filter icon as modified + // do not include findInSelection or either selectedRanges in the check. This will incorrectly mark the filter icon as modified return ( this._markupInput !== this._initialMarkupInput || this._markupPreview !== this._initialMarkupPreview @@ -139,7 +125,6 @@ export class NotebookFindFilters extends Disposable { this._markupPreview = v.markupPreview; this._codeInput = v.codeInput; this._codeOutput = v.codeOutput; - this._searchInRanges = v.searchInRanges; - this._selectedRanges = v.selectedRanges; + this._findScope = v.findScope; } } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts index de522b344a5eb..0ca2d422f5313 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts @@ -3,21 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { findFirstIdxMonotonousOrArrLen } from 'vs/base/common/arraysFind'; import { CancelablePromise, createCancelablePromise, Delayer } from 'vs/base/common/async'; -import { INotebookEditor, CellEditState, CellFindMatchWithIndex, CellWebviewFindMatch, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Range } from 'vs/editor/common/core/range'; import { FindMatch } from 'vs/editor/common/model'; import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/browser/findState'; -import { CellKind, INotebookSearchOptions, NotebookCellsChangeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { findFirstIdxMonotonousOrArrLen } from 'vs/base/common/arraysFind'; -import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CancellationToken } from 'vs/base/common/cancellation'; import { NotebookFindFilters } from 'vs/workbench/contrib/notebook/browser/contrib/find/findFilters'; import { FindMatchDecorationModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findMatchDecorationModel'; +import { CellEditState, CellFindMatchWithIndex, CellWebviewFindMatch, ICellViewModel, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; +import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; +import { CellKind, INotebookFindOptions, NotebookCellsChangeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; export class CellFindMatchModel implements CellFindMatchWithIndex { readonly cell: ICellViewModel; @@ -115,7 +115,7 @@ export class FindModel extends Disposable { } private _updateCellStates(e: FindReplaceStateChangedEvent) { - if (!this._state.filters?.markupInput || !this._state.filters?.markupPreview || !this._state.filters?.searchInRanges || !this._state.filters?.selectedRanges) { + if (!this._state.filters?.markupInput || !this._state.filters?.markupPreview || !this._state.filters?.findScope) { return; } @@ -127,7 +127,7 @@ export class FindModel extends Disposable { } // search markup sources first to decide if a markup cell should be in editing mode const wordSeparators = this._configurationService.inspect('editor.wordSeparators').value; - const options: INotebookSearchOptions = { + const options: INotebookFindOptions = { regex: this._state.isRegex, wholeWord: this._state.wholeWord, caseSensitive: this._state.matchCase, @@ -136,8 +136,7 @@ export class FindModel extends Disposable { includeCodeInput: false, includeMarkupPreview: false, includeOutput: false, - searchInRanges: this._state.filters?.searchInRanges, - selectedRanges: this._state.filters?.selectedRanges + findScope: this._state.filters?.findScope, }; const contentMatches = viewModel.find(this._state.searchString, options); @@ -476,7 +475,7 @@ export class FindModel extends Disposable { const val = this._state.searchString; const wordSeparators = this._configurationService.inspect('editor.wordSeparators').value; - const options: INotebookSearchOptions = { + const options: INotebookFindOptions = { regex: this._state.isRegex, wholeWord: this._state.wholeWord, caseSensitive: this._state.matchCase, @@ -485,8 +484,7 @@ export class FindModel extends Disposable { includeCodeInput: this._state.filters?.codeInput ?? true, includeMarkupPreview: !!this._state.filters?.markupPreview, includeOutput: !!this._state.filters?.codeOutput, - searchInRanges: this._state.filters?.searchInRanges, - selectedRanges: this._state.filters?.selectedRanges + findScope: this._state.filters?.findScope, }; ret = await this._notebookEditor.find(val, options, token); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css b/src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css index fe115e230810f..d61cc7974978e 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/media/notebookFind.css @@ -19,3 +19,7 @@ padding: 0 2px; box-sizing: border-box; } + +.monaco-workbench .nb-findScope { + background-color: var(--vscode-editor-findRangeHighlightBackground); +} diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFind.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFind.ts index fd39a06a3f720..fb3d93d9d5e92 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFind.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFind.ts @@ -10,6 +10,7 @@ import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; import { FindStartFocusAction, getSelectionSearchString, IFindStartOptions, StartFindAction, StartFindReplaceAction } from 'vs/editor/contrib/find/browser/findController'; @@ -19,13 +20,12 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IShowNotebookFindWidgetOptions, NotebookFindContrib } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget'; +import { INotebookCommandContext, NotebookMultiCellAction } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; -import { CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellUri, NotebookFindScopeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INTERACTIVE_WINDOW_IS_ACTIVE_EDITOR, KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { INotebookCommandContext, NotebookMultiCellAction } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; registerNotebookContribution(NotebookFindContrib.id, NotebookFindContrib); @@ -78,12 +78,7 @@ registerAction2(class extends NotebookMultiCellAction { } const controller = editor.getContribution(NotebookFindContrib.id); - - if (context.selectedCells.length > 1) { - controller.show(undefined, { searchInRanges: true, selectedRanges: editor.getSelections() }); - } else { - controller.show(undefined, { searchInRanges: false, selectedRanges: [] }); - } + controller.show(undefined, { findScope: { findScopeType: NotebookFindScopeType.None } }); } }); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts index c8cc9eb218702..8c4b59a688e43 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts @@ -3,46 +3,48 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; +import 'vs/css!./notebookFindReplaceWidget'; +import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; +import { AnchorAlignment, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; +import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem'; import { FindInput, IFindInputOptions } from 'vs/base/browser/ui/findinput/findInput'; import { ReplaceInput } from 'vs/base/browser/ui/findinput/replaceInput'; import { IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBox'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; +import { ISashEvent, Orientation, Sash } from 'vs/base/browser/ui/sash/sash'; +import { IToggleStyles, Toggle } from 'vs/base/browser/ui/toggle/toggle'; import { Widget } from 'vs/base/browser/ui/widget'; +import { Action, ActionRunner, IAction, IActionRunner, Separator } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; +import { Codicon } from 'vs/base/common/codicons'; import { KeyCode } from 'vs/base/common/keyCodes'; -import 'vs/css!./notebookFindReplaceWidget'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { isSafari } from 'vs/base/common/platform'; +import { ThemeIcon } from 'vs/base/common/themables'; +import { Range } from 'vs/editor/common/core/range'; import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/browser/findState'; import { findNextMatchIcon, findPreviousMatchIcon, findReplaceAllIcon, findReplaceIcon, findSelectionIcon, SimpleButton } from 'vs/editor/contrib/find/browser/findWidget'; -import * as nls from 'vs/nls'; -import { ContextScopedReplaceInput, registerAndCreateHistoryNavigationContext } from 'vs/platform/history/browser/contextScopedHistoryWidget'; +import { parseReplaceString, ReplacePattern } from 'vs/editor/contrib/find/browser/replacePattern'; +import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { IMenu } from 'vs/platform/actions/common/actions'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { ContextScopedReplaceInput, registerAndCreateHistoryNavigationContext } from 'vs/platform/history/browser/contextScopedHistoryWidget'; +import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { defaultInputBoxStyles, defaultProgressBarStyles, defaultToggleStyles } from 'vs/platform/theme/browser/defaultStyles'; +import { asCssVariable, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerIcon, widgetClose } from 'vs/platform/theme/common/iconRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { ThemeIcon } from 'vs/base/common/themables'; -import { parseReplaceString, ReplacePattern } from 'vs/editor/contrib/find/browser/replacePattern'; -import { Codicon } from 'vs/base/common/codicons'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Action, ActionRunner, IAction, IActionRunner, Separator } from 'vs/base/common/actions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMenu } from 'vs/platform/actions/common/actions'; -import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { AnchorAlignment, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; -import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { filterIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; import { NotebookFindFilters } from 'vs/workbench/contrib/notebook/browser/contrib/find/findFilters'; -import { isSafari } from 'vs/base/common/platform'; -import { ISashEvent, Orientation, Sash } from 'vs/base/browser/ui/sash/sash'; -import { INotebookDeltaDecoration, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { defaultInputBoxStyles, defaultProgressBarStyles, defaultToggleStyles } from 'vs/platform/theme/browser/defaultStyles'; -import { IToggleStyles, Toggle } from 'vs/base/browser/ui/toggle/toggle'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { IActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; -import { IHoverService } from 'vs/platform/hover/browser/hover'; -import { asCssVariable, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground } from 'vs/platform/theme/common/colorRegistry'; +import { IShowNotebookFindWidgetOptions } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget'; +import { ICellModelDecorations, ICellModelDeltaDecorations, ICellViewModel, INotebookDeltaDecoration, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookFindScopeType, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -318,8 +320,8 @@ export abstract class SimpleFindReplaceWidget extends Widget { private _filters: NotebookFindFilters; private readonly inSelectionToggle: Toggle; - private searchInSelectionEnabled: boolean; - private selectionDecorationIds: string[] = []; + private cellSelectionDecorationIds: string[] = []; + private textSelectionDecorationIds: ICellModelDecorations[] = []; constructor( @IContextViewService private readonly _contextViewService: IContextViewService, @@ -340,7 +342,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { codeOutput: boolean; }>(NotebookSetting.findFilters) ?? { markupSource: true, markupPreview: true, codeSource: true, codeOutput: true }; - this._filters = new NotebookFindFilters(findFilters.markupSource, findFilters.markupPreview, findFilters.codeSource, findFilters.codeOutput, false, []); + this._filters = new NotebookFindFilters(findFilters.markupSource, findFilters.markupPreview, findFilters.codeSource, findFilters.codeOutput, { findScopeType: NotebookFindScopeType.None }); this._state.change({ filters: this._filters }, false); this._filters.onDidChange(() => { @@ -468,16 +470,48 @@ export abstract class SimpleFindReplaceWidget extends Widget { inputActiveOptionBorder: asCssVariable(inputActiveOptionBorder), inputActiveOptionForeground: asCssVariable(inputActiveOptionForeground), })); + this.inSelectionToggle.domNode.style.display = 'inline'; this.inSelectionToggle.onChange(() => { const checked = this.inSelectionToggle.checked; - this._filters.searchInRanges = checked; if (checked) { - this._filters.selectedRanges = this._notebookEditor.getSelections(); - this.setCellSelectionDecorations(); + // selection logic: + // 1. if there are multiple cells, do that. + // 2. if there is only one cell, do the following: + // - if there is a multi-line range highlighted, textual in selection + // - if there is no range, cell in selection for that cell + + const cellSelection: ICellRange[] = this._notebookEditor.getSelections(); + const textSelection: Range[] = this._notebookEditor.getSelectionViewModels()[0].getSelections(); + + if (cellSelection.length > 1 || cellSelection.some(range => range.end - range.start > 1)) { + this._filters.findScope = { + findScopeType: NotebookFindScopeType.Cells, + selectedCellRanges: cellSelection + }; + this.setCellSelectionDecorations(); + + } else if (textSelection.length > 1 || textSelection.some(range => range.endLineNumber - range.startLineNumber >= 1)) { + this._filters.findScope = { + findScopeType: NotebookFindScopeType.Text, + selectedCellRanges: cellSelection, + selectedTextRanges: textSelection + }; + this.setTextSelectionDecorations(textSelection, this._notebookEditor.getSelectionViewModels()[0]); + + } else { + this._filters.findScope = { + findScopeType: NotebookFindScopeType.Cells, + selectedCellRanges: cellSelection + }; + this.setCellSelectionDecorations(); + } } else { - this._filters.selectedRanges = []; + this._filters.findScope = { + findScopeType: NotebookFindScopeType.None + }; this.clearCellSelectionDecorations(); + this.clearTextSelectionDecorations(); } }); @@ -496,22 +530,6 @@ export abstract class SimpleFindReplaceWidget extends Widget { this._innerFindDomNode.appendChild(this.inSelectionToggle.domNode); this._innerFindDomNode.appendChild(closeBtn.domNode); - this.searchInSelectionEnabled = this._configurationService.getValue(NotebookSetting.findScope); - this.inSelectionToggle.domNode.style.display = this.searchInSelectionEnabled ? 'inline' : 'none'; - - this._configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(NotebookSetting.findScope)) { - this.searchInSelectionEnabled = this._configurationService.getValue(NotebookSetting.findScope); - if (this.searchInSelectionEnabled) { - this.inSelectionToggle.domNode.style.display = 'inline'; - } else { - this.inSelectionToggle.domNode.style.display = 'none'; - this.inSelectionToggle.checked = false; - this.clearCellSelectionDecorations(); - } - } - }); - // _domNode wraps _innerDomNode, ensuring that this._domNode.appendChild(this._innerFindDomNode); @@ -704,11 +722,37 @@ export abstract class SimpleFindReplaceWidget extends Widget { options: { className: 'nb-multiCellHighlight', outputClassName: 'nb-multiCellHighlight' } } satisfies INotebookDeltaDecoration); } - this.selectionDecorationIds = this._notebookEditor.deltaCellDecorations([], decorations); + this.cellSelectionDecorationIds = this._notebookEditor.deltaCellDecorations([], decorations); } private clearCellSelectionDecorations() { - this._notebookEditor.deltaCellDecorations(this.selectionDecorationIds, []); + this._notebookEditor.deltaCellDecorations(this.cellSelectionDecorationIds, []); + } + + private setTextSelectionDecorations(textRanges: Range[], cell: ICellViewModel) { + this._notebookEditor.changeModelDecorations(changeAccessor => { + const decorations: ICellModelDeltaDecorations[] = []; + for (const range of textRanges) { + decorations.push({ + ownerId: cell.handle, + decorations: [{ + range: range, + options: { + description: 'text search range for notebook search scope', + isWholeLine: true, + className: 'nb-findScope' + } + }] + }); + } + this.textSelectionDecorationIds = changeAccessor.deltaDecorations([], decorations); + }); + } + + private clearTextSelectionDecorations() { + this._notebookEditor.changeModelDecorations(changeAccessor => { + changeAccessor.deltaDecorations(this.textSelectionDecorationIds, []); + }); } protected _updateMatchesCount(): void { @@ -748,20 +792,11 @@ export abstract class SimpleFindReplaceWidget extends Widget { this._findInput.focus(); } - public show(initialInput?: string, options?: { focus?: boolean; searchInRanges?: boolean; selectedRanges?: ICellRange[] }): void { + public show(initialInput?: string, options?: IShowNotebookFindWidgetOptions): void { if (initialInput) { this._findInput.setValue(initialInput); } - if (this.searchInSelectionEnabled && options?.searchInRanges !== undefined) { - this._filters.searchInRanges = options.searchInRanges; - this.inSelectionToggle.checked = options.searchInRanges; - if (options.searchInRanges && options.selectedRanges) { - this._filters.selectedRanges = options.selectedRanges; - this.setCellSelectionDecorations(); - } - } - this._isVisible = true; setTimeout(() => { @@ -810,7 +845,10 @@ export abstract class SimpleFindReplaceWidget extends Widget { public hide(): void { if (this._isVisible) { this.inSelectionToggle.checked = false; - this._notebookEditor.deltaCellDecorations(this.selectionDecorationIds, []); + this._notebookEditor.deltaCellDecorations(this.cellSelectionDecorationIds, []); + this._notebookEditor.changeModelDecorations(changeAccessor => { + changeAccessor.deltaDecorations(this.textSelectionDecorationIds, []); + }); this._domNode.classList.remove('visible-transition'); this._domNode.setAttribute('aria-hidden', 'true'); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts index 5e67785a00b06..15954bc2b8164 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts @@ -25,8 +25,8 @@ import { NotebookFindFilters } from 'vs/workbench/contrib/notebook/browser/contr import { FindModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findModel'; import { SimpleFindReplaceWidget } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget'; import { CellEditState, ICellViewModel, INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookFindScope } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; -import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; const FIND_HIDE_TRANSITION = 'find-hide-transition'; const FIND_SHOW_TRANSITION = 'find-show-transition'; @@ -40,8 +40,7 @@ export interface IShowNotebookFindWidgetOptions { matchIndex?: number; focus?: boolean; searchStringSeededFrom?: { cell: ICellViewModel; range: Range }; - searchInRanges?: boolean; - selectedRanges?: ICellRange[]; + findScope?: INotebookFindScope; } export class NotebookFindContrib extends Disposable implements INotebookEditorContribution { diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index 423c6165f73fb..4e174318c1127 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -1055,11 +1055,6 @@ configurationRegistry.registerConfiguration({ }, tags: ['notebookLayout'] }, - [NotebookSetting.findScope]: { - markdownDescription: nls.localize('notebook.experimental.find.scope.enabled', "Enables the user to search within a selection of cells in the notebook. When enabled, the user will see a \"Find in Cell Selection\" icon in the notebook find widget."), - type: 'boolean', - default: false, - }, [NotebookSetting.remoteSaving]: { markdownDescription: nls.localize('notebook.remoteSaving', "Enables the incremental saving of notebooks between processes and across Remote connections. When enabled, only the changes to the notebook are sent to the extension host, improving performance for large notebooks and slow network connections."), type: 'boolean', diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index dce4811e23532..18e44f2a6637d 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -22,7 +22,7 @@ import { IEditorPane, IEditorPaneWithSelection } from 'vs/workbench/common/edito import { CellViewModelStateChangeEvent, NotebookCellStateChangedEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellKind, ICellOutput, INotebookCellStatusBarItem, INotebookRendererInfo, INotebookSearchOptions, IOrderedMimeType, NotebookCellInternalMetadata, NotebookCellMetadata, NOTEBOOK_EDITOR_ID, REPL_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, ICellOutput, INotebookCellStatusBarItem, INotebookRendererInfo, INotebookFindOptions, IOrderedMimeType, NotebookCellInternalMetadata, NotebookCellMetadata, NOTEBOOK_EDITOR_ID, REPL_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { isCompositeNotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; import { INotebookKernel } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; @@ -738,7 +738,7 @@ export interface INotebookEditor { getCellIndex(cell: ICellViewModel): number | undefined; getNextVisibleCellIndex(index: number): number | undefined; getPreviousVisibleCellIndex(index: number): number | undefined; - find(query: string, options: INotebookSearchOptions, token: CancellationToken, skipWarmup?: boolean, shouldGetSearchPreviewInfo?: boolean, ownerID?: string): Promise; + find(query: string, options: INotebookFindOptions, token: CancellationToken, skipWarmup?: boolean, shouldGetSearchPreviewInfo?: boolean, ownerID?: string): Promise; findHighlightCurrent(matchIndex: number, ownerID?: string): Promise; findUnHighlightCurrent(matchIndex: number, ownerID?: string): Promise; findStop(ownerID?: string): void; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index ea03755d75d45..1e59c4cc13826 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -74,7 +74,7 @@ import { NotebookEditorContextKeys } from 'vs/workbench/contrib/notebook/browser import { NotebookOverviewRuler } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookOverviewRuler'; import { ListTopCellToolbar } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellEditType, CellKind, INotebookSearchOptions, RENDERER_NOT_AVAILABLE, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, CellKind, INotebookFindOptions, NotebookFindScopeType, RENDERER_NOT_AVAILABLE, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NOTEBOOK_CURSOR_NAVIGATION_MODE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED, NOTEBOOK_OUTPUT_INPUT_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; @@ -2567,7 +2567,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return Promise.all(requests); } - async find(query: string, options: INotebookSearchOptions, token: CancellationToken, skipWarmup: boolean = false, shouldGetSearchPreviewInfo = false, ownerID?: string): Promise { + async find(query: string, options: INotebookFindOptions, token: CancellationToken, skipWarmup: boolean = false, shouldGetSearchPreviewInfo = false, ownerID?: string): Promise { if (!this._notebookViewModel) { return []; } @@ -2578,7 +2578,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD const findMatches = this._notebookViewModel.find(query, options).filter(match => match.length > 0); - if (!options.includeMarkupPreview && !options.includeOutput) { + if ((!options.includeMarkupPreview && !options.includeOutput) || options.findScope?.findScopeType === NotebookFindScopeType.Text) { this._webview?.findStop(ownerID); return findMatches; } @@ -2602,11 +2602,13 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return []; } - const selectedRanges = options.selectedRanges?.map(range => this._notebookViewModel?.validateRange(range)).filter(range => !!range); - const selectedIndexes = cellRangesToIndexes(selectedRanges ?? []); - const findIds: string[] = selectedIndexes.map(index => this._notebookViewModel?.viewCells[index].id ?? ''); + let findIds: string[] = []; + if (options.findScope && options.findScope.findScopeType === NotebookFindScopeType.Cells && options.findScope.selectedCellRanges) { + const selectedIndexes = cellRangesToIndexes(options.findScope.selectedCellRanges); + findIds = selectedIndexes.map(index => this._notebookViewModel?.viewCells[index].id ?? ''); + } - const webviewMatches = await this._webview.find(query, { caseSensitive: options.caseSensitive, wholeWord: options.wholeWord, includeMarkup: !!options.includeMarkupPreview, includeOutput: !!options.includeOutput, shouldGetSearchPreviewInfo, ownerID, findIds: options.searchInRanges ? findIds : [] }); + const webviewMatches = await this._webview.find(query, { caseSensitive: options.caseSensitive, wholeWord: options.wholeWord, includeMarkup: !!options.includeMarkupPreview, includeOutput: !!options.includeOutput, shouldGetSearchPreviewInfo, ownerID, findIds: findIds }); if (token.isCancellationRequested) { return []; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index f1c1ab7b7c8e2..b0751fc5b964f 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -9,7 +9,7 @@ import { Mimes } from 'vs/base/common/mime'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IPosition } from 'vs/editor/common/core/position'; -import { Range } from 'vs/editor/common/core/range'; +import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as model from 'vs/editor/common/model'; @@ -24,7 +24,7 @@ import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/browse import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { CellKind, INotebookCellStatusBarItem, INotebookSearchOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, INotebookCellStatusBarItem, INotebookFindOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; export abstract class BaseCellViewModel extends Disposable { @@ -650,20 +650,21 @@ export abstract class BaseCellViewModel extends Disposable { protected abstract onDidChangeTextModelContent(): void; - protected cellStartFind(value: string, options: INotebookSearchOptions): model.FindMatch[] | null { + protected cellStartFind(value: string, options: INotebookFindOptions): model.FindMatch[] | null { let cellMatches: model.FindMatch[] = []; + const lineCount = this.textBuffer.getLineCount(); + const findRange: IRange[] = options.findScope?.selectedTextRanges ?? [new Range(1, 1, lineCount, this.textBuffer.getLineLength(lineCount) + 1)]; + if (this.assertTextModelAttached()) { cellMatches = this.textModel!.findMatches( value, - false, + findRange, options.regex || false, options.caseSensitive || false, options.wholeWord ? options.wordSeparators || null : null, options.regex || false); } else { - const lineCount = this.textBuffer.getLineCount(); - const fullRange = new Range(1, 1, lineCount, this.textBuffer.getLineLength(lineCount) + 1); const searchParams = new SearchParams(value, options.regex || false, options.caseSensitive || false, options.wholeWord ? options.wordSeparators || null : null,); const searchData = searchParams.parseSearchRequest(); @@ -671,7 +672,9 @@ export abstract class BaseCellViewModel extends Disposable { return null; } - cellMatches = this.textBuffer.findMatchesLineByLine(fullRange, searchData, options.regex || false, 1000); + findRange.forEach(range => { + cellMatches.push(...this.textBuffer.findMatchesLineByLine(new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn), searchData, options.regex || false, 1000)); + }); } return cellMatches; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 3f5a6c3e68d49..06c8c851f3b94 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -5,25 +5,25 @@ import { Emitter, Event, PauseableEmitter } from 'vs/base/common/event'; import { dispose } from 'vs/base/common/lifecycle'; +import { observableValue } from 'vs/base/common/observable'; import * as UUID from 'vs/base/common/uuid'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { CellEditState, CellFindMatch, CodeCellLayoutChangeEvent, CodeCellLayoutInfo, CellLayoutState, ICellOutputViewModel, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFindMatch, CellLayoutState, CodeCellLayoutChangeEvent, CodeCellLayoutInfo, ICellOutputViewModel, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; +import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { CellOutputViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { CellKind, INotebookSearchOptions, NotebookCellOutputsSplice } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; +import { CellKind, INotebookFindOptions, NotebookCellOutputsSplice } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ICellExecutionError, ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { BaseCellViewModel } from './baseCellViewModel'; -import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -import { ICellExecutionError, ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { observableValue } from 'vs/base/common/observable'; export const outputDisplayLimit = 500; @@ -518,7 +518,7 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod private readonly _hasFindResult = this._register(new Emitter()); public readonly hasFindResult: Event = this._hasFindResult.event; - startFind(value: string, options: INotebookSearchOptions): CellFindMatch | null { + startFind(value: string, options: INotebookFindOptions): CellFindMatch | null { const matches = super.cellStartFind(value, options); if (matches === null) { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts index 0f255cc20db21..ee1b0d37d9f47 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts @@ -10,7 +10,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { CellEditState, CellFindMatch, CellFoldingState, CellLayoutContext, CellLayoutState, EditorFoldingStateDelegate, ICellOutputViewModel, ICellViewModel, MarkupCellLayoutChangeEvent, MarkupCellLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { CellKind, INotebookSearchOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, INotebookFindOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; @@ -295,7 +295,7 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM private readonly _hasFindResult = this._register(new Emitter()); public readonly hasFindResult: Event = this._hasFindResult.event; - startFind(value: string, options: INotebookSearchOptions): CellFindMatch | null { + startFind(value: string, options: INotebookFindOptions): CellFindMatch | null { const matches = super.cellStartFind(value, options); if (matches === null) { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts index 7ea020f145ca1..60a3626484fac 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts @@ -13,27 +13,27 @@ import { URI } from 'vs/base/common/uri'; import { IBulkEditService, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; +import { IWorkspaceTextEdit } from 'vs/editor/common/languages'; import { FindMatch, IModelDecorationOptions, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/editor/common/model'; import { MultiModelEditStackElement, SingleModelEditStackElement } from 'vs/editor/common/model/editStack'; import { IntervalNode, IntervalTree } from 'vs/editor/common/model/intervalTree'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { IWorkspaceTextEdit } from 'vs/editor/common/languages'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { FoldingRegions } from 'vs/editor/contrib/folding/browser/foldingRanges'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { CellEditState, CellFindMatchWithIndex, CellFoldingState, EditorFoldingStateDelegate, ICellViewModel, INotebookDeltaCellStatusBarItems, INotebookDeltaDecoration, ICellModelDecorations, ICellModelDeltaDecorations, IModelDecorationsChangeAccessor, INotebookEditorViewState, INotebookViewCellsUpdateEvent, INotebookViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellFindMatchModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findModel'; +import { CellEditState, CellFindMatchWithIndex, CellFoldingState, EditorFoldingStateDelegate, ICellModelDecorations, ICellModelDeltaDecorations, ICellViewModel, IModelDecorationsChangeAccessor, INotebookDeltaCellStatusBarItems, INotebookDeltaDecoration, INotebookEditorViewState, INotebookViewCellsUpdateEvent, INotebookViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookLayoutInfo, NotebookMetadataChangedEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { NotebookCellSelectionCollection } from 'vs/workbench/contrib/notebook/browser/viewModel/cellSelectionCollection'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellKind, ICell, INotebookSearchOptions, ISelectionState, NotebookCellsChangeType, NotebookCellTextModelSplice, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { cellIndexesToRanges, cellRangesToIndexes, ICellRange, reduceCellRanges } from 'vs/workbench/contrib/notebook/common/notebookRange'; -import { NotebookLayoutInfo, NotebookMetadataChangedEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -import { CellFindMatchModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findModel'; +import { CellKind, ICell, INotebookFindOptions, ISelectionState, NotebookCellsChangeType, NotebookCellTextModelSplice, NotebookFindScopeType, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookExecutionStateService, NotebookExecutionType } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { cellIndexesToRanges, cellRangesToIndexes, ICellRange, reduceCellRanges } from 'vs/workbench/contrib/notebook/common/notebookRange'; const invalidFunc = () => { throw new Error(`Invalid change accessor`); }; @@ -910,13 +910,12 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } //#region Find - find(value: string, options: INotebookSearchOptions): CellFindMatchWithIndex[] { + find(value: string, options: INotebookFindOptions): CellFindMatchWithIndex[] { const matches: CellFindMatchWithIndex[] = []; let findCells: CellViewModel[] = []; - const selectedRanges = options.selectedRanges?.map(range => this.validateRange(range)).filter(range => !!range); - - if (options.searchInRanges && selectedRanges) { + if (options.findScope && (options.findScope.findScopeType === NotebookFindScopeType.Cells || options.findScope.findScopeType === NotebookFindScopeType.Text)) { + const selectedRanges = options.findScope.selectedCellRanges?.map(range => this.validateRange(range)).filter(range => !!range) ?? []; const selectedIndexes = cellRangesToIndexes(selectedRanges); findCells = selectedIndexes.map(index => this._viewCells[index]); } else { diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index bb08370538b67..aea2596da4832 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -8,33 +8,34 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IDiffResult } from 'vs/base/common/diff/diff'; import { Event } from 'vs/base/common/event'; import * as glob from 'vs/base/common/glob'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Iterable } from 'vs/base/common/iterator'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; import { Schemas } from 'vs/base/common/network'; import { basename } from 'vs/base/common/path'; import { isWindows } from 'vs/base/common/platform'; import { ISplice } from 'vs/base/common/sequence'; +import { ThemeColor } from 'vs/base/common/themables'; import { URI, UriComponents } from 'vs/base/common/uri'; +import { Range } from 'vs/editor/common/core/range'; import { ILineChange } from 'vs/editor/common/diff/legacyLinesDiffComputer'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Command, WorkspaceEditMetadata } from 'vs/editor/common/languages'; import { IReadonlyTextBuffer } from 'vs/editor/common/model'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IDisposable } from 'vs/base/common/lifecycle'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { ThemeColor } from 'vs/base/common/themables'; +import { IFileReadLimits } from 'vs/platform/files/common/files'; import { UndoRedoGroup } from 'vs/platform/undoRedo/common/undoRedo'; import { IRevertOptions, ISaveOptions, IUntypedEditorInput } from 'vs/workbench/common/editor'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; -import { IWorkingCopyBackupMeta, IWorkingCopySaveEvent } from 'vs/workbench/services/workingCopy/common/workingCopy'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; -import { IFileReadLimits } from 'vs/platform/files/common/files'; -import { parse as parseUri, generate as generateUri } from 'vs/workbench/services/notebook/common/notebookDocumentService'; import { ICellExecutionError } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookTextModelLike } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; +import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; +import { generate as generateUri, parse as parseUri } from 'vs/workbench/services/notebook/common/notebookDocumentService'; +import { IWorkingCopyBackupMeta, IWorkingCopySaveEvent } from 'vs/workbench/services/workingCopy/common/workingCopy'; export const NOTEBOOK_EDITOR_ID = 'workbench.editor.notebook'; export const NOTEBOOK_DIFF_EDITOR_ID = 'workbench.editor.notebookTextDiffEditor'; @@ -828,7 +829,7 @@ export enum NotebookEditorPriority { option = 'option', } -export interface INotebookSearchOptions { +export interface INotebookFindOptions { regex?: boolean; wholeWord?: boolean; caseSensitive?: boolean; @@ -837,8 +838,19 @@ export interface INotebookSearchOptions { includeMarkupPreview?: boolean; includeCodeInput?: boolean; includeOutput?: boolean; - searchInRanges?: boolean; - selectedRanges?: ICellRange[]; + findScope?: INotebookFindScope; +} + +export interface INotebookFindScope { + findScopeType: NotebookFindScopeType; + selectedCellRanges?: ICellRange[]; + selectedTextRanges?: Range[]; +} + +export enum NotebookFindScopeType { + Cells = 'cells', + Text = 'text', + None = 'none' } export interface INotebookExclusiveDocumentFilter { @@ -964,7 +976,6 @@ export const NotebookSetting = { outputFontFamilyDeprecated: 'notebook.outputFontFamily', outputFontFamily: 'notebook.output.fontFamily', findFilters: 'notebook.find.filters', - findScope: 'notebook.experimental.find.scope.enabled', logging: 'notebook.logging', confirmDeleteRunningCell: 'notebook.confirmDeleteRunningCell', remoteSaving: 'notebook.experimental.remoteSave', diff --git a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts index ef524745b9da4..830ac41e6a897 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts @@ -52,7 +52,7 @@ import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/vie import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService'; -import { CellKind, CellUri, ICellDto2, INotebookDiffEditorModel, INotebookEditorModel, INotebookSearchOptions, IOutputDto, IResolvedNotebookEditorModel, NotebookCellExecutionState, NotebookCellMetadata, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, CellUri, ICellDto2, INotebookDiffEditorModel, INotebookEditorModel, INotebookFindOptions, IOutputDto, IResolvedNotebookEditorModel, NotebookCellExecutionState, NotebookCellMetadata, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellExecuteUpdate, ICellExecutionComplete, ICellExecutionStateChangedEvent, IExecutionStateChangedEvent, INotebookCellExecution, INotebookExecution, INotebookExecutionStateService, INotebookFailStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -311,7 +311,7 @@ function _createTestNotebookEditor(instantiationService: TestInstantiationServic override get onDidChangeSelection() { return viewModel.onDidChangeSelection as Event; } override get onDidChangeOptions() { return viewModel.onDidChangeOptions; } override get onDidChangeViewCells() { return viewModel.onDidChangeViewCells; } - override async find(query: string, options: INotebookSearchOptions): Promise { + override async find(query: string, options: INotebookFindOptions): Promise { const findMatches = viewModel.find(query, options).filter(match => match.length > 0); return findMatches; } diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index 905ea80a71c95..f8beab04b545e 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -16,7 +17,6 @@ import { Delayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { CONTEXT_FIND_WIDGET_NOT_VISIBLE } from 'vs/editor/contrib/find/browser/findModel'; -import * as nls from 'vs/nls'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -44,6 +44,7 @@ import { GroupModelChangeKind } from 'vs/workbench/common/editor'; import { SearchFindInput } from 'vs/workbench/contrib/search/browser/searchFindInput'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { NotebookFindScopeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; /** Specified in searchview.css */ const SingleLineInputHeight = 26; @@ -205,8 +206,7 @@ export class SearchWidget extends Widget { notebookOptions.isInNotebookMarkdownPreview, notebookOptions.isInNotebookCellInput, notebookOptions.isInNotebookCellOutput, - false, - [] + { findScopeType: NotebookFindScopeType.None } )); this._register( From e2c6c2b9e83cff13eab63e7e7ec9c7ab1185e45b Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:21:00 +0200 Subject: [PATCH 442/755] SCM - avoid opening multiple multi-file diff editors for the same history item (#216979) --- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 6d579939f681d..988cbda14041e 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -3229,7 +3229,13 @@ export class SCMViewPane extends ViewPane { const historyItemChanges = await historyProvider?.provideHistoryItemChanges(historyItem.id, historyItemParentId); if (historyItemChanges) { const title = `${historyItem.id.substring(0, 8)} - ${historyItem.message}`; - await this.commandService.executeCommand('_workbench.openMultiDiffEditor', { title, resources: historyItemChanges }); + + const rootUri = e.element.repository.provider.rootUri; + const multiDiffSourceUri = rootUri ? + rootUri.with({ scheme: 'scm-history-item', path: `${rootUri.path}/${historyItem.id}` }) : + { scheme: 'scm-history-item', path: `${e.element.repository.provider.label}/${historyItem.id}` }; + + await this.commandService.executeCommand('_workbench.openMultiDiffEditor', { title, multiDiffSourceUri, resources: historyItemChanges }); } this.scmViewService.focus(e.element.repository); From 6d903b443cf644e8823b5f850fd34be35543f387 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 24 Jun 2024 12:59:30 +0200 Subject: [PATCH 443/755] Respect command enablement in tree view message buttons (#216995) --- .../workbench/browser/parts/views/treeView.ts | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 155c5d6728b5a..42a54190f0b0f 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -36,7 +36,7 @@ import { createActionViewItem, createAndFillInContextMenuActions } from 'vs/plat import { Action2, IMenuService, MenuId, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, ContextKeyExpression, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { FileKind } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -75,6 +75,7 @@ import { parseLinkedText } from 'vs/base/common/linkedText'; import { Button } from 'vs/base/browser/ui/button/button'; import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; import { IAccessibleViewInformationService } from 'vs/workbench/services/accessibility/common/accessibleViewInformationService'; +import { Command } from 'vs/editor/common/languages'; export class TreeViewPane extends ViewPane { @@ -175,15 +176,22 @@ class Root implements ITreeItem { children: ITreeItem[] | undefined = undefined; } -function isTreeCommandEnabled(treeCommand: TreeCommand, contextKeyService: IContextKeyService): boolean { - const command = CommandsRegistry.getCommand(treeCommand.originalId ? treeCommand.originalId : treeCommand.id); +function commandPreconditions(commandId: string): ContextKeyExpression | undefined { + const command = CommandsRegistry.getCommand(commandId); if (command) { const commandAction = MenuRegistry.getCommand(command.id); - const precondition = commandAction && commandAction.precondition; - if (precondition) { - return contextKeyService.contextMatchesRules(precondition); - } + return commandAction && commandAction.precondition; } + return undefined; +} + +function isTreeCommandEnabled(treeCommand: TreeCommand | Command, contextKeyService: IContextKeyService): boolean { + const commandId: string = (treeCommand as TreeCommand).originalId ? (treeCommand as TreeCommand).originalId! : treeCommand.id; + const precondition = commandPreconditions(commandId); + if (precondition) { + return contextKeyService.contextMatchesRules(precondition); + } + return true; } @@ -878,6 +886,20 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { button.onDidClick(_ => { this.openerService.open(node.href, { allowCommands: true }); }, null, disposables); + + const href = URI.parse(node.href); + if (href.scheme === Schemas.command) { + const preConditions = commandPreconditions(href.path); + if (preConditions) { + button.enabled = this.contextKeyService.contextMatchesRules(preConditions); + disposables.add(this.contextKeyService.onDidChangeContext(e => { + if (e.affectsSome(new Set(preConditions.keys()))) { + button.enabled = this.contextKeyService.contextMatchesRules(preConditions); + } + })); + } + } + disposables.add(button); hasFoundButton = true; result.push(buttonContainer); From 53c0b5ac530b55356d3487612fce4abe9db0b1b1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2024 13:06:53 +0200 Subject: [PATCH 444/755] Joh/mental-koi (#217004) * hightlight first button only when inline chat has a prompt * rename "Cancel Request" to "Stop Request" * mark `inlineChat.experimental.textButtons` as experimental * show all "input" command when not using text btns * When cancelling, undo untill before the request --- .../chatTextEditContentPart.ts | 6 ++- .../browser/inlineChat.contribution.ts | 16 +++---- .../browser/inlineChatContentWidget.ts | 10 +++-- .../browser/inlineChatController.ts | 41 +++++++---------- .../inlineChat/browser/inlineChatSession.ts | 34 ++++++++++---- .../browser/inlineChatStrategies.ts | 8 ++-- .../inlineChat/browser/media/inlineChat.css | 14 +++--- .../contrib/inlineChat/common/inlineChat.ts | 3 +- .../test/browser/inlineChatController.test.ts | 45 ++++++++++++++++++- 9 files changed, 119 insertions(+), 58 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts index 5232437f966aa..5f4e6556c5cb2 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTextEditContentPart.ts @@ -55,7 +55,11 @@ export class ChatTextEditContentPart extends Disposable implements IChatContentP // TODO@jrieken move this into the CompareCodeBlock and properly say what kind of changes happen if (rendererOptions.renderTextEditsAsSummary?.(chatTextEdit.uri)) { if (isResponseVM(element) && element.response.value.every(item => item.kind === 'textEditGroup')) { - this.domNode = $('.interactive-edits-summary', undefined, !element.isComplete ? localize('editsSummary1', "Making changes...") : localize('editsSummary', "Made changes.")); + this.domNode = $('.interactive-edits-summary', undefined, !element.isComplete + ? localize('editsSummary1', "Making changes...") + : element.isCanceled + ? localize('edits0', "Making changes was aborted.") + : localize('editsSummary', "Made changes.")); } else { this.domNode = $('div'); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts index d5d84180b5740..21f02771f96a6 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts @@ -58,8 +58,8 @@ const cancelActionMenuItem: IMenuItem = { order: 0, command: { id: CancelAction.ID, - title: localize('cancel', "Cancel Request"), - shortTitle: localize('cancelShort', "Cancel"), + title: localize('cancel', "Stop Request"), + shortTitle: localize('cancelShort', "Stop"), }, when: ContextKeyExpr.and( CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, @@ -111,14 +111,12 @@ class MenuCopier implements IDisposable { const store = new DisposableStore(); function updateMenu() { - if (configService.getValue(InlineChatConfigKeys.ExpTextButtons)) { - store.clear(); - for (const item of MenuRegistry.getMenuItems(MenuId.ChatExecute)) { - if (isIMenuItem(item) && (item.command.id === SubmitAction.ID || item.command.id === CancelAction.ID)) { - continue; - } - store.add(MenuRegistry.appendMenuItem(MENU_INLINE_CHAT_EXECUTE, item)); + store.clear(); + for (const item of MenuRegistry.getMenuItems(MenuId.ChatExecute)) { + if (configService.getValue(InlineChatConfigKeys.ExpTextButtons) && isIMenuItem(item) && (item.command.id === SubmitAction.ID || item.command.id === CancelAction.ID)) { + continue; } + store.add(MenuRegistry.appendMenuItem(MENU_INLINE_CHAT_EXECUTE, item)); } } updateMenu(); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts index a10f96a8be094..e22cab4975c1b 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts @@ -107,18 +107,20 @@ export class InlineChatContentWidget implements IContentWidget { } this._domNode.appendChild(this._toolbarContainer); - this._store.add(scopedInstaService.createInstance(MenuWorkbenchToolBar, this._toolbarContainer, MENU_INLINE_CHAT_CONTENT_STATUS, { + const toolbar = this._store.add(scopedInstaService.createInstance(MenuWorkbenchToolBar, this._toolbarContainer, MENU_INLINE_CHAT_CONTENT_STATUS, { actionViewItemProvider: action => action instanceof MenuItemAction ? instaService.createInstance(TextOnlyMenuEntryActionViewItem, action, { conversational: true }) : undefined, toolbarOptions: { primaryGroup: '0_main' }, icon: false, label: true, })); + this._store.add(toolbar.onDidChangeMenuItems(() => { + this._domNode.classList.toggle('contents', toolbar.getItemsLength() > 1); + })); + const tracker = dom.trackFocus(this._domNode); this._store.add(tracker.onDidBlur(() => { - if (this._visible && this._widget.inputEditor.getModel()?.getValueLength() === 0 - // && !"ON" - ) { + if (this._visible && this._widget.inputEditor.getModel()?.getValueLength() === 0) { this._onDidBlur.fire(); } })); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 2bc8215c4dec9..8fdf2669f596a 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -428,21 +428,7 @@ export class InlineChatController implements IEditorContribution { // TODO@jrieken there is still some work left for when a request "in the middle" // is removed. We will undo all changes till that point but not remove those // later request - const exchange = this._session!.exchanges.find(candidate => candidate.prompt.request.id === e.requestId); - if (exchange && this._editor.hasModel()) { - // undo till this point - this._session!.hunkData.ignoreTextModelNChanges = true; - try { - - const model = this._editor.getModel(); - const targetAltVersion = exchange.prompt.modelAltVersionId; - while (targetAltVersion < model.getAlternativeVersionId() && model.canUndo()) { - await model.undo(); - } - } finally { - this._session!.hunkData.ignoreTextModelNChanges = false; - } - } + await this._session!.undoChangesUntil(e.requestId); } })); @@ -734,6 +720,12 @@ export class InlineChatController implements IEditorContribution { await responsePromise.p; await progressiveEditsQueue.whenIdle(); + + if (response.isCanceled) { + // + await this._session.undoChangesUntil(response.requestId); + } + store.dispose(); const diff = await this._editorWorkerService.computeDiff(this._session.textModel0.uri, this._session.textModelN.uri, { computeMoves: false, maxComputationTimeMs: Number.MAX_SAFE_INTEGER, ignoreTrimWhitespace: false }, 'advanced'); @@ -771,7 +763,7 @@ export class InlineChatController implements IEditorContribution { // real response -> complex... this._ui.value.zone.widget.updateStatus(''); - const position = await this._strategy.renderChanges(response); + const position = await this._strategy.renderChanges(); if (position) { // if the selection doesn't start far off we keep the widget at its current position // because it makes reading this nicer @@ -827,7 +819,7 @@ export class InlineChatController implements IEditorContribution { this._sessionStore.clear(); // only stash sessions that were not unstashed, not "empty", and not interacted with - const shouldStash = !this._session.isUnstashed && !!this._session.lastExchange && this._session.hunkData.size === this._session.hunkData.pending; + const shouldStash = !this._session.isUnstashed && this._session.chatModel.hasRequests && this._session.hunkData.size === this._session.hunkData.pending; let undoCancelEdits: IValidEditOperation[] = []; try { undoCancelEdits = this._strategy.cancel(); @@ -874,7 +866,7 @@ export class InlineChatController implements IEditorContribution { widgetPosition = this._editor.getSelection().getStartPosition().delta(-1); } - if (this._session && !position && (this._session.hasChangedText || this._session.lastExchange)) { + if (this._session && !position && (this._session.hasChangedText || this._session.chatModel.hasRequests)) { widgetPosition = this._session.wholeRange.value.getStartPosition().delta(-1); } @@ -1063,10 +1055,10 @@ export class InlineChatController implements IEditorContribution { } acceptSession(): void { - if (this._session?.lastExchange?.response instanceof ReplyResponse && this._session?.lastExchange?.response.chatResponse) { - const response = this._session?.lastExchange?.response.chatResponse; + const response = this._session?.chatModel.getRequests().at(-1)?.response; + if (response) { this._chatService.notifyUserAction({ - sessionId: this._session.chatModel.sessionId, + sessionId: response.session.sessionId, requestId: response.requestId, agentId: response.agent?.id, result: response.result, @@ -1088,11 +1080,10 @@ export class InlineChatController implements IEditorContribution { } async cancelSession() { - - if (this._session?.lastExchange?.response instanceof ReplyResponse && this._session?.lastExchange?.response.chatResponse) { - const response = this._session?.lastExchange?.response.chatResponse; + const response = this._session?.chatModel.getRequests().at(-1)?.response; + if (response) { this._chatService.notifyUserAction({ - sessionId: this._session.chatModel.sessionId, + sessionId: response.session.sessionId, requestId: response.requestId, agentId: response.agent?.id, result: response.result, diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts index 1ac39ac4b4053..4d18fe88fce63 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSession.ts @@ -130,7 +130,7 @@ export class Session { private _lastInput: SessionPrompt | undefined; private _isUnstashed: boolean = false; - private readonly _exchange: SessionExchange[] = []; + private readonly _exchanges: SessionExchange[] = []; private readonly _startTime = new Date(); private readonly _teldata: TelemetryData; @@ -147,7 +147,7 @@ export class Session { */ readonly textModel0: ITextModel, /** - * The document into which AI edits went, when live this is `targetUri` otherwise it is a temporary document + * The model of the editor */ readonly textModelN: ITextModel, readonly agent: IChatAgent, @@ -191,17 +191,35 @@ export class Session { addExchange(exchange: SessionExchange): void { this._isUnstashed = false; - const newLen = this._exchange.push(exchange); + const newLen = this._exchanges.push(exchange); this._teldata.rounds += `${newLen}|`; // this._teldata.responseTypes += `${exchange.response instanceof ReplyResponse ? exchange.response.responseType : InlineChatResponseTypes.Empty}|`; } - get exchanges(): readonly SessionExchange[] { - return this._exchange; + get lastExchange(): SessionExchange | undefined { + return this._exchanges[this._exchanges.length - 1]; } - get lastExchange(): SessionExchange | undefined { - return this._exchange[this._exchange.length - 1]; + async undoChangesUntil(requestId: string): Promise { + const idx = this._exchanges.findIndex(candidate => candidate.prompt.request.id === requestId); + if (idx < 0) { + return false; + } + // undo till this point + this.hunkData.ignoreTextModelNChanges = true; + try { + const targetAltVersion = this._exchanges[idx].prompt.modelAltVersionId; + while (targetAltVersion < this.textModelN.getAlternativeVersionId() && this.textModelN.canUndo()) { + await this.textModelN.undo(); + } + } finally { + this.hunkData.ignoreTextModelNChanges = false; + } + // TODO@jrieken cannot do this yet because some parts still rely on + // exchanges being around... + // // remove this and following exchanges + // this._exchanges.length = idx; + return true; } get hasChangedText(): boolean { @@ -251,7 +269,7 @@ export class Session { when: this._startTime, exchanges: [] }; - for (const exchange of this._exchange) { + for (const exchange of this._exchanges) { const response = exchange.response; if (response instanceof ReplyResponse) { result.exchanges.push({ prompt: exchange.prompt.value, res: response.chatResponse }); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts index 05f3fde5e8812..2e2f692cc88fd 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatStrategies.ts @@ -26,7 +26,7 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { Progress } from 'vs/platform/progress/common/progress'; import { SaveReason } from 'vs/workbench/common/editor'; import { countWords } from 'vs/workbench/contrib/chat/common/chatWordCounter'; -import { HunkInformation, ReplyResponse, Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; +import { HunkInformation, Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; import { InlineChatZoneWidget } from './inlineChatZoneWidget'; import { CTX_INLINE_CHAT_CHANGE_HAS_DIFF, CTX_INLINE_CHAT_CHANGE_SHOWS_DIFF, CTX_INLINE_CHAT_DOCUMENT_CHANGED, InlineChatConfigKeys, minimapInlineChatDiffInserted, overviewRulerInlineChatDiffInserted } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { HunkState } from './inlineChatSession'; @@ -136,7 +136,7 @@ export abstract class EditModeStrategy { abstract makeChanges(edits: ISingleEditOperation[], obs: IEditObserver, undoStopBefore: boolean): Promise; - abstract renderChanges(response: ReplyResponse): Promise; + abstract renderChanges(): Promise; move?(next: boolean): void; @@ -190,7 +190,7 @@ export class PreviewStrategy extends EditModeStrategy { override async makeProgressiveChanges(): Promise { } - override async renderChanges(response: ReplyResponse): Promise { } + override async renderChanges(): Promise { } hasFocus(): boolean { return this._zone.widget.hasFocus(); @@ -364,7 +364,7 @@ export class LiveStrategy extends EditModeStrategy { private readonly _hunkDisplayData = new Map(); - override async renderChanges(response: ReplyResponse) { + override async renderChanges() { this._progressiveEditingDecorations.clear(); diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index b2efaecda491c..aa6f14f0ae40b 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -160,11 +160,6 @@ border-radius: 3px; } - .monaco-action-bar .action-item.menu-entry.text-only:first-of-type .action-label{ - color: var(--vscode-button-foreground); - background-color: var(--vscode-button-background); - } - .monaco-action-bar .action-item.menu-entry.text-only + .action-item:not(.text-only) > .monaco-dropdown .action-label { font-size: 12px; line-height: 16px; @@ -173,6 +168,15 @@ } } +.monaco-workbench .inline-chat .status .actions, +.monaco-workbench .inline-chat-content-widget.contents .toolbar { + + .monaco-action-bar .action-item.menu-entry.text-only:first-of-type .action-label{ + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); + } +} + .monaco-workbench .inline-chat .status .actions > .monaco-button, .monaco-workbench .inline-chat .status .actions > .monaco-button-dropdown { margin-right: 4px; diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index 4039811d60d1c..3ab26fb433556 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -69,7 +69,8 @@ Registry.as(Extensions.Configuration).registerConfigurat [InlineChatConfigKeys.ExpTextButtons]: { description: localize('txtButtons', "Whether to use textual buttons (Requires restart)."), default: false, - type: 'boolean' + type: 'boolean', + tags: ['experimental'] }, } }); diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts index 00e75f658161b..cc4ddad6e7ad6 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts @@ -42,7 +42,7 @@ import { IInlineChatSessionService } from '../../browser/inlineChatSessionServic import { InlineChatSessionServiceImpl } from '../../browser/inlineChatSessionServiceImpl'; import { TestWorkerService } from './testWorkerService'; import { IExtensionService, nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; -import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatProgress, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { ChatService } from 'vs/workbench/contrib/chat/common/chatServiceImpl'; import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; @@ -778,4 +778,47 @@ suite('InteractiveChatController', function () { assert.strictEqual(model.getValue(), 'TRY:1\ntwo\none\n'); }); + + test('Stopping/cancelling a request should undo its changes', async function () { + + model.setValue('World'); + + const deferred = new DeferredPromise(); + let progress: ((part: IChatProgress) => void) | undefined; + + store.add(chatAgentService.registerDynamicAgent({ + id: 'testEditorAgent2', + ...agentData + }, { + async invoke(request, _progress, history, token) { + + progress = _progress; + await deferred.p; + return {}; + }, + })); + + ctrl = instaService.createInstance(TestController, editor); + + // REQUEST 1 + const p = ctrl.awaitStates([...TestController.INIT_SEQUENCE, State.SHOW_REQUEST]); + ctrl.run({ message: 'Hello', autoSend: true }); + assert.strictEqual(await p, undefined); + + assertType(progress); + + const modelChange = new Promise(resolve => model.onDidChangeContent(() => resolve())); + + progress({ kind: 'textEdit', uri: model.uri, edits: [{ range: new Range(1, 1, 1, 1), text: 'Hello-Hello' }] }); + + await modelChange; + assert.strictEqual(model.getValue(), 'HelloWorld'); // first word has been streamed + + const p2 = ctrl.awaitStates([State.SHOW_RESPONSE, State.WAIT_FOR_INPUT]); + chatService.cancelCurrentRequestForSession(ctrl.chatWidget.viewModel!.model.sessionId); + assert.strictEqual(await p2, undefined); + + assert.strictEqual(model.getValue(), 'World'); + + }); }); From 74a5de9113836d14a531b982070230379ec59005 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2024 13:18:58 +0200 Subject: [PATCH 445/755] fix #216574 (#217023) --- .../extensionRecommendationNotificationService.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts index 4152bf2f35130..1f510c15b173b 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts @@ -14,6 +14,7 @@ import { isString } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionRecommendationNotificationService, IExtensionRecommendations, RecommendationsNotificationResult, RecommendationSource, RecommendationSourceToString } from 'vs/platform/extensionRecommendations/common/extensionRecommendations'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -283,9 +284,18 @@ export class ExtensionRecommendationNotificationService extends Disposable imple const installExtensions = async (isMachineScoped: boolean) => { this.runAction(this.instantiationService.createInstance(SearchExtensionsAction, searchValue)); onDidInstallRecommendedExtensions(extensions); + const galleryExtensions: IGalleryExtension[] = [], resourceExtensions: IExtension[] = []; + for (const extension of extensions) { + if (extension.gallery) { + galleryExtensions.push(extension.gallery); + } else if (extension.resourceExtension) { + resourceExtensions.push(extension); + } + } await Promises.settled([ Promises.settled(extensions.map(extension => this.extensionsWorkbenchService.open(extension, { pinned: true }))), - this.extensionManagementService.installGalleryExtensions(extensions.map(e => ({ extension: e.gallery!, options: { isMachineScoped } }))) + galleryExtensions.length ? this.extensionManagementService.installGalleryExtensions(galleryExtensions.map(e => ({ extension: e, options: { isMachineScoped } }))) : Promise.resolve(), + resourceExtensions.length ? Promise.allSettled(resourceExtensions.map(r => this.extensionsWorkbenchService.install(r))) : Promise.resolve() ]); }; choices.push({ From cd5f306825446b4301eb90bb63cc6f59641443c2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2024 15:19:09 +0200 Subject: [PATCH 446/755] fixes: install pre-release action & disablement (#217157) --- .../browser/extensions.contribution.ts | 30 +++++++++++++++++-- .../extensions/browser/extensionsActions.ts | 1 + .../extensions/browser/extensionsList.ts | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 89da697bf1973..55dfb610a3205 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -1493,7 +1493,31 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi menu: { id: MenuId.ExtensionContext, group: '0_install', - when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), CONTEXT_SYNC_ENABLEMENT) + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), CONTEXT_SYNC_ENABLEMENT), + order: 1 + }, + run: async (accessor: ServicesAccessor, extensionId: string) => { + const instantiationService = accessor.get(IInstantiationService); + const extension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, { id: extensionId }))[0] + || (await this.extensionsWorkbenchService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; + if (extension) { + const action = instantiationService.createInstance(InstallAction, { + isMachineScoped: true, + }); + action.extension = extension; + return action.run(); + } + } + }); + + this.registerExtensionAction({ + id: 'workbench.extensions.action.installPrereleaseAndDonotSync', + title: localize('installPrereleaseAndDonotSync', "Install Pre-Release (Do not Sync)"), + menu: { + id: MenuId.ExtensionContext, + group: '0_install', + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.has('extensionHasPreReleaseVersion'), CONTEXT_SYNC_ENABLEMENT), + order: 2 }, run: async (accessor: ServicesAccessor, extensionId: string) => { const instantiationService = accessor.get(IInstantiationService); @@ -1502,6 +1526,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi if (extension) { const action = instantiationService.createInstance(InstallAction, { isMachineScoped: true, + preRelease: true }); action.extension = extension; return action.run(); @@ -1515,7 +1540,8 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi menu: { id: MenuId.ExtensionContext, group: '0_install', - when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension')) + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension')), + order: 3 }, run: async (accessor: ServicesAccessor, extensionId: string) => { const instantiationService = accessor.get(IInstantiationService); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 34c1862a06177..7141e8effe416 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -1168,6 +1168,7 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['installedExtensionIsOptedToPreRelease', !!extension.local?.preRelease]); cksOverlay.push(['galleryExtensionIsPreReleaseVersion', !!extension.gallery?.properties.isPreReleaseVersion]); cksOverlay.push(['galleryExtensionHasPreReleaseVersion', extension.gallery?.hasPreReleaseVersion]); + cksOverlay.push(['extensionHasPreReleaseVersion', extension.hasPreReleaseVersion]); cksOverlay.push(['extensionHasReleaseVersion', extension.hasReleaseVersion]); const [colorThemes, fileIconThemes, productIconThemes] = await Promise.all([workbenchThemeService.getColorThemes(), workbenchThemeService.getFileIconThemes(), workbenchThemeService.getProductIconThemes()]); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 8a443609adc8b..d74439e6c5269 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -194,7 +194,7 @@ export class Renderer implements IPagedRenderer { data.extensionDisposables = dispose(data.extensionDisposables); const updateEnablement = () => { - const disabled = extension.local && !this.extensionEnablementService.isEnabled(extension.local); + const disabled = extension.state === ExtensionState.Installed && extension.local && !this.extensionEnablementService.isEnabled(extension.local); const deprecated = !!extension.deprecationInfo; data.element.classList.toggle('deprecated', deprecated); data.root.classList.toggle('disabled', disabled); From d38b24bf7ab6318bf69a5898857013f4c277a998 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Mon, 24 Jun 2024 15:27:01 +0200 Subject: [PATCH 447/755] Developing the accessible hover view/help (#216710) * adding code so thatcontent is shown appropriately * adding changes * adding changes * removing the fetching of the markdown hover content * adding changes * adding status bar into the rendered hover parts * polishing the code * adding code * polishing code * fixing the text for accessible help * combining the text * modifying the chat input editor hover * adding polish * adding localization * merging main * polishing after merging * returning the elemenet and the specific hover part * polishing the code * adding polish * polishing * merging main * wip * cleaning up the code, introducing new disposable types * polishing the code * adding code * Adding polish code * polishing the code * polishing code * adding code * polsih code * polishing the method getAccessibleContent * removing the sticky controller hover * disposing onClose --- .../browser/colorHoverParticipant.ts | 35 ++- .../colorPicker/browser/colorPickerWidget.ts | 13 +- .../browser/standaloneColorPickerWidget.ts | 7 +- .../hover/browser/contentHoverController.ts | 66 ++--- .../hover/browser/contentHoverRendered.ts | 263 +++++++++++++++-- .../hover/browser/hoverAccessibleViews.ts | 100 +++---- .../contrib/hover/browser/hoverActions.ts | 14 +- .../contrib/hover/browser/hoverController.ts | 24 +- .../contrib/hover/browser/hoverTypes.ts | 35 ++- .../hover/browser/markdownHoverParticipant.ts | 270 ++++++++++-------- .../hover/browser/markerHoverParticipant.ts | 32 ++- .../inlayHints/browser/inlayHintsHover.ts | 4 +- .../browser/hoverParticipant.ts | 35 ++- .../inlineEdit/browser/hoverParticipant.ts | 23 +- .../browser/unicodeHighlighter.ts | 10 +- .../browser/contrib/chatInputEditorHover.ts | 32 ++- 16 files changed, 655 insertions(+), 308 deletions(-) diff --git a/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts b/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts index 1bbdde4c7466e..32956ec08da1d 100644 --- a/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts @@ -6,7 +6,7 @@ import { AsyncIterableObject } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Color, RGBA } from 'vs/base/common/color'; -import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; @@ -16,11 +16,12 @@ import { getColorPresentations, getColors } from 'vs/editor/contrib/colorPicker/ import { ColorDetector } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; import { ColorPickerModel } from 'vs/editor/contrib/colorPicker/browser/colorPickerModel'; import { ColorPickerWidget } from 'vs/editor/contrib/colorPicker/browser/colorPickerWidget'; -import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { Dimension } from 'vs/base/browser/dom'; +import * as nls from 'vs/nls'; export class ColorHover implements IHoverPart { @@ -88,10 +89,22 @@ export class ColorHoverParticipant implements IEditorHoverParticipant { + const renderedPart = renderHoverParts(this, this._editor, this._themeService, hoverParts, context); + if (!renderedPart) { + return new RenderedHoverParts([]); + } + this._colorPicker = renderedPart.colorPicker; + const renderedHoverPart: IRenderedHoverPart = { + hoverPart: renderedPart.hoverPart, + hoverElement: this._colorPicker.domNode, + dispose() { renderedPart.disposables.dispose(); } + }; + return new RenderedHoverParts([renderedHoverPart]); + } + + public getAccessibleContent(hoverPart: ColorHover): string { + return nls.localize('hoverAccessibilityColorParticipant', 'There is a color picker here.'); } public handleResize(): void { @@ -158,7 +171,7 @@ export class StandaloneColorPickerParticipant { } } - public renderHoverParts(context: IEditorHoverRenderContext, hoverParts: ColorHover[] | StandaloneColorPickerHover[]): { disposables: IDisposable; colorPicker: ColorPickerWidget | undefined } { + public renderHoverParts(context: IEditorHoverRenderContext, hoverParts: StandaloneColorPickerHover[]): { disposables: IDisposable; hoverPart: StandaloneColorPickerHover; colorPicker: ColorPickerWidget } | undefined { return renderHoverParts(this, this._editor, this._themeService, hoverParts, context); } @@ -190,9 +203,9 @@ async function _createColorHover(participant: ColorHoverParticipant | Standalone } } -function renderHoverParts(participant: ColorHoverParticipant | StandaloneColorPickerParticipant, editor: ICodeEditor, themeService: IThemeService, hoverParts: ColorHover[] | StandaloneColorPickerHover[], context: IEditorHoverRenderContext): { disposables: IDisposable; colorPicker: ColorPickerWidget | undefined } { +function renderHoverParts(participant: ColorHoverParticipant | StandaloneColorPickerParticipant, editor: ICodeEditor, themeService: IThemeService, hoverParts: T[], context: IEditorHoverRenderContext): { hoverPart: T; colorPicker: ColorPickerWidget; disposables: DisposableStore } | undefined { if (hoverParts.length === 0 || !editor.hasModel()) { - return { disposables: Disposable.None, colorPicker: undefined }; + return undefined; } if (context.setMinimumDimensions) { const minimumHeight = editor.getOption(EditorOption.lineHeight) + 8; @@ -208,7 +221,7 @@ function renderHoverParts(participant: ColorHoverParticipant | StandaloneColorPi let editorUpdatedByColorPicker = false; let range = new Range(colorHover.range.startLineNumber, colorHover.range.startColumn, colorHover.range.endLineNumber, colorHover.range.endColumn); if (participant instanceof StandaloneColorPickerParticipant) { - const color = hoverParts[0].model.color; + const color = colorHover.model.color; participant.color = color; _updateColorPresentations(editorModel, model, color, range, colorHover); disposables.add(model.onColorFlushed((color: Color) => { @@ -232,7 +245,7 @@ function renderHoverParts(participant: ColorHoverParticipant | StandaloneColorPi editor.focus(); } })); - return { disposables, colorPicker }; + return { hoverPart: colorHover, colorPicker, disposables }; } function _updateEditorModel(editor: IActiveCodeEditor, range: Range, model: ColorPickerModel): Range { diff --git a/src/vs/editor/contrib/colorPicker/browser/colorPickerWidget.ts b/src/vs/editor/contrib/colorPicker/browser/colorPickerWidget.ts index 7688defca5f24..b911fe5b0f5e7 100644 --- a/src/vs/editor/contrib/colorPicker/browser/colorPickerWidget.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorPickerWidget.ts @@ -468,6 +468,7 @@ export class InsertButton extends Disposable { export class ColorPickerWidget extends Widget implements IEditorHoverColorPickerWidget { private static readonly ID = 'editor.contrib.colorPickerWidget'; + private readonly _domNode: HTMLElement; body: ColorPickerBody; header: ColorPickerHeader; @@ -477,11 +478,11 @@ export class ColorPickerWidget extends Widget implements IEditorHoverColorPicker this._register(PixelRatio.getInstance(dom.getWindow(container)).onDidChange(() => this.layout())); - const element = $('.colorpicker-widget'); - container.appendChild(element); + this._domNode = $('.colorpicker-widget'); + container.appendChild(this._domNode); - this.header = this._register(new ColorPickerHeader(element, this.model, themeService, standaloneColorPicker)); - this.body = this._register(new ColorPickerBody(element, this.model, this.pixelRatio, standaloneColorPicker)); + this.header = this._register(new ColorPickerHeader(this._domNode, this.model, themeService, standaloneColorPicker)); + this.body = this._register(new ColorPickerBody(this._domNode, this.model, this.pixelRatio, standaloneColorPicker)); } getId(): string { @@ -491,4 +492,8 @@ export class ColorPickerWidget extends Widget implements IEditorHoverColorPicker layout(): void { this.body.layout(); } + + get domNode(): HTMLElement { + return this._domNode; + } } diff --git a/src/vs/editor/contrib/colorPicker/browser/standaloneColorPickerWidget.ts b/src/vs/editor/contrib/colorPicker/browser/standaloneColorPickerWidget.ts index 7f9cad0d757c4..424448611b18f 100644 --- a/src/vs/editor/contrib/colorPicker/browser/standaloneColorPickerWidget.ts +++ b/src/vs/editor/contrib/colorPicker/browser/standaloneColorPickerWidget.ts @@ -224,11 +224,12 @@ export class StandaloneColorPickerWidget extends Disposable implements IContentW }; this._colorHover = colorHover; - const { disposables, colorPicker } = this._standaloneColorPickerParticipant.renderHoverParts(context, [colorHover]); - this._register(disposables); - if (colorPicker === undefined) { + const renderedHoverPart = this._standaloneColorPickerParticipant.renderHoverParts(context, [colorHover]); + if (!renderedHoverPart) { return; } + this._register(renderedHoverPart.disposables); + const colorPicker = renderedHoverPart.colorPicker; this._body.classList.add('standalone-colorpicker-body'); this._body.style.maxHeight = Math.max(this._editor.getLayoutInfo().height / 4, 250) + 'px'; this._body.style.maxWidth = Math.max(this._editor.getLayoutInfo().width * 0.66, 500) + 'px'; diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index 7f49ad50a417f..5ae7773bd1d0b 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -14,26 +14,21 @@ import { HoverOperation, HoverStartMode, HoverStartSource } from 'vs/editor/cont import { HoverAnchor, HoverParticipantRegistry, HoverRangeAnchor, IEditorHoverContext, IEditorHoverParticipant, IHoverPart, IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; -import { InlayHintsHover } from 'vs/editor/contrib/inlayHints/browser/inlayHintsHover'; import { HoverVerbosityAction } from 'vs/editor/common/standalone/standaloneEnums'; import { ContentHoverWidget } from 'vs/editor/contrib/hover/browser/contentHoverWidget'; import { ContentHoverComputer } from 'vs/editor/contrib/hover/browser/contentHoverComputer'; import { HoverResult } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; import { Emitter } from 'vs/base/common/event'; -import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/colorHoverParticipant'; import { RenderedContentHover } from 'vs/editor/contrib/hover/browser/contentHoverRendered'; export class ContentHoverController extends Disposable implements IHoverWidget { private _currentResult: HoverResult | null = null; + private _renderedContentHover: RenderedContentHover | undefined; private readonly _computer: ContentHoverComputer; private readonly _contentHoverWidget: ContentHoverWidget; private readonly _participants: IEditorHoverParticipant[]; - // TODO@aiday-mar make array of participants, dispatch between them - private readonly _markdownHoverParticipant: MarkdownHoverParticipant | undefined; - private readonly _colorHoverParticipant: ColorHoverParticipant | undefined; private readonly _hoverOperation: HoverOperation; private readonly _onContentsChanged = this._register(new Emitter()); @@ -46,34 +41,23 @@ export class ContentHoverController extends Disposable implements IHoverWidget { ) { super(); this._contentHoverWidget = this._register(this._instantiationService.createInstance(ContentHoverWidget, this._editor)); - const initializedParticipants = this._initializeHoverParticipants(); - this._participants = initializedParticipants.participants; - this._markdownHoverParticipant = initializedParticipants.markdownHoverParticipant; - this._colorHoverParticipant = initializedParticipants.colorHoverParticipant; + this._participants = this._initializeHoverParticipants(); this._computer = new ContentHoverComputer(this._editor, this._participants); this._hoverOperation = this._register(new HoverOperation(this._editor, this._computer)); this._registerListeners(); } - private _initializeHoverParticipants(): { participants: IEditorHoverParticipant[]; markdownHoverParticipant: MarkdownHoverParticipant | undefined; colorHoverParticipant: ColorHoverParticipant | undefined } { + private _initializeHoverParticipants(): IEditorHoverParticipant[] { const participants: IEditorHoverParticipant[] = []; - let markdownHoverParticipant: MarkdownHoverParticipant | undefined; - let colorHoverParticipant: ColorHoverParticipant | undefined; for (const participant of HoverParticipantRegistry.getAll()) { const participantInstance = this._instantiationService.createInstance(participant, this._editor); - if (participantInstance instanceof MarkdownHoverParticipant && !(participantInstance instanceof InlayHintsHover)) { - markdownHoverParticipant = participantInstance; - } - if (participantInstance instanceof ColorHoverParticipant) { - colorHoverParticipant = participantInstance; - } participants.push(participantInstance); } participants.sort((p1, p2) => p1.hoverOrdinal - p2.hoverOrdinal); this._register(this._contentHoverWidget.onDidResize(() => { this._participants.forEach(participant => participant.handleResize?.()); })); - return { participants, markdownHoverParticipant, colorHoverParticipant }; + return participants; } private _registerListeners(): void { @@ -221,11 +205,11 @@ export class ContentHoverController extends Disposable implements IHoverWidget { private _showHover(hoverResult: HoverResult): void { const context = this._getHoverContext(); - const renderedHover = new RenderedContentHover(this._editor, hoverResult, this._participants, this._computer, context, this._keybindingService); - if (renderedHover.domNodeHasChildren) { - this._contentHoverWidget.show(renderedHover); + this._renderedContentHover = new RenderedContentHover(this._editor, hoverResult, this._participants, this._computer, context, this._keybindingService); + if (this._renderedContentHover.domNodeHasChildren) { + this._contentHoverWidget.show(this._renderedContentHover); } else { - renderedHover.dispose(); + this._renderedContentHover.dispose(); } } @@ -301,28 +285,32 @@ export class ContentHoverController extends Disposable implements IHoverWidget { this._startShowingOrUpdateHover(new HoverRangeAnchor(0, range, undefined, undefined), mode, source, focus, null); } - public async updateMarkdownHoverVerbosityLevel(action: HoverVerbosityAction, index?: number, focus?: boolean): Promise { - this._markdownHoverParticipant?.updateMarkdownHoverVerbosityLevel(action, index, focus); + public getWidgetContent(): string | undefined { + const node = this._contentHoverWidget.getDomNode(); + if (!node.textContent) { + return undefined; + } + return node.textContent; + } + + public async updateHoverVerbosityLevel(action: HoverVerbosityAction, index: number, focus?: boolean): Promise { + this._renderedContentHover?.updateHoverVerbosityLevel(action, index, focus); } - public focusedMarkdownHoverIndex(): number { - return this._markdownHoverParticipant?.focusedMarkdownHoverIndex() ?? -1; + public doesHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { + return this._renderedContentHover?.doesHoverAtIndexSupportVerbosityAction(index, action) ?? false; } - public markdownHoverContentAtIndex(index: number): string { - return this._markdownHoverParticipant?.markdownHoverContentAtIndex(index) ?? ''; + public getAccessibleWidgetContent(): string | undefined { + return this._renderedContentHover?.getAccessibleWidgetContent(); } - public doesMarkdownHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { - return this._markdownHoverParticipant?.doesMarkdownHoverAtIndexSupportVerbosityAction(index, action) ?? false; + public getAccessibleWidgetContentAtIndex(index: number): string | undefined { + return this._renderedContentHover?.getAccessibleWidgetContentAtIndex(index); } - public getWidgetContent(): string | undefined { - const node = this._contentHoverWidget.getDomNode(); - if (!node.textContent) { - return undefined; - } - return node.textContent; + public focusedHoverPartIndex(): number { + return this._renderedContentHover?.focusedHoverPartIndex ?? -1; } public containsNode(node: Node | null | undefined): boolean { @@ -372,7 +360,7 @@ export class ContentHoverController extends Disposable implements IHoverWidget { } public get isColorPickerVisible(): boolean { - return this._colorHoverParticipant?.isColorPickerVisible() ?? false; + return this._renderedContentHover?.isColorPickerVisible() ?? false; } public get isVisibleFromKeyboard(): boolean { diff --git a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts index 5d9c6f52c8c21..6384984b529cf 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEditorHoverContext, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { IEditorHoverContext, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ContentHoverComputer } from 'vs/editor/contrib/hover/browser/contentHoverComputer'; import { EditorHoverStatusBar } from 'vs/editor/contrib/hover/browser/contentHoverStatusBar'; @@ -14,6 +14,13 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { HoverResult } from 'vs/editor/contrib/hover/browser/contentHoverTypes'; +import * as dom from 'vs/base/browser/dom'; +import { HoverVerbosityAction } from 'vs/editor/common/languages'; +import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; +import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/colorHoverParticipant'; +import { localize } from 'vs/nls'; +import { InlayHintsHover } from 'vs/editor/contrib/inlayHints/browser/inlayHintsHover'; +import { BugIndicatingError } from 'vs/base/common/errors'; export class RenderedContentHover extends Disposable { @@ -44,8 +51,8 @@ export class RenderedContentHover extends Disposable { editor, participants, parts, - context, - keybindingService + keybindingService, + context )); const { showAtPosition, showAtSecondaryPosition } = RenderedContentHover.computeHoverPositions(editor, anchor.range, parts); this.shouldAppearBeforeContent = parts.some(m => m.isBeforeContent); @@ -65,6 +72,30 @@ export class RenderedContentHover extends Disposable { return this._renderedHoverParts.domNodeHasChildren; } + public get focusedHoverPartIndex(): number { + return this._renderedHoverParts.focusedHoverPartIndex; + } + + public getAccessibleWidgetContent(): string { + return this._renderedHoverParts.getAccessibleContent(); + } + + public getAccessibleWidgetContentAtIndex(index: number): string { + return this._renderedHoverParts.getAccessibleHoverContentAtIndex(index); + } + + public async updateHoverVerbosityLevel(action: HoverVerbosityAction, index: number, focus?: boolean): Promise { + this._renderedHoverParts.updateHoverVerbosityLevel(action, index, focus); + } + + public doesHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { + return this._renderedHoverParts.doesHoverAtIndexSupportVerbosityAction(index, action); + } + + public isColorPickerVisible(): boolean { + return this._renderedHoverParts.isColorPickerVisible(); + } + public static computeHoverPositions(editor: ICodeEditor, anchorRange: Range, hoverParts: IHoverPart[]): { showAtPosition: Position; showAtSecondaryPosition: Position } { let startColumnBoundary = 1; @@ -116,6 +147,53 @@ export class RenderedContentHover extends Disposable { } } +interface IRenderedContentHoverPart { + /** + * Type of rendered part + */ + type: 'hoverPart'; + /** + * Participant of the rendered hover part + */ + participant: IEditorHoverParticipant; + /** + * The rendered hover part + */ + hoverPart: IHoverPart; + /** + * The HTML element containing the hover status bar. + */ + hoverElement: HTMLElement; +} + +interface IRenderedContentStatusBar { + /** + * Type of rendered part + */ + type: 'statusBar'; + /** + * The HTML element containing the hover status bar. + */ + hoverElement: HTMLElement; +} + +type IRenderedContentHoverPartOrStatusBar = IRenderedContentHoverPart | IRenderedContentStatusBar; + +class RenderedStatusBar implements IDisposable { + + constructor(fragment: DocumentFragment, private readonly _statusBar: EditorHoverStatusBar) { + fragment.appendChild(this._statusBar.hoverElement); + } + + get hoverElement(): HTMLElement { + return this._statusBar.hoverElement; + } + + dispose() { + this._statusBar.dispose(); + } +} + class RenderedContentHoverParts extends Disposable { private static readonly _DECORATION_OPTIONS = ModelDecorationOptions.register({ @@ -123,27 +201,31 @@ class RenderedContentHoverParts extends Disposable { className: 'hoverHighlight' }); - private readonly _participants: IEditorHoverParticipant[]; + private readonly _renderedParts: IRenderedContentHoverPartOrStatusBar[] = []; private readonly _fragment: DocumentFragment; + private readonly _context: IEditorHoverContext; + + private _markdownHoverParticipant: MarkdownHoverParticipant | undefined; + private _colorHoverParticipant: ColorHoverParticipant | undefined; + private _focusedHoverPartIndex: number = -1; constructor( editor: ICodeEditor, participants: IEditorHoverParticipant[], hoverParts: IHoverPart[], - context: IEditorHoverContext, - keybindingService: IKeybindingService + keybindingService: IKeybindingService, + context: IEditorHoverContext ) { super(); - this._participants = participants; + this._context = context; this._fragment = document.createDocumentFragment(); - const statusBar = new EditorHoverStatusBar(keybindingService); - const hoverContext: IEditorHoverRenderContext = { fragment: this._fragment, statusBar, ...context }; - this._register(this._renderHoverParts(hoverContext, hoverParts)); - this._register(this._renderStatusBar(this._fragment, statusBar)); - this._register(this._addEditorDecorations(editor, hoverParts)); + this._register(this._renderParts(participants, hoverParts, context, keybindingService)); + this._register(this._registerListenersOnRenderedParts()); + this._register(this._createEditorDecorations(editor, hoverParts)); + this._updateMarkdownAndColorParticipantInfo(participants); } - private _addEditorDecorations(editor: ICodeEditor, hoverParts: IHoverPart[]): IDisposable { + private _createEditorDecorations(editor: ICodeEditor, hoverParts: IHoverPart[]): IDisposable { if (hoverParts.length === 0) { return Disposable.None; } @@ -162,25 +244,152 @@ class RenderedContentHoverParts extends Disposable { }); } - private _renderHoverParts(context: IEditorHoverRenderContext, hoverParts: IHoverPart[]): IDisposable { + private _renderParts(participants: IEditorHoverParticipant[], hoverParts: IHoverPart[], hoverContext: IEditorHoverContext, keybindingService: IKeybindingService): IDisposable { + const statusBar = new EditorHoverStatusBar(keybindingService); + const hoverRenderingContext: IEditorHoverRenderContext = { + fragment: this._fragment, + statusBar, + ...hoverContext + }; const disposables = new DisposableStore(); - for (const participant of this._participants) { - const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant); - const hasHoverPartsForParticipant = hoverPartsForParticipant.length > 0; - if (!hasHoverPartsForParticipant) { - continue; + for (const participant of participants) { + const renderedHoverParts = this._renderHoverPartsForParticipant(hoverParts, participant, hoverRenderingContext); + disposables.add(renderedHoverParts); + for (const renderedHoverPart of renderedHoverParts.renderedHoverParts) { + this._renderedParts.push({ + type: 'hoverPart', + participant, + hoverPart: renderedHoverPart.hoverPart, + hoverElement: renderedHoverPart.hoverElement, + }); } - disposables.add(participant.renderHoverParts(context, hoverPartsForParticipant)); } - return disposables; + const renderedStatusBar = this._renderStatusBar(this._fragment, statusBar); + if (renderedStatusBar) { + disposables.add(renderedStatusBar); + this._renderedParts.push({ + type: 'statusBar', + hoverElement: renderedStatusBar.hoverElement, + }); + } + return toDisposable(() => { disposables.dispose(); }); + } + + private _renderHoverPartsForParticipant(hoverParts: IHoverPart[], participant: IEditorHoverParticipant, hoverRenderingContext: IEditorHoverRenderContext): IRenderedHoverParts { + const hoverPartsForParticipant = hoverParts.filter(hoverPart => hoverPart.owner === participant); + const hasHoverPartsForParticipant = hoverPartsForParticipant.length > 0; + if (!hasHoverPartsForParticipant) { + return new RenderedHoverParts([]); + } + return participant.renderHoverParts(hoverRenderingContext, hoverPartsForParticipant); } - private _renderStatusBar(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): IDisposable { + private _renderStatusBar(fragment: DocumentFragment, statusBar: EditorHoverStatusBar): RenderedStatusBar | undefined { if (!statusBar.hasContent) { - return Disposable.None; + return undefined; + } + return new RenderedStatusBar(fragment, statusBar); + } + + private _registerListenersOnRenderedParts(): IDisposable { + const disposables = new DisposableStore(); + this._renderedParts.forEach((renderedPart: IRenderedContentHoverPartOrStatusBar, index: number) => { + const element = renderedPart.hoverElement; + element.tabIndex = 0; + disposables.add(dom.addDisposableListener(element, dom.EventType.FOCUS_IN, (event: Event) => { + event.stopPropagation(); + this._focusedHoverPartIndex = index; + })); + disposables.add(dom.addDisposableListener(element, dom.EventType.FOCUS_OUT, (event: Event) => { + event.stopPropagation(); + this._focusedHoverPartIndex = -1; + })); + }); + return disposables; + } + + private _updateMarkdownAndColorParticipantInfo(participants: IEditorHoverParticipant[]) { + const markdownHoverParticipant = participants.find(p => { + return (p instanceof MarkdownHoverParticipant) && !(p instanceof InlayHintsHover); + }); + if (markdownHoverParticipant) { + this._markdownHoverParticipant = markdownHoverParticipant as MarkdownHoverParticipant; + } + this._colorHoverParticipant = participants.find(p => p instanceof ColorHoverParticipant); + } + + public getAccessibleContent(): string { + const content: string[] = []; + for (let i = 0; i < this._renderedParts.length; i++) { + content.push(this.getAccessibleHoverContentAtIndex(i)); + } + return content.join('\n\n'); + } + + public getAccessibleHoverContentAtIndex(index: number): string { + const renderedPart = this._renderedParts[index]; + if (!renderedPart) { + return ''; + } + if (renderedPart.type === 'statusBar') { + return localize('hoverAccessibilityStatusBar', "This is a hover status bar."); + } + return renderedPart.participant.getAccessibleContent(renderedPart.hoverPart); + } + + public async updateHoverVerbosityLevel(action: HoverVerbosityAction, index: number, focus?: boolean): Promise { + if (!this._markdownHoverParticipant) { + return; + } + const normalizedMarkdownHoverIndex = this._normalizedIndexToMarkdownHoverIndexRange(this._markdownHoverParticipant, index); + if (normalizedMarkdownHoverIndex === undefined) { + return; + } + const renderedPart = await this._markdownHoverParticipant.updateMarkdownHoverVerbosityLevel(action, normalizedMarkdownHoverIndex, focus); + if (!renderedPart) { + return; + } + this._renderedParts[index] = { + type: 'hoverPart', + participant: this._markdownHoverParticipant, + hoverPart: renderedPart.hoverPart, + hoverElement: renderedPart.hoverElement, + }; + this._context.onContentsChanged(); + } + + public doesHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { + if (!this._markdownHoverParticipant) { + return false; + } + const normalizedMarkdownHoverIndex = this._normalizedIndexToMarkdownHoverIndexRange(this._markdownHoverParticipant, index); + if (normalizedMarkdownHoverIndex === undefined) { + return false; } - fragment.appendChild(statusBar.hoverElement); - return statusBar; + return this._markdownHoverParticipant.doesMarkdownHoverAtIndexSupportVerbosityAction(normalizedMarkdownHoverIndex, action); + } + + public isColorPickerVisible(): boolean { + return this._colorHoverParticipant?.isColorPickerVisible() ?? false; + } + + private _normalizedIndexToMarkdownHoverIndexRange(markdownHoverParticipant: MarkdownHoverParticipant, index: number): number | undefined { + const renderedPart = this._renderedParts[index]; + if (!renderedPart || renderedPart.type !== 'hoverPart') { + return undefined; + } + const isHoverPartMarkdownHover = renderedPart.participant === markdownHoverParticipant; + if (!isHoverPartMarkdownHover) { + return undefined; + } + const firstIndexOfMarkdownHovers = this._renderedParts.findIndex(renderedPart => + renderedPart.type === 'hoverPart' + && renderedPart.participant === markdownHoverParticipant + ); + if (firstIndexOfMarkdownHovers === -1) { + throw new BugIndicatingError(); + } + return index - firstIndexOfMarkdownHovers; } public get domNode(): DocumentFragment { @@ -190,4 +399,8 @@ class RenderedContentHoverParts extends Disposable { public get domNodeHasChildren(): boolean { return this._fragment.hasChildNodes(); } + + public get focusedHoverPartIndex(): number { + return this._focusedHoverPartIndex; + } } diff --git a/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts b/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts index 2998c0e3e3084..462df2e9d60fb 100644 --- a/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts +++ b/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts @@ -18,15 +18,15 @@ import { Action, IAction } from 'vs/base/common/actions'; import { ThemeIcon } from 'vs/base/common/themables'; import { Codicon } from 'vs/base/common/codicons'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { labelForHoverVerbosityAction } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; namespace HoverAccessibilityHelpNLS { - export const intro = localize('intro', "Focus on the hover widget to cycle through the hover parts with the Tab key."); - export const increaseVerbosity = localize('increaseVerbosity', "- The focused hover part verbosity level can be increased with the Increase Hover Verbosity command.", INCREASE_HOVER_VERBOSITY_ACTION_ID); - export const decreaseVerbosity = localize('decreaseVerbosity', "- The focused hover part verbosity level can be decreased with the Decrease Hover Verbosity command.", DECREASE_HOVER_VERBOSITY_ACTION_ID); - export const hoverContent = localize('contentHover', "The last focused hover content is the following."); + export const introHoverPart = localize('introHoverPart', 'The focused hover part content is the following:'); + export const introHoverFull = localize('introHoverFull', 'The full focused hover content is the following:'); + export const increaseVerbosity = localize('increaseVerbosity', '- The focused hover part verbosity level can be increased with the Increase Hover Verbosity command.', INCREASE_HOVER_VERBOSITY_ACTION_ID); + export const decreaseVerbosity = localize('decreaseVerbosity', '- The focused hover part verbosity level can be decreased with the Decrease Hover Verbosity command.', DECREASE_HOVER_VERBOSITY_ACTION_ID); } export class HoverAccessibleView implements IAccessibleViewImplentation { @@ -85,7 +85,6 @@ export class HoverAccessibilityHelp implements IAccessibleViewImplentation { } } - abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAccessibleViewContentProvider { abstract provideContent(): string; @@ -97,12 +96,9 @@ abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAc private readonly _onDidChangeContent: Emitter = this._register(new Emitter()); public readonly onDidChangeContent: Event = this._onDidChangeContent.event; - protected _markdownHoverFocusedIndex: number = -1; - private _onHoverContentsChanged: IDisposable | undefined; + protected _focusedHoverPartIndex: number = -1; - constructor( - protected readonly _hoverController: HoverController, - ) { + constructor(protected readonly _hoverController: HoverController) { super(); } @@ -111,8 +107,8 @@ abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAc return; } this._hoverController.shouldKeepOpenOnEditorMouseMoveOrLeave = true; - this._markdownHoverFocusedIndex = this._hoverController.focusedMarkdownHoverIndex(); - this._onHoverContentsChanged = this._register(this._hoverController.onHoverContentsChanged(() => { + this._focusedHoverPartIndex = this._hoverController.focusedHoverPartIndex(); + this._register(this._hoverController.onHoverContentsChanged(() => { this._onDidChangeContent.fire(); })); } @@ -121,33 +117,35 @@ abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAc if (!this._hoverController) { return; } - this._markdownHoverFocusedIndex = -1; + this._focusedHoverPartIndex = -1; this._hoverController.focus(); this._hoverController.shouldKeepOpenOnEditorMouseMoveOrLeave = false; - this._onHoverContentsChanged?.dispose(); - } -} - -export class HoverAccessibilityHelpProvider extends BaseHoverAccessibleViewProvider implements IAccessibleViewContentProvider { - - public readonly options: IAccessibleViewOptions = { type: AccessibleViewType.Help }; - - constructor( - hoverController: HoverController, - ) { - super(hoverController); + this.dispose(); } - provideContent(): string { - return this.provideContentAtIndex(this._markdownHoverFocusedIndex); - } - - provideContentAtIndex(index: number): string { - const content: string[] = []; - content.push(HoverAccessibilityHelpNLS.intro); - content.push(...this._descriptionsOfVerbosityActionsForIndex(index)); - content.push(...this._descriptionOfFocusedMarkdownHoverAtIndex(index)); - return content.join('\n'); + provideContentAtIndex(focusedHoverIndex: number, includeVerbosityActions: boolean): string { + if (focusedHoverIndex !== -1) { + const accessibleContent = this._hoverController.getAccessibleWidgetContentAtIndex(focusedHoverIndex); + if (accessibleContent === undefined) { + return ''; + } + const contents: string[] = []; + if (includeVerbosityActions) { + contents.push(...this._descriptionsOfVerbosityActionsForIndex(focusedHoverIndex)); + } + contents.push(HoverAccessibilityHelpNLS.introHoverPart); + contents.push(accessibleContent); + return contents.join('\n\n'); + } else { + const accessibleContent = this._hoverController.getAccessibleWidgetContent(); + if (accessibleContent === undefined) { + return ''; + } + const contents: string[] = []; + contents.push(HoverAccessibilityHelpNLS.introHoverFull); + contents.push(accessibleContent); + return contents.join('\n\n'); + } } private _descriptionsOfVerbosityActionsForIndex(index: number): string[] { @@ -164,7 +162,7 @@ export class HoverAccessibilityHelpProvider extends BaseHoverAccessibleViewProvi } private _descriptionOfVerbosityActionForIndex(action: HoverVerbosityAction, index: number): string | undefined { - const isActionSupported = this._hoverController.doesMarkdownHoverAtIndexSupportVerbosityAction(index, action); + const isActionSupported = this._hoverController.doesHoverAtIndexSupportVerbosityAction(index, action); if (!isActionSupported) { return; } @@ -175,15 +173,18 @@ export class HoverAccessibilityHelpProvider extends BaseHoverAccessibleViewProvi return HoverAccessibilityHelpNLS.decreaseVerbosity; } } +} - protected _descriptionOfFocusedMarkdownHoverAtIndex(index: number): string[] { - const content: string[] = []; - const hoverContent = this._hoverController.markdownHoverContentAtIndex(index); - if (hoverContent) { - content.push('\n' + HoverAccessibilityHelpNLS.hoverContent); - content.push('\n' + hoverContent); - } - return content; +export class HoverAccessibilityHelpProvider extends BaseHoverAccessibleViewProvider implements IAccessibleViewContentProvider { + + public readonly options: IAccessibleViewOptions = { type: AccessibleViewType.Help }; + + constructor(hoverController: HoverController) { + super(hoverController); + } + + provideContent(): string { + return this.provideContentAtIndex(this._focusedHoverPartIndex, true); } } @@ -201,8 +202,7 @@ export class HoverAccessibleViewProvider extends BaseHoverAccessibleViewProvider } public provideContent(): string { - const hoverContent = this._hoverController.markdownHoverContentAtIndex(this._markdownHoverFocusedIndex); - return hoverContent.length > 0 ? hoverContent : this._hoverController.getWidgetContent() || HoverAccessibilityHelpNLS.intro; + return this.provideContentAtIndex(this._focusedHoverPartIndex, false); } public get actions(): IAction[] { @@ -229,16 +229,16 @@ export class HoverAccessibleViewProvider extends BaseHoverAccessibleViewProvider break; } const actionLabel = labelForHoverVerbosityAction(this._keybindingService, action); - const actionEnabled = this._hoverController.doesMarkdownHoverAtIndexSupportVerbosityAction(this._markdownHoverFocusedIndex, action); + const actionEnabled = this._hoverController.doesHoverAtIndexSupportVerbosityAction(this._focusedHoverPartIndex, action); return new Action(accessibleActionId, actionLabel, ThemeIcon.asClassName(actionCodicon), actionEnabled, () => { - editor.getAction(actionId)?.run({ index: this._markdownHoverFocusedIndex, focus: false }); + editor.getAction(actionId)?.run({ index: this._focusedHoverPartIndex, focus: false }); }); } private _initializeOptions(editor: ICodeEditor, hoverController: HoverController): void { const helpProvider = this._register(new HoverAccessibilityHelpProvider(hoverController)); this.options.language = editor.getModel()?.getLanguageId(); - this.options.customHelp = () => { return helpProvider.provideContentAtIndex(this._markdownHoverFocusedIndex); }; + this.options.customHelp = () => { return helpProvider.provideContentAtIndex(this._focusedHoverPartIndex, true); }; } } diff --git a/src/vs/editor/contrib/hover/browser/hoverActions.ts b/src/vs/editor/contrib/hover/browser/hoverActions.ts index 20a5148fd742b..37eea40441ae8 100644 --- a/src/vs/editor/contrib/hover/browser/hoverActions.ts +++ b/src/vs/editor/contrib/hover/browser/hoverActions.ts @@ -432,7 +432,12 @@ export class IncreaseHoverVerbosityLevel extends EditorAction { } public run(accessor: ServicesAccessor, editor: ICodeEditor, args?: { index: number; focus: boolean }): void { - HoverController.get(editor)?.updateMarkdownHoverVerbosityLevel(HoverVerbosityAction.Increase, args?.index, args?.focus); + const hoverController = HoverController.get(editor); + if (!hoverController) { + return; + } + const index = args?.index !== undefined ? args.index : hoverController.focusedHoverPartIndex(); + hoverController.updateHoverVerbosityLevel(HoverVerbosityAction.Increase, index, args?.focus); } } @@ -448,6 +453,11 @@ export class DecreaseHoverVerbosityLevel extends EditorAction { } public run(accessor: ServicesAccessor, editor: ICodeEditor, args?: { index: number; focus: boolean }): void { - HoverController.get(editor)?.updateMarkdownHoverVerbosityLevel(HoverVerbosityAction.Decrease, args?.index, args?.focus); + const hoverController = HoverController.get(editor); + if (!hoverController) { + return; + } + const index = args?.index !== undefined ? args.index : hoverController.focusedHoverPartIndex(); + HoverController.get(editor)?.updateHoverVerbosityLevel(HoverVerbosityAction.Decrease, index, args?.focus); } } diff --git a/src/vs/editor/contrib/hover/browser/hoverController.ts b/src/vs/editor/contrib/hover/browser/hoverController.ts index 293902db46d36..9dbae0ce6430f 100644 --- a/src/vs/editor/contrib/hover/browser/hoverController.ts +++ b/src/vs/editor/contrib/hover/browser/hoverController.ts @@ -417,20 +417,16 @@ export class HoverController extends Disposable implements IEditorContribution { return this._contentWidget?.widget.isResizing || false; } - public focusedMarkdownHoverIndex(): number { - return this._getOrCreateContentWidget().focusedMarkdownHoverIndex(); + public focusedHoverPartIndex(): number { + return this._getOrCreateContentWidget().focusedHoverPartIndex(); } - public markdownHoverContentAtIndex(index: number): string { - return this._getOrCreateContentWidget().markdownHoverContentAtIndex(index); + public doesHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { + return this._getOrCreateContentWidget().doesHoverAtIndexSupportVerbosityAction(index, action); } - public doesMarkdownHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { - return this._getOrCreateContentWidget().doesMarkdownHoverAtIndexSupportVerbosityAction(index, action); - } - - public updateMarkdownHoverVerbosityLevel(action: HoverVerbosityAction, index?: number, focus?: boolean): void { - this._getOrCreateContentWidget().updateMarkdownHoverVerbosityLevel(action, index, focus); + public updateHoverVerbosityLevel(action: HoverVerbosityAction, index: number, focus?: boolean): void { + this._getOrCreateContentWidget().updateHoverVerbosityLevel(action, index, focus); } public focus(): void { @@ -473,6 +469,14 @@ export class HoverController extends Disposable implements IEditorContribution { return this._contentWidget?.getWidgetContent(); } + public getAccessibleWidgetContent(): string | undefined { + return this._contentWidget?.getAccessibleWidgetContent(); + } + + public getAccessibleWidgetContentAtIndex(index: number): string | undefined { + return this._contentWidget?.getAccessibleWidgetContentAtIndex(index); + } + public get isColorPickerVisible(): boolean | undefined { return this._contentWidget?.isColorPickerVisible; } diff --git a/src/vs/editor/contrib/hover/browser/hoverTypes.ts b/src/vs/editor/contrib/hover/browser/hoverTypes.ts index 0caaba7f03020..4b23a83847876 100644 --- a/src/vs/editor/contrib/hover/browser/hoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/hoverTypes.ts @@ -120,13 +120,46 @@ export interface IEditorHoverRenderContext extends IEditorHoverContext { readonly statusBar: IEditorHoverStatusBar; } +export interface IRenderedHoverPart extends IDisposable { + /** + * The rendered hover part. + */ + hoverPart: T; + /** + * The HTML element containing the hover part. + */ + hoverElement: HTMLElement; +} + +export interface IRenderedHoverParts extends IDisposable { + /** + * Array of rendered hover parts. + */ + renderedHoverParts: IRenderedHoverPart[]; +} + +/** + * Default implementation of IRenderedHoverParts. + */ +export class RenderedHoverParts implements IRenderedHoverParts { + + constructor(public readonly renderedHoverParts: IRenderedHoverPart[]) { } + + dispose() { + for (const part of this.renderedHoverParts) { + part.dispose(); + } + } +} + export interface IEditorHoverParticipant { readonly hoverOrdinal: number; suggestHoverAnchor?(mouseEvent: IEditorMouseEvent): HoverAnchor | null; computeSync(anchor: HoverAnchor, lineDecorations: IModelDecoration[]): T[]; computeAsync?(anchor: HoverAnchor, lineDecorations: IModelDecoration[], token: CancellationToken): AsyncIterableObject; createLoadingMessage?(anchor: HoverAnchor): T | null; - renderHoverParts(context: IEditorHoverRenderContext, hoverParts: T[]): IDisposable; + renderHoverParts(context: IEditorHoverRenderContext, hoverParts: T[]): IRenderedHoverParts; + getAccessibleContent(hoverPart: T): string; handleResize?(): void; } diff --git a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts index 7bc9ae9985e92..86626b4bf69d6 100644 --- a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts @@ -7,7 +7,7 @@ import * as dom from 'vs/base/browser/dom'; import { asArray, compareBy, numberComparator } from 'vs/base/common/arrays'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { IMarkdownString, isEmptyMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; -import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; import { DECREASE_HOVER_VERBOSITY_ACTION_ID, INCREASE_HOVER_VERBOSITY_ACTION_ID } from 'vs/editor/contrib/hover/browser/hoverActionIds'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -15,7 +15,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration, ITextModel } from 'vs/editor/common/model'; import { ILanguageService } from 'vs/editor/common/languages/language'; -import { HoverAnchor, HoverAnchorType, HoverRangeAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, HoverRangeAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -33,6 +33,7 @@ import { IHoverService, WorkbenchHoverDelegate } from 'vs/platform/hover/browser import { AsyncIterableObject } from 'vs/base/common/async'; import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { getHoverProviderResultsAsAsyncIterable } from 'vs/editor/contrib/hover/browser/getHover'; +import { ICommandService } from 'vs/platform/commands/common/commands'; const $ = dom.$; const increaseHoverVerbosityIcon = registerIcon('hover-increase-verbosity', Codicon.add, nls.localize('increaseHoverVerbosity', 'Icon for increaseing hover verbosity.')); @@ -90,6 +91,7 @@ export class MarkdownHoverParticipant implements IEditorHoverParticipant { this._renderedHoverParts = new MarkdownRenderedHoverParts( hoverParts, context.fragment, + this, this._editor, this._languageService, this._openerService, + this._commandService, this._keybindingService, this._hoverService, this._configurationService, @@ -191,55 +195,65 @@ export class MarkdownHoverParticipant implements IEditorHoverParticipant { + return Promise.resolve(this._renderedHoverParts?.updateMarkdownHoverPartVerbosityLevel(action, index, focus)); } } -interface RenderedHoverPart { - renderedMarkdown: HTMLElement; - disposables: DisposableStore; - hoverSource?: HoverSource; +class RenderedMarkdownHoverPart implements IRenderedHoverPart { + + constructor( + public readonly hoverPart: MarkdownHover, + public readonly hoverElement: HTMLElement, + public readonly disposables: DisposableStore, + ) { } + + get hoverAccessibleContent(): string { + return this.hoverElement.innerText.trim(); + } + + dispose(): void { + this.disposables.dispose(); + } } -class MarkdownRenderedHoverParts extends Disposable { +class MarkdownRenderedHoverParts implements IRenderedHoverParts { + + public renderedHoverParts: RenderedMarkdownHoverPart[]; - private _renderedHoverParts: RenderedHoverPart[]; - private _focusedHoverPartIndex: number = -1; private _ongoingHoverOperations: Map = new Map(); + private readonly _disposables = new DisposableStore(); + constructor( - hoverParts: MarkdownHover[], // we own! + hoverParts: MarkdownHover[], hoverPartsContainer: DocumentFragment, + private readonly _hoverParticipant: MarkdownHoverParticipant, private readonly _editor: ICodeEditor, private readonly _languageService: ILanguageService, private readonly _openerService: IOpenerService, + private readonly _commandService: ICommandService, private readonly _keybindingService: IKeybindingService, private readonly _hoverService: IHoverService, private readonly _configurationService: IConfigurationService, private readonly _onFinishedRendering: () => void, ) { - super(); - this._renderedHoverParts = this._renderHoverParts(hoverParts, hoverPartsContainer, this._onFinishedRendering); - this._register(toDisposable(() => { - this._renderedHoverParts.forEach(renderedHoverPart => { - renderedHoverPart.disposables.dispose(); + this.renderedHoverParts = this._renderHoverParts(hoverParts, hoverPartsContainer, this._onFinishedRendering); + this._disposables.add(toDisposable(() => { + this.renderedHoverParts.forEach(renderedHoverPart => { + renderedHoverPart.dispose(); + }); + this._ongoingHoverOperations.forEach(operation => { + operation.tokenSource.dispose(true); }); - })); - this._register(toDisposable(() => { - this._ongoingHoverOperations.forEach(operation => { operation.tokenSource.dispose(true); }); })); } @@ -247,75 +261,57 @@ class MarkdownRenderedHoverParts extends Disposable { hoverParts: MarkdownHover[], hoverPartsContainer: DocumentFragment, onFinishedRendering: () => void, - ): RenderedHoverPart[] { + ): RenderedMarkdownHoverPart[] { hoverParts.sort(compareBy(hover => hover.ordinal, numberComparator)); - return hoverParts.map((hoverPart, hoverIndex) => { - const renderedHoverPart = this._renderHoverPart( - hoverIndex, - hoverPart.contents, - hoverPart.source, - onFinishedRendering - ); - hoverPartsContainer.appendChild(renderedHoverPart.renderedMarkdown); + return hoverParts.map(hoverPart => { + const renderedHoverPart = this._renderHoverPart(hoverPart, onFinishedRendering); + hoverPartsContainer.appendChild(renderedHoverPart.hoverElement); return renderedHoverPart; }); } private _renderHoverPart( - hoverPartIndex: number, - hoverContents: IMarkdownString[], - hoverSource: HoverSource | undefined, + hoverPart: MarkdownHover, onFinishedRendering: () => void - ): RenderedHoverPart { + ): RenderedMarkdownHoverPart { - const { renderedMarkdown, disposables } = this._renderMarkdownContent(hoverContents, onFinishedRendering); + const renderedMarkdownPart = this._renderMarkdownHover(hoverPart, onFinishedRendering); + const renderedMarkdownElement = renderedMarkdownPart.hoverElement; + const hoverSource = hoverPart.source; + const disposables = new DisposableStore(); + disposables.add(renderedMarkdownPart); if (!hoverSource) { - return { renderedMarkdown, disposables }; + return new RenderedMarkdownHoverPart(hoverPart, renderedMarkdownElement, disposables); } const canIncreaseVerbosity = hoverSource.supportsVerbosityAction(HoverVerbosityAction.Increase); const canDecreaseVerbosity = hoverSource.supportsVerbosityAction(HoverVerbosityAction.Decrease); if (!canIncreaseVerbosity && !canDecreaseVerbosity) { - return { renderedMarkdown, disposables, hoverSource }; + return new RenderedMarkdownHoverPart(hoverPart, renderedMarkdownElement, disposables); } const actionsContainer = $('div.verbosity-actions'); - renderedMarkdown.prepend(actionsContainer); + renderedMarkdownElement.prepend(actionsContainer); disposables.add(this._renderHoverExpansionAction(actionsContainer, HoverVerbosityAction.Increase, canIncreaseVerbosity)); disposables.add(this._renderHoverExpansionAction(actionsContainer, HoverVerbosityAction.Decrease, canDecreaseVerbosity)); - - this._register(dom.addDisposableListener(renderedMarkdown, dom.EventType.FOCUS_IN, (event: Event) => { - event.stopPropagation(); - this._focusedHoverPartIndex = hoverPartIndex; - })); - this._register(dom.addDisposableListener(renderedMarkdown, dom.EventType.FOCUS_OUT, (event: Event) => { - event.stopPropagation(); - this._focusedHoverPartIndex = -1; - })); - return { renderedMarkdown, disposables, hoverSource }; + return new RenderedMarkdownHoverPart(hoverPart, renderedMarkdownElement, disposables); } - private _renderMarkdownContent( - markdownContent: IMarkdownString[], + private _renderMarkdownHover( + markdownHover: MarkdownHover, onFinishedRendering: () => void - ): RenderedHoverPart { - const renderedMarkdown = $('div.hover-row'); - renderedMarkdown.tabIndex = 0; - const renderedMarkdownContents = $('div.hover-row-contents'); - renderedMarkdown.appendChild(renderedMarkdownContents); - const disposables = new DisposableStore(); - disposables.add(renderMarkdownInContainer( + ): IRenderedHoverPart { + const renderedMarkdownHover = renderMarkdownInContainer( this._editor, - renderedMarkdownContents, - markdownContent, + markdownHover, this._languageService, this._openerService, onFinishedRendering, - )); - return { renderedMarkdown, disposables }; + ); + return renderedMarkdownHover; } private _renderHoverExpansionAction(container: HTMLElement, action: HoverVerbosityAction, actionEnabled: boolean): DisposableStore { @@ -330,53 +326,67 @@ class MarkdownRenderedHoverParts extends Disposable { return store; } actionElement.classList.add('enabled'); - const actionFunction = () => this.updateMarkdownHoverPartVerbosityLevel(action); + const actionFunction = () => this._commandService.executeCommand(action === HoverVerbosityAction.Increase ? INCREASE_HOVER_VERBOSITY_ACTION_ID : DECREASE_HOVER_VERBOSITY_ACTION_ID); store.add(new ClickAction(actionElement, actionFunction)); store.add(new KeyDownAction(actionElement, actionFunction, [KeyCode.Enter, KeyCode.Space])); return store; } - public async updateMarkdownHoverPartVerbosityLevel(action: HoverVerbosityAction, index: number = -1, focus: boolean = true): Promise { + public async updateMarkdownHoverPartVerbosityLevel(action: HoverVerbosityAction, index: number, focus: boolean = true): Promise<{ hoverPart: MarkdownHover; hoverElement: HTMLElement } | undefined> { const model = this._editor.getModel(); if (!model) { - return; + return undefined; } - const indexOfInterest = index !== -1 ? index : this._focusedHoverPartIndex; - const hoverRenderedPart = this._getRenderedHoverPartAtIndex(indexOfInterest); - if (!hoverRenderedPart || !hoverRenderedPart.hoverSource?.supportsVerbosityAction(action)) { - return; + const hoverRenderedPart = this._getRenderedHoverPartAtIndex(index); + const hoverSource = hoverRenderedPart?.hoverPart.source; + if (!hoverRenderedPart || !hoverSource?.supportsVerbosityAction(action)) { + return undefined; } - const hoverSource = hoverRenderedPart.hoverSource; const newHover = await this._fetchHover(hoverSource, model, action); if (!newHover) { - return; + return undefined; } const newHoverSource = new HoverSource(newHover, hoverSource.hoverProvider, hoverSource.hoverPosition); - const newHoverRenderedPart = this._renderHoverPart( - indexOfInterest, + const initialHoverPart = hoverRenderedPart.hoverPart; + const newHoverPart = new MarkdownHover( + this._hoverParticipant, + initialHoverPart.range, newHover.contents, - newHoverSource, + initialHoverPart.isBeforeContent, + initialHoverPart.ordinal, + newHoverSource + ); + const newHoverRenderedPart = this._renderHoverPart( + newHoverPart, this._onFinishedRendering ); - this._replaceRenderedHoverPartAtIndex(indexOfInterest, newHoverRenderedPart); + this._replaceRenderedHoverPartAtIndex(index, newHoverRenderedPart, newHoverPart); if (focus) { - this._focusOnHoverPartWithIndex(indexOfInterest); + this._focusOnHoverPartWithIndex(index); } - this._onFinishedRendering(); - } - - public markdownHoverContentAtIndex(index: number): string { - const hoverRenderedPart = this._getRenderedHoverPartAtIndex(index); - return hoverRenderedPart?.renderedMarkdown.innerText ?? ''; + return { + hoverPart: newHoverPart, + hoverElement: newHoverRenderedPart.hoverElement + }; } - public focusedMarkdownHoverIndex(): number { - return this._focusedHoverPartIndex; + public getAccessibleContent(hoverPart: MarkdownHover): string | undefined { + const renderedHoverPartIndex = this.renderedHoverParts.findIndex(renderedHoverPart => renderedHoverPart.hoverPart === hoverPart); + if (renderedHoverPartIndex === -1) { + return undefined; + } + const renderedHoverPart = this._getRenderedHoverPartAtIndex(renderedHoverPartIndex); + if (!renderedHoverPart) { + return undefined; + } + const accessibleContent = renderedHoverPart.hoverElement.innerText.trim(); + return accessibleContent; } public doesMarkdownHoverAtIndexSupportVerbosityAction(index: number, action: HoverVerbosityAction): boolean { const hoverRenderedPart = this._getRenderedHoverPartAtIndex(index); - if (!hoverRenderedPart || !hoverRenderedPart.hoverSource?.supportsVerbosityAction(action)) { + const hoverSource = hoverRenderedPart?.hoverPart.source; + if (!hoverRenderedPart || !hoverSource?.supportsVerbosityAction(action)) { return false; } return true; @@ -404,76 +414,94 @@ class MarkdownRenderedHoverParts extends Disposable { return hover; } - private _replaceRenderedHoverPartAtIndex(index: number, renderedHoverPart: RenderedHoverPart): void { - if (index >= this._renderHoverParts.length || index < 0) { + private _replaceRenderedHoverPartAtIndex(index: number, renderedHoverPart: RenderedMarkdownHoverPart, hoverPart: MarkdownHover): void { + if (index >= this.renderedHoverParts.length || index < 0) { return; } - const currentRenderedHoverPart = this._renderedHoverParts[index]; - const currentRenderedMarkdown = currentRenderedHoverPart.renderedMarkdown; - currentRenderedMarkdown.replaceWith(renderedHoverPart.renderedMarkdown); - currentRenderedHoverPart.disposables.dispose(); - this._renderedHoverParts[index] = renderedHoverPart; + const currentRenderedHoverPart = this.renderedHoverParts[index]; + const currentRenderedMarkdown = currentRenderedHoverPart.hoverElement; + const renderedMarkdown = renderedHoverPart.hoverElement; + const renderedChildrenElements = Array.from(renderedMarkdown.children); + currentRenderedMarkdown.replaceChildren(...renderedChildrenElements); + const newRenderedHoverPart = new RenderedMarkdownHoverPart( + hoverPart, + currentRenderedMarkdown, + renderedHoverPart.disposables + ); + currentRenderedMarkdown.focus(); + currentRenderedHoverPart.dispose(); + this.renderedHoverParts[index] = newRenderedHoverPart; } private _focusOnHoverPartWithIndex(index: number): void { - this._renderedHoverParts[index].renderedMarkdown.focus(); + this.renderedHoverParts[index].hoverElement.focus(); + } + + private _getRenderedHoverPartAtIndex(index: number): RenderedMarkdownHoverPart | undefined { + return this.renderedHoverParts[index]; } - private _getRenderedHoverPartAtIndex(index: number): RenderedHoverPart | undefined { - return this._renderedHoverParts[index]; + public dispose(): void { + this._disposables.dispose(); } } export function renderMarkdownHovers( context: IEditorHoverRenderContext, - hoverParts: MarkdownHover[], + markdownHovers: MarkdownHover[], editor: ICodeEditor, languageService: ILanguageService, openerService: IOpenerService, -): IDisposable { +): IRenderedHoverParts { // Sort hover parts to keep them stable since they might come in async, out-of-order - hoverParts.sort(compareBy(hover => hover.ordinal, numberComparator)); - - const disposables = new DisposableStore(); - for (const hoverPart of hoverParts) { - disposables.add(renderMarkdownInContainer( + markdownHovers.sort(compareBy(hover => hover.ordinal, numberComparator)); + const renderedHoverParts: IRenderedHoverPart[] = []; + for (const markdownHover of markdownHovers) { + renderedHoverParts.push(renderMarkdownInContainer( editor, - context.fragment, - hoverPart.contents, + markdownHover, languageService, openerService, context.onContentsChanged, )); } - return disposables; + return new RenderedHoverParts(renderedHoverParts); } function renderMarkdownInContainer( editor: ICodeEditor, - container: DocumentFragment | HTMLElement, - markdownStrings: IMarkdownString[], + markdownHover: MarkdownHover, languageService: ILanguageService, openerService: IOpenerService, onFinishedRendering: () => void, -): IDisposable { - const store = new DisposableStore(); - for (const contents of markdownStrings) { - if (isEmptyMarkdownString(contents)) { +): IRenderedHoverPart { + const disposables = new DisposableStore(); + const renderedMarkdown = $('div.hover-row'); + const renderedMarkdownContents = $('div.hover-row-contents'); + renderedMarkdown.appendChild(renderedMarkdownContents); + const markdownStrings = markdownHover.contents; + for (const markdownString of markdownStrings) { + if (isEmptyMarkdownString(markdownString)) { continue; } const markdownHoverElement = $('div.markdown-hover'); const hoverContentsElement = dom.append(markdownHoverElement, $('div.hover-contents')); - const renderer = store.add(new MarkdownRenderer({ editor }, languageService, openerService)); - store.add(renderer.onDidRenderAsync(() => { + const renderer = disposables.add(new MarkdownRenderer({ editor }, languageService, openerService)); + disposables.add(renderer.onDidRenderAsync(() => { hoverContentsElement.className = 'hover-contents code-hover-contents'; onFinishedRendering(); })); - const renderedContents = store.add(renderer.render(contents)); + const renderedContents = disposables.add(renderer.render(markdownString)); hoverContentsElement.appendChild(renderedContents.element); - container.appendChild(markdownHoverElement); + renderedMarkdownContents.appendChild(markdownHoverElement); } - return store; + const renderedHoverPart: IRenderedHoverPart = { + hoverPart: markdownHover, + hoverElement: renderedMarkdown, + dispose() { disposables.dispose(); } + }; + return renderedHoverPart; } export function labelForHoverVerbosityAction(keybindingService: IKeybindingService, action: HoverVerbosityAction): string { diff --git a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts index 3ed0b3fab14fd..86dba6a80e3f3 100644 --- a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts @@ -7,7 +7,7 @@ import * as dom from 'vs/base/browser/dom'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import { CancelablePromise, createCancelablePromise, disposableTimeout } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { basename } from 'vs/base/common/resources'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -20,7 +20,7 @@ import { getCodeActions, quickFixCommandId } from 'vs/editor/contrib/codeAction/ import { CodeActionController } from 'vs/editor/contrib/codeAction/browser/codeActionController'; import { CodeActionKind, CodeActionSet, CodeActionTrigger, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/common/types'; import { MarkerController, NextMarkerAction } from 'vs/editor/contrib/gotoError/browser/gotoError'; -import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import * as nls from 'vs/nls'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IMarker, IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; @@ -90,20 +90,29 @@ export class MarkerHoverParticipant implements IEditorHoverParticipant { if (!hoverParts.length) { - return Disposable.None; + return new RenderedHoverParts([]); } const disposables = new DisposableStore(); - hoverParts.forEach(msg => context.fragment.appendChild(this.renderMarkerHover(msg, disposables))); + const renderedHoverParts: IRenderedHoverPart[] = []; + hoverParts.forEach(hoverPart => { + const renderedMarkerHover = this._renderMarkerHover(hoverPart); + context.fragment.appendChild(renderedMarkerHover.hoverElement); + renderedHoverParts.push(renderedMarkerHover); + }); const markerHoverForStatusbar = hoverParts.length === 1 ? hoverParts[0] : hoverParts.sort((a, b) => MarkerSeverity.compare(a.marker.severity, b.marker.severity))[0]; this.renderMarkerStatusbar(context, markerHoverForStatusbar, disposables); - return disposables; + return new RenderedHoverParts(renderedHoverParts); + } + + public getAccessibleContent(hoverPart: MarkerHover): string { + return hoverPart.marker.message; } - private renderMarkerHover(markerHover: MarkerHover, disposables: DisposableStore): HTMLElement { + private _renderMarkerHover(markerHover: MarkerHover): IRenderedHoverPart { + const disposables: DisposableStore = new DisposableStore(); const hoverElement = $('div.hover-row'); - hoverElement.tabIndex = 0; const markerElement = dom.append(hoverElement, $('div.marker.hover-contents')); const { source, message, code, relatedInformation } = markerHover.marker; @@ -166,7 +175,12 @@ export class MarkerHoverParticipant implements IEditorHoverParticipant = { + hoverPart: markerHover, + hoverElement, + dispose: () => disposables.dispose() + }; + return renderedHoverPart; } private renderMarkerStatusbar(context: IEditorHoverRenderContext, markerHover: MarkerHover, disposables: DisposableStore): void { diff --git a/src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts b/src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts index d49a4bb781fa3..05703e108d180 100644 --- a/src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts +++ b/src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts @@ -26,6 +26,7 @@ import { asCommandLink } from 'vs/editor/contrib/inlayHints/browser/inlayHints'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { ICommandService } from 'vs/platform/commands/common/commands'; class InlayHintsHoverAnchor extends HoverForeignElementAnchor { constructor( @@ -51,8 +52,9 @@ export class InlayHintsHover extends MarkdownHoverParticipant implements IEditor @IConfigurationService configurationService: IConfigurationService, @ITextModelService private readonly _resolverService: ITextModelService, @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, + @ICommandService commandService: ICommandService ) { - super(editor, languageService, openerService, configurationService, languageFeaturesService, keybindingService, hoverService); + super(editor, languageService, openerService, configurationService, languageFeaturesService, keybindingService, hoverService, commandService); } suggestHoverAnchor(mouseEvent: IEditorMouseEvent): HoverAnchor | null { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/hoverParticipant.ts b/src/vs/editor/contrib/inlineCompletions/browser/hoverParticipant.ts index 90d4ffcba0c12..7bcf0ea59f1f4 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/hoverParticipant.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/hoverParticipant.ts @@ -12,7 +12,7 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelDecoration } from 'vs/editor/common/model'; -import { HoverAnchor, HoverAnchorType, HoverForeignElementAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, HoverForeignElementAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController'; import { InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget'; import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; @@ -94,8 +94,8 @@ export class InlineCompletionsHoverParticipant implements IEditorHoverParticipan return []; } - renderHoverParts(context: IEditorHoverRenderContext, hoverParts: InlineCompletionsHover[]): IDisposable { - const disposableStore = new DisposableStore(); + renderHoverParts(context: IEditorHoverRenderContext, hoverParts: InlineCompletionsHover[]): IRenderedHoverParts { + const disposables = new DisposableStore(); const part = hoverParts[0]; this._telemetryService.publicLog2<{}, { @@ -104,7 +104,7 @@ export class InlineCompletionsHoverParticipant implements IEditorHoverParticipan }>('inlineCompletionHover.shown'); if (this.accessibilityService.isScreenReaderOptimized() && !this._editor.getOption(EditorOption.screenReaderAnnounceInlineSuggestion)) { - this.renderScreenReaderText(context, part, disposableStore); + disposables.add(this.renderScreenReaderText(context, part)); } const model = part.controller.model.get()!; @@ -115,32 +115,42 @@ export class InlineCompletionsHoverParticipant implements IEditorHoverParticipan model.inlineCompletionsCount, model.activeCommands, ); - context.fragment.appendChild(w.getDomNode()); + const widgetNode: HTMLElement = w.getDomNode(); + context.fragment.appendChild(widgetNode); model.triggerExplicitly(); - disposableStore.add(w); + disposables.add(w); + const renderedHoverPart: IRenderedHoverPart = { + hoverPart: part, + hoverElement: widgetNode, + dispose() { disposables.dispose(); } + }; + return new RenderedHoverParts([renderedHoverPart]); + } - return disposableStore; + getAccessibleContent(hoverPart: InlineCompletionsHover): string { + return nls.localize('hoverAccessibilityStatusBar', 'There are inline completions here'); } - private renderScreenReaderText(context: IEditorHoverRenderContext, part: InlineCompletionsHover, disposableStore: DisposableStore) { + private renderScreenReaderText(context: IEditorHoverRenderContext, part: InlineCompletionsHover): IDisposable { + const disposables = new DisposableStore(); const $ = dom.$; const markdownHoverElement = $('div.hover-row.markdown-hover'); const hoverContentsElement = dom.append(markdownHoverElement, $('div.hover-contents', { ['aria-live']: 'assertive' })); - const renderer = disposableStore.add(new MarkdownRenderer({ editor: this._editor }, this._languageService, this._openerService)); + const renderer = disposables.add(new MarkdownRenderer({ editor: this._editor }, this._languageService, this._openerService)); const render = (code: string) => { - disposableStore.add(renderer.onDidRenderAsync(() => { + disposables.add(renderer.onDidRenderAsync(() => { hoverContentsElement.className = 'hover-contents code-hover-contents'; context.onContentsChanged(); })); const inlineSuggestionAvailable = nls.localize('inlineSuggestionFollows', "Suggestion:"); - const renderedContents = disposableStore.add(renderer.render(new MarkdownString().appendText(inlineSuggestionAvailable).appendCodeblock('text', code))); + const renderedContents = disposables.add(renderer.render(new MarkdownString().appendText(inlineSuggestionAvailable).appendCodeblock('text', code))); hoverContentsElement.replaceChildren(renderedContents.element); }; - disposableStore.add(autorun(reader => { + disposables.add(autorun(reader => { /** @description update hover */ const ghostText = part.controller.model.read(reader)?.primaryGhostText.read(reader); if (ghostText) { @@ -152,5 +162,6 @@ export class InlineCompletionsHoverParticipant implements IEditorHoverParticipan })); context.fragment.appendChild(markdownHoverElement); + return disposables; } } diff --git a/src/vs/editor/contrib/inlineEdit/browser/hoverParticipant.ts b/src/vs/editor/contrib/inlineEdit/browser/hoverParticipant.ts index 6c1c7337f7fc5..cfacc77329a62 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/hoverParticipant.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/hoverParticipant.ts @@ -3,17 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { constObservable } from 'vs/base/common/observable'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration } from 'vs/editor/common/model'; -import { HoverAnchor, HoverAnchorType, HoverForeignElementAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, HoverForeignElementAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { InlineEditController } from 'vs/editor/contrib/inlineEdit/browser/inlineEditController'; import { InlineEditHintsContentWidget } from 'vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget'; +import * as nls from 'vs/nls'; export class InlineEditHover implements IHoverPart { constructor( @@ -86,8 +87,8 @@ export class InlineEditHoverParticipant implements IEditorHoverParticipant { + const disposables = new DisposableStore(); this._telemetryService.publicLog2<{}, { owner: 'hediet'; @@ -97,9 +98,17 @@ export class InlineEditHoverParticipant implements IEditorHoverParticipant = { + hoverPart: hoverParts[0], + hoverElement: widgetNode, + dispose: () => disposables.dispose() + }; + return new RenderedHoverParts([renderedHoverPart]); + } - return disposableStore; + getAccessibleContent(hoverPart: InlineEditHover): string { + return nls.localize('hoverAccessibilityInlineEdits', 'There are inline edits here.'); } } diff --git a/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts b/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts index f44fc76e0bdf8..eae47ac2d717a 100644 --- a/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts +++ b/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts @@ -7,7 +7,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { CharCode } from 'vs/base/common/charCode'; import { Codicon } from 'vs/base/common/codicons'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { InvisibleCharacters, isBasicASCII } from 'vs/base/common/strings'; import 'vs/css!./unicodeHighlighter'; @@ -22,7 +22,7 @@ import { UnicodeHighlighterOptions, UnicodeHighlighterReason, UnicodeHighlighter import { IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { isModelDecorationInComment, isModelDecorationInString, isModelDecorationVisible } from 'vs/editor/common/viewModel/viewModelDecorations'; -import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { MarkdownHover, renderMarkdownHovers } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; import { BannerController } from 'vs/editor/contrib/unicodeHighlighter/browser/bannerController'; import * as nls from 'vs/nls'; @@ -506,9 +506,13 @@ export class UnicodeHighlighterHoverParticipant implements IEditorHoverParticipa return result; } - public renderHoverParts(context: IEditorHoverRenderContext, hoverParts: MarkdownHover[]): IDisposable { + public renderHoverParts(context: IEditorHoverRenderContext, hoverParts: MarkdownHover[]): IRenderedHoverParts { return renderMarkdownHovers(context, hoverParts, this._editor, this._languageService, this._openerService); } + + public getAccessibleContent(hoverPart: MarkdownHover): string { + return hoverPart.contents.map(c => c.value).join('\n'); + } } function codePointToHex(codePoint: number): string { diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorHover.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorHover.ts index 2ad7122eb9200..893353b52f166 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorHover.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorHover.ts @@ -3,11 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration } from 'vs/editor/common/model'; -import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverPart, IRenderedHoverParts, RenderedHoverParts } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IChatWidgetService } from 'vs/workbench/contrib/chat/browser/chat'; @@ -15,6 +15,7 @@ import { ChatAgentHover, getChatAgentHoverOptions } from 'vs/workbench/contrib/c import { ChatEditorHoverWrapper } from 'vs/workbench/contrib/chat/browser/contrib/editorHoverWrapper'; import { IChatAgentData } from 'vs/workbench/contrib/chat/common/chatAgents'; import { extractAgentAndCommand } from 'vs/workbench/contrib/chat/common/chatParserTypes'; +import * as nls from 'vs/nls'; export class ChatAgentHoverParticipant implements IEditorHoverParticipant { @@ -49,22 +50,33 @@ export class ChatAgentHoverParticipant implements IEditorHoverParticipant { if (!hoverParts.length) { - return Disposable.None; + return new RenderedHoverParts([]); } - const store = new DisposableStore(); - const hover = store.add(this.instantiationService.createInstance(ChatAgentHover)); - store.add(hover.onDidChangeContents(() => context.onContentsChanged())); - const agent = hoverParts[0].agent; + const disposables = new DisposableStore(); + const hover = disposables.add(this.instantiationService.createInstance(ChatAgentHover)); + disposables.add(hover.onDidChangeContents(() => context.onContentsChanged())); + const hoverPart = hoverParts[0]; + const agent = hoverPart.agent; hover.setAgent(agent.id); const actions = getChatAgentHoverOptions(() => agent, this.commandService).actions; const wrapper = this.instantiationService.createInstance(ChatEditorHoverWrapper, hover.domNode, actions); - context.fragment.appendChild(wrapper.domNode); + const wrapperNode = wrapper.domNode; + context.fragment.appendChild(wrapperNode); + const renderedHoverPart: IRenderedHoverPart = { + hoverPart, + hoverElement: wrapperNode, + dispose() { disposables.dispose(); } + }; + return new RenderedHoverParts([renderedHoverPart]); + } + + public getAccessibleContent(hoverPart: ChatAgentHoverPart): string { + return nls.localize('hoverAccessibilityChatAgent', 'There is a chat agent hover part here.'); - return store; } } From c1bf420dbaa4f325b524a71092d0d20eadb2d27e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2024 15:48:49 +0200 Subject: [PATCH 448/755] fix #213840 (#217189) --- .../browser/preferences.contribution.ts | 1 + .../services/views/browser/viewsService.ts | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index 66ca47c40e5bf..ccf4663736cd5 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -1246,6 +1246,7 @@ class SettingsEditorTitleContribution extends Disposable implements IWorkbenchCo ResourceContextKey.Resource.isEqualTo(this.userDataProfilesService.defaultProfile.settingsResource.toString())), ContextKeyExpr.not('isInDiffEditor')); const registerOpenUserSettingsEditorFromJsonAction = () => { + registerOpenUserSettingsEditorFromJsonActionDisposables.value = undefined; registerOpenUserSettingsEditorFromJsonActionDisposables.value = registerAction2(class extends Action2 { constructor() { super({ diff --git a/src/vs/workbench/services/views/browser/viewsService.ts b/src/vs/workbench/services/views/browser/viewsService.ts index c342e91da150a..0a7d3a2f760b1 100644 --- a/src/vs/workbench/services/views/browser/viewsService.ts +++ b/src/vs/workbench/services/views/browser/viewsService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, IDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, toDisposable, DisposableStore, DisposableMap } from 'vs/base/common/lifecycle'; import { IViewDescriptorService, ViewContainer, IViewDescriptor, IView, ViewContainerLocation, IViewPaneContainer } from 'vs/workbench/common/views'; import { FocusedViewContext, getVisbileViewContextKey } from 'vs/workbench/common/contextkeys'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -51,6 +51,7 @@ export class ViewsService extends Disposable implements IViewsService { private readonly _onDidChangeFocusedView = this._register(new Emitter()); readonly onDidChangeFocusedView = this._onDidChangeFocusedView.event; + private readonly viewContainerDisposables = this._register(new DisposableMap()); private readonly enabledViewContainersContextKeys: Map>; private readonly visibleViewContextKeys: Map>; private readonly focusedViewContextKey: IContextKey; @@ -114,7 +115,7 @@ export class ViewsService extends Disposable implements IViewsService { private onDidChangeContainers(added: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>, removed: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>): void { for (const { container, location } of removed) { - this.deregisterPaneComposite(container, location); + this.onDidDeregisterViewContainer(container, location); } for (const { container, location } of added) { this.onDidRegisterViewContainer(container, location); @@ -123,15 +124,24 @@ export class ViewsService extends Disposable implements IViewsService { private onDidRegisterViewContainer(viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation): void { this.registerPaneComposite(viewContainer, viewContainerLocation); + const disposables = new DisposableStore(); + const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); this.onViewDescriptorsAdded(viewContainerModel.allViewDescriptors, viewContainer); - this._register(viewContainerModel.onDidChangeAllViewDescriptors(({ added, removed }) => { + disposables.add(viewContainerModel.onDidChangeAllViewDescriptors(({ added, removed }) => { this.onViewDescriptorsAdded(added, viewContainer); this.onViewDescriptorsRemoved(removed); })); this.updateViewContainerEnablementContextKey(viewContainer); - this._register(viewContainerModel.onDidChangeActiveViewDescriptors(() => this.updateViewContainerEnablementContextKey(viewContainer))); - this._register(this.registerOpenViewContainerAction(viewContainer)); + disposables.add(viewContainerModel.onDidChangeActiveViewDescriptors(() => this.updateViewContainerEnablementContextKey(viewContainer))); + disposables.add(this.registerOpenViewContainerAction(viewContainer)); + + this.viewContainerDisposables.set(viewContainer.id, disposables); + } + + private onDidDeregisterViewContainer(viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation): void { + this.deregisterPaneComposite(viewContainer, viewContainerLocation); + this.viewContainerDisposables.deleteAndDispose(viewContainer.id); } private onDidChangeContainerLocation(viewContainer: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation): void { From 65e55083107e40639a9b36916667603616988a4a Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 24 Jun 2024 16:11:05 +0200 Subject: [PATCH 449/755] Revert change to not listen on tree menus (#217170) Revert "Do not listen on tree menus (#216446)" This reverts commit ce7105088c927a86acf16e8fa378f349e5fee759. --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 1 - .../workbench/browser/parts/views/treeView.ts | 30 +++++++------------ 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index ccfd84591a63e..debb1a0468589 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -345,7 +345,6 @@ export class AsyncDataTree implements IDisposable get onDidChangeSelection(): Event> { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); } get onKeyDown(): Event { return this.tree.onKeyDown; } - get onMouseOver(): Event> { return Event.map(this.tree.onMouseOver, asTreeMouseEvent); } get onMouseClick(): Event> { return Event.map(this.tree.onMouseClick, asTreeMouseEvent); } get onMouseDblClick(): Event> { return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent); } get onContextMenu(): Event> { return Event.map(this.tree.onContextMenu, asTreeContextMenuEvent); } diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 42a54190f0b0f..7c1b3619944f3 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -717,21 +717,6 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { dnd: this.treeViewDnd, overrideStyles: getLocationBasedViewColors(this.viewLocation).listOverrideStyles }) as WorkbenchAsyncDataTree); - this.treeDisposables.add(this.tree.onMouseOver(e => { - if (e.element) { - this.tree?.rerender(e.element); - } - })); - this.treeDisposables.add(this.tree.contextKeyService.onDidChangeContext(e => { - const selection = this.tree?.getSelection(); - if (selection?.length) { - selection.map(item => this.tree?.rerender(item)); - } - const focus = this.tree?.getFocus(); - if (focus?.length) { - focus.map(item => this.tree?.rerender(item)); - } - })); this.treeDisposables.add(this.tree); treeMenus.setContextKeyService(this.tree.contextKeyService); aligner.tree = this.tree; @@ -1354,7 +1339,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer this._onDidChange.fire(element))); + listen.add(menu); + } else { + menu.dispose(); + } } return { primary: this.buildMenu(primaryGroups), secondary: this.buildMenu(secondaryGroups) }; From 64e01374b338c95820f0547cec1eca78fc710363 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:18:37 +0200 Subject: [PATCH 450/755] Add event handling for Home and End keys in FilterWidget (#217200) chore: Add event handling for Home and End keys in FilterWidget --- src/vs/workbench/browser/parts/views/viewFilter.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/browser/parts/views/viewFilter.ts b/src/vs/workbench/browser/parts/views/viewFilter.ts index 3331c892d0c29..724a67b931a98 100644 --- a/src/vs/workbench/browser/parts/views/viewFilter.ts +++ b/src/vs/workbench/browser/parts/views/viewFilter.ts @@ -230,6 +230,8 @@ export class FilterWidget extends Widget { if (event.equals(KeyCode.Space) || event.equals(KeyCode.LeftArrow) || event.equals(KeyCode.RightArrow) + || event.equals(KeyCode.Home) + || event.equals(KeyCode.End) ) { event.stopPropagation(); } From b94320d5a128d030992f2361430b19539a986b88 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 24 Jun 2024 16:31:33 +0200 Subject: [PATCH 451/755] add API proposal tracking link (#217201) --- src/vscode-dts/vscode.proposed.lmTools.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vscode-dts/vscode.proposed.lmTools.d.ts b/src/vscode-dts/vscode.proposed.lmTools.d.ts index 589d6d8fef1ae..facbeb20c4dd2 100644 --- a/src/vscode-dts/vscode.proposed.lmTools.d.ts +++ b/src/vscode-dts/vscode.proposed.lmTools.d.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // version: 2 +// https://github.com/microsoft/vscode/issues/213274 declare module 'vscode' { From 93a7382ecd63439a5bc507ef60e57610845ec05d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Jun 2024 17:13:10 +0200 Subject: [PATCH 452/755] report file operation result code (#217211) --- .../node/extensionManagementService.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 1444a63134c1c..29613dba832e1 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -488,7 +488,7 @@ type UpdateMetadataErrorClassification = { owner: 'sandy081'; comment: 'Update metadata error'; extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'extension identifier' }; - code?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'result code of the verification' }; + code?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'error code' }; }; type UpdateMetadataErrorEvent = { extensionId: string; @@ -594,7 +594,7 @@ export class ExtensionsScanner extends Disposable { try { await this.extensionsScannerService.updateMetadata(extensionLocation, metadata); } catch (error) { - this.telemetryService.publicLog2('extension:extract', { extensionId: extensionKey.id, code: error.code }); + this.telemetryService.publicLog2('extension:extract', { extensionId: extensionKey.id, code: `${toFileOperationResult(error)}` }); throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateExistingMetadata); } } else { @@ -615,7 +615,7 @@ export class ExtensionsScanner extends Disposable { try { await this.extensionsScannerService.updateMetadata(tempLocation, metadata); } catch (error) { - this.telemetryService.publicLog2('extension:extract', { extensionId: extensionKey.id, code: error.code }); + this.telemetryService.publicLog2('extension:extract', { extensionId: extensionKey.id, code: `${toFileOperationResult(error)}` }); throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata); } @@ -671,7 +671,7 @@ export class ExtensionsScanner extends Disposable { await this.extensionsScannerService.updateMetadata(local.location, metadata); } } catch (error) { - this.telemetryService.publicLog2('extension:extract', { extensionId: local.identifier.id, code: error.code }); + this.telemetryService.publicLog2('extension:extract', { extensionId: local.identifier.id, code: `${toFileOperationResult(error)}` }); throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata); } return this.scanLocalExtension(local.location, local.type, profileLocation); From 10961c6eec00f18aab98306a725f1e74c84bb726 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Mon, 24 Jun 2024 10:09:25 -0700 Subject: [PATCH 453/755] Minor inline text button polish --- .../contrib/inlineChat/browser/media/inlineChat.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index aa6f14f0ae40b..a345f1cc0c987 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -31,7 +31,7 @@ } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list { - padding: 2px 0 0 0; + padding: 4px 0 0 0; } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.interactive-item-compact { @@ -156,8 +156,8 @@ .action-item.text-only .action-label { font-size: 12px; line-height: 16px; - padding: 1px 2px; - border-radius: 3px; + padding: 0 4px; + border-radius: 2px; } .monaco-action-bar .action-item.menu-entry.text-only + .action-item:not(.text-only) > .monaco-dropdown .action-label { From 1b883b238ed87888a19d2a4b88fb536e5a66fb9e Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 24 Jun 2024 10:31:17 -0700 Subject: [PATCH 454/755] Fix #209158. Add Copy Output and Open Output in Text Editor to Scrollable text output context menu. (#216920) * Fix #209158. Add Copy Output and Open Output in Text Editor to Scrollable text output context menu. * Context menu should be triggered on container * fix naming --- extensions/ipynb/package.json | 17 +++++++ extensions/ipynb/package.nls.json | 1 + .../notebook-renderers/src/textHelper.ts | 10 +++++ .../browser/controller/cellOutputActions.ts | 45 ++++++++++++++++++- 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/extensions/ipynb/package.json b/extensions/ipynb/package.json index b97bd42e6c804..d881eb8ca2216 100644 --- a/extensions/ipynb/package.json +++ b/extensions/ipynb/package.json @@ -62,6 +62,11 @@ "command": "notebook.cellOutput.copy", "title": "%copyCellOutput.title%", "category": "Notebook" + }, + { + "command": "notebook.cellOutput.openInTextEditor", + "title": "%openCellOutput.title%", + "category": "Notebook" } ], "notebooks": [ @@ -108,12 +113,24 @@ { "command": "notebook.cellOutput.copy", "when": "notebookCellHasOutputs" + }, + { + "command": "notebook.cellOutput.openInTextEditor", + "when": "false" } ], "webview/context": [ { "command": "notebook.cellOutput.copy", "when": "webviewId == 'notebook.output' && webviewSection == 'image'" + }, + { + "command": "notebook.cellOutput.copy", + "when": "webviewId == 'notebook.output' && webviewSection == 'text'" + }, + { + "command": "notebook.cellOutput.openInTextEditor", + "when": "webviewId == 'notebook.output' && webviewSection == 'text'" } ] } diff --git a/extensions/ipynb/package.nls.json b/extensions/ipynb/package.nls.json index af7d8f4ab4717..7a3d95181cfcd 100644 --- a/extensions/ipynb/package.nls.json +++ b/extensions/ipynb/package.nls.json @@ -7,6 +7,7 @@ "openIpynbInNotebookEditor.title": "Open IPYNB File In Notebook Editor", "cleanInvalidImageAttachment.title": "Clean Invalid Image Attachment Reference", "copyCellOutput.title": "Copy Cell Output", + "openCellOutput.title": "Open Cell Output in Text Editor", "markdownAttachmentRenderer.displayName": { "message": "Markdown-It ipynb Cell Attachment renderer", "comment": [ diff --git a/extensions/notebook-renderers/src/textHelper.ts b/extensions/notebook-renderers/src/textHelper.ts index b49dbb6ad8d08..9c080c7f9e42f 100644 --- a/extensions/notebook-renderers/src/textHelper.ts +++ b/extensions/notebook-renderers/src/textHelper.ts @@ -71,6 +71,11 @@ function generateNestedViewAllElement(outputId: string) { function truncatedArrayOfString(id: string, buffer: string[], linesLimit: number, linkOptions: LinkOptions) { const container = document.createElement('div'); + container.setAttribute('data-vscode-context', JSON.stringify({ + webviewSection: 'text', + outputId: id, + 'preventDefaultContextMenuItems': true + })); const lineCount = buffer.length; if (lineCount <= linesLimit) { @@ -95,6 +100,11 @@ function truncatedArrayOfString(id: string, buffer: string[], linesLimit: number function scrollableArrayOfString(id: string, buffer: string[], linkOptions: LinkOptions) { const element = document.createElement('div'); + element.setAttribute('data-vscode-context', JSON.stringify({ + webviewSection: 'text', + outputId: id, + 'preventDefaultContextMenuItems': true + })); if (buffer.length > softScrollableLineLimit) { element.appendChild(generateNestedViewAllElement(id)); } diff --git a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts index 0db8e6dd2b455..db449afafdba6 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts @@ -7,6 +7,7 @@ import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { localize } from 'vs/nls'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; import { INotebookOutputActionContext, NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { NOTEBOOK_CELL_HAS_OUTPUTS } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; @@ -14,7 +15,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { copyCellOutput } from 'vs/workbench/contrib/notebook/browser/contrib/clipboard/cellOutputClipboard'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ICellOutputViewModel, ICellViewModel, INotebookEditor, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; export const COPY_OUTPUT_COMMAND_ID = 'notebook.cellOutput.copy'; @@ -104,3 +105,45 @@ function getOutputViewModelFromId(outputId: string, notebookEditor: INotebookEdi return undefined; } + +export const OPEN_OUTPUT_COMMAND_ID = 'notebook.cellOutput.openInTextEditor'; + +registerAction2(class OpenCellOutputInEditorAction extends Action2 { + constructor() { + super({ + id: OPEN_OUTPUT_COMMAND_ID, + title: localize('notebookActions.openOutputInEditor', "Open Cell Output in Text Editor"), + f1: false, + category: NOTEBOOK_ACTIONS_CATEGORY, + icon: icons.copyIcon, + }); + } + + private getNoteboookEditor(editorService: IEditorService, outputContext: INotebookOutputActionContext | { outputViewModel: ICellOutputViewModel } | undefined): INotebookEditor | undefined { + if (outputContext && 'notebookEditor' in outputContext) { + return outputContext.notebookEditor; + } + return getNotebookEditorFromEditorPane(editorService.activeEditorPane); + } + + async run(accessor: ServicesAccessor, outputContext: INotebookOutputActionContext | { outputViewModel: ICellOutputViewModel } | undefined): Promise { + const notebookEditor = this.getNoteboookEditor(accessor.get(IEditorService), outputContext); + + if (!notebookEditor) { + return; + } + + let outputViewModel: ICellOutputViewModel | undefined; + if (outputContext && 'outputId' in outputContext && typeof outputContext.outputId === 'string') { + outputViewModel = getOutputViewModelFromId(outputContext.outputId, notebookEditor); + } else if (outputContext && 'outputViewModel' in outputContext) { + outputViewModel = outputContext.outputViewModel; + } + + const openerService = accessor.get(IOpenerService); + + if (outputViewModel?.model.outputId && notebookEditor.textModel?.uri) { + openerService.open(CellUri.generateCellOutputUri(notebookEditor.textModel.uri, outputViewModel.model.outputId)); + } + } +}); From 3cdb16526254722b567d23fd830800cca8e0947f Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 24 Jun 2024 14:11:39 +0200 Subject: [PATCH 455/755] Update to @vscode/proxy-agent 0.21.0 --- .../vscode-api-tests/src/singlefolder-tests/proxy.test.ts | 8 ++++---- package.json | 4 ++-- remote/package.json | 2 +- remote/yarn.lock | 8 ++++---- src/vs/workbench/api/node/proxyResolver.ts | 8 ++++---- yarn.lock | 8 ++++---- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts index 60f100c7c1f11..74fa5d181a5f5 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts @@ -8,7 +8,7 @@ import 'mocha'; import { assertNoRpc } from '../utils'; import { pki } from 'node-forge'; import { AddressInfo } from 'net'; -import { resetCaches } from '@vscode/proxy-agent'; +import { resetCaches, testCertificates } from '@vscode/proxy-agent'; suite('vscode API - network proxy support', () => { @@ -52,8 +52,8 @@ suite('vscode API - network proxy support', () => { rejectPort(err); }); - // Using https.globalAgent because it is shared with proxyResolver.ts and mutable. - (https.globalAgent as any).testCertificates = [certPEM]; + // Using `testCertificates` shared between proxyResolver.ts and proxy.test.ts. + testCertificates.splice(0, testCertificates.length, certPEM); resetCaches(); try { @@ -69,7 +69,7 @@ suite('vscode API - network proxy support', () => { .on('error', reject); }); } finally { - delete (https.globalAgent as any).testCertificates; + testCertificates.splice(0, testCertificates.length); resetCaches(); server.close(); } diff --git a/package.json b/package.json index 4bc1bf1385782..7bd20339726e5 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/policy-watcher": "^1.1.4", - "@vscode/proxy-agent": "^0.20.0", + "@vscode/proxy-agent": "^0.21.0", "@vscode/ripgrep": "^1.15.9", "@vscode/spdlog": "^0.15.0", "@vscode/sqlite3": "5.1.6-vscode", @@ -229,4 +229,4 @@ "optionalDependencies": { "windows-foreground-love": "0.5.0" } -} \ No newline at end of file +} diff --git a/remote/package.json b/remote/package.json index c9b813f2b65d4..5b0e80182eaac 100644 --- a/remote/package.json +++ b/remote/package.json @@ -8,7 +8,7 @@ "@parcel/watcher": "2.1.0", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.0", - "@vscode/proxy-agent": "^0.20.0", + "@vscode/proxy-agent": "^0.21.0", "@vscode/ripgrep": "^1.15.9", "@vscode/spdlog": "^0.15.0", "@vscode/vscode-languagedetection": "1.0.21", diff --git a/remote/yarn.lock b/remote/yarn.lock index f57d42bd60431..c8e84fc81e14b 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -66,10 +66,10 @@ resolved "https://registry.yarnpkg.com/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz#d2f1e0664ee6036408f9743fee264ea0699b0e48" integrity sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg== -"@vscode/proxy-agent@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.20.0.tgz#48cbfd15e76da674bb1ba6e09a05b736d5677df0" - integrity sha512-FskCQwrFiXI+KiGgvEvUENNDffu5cDg3Cz1zWsafqvuPoPpTC88SOJl9kbeu3Y2YvSMcHx/r3tkK6ICoMaEWNQ== +"@vscode/proxy-agent@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.21.0.tgz#93c818b863ad20b42679032ecc1e3ecdc6306f12" + integrity sha512-9YcpBq+ZhMr3EQY/5ScyHc9kIIU/AcYOQn3DXq0N9tl81ViVsUvii3Fh+FAtD0YQ/qWtDfGxt8VCWZtuyh2D0g== dependencies: "@tootallnate/once" "^3.0.0" agent-base "^7.0.1" diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index f285450008374..6cb6349d1721c 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -16,7 +16,7 @@ import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionS import { URI } from 'vs/base/common/uri'; import { ILogService, LogLevel as LogServiceLevel } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { LogLevel, createHttpPatch, createProxyResolver, createTlsPatch, ProxySupportSetting, ProxyAgentParams, createNetPatch, loadSystemCertificates } from '@vscode/proxy-agent'; +import { LogLevel, createHttpPatch, createProxyResolver, createTlsPatch, ProxySupportSetting, ProxyAgentParams, createNetPatch, loadSystemCertificates, testCertificates } from '@vscode/proxy-agent'; const systemCertificatesV2Default = false; @@ -67,10 +67,10 @@ export function connectProxyResolver( certs.then(certs => extHostLogService.trace('ProxyResolver#loadAdditionalCertificates: Loaded certificates from main process', certs.length)); promises.push(certs); } - // Using https.globalAgent because it is shared with proxy.test.ts and mutable. - if (initData.environment.extensionTestsLocationURI && (https.globalAgent as any).testCertificates?.length) { + // Using `testCertificates` shared between proxyResolver.ts and proxy.test.ts. + if (initData.environment.extensionTestsLocationURI && testCertificates.length) { extHostLogService.trace('ProxyResolver#loadAdditionalCertificates: Loading test certificates'); - promises.push(Promise.resolve((https.globalAgent as any).testCertificates as string[])); + promises.push(Promise.resolve(testCertificates)); } return (await Promise.all(promises)).flat(); }, diff --git a/yarn.lock b/yarn.lock index 05de6b41206bd..71aef4295fa3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1570,10 +1570,10 @@ bindings "^1.5.0" node-addon-api "^6.0.0" -"@vscode/proxy-agent@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.20.0.tgz#48cbfd15e76da674bb1ba6e09a05b736d5677df0" - integrity sha512-FskCQwrFiXI+KiGgvEvUENNDffu5cDg3Cz1zWsafqvuPoPpTC88SOJl9kbeu3Y2YvSMcHx/r3tkK6ICoMaEWNQ== +"@vscode/proxy-agent@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@vscode/proxy-agent/-/proxy-agent-0.21.0.tgz#93c818b863ad20b42679032ecc1e3ecdc6306f12" + integrity sha512-9YcpBq+ZhMr3EQY/5ScyHc9kIIU/AcYOQn3DXq0N9tl81ViVsUvii3Fh+FAtD0YQ/qWtDfGxt8VCWZtuyh2D0g== dependencies: "@tootallnate/once" "^3.0.0" agent-base "^7.0.1" From 298c72219bcc76aa0ff825b77f307013b568fcc5 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 24 Jun 2024 15:08:31 +0200 Subject: [PATCH 456/755] Module not shared on Windows? --- .../vscode-api-tests/src/singlefolder-tests/proxy.test.ts | 8 ++++---- src/vs/workbench/api/node/proxyResolver.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts index 74fa5d181a5f5..60f100c7c1f11 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts @@ -8,7 +8,7 @@ import 'mocha'; import { assertNoRpc } from '../utils'; import { pki } from 'node-forge'; import { AddressInfo } from 'net'; -import { resetCaches, testCertificates } from '@vscode/proxy-agent'; +import { resetCaches } from '@vscode/proxy-agent'; suite('vscode API - network proxy support', () => { @@ -52,8 +52,8 @@ suite('vscode API - network proxy support', () => { rejectPort(err); }); - // Using `testCertificates` shared between proxyResolver.ts and proxy.test.ts. - testCertificates.splice(0, testCertificates.length, certPEM); + // Using https.globalAgent because it is shared with proxyResolver.ts and mutable. + (https.globalAgent as any).testCertificates = [certPEM]; resetCaches(); try { @@ -69,7 +69,7 @@ suite('vscode API - network proxy support', () => { .on('error', reject); }); } finally { - testCertificates.splice(0, testCertificates.length); + delete (https.globalAgent as any).testCertificates; resetCaches(); server.close(); } diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index 6cb6349d1721c..f285450008374 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -16,7 +16,7 @@ import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionS import { URI } from 'vs/base/common/uri'; import { ILogService, LogLevel as LogServiceLevel } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { LogLevel, createHttpPatch, createProxyResolver, createTlsPatch, ProxySupportSetting, ProxyAgentParams, createNetPatch, loadSystemCertificates, testCertificates } from '@vscode/proxy-agent'; +import { LogLevel, createHttpPatch, createProxyResolver, createTlsPatch, ProxySupportSetting, ProxyAgentParams, createNetPatch, loadSystemCertificates } from '@vscode/proxy-agent'; const systemCertificatesV2Default = false; @@ -67,10 +67,10 @@ export function connectProxyResolver( certs.then(certs => extHostLogService.trace('ProxyResolver#loadAdditionalCertificates: Loaded certificates from main process', certs.length)); promises.push(certs); } - // Using `testCertificates` shared between proxyResolver.ts and proxy.test.ts. - if (initData.environment.extensionTestsLocationURI && testCertificates.length) { + // Using https.globalAgent because it is shared with proxy.test.ts and mutable. + if (initData.environment.extensionTestsLocationURI && (https.globalAgent as any).testCertificates?.length) { extHostLogService.trace('ProxyResolver#loadAdditionalCertificates: Loading test certificates'); - promises.push(Promise.resolve(testCertificates)); + promises.push(Promise.resolve((https.globalAgent as any).testCertificates as string[])); } return (await Promise.all(promises)).flat(); }, From 7b12ac06093d41d9293c580bbbcda3a4e4819ff5 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 24 Jun 2024 11:05:36 -0700 Subject: [PATCH 457/755] debug: fix shadowed variables duplicating inlay values (#217330) I noticed when working on another thing that if a variable appears in multiple scopes with different values debug would duplicate the inline value. This was because we created the decorations for each scope and then deduplicated them by content. Now we keep a map of all inline values we want to apply and add variables to it from narrowest to widest scope, skipping any duplicates. --- .../debug/browser/debugEditorContribution.ts | 50 ++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts index 1612646a1e9bd..7ef1947ea2c2a 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts @@ -7,7 +7,6 @@ import { addDisposableListener, isKeyboardEvent } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; -import { distinct } from 'vs/base/common/arrays'; import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { memoize } from 'vs/base/common/decorators'; @@ -127,7 +126,7 @@ function replaceWsWithNoBreakWs(str: string): string { return str.replace(/[ \t]/g, strings.noBreakWhitespace); } -function createInlineValueDecorationsInsideRange(expressions: ReadonlyArray, ranges: Range[], model: ITextModel, wordToLineNumbersMap: Map): IModelDeltaDecoration[] { +function createInlineValueDecorationsInsideRange(expressions: ReadonlyArray, ranges: Range[], model: ITextModel, wordToLineNumbersMap: Map) { const nameValueMap = new Map(); for (const expr of expressions) { nameValueMap.set(expr.name, expr.value); @@ -157,17 +156,14 @@ function createInlineValueDecorationsInsideRange(expressions: ReadonlyArray { - const contentText = names.sort((first, second) => { + return [...lineToNamesMap].map(([line, names]) => ({ + line, + variables: names.sort((first, second) => { const content = model.getLineContent(line); return content.indexOf(first) - content.indexOf(second); - }).map(name => `${name} = ${nameValueMap.get(name)}`).join(', '); - decorations.push(...createInlineValueDecoration(line, contentText)); - }); - - return decorations; + }).map(name => ({ name, value: nameValueMap.get(name)! })) + })); } function getWordToLineNumbersMap(model: ITextModel, lineNumber: number, result: Map) { @@ -783,10 +779,15 @@ export class DebugEditorContribution implements IDebugEditorContribution { // old "one-size-fits-all" strategy const scopes = await stackFrame.getMostSpecificScopes(stackFrame.range); - // Get all top level variables in the scope chain - const decorationsPerScope = await Promise.all(scopes.map(async scope => { - const variables = await scope.getChildren(); + const scopesWithVariables = await Promise.all(scopes.map(async scope => + ({ scope, variables: await scope.getChildren() }))); + + // Map of inline values per line that's populated in scope order, from + // narrowest to widest. This is done to avoid duplicating values if + // they appear in multiple scopes or are shadowed (#129770, #217326) + const valuesPerLine = new Map>(); + for (const { scope, variables } of scopesWithVariables) { let scopeRange = new Range(0, 0, stackFrame.range.startLineNumber, stackFrame.range.startColumn); if (scope.range) { scopeRange = scopeRange.setStartPosition(scope.range.startLineNumber, scope.range.startColumn); @@ -798,12 +799,25 @@ export class DebugEditorContribution implements IDebugEditorContribution { this._wordToLineNumbersMap.ensureRangePopulated(range); } - return createInlineValueDecorationsInsideRange(variables, ownRanges, model, this._wordToLineNumbersMap.value); - })); + const mapped = createInlineValueDecorationsInsideRange(variables, ownRanges, model, this._wordToLineNumbersMap.value); + for (const { line, variables } of mapped) { + let values = valuesPerLine.get(line); + if (!values) { + values = new Map(); + valuesPerLine.set(line, values); + } + + for (const { name, value } of variables) { + if (!values.has(name)) { + values.set(name, value); + } + } + } + } - allDecorations = distinct(decorationsPerScope.flat(), - // Deduplicate decorations since same variable can appear in multiple scopes, leading to duplicated decorations #129770 - decoration => `${decoration.range.startLineNumber}:${decoration?.options.after?.content}`); + allDecorations = [...valuesPerLine.entries()].flatMap(([line, values]) => + createInlineValueDecoration(line, [...values].map(([n, v]) => `${n} = ${v}`).join(', ')) + ); } if (cts.token.isCancellationRequested) { From e3e15e15e82df2390b0c9e1ad4bc8add01752610 Mon Sep 17 00:00:00 2001 From: mohankumarelec Date: Mon, 24 Jun 2024 23:35:55 +0530 Subject: [PATCH 458/755] Add http.noProxy setting (fixes #211956) --- src/vs/platform/request/common/request.ts | 6 ++++++ src/vs/platform/windows/electron-main/windowImpl.ts | 5 +++-- src/vs/workbench/api/node/proxyResolver.ts | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/request/common/request.ts b/src/vs/platform/request/common/request.ts index 289ad6740e0c8..06265628b94a7 100644 --- a/src/vs/platform/request/common/request.ts +++ b/src/vs/platform/request/common/request.ts @@ -155,6 +155,12 @@ function registerProxyConfigurations(scope: ConfigurationScope): void { markdownDescription: localize('proxyKerberosServicePrincipal', "Overrides the principal service name for Kerberos authentication with the HTTP proxy. A default based on the proxy hostname is used when this is not set."), restricted: true }, + 'http.noProxy': { + type: 'array', + items: { type: 'string' }, + markdownDescription: localize('noProxy', "Specifies domain names for which proxy settings should be ignored for HTTP/HTTPS requests."), + restricted: true + }, 'http.proxyAuthorization': { type: ['null', 'string'], default: null, diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index dcb3a1776ecfa..dcb1cc9210dc9 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -957,7 +957,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { } // Proxy - if (!e || e.affectsConfiguration('http.proxy')) { + if (!e || e.affectsConfiguration('http.proxy') || e.affectsConfiguration('http.noProxy')) { let newHttpProxy = (this.configurationService.getValue('http.proxy') || '').trim() || (process.env['https_proxy'] || process.env['HTTPS_PROXY'] || process.env['http_proxy'] || process.env['HTTP_PROXY'] || '').trim() // Not standardized. || undefined; @@ -966,7 +966,8 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { newHttpProxy = newHttpProxy.substr(0, newHttpProxy.length - 1); } - const newNoProxy = (process.env['no_proxy'] || process.env['NO_PROXY'] || '').trim() || undefined; // Not standardized. + const newNoProxy = (this.configurationService.getValue('http.noProxy') || []).map((item) => item.trim()).join(',') + || (process.env['no_proxy'] || process.env['NO_PROXY'] || '').trim() || undefined; // Not standardized. if ((newHttpProxy || '').indexOf('@') === -1 && (newHttpProxy !== this.currentHttpProxy || newNoProxy !== this.currentNoProxy)) { this.currentHttpProxy = newHttpProxy; this.currentNoProxy = newNoProxy; diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index f285450008374..ac373f9739bb1 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -35,6 +35,7 @@ export function connectProxyResolver( lookupProxyAuthorization: lookupProxyAuthorization.bind(undefined, extHostLogService, mainThreadTelemetry, configProvider, {}, initData.remote.isRemote), getProxyURL: () => configProvider.getConfiguration('http').get('proxy'), getProxySupport: () => configProvider.getConfiguration('http').get('proxySupport') || 'off', + getNoProxyConfig: () => configProvider.getConfiguration('http').get('noProxy') || [], addCertificatesV1: () => certSettingV1(configProvider), addCertificatesV2: () => certSettingV2(configProvider), log: extHostLogService, From b8f8a1b4b239459f1f44f105fccb0241c3249bec Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 24 Jun 2024 11:10:37 -0700 Subject: [PATCH 459/755] Cap number of code blocks models we keep around (#216753) --- .../chat/common/codeBlockModelCollection.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/vs/workbench/contrib/chat/common/codeBlockModelCollection.ts b/src/vs/workbench/contrib/chat/common/codeBlockModelCollection.ts index a857b64cb1df9..d5ed699cd9b6d 100644 --- a/src/vs/workbench/contrib/chat/common/codeBlockModelCollection.ts +++ b/src/vs/workbench/contrib/chat/common/codeBlockModelCollection.ts @@ -22,6 +22,13 @@ export class CodeBlockModelCollection extends Disposable { vulns: readonly IMarkdownVulnerability[]; }>(); + /** + * Max number of models to keep in memory. + * + * Currently always maintains the most recently created models. + */ + private readonly maxModelCount = 100; + constructor( @ILanguageService private readonly languageService: ILanguageService, @ITextModelService private readonly textModelService: ITextModelService @@ -52,9 +59,28 @@ export class CodeBlockModelCollection extends Disposable { const uri = this.getUri(sessionId, chat, codeBlockIndex); const ref = this.textModelService.createModelReference(uri); this._models.set(uri, { model: ref, vulns: [] }); + + while (this._models.size > this.maxModelCount) { + const first = Array.from(this._models.keys()).at(0); + if (!first) { + break; + } + this.delete(first); + } + return { model: ref.then(ref => ref.object), vulns: [] }; } + private delete(codeBlockUri: URI) { + const entry = this._models.get(codeBlockUri); + if (!entry) { + return; + } + + entry.model.then(ref => ref.dispose()); + this._models.delete(codeBlockUri); + } + clear(): void { this._models.forEach(async entry => (await entry.model).dispose()); this._models.clear(); From 4a59a68f3a928101f44694345f07ad543d84dd86 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 24 Jun 2024 11:11:05 -0700 Subject: [PATCH 460/755] Revert "Remove check for validity" (#217334) Revert "Remove check for validity (#216675)" This reverts commit a3017010e9846f36d4e2da88c5e782290ca77399. --- .github/workflows/on-open.yml | 5 +++++ .github/workflows/on-reopen.yml | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 .github/workflows/on-reopen.yml diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index 361ac11b94667..679c1c65db87c 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -16,6 +16,11 @@ jobs: - name: Install Actions run: npm install --production --prefix ./actions + - name: Check for Validity + uses: ./actions/validity-checker + with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + - name: Run CopyCat (VSCodeTriageBot/testissues) uses: ./actions/copycat with: diff --git a/.github/workflows/on-reopen.yml b/.github/workflows/on-reopen.yml new file mode 100644 index 0000000000000..d29de326c53a3 --- /dev/null +++ b/.github/workflows/on-reopen.yml @@ -0,0 +1,22 @@ +name: On Reopen +on: + issues: + types: [reopened] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v4 + with: + repository: "microsoft/vscode-github-triage-actions" + ref: stable + path: ./actions + - name: Install Actions + run: npm install --production --prefix ./actions + + - name: Check for Validity + uses: ./actions/validity-checker + with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} From 2a106ad4b531fa1a6571cddf9e50995268d0ec87 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Mon, 24 Jun 2024 11:40:51 -0700 Subject: [PATCH 461/755] fix: some settings still localize link markdown (#217375) --- src/vs/platform/list/browser/listService.ts | 2 +- src/vs/workbench/electron-sandbox/desktop.contribution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 6857531cb6681..976b9a85dc315 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -1490,7 +1490,7 @@ configurationRegistry.registerConfiguration({ type: 'number', minimum: 1, default: 7, - markdownDescription: localize('sticky scroll maximum items', "Controls the number of sticky elements displayed in the tree when `#workbench.tree.enableStickyScroll#` is enabled."), + markdownDescription: localize('sticky scroll maximum items', "Controls the number of sticky elements displayed in the tree when {0} is enabled.", '`#workbench.tree.enableStickyScroll#`'), }, [typeNavigationModeSettingKey]: { type: 'string', diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index 6fd2279a32061..4ae3a9f94edb0 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -226,7 +226,7 @@ import { MAX_ZOOM_LEVEL, MIN_ZOOM_LEVEL } from 'vs/platform/window/electron-sand 'type': 'boolean', 'default': false, 'scope': ConfigurationScope.APPLICATION, - 'markdownDescription': localize('window.doubleClickIconToClose', "If enabled, this setting will close the window when the application icon in the title bar is double-clicked. The window will not be able to be dragged by the icon. This setting is effective only if `#window.titleBarStyle#` is set to `custom`.") + 'markdownDescription': localize('window.doubleClickIconToClose', "If enabled, this setting will close the window when the application icon in the title bar is double-clicked. The window will not be able to be dragged by the icon. This setting is effective only if {0} is set to `custom`.", '`#window.titleBarStyle#`') }, 'window.titleBarStyle': { 'type': 'string', From 06bf1d5fcf5268ecd7a2f7b348e09c6dc5561df8 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2024 20:43:08 +0200 Subject: [PATCH 462/755] rename 'insert at cursor' to 'apply in editor' (#217376) --- src/vs/editor/common/languages.ts | 2 +- src/vs/monaco.d.ts | 2 +- .../contrib/chat/browser/actions/chatCodeblockActions.ts | 2 +- src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 1d5c290117891..3159cdc6ae5da 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -2262,7 +2262,7 @@ export interface MappedEditsProvider { * * @param document The document to provide mapped edits for. * @param codeBlocks Code blocks that come from an LLM's reply. - * "Insert at cursor" in the panel chat only sends one edit that the user clicks on, but inline chat can send multiple blocks and let the lang server decide what to do with them. + * "Apply in Editor" in the panel chat only sends one edit that the user clicks on, but inline chat can send multiple blocks and let the lang server decide what to do with them. * @param context The context for providing mapped edits. * @param token A cancellation token. * @returns A provider result of text edits. diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index d12441499ea6c..c7e413801ccfe 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -8065,7 +8065,7 @@ declare namespace monaco.languages { * * @param document The document to provide mapped edits for. * @param codeBlocks Code blocks that come from an LLM's reply. - * "Insert at cursor" in the panel chat only sends one edit that the user clicks on, but inline chat can send multiple blocks and let the lang server decide what to do with them. + * "Apply in Editor" in the panel chat only sends one edit that the user clicks on, but inline chat can send multiple blocks and let the lang server decide what to do with them. * @param context The context for providing mapped edits. * @param token A cancellation token. * @returns A provider result of text edits. diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts index 01f026310defe..b94a9434cc5e9 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts @@ -184,7 +184,7 @@ export function registerChatCodeBlockActions() { constructor() { super({ id: 'workbench.action.chat.insertCodeBlock', - title: localize2('interactive.insertCodeBlock.label', "Insert at Cursor"), + title: localize2('interactive.insertCodeBlock.label', "Apply in Editor"), precondition: CONTEXT_CHAT_ENABLED, f1: true, category: CHAT_CATEGORY, diff --git a/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts b/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts index 653f6a2d50d1f..6ed185785d86e 100644 --- a/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.mappedEditsProvider.d.ts @@ -23,7 +23,7 @@ declare module 'vscode' { * Provide mapped edits for a given document. * @param document The document to provide mapped edits for. * @param codeBlocks Code blocks that come from an LLM's reply. - * "Insert at cursor" in the panel chat only sends one edit that the user clicks on, but inline chat can send multiple blocks and let the lang server decide what to do with them. + * "Apply in Editor" in the panel chat only sends one edit that the user clicks on, but inline chat can send multiple blocks and let the lang server decide what to do with them. * @param context The context for providing mapped edits. * @param token A cancellation token. * @returns A provider result of text edits. From 45be8b8f75907203e9f9ec52c6ece3e9fa24132d Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 24 Jun 2024 20:47:01 +0200 Subject: [PATCH 463/755] [css/json/html] update services (#217364) --- extensions/css-language-features/package.json | 2 +- .../css-language-features/server/package.json | 4 +- .../css-language-features/server/yarn.lock | 46 ++++++++-------- extensions/css-language-features/yarn.lock | 38 ++++++------- .../html-language-features/package.json | 2 +- .../server/package.json | 6 +-- .../html-language-features/server/yarn.lock | 54 +++++++++---------- extensions/html-language-features/yarn.lock | 38 ++++++------- .../json-language-features/package.json | 2 +- .../server/package.json | 4 +- .../json-language-features/server/yarn.lock | 53 +++++++++--------- extensions/json-language-features/yarn.lock | 38 ++++++------- 12 files changed, 146 insertions(+), 141 deletions(-) diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index f4f6adfb7f41c..4ddfe8fce0def 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -994,7 +994,7 @@ ] }, "dependencies": { - "vscode-languageclient": "^10.0.0-next.5", + "vscode-languageclient": "^10.0.0-next.8", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 0f1750e800acb..fe4f64d7c0138 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -11,8 +11,8 @@ "browser": "./dist/browser/cssServerMain", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-css-languageservice": "^6.2.14", - "vscode-languageserver": "^10.0.0-next.3", + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver": "^10.0.0-next.6", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 8d4c46d641e7a..59033f770c16b 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -24,28 +24,28 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -vscode-css-languageservice@^6.2.14: - version "6.2.14" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.2.14.tgz#d44fe75c03942d865a9c1a5ff5fb4e8dec1f89d0" - integrity sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw== +vscode-css-languageservice@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.3.0.tgz#51724d193d19b1a9075b1cef5cfeea6a555d2aa4" + integrity sha512-nU92imtkgzpCL0xikrIb8WvedV553F2BENzgz23wFuok/HLN5BeQmroMy26pUwFxV2eV8oNRmYCUv8iO7kSMhw== dependencies: "@vscode/l10n" "^0.0.18" vscode-languageserver-textdocument "^1.0.11" vscode-languageserver-types "3.17.5" vscode-uri "^3.0.8" -vscode-jsonrpc@9.0.0-next.2: - version "9.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80" - integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ== +vscode-jsonrpc@9.0.0-next.4: + version "9.0.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz#ba403ddb3b82ca578179963dbe08e120a935f50d" + integrity sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ== -vscode-languageserver-protocol@3.17.6-next.4: - version "3.17.6-next.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b" - integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w== +vscode-languageserver-protocol@3.17.6-next.6: + version "3.17.6-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz#8863a4dc8b395a8c31106ffdc945a00f9163b68b" + integrity sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw== dependencies: - vscode-jsonrpc "9.0.0-next.2" - vscode-languageserver-types "3.17.6-next.3" + vscode-jsonrpc "9.0.0-next.4" + vscode-languageserver-types "3.17.6-next.4" vscode-languageserver-textdocument@^1.0.11: version "1.0.11" @@ -57,17 +57,17 @@ vscode-languageserver-types@3.17.5: resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== -vscode-languageserver-types@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0" - integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA== +vscode-languageserver-types@3.17.6-next.4: + version "3.17.6-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz#6670939eb98f00aa7b05021dc3dd7fe9aa4453ea" + integrity sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q== -vscode-languageserver@^10.0.0-next.3: - version "10.0.0-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.3.tgz#a63c5ea9fab1be93d7732ab0fdc18c9b37956e07" - integrity sha512-4x1qHImf6ePji4+8PX43lnBCBfBNdi2jneGX2k5FswJhx/cxaYYmusShmmtO/clyL1iurxJacrQoXfw9+ikhvg== +vscode-languageserver@^10.0.0-next.6: + version "10.0.0-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz#0db118a93fe010c6b40cd04e91a15d09e7b60b60" + integrity sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw== dependencies: - vscode-languageserver-protocol "3.17.6-next.4" + vscode-languageserver-protocol "3.17.6-next.6" vscode-uri@^3.0.8: version "3.0.8" diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock index 25a22d07ca662..eef1c9ab57d39 100644 --- a/extensions/css-language-features/yarn.lock +++ b/extensions/css-language-features/yarn.lock @@ -47,32 +47,32 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -vscode-jsonrpc@9.0.0-next.2: - version "9.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80" - integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ== +vscode-jsonrpc@9.0.0-next.4: + version "9.0.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz#ba403ddb3b82ca578179963dbe08e120a935f50d" + integrity sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ== -vscode-languageclient@^10.0.0-next.5: - version "10.0.0-next.5" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.5.tgz#7431d88255a5fd99e9423659ac484b1f968200f3" - integrity sha512-JIf1WE7fvV0RElFM062bAummI433vcxuFwqoYAp+1zTVhta/jznxkTz1zs3Hbj2tiDfclf0TZ0qCxflAP1mY2Q== +vscode-languageclient@^10.0.0-next.8: + version "10.0.0-next.8" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz#5afa0ced3b2ac68d31cc1c48edc4f289744542a0" + integrity sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ== dependencies: minimatch "^9.0.3" semver "^7.6.0" - vscode-languageserver-protocol "3.17.6-next.4" + vscode-languageserver-protocol "3.17.6-next.6" -vscode-languageserver-protocol@3.17.6-next.4: - version "3.17.6-next.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b" - integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w== +vscode-languageserver-protocol@3.17.6-next.6: + version "3.17.6-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz#8863a4dc8b395a8c31106ffdc945a00f9163b68b" + integrity sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw== dependencies: - vscode-jsonrpc "9.0.0-next.2" - vscode-languageserver-types "3.17.6-next.3" + vscode-jsonrpc "9.0.0-next.4" + vscode-languageserver-types "3.17.6-next.4" -vscode-languageserver-types@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0" - integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA== +vscode-languageserver-types@3.17.6-next.4: + version "3.17.6-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz#6670939eb98f00aa7b05021dc3dd7fe9aa4453ea" + integrity sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q== vscode-uri@^3.0.8: version "3.0.8" diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 49489ff20df44..ac026b973eb18 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -259,7 +259,7 @@ }, "dependencies": { "@vscode/extension-telemetry": "^0.9.0", - "vscode-languageclient": "^10.0.0-next.3", + "vscode-languageclient": "^10.0.0-next.8", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 75bfa00de1107..c1ddc242fa4a3 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -10,9 +10,9 @@ "main": "./out/node/htmlServerMain", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-css-languageservice": "^6.2.13", - "vscode-html-languageservice": "^5.2.0", - "vscode-languageserver": "^10.0.0-next.2", + "vscode-css-languageservice": "^6.3.0", + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver": "^10.0.0-next.6", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index f327f1f352f55..caaf929d89547 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -24,38 +24,38 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -vscode-css-languageservice@^6.2.13: - version "6.2.13" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.2.13.tgz#c7c2dc7a081a203048d60157c65536767d6d96f8" - integrity sha512-2rKWXfH++Kxd9Z4QuEgd1IF7WmblWWU7DScuyf1YumoGLkY9DW6wF/OTlhOyO2rN63sWHX2dehIpKBbho4ZwvA== +vscode-css-languageservice@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.3.0.tgz#51724d193d19b1a9075b1cef5cfeea6a555d2aa4" + integrity sha512-nU92imtkgzpCL0xikrIb8WvedV553F2BENzgz23wFuok/HLN5BeQmroMy26pUwFxV2eV8oNRmYCUv8iO7kSMhw== dependencies: "@vscode/l10n" "^0.0.18" vscode-languageserver-textdocument "^1.0.11" vscode-languageserver-types "3.17.5" vscode-uri "^3.0.8" -vscode-html-languageservice@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-5.2.0.tgz#5b36f9131acc073cebaa2074dc8ff53e84c80f31" - integrity sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ== +vscode-html-languageservice@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-5.3.0.tgz#298ae5600c6749cbb95838975d07f449c44cb478" + integrity sha512-C4Z3KsP5Ih+fjHpiBc5jxmvCl+4iEwvXegIrzu2F5pktbWvQaBT3YkVPk8N+QlSSMk8oCG6PKtZ/Sq2YHb5e8g== dependencies: "@vscode/l10n" "^0.0.18" vscode-languageserver-textdocument "^1.0.11" vscode-languageserver-types "^3.17.5" vscode-uri "^3.0.8" -vscode-jsonrpc@9.0.0-next.2: - version "9.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80" - integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ== +vscode-jsonrpc@9.0.0-next.4: + version "9.0.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz#ba403ddb3b82ca578179963dbe08e120a935f50d" + integrity sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ== -vscode-languageserver-protocol@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.3.tgz#09d3e28e9ad12270233d07fa0b69cf1d51d7dfe4" - integrity sha512-H8ATH5SAvc3JzttS+AL6g681PiBOZM/l34WP2JZk4akY3y7NqTP+f9cJ+MhrVBbD3aDS8bdAKewZgbFLW6M8Pg== +vscode-languageserver-protocol@3.17.6-next.6: + version "3.17.6-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz#8863a4dc8b395a8c31106ffdc945a00f9163b68b" + integrity sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw== dependencies: - vscode-jsonrpc "9.0.0-next.2" - vscode-languageserver-types "3.17.6-next.3" + vscode-jsonrpc "9.0.0-next.4" + vscode-languageserver-types "3.17.6-next.4" vscode-languageserver-textdocument@^1.0.11: version "1.0.11" @@ -67,17 +67,17 @@ vscode-languageserver-types@3.17.5, vscode-languageserver-types@^3.17.5: resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== -vscode-languageserver-types@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0" - integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA== +vscode-languageserver-types@3.17.6-next.4: + version "3.17.6-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz#6670939eb98f00aa7b05021dc3dd7fe9aa4453ea" + integrity sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q== -vscode-languageserver@^10.0.0-next.2: - version "10.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.2.tgz#9a8ac58f72979961497c4fd7f6097561d4134d5f" - integrity sha512-WZdK/XO6EkNU6foYck49NpS35sahWhYFs4hwCGalH/6lhPmdUKABTnWioK/RLZKWqH8E5HdlAHQMfSBIxKBV9Q== +vscode-languageserver@^10.0.0-next.6: + version "10.0.0-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz#0db118a93fe010c6b40cd04e91a15d09e7b60b60" + integrity sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw== dependencies: - vscode-languageserver-protocol "3.17.6-next.3" + vscode-languageserver-protocol "3.17.6-next.6" vscode-uri@^3.0.8: version "3.0.8" diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index d1d73407809c6..aa2ea1c684073 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -149,32 +149,32 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -vscode-jsonrpc@9.0.0-next.2: - version "9.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80" - integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ== +vscode-jsonrpc@9.0.0-next.4: + version "9.0.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz#ba403ddb3b82ca578179963dbe08e120a935f50d" + integrity sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ== -vscode-languageclient@^10.0.0-next.3: - version "10.0.0-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.3.tgz#d7336bafafb37569ac1d8e931d20ba2a6385cc64" - integrity sha512-jJhPdZaiELpPRnCUt8kQcF2HJuvzLgeW4HOGc6dp8Je+p08ndueVT4fpSsbly6KiEHr/Ri73tNz0CSfsOye6MA== +vscode-languageclient@^10.0.0-next.8: + version "10.0.0-next.8" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz#5afa0ced3b2ac68d31cc1c48edc4f289744542a0" + integrity sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ== dependencies: minimatch "^9.0.3" semver "^7.6.0" - vscode-languageserver-protocol "3.17.6-next.4" + vscode-languageserver-protocol "3.17.6-next.6" -vscode-languageserver-protocol@3.17.6-next.4: - version "3.17.6-next.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b" - integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w== +vscode-languageserver-protocol@3.17.6-next.6: + version "3.17.6-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz#8863a4dc8b395a8c31106ffdc945a00f9163b68b" + integrity sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw== dependencies: - vscode-jsonrpc "9.0.0-next.2" - vscode-languageserver-types "3.17.6-next.3" + vscode-jsonrpc "9.0.0-next.4" + vscode-languageserver-types "3.17.6-next.4" -vscode-languageserver-types@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0" - integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA== +vscode-languageserver-types@3.17.6-next.4: + version "3.17.6-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz#6670939eb98f00aa7b05021dc3dd7fe9aa4453ea" + integrity sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q== vscode-uri@^3.0.8: version "3.0.8" diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index f86470429a4c0..fa8004e2b02ff 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -163,7 +163,7 @@ "dependencies": { "@vscode/extension-telemetry": "^0.9.0", "request-light": "^0.7.0", - "vscode-languageclient": "^10.0.0-next.5" + "vscode-languageclient": "^10.0.0-next.8" }, "devDependencies": { "@types/node": "20.x" diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 6134fb4224d0c..8472ca618a4fd 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -15,8 +15,8 @@ "@vscode/l10n": "^0.0.18", "jsonc-parser": "^3.2.1", "request-light": "^0.7.0", - "vscode-json-languageservice": "^5.3.11", - "vscode-languageserver": "^10.0.0-next.3", + "vscode-json-languageservice": "^5.4.0", + "vscode-languageserver": "^10.0.0-next.6", "vscode-uri": "^3.0.8" }, "devDependencies": { diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 669e823497d03..608619637e412 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -24,6 +24,11 @@ jsonc-parser@^3.2.1: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== +jsonc-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.0.tgz#030d182672c8ffc2805db95467c83ffc0b033d9d" + integrity sha512-RK1Xb5alM78sdXpB2hqqK7jxAE5jTRH05GvUiLWqh7Vbp6OPHuJYlsAMRUDYNYJTAQgkmhHgkdwOEknxwP4ojQ== + request-light@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.7.0.tgz#885628bb2f8040c26401ebf258ec51c4ae98ac2a" @@ -34,51 +39,51 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -vscode-json-languageservice@^5.3.11: - version "5.3.11" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-5.3.11.tgz#71dbc56e9b1d07a57aa6a3d5569c8b7f2c05ca05" - integrity sha512-WYS72Ymria3dn8ZbjtBbt5K71m05wY1Q6hpXV5JxUT0q75Ts0ljLmnZJAVpx8DjPgYbFD+Z8KHpWh2laKLUCtQ== +vscode-json-languageservice@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-5.4.0.tgz#caf1aabc81b1df9faf6a97e4c34e13a2d10a8cdf" + integrity sha512-NCkkCr63OHVkE4lcb0xlUAaix6vE5gHQW4NrswbLEh3ArXj81lrGuFTsGEYEUXlNHdnc53vWPcjeSy/nMTrfXg== dependencies: "@vscode/l10n" "^0.0.18" - jsonc-parser "^3.2.1" + jsonc-parser "^3.3.0" vscode-languageserver-textdocument "^1.0.11" vscode-languageserver-types "^3.17.5" vscode-uri "^3.0.8" -vscode-jsonrpc@9.0.0-next.2: - version "9.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80" - integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ== +vscode-jsonrpc@9.0.0-next.4: + version "9.0.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz#ba403ddb3b82ca578179963dbe08e120a935f50d" + integrity sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ== -vscode-languageserver-protocol@3.17.6-next.4: - version "3.17.6-next.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b" - integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w== +vscode-languageserver-protocol@3.17.6-next.6: + version "3.17.6-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz#8863a4dc8b395a8c31106ffdc945a00f9163b68b" + integrity sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw== dependencies: - vscode-jsonrpc "9.0.0-next.2" - vscode-languageserver-types "3.17.6-next.3" + vscode-jsonrpc "9.0.0-next.4" + vscode-languageserver-types "3.17.6-next.4" vscode-languageserver-textdocument@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== -vscode-languageserver-types@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0" - integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA== +vscode-languageserver-types@3.17.6-next.4: + version "3.17.6-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz#6670939eb98f00aa7b05021dc3dd7fe9aa4453ea" + integrity sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q== vscode-languageserver-types@^3.17.5: version "3.17.5" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== -vscode-languageserver@^10.0.0-next.3: - version "10.0.0-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.3.tgz#a63c5ea9fab1be93d7732ab0fdc18c9b37956e07" - integrity sha512-4x1qHImf6ePji4+8PX43lnBCBfBNdi2jneGX2k5FswJhx/cxaYYmusShmmtO/clyL1iurxJacrQoXfw9+ikhvg== +vscode-languageserver@^10.0.0-next.6: + version "10.0.0-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz#0db118a93fe010c6b40cd04e91a15d09e7b60b60" + integrity sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw== dependencies: - vscode-languageserver-protocol "3.17.6-next.4" + vscode-languageserver-protocol "3.17.6-next.6" vscode-uri@^3.0.8: version "3.0.8" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index b7ca937103a52..c825de0768334 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -154,32 +154,32 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -vscode-jsonrpc@9.0.0-next.2: - version "9.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80" - integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ== +vscode-jsonrpc@9.0.0-next.4: + version "9.0.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz#ba403ddb3b82ca578179963dbe08e120a935f50d" + integrity sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ== -vscode-languageclient@^10.0.0-next.5: - version "10.0.0-next.5" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.5.tgz#7431d88255a5fd99e9423659ac484b1f968200f3" - integrity sha512-JIf1WE7fvV0RElFM062bAummI433vcxuFwqoYAp+1zTVhta/jznxkTz1zs3Hbj2tiDfclf0TZ0qCxflAP1mY2Q== +vscode-languageclient@^10.0.0-next.8: + version "10.0.0-next.8" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz#5afa0ced3b2ac68d31cc1c48edc4f289744542a0" + integrity sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ== dependencies: minimatch "^9.0.3" semver "^7.6.0" - vscode-languageserver-protocol "3.17.6-next.4" + vscode-languageserver-protocol "3.17.6-next.6" -vscode-languageserver-protocol@3.17.6-next.4: - version "3.17.6-next.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b" - integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w== +vscode-languageserver-protocol@3.17.6-next.6: + version "3.17.6-next.6" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz#8863a4dc8b395a8c31106ffdc945a00f9163b68b" + integrity sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw== dependencies: - vscode-jsonrpc "9.0.0-next.2" - vscode-languageserver-types "3.17.6-next.3" + vscode-jsonrpc "9.0.0-next.4" + vscode-languageserver-types "3.17.6-next.4" -vscode-languageserver-types@3.17.6-next.3: - version "3.17.6-next.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0" - integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA== +vscode-languageserver-types@3.17.6-next.4: + version "3.17.6-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz#6670939eb98f00aa7b05021dc3dd7fe9aa4453ea" + integrity sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q== yallist@^4.0.0: version "4.0.0" From b66a2b091ed79a67f7679428316fb4e49de71777 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 24 Jun 2024 11:53:17 -0700 Subject: [PATCH 464/755] Bump distro (#217382) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7bd20339726e5..3d8b1cbb2093b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "951ec3be152d660cf34920fc3d734d32691bd880", + "distro": "44256034a3b5a2bbd6b12530ab050a2a3c2bd285", "author": { "name": "Microsoft Corporation" }, From 8d0ba61f01742f8cfc1c01b6b2ba0ae3289485a0 Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:24:44 -0700 Subject: [PATCH 465/755] removes remnants of lightbulb telemetry (#217410) remove telemetry --- .../browser/codeActionController.ts | 50 +------------------ .../codeAction/browser/lightBulbWidget.ts | 4 +- 2 files changed, 2 insertions(+), 52 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/codeActionController.ts b/src/vs/editor/contrib/codeAction/browser/codeActionController.ts index 65dc839da2cf5..612fd4d292305 100644 --- a/src/vs/editor/contrib/codeAction/browser/codeActionController.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionController.ts @@ -39,8 +39,6 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { CodeActionAutoApply, CodeActionFilter, CodeActionItem, CodeActionKind, CodeActionSet, CodeActionTrigger, CodeActionTriggerSource } from 'vs/editor/contrib/codeAction/common/types'; import { CodeActionModel, CodeActionsState } from 'vs/editor/contrib/codeAction/browser/codeActionModel'; import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; - interface IActionShowOptions { readonly includeDisabledActions?: boolean; @@ -79,8 +77,7 @@ export class CodeActionController extends Disposable implements IEditorContribut @ICommandService private readonly _commandService: ICommandService, @IConfigurationService private readonly _configurationService: IConfigurationService, @IActionWidgetService private readonly _actionWidgetService: IActionWidgetService, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @ITelemetryService private readonly _telemetryService: ITelemetryService + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); @@ -107,29 +104,6 @@ export class CodeActionController extends Disposable implements IEditorContribut } private async showCodeActionsFromLightbulb(actions: CodeActionSet, at: IAnchor | IPosition): Promise { - - // Telemetry for showing code actions from lightbulb. Shows us how often it was clicked. - type ShowCodeActionListEvent = { - codeActionListLength: number; - codeActions: string[]; - codeActionProviders: string[]; - }; - - type ShowListEventClassification = { - codeActionListLength: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The length of the code action list from the lightbulb widget.' }; - codeActions: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The title of code actions in this menu.' }; - codeActionProviders: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The provider of code actions in this menu.' }; - owner: 'justschen'; - comment: 'Event used to gain insights into what code actions are being shown'; - }; - - this._telemetryService.publicLog2('codeAction.showCodeActionsFromLightbulb', { - codeActionListLength: actions.validActions.length, - codeActions: actions.validActions.map(action => action.action.title), - codeActionProviders: actions.validActions.map(action => action.provider?.displayName ?? ''), - }); - - if (actions.allAIFixes && actions.validActions.length === 1) { const actionItem = actions.validActions[0]; const command = actionItem.action.command; @@ -312,28 +286,6 @@ export class CodeActionController extends Disposable implements IEditorContribut onHide: (didCancel?) => { this._editor?.focus(); currentDecorations.clear(); - // Telemetry for showing code actions here. only log on `showLightbulb`. Logs when code action list is quit out. - if (options.fromLightbulb && didCancel !== undefined) { - type ShowCodeActionListEvent = { - codeActionListLength: number; - didCancel: boolean; - codeActions: string[]; - }; - - type ShowListEventClassification = { - codeActionListLength: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The length of the code action list when quit out. Can be from any code action menu.' }; - didCancel: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the code action was cancelled or selected.' }; - codeActions: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'What code actions were available when cancelled.' }; - owner: 'justschen'; - comment: 'Event used to gain insights into how many valid code actions are being shown'; - }; - - this._telemetryService.publicLog2('codeAction.showCodeActionList.onHide', { - codeActionListLength: actions.validActions.length, - didCancel: didCancel, - codeActions: actions.validActions.map(action => action.action.title), - }); - } }, onHover: async (action: CodeActionItem, token: CancellationToken) => { if (token.isCancellationRequested) { diff --git a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts index bd391744ab306..45fc9aa9cb77d 100644 --- a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts @@ -17,7 +17,6 @@ import { computeIndentLevel } from 'vs/editor/common/model/utils'; import { autoFixCommandId, quickFixCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; import { CodeActionSet, CodeActionTrigger } from 'vs/editor/contrib/codeAction/common/types'; import * as nls from 'vs/nls'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; namespace LightBulbState { @@ -62,8 +61,7 @@ export class LightBulbWidget extends Disposable implements IContentWidget { constructor( private readonly _editor: ICodeEditor, - @IKeybindingService private readonly _keybindingService: IKeybindingService, - @ICommandService commandService: ICommandService + @IKeybindingService private readonly _keybindingService: IKeybindingService ) { super(); From 53e6a2324a3803d46a4c74d864afefc5213827d1 Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Mon, 24 Jun 2024 13:19:27 -0700 Subject: [PATCH 466/755] Update endgame ghinb -> June Milestone (#217475) update endgame ghinb --- .vscode/notebooks/endgame.github-issues | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues index d7836922badbf..e1c0a9fce02b8 100644 --- a/.vscode/notebooks/endgame.github-issues +++ b/.vscode/notebooks/endgame.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"May 2024\"" + "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\r\n\r\n$MILESTONE=milestone:\"June 2024\"" }, { "kind": 1, From aef28862c491e0d57b10f70e703932504afbcf63 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Mon, 24 Jun 2024 23:19:37 +0200 Subject: [PATCH 467/755] Allow multiple extensions to provide default values for object settings (#217179) * Allow multiple extensions to provide default values for object settings * Fix merge conflict * type check * fix tests --- .../common/configurationRegistry.ts | 154 ++++++++++++-- .../test/common/configurationRegistry.test.ts | 32 ++- .../test/common/configurations.test.ts | 61 +++++- .../browser/workbench.contribution.ts | 2 +- .../settingsEditorSettingIndicators.ts | 50 ++++- .../preferences/browser/settingsTree.ts | 157 +++++++++------ .../preferences/browser/settingsTreeModels.ts | 24 ++- .../preferences/browser/settingsWidgets.ts | 190 ++++++++++++------ .../preferences/common/preferences.ts | 4 +- .../preferences/common/preferencesModels.ts | 4 +- 10 files changed, 516 insertions(+), 162 deletions(-) diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index ed8e56d50c5a9..d7e9ae576b0bd 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -233,21 +233,24 @@ export interface IConfigurationNode { restrictedProperties?: string[]; } +export type ConfigurationDefaultSource = IExtensionInfo | string; +export type ConfigurationDefaultValueSource = ConfigurationDefaultSource | Map; + export interface IConfigurationDefaults { overrides: IStringDictionary; - source?: IExtensionInfo | string; + source?: ConfigurationDefaultSource; } export type IRegisteredConfigurationPropertySchema = IConfigurationPropertySchema & { defaultDefaultValue?: any; source?: IExtensionInfo; // Source of the Property - defaultValueSource?: IExtensionInfo | string; // Source of the Default Value + defaultValueSource?: ConfigurationDefaultValueSource; // Source of the Default Value }; export type IConfigurationDefaultOverride = { readonly value: any; - readonly source?: IExtensionInfo | string; // Source of the default override - readonly valuesSources?: Map; // Source of each value in default language overrides + readonly source?: ConfigurationDefaultValueSource; // Source of the default override + readonly valuesSources?: Map; // Source of each value in default language overrides }; export const allSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; @@ -351,13 +354,42 @@ class ConfigurationRegistry implements IConfigurationRegistry { if (OVERRIDE_PROPERTY_REGEX.test(key)) { const configurationDefaultOverride = this.configurationDefaultsOverrides.get(key); - const valuesSources = configurationDefaultOverride?.valuesSources ?? new Map(); - if (source) { - for (const configuration of Object.keys(overrides[key])) { - valuesSources.set(configuration, source); + const valuesSources = configurationDefaultOverride?.valuesSources ?? new Map(); + + const defaultValue = configurationDefaultOverride?.value || {}; + for (const configuration of Object.keys(overrides[key])) { + const overrideValue = overrides[key][configuration]; + + const isObjectSetting = types.isObject(overrideValue) && (types.isUndefined(defaultValue[configuration]) || types.isObject(defaultValue[configuration])); + if (isObjectSetting) { + // Objects are merged instead of overridden + defaultValue[configuration] = { ...(defaultValue[configuration] ?? {}), ...overrideValue }; + + // Track the source of each value in the object + if (source) { + let objectConfigurationSources = valuesSources.get(configuration); + if (!objectConfigurationSources) { + objectConfigurationSources = new Map(); + valuesSources.set(configuration, objectConfigurationSources); + } + if (!(objectConfigurationSources instanceof Map)) { + console.error('objectConfigurationSources is not a Map'); + continue; + } + + for (const objectKey in overrideValue) { + objectConfigurationSources.set(objectKey, source); + } + } + } else { + // Primitive values are overridden + defaultValue[configuration] = overrideValue; + if (source) { + valuesSources.set(configuration, source); + } } } - const defaultValue = { ...(configurationDefaultOverride?.value || {}), ...overrides[key] }; + this.configurationDefaultsOverrides.set(key, { source, value: defaultValue, valuesSources }); const plainKey = getLanguageTagSettingPlainKey(key); const property: IRegisteredConfigurationPropertySchema = { @@ -373,8 +405,33 @@ class ConfigurationRegistry implements IConfigurationRegistry { this.configurationProperties[key] = property; this.defaultLanguageConfigurationOverridesNode.properties![key] = property; } else { - this.configurationDefaultsOverrides.set(key, { value: overrides[key], source }); const property = this.configurationProperties[key]; + let defaultValue = overrides[key]; + let defaultValueSource: ConfigurationDefaultValueSource | undefined = source; + + // If the default value is an object, merge the objects and store the source of each keys + if (property.type === 'object' && types.isObject(overrides[key])) { + const objectDefaults = this.configurationDefaultsOverrides.get(key); + const existingDefaultValue = objectDefaults?.value ?? property.defaultDefaultValue ?? {}; + defaultValue = { ...existingDefaultValue, ...overrides[key] }; + + defaultValueSource = objectDefaults?.source ?? new Map(); + if (!(defaultValueSource instanceof Map)) { + console.error('defaultValueSource is not a Map'); + continue; + } + + for (const objectKey in overrides[key]) { + if (source) { + defaultValueSource.set(objectKey, source); + } else { + defaultValueSource.delete(objectKey); + } + } + } + + this.configurationDefaultsOverrides.set(key, { value: defaultValue, source: defaultValueSource }); + if (property) { this.updatePropertyDefaultValue(key, property); this.updateSchema(key, property); @@ -397,24 +454,87 @@ class ConfigurationRegistry implements IConfigurationRegistry { for (const { overrides, source } of defaultConfigurations) { for (const key in overrides) { - const configurationDefaultsOverride = this.configurationDefaultsOverrides.get(key); const id = types.isString(source) ? source : source?.id; - const configurationDefaultsOverrideSourceId = types.isString(configurationDefaultsOverride?.source) ? configurationDefaultsOverride?.source : configurationDefaultsOverride?.source?.id; - if (id !== configurationDefaultsOverrideSourceId) { + + const configurationDefaultsOverride = this.configurationDefaultsOverrides.get(key); + if (!configurationDefaultsOverride) { continue; } - bucket.add(key); - this.configurationDefaultsOverrides.delete(key); + if (OVERRIDE_PROPERTY_REGEX.test(key)) { - delete this.configurationProperties[key]; - delete this.defaultLanguageConfigurationOverridesNode.properties![key]; + for (const configuration of Object.keys(overrides[key])) { + const overrideValue = overrides[key][configuration]; + + if (types.isObject(overrideValue)) { + const configurationSource = configurationDefaultsOverride.valuesSources?.get(configuration) as Map | undefined; + + for (const overrideObjectKey of Object.keys(overrideValue)) { + const keySource = configurationSource?.get(overrideObjectKey); + const keySourceId = types.isString(keySource) ? keySource : keySource?.id; + if (keySourceId === id) { + configurationSource?.delete(overrideObjectKey); + delete configurationDefaultsOverride.value[configuration][overrideObjectKey]; + } + } + + if (Object.keys(configurationDefaultsOverride.value[configuration]).length === 0) { + delete configurationDefaultsOverride.value[configuration]; + configurationDefaultsOverride.valuesSources?.delete(configuration); + } + } else { + const configurationSource = configurationDefaultsOverride.valuesSources?.get(configuration) as string | IExtensionInfo | undefined; + + const keySourceId = types.isString(configurationSource) ? configurationSource : configurationSource?.id; + if (keySourceId === id) { + configurationDefaultsOverride.valuesSources?.delete(configuration); + delete configurationDefaultsOverride.value[configuration]; + } + } + } + // Remove language configuration if empty ({[css]: {}} => {}) + const languageValues = this.configurationDefaultsOverrides.get(key); + if (languageValues && Object.keys(languageValues.value).length === 0) { + this.configurationDefaultsOverrides.delete(key); + delete this.configurationProperties[key]; + delete this.defaultLanguageConfigurationOverridesNode.properties![key]; + } } else { + // If the default value is an object, remove the source of each key + if (configurationDefaultsOverride.source instanceof Map) { + + const keySources = configurationDefaultsOverride.source; + for (const objectKey in overrides[key]) { + const keySource = keySources.get(objectKey); + const keySourceId = types.isString(keySource) ? keySource : keySource?.id; + + if (keySourceId === id) { + keySources.delete(objectKey); + delete configurationDefaultsOverride.value[objectKey]; + } + } + + if (keySources.size === 0) { + this.configurationDefaultsOverrides.delete(key); + } + } + // Otherwise, remove the default value if the source matches + else { + const configurationDefaultsOverrideSourceId = types.isString(configurationDefaultsOverride.source) ? configurationDefaultsOverride.source : configurationDefaultsOverride.source?.id; + if (id !== configurationDefaultsOverrideSourceId) { + continue; // Another source is overriding this default value + } + + this.configurationDefaultsOverrides.delete(key); + + } const property = this.configurationProperties[key]; if (property) { this.updatePropertyDefaultValue(key, property); this.updateSchema(key, property); } } + + bucket.add(key); } } diff --git a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts index e2cf8972a2c33..24dc735cd11be 100644 --- a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts +++ b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts @@ -38,7 +38,7 @@ suite('ConfigurationRegistry', () => { assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['[lang]'].default, { a: 2, b: 2, c: 3 }); }); - test('configuration defaults - overrides defaults', async () => { + test('configuration defaults - merge object default overrides', async () => { configurationRegistry.registerConfiguration({ 'id': '_test_default', 'type': 'object', @@ -51,7 +51,7 @@ suite('ConfigurationRegistry', () => { configurationRegistry.registerDefaultConfigurations([{ overrides: { 'config': { a: 1, b: 2 } } }]); configurationRegistry.registerDefaultConfigurations([{ overrides: { 'config': { a: 2, c: 3 } } }]); - assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { a: 2, c: 3 }); + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { a: 2, b: 2, c: 3 }); }); test('registering multiple settings with same policy', async () => { @@ -79,4 +79,32 @@ suite('ConfigurationRegistry', () => { assert.ok(actual['policy1'] !== undefined); assert.ok(actual['policy2'] === undefined); }); + + test('configuration defaults - deregister merged object default override', async () => { + configurationRegistry.registerConfiguration({ + 'id': '_test_default', + 'type': 'object', + 'properties': { + 'config': { + 'type': 'object', + } + } + }); + + const overrides1 = [{ overrides: { 'config': { a: 1, b: 2 } }, source: 'source1' }]; + const overrides2 = [{ overrides: { 'config': { a: 2, c: 3 } }, source: 'source2' }]; + + configurationRegistry.registerDefaultConfigurations(overrides1); + configurationRegistry.registerDefaultConfigurations(overrides2); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { a: 2, b: 2, c: 3 }); + + configurationRegistry.deregisterDefaultConfigurations(overrides2); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { b: 2 }); // TODO this should actualy equal overrides1 + + configurationRegistry.deregisterDefaultConfigurations(overrides1); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, {}); + }); }); diff --git a/src/vs/platform/configuration/test/common/configurations.test.ts b/src/vs/platform/configuration/test/common/configurations.test.ts index f86e6f662498c..eb02aec4f9a2a 100644 --- a/src/vs/platform/configuration/test/common/configurations.test.ts +++ b/src/vs/platform/configuration/test/common/configurations.test.ts @@ -110,7 +110,7 @@ suite('DefaultConfiguration', () => { assert.ok(equals(actual.getValue('a'), { b: { c: '2' } })); assert.ok(equals(actual.contents, { 'a': { b: { c: '2' } } })); - assert.deepStrictEqual(actual.keys, ['a.b', 'a.b.c']); + assert.deepStrictEqual(actual.keys.sort(), ['a.b', 'a.b.c']); }); test('Test registering the same property again', async () => { @@ -158,7 +158,7 @@ suite('DefaultConfiguration', () => { assert.ok(equals(actual.getValue('[a]'), { 'b': true })); assert.ok(equals(actual.contents, { '[a]': { 'b': true } })); assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }])); - assert.deepStrictEqual(actual.keys, ['[a]']); + assert.deepStrictEqual(actual.keys.sort(), ['[a]']); assert.strictEqual(actual.getOverrideValue('b', 'a'), true); }); @@ -191,7 +191,7 @@ suite('DefaultConfiguration', () => { assert.ok(equals(actual.getValue('[a]'), { 'b': true })); assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } })); assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }])); - assert.deepStrictEqual(actual.keys, ['b', '[a]']); + assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']); assert.strictEqual(actual.getOverrideValue('b', 'a'), true); }); @@ -227,7 +227,7 @@ suite('DefaultConfiguration', () => { assert.ok(equals(actual.getValue('[a]'), { 'b': true })); assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } })); assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }])); - assert.deepStrictEqual(actual.keys, ['[a]', 'b']); + assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']); assert.strictEqual(actual.getOverrideValue('b', 'a'), true); assert.deepStrictEqual(properties, ['b']); }); @@ -263,7 +263,7 @@ suite('DefaultConfiguration', () => { assert.ok(equals(actual.getValue('[a]'), { 'b': true })); assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } })); assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }])); - assert.deepStrictEqual(actual.keys, ['b', '[a]']); + assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']); assert.strictEqual(actual.getOverrideValue('b', 'a'), true); assert.deepStrictEqual(properties, ['[a]']); }); @@ -299,7 +299,7 @@ suite('DefaultConfiguration', () => { assert.ok(equals(actual.getValue('[a]'), { 'b': true })); assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } })); assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }])); - assert.deepStrictEqual(actual.keys, ['b', '[a]']); + assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']); assert.strictEqual(actual.getOverrideValue('b', 'a'), true); }); @@ -361,4 +361,53 @@ suite('DefaultConfiguration', () => { assert.deepStrictEqual(testObject.configurationModel.keys, ['b']); assert.strictEqual(testObject.configurationModel.getOverrideValue('b', 'a'), undefined); }); + + test('Test deregistering a merged language object setting', async () => { + const testObject = disposables.add(new DefaultConfiguration(new NullLogService())); + configurationRegistry.registerConfiguration({ + 'id': 'b', + 'order': 1, + 'title': 'b', + 'type': 'object', + 'properties': { + 'b': { + 'description': 'b', + 'type': 'object', + 'default': {}, + } + } + }); + const node1 = { + overrides: { + '[a]': { + 'b': { + 'aa': '1', + 'bb': '2' + } + } + }, + source: 'source1' + }; + + const node2 = { + overrides: { + '[a]': { + 'b': { + 'bb': '20', + 'cc': '30' + } + } + }, + source: 'source2' + }; + configurationRegistry.registerDefaultConfigurations([node1]); + configurationRegistry.registerDefaultConfigurations([node2]); + await testObject.initialize(); + configurationRegistry.deregisterDefaultConfigurations([node1]); + assert.ok(equals(testObject.configurationModel.getValue('[a]'), { 'b': { 'bb': '20', 'cc': '30' } })); + assert.ok(equals(testObject.configurationModel.contents, { '[a]': { 'b': { 'bb': '20', 'cc': '30' } }, 'b': {} })); + //assert.ok(equals(testObject.configurationModel.overrides, [{ '[a]': { 'b': { 'bb': '20', 'cc': '30' } } }])); TODO: Check this later + //assert.deepStrictEqual(testObject.configurationModel.keys.sort(), ['[a]', 'b']); + assert.ok(equals(testObject.configurationModel.getOverrideValue('b', 'a'), { 'bb': '20', 'cc': '30' })); + }); }); diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index a5a3f44d17cae..ae4d22c9eaa41 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -113,7 +113,7 @@ const registry = Registry.as(ConfigurationExtensions.Con })(), additionalProperties: { - type: 'string', + type: ['string', 'null'], markdownDescription: localize('workbench.editor.label.template', "The template which should be rendered when the pattern matches. May include the variables ${dirname}, ${filename} and ${extname}."), minLength: 1, pattern: '.*[a-zA-Z0-9].*' diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators.ts index 6db2e7883d966..59b31491a53ae 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators.ts @@ -9,7 +9,7 @@ import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { SimpleIconLabel } from 'vs/base/browser/ui/iconLabel/simpleIconLabel'; import { RunOnceScheduler } from 'vs/base/common/async'; import { Emitter } from 'vs/base/common/event'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; +import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ILanguageService } from 'vs/editor/common/languages/language'; @@ -448,15 +448,27 @@ export class SettingsTreeIndicatorsLabel implements IDisposable { updateDefaultOverrideIndicator(element: SettingsTreeSettingElement) { this.defaultOverrideIndicator.element.style.display = 'none'; - const sourceToDisplay = getDefaultValueSourceToDisplay(element); + let sourceToDisplay = getDefaultValueSourceToDisplay(element); if (sourceToDisplay !== undefined) { this.defaultOverrideIndicator.element.style.display = 'inline'; this.defaultOverrideIndicator.disposables.clear(); - const defaultOverrideHoverContent = localize('defaultOverriddenDetails', "Default setting value overridden by {0}", sourceToDisplay); + // Show source of default value when hovered + if (Array.isArray(sourceToDisplay) && sourceToDisplay.length === 1) { + sourceToDisplay = sourceToDisplay[0]; + } + + let defaultOverrideHoverContent; + if (!Array.isArray(sourceToDisplay)) { + defaultOverrideHoverContent = localize('defaultOverriddenDetails', "Default setting value overridden by `{0}`", sourceToDisplay); + } else { + sourceToDisplay = sourceToDisplay.map(source => `\`${source}\``); + defaultOverrideHoverContent = localize('multipledefaultOverriddenDetails', "A default values has been set by {0}", sourceToDisplay.slice(0, -1).join(', ') + ' & ' + sourceToDisplay.slice(-1)); + } + const showHover = (focus: boolean) => { return this.hoverService.showHover({ - content: defaultOverrideHoverContent, + content: new MarkdownString().appendMarkdown(defaultOverrideHoverContent), target: this.defaultOverrideIndicator.element, position: { hoverPosition: HoverPosition.BELOW, @@ -473,14 +485,22 @@ export class SettingsTreeIndicatorsLabel implements IDisposable { } } -function getDefaultValueSourceToDisplay(element: SettingsTreeSettingElement): string | undefined { - let sourceToDisplay: string | undefined; +function getDefaultValueSourceToDisplay(element: SettingsTreeSettingElement): string | undefined | string[] { + let sourceToDisplay: string | undefined | string[]; const defaultValueSource = element.defaultValueSource; if (defaultValueSource) { - if (typeof defaultValueSource !== 'string') { - sourceToDisplay = defaultValueSource.displayName ?? defaultValueSource.id; + if (defaultValueSource instanceof Map) { + sourceToDisplay = []; + for (const [, value] of defaultValueSource) { + const newValue = typeof value !== 'string' ? value.displayName ?? value.id : value; + if (!sourceToDisplay.includes(newValue)) { + sourceToDisplay.push(newValue); + } + } } else if (typeof defaultValueSource === 'string') { sourceToDisplay = defaultValueSource; + } else { + sourceToDisplay = defaultValueSource.displayName ?? defaultValueSource.id; } } return sourceToDisplay; @@ -538,9 +558,19 @@ export function getIndicatorsLabelAriaLabel(element: SettingsTreeSettingElement, } // Add default override indicator text - const sourceToDisplay = getDefaultValueSourceToDisplay(element); + let sourceToDisplay = getDefaultValueSourceToDisplay(element); if (sourceToDisplay !== undefined) { - ariaLabelSections.push(localize('defaultOverriddenDetailsAriaLabel', "{0} overrides the default value", sourceToDisplay)); + if (Array.isArray(sourceToDisplay) && sourceToDisplay.length === 1) { + sourceToDisplay = sourceToDisplay[0]; + } + + let overriddenDetailsText; + if (!Array.isArray(sourceToDisplay)) { + overriddenDetailsText = localize('defaultOverriddenDetailsAriaLabel', "{0} overrides the default value", sourceToDisplay); + } else { + overriddenDetailsText = localize('multipleDefaultOverriddenDetailsAriaLabel', "{0} override the default value", sourceToDisplay.slice(0, -1).join(', ') + ' & ' + sourceToDisplay.slice(-1)); + } + ariaLabelSections.push(overriddenDetailsText); } // Add text about default values being overridden in other languages diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 79dadc818220a..06efb414415c6 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -60,8 +60,8 @@ import { settingsMoreActionIcon } from 'vs/workbench/contrib/preferences/browser import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { ISettingOverrideClickEvent, SettingsTreeIndicatorsLabel, getIndicatorsLabelAriaLabel } from 'vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators'; import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; -import { ISettingsEditorViewState, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement, inspectSetting, settingKeyToDisplayFormat } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; -import { ExcludeSettingWidget, IListDataItem, IObjectDataItem, IObjectEnumOption, IObjectKeySuggester, IObjectValueSuggester, ISettingListChangeEvent, IncludeSettingWidget, ListSettingWidget, ObjectSettingCheckboxWidget, ObjectSettingDropdownWidget, ObjectValue } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { ISettingsEditorViewState, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement, inspectSetting, objectSettingSupportsRemoveDefaultValue, settingKeyToDisplayFormat } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; +import { ExcludeSettingWidget, IIncludeExcludeDataItem, IListDataItem, IObjectDataItem, IObjectEnumOption, IObjectKeySuggester, IObjectValueSuggester, ISettingListChangeEvent, IncludeSettingWidget, ListSettingWidget, ObjectSettingCheckboxWidget, ObjectSettingDropdownWidget, ObjectValue, SettingListEvent } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; import { LANGUAGE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, compareTwoNullableNumbers } from 'vs/workbench/contrib/preferences/common/preferences'; import { settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; import { APPLY_ALL_PROFILES_SETTING, IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; @@ -74,14 +74,27 @@ import { IHoverService } from 'vs/platform/hover/browser/hover'; const $ = DOM.$; -function getIncludeExcludeDisplayValue(element: SettingsTreeSettingElement): IListDataItem[] { +function getIncludeExcludeDisplayValue(element: SettingsTreeSettingElement): IIncludeExcludeDataItem[] { + const elementDefaultValue: Record = typeof element.defaultValue === 'object' + ? element.defaultValue ?? {} + : {}; + const data = element.isConfigured ? - { ...element.defaultValue, ...element.scopeValue } : - element.defaultValue; + { ...elementDefaultValue, ...element.scopeValue } : + elementDefaultValue; return Object.keys(data) .filter(key => !!data[key]) .map(key => { + const defaultValue = elementDefaultValue[key]; + + // Get source if it's a default value + let source: string | undefined; + if (defaultValue === data[key] && element.setting.type === 'object' && element.defaultValueSource instanceof Map) { + const defaultSource = element.defaultValueSource.get(key); + source = typeof defaultSource === 'string' ? defaultSource : defaultSource?.displayName; + } + const value = data[key]; const sibling = typeof value === 'boolean' ? undefined : value.when; return { @@ -90,7 +103,8 @@ function getIncludeExcludeDisplayValue(element: SettingsTreeSettingElement): ILi data: key }, sibling, - elementType: element.valueType + elementType: element.valueType, + source }; }); } @@ -162,6 +176,14 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData return Object.keys(data).map(key => { const defaultValue = elementDefaultValue[key]; + + // Get source if it's a default value + let source: string | undefined; + if (defaultValue === data[key] && element.setting.type === 'object' && element.defaultValueSource instanceof Map) { + const defaultSource = element.defaultValueSource.get(key); + source = typeof defaultSource === 'string' ? defaultSource : defaultSource?.displayName; + } + if (isDefined(objectProperties) && key in objectProperties) { if (element.setting.allKeysAreBoolean) { return { @@ -174,7 +196,9 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData data: data[key] }, keyDescription: objectProperties[key].description, - removable: false + removable: false, + resetable: true, + source } as IObjectDataItem; } @@ -192,12 +216,15 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData }, keyDescription: objectProperties[key].description, removable: isUndefinedOrNull(defaultValue), + resetable: !isUndefinedOrNull(defaultValue), + source } as IObjectDataItem; } - // The row is removable if it doesn't have a default value assigned. - // Otherwise, it is not removable, but its value can be reset to the default. - const removable = !defaultValue; + // The row is removable if it doesn't have a default value assigned or the setting supports removing the default value. + // If a default value is assigned and the user modified the default, it can be reset back to the default. + const removable = defaultValue === undefined || objectSettingSupportsRemoveDefaultValue(element.setting.key); + const resetable = defaultValue && defaultValue !== data[key]; const schema = patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; if (schema) { const valueEnumOptions = getEnumOptionsFromSchema(schema); @@ -210,6 +237,8 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData }, keyDescription: schema.description, removable, + resetable, + source } as IObjectDataItem; } @@ -228,6 +257,8 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData }, keyDescription: typeof objectAdditionalProperties === 'object' ? objectAdditionalProperties.description : undefined, removable, + resetable, + source } as IObjectDataItem; }).filter(item => !isUndefinedOrNull(item.value.data)); } @@ -629,12 +660,12 @@ interface ISettingComplexItemTemplate extends ISettingItemTemplate { } interface ISettingListItemTemplate extends ISettingItemTemplate { - listWidget: ListSettingWidget; + listWidget: ListSettingWidget; validationErrorMessageElement: HTMLElement; } interface ISettingIncludeExcludeItemTemplate extends ISettingItemTemplate { - includeExcludeWidget: ListSettingWidget; + includeExcludeWidget: ListSettingWidget; } interface ISettingObjectItemTemplate extends ISettingItemTemplate | undefined> { @@ -1174,7 +1205,7 @@ class SettingArrayRenderer extends AbstractSettingRenderer implements ITreeRende return template; } - private computeNewList(template: ISettingListItemTemplate, e: ISettingListChangeEvent): string[] | undefined { + private computeNewList(template: ISettingListItemTemplate, e: SettingListEvent): string[] | undefined { if (template.context) { let newValue: string[] = []; if (Array.isArray(template.context.scopeValue)) { @@ -1183,33 +1214,28 @@ class SettingArrayRenderer extends AbstractSettingRenderer implements ITreeRende newValue = [...template.context.value]; } - if (e.sourceIndex !== undefined) { + if (e.type === 'move') { // A drag and drop occurred const sourceIndex = e.sourceIndex; - const targetIndex = e.targetIndex!; + const targetIndex = e.targetIndex; const splicedElem = newValue.splice(sourceIndex, 1)[0]; newValue.splice(targetIndex, 0, splicedElem); - } else if (e.targetIndex !== undefined) { - const itemValueData = e.item?.value.data.toString() ?? ''; - // Delete value - if (!e.item?.value.data && e.originalItem.value.data && e.targetIndex > -1) { - newValue.splice(e.targetIndex, 1); - } + } else if (e.type === 'remove' || e.type === 'reset') { + newValue.splice(e.targetIndex, 1); + } else if (e.type === 'change') { + const itemValueData = e.newItem.value.data.toString(); + // Update value - else if (e.item?.value.data && e.originalItem.value.data) { - if (e.targetIndex > -1) { - newValue[e.targetIndex] = itemValueData; - } - // For some reason, we are updating and cannot find original value - // Just append the value in this case - else { - newValue.push(itemValueData); - } + if (e.targetIndex > -1) { + newValue[e.targetIndex] = itemValueData; } - // Add value - else if (e.item?.value.data && !e.originalItem.value.data && e.targetIndex >= newValue.length) { + // For some reason, we are updating and cannot find original value + // Just append the value in this case + else { newValue.push(itemValueData); } + } else if (e.type === 'add') { + newValue.push(e.newItem.value.data.toString()); } if ( @@ -1288,9 +1314,10 @@ abstract class AbstractSettingObjectRenderer extends AbstractSettingRenderer imp return template; } - protected onDidChangeObject(template: ISettingObjectItemTemplate, e: ISettingListChangeEvent): void { + protected onDidChangeObject(template: ISettingObjectItemTemplate, e: SettingListEvent): void { const widget = (template.objectCheckboxWidget ?? template.objectDropdownWidget)!; if (template.context) { + const settingSupportsRemoveDefault = objectSettingSupportsRemoveDefaultValue(template.context.setting.key); const defaultValue: Record = typeof template.context.defaultValue === 'object' ? template.context.defaultValue ?? {} : {}; @@ -1299,45 +1326,55 @@ abstract class AbstractSettingObjectRenderer extends AbstractSettingRenderer imp ? template.context.scopeValue ?? {} : {}; - const newValue: Record = {}; + const newValue: Record = { ...template.context.scopeValue }; // Initialize with scoped values as removed default values are not rendered const newItems: IObjectDataItem[] = []; widget.items.forEach((item, idx) => { // Item was updated - if (isDefined(e.item) && e.targetIndex === idx) { - newValue[e.item.key.data] = e.item.value.data; - newItems.push(e.item); + if ((e.type === 'change' || e.type === 'move') && e.targetIndex === idx) { + // If the key of the default value is changed, remove the default value + if (e.originalItem.key.data !== e.newItem.key.data && settingSupportsRemoveDefault && e.originalItem.key.data in defaultValue) { + newValue[e.originalItem.key.data] = null; + } + newValue[e.newItem.key.data] = e.newItem.value.data; + newItems.push(e.newItem); } // All remaining items, but skip the one that we just updated - else if (isUndefinedOrNull(e.item) || e.item.key.data !== item.key.data) { + else if ((e.type !== 'change' && e.type !== 'move') || e.newItem.key.data !== item.key.data) { newValue[item.key.data] = item.value.data; newItems.push(item); } }); // Item was deleted - if (isUndefinedOrNull(e.item)) { - delete newValue[e.originalItem.key.data]; + if (e.type === 'remove' || e.type === 'reset') { + const objectKey = e.originalItem.key.data; + const removingDefaultValue = e.type === 'remove' && settingSupportsRemoveDefault && defaultValue[objectKey] === e.originalItem.value.data; + if (removingDefaultValue) { + newValue[objectKey] = null; + } else { + delete newValue[objectKey]; + } - const itemToDelete = newItems.findIndex(item => item.key.data === e.originalItem.key.data); - const defaultItemValue = defaultValue[e.originalItem.key.data] as string | boolean; + const itemToDelete = newItems.findIndex(item => item.key.data === objectKey); + const defaultItemValue = defaultValue[objectKey] as string | boolean; - // Item does not have a default - if (isUndefinedOrNull(defaultValue[e.originalItem.key.data]) && itemToDelete > -1) { + // Item does not have a default or default is bing removed + if (removingDefaultValue || isUndefinedOrNull(defaultValue[objectKey]) && itemToDelete > -1) { newItems.splice(itemToDelete, 1); - } else if (itemToDelete > -1) { + } else if (!removingDefaultValue && itemToDelete > -1) { newItems[itemToDelete].value.data = defaultItemValue; } } // New item was added - else if (widget.isItemNew(e.originalItem) && e.item.key.data !== '') { - newValue[e.item.key.data] = e.item.value.data; - newItems.push(e.item); + else if (e.type === 'add') { + newValue[e.newItem.key.data] = e.newItem.value.data; + newItems.push(e.newItem); } Object.entries(newValue).forEach(([key, value]) => { // value from the scope has changed back to the default - if (scopeValue[key] !== value && defaultValue[key] === value) { + if (scopeValue[key] !== value && defaultValue[key] === value && !(settingSupportsRemoveDefault && value === null)) { delete newValue[key]; } }); @@ -1462,25 +1499,27 @@ abstract class SettingIncludeExcludeRenderer extends AbstractSettingRenderer imp return template; } - private onDidChangeIncludeExclude(template: ISettingIncludeExcludeItemTemplate, e: ISettingListChangeEvent): void { + private onDidChangeIncludeExclude(template: ISettingIncludeExcludeItemTemplate, e: SettingListEvent): void { if (template.context) { const newValue = { ...template.context.scopeValue }; // first delete the existing entry, if present - if (e.originalItem.value.data.toString() in template.context.defaultValue) { - // delete a default by overriding it - newValue[e.originalItem.value.data.toString()] = false; - } else { - delete newValue[e.originalItem.value.data.toString()]; + if (e.type !== 'add') { + if (e.originalItem.value.data.toString() in template.context.defaultValue) { + // delete a default by overriding it + newValue[e.originalItem.value.data.toString()] = false; + } else { + delete newValue[e.originalItem.value.data.toString()]; + } } // then add the new or updated entry, if present - if (e.item?.value) { - if (e.item.value.data.toString() in template.context.defaultValue && !e.item.sibling) { + if (e.type === 'change' || e.type === 'add' || e.type === 'move') { + if (e.newItem.value.data.toString() in template.context.defaultValue && !e.newItem.sibling) { // add a default by deleting its override - delete newValue[e.item.value.data.toString()]; + delete newValue[e.newItem.value.data.toString()]; } else { - newValue[e.item.value.data.toString()] = e.item.sibling ? { when: e.item.sibling } : true; + newValue[e.newItem.value.data.toString()] = e.newItem.sibling ? { when: e.newItem.sibling } : true; } } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index e30c3bb549a12..e651ffdccf7b3 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -17,7 +17,7 @@ import { FOLDER_SCOPES, WORKSPACE_SCOPES, REMOTE_MACHINE_SCOPES, LOCAL_MACHINE_S import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; -import { ConfigurationScope, EditPresentationTypes, Extensions, IConfigurationRegistry, IExtensionInfo } from 'vs/platform/configuration/common/configurationRegistry'; +import { ConfigurationDefaultValueSource, ConfigurationScope, EditPresentationTypes, Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { Registry } from 'vs/platform/registry/common/platform'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; @@ -135,7 +135,7 @@ export class SettingsTreeSettingElement extends SettingsTreeElement { * The source of the default value to display. * This value also accounts for extension-contributed language-specific default value overrides. */ - defaultValueSource: string | IExtensionInfo | undefined; + defaultValueSource: ConfigurationDefaultValueSource | undefined; /** * Whether the setting is configured in the selected scope. @@ -792,11 +792,25 @@ function isIncludeSetting(setting: ISetting): boolean { return setting.key === 'files.readonlyInclude'; } -function isObjectRenderableSchema({ type }: IJSONSchema): boolean { - return type === 'string' || type === 'boolean' || type === 'integer' || type === 'number'; +// The values of the following settings when a default values has been removed +export function objectSettingSupportsRemoveDefaultValue(key: string): boolean { + return key === 'workbench.editor.customLabels.patterns'; +} + +function isObjectRenderableSchema({ type }: IJSONSchema, key: string): boolean { + if (type === 'string' || type === 'boolean' || type === 'integer' || type === 'number') { + return true; + } + + if (objectSettingSupportsRemoveDefaultValue(key) && Array.isArray(type) && type.length === 2) { + return type.includes('null') && (type.includes('string') || type.includes('boolean') || type.includes('integer') || type.includes('number')); + } + + return false; } function isObjectSetting({ + key, type, objectProperties, objectPatternProperties, @@ -838,7 +852,7 @@ function isObjectSetting({ return [schema]; }).flat(); - return flatSchemas.every(isObjectRenderableSchema); + return flatSchemas.every((schema) => isObjectRenderableSchema(schema, key)); } function settingTypeEnumRenderable(_type: string | string[]) { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index 5021036167b24..9e9dcc17e86d1 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -29,6 +29,9 @@ import { settingsSelectBackground, settingsSelectBorder, settingsSelectForegroun import { defaultButtonStyles, getInputBoxStyle, getSelectBoxStyles } from 'vs/platform/theme/browser/defaultStyles'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { MarkdownString } from 'vs/base/common/htmlContent'; +import { IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import { SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; const $ = DOM.$; @@ -110,21 +113,49 @@ export class ListSettingListModel { } export interface ISettingListChangeEvent { + type: 'change'; originalItem: TDataItem; - item?: TDataItem; - targetIndex?: number; - sourceIndex?: number; + newItem: TDataItem; + targetIndex: number; } +export interface ISettingListAddEvent { + type: 'add'; + newItem: TDataItem; + targetIndex: number; +} + +export interface ISettingListMoveEvent { + type: 'move'; + originalItem: TDataItem; + newItem: TDataItem; + targetIndex: number; + sourceIndex: number; +} + +export interface ISettingListRemoveEvent { + type: 'remove'; + originalItem: TDataItem; + targetIndex: number; +} + +export interface ISettingListResetEvent { + type: 'reset'; + originalItem: TDataItem; + targetIndex: number; +} + +export type SettingListEvent = ISettingListChangeEvent | ISettingListAddEvent | ISettingListMoveEvent | ISettingListRemoveEvent | ISettingListResetEvent; + export abstract class AbstractListSettingWidget extends Disposable { private listElement: HTMLElement; private rowElements: HTMLElement[] = []; - protected readonly _onDidChangeList = this._register(new Emitter>()); + protected readonly _onDidChangeList = this._register(new Emitter>()); protected readonly model = new ListSettingListModel(this.getEmptyItem()); protected readonly listDisposables = this._register(new DisposableStore()); - readonly onDidChangeList: Event> = this._onDidChangeList.event; + readonly onDidChangeList: Event> = this._onDidChangeList.event; get domNode(): HTMLElement { return this.listElement; @@ -250,11 +281,20 @@ export abstract class AbstractListSettingWidget extend protected handleItemChange(originalItem: TDataItem, changedItem: TDataItem, idx: number) { this.model.setEditKey('none'); - this._onDidChangeList.fire({ - originalItem, - item: changedItem, - targetIndex: idx, - }); + if (this.isItemNew(originalItem)) { + this._onDidChangeList.fire({ + type: 'add', + newItem: changedItem, + targetIndex: idx, + }); + } else { + this._onDidChangeList.fire({ + type: 'change', + originalItem, + newItem: changedItem, + targetIndex: idx, + }); + } this.renderList(); } @@ -396,17 +436,17 @@ export interface IListDataItem { sibling?: string; } -interface ListSettingWidgetDragDetails { +interface ListSettingWidgetDragDetails { element: HTMLElement; - item: IListDataItem; + item: TListDataItem; itemIndex: number; } -export class ListSettingWidget extends AbstractListSettingWidget { +export class ListSettingWidget extends AbstractListSettingWidget { private keyValueSuggester: IObjectKeySuggester | undefined; private showAddButton: boolean = true; - override setValue(listData: IListDataItem[], options?: IListSetValueOptions) { + override setValue(listData: TListDataItem[], options?: IListSetValueOptions) { this.keyValueSuggester = options?.keySuggester; this.showAddButton = options?.showAddButton ?? true; super.setValue(listData); @@ -421,13 +461,13 @@ export class ListSettingWidget extends AbstractListSettingWidget super(container, themeService, contextViewService); } - protected getEmptyItem(): IListDataItem { + protected getEmptyItem(): TListDataItem { return { value: { type: 'string', data: '' } - }; + } as TListDataItem; } protected override isAddButtonVisible(): boolean { @@ -438,7 +478,7 @@ export class ListSettingWidget extends AbstractListSettingWidget return ['setting-list-widget']; } - protected getActionsForItem(item: IListDataItem, idx: number): IAction[] { + protected getActionsForItem(item: TListDataItem, idx: number): IAction[] { return [ { class: ThemeIcon.asClassName(settingsEditIcon), @@ -452,20 +492,20 @@ export class ListSettingWidget extends AbstractListSettingWidget enabled: true, id: 'workbench.action.removeListItem', tooltip: this.getLocalizedStrings().deleteActionTooltip, - run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + run: () => this._onDidChangeList.fire({ type: 'remove', originalItem: item, targetIndex: idx }) } ] as IAction[]; } - private dragDetails: ListSettingWidgetDragDetails | undefined; + private dragDetails: ListSettingWidgetDragDetails | undefined; - private getDragImage(item: IListDataItem): HTMLElement { + private getDragImage(item: TListDataItem): HTMLElement { const dragImage = $('.monaco-drag-image'); dragImage.textContent = item.value.data; return dragImage; } - protected renderItem(item: IListDataItem, idx: number): RowElementGroup { + protected renderItem(item: TListDataItem, idx: number): RowElementGroup { const rowElement = $('.setting-list-row'); const valueElement = DOM.append(rowElement, $('.setting-list-value')); const siblingElement = DOM.append(rowElement, $('.setting-list-sibling')); @@ -477,7 +517,7 @@ export class ListSettingWidget extends AbstractListSettingWidget return { rowElement, keyElement: valueElement, valueElement: siblingElement }; } - protected addDragAndDrop(rowElement: HTMLElement, item: IListDataItem, idx: number) { + protected addDragAndDrop(rowElement: HTMLElement, item: TListDataItem, idx: number) { if (this.inReadMode) { rowElement.draggable = true; rowElement.classList.add('draggable'); @@ -530,9 +570,10 @@ export class ListSettingWidget extends AbstractListSettingWidget counter = 0; if (this.dragDetails.element !== rowElement) { this._onDidChangeList.fire({ + type: 'move', originalItem: this.dragDetails.item, sourceIndex: this.dragDetails.itemIndex, - item, + newItem: item, targetIndex: idx }); } @@ -548,7 +589,7 @@ export class ListSettingWidget extends AbstractListSettingWidget })); } - protected renderEdit(item: IListDataItem, idx: number): HTMLElement { + protected renderEdit(item: TListDataItem, idx: number): HTMLElement { const rowElement = $('.setting-list-edit-row'); let valueInput: InputBox | SelectBox; let currentDisplayValue: string; @@ -580,7 +621,7 @@ export class ListSettingWidget extends AbstractListSettingWidget break; } - const updatedInputBoxItem = (): IListDataItem => { + const updatedInputBoxItem = (): TListDataItem => { const inputBox = valueInput as InputBox; return { value: { @@ -588,16 +629,16 @@ export class ListSettingWidget extends AbstractListSettingWidget data: inputBox.value }, sibling: siblingInput?.value - }; + } as TListDataItem; }; - const updatedSelectBoxItem = (selectedValue: string): IListDataItem => { + const updatedSelectBoxItem = (selectedValue: string): TListDataItem => { return { value: { type: 'enum', data: selectedValue, options: currentEnumOptions ?? [] } - }; + } as TListDataItem; }; const onKeyDown = (e: StandardKeyboardEvent) => { if (e.equals(KeyCode.Enter)) { @@ -674,11 +715,11 @@ export class ListSettingWidget extends AbstractListSettingWidget return rowElement; } - override isItemNew(item: IListDataItem): boolean { + override isItemNew(item: TListDataItem): boolean { return item.value.data === ''; } - protected addTooltipsToRow(rowElementGroup: RowElementGroup, { value, sibling }: IListDataItem) { + protected addTooltipsToRow(rowElementGroup: RowElementGroup, { value, sibling }: TListDataItem) { const title = isUndefinedOrNull(sibling) ? localize('listValueHintLabel', "List item `{0}`", value.data) : localize('listSiblingHintLabel', "List item `{0}` with sibling `${1}`", value.data, sibling); @@ -729,22 +770,28 @@ export class ListSettingWidget extends AbstractListSettingWidget } } -export class ExcludeSettingWidget extends ListSettingWidget { +export class ExcludeSettingWidget extends ListSettingWidget { protected override getContainerClasses() { return ['setting-list-include-exclude-widget']; } - protected override addDragAndDrop(rowElement: HTMLElement, item: IListDataItem, idx: number) { + protected override addDragAndDrop(rowElement: HTMLElement, item: IIncludeExcludeDataItem, idx: number) { return; } - protected override addTooltipsToRow(rowElementGroup: RowElementGroup, { value, sibling }: IListDataItem): void { - const title = isUndefinedOrNull(sibling) - ? localize('excludePatternHintLabel', "Exclude files matching `{0}`", value.data) - : localize('excludeSiblingHintLabel', "Exclude files matching `{0}`, only when a file matching `{1}` is present", value.data, sibling); + protected override addTooltipsToRow(rowElementGroup: RowElementGroup, item: IIncludeExcludeDataItem): void { + let title = isUndefinedOrNull(item.sibling) + ? localize('excludePatternHintLabel', "Exclude files matching `{0}`", item.value.data) + : localize('excludeSiblingHintLabel', "Exclude files matching `{0}`, only when a file matching `{1}` is present", item.value.data, item.sibling); + + if (item.source) { + title += localize('excludeIncludeSource', ". Default value provided by `{0}`", item.source); + } + + const markdownTitle = new MarkdownString().appendMarkdown(title); const { rowElement } = rowElementGroup; - this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, title)); + this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, { markdown: markdownTitle, markdownNotSupportedFallback: title })); rowElement.setAttribute('aria-label', title); } @@ -759,22 +806,28 @@ export class ExcludeSettingWidget extends ListSettingWidget { } } -export class IncludeSettingWidget extends ListSettingWidget { +export class IncludeSettingWidget extends ListSettingWidget { protected override getContainerClasses() { return ['setting-list-include-exclude-widget']; } - protected override addDragAndDrop(rowElement: HTMLElement, item: IListDataItem, idx: number) { + protected override addDragAndDrop(rowElement: HTMLElement, item: IIncludeExcludeDataItem, idx: number) { return; } - protected override addTooltipsToRow(rowElementGroup: RowElementGroup, { value, sibling }: IListDataItem): void { - const title = isUndefinedOrNull(sibling) - ? localize('includePatternHintLabel', "Include files matching `{0}`", value.data) - : localize('includeSiblingHintLabel', "Include files matching `{0}`, only when a file matching `{1}` is present", value.data, sibling); + protected override addTooltipsToRow(rowElementGroup: RowElementGroup, item: IIncludeExcludeDataItem): void { + let title = isUndefinedOrNull(item.sibling) + ? localize('includePatternHintLabel', "Include files matching `{0}`", item.value.data) + : localize('includeSiblingHintLabel', "Include files matching `{0}`, only when a file matching `{1}` is present", item.value.data, item.sibling); + + if (item.source) { + title += localize('excludeIncludeSource', ". Default value provided by `{0}`", item.source); + } + + const markdownTitle = new MarkdownString().appendMarkdown(title); const { rowElement } = rowElementGroup; - this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, title)); + this.listDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), rowElement, { markdown: markdownTitle, markdownNotSupportedFallback: title })); rowElement.setAttribute('aria-label', title); } @@ -818,7 +871,16 @@ export interface IObjectDataItem { key: ObjectKey; value: ObjectValue; keyDescription?: string; + source?: string; removable: boolean; + resetable: boolean; +} + +export interface IIncludeExcludeDataItem { + value: ObjectKey; + elementType: SettingValueType; + sibling?: string; + source?: string; } export interface IObjectValueSuggester { @@ -886,6 +948,7 @@ export class ObjectSettingDropdownWidget extends AbstractListSettingWidget this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + tooltip: this.getLocalizedStrings().resetActionTooltip, + run: () => this._onDidChangeList.fire({ type: 'reset', originalItem: item, targetIndex: idx }) }); - } else { + } + + if (item.removable) { actions.push({ - class: ThemeIcon.asClassName(settingsDiscardIcon), + class: ThemeIcon.asClassName(settingsRemoveIcon), enabled: true, - id: 'workbench.action.resetListItem', + id: 'workbench.action.removeListItem', label: '', - tooltip: this.getLocalizedStrings().resetActionTooltip, - run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + tooltip: this.getLocalizedStrings().deleteActionTooltip, + run: () => this._onDidChangeList.fire({ type: 'remove', originalItem: item, targetIndex: idx }) }); } @@ -1181,12 +1246,20 @@ export class ObjectSettingDropdownWidget extends AbstractListSettingWidget Date: Tue, 25 Jun 2024 00:32:45 +0300 Subject: [PATCH 468/755] fix: Quotes with headings on markdown not rendering properly (#205227) --- extensions/markdown-language-features/media/markdown.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/markdown-language-features/media/markdown.css b/extensions/markdown-language-features/media/markdown.css index 168f6a8a862b4..800be985a43af 100644 --- a/extensions/markdown-language-features/media/markdown.css +++ b/extensions/markdown-language-features/media/markdown.css @@ -205,7 +205,7 @@ table > tbody > tr + tr > td { blockquote { margin: 0; - padding: 2px 16px 0 10px; + padding: 0px 16px 0 10px; border-left-width: 5px; border-left-style: solid; border-radius: 2px; From 445a0cfca30ae89c8e9c52a1fa6b4dbcb2c0df50 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 24 Jun 2024 14:49:42 -0700 Subject: [PATCH 469/755] Run steps for valid issues only (#217596) --- .github/workflows/on-open.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index 679c1c65db87c..2a26794c6b01b 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -22,6 +22,7 @@ jobs: token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - name: Run CopyCat (VSCodeTriageBot/testissues) + if: github.event.issue.user.login != 'ghost' uses: ./actions/copycat with: appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} @@ -30,6 +31,7 @@ jobs: repo: testissues - name: Run New Release + if: github.event.issue.user.login != 'ghost' uses: ./actions/new-release with: label: new release @@ -41,6 +43,7 @@ jobs: days: 5 - name: Run Clipboard Labeler + if: github.event.issue.user.login != 'ghost' uses: ./actions/regex-labeler with: appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} @@ -49,6 +52,7 @@ jobs: comment: "It looks like you're using the VS Code Issue Reporter but did not paste the text generated into the created issue. We've closed this issue, please open a new one containing the text we placed in your clipboard.\n\nHappy Coding!" - name: Run Clipboard Labeler (Chinese) + if: github.event.issue.user.login != 'ghost' uses: ./actions/regex-labeler with: appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} @@ -58,6 +62,7 @@ jobs: # source of truth in ./english-please.yml - name: Run English Please + if: github.event.issue.user.login != 'ghost' uses: ./actions/english-please with: token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} @@ -69,6 +74,7 @@ jobs: translatorRequestedLabelColor: "c29cff" # source of truth in ./test-plan-item-validator.yml - name: Run Test Plan Item Validator + if: github.event.issue.user.login != 'ghost' uses: ./actions/test-plan-item-validator with: token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} From b7ff4c513d93af9405989c624110692759c2cb73 Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:11:44 -0700 Subject: [PATCH 470/755] intellisense for code actions on save (#215475) * language registry and code actions on save new filter * fixes logic * more clean up * remove static contribution --- .../editor/common/languageFeatureRegistry.ts | 4 ++ .../browser/codeActionsContribution.ts | 48 +++++++++++++++---- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/common/languageFeatureRegistry.ts b/src/vs/editor/common/languageFeatureRegistry.ts index 53c14ac57b9ed..47679f308f475 100644 --- a/src/vs/editor/common/languageFeatureRegistry.ts +++ b/src/vs/editor/common/languageFeatureRegistry.ts @@ -109,6 +109,10 @@ export class LanguageFeatureRegistry { return result; } + allNoModel(): T[] { + return this._entries.map(entry => entry.provider); + } + ordered(model: ITextModel): T[] { const result: T[] = []; this._orderedForEach(model, entry => result.push(entry.provider)); diff --git a/src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts b/src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts index 38fd5502ae2c8..17e6217a6a99c 100644 --- a/src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts +++ b/src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts @@ -8,6 +8,7 @@ import { HierarchicalKind } from 'vs/base/common/hierarchicalKind'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { Disposable } from 'vs/base/common/lifecycle'; import { editorConfigurationBaseNode } from 'vs/editor/common/config/editorConfigurationSchema'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { codeActionCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; import { CodeActionKind } from 'vs/editor/contrib/codeAction/common/types'; import * as nls from 'vs/nls'; @@ -34,15 +35,11 @@ const createCodeActionsAutoSave = (description: string): IJSONSchema => { }; }; -const codeActionsOnSaveDefaultProperties = Object.freeze({ - 'source.fixAll': createCodeActionsAutoSave(nls.localize('codeActionsOnSave.fixAll', "Controls whether auto fix action should be run on file save.")), -}); const codeActionsOnSaveSchema: IConfigurationPropertySchema = { oneOf: [ { type: 'object', - properties: codeActionsOnSaveDefaultProperties, additionalProperties: { type: 'string' }, @@ -72,15 +69,24 @@ export const editorConfiguration = Object.freeze({ export class CodeActionsContribution extends Disposable implements IWorkbenchContribution { private _contributedCodeActions: CodeActionsExtensionPoint[] = []; + private settings: Set = new Set(); private readonly _onDidChangeContributions = this._register(new Emitter()); constructor( codeActionsExtensionPoint: IExtensionPoint, @IKeybindingService keybindingService: IKeybindingService, + @ILanguageFeaturesService private readonly languageFeatures: ILanguageFeaturesService ) { super(); + // TODO: @justschen caching of code actions based on extensions loaded: https://github.com/microsoft/vscode/issues/216019 + + languageFeatures.codeActionProvider.onDidChange(() => { + this.updateSettingsFromCodeActionProviders(); + this.updateConfigurationSchemaFromContribs(); + }, 2000); + codeActionsExtensionPoint.setHandler(extensionPoints => { this._contributedCodeActions = extensionPoints.flatMap(x => x.value).filter(x => Array.isArray(x.actions)); this.updateConfigurationSchema(this._contributedCodeActions); @@ -93,9 +99,23 @@ export class CodeActionsContribution extends Disposable implements IWorkbenchCon }); } + private updateSettingsFromCodeActionProviders(): void { + const providers = this.languageFeatures.codeActionProvider.allNoModel(); + providers.forEach(provider => { + if (provider.providedCodeActionKinds) { + provider.providedCodeActionKinds.forEach(kind => { + if (!this.settings.has(kind) && CodeActionKind.Source.contains(new HierarchicalKind(kind))) { + this.settings.add(kind); + } + }); + } + }); + } + private updateConfigurationSchema(codeActionContributions: readonly CodeActionsExtensionPoint[]) { - const newProperties: IJSONSchemaMap = { ...codeActionsOnSaveDefaultProperties }; + const newProperties: IJSONSchemaMap = {}; for (const [sourceAction, props] of this.getSourceActions(codeActionContributions)) { + this.settings.add(sourceAction); newProperties[sourceAction] = createCodeActionsAutoSave(nls.localize('codeActionsOnSave.generic', "Controls whether '{0}' actions should be run on file save.", props.title)); } codeActionsOnSaveSchema.properties = newProperties; @@ -103,16 +123,24 @@ export class CodeActionsContribution extends Disposable implements IWorkbenchCon .notifyConfigurationSchemaUpdated(editorConfiguration); } + private updateConfigurationSchemaFromContribs() { + const properties: IJSONSchemaMap = { ...codeActionsOnSaveSchema.properties }; + for (const codeActionKind of this.settings) { + if (!properties[codeActionKind]) { + properties[codeActionKind] = createCodeActionsAutoSave(nls.localize('codeActionsOnSave.generic', "Controls whether '{0}' actions should be run on file save.", codeActionKind)); + } + } + codeActionsOnSaveSchema.properties = properties; + Registry.as(Extensions.Configuration) + .notifyConfigurationSchemaUpdated(editorConfiguration); + } + private getSourceActions(contributions: readonly CodeActionsExtensionPoint[]) { - const defaultKinds = Object.keys(codeActionsOnSaveDefaultProperties).map(value => new HierarchicalKind(value)); const sourceActions = new Map(); for (const contribution of contributions) { for (const action of contribution.actions) { const kind = new HierarchicalKind(action.kind); - if (CodeActionKind.Source.contains(kind) - // Exclude any we already included by default - && !defaultKinds.some(defaultKind => defaultKind.contains(kind)) - ) { + if (CodeActionKind.Source.contains(kind)) { sourceActions.set(kind.value, action); } } From 278b6a37a7c58b32a80a3bbaa661894791afe23a Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Mon, 24 Jun 2024 15:25:24 -0700 Subject: [PATCH 471/755] Fix static fn call for nb codeaction (#217605) fix static fn call --- .../browser/contrib/saveParticipants/saveParticipants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants.ts b/src/vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants.ts index eb2d57e62fe9d..d5899e3198684 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants.ts @@ -499,7 +499,7 @@ export class CodeActionParticipantUtils { }; for (const codeActionKind of codeActionsOnSave) { - const actionsToRun = await this.getActionsToRun(model, codeActionKind, excludes, languageFeaturesService, getActionProgress, token); + const actionsToRun = await CodeActionParticipantUtils.getActionsToRun(model, codeActionKind, excludes, languageFeaturesService, getActionProgress, token); if (token.isCancellationRequested) { actionsToRun.dispose(); return; From d681a19ddc2bd4d3a9ac0a3dfdcd42895d7f1d7b Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 24 Jun 2024 15:44:17 -0700 Subject: [PATCH 472/755] Make ExtHostSecrets disposable (#217619) Also register a few disposables. I don't have too much time to figure out how to register these properly (hence the TODO), and maybe this is more in @jrieken's territory... but wanted to have _something_ in place for now. --- src/vs/workbench/api/common/extHostExtensionService.ts | 7 ++++--- src/vs/workbench/api/common/extHostSecrets.ts | 9 ++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 6947479c2b894..97935e89d0893 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -498,9 +498,10 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme private _loadExtensionContext(extensionDescription: IExtensionDescription): Promise { const lanuageModelAccessInformation = this._extHostLanguageModels.createLanguageModelAccessInformation(extensionDescription); - const globalState = new ExtensionGlobalMemento(extensionDescription, this._storage); - const workspaceState = new ExtensionMemento(extensionDescription.identifier.value, false, this._storage); - const secrets = new ExtensionSecrets(extensionDescription, this._secretState); + // TODO: These should probably be disposed when the extension deactivates + const globalState = this._register(new ExtensionGlobalMemento(extensionDescription, this._storage)); + const workspaceState = this._register(new ExtensionMemento(extensionDescription.identifier.value, false, this._storage)); + const secrets = this._register(new ExtensionSecrets(extensionDescription, this._secretState)); const extensionMode = extensionDescription.isUnderDevelopment ? (this._initData.environment.extensionTestsLocationURI ? ExtensionMode.Test : ExtensionMode.Development) : ExtensionMode.Production; diff --git a/src/vs/workbench/api/common/extHostSecrets.ts b/src/vs/workbench/api/common/extHostSecrets.ts index 4b1e284b60422..13fb3293a3576 100644 --- a/src/vs/workbench/api/common/extHostSecrets.ts +++ b/src/vs/workbench/api/common/extHostSecrets.ts @@ -10,6 +10,7 @@ import type * as vscode from 'vscode'; import { ExtHostSecretState } from 'vs/workbench/api/common/extHostSecretState'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Event } from 'vs/base/common/event'; +import { DisposableStore } from 'vs/base/common/lifecycle'; export class ExtensionSecrets implements vscode.SecretStorage { @@ -17,6 +18,7 @@ export class ExtensionSecrets implements vscode.SecretStorage { readonly #secretState: ExtHostSecretState; readonly onDidChange: Event; + readonly disposables = new DisposableStore(); constructor(extensionDescription: IExtensionDescription, secretState: ExtHostSecretState) { this._id = ExtensionIdentifier.toKey(extensionDescription.identifier); @@ -24,10 +26,15 @@ export class ExtensionSecrets implements vscode.SecretStorage { this.onDidChange = Event.map( Event.filter(this.#secretState.onDidChangePassword, e => e.extensionId === this._id), - e => ({ key: e.key }) + e => ({ key: e.key }), + this.disposables ); } + dispose() { + this.disposables.dispose(); + } + get(key: string): Promise { return this.#secretState.get(this._id, key); } From 4f396935a4ef0af47d586ba1c203a420649f7ee2 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 24 Jun 2024 15:50:16 -0700 Subject: [PATCH 473/755] Cleanup getting started video experiment (#217620) --- .../browser/gettingStarted.ts | 120 +----------------- .../browser/media/gettingStarted.css | 10 +- 2 files changed, 5 insertions(+), 125 deletions(-) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index 46bac27a420b8..664c55b7172f9 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -69,7 +69,6 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { GettingStartedIndexList } from './gettingStartedList'; -import { IWorkbenchAssignmentService } from 'vs/workbench/services/assignment/common/assignmentService'; const SLIDE_TRANSITION_TIME_MS = 250; const configurationKey = 'workbench.startupEditor'; @@ -148,7 +147,6 @@ export class GettingStartedPage extends EditorPane { private recentlyOpenedList?: GettingStartedIndexList; private startList?: GettingStartedIndexList; private gettingStartedList?: GettingStartedIndexList; - private videoList?: GettingStartedIndexList; private stepsSlide!: HTMLElement; private categoriesSlide!: HTMLElement; @@ -187,8 +185,7 @@ export class GettingStartedPage extends EditorPane { @IHostService private readonly hostService: IHostService, @IWebviewService private readonly webviewService: IWebviewService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, - @IAccessibilityService private readonly accessibilityService: IAccessibilityService, - @IWorkbenchAssignmentService private readonly tasExperimentService: IWorkbenchAssignmentService + @IAccessibilityService private readonly accessibilityService: IAccessibilityService ) { super(GettingStartedPage.ID, group, telemetryService, themeService, storageService); @@ -443,10 +440,6 @@ export class GettingStartedPage extends EditorPane { } break; } - case 'hideVideos': { - this.hideVideos(); - break; - } case 'openLink': { this.openerService.open(argument); break; @@ -465,11 +458,6 @@ export class GettingStartedPage extends EditorPane { this.gettingStartedList?.rerender(); } - private hideVideos() { - this.setHiddenCategories([...this.getHiddenCategories().add('getting-started-videos')]); - this.videoList?.setEntries(undefined); - } - private markAllStepsComplete() { if (this.currentWalkthrough) { this.currentWalkthrough?.steps.forEach(step => { @@ -821,29 +809,6 @@ export class GettingStartedPage extends EditorPane { const startList = this.buildStartList(); const recentList = this.buildRecentlyOpenedList(); - - const showVideoTutorials = await Promise.race([ - this.tasExperimentService?.getTreatment('gettingStarted.showVideoTutorials'), - new Promise(resolve => setTimeout(() => resolve(false), 200)) - ]); - - let videoList: GettingStartedIndexList; - if (showVideoTutorials === true) { - this.showFeaturedWalkthrough = false; - videoList = this.buildVideosList(); - const layoutVideos = () => { - if (videoList?.itemCount > 0) { - reset(rightColumn, videoList?.getDomElement(), gettingStartedList.getDomElement()); - } - else { - reset(rightColumn, gettingStartedList.getDomElement()); - } - setTimeout(() => this.categoriesPageScrollbar?.scanDomNode(), 50); - layoutRecentList(); - }; - videoList.onDidChange(layoutVideos); - } - const gettingStartedList = this.buildGettingStartedWalkthroughsList(); const footer = $('.footer', {}, @@ -855,31 +820,18 @@ export class GettingStartedPage extends EditorPane { const layoutLists = () => { if (gettingStartedList.itemCount) { this.container.classList.remove('noWalkthroughs'); - if (videoList?.itemCount > 0) { - this.container.classList.remove('noVideos'); - reset(rightColumn, videoList?.getDomElement(), gettingStartedList.getDomElement()); - } else { - this.container.classList.add('noVideos'); - reset(rightColumn, gettingStartedList.getDomElement()); - } + reset(rightColumn, gettingStartedList.getDomElement()); } else { this.container.classList.add('noWalkthroughs'); - if (videoList?.itemCount > 0) { - this.container.classList.remove('noVideos'); - reset(rightColumn, videoList?.getDomElement()); - } - else { - this.container.classList.add('noVideos'); - reset(rightColumn); - } + reset(rightColumn); } setTimeout(() => this.categoriesPageScrollbar?.scanDomNode(), 50); layoutRecentList(); }; const layoutRecentList = () => { - if (this.container.classList.contains('noWalkthroughs') && this.container.classList.contains('noVideos')) { + if (this.container.classList.contains('noWalkthroughs')) { recentList.setLimit(10); reset(leftColumn, startList.getDomElement()); reset(rightColumn, recentList.getDomElement()); @@ -1139,69 +1091,6 @@ export class GettingStartedPage extends EditorPane { return gettingStartedList; } - private buildVideosList(): GettingStartedIndexList { - - const renderFeaturedExtensions = (entry: IWelcomePageStartEntry): HTMLElement => { - - const featuredBadge = $('.featured-badge', {}); - const descriptionContent = $('.description-content', {},); - - reset(featuredBadge, $('.featured', {}, $('span.featured-icon.codicon.codicon-star-full'))); - reset(descriptionContent, ...renderLabelWithIcons(entry.description)); - - const titleContent = $('h3.category-title.max-lines-3', { 'x-category-title-for': entry.id }); - reset(titleContent, ...renderLabelWithIcons(entry.title)); - - return $('button.getting-started-category' + '.featured', - { - 'x-dispatch': 'openLink:' + entry.command, - 'title': entry.title - }, - featuredBadge, - $('.main-content', {}, - this.iconWidgetFor(entry), - titleContent, - $('a.codicon.codicon-close.hide-category-button', { - 'tabindex': 0, - 'x-dispatch': 'hideVideos', - 'title': localize('close', "Hide"), - 'role': 'button', - 'aria-label': localize('closeAriaLabel', "Hide"), - }), - ), - descriptionContent); - }; - - if (this.videoList) { - this.videoList.dispose(); - } - const videoList = this.videoList = new GettingStartedIndexList( - { - title: localize('videos', "Videos"), - klass: 'getting-started-videos', - limit: 1, - renderElement: renderFeaturedExtensions, - contextService: this.contextService, - }); - - if (this.getHiddenCategories().has('getting-started-videos')) { - return videoList; - } - - videoList.setEntries([{ - id: 'getting-started-videos', - title: localize('videos-title', 'Watch Getting Started Tutorials'), - description: localize('videos-description', 'Learn VS Code\'s must-have features in short and practical videos'), - command: 'https://aka.ms/vscode-getting-started-tutorials', - order: 0, - icon: { type: 'icon', icon: Codicon.deviceCameraVideo }, - when: ContextKeyExpr.true(), - }]); - videoList.onDidChange(() => this.registerDispatchListeners()); - - return videoList; - } - layout(size: Dimension) { this.detailsScrollbar?.scanDomNode(); @@ -1211,7 +1100,6 @@ export class GettingStartedPage extends EditorPane { this.startList?.layout(size); this.gettingStartedList?.layout(size); this.recentlyOpenedList?.layout(size); - this.videoList?.layout(size); if (this.editorInput?.selectedStep && this.currentMediaType) { this.mediaDisposables.clear(); diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css index 492fd698fb2f2..80cddd5958bb0 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css @@ -228,7 +228,6 @@ } .monaco-workbench .part.editor > .content .gettingStartedContainer .icon-widget, -.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .icon-widget:not(.codicon-device-camera-video), .monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .featured-icon { font-size: 20px; padding-right: 8px; @@ -236,13 +235,6 @@ top: 3px; } -.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .icon-widget.codicon-device-camera-video { - font-size: 20px; - padding-right: 8px; - position: relative; - transform: translateY(+100%); -} - .monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .codicon:not(.icon-widget, .featured-icon, .hide-category-button) { margin: 0 2px; } @@ -348,7 +340,7 @@ right: 8px; } -.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlide .getting-started-category.featured .icon-widget:not(.codicon-device-camera-video) { +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlide .getting-started-category.featured .icon-widget { visibility: hidden; } From 1435b366b2d8e4a1d446d7969e9c246a572027d5 Mon Sep 17 00:00:00 2001 From: Michael Lively Date: Mon, 24 Jun 2024 18:13:26 -0700 Subject: [PATCH 474/755] Chore: OSS tool (#217642) * oss tool * update distro hash --- ThirdPartyNotices.txt | 4 +- cli/ThirdPartyNotices.txt | 175 +++----------------------------------- package.json | 2 +- 3 files changed, 13 insertions(+), 168 deletions(-) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 2e3f2610f46d2..fe3cf5c4a9b0d 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -517,7 +517,7 @@ to the base-name name of the original file, and an extension of txt, html, or si --------------------------------------------------------- -go-syntax 0.6.6 - MIT +go-syntax 0.6.8 - MIT https://github.com/worlpaker/go-syntax MIT License @@ -833,7 +833,7 @@ SOFTWARE. --------------------------------------------------------- -jlelong/vscode-latex-basics 1.7.0 - MIT +jlelong/vscode-latex-basics 1.9.0 - MIT https://github.com/jlelong/vscode-latex-basics Copyright (c) vscode-latex-basics authors diff --git a/cli/ThirdPartyNotices.txt b/cli/ThirdPartyNotices.txt index 7a74fb503c518..a9630c120224a 100644 --- a/cli/ThirdPartyNotices.txt +++ b/cli/ThirdPartyNotices.txt @@ -1341,7 +1341,7 @@ SOFTWARE. --------------------------------------------------------- clap_derive 4.5.4 - MIT OR Apache-2.0 -https://github.com/clap-rs/clap/tree/master/clap_derive +https://github.com/clap-rs/clap Copyright (c) Individual contributors @@ -1367,7 +1367,7 @@ SOFTWARE. --------------------------------------------------------- clap_lex 0.7.0 - MIT OR Apache-2.0 -https://github.com/clap-rs/clap/tree/master/clap_lex +https://github.com/clap-rs/clap Copyright (c) Individual contributors @@ -3428,7 +3428,7 @@ DEALINGS IN THE SOFTWARE. httparse 1.8.0 - MIT/Apache-2.0 https://github.com/seanmonstar/httparse -Copyright (c) 2015-2021 Sean McArthur +Copyright (c) 2015-2024 Sean McArthur Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -8507,6 +8507,7 @@ subtle 2.5.0 - BSD-3-Clause https://github.com/dalek-cryptography/subtle Copyright (c) 2016-2017 Isis Agora Lovecruft, Henry de Valence. All rights reserved. +Copyright (c) 2016-2024 Isis Agora Lovecruft. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10790,33 +10791,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI zbus 3.15.2 - MIT https://github.com/dbus2/zbus/ -The MIT License (MIT) - -Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +LICENSE-MIT --------------------------------------------------------- --------------------------------------------------------- @@ -10824,33 +10799,7 @@ DEALINGS IN THE SOFTWARE. zbus_macros 3.15.2 - MIT https://github.com/dbus2/zbus/ -The MIT License (MIT) - -Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +LICENSE-MIT --------------------------------------------------------- --------------------------------------------------------- @@ -10858,33 +10807,7 @@ DEALINGS IN THE SOFTWARE. zbus_names 2.6.1 - MIT https://github.com/dbus2/zbus/ -The MIT License (MIT) - -Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +LICENSE-MIT --------------------------------------------------------- --------------------------------------------------------- @@ -10977,33 +10900,7 @@ licences; see files named LICENSE.*.txt for details. zvariant 3.15.2 - MIT https://github.com/dbus2/zbus/ -The MIT License (MIT) - -Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +LICENSE-MIT --------------------------------------------------------- --------------------------------------------------------- @@ -11011,33 +10908,7 @@ DEALINGS IN THE SOFTWARE. zvariant_derive 3.15.2 - MIT https://github.com/dbus2/zbus/ -The MIT License (MIT) - -Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +LICENSE-MIT --------------------------------------------------------- --------------------------------------------------------- @@ -11045,31 +10916,5 @@ DEALINGS IN THE SOFTWARE. zvariant_utils 1.0.1 - MIT https://github.com/dbus2/zbus/ -The MIT License (MIT) - -Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +LICENSE-MIT --------------------------------------------------------- \ No newline at end of file diff --git a/package.json b/package.json index 3d8b1cbb2093b..49c83a768b773 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "44256034a3b5a2bbd6b12530ab050a2a3c2bd285", + "distro": "9cef7f933867933892cb3b591231ed071fe861a8", "author": { "name": "Microsoft Corporation" }, From 6f3598b9a1692036664d1550e05a39b105740fdb Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 24 Jun 2024 21:18:41 -0700 Subject: [PATCH 475/755] Ensure that the first line of markdown in a 'supportHtml' MarkdownString is parsed as markdown (#217641) * Ensure that the first line of markdown in a 'supportHtml' MarkdownString is parsed as markdown Fix microsoft/vscode-copilot-release#1337 * Update tests --- .../contrib/chat/browser/chatMarkdownRenderer.ts | 3 ++- .../ChatMarkdownRenderer_invalid_HTML.0.snap | 2 +- ...kdownRenderer_invalid_HTML_with_attributes.0.snap | 2 +- .../ChatMarkdownRenderer_remote_images.0.snap | 2 +- ...ChatMarkdownRenderer_self-closing_elements.0.snap | 2 +- ...enderer_supportHtml_with_one-line_markdown.0.snap | 1 + ...enderer_supportHtml_with_one-line_markdown.1.snap | 4 ++++ .../chat/test/browser/chatMarkdownRenderer.test.ts | 12 ++++++++++++ 8 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.0.snap create mode 100644 src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.1.snap diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts index 3e4b6a9349f50..50c6029a9e881 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts @@ -73,7 +73,8 @@ export class ChatMarkdownRenderer extends MarkdownRenderer { ...markdown, // dompurify uses DOMParser, which strips leading comments. Wrapping it all in 'body' prevents this. - value: `${markdown.value}`, + // The \n\n prevents marked.js from parsing the body contents as just text in an 'html' token, instead of actual markdown. + value: `\n\n${markdown.value}`, } : markdown; return super.render(mdWithBody, options, markedOptions); diff --git a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML.0.snap b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML.0.snap index 0d3458d76b7d4..9bfd3b945e811 100644 --- a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML.0.snap +++ b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML.0.snap @@ -1 +1 @@ -
1<canvas>2<details>3</details></canvas>4
\ No newline at end of file +

1<canvas>2</canvas>

<details>3</details>4

\ No newline at end of file diff --git a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML_with_attributes.0.snap b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML_with_attributes.0.snap index 3bb96899c111c..c0b5a277aac57 100644 --- a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML_with_attributes.0.snap +++ b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_invalid_HTML_with_attributes.0.snap @@ -1 +1 @@ -
1<details id="id1" style="display: none">2<details id="my id 2">3</details></details>4
\ No newline at end of file +

1

<details id="id1" style="display: none">2<details id="my id 2">3</details></details>4

\ No newline at end of file diff --git a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_remote_images.0.snap b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_remote_images.0.snap index 34a719b061328..1241ef62b5faa 100644 --- a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_remote_images.0.snap +++ b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_remote_images.0.snap @@ -1 +1 @@ -
<img src="http://disallowed.com/image.jpg">
\ No newline at end of file +

<img src="http://disallowed.com/image.jpg">

\ No newline at end of file diff --git a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_self-closing_elements.0.snap b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_self-closing_elements.0.snap index 023b2e6a84676..5b482726d3a7b 100644 --- a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_self-closing_elements.0.snap +++ b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_self-closing_elements.0.snap @@ -1 +1 @@ -
<area>

<input type="text" value="test">
\ No newline at end of file +

<area>



<input type="text" value="test">

\ No newline at end of file diff --git a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.0.snap b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.0.snap new file mode 100644 index 0000000000000..89991e7676ea4 --- /dev/null +++ b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.0.snap @@ -0,0 +1 @@ +

hello

\ No newline at end of file diff --git a/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.1.snap b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.1.snap new file mode 100644 index 0000000000000..d704b7b322dda --- /dev/null +++ b/src/vs/workbench/contrib/chat/test/browser/__snapshots__/ChatMarkdownRenderer_supportHtml_with_one-line_markdown.1.snap @@ -0,0 +1,4 @@ +
    +
  1. hello test text
  2. +
+
\ No newline at end of file diff --git a/src/vs/workbench/contrib/chat/test/browser/chatMarkdownRenderer.test.ts b/src/vs/workbench/contrib/chat/test/browser/chatMarkdownRenderer.test.ts index e9975f252834d..657ed1c961caf 100644 --- a/src/vs/workbench/contrib/chat/test/browser/chatMarkdownRenderer.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/chatMarkdownRenderer.test.ts @@ -27,6 +27,18 @@ suite('ChatMarkdownRenderer', () => { await assertSnapshot(result.element.textContent); }); + test('supportHtml with one-line markdown', async () => { + const md = new MarkdownString('**hello**'); + md.supportHtml = true; + const result = store.add(testRenderer.render(md)); + await assertSnapshot(result.element.outerHTML); + + const md2 = new MarkdownString('1. [_hello_](https://example.com) test **text**'); + md2.supportHtml = true; + const result2 = store.add(testRenderer.render(md2)); + await assertSnapshot(result2.element.outerHTML); + }); + test('invalid HTML', async () => { const md = new MarkdownString('12
3
4'); md.supportHtml = true; From 3e9cab05385c88a3174175e47085952bd3caf8a3 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 24 Jun 2024 21:18:58 -0700 Subject: [PATCH 476/755] Fix error from undefined 'isSettled' (#217646) Workaround for #217645 --- .../chat/browser/chatContentParts/chatTaskContentPart.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts index ad493c4afc770..a1a03e1cae157 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatTaskContentPart.ts @@ -34,7 +34,9 @@ export class ChatTaskContentPart extends Disposable implements IChatContentPart this.domNode.appendChild(refsPart.domNode); this.onDidChangeHeight = refsPart.onDidChangeHeight; } else { - const progressPart = this._register(instantiationService.createInstance(ChatProgressContentPart, task, renderer, context, !task.isSettled(), true)); + // #217645 + const isSettled = task.isSettled?.() ?? true; + const progressPart = this._register(instantiationService.createInstance(ChatProgressContentPart, task, renderer, context, !isSettled, true)); this.domNode = progressPart.domNode; this.onDidChangeHeight = Event.None; } From ca8cb6f637fc5ac820b581eb4115bc3917ba7548 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 25 Jun 2024 09:03:25 +0200 Subject: [PATCH 477/755] registerColor: pass in a single value for defaults, improve further (#214468) --- .../diffEditor/registrations.contribution.ts | 4 +- .../browser/widget/multiDiffEditor/colors.ts | 2 +- .../editor/common/core/editorColorRegistry.ts | 84 +-- .../browser/bracketMatching.ts | 2 +- .../folding/browser/foldingDecorations.ts | 2 +- .../gotoError/browser/gotoErrorWidget.ts | 2 +- .../browser/parameterHintsWidget.ts | 2 +- .../contrib/peekView/browser/peekView.ts | 4 +- .../contrib/suggest/browser/suggestWidget.ts | 18 +- .../symbolIcons/browser/symbolIcons.ts | 191 ++---- .../browser/highlightDecorations.ts | 10 +- .../actionWidget/browser/actionWidget.ts | 2 +- src/vs/platform/theme/common/colorUtils.ts | 27 +- .../theme/common/colors/baseColors.ts | 2 +- .../theme/common/colors/chartsColors.ts | 12 +- .../theme/common/colors/editorColors.ts | 70 +-- .../theme/common/colors/inputColors.ts | 18 +- .../theme/common/colors/listColors.ts | 22 +- .../theme/common/colors/menuColors.ts | 8 +- .../theme/common/colors/minimapColors.ts | 10 +- .../theme/common/colors/miscColors.ts | 2 +- .../theme/common/colors/quickpickColors.ts | 10 +- src/vs/workbench/common/theme.ts | 579 +++--------------- .../contrib/chat/common/chatColors.ts | 2 +- .../contrib/comments/browser/commentColors.ts | 6 +- .../comments/browser/commentGlyphWidget.ts | 6 +- .../browser/breakpointEditorContribution.ts | 8 +- .../contrib/debug/browser/debugColors.ts | 19 +- .../debug/browser/debugEditorContribution.ts | 7 +- .../contrib/debug/browser/exceptionWidget.ts | 2 +- .../debug/browser/statusbarColorProvider.ts | 16 +- .../extensions/browser/extensionsActions.ts | 7 +- .../extensions/browser/extensionsWidgets.ts | 2 +- .../contrib/inlineChat/common/inlineChat.ts | 22 +- .../mergeEditor/browser/view/colors.ts | 18 +- .../notebook/browser/notebookEditorWidget.ts | 114 +--- .../preferences/browser/keybindingsEditor.ts | 4 +- .../common/settingsEditorColorRegistry.ts | 39 +- .../contrib/remote/browser/tunnelView.ts | 7 +- .../contrib/scm/browser/dirtydiffDecorator.ts | 42 +- .../contrib/scm/browser/scmViewPane.ts | 34 +- .../searchEditor/browser/searchEditor.ts | 2 +- .../terminal/common/terminalColorRegistry.ts | 42 +- .../terminalStickyScrollColorRegistry.ts | 7 +- .../contrib/testing/browser/theme.ts | 104 +--- .../browser/userDataProfilesEditor.ts | 2 +- .../browser/gettingStartedColors.ts | 6 +- 47 files changed, 429 insertions(+), 1172 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditor/registrations.contribution.ts b/src/vs/editor/browser/widget/diffEditor/registrations.contribution.ts index 36bd4d465ff23..80b553bcb30a0 100644 --- a/src/vs/editor/browser/widget/diffEditor/registrations.contribution.ts +++ b/src/vs/editor/browser/widget/diffEditor/registrations.contribution.ts @@ -12,13 +12,13 @@ import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; export const diffMoveBorder = registerColor( 'diffEditor.move.border', - { dark: '#8b8b8b9c', light: '#8b8b8b9c', hcDark: '#8b8b8b9c', hcLight: '#8b8b8b9c', }, + '#8b8b8b9c', localize('diffEditor.move.border', 'The border color for text that got moved in the diff editor.') ); export const diffMoveBorderActive = registerColor( 'diffEditor.moveActive.border', - { dark: '#FFA500', light: '#FFA500', hcDark: '#FFA500', hcLight: '#FFA500', }, + '#FFA500', localize('diffEditor.moveActive.border', 'The active border color for text that got moved in the diff editor.') ); diff --git a/src/vs/editor/browser/widget/multiDiffEditor/colors.ts b/src/vs/editor/browser/widget/multiDiffEditor/colors.ts index d58781aabfeb1..297e5e864652c 100644 --- a/src/vs/editor/browser/widget/multiDiffEditor/colors.ts +++ b/src/vs/editor/browser/widget/multiDiffEditor/colors.ts @@ -14,7 +14,7 @@ export const multiDiffEditorHeaderBackground = registerColor( export const multiDiffEditorBackground = registerColor( 'multiDiffEditor.background', - { dark: 'editorBackground', light: 'editorBackground', hcDark: 'editorBackground', hcLight: 'editorBackground', }, + 'editorBackground', localize('multiDiffEditor.background', 'The background color of the multi file diff editor') ); diff --git a/src/vs/editor/common/core/editorColorRegistry.ts b/src/vs/editor/common/core/editorColorRegistry.ts index f7ad150e80cee..b7c71f99721d3 100644 --- a/src/vs/editor/common/core/editorColorRegistry.ts +++ b/src/vs/editor/common/core/editorColorRegistry.ts @@ -11,7 +11,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic /** * Definition of the editor colors */ -export const editorLineHighlight = registerColor('editor.lineHighlightBackground', { dark: null, light: null, hcDark: null, hcLight: null }, nls.localize('lineHighlight', 'Background color for the highlight of line at the cursor position.')); +export const editorLineHighlight = registerColor('editor.lineHighlightBackground', null, nls.localize('lineHighlight', 'Background color for the highlight of line at the cursor position.')); export const editorLineHighlightBorder = registerColor('editor.lineHighlightBorder', { dark: '#282828', light: '#eeeeee', hcDark: '#f38518', hcLight: contrastBorder }, nls.localize('lineHighlightBorderBox', 'Background color for the border around the line at the cursor position.')); export const editorRangeHighlight = registerColor('editor.rangeHighlightBackground', { dark: '#ffffff0b', light: '#fdff0033', hcDark: null, hcLight: null }, nls.localize('rangeHighlight', 'Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations.'), true); export const editorRangeHighlightBorder = registerColor('editor.rangeHighlightBorder', { dark: null, light: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, nls.localize('rangeHighlightBorder', 'Background color of the border around highlighted ranges.')); @@ -21,32 +21,32 @@ export const editorSymbolHighlightBorder = registerColor('editor.symbolHighlight export const editorCursorForeground = registerColor('editorCursor.foreground', { dark: '#AEAFAD', light: Color.black, hcDark: Color.white, hcLight: '#0F4A85' }, nls.localize('caret', 'Color of the editor cursor.')); export const editorCursorBackground = registerColor('editorCursor.background', null, nls.localize('editorCursorBackground', 'The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.')); export const editorMultiCursorPrimaryForeground = registerColor('editorMultiCursor.primary.foreground', editorCursorForeground, nls.localize('editorMultiCursorPrimaryForeground', 'Color of the primary editor cursor when multiple cursors are present.')); -export const editorMultiCursorPrimaryBackground = registerColor('editorMultiCursor.primary.background', { dark: editorCursorBackground, light: editorCursorBackground, hcDark: editorCursorBackground, hcLight: editorCursorBackground }, nls.localize('editorMultiCursorPrimaryBackground', 'The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.')); -export const editorMultiCursorSecondaryForeground = registerColor('editorMultiCursor.secondary.foreground', { dark: editorCursorForeground, light: editorCursorForeground, hcDark: editorCursorForeground, hcLight: editorCursorForeground }, nls.localize('editorMultiCursorSecondaryForeground', 'Color of secondary editor cursors when multiple cursors are present.')); -export const editorMultiCursorSecondaryBackground = registerColor('editorMultiCursor.secondary.background', { dark: editorCursorBackground, light: editorCursorBackground, hcDark: editorCursorBackground, hcLight: editorCursorBackground }, nls.localize('editorMultiCursorSecondaryBackground', 'The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.')); +export const editorMultiCursorPrimaryBackground = registerColor('editorMultiCursor.primary.background', editorCursorBackground, nls.localize('editorMultiCursorPrimaryBackground', 'The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.')); +export const editorMultiCursorSecondaryForeground = registerColor('editorMultiCursor.secondary.foreground', editorCursorForeground, nls.localize('editorMultiCursorSecondaryForeground', 'Color of secondary editor cursors when multiple cursors are present.')); +export const editorMultiCursorSecondaryBackground = registerColor('editorMultiCursor.secondary.background', editorCursorBackground, nls.localize('editorMultiCursorSecondaryBackground', 'The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.')); export const editorWhitespaces = registerColor('editorWhitespace.foreground', { dark: '#e3e4e229', light: '#33333333', hcDark: '#e3e4e229', hcLight: '#CCCCCC' }, nls.localize('editorWhitespaces', 'Color of whitespace characters in the editor.')); export const editorLineNumbers = registerColor('editorLineNumber.foreground', { dark: '#858585', light: '#237893', hcDark: Color.white, hcLight: '#292929' }, nls.localize('editorLineNumbers', 'Color of editor line numbers.')); -export const deprecatedEditorIndentGuides = registerColor('editorIndentGuide.background', { dark: editorWhitespaces, light: editorWhitespaces, hcDark: editorWhitespaces, hcLight: editorWhitespaces }, nls.localize('editorIndentGuides', 'Color of the editor indentation guides.'), false, nls.localize('deprecatedEditorIndentGuides', '\'editorIndentGuide.background\' is deprecated. Use \'editorIndentGuide.background1\' instead.')); -export const deprecatedEditorActiveIndentGuides = registerColor('editorIndentGuide.activeBackground', { dark: editorWhitespaces, light: editorWhitespaces, hcDark: editorWhitespaces, hcLight: editorWhitespaces }, nls.localize('editorActiveIndentGuide', 'Color of the active editor indentation guides.'), false, nls.localize('deprecatedEditorActiveIndentGuide', '\'editorIndentGuide.activeBackground\' is deprecated. Use \'editorIndentGuide.activeBackground1\' instead.')); +export const deprecatedEditorIndentGuides = registerColor('editorIndentGuide.background', editorWhitespaces, nls.localize('editorIndentGuides', 'Color of the editor indentation guides.'), false, nls.localize('deprecatedEditorIndentGuides', '\'editorIndentGuide.background\' is deprecated. Use \'editorIndentGuide.background1\' instead.')); +export const deprecatedEditorActiveIndentGuides = registerColor('editorIndentGuide.activeBackground', editorWhitespaces, nls.localize('editorActiveIndentGuide', 'Color of the active editor indentation guides.'), false, nls.localize('deprecatedEditorActiveIndentGuide', '\'editorIndentGuide.activeBackground\' is deprecated. Use \'editorIndentGuide.activeBackground1\' instead.')); -export const editorIndentGuide1 = registerColor('editorIndentGuide.background1', { dark: deprecatedEditorIndentGuides, light: deprecatedEditorIndentGuides, hcDark: deprecatedEditorIndentGuides, hcLight: deprecatedEditorIndentGuides }, nls.localize('editorIndentGuides1', 'Color of the editor indentation guides (1).')); -export const editorIndentGuide2 = registerColor('editorIndentGuide.background2', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorIndentGuides2', 'Color of the editor indentation guides (2).')); -export const editorIndentGuide3 = registerColor('editorIndentGuide.background3', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorIndentGuides3', 'Color of the editor indentation guides (3).')); -export const editorIndentGuide4 = registerColor('editorIndentGuide.background4', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorIndentGuides4', 'Color of the editor indentation guides (4).')); -export const editorIndentGuide5 = registerColor('editorIndentGuide.background5', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorIndentGuides5', 'Color of the editor indentation guides (5).')); -export const editorIndentGuide6 = registerColor('editorIndentGuide.background6', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorIndentGuides6', 'Color of the editor indentation guides (6).')); +export const editorIndentGuide1 = registerColor('editorIndentGuide.background1', deprecatedEditorIndentGuides, nls.localize('editorIndentGuides1', 'Color of the editor indentation guides (1).')); +export const editorIndentGuide2 = registerColor('editorIndentGuide.background2', '#00000000', nls.localize('editorIndentGuides2', 'Color of the editor indentation guides (2).')); +export const editorIndentGuide3 = registerColor('editorIndentGuide.background3', '#00000000', nls.localize('editorIndentGuides3', 'Color of the editor indentation guides (3).')); +export const editorIndentGuide4 = registerColor('editorIndentGuide.background4', '#00000000', nls.localize('editorIndentGuides4', 'Color of the editor indentation guides (4).')); +export const editorIndentGuide5 = registerColor('editorIndentGuide.background5', '#00000000', nls.localize('editorIndentGuides5', 'Color of the editor indentation guides (5).')); +export const editorIndentGuide6 = registerColor('editorIndentGuide.background6', '#00000000', nls.localize('editorIndentGuides6', 'Color of the editor indentation guides (6).')); -export const editorActiveIndentGuide1 = registerColor('editorIndentGuide.activeBackground1', { dark: deprecatedEditorActiveIndentGuides, light: deprecatedEditorActiveIndentGuides, hcDark: deprecatedEditorActiveIndentGuides, hcLight: deprecatedEditorActiveIndentGuides }, nls.localize('editorActiveIndentGuide1', 'Color of the active editor indentation guides (1).')); -export const editorActiveIndentGuide2 = registerColor('editorIndentGuide.activeBackground2', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorActiveIndentGuide2', 'Color of the active editor indentation guides (2).')); -export const editorActiveIndentGuide3 = registerColor('editorIndentGuide.activeBackground3', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorActiveIndentGuide3', 'Color of the active editor indentation guides (3).')); -export const editorActiveIndentGuide4 = registerColor('editorIndentGuide.activeBackground4', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorActiveIndentGuide4', 'Color of the active editor indentation guides (4).')); -export const editorActiveIndentGuide5 = registerColor('editorIndentGuide.activeBackground5', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorActiveIndentGuide5', 'Color of the active editor indentation guides (5).')); -export const editorActiveIndentGuide6 = registerColor('editorIndentGuide.activeBackground6', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorActiveIndentGuide6', 'Color of the active editor indentation guides (6).')); +export const editorActiveIndentGuide1 = registerColor('editorIndentGuide.activeBackground1', deprecatedEditorActiveIndentGuides, nls.localize('editorActiveIndentGuide1', 'Color of the active editor indentation guides (1).')); +export const editorActiveIndentGuide2 = registerColor('editorIndentGuide.activeBackground2', '#00000000', nls.localize('editorActiveIndentGuide2', 'Color of the active editor indentation guides (2).')); +export const editorActiveIndentGuide3 = registerColor('editorIndentGuide.activeBackground3', '#00000000', nls.localize('editorActiveIndentGuide3', 'Color of the active editor indentation guides (3).')); +export const editorActiveIndentGuide4 = registerColor('editorIndentGuide.activeBackground4', '#00000000', nls.localize('editorActiveIndentGuide4', 'Color of the active editor indentation guides (4).')); +export const editorActiveIndentGuide5 = registerColor('editorIndentGuide.activeBackground5', '#00000000', nls.localize('editorActiveIndentGuide5', 'Color of the active editor indentation guides (5).')); +export const editorActiveIndentGuide6 = registerColor('editorIndentGuide.activeBackground6', '#00000000', nls.localize('editorActiveIndentGuide6', 'Color of the active editor indentation guides (6).')); const deprecatedEditorActiveLineNumber = registerColor('editorActiveLineNumber.foreground', { dark: '#c6c6c6', light: '#0B216F', hcDark: activeContrastBorder, hcLight: activeContrastBorder }, nls.localize('editorActiveLineNumber', 'Color of editor active line number'), false, nls.localize('deprecatedEditorActiveLineNumber', 'Id is deprecated. Use \'editorLineNumber.activeForeground\' instead.')); -export const editorActiveLineNumber = registerColor('editorLineNumber.activeForeground', { dark: deprecatedEditorActiveLineNumber, light: deprecatedEditorActiveLineNumber, hcDark: deprecatedEditorActiveLineNumber, hcLight: deprecatedEditorActiveLineNumber }, nls.localize('editorActiveLineNumber', 'Color of editor active line number')); -export const editorDimmedLineNumber = registerColor('editorLineNumber.dimmedForeground', { dark: null, light: null, hcDark: null, hcLight: null }, nls.localize('editorDimmedLineNumber', 'Color of the final editor line when editor.renderFinalNewline is set to dimmed.')); +export const editorActiveLineNumber = registerColor('editorLineNumber.activeForeground', deprecatedEditorActiveLineNumber, nls.localize('editorActiveLineNumber', 'Color of editor active line number')); +export const editorDimmedLineNumber = registerColor('editorLineNumber.dimmedForeground', null, nls.localize('editorDimmedLineNumber', 'Color of the final editor line when editor.renderFinalNewline is set to dimmed.')); export const editorRuler = registerColor('editorRuler.foreground', { dark: '#5A5A5A', light: Color.lightgrey, hcDark: Color.white, hcLight: '#292929' }, nls.localize('editorRuler', 'Color of the editor rulers.')); @@ -58,17 +58,17 @@ export const editorBracketMatchBorder = registerColor('editorBracketMatch.border export const editorOverviewRulerBorder = registerColor('editorOverviewRuler.border', { dark: '#7f7f7f4d', light: '#7f7f7f4d', hcDark: '#7f7f7f4d', hcLight: '#666666' }, nls.localize('editorOverviewRulerBorder', 'Color of the overview ruler border.')); export const editorOverviewRulerBackground = registerColor('editorOverviewRuler.background', null, nls.localize('editorOverviewRulerBackground', 'Background color of the editor overview ruler.')); -export const editorGutter = registerColor('editorGutter.background', { dark: editorBackground, light: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, nls.localize('editorGutter', 'Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.')); +export const editorGutter = registerColor('editorGutter.background', editorBackground, nls.localize('editorGutter', 'Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.')); export const editorUnnecessaryCodeBorder = registerColor('editorUnnecessaryCode.border', { dark: null, light: null, hcDark: Color.fromHex('#fff').transparent(0.8), hcLight: contrastBorder }, nls.localize('unnecessaryCodeBorder', 'Border color of unnecessary (unused) source code in the editor.')); export const editorUnnecessaryCodeOpacity = registerColor('editorUnnecessaryCode.opacity', { dark: Color.fromHex('#000a'), light: Color.fromHex('#0007'), hcDark: null, hcLight: null }, nls.localize('unnecessaryCodeOpacity', 'Opacity of unnecessary (unused) source code in the editor. For example, "#000000c0" will render the code with 75% opacity. For high contrast themes, use the \'editorUnnecessaryCode.border\' theme color to underline unnecessary code instead of fading it out.')); export const ghostTextBorder = registerColor('editorGhostText.border', { dark: null, light: null, hcDark: Color.fromHex('#fff').transparent(0.8), hcLight: Color.fromHex('#292929').transparent(0.8) }, nls.localize('editorGhostTextBorder', 'Border color of ghost text in the editor.')); export const ghostTextForeground = registerColor('editorGhostText.foreground', { dark: Color.fromHex('#ffffff56'), light: Color.fromHex('#0007'), hcDark: null, hcLight: null }, nls.localize('editorGhostTextForeground', 'Foreground color of the ghost text in the editor.')); -export const ghostTextBackground = registerColor('editorGhostText.background', { dark: null, light: null, hcDark: null, hcLight: null }, nls.localize('editorGhostTextBackground', 'Background color of the ghost text in the editor.')); +export const ghostTextBackground = registerColor('editorGhostText.background', null, nls.localize('editorGhostTextBackground', 'Background color of the ghost text in the editor.')); const rulerRangeDefault = new Color(new RGBA(0, 122, 204, 0.6)); -export const overviewRulerRangeHighlight = registerColor('editorOverviewRuler.rangeHighlightForeground', { dark: rulerRangeDefault, light: rulerRangeDefault, hcDark: rulerRangeDefault, hcLight: rulerRangeDefault }, nls.localize('overviewRulerRangeHighlight', 'Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.'), true); +export const overviewRulerRangeHighlight = registerColor('editorOverviewRuler.rangeHighlightForeground', rulerRangeDefault, nls.localize('overviewRulerRangeHighlight', 'Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.'), true); export const overviewRulerError = registerColor('editorOverviewRuler.errorForeground', { dark: new Color(new RGBA(255, 18, 18, 0.7)), light: new Color(new RGBA(255, 18, 18, 0.7)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: '#B5200D' }, nls.localize('overviewRuleError', 'Overview ruler marker color for errors.')); export const overviewRulerWarning = registerColor('editorOverviewRuler.warningForeground', { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningBorder, hcLight: editorWarningBorder }, nls.localize('overviewRuleWarning', 'Overview ruler marker color for warnings.')); export const overviewRulerInfo = registerColor('editorOverviewRuler.infoForeground', { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoBorder, hcLight: editorInfoBorder }, nls.localize('overviewRuleInfo', 'Overview ruler marker color for infos.')); @@ -76,28 +76,28 @@ export const overviewRulerInfo = registerColor('editorOverviewRuler.infoForegrou export const editorBracketHighlightingForeground1 = registerColor('editorBracketHighlight.foreground1', { dark: '#FFD700', light: '#0431FAFF', hcDark: '#FFD700', hcLight: '#0431FAFF' }, nls.localize('editorBracketHighlightForeground1', 'Foreground color of brackets (1). Requires enabling bracket pair colorization.')); export const editorBracketHighlightingForeground2 = registerColor('editorBracketHighlight.foreground2', { dark: '#DA70D6', light: '#319331FF', hcDark: '#DA70D6', hcLight: '#319331FF' }, nls.localize('editorBracketHighlightForeground2', 'Foreground color of brackets (2). Requires enabling bracket pair colorization.')); export const editorBracketHighlightingForeground3 = registerColor('editorBracketHighlight.foreground3', { dark: '#179FFF', light: '#7B3814FF', hcDark: '#87CEFA', hcLight: '#7B3814FF' }, nls.localize('editorBracketHighlightForeground3', 'Foreground color of brackets (3). Requires enabling bracket pair colorization.')); -export const editorBracketHighlightingForeground4 = registerColor('editorBracketHighlight.foreground4', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketHighlightForeground4', 'Foreground color of brackets (4). Requires enabling bracket pair colorization.')); -export const editorBracketHighlightingForeground5 = registerColor('editorBracketHighlight.foreground5', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketHighlightForeground5', 'Foreground color of brackets (5). Requires enabling bracket pair colorization.')); -export const editorBracketHighlightingForeground6 = registerColor('editorBracketHighlight.foreground6', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketHighlightForeground6', 'Foreground color of brackets (6). Requires enabling bracket pair colorization.')); +export const editorBracketHighlightingForeground4 = registerColor('editorBracketHighlight.foreground4', '#00000000', nls.localize('editorBracketHighlightForeground4', 'Foreground color of brackets (4). Requires enabling bracket pair colorization.')); +export const editorBracketHighlightingForeground5 = registerColor('editorBracketHighlight.foreground5', '#00000000', nls.localize('editorBracketHighlightForeground5', 'Foreground color of brackets (5). Requires enabling bracket pair colorization.')); +export const editorBracketHighlightingForeground6 = registerColor('editorBracketHighlight.foreground6', '#00000000', nls.localize('editorBracketHighlightForeground6', 'Foreground color of brackets (6). Requires enabling bracket pair colorization.')); export const editorBracketHighlightingUnexpectedBracketForeground = registerColor('editorBracketHighlight.unexpectedBracket.foreground', { dark: new Color(new RGBA(255, 18, 18, 0.8)), light: new Color(new RGBA(255, 18, 18, 0.8)), hcDark: new Color(new RGBA(255, 50, 50, 1)), hcLight: '' }, nls.localize('editorBracketHighlightUnexpectedBracketForeground', 'Foreground color of unexpected brackets.')); -export const editorBracketPairGuideBackground1 = registerColor('editorBracketPairGuide.background1', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.background1', 'Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideBackground2 = registerColor('editorBracketPairGuide.background2', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.background2', 'Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideBackground3 = registerColor('editorBracketPairGuide.background3', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.background3', 'Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideBackground4 = registerColor('editorBracketPairGuide.background4', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.background4', 'Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideBackground5 = registerColor('editorBracketPairGuide.background5', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.background5', 'Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideBackground6 = registerColor('editorBracketPairGuide.background6', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.background6', 'Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.')); - -export const editorBracketPairGuideActiveBackground1 = registerColor('editorBracketPairGuide.activeBackground1', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.activeBackground1', 'Background color of active bracket pair guides (1). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideActiveBackground2 = registerColor('editorBracketPairGuide.activeBackground2', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.activeBackground2', 'Background color of active bracket pair guides (2). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideActiveBackground3 = registerColor('editorBracketPairGuide.activeBackground3', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.activeBackground3', 'Background color of active bracket pair guides (3). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideActiveBackground4 = registerColor('editorBracketPairGuide.activeBackground4', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.activeBackground4', 'Background color of active bracket pair guides (4). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideActiveBackground5 = registerColor('editorBracketPairGuide.activeBackground5', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.activeBackground5', 'Background color of active bracket pair guides (5). Requires enabling bracket pair guides.')); -export const editorBracketPairGuideActiveBackground6 = registerColor('editorBracketPairGuide.activeBackground6', { dark: '#00000000', light: '#00000000', hcDark: '#00000000', hcLight: '#00000000' }, nls.localize('editorBracketPairGuide.activeBackground6', 'Background color of active bracket pair guides (6). Requires enabling bracket pair guides.')); - -export const editorUnicodeHighlightBorder = registerColor('editorUnicodeHighlight.border', { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningForeground, hcLight: editorWarningForeground }, nls.localize('editorUnicodeHighlight.border', 'Border color used to highlight unicode characters.')); -export const editorUnicodeHighlightBackground = registerColor('editorUnicodeHighlight.background', { dark: editorWarningBackground, light: editorWarningBackground, hcDark: editorWarningBackground, hcLight: editorWarningBackground }, nls.localize('editorUnicodeHighlight.background', 'Background color used to highlight unicode characters.')); +export const editorBracketPairGuideBackground1 = registerColor('editorBracketPairGuide.background1', '#00000000', nls.localize('editorBracketPairGuide.background1', 'Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideBackground2 = registerColor('editorBracketPairGuide.background2', '#00000000', nls.localize('editorBracketPairGuide.background2', 'Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideBackground3 = registerColor('editorBracketPairGuide.background3', '#00000000', nls.localize('editorBracketPairGuide.background3', 'Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideBackground4 = registerColor('editorBracketPairGuide.background4', '#00000000', nls.localize('editorBracketPairGuide.background4', 'Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideBackground5 = registerColor('editorBracketPairGuide.background5', '#00000000', nls.localize('editorBracketPairGuide.background5', 'Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideBackground6 = registerColor('editorBracketPairGuide.background6', '#00000000', nls.localize('editorBracketPairGuide.background6', 'Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.')); + +export const editorBracketPairGuideActiveBackground1 = registerColor('editorBracketPairGuide.activeBackground1', '#00000000', nls.localize('editorBracketPairGuide.activeBackground1', 'Background color of active bracket pair guides (1). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideActiveBackground2 = registerColor('editorBracketPairGuide.activeBackground2', '#00000000', nls.localize('editorBracketPairGuide.activeBackground2', 'Background color of active bracket pair guides (2). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideActiveBackground3 = registerColor('editorBracketPairGuide.activeBackground3', '#00000000', nls.localize('editorBracketPairGuide.activeBackground3', 'Background color of active bracket pair guides (3). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideActiveBackground4 = registerColor('editorBracketPairGuide.activeBackground4', '#00000000', nls.localize('editorBracketPairGuide.activeBackground4', 'Background color of active bracket pair guides (4). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideActiveBackground5 = registerColor('editorBracketPairGuide.activeBackground5', '#00000000', nls.localize('editorBracketPairGuide.activeBackground5', 'Background color of active bracket pair guides (5). Requires enabling bracket pair guides.')); +export const editorBracketPairGuideActiveBackground6 = registerColor('editorBracketPairGuide.activeBackground6', '#00000000', nls.localize('editorBracketPairGuide.activeBackground6', 'Background color of active bracket pair guides (6). Requires enabling bracket pair guides.')); + +export const editorUnicodeHighlightBorder = registerColor('editorUnicodeHighlight.border', editorWarningForeground, nls.localize('editorUnicodeHighlight.border', 'Border color used to highlight unicode characters.')); +export const editorUnicodeHighlightBackground = registerColor('editorUnicodeHighlight.background', editorWarningBackground, nls.localize('editorUnicodeHighlight.background', 'Background color used to highlight unicode characters.')); // contains all color rules that used to defined in editor/browser/widget/editor.css diff --git a/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts index ffd9e3240dd8f..b3530eaa88834 100644 --- a/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts @@ -23,7 +23,7 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; -const overviewRulerBracketMatchForeground = registerColor('editorOverviewRuler.bracketMatchForeground', { dark: '#A0A0A0', light: '#A0A0A0', hcDark: '#A0A0A0', hcLight: '#A0A0A0' }, nls.localize('overviewRulerBracketMatchForeground', 'Overview ruler marker color for matching brackets.')); +const overviewRulerBracketMatchForeground = registerColor('editorOverviewRuler.bracketMatchForeground', '#A0A0A0', nls.localize('overviewRulerBracketMatchForeground', 'Overview ruler marker color for matching brackets.')); class JumpToBracketAction extends EditorAction { constructor() { diff --git a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts index 03a9b4a402c26..b6ae9cd31e266 100644 --- a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts +++ b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts @@ -15,7 +15,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { ThemeIcon } from 'vs/base/common/themables'; const foldBackground = registerColor('editor.foldBackground', { light: transparent(editorSelectionBackground, 0.3), dark: transparent(editorSelectionBackground, 0.3), hcDark: null, hcLight: null }, localize('foldBackgroundBackground', "Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."), true); -registerColor('editorGutter.foldingControlForeground', { dark: iconForeground, light: iconForeground, hcDark: iconForeground, hcLight: iconForeground }, localize('editorGutter.foldingControlForeground', 'Color of the folding control in the editor gutter.')); +registerColor('editorGutter.foldingControlForeground', iconForeground, localize('editorGutter.foldingControlForeground', 'Color of the folding control in the editor gutter.')); export const foldingExpandedIcon = registerIcon('folding-expanded', Codicon.chevronDown, localize('foldingExpandedIcon', 'Icon for expanded ranges in the editor glyph margin.')); export const foldingCollapsedIcon = registerIcon('folding-collapsed', Codicon.chevronRight, localize('foldingCollapsedIcon', 'Icon for collapsed ranges in the editor glyph margin.')); diff --git a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts index 24ffac212bd5f..00f716bb45fae 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts @@ -410,4 +410,4 @@ const editorMarkerNavigationWarningHeader = registerColor('editorMarkerNavigatio const editorMarkerNavigationInfo = registerColor('editorMarkerNavigationInfo.background', { dark: infoDefault, light: infoDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationInfo', 'Editor marker navigation widget info color.')); const editorMarkerNavigationInfoHeader = registerColor('editorMarkerNavigationInfo.headerBackground', { dark: transparent(editorMarkerNavigationInfo, .1), light: transparent(editorMarkerNavigationInfo, .1), hcDark: null, hcLight: null }, nls.localize('editorMarkerNavigationInfoHeaderBackground', 'Editor marker navigation widget info heading background.')); -const editorMarkerNavigationBackground = registerColor('editorMarkerNavigation.background', { dark: editorBackground, light: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, nls.localize('editorMarkerNavigationBackground', 'Editor marker navigation widget background.')); +const editorMarkerNavigationBackground = registerColor('editorMarkerNavigation.background', editorBackground, nls.localize('editorMarkerNavigationBackground', 'Editor marker navigation widget background.')); diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index f5b8af528e3d5..3036277c4487e 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -387,4 +387,4 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { } } -registerColor('editorHoverWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hcDark: listHighlightForeground, hcLight: listHighlightForeground }, nls.localize('editorHoverWidgetHighlightForeground', 'Foreground color of the active item in the parameter hint.')); +registerColor('editorHoverWidget.highlightForeground', listHighlightForeground, nls.localize('editorHoverWidgetHighlightForeground', 'Foreground color of the active item in the parameter hint.')); diff --git a/src/vs/editor/contrib/peekView/browser/peekView.ts b/src/vs/editor/contrib/peekView/browser/peekView.ts index a0f2dfd914ed5..86f6cb1d47f1d 100644 --- a/src/vs/editor/contrib/peekView/browser/peekView.ts +++ b/src/vs/editor/contrib/peekView/browser/peekView.ts @@ -289,8 +289,8 @@ export const peekViewResultsFileForeground = registerColor('peekViewResult.fileF export const peekViewResultsSelectionBackground = registerColor('peekViewResult.selectionBackground', { dark: '#3399ff33', light: '#3399ff33', hcDark: null, hcLight: null }, nls.localize('peekViewResultsSelectionBackground', 'Background color of the selected entry in the peek view result list.')); export const peekViewResultsSelectionForeground = registerColor('peekViewResult.selectionForeground', { dark: Color.white, light: '#6C6C6C', hcDark: Color.white, hcLight: editorForeground }, nls.localize('peekViewResultsSelectionForeground', 'Foreground color of the selected entry in the peek view result list.')); export const peekViewEditorBackground = registerColor('peekViewEditor.background', { dark: '#001F33', light: '#F2F8FC', hcDark: Color.black, hcLight: Color.white }, nls.localize('peekViewEditorBackground', 'Background color of the peek view editor.')); -export const peekViewEditorGutterBackground = registerColor('peekViewEditorGutter.background', { dark: peekViewEditorBackground, light: peekViewEditorBackground, hcDark: peekViewEditorBackground, hcLight: peekViewEditorBackground }, nls.localize('peekViewEditorGutterBackground', 'Background color of the gutter in the peek view editor.')); -export const peekViewEditorStickyScrollBackground = registerColor('peekViewEditorStickyScroll.background', { dark: peekViewEditorBackground, light: peekViewEditorBackground, hcDark: peekViewEditorBackground, hcLight: peekViewEditorBackground }, nls.localize('peekViewEditorStickScrollBackground', 'Background color of sticky scroll in the peek view editor.')); +export const peekViewEditorGutterBackground = registerColor('peekViewEditorGutter.background', peekViewEditorBackground, nls.localize('peekViewEditorGutterBackground', 'Background color of the gutter in the peek view editor.')); +export const peekViewEditorStickyScrollBackground = registerColor('peekViewEditorStickyScroll.background', peekViewEditorBackground, nls.localize('peekViewEditorStickScrollBackground', 'Background color of sticky scroll in the peek view editor.')); export const peekViewResultsMatchHighlight = registerColor('peekViewResult.matchHighlightBackground', { dark: '#ea5c004d', light: '#ea5c004d', hcDark: null, hcLight: null }, nls.localize('peekViewResultsMatchHighlight', 'Match highlight color in the peek view result list.')); export const peekViewEditorMatchHighlight = registerColor('peekViewEditor.matchHighlightBackground', { dark: '#ff8f0099', light: '#f5d802de', hcDark: null, hcLight: null }, nls.localize('peekViewEditorMatchHighlight', 'Match highlight color in the peek view editor.')); diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 2eeb94d99b610..2d30e5925ab13 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -39,15 +39,15 @@ import { status } from 'vs/base/browser/ui/aria/aria'; /** * Suggest widget colors */ -registerColor('editorSuggestWidget.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, nls.localize('editorSuggestWidgetBackground', 'Background color of the suggest widget.')); -registerColor('editorSuggestWidget.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, nls.localize('editorSuggestWidgetBorder', 'Border color of the suggest widget.')); -const editorSuggestWidgetForeground = registerColor('editorSuggestWidget.foreground', { dark: editorForeground, light: editorForeground, hcDark: editorForeground, hcLight: editorForeground }, nls.localize('editorSuggestWidgetForeground', 'Foreground color of the suggest widget.')); -registerColor('editorSuggestWidget.selectedForeground', { dark: quickInputListFocusForeground, light: quickInputListFocusForeground, hcDark: quickInputListFocusForeground, hcLight: quickInputListFocusForeground }, nls.localize('editorSuggestWidgetSelectedForeground', 'Foreground color of the selected entry in the suggest widget.')); -registerColor('editorSuggestWidget.selectedIconForeground', { dark: quickInputListFocusIconForeground, light: quickInputListFocusIconForeground, hcDark: quickInputListFocusIconForeground, hcLight: quickInputListFocusIconForeground }, nls.localize('editorSuggestWidgetSelectedIconForeground', 'Icon foreground color of the selected entry in the suggest widget.')); -export const editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', { dark: quickInputListFocusBackground, light: quickInputListFocusBackground, hcDark: quickInputListFocusBackground, hcLight: quickInputListFocusBackground }, nls.localize('editorSuggestWidgetSelectedBackground', 'Background color of the selected entry in the suggest widget.')); -registerColor('editorSuggestWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hcDark: listHighlightForeground, hcLight: listHighlightForeground }, nls.localize('editorSuggestWidgetHighlightForeground', 'Color of the match highlights in the suggest widget.')); -registerColor('editorSuggestWidget.focusHighlightForeground', { dark: listFocusHighlightForeground, light: listFocusHighlightForeground, hcDark: listFocusHighlightForeground, hcLight: listFocusHighlightForeground }, nls.localize('editorSuggestWidgetFocusHighlightForeground', 'Color of the match highlights in the suggest widget when an item is focused.')); -registerColor('editorSuggestWidgetStatus.foreground', { dark: transparent(editorSuggestWidgetForeground, .5), light: transparent(editorSuggestWidgetForeground, .5), hcDark: transparent(editorSuggestWidgetForeground, .5), hcLight: transparent(editorSuggestWidgetForeground, .5) }, nls.localize('editorSuggestWidgetStatusForeground', 'Foreground color of the suggest widget status.')); +registerColor('editorSuggestWidget.background', editorWidgetBackground, nls.localize('editorSuggestWidgetBackground', 'Background color of the suggest widget.')); +registerColor('editorSuggestWidget.border', editorWidgetBorder, nls.localize('editorSuggestWidgetBorder', 'Border color of the suggest widget.')); +const editorSuggestWidgetForeground = registerColor('editorSuggestWidget.foreground', editorForeground, nls.localize('editorSuggestWidgetForeground', 'Foreground color of the suggest widget.')); +registerColor('editorSuggestWidget.selectedForeground', quickInputListFocusForeground, nls.localize('editorSuggestWidgetSelectedForeground', 'Foreground color of the selected entry in the suggest widget.')); +registerColor('editorSuggestWidget.selectedIconForeground', quickInputListFocusIconForeground, nls.localize('editorSuggestWidgetSelectedIconForeground', 'Icon foreground color of the selected entry in the suggest widget.')); +export const editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', quickInputListFocusBackground, nls.localize('editorSuggestWidgetSelectedBackground', 'Background color of the selected entry in the suggest widget.')); +registerColor('editorSuggestWidget.highlightForeground', listHighlightForeground, nls.localize('editorSuggestWidgetHighlightForeground', 'Color of the match highlights in the suggest widget.')); +registerColor('editorSuggestWidget.focusHighlightForeground', listFocusHighlightForeground, nls.localize('editorSuggestWidgetFocusHighlightForeground', 'Color of the match highlights in the suggest widget when an item is focused.')); +registerColor('editorSuggestWidgetStatus.foreground', transparent(editorSuggestWidgetForeground, .5), nls.localize('editorSuggestWidgetStatusForeground', 'Foreground color of the suggest widget status.')); const enum State { Hidden, diff --git a/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts index 64ccb1bc61897..7d6fe4b73f6a7 100644 --- a/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts +++ b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts @@ -7,19 +7,9 @@ import 'vs/css!./symbolIcons'; import { localize } from 'vs/nls'; import { foreground, registerColor } from 'vs/platform/theme/common/colorRegistry'; -export const SYMBOL_ICON_ARRAY_FOREGROUND = registerColor('symbolIcon.arrayForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground, -}, localize('symbolIcon.arrayForeground', 'The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_BOOLEAN_FOREGROUND = registerColor('symbolIcon.booleanForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground, -}, localize('symbolIcon.booleanForeground', 'The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_ARRAY_FOREGROUND = registerColor('symbolIcon.arrayForeground', foreground, localize('symbolIcon.arrayForeground', 'The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_BOOLEAN_FOREGROUND = registerColor('symbolIcon.booleanForeground', foreground, localize('symbolIcon.booleanForeground', 'The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); export const SYMBOL_ICON_CLASS_FOREGROUND = registerColor('symbolIcon.classForeground', { dark: '#EE9D28', @@ -28,19 +18,9 @@ export const SYMBOL_ICON_CLASS_FOREGROUND = registerColor('symbolIcon.classForeg hcLight: '#D67E00' }, localize('symbolIcon.classForeground', 'The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_COLOR_FOREGROUND = registerColor('symbolIcon.colorForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.colorForeground', 'The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_COLOR_FOREGROUND = registerColor('symbolIcon.colorForeground', foreground, localize('symbolIcon.colorForeground', 'The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_CONSTANT_FOREGROUND = registerColor('symbolIcon.constantForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.constantForeground', 'The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_CONSTANT_FOREGROUND = registerColor('symbolIcon.constantForeground', foreground, localize('symbolIcon.constantForeground', 'The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); export const SYMBOL_ICON_CONSTRUCTOR_FOREGROUND = registerColor('symbolIcon.constructorForeground', { dark: '#B180D7', @@ -77,19 +57,9 @@ export const SYMBOL_ICON_FIELD_FOREGROUND = registerColor('symbolIcon.fieldForeg hcLight: '#007ACC' }, localize('symbolIcon.fieldForeground', 'The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_FILE_FOREGROUND = registerColor('symbolIcon.fileForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.fileForeground', 'The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_FILE_FOREGROUND = registerColor('symbolIcon.fileForeground', foreground, localize('symbolIcon.fileForeground', 'The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_FOLDER_FOREGROUND = registerColor('symbolIcon.folderForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.folderForeground', 'The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_FOLDER_FOREGROUND = registerColor('symbolIcon.folderForeground', foreground, localize('symbolIcon.folderForeground', 'The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); export const SYMBOL_ICON_FUNCTION_FOREGROUND = registerColor('symbolIcon.functionForeground', { dark: '#B180D7', @@ -105,19 +75,9 @@ export const SYMBOL_ICON_INTERFACE_FOREGROUND = registerColor('symbolIcon.interf hcLight: '#007ACC' }, localize('symbolIcon.interfaceForeground', 'The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_KEY_FOREGROUND = registerColor('symbolIcon.keyForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.keyForeground', 'The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_KEY_FOREGROUND = registerColor('symbolIcon.keyForeground', foreground, localize('symbolIcon.keyForeground', 'The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_KEYWORD_FOREGROUND = registerColor('symbolIcon.keywordForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.keywordForeground', 'The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_KEYWORD_FOREGROUND = registerColor('symbolIcon.keywordForeground', foreground, localize('symbolIcon.keywordForeground', 'The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); export const SYMBOL_ICON_METHOD_FOREGROUND = registerColor('symbolIcon.methodForeground', { dark: '#B180D7', @@ -126,110 +86,35 @@ export const SYMBOL_ICON_METHOD_FOREGROUND = registerColor('symbolIcon.methodFor hcLight: '#652D90' }, localize('symbolIcon.methodForeground', 'The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); -export const SYMBOL_ICON_MODULE_FOREGROUND = registerColor('symbolIcon.moduleForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.moduleForeground', 'The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_NAMESPACE_FOREGROUND = registerColor('symbolIcon.namespaceForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.namespaceForeground', 'The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_NULL_FOREGROUND = registerColor('symbolIcon.nullForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.nullForeground', 'The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_NUMBER_FOREGROUND = registerColor('symbolIcon.numberForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.numberForeground', 'The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_OBJECT_FOREGROUND = registerColor('symbolIcon.objectForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.objectForeground', 'The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_OPERATOR_FOREGROUND = registerColor('symbolIcon.operatorForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.operatorForeground', 'The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_PACKAGE_FOREGROUND = registerColor('symbolIcon.packageForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.packageForeground', 'The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_PROPERTY_FOREGROUND = registerColor('symbolIcon.propertyForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.propertyForeground', 'The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_REFERENCE_FOREGROUND = registerColor('symbolIcon.referenceForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.referenceForeground', 'The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_SNIPPET_FOREGROUND = registerColor('symbolIcon.snippetForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.snippetForeground', 'The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_STRING_FOREGROUND = registerColor('symbolIcon.stringForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.stringForeground', 'The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_STRUCT_FOREGROUND = registerColor('symbolIcon.structForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground, -}, localize('symbolIcon.structForeground', 'The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_TEXT_FOREGROUND = registerColor('symbolIcon.textForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.textForeground', 'The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_TYPEPARAMETER_FOREGROUND = registerColor('symbolIcon.typeParameterForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.typeParameterForeground', 'The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -export const SYMBOL_ICON_UNIT_FOREGROUND = registerColor('symbolIcon.unitForeground', { - dark: foreground, - light: foreground, - hcDark: foreground, - hcLight: foreground -}, localize('symbolIcon.unitForeground', 'The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); +export const SYMBOL_ICON_MODULE_FOREGROUND = registerColor('symbolIcon.moduleForeground', foreground, localize('symbolIcon.moduleForeground', 'The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_NAMESPACE_FOREGROUND = registerColor('symbolIcon.namespaceForeground', foreground, localize('symbolIcon.namespaceForeground', 'The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_NULL_FOREGROUND = registerColor('symbolIcon.nullForeground', foreground, localize('symbolIcon.nullForeground', 'The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_NUMBER_FOREGROUND = registerColor('symbolIcon.numberForeground', foreground, localize('symbolIcon.numberForeground', 'The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_OBJECT_FOREGROUND = registerColor('symbolIcon.objectForeground', foreground, localize('symbolIcon.objectForeground', 'The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_OPERATOR_FOREGROUND = registerColor('symbolIcon.operatorForeground', foreground, localize('symbolIcon.operatorForeground', 'The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_PACKAGE_FOREGROUND = registerColor('symbolIcon.packageForeground', foreground, localize('symbolIcon.packageForeground', 'The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_PROPERTY_FOREGROUND = registerColor('symbolIcon.propertyForeground', foreground, localize('symbolIcon.propertyForeground', 'The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_REFERENCE_FOREGROUND = registerColor('symbolIcon.referenceForeground', foreground, localize('symbolIcon.referenceForeground', 'The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_SNIPPET_FOREGROUND = registerColor('symbolIcon.snippetForeground', foreground, localize('symbolIcon.snippetForeground', 'The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_STRING_FOREGROUND = registerColor('symbolIcon.stringForeground', foreground, localize('symbolIcon.stringForeground', 'The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_STRUCT_FOREGROUND = registerColor('symbolIcon.structForeground', foreground, localize('symbolIcon.structForeground', 'The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_TEXT_FOREGROUND = registerColor('symbolIcon.textForeground', foreground, localize('symbolIcon.textForeground', 'The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_TYPEPARAMETER_FOREGROUND = registerColor('symbolIcon.typeParameterForeground', foreground, localize('symbolIcon.typeParameterForeground', 'The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); + +export const SYMBOL_ICON_UNIT_FOREGROUND = registerColor('symbolIcon.unitForeground', foreground, localize('symbolIcon.unitForeground', 'The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); export const SYMBOL_ICON_VARIABLE_FOREGROUND = registerColor('symbolIcon.variableForeground', { dark: '#75BEFF', diff --git a/src/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.ts b/src/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.ts index b3825b0f05d73..79ec7ad02e684 100644 --- a/src/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.ts +++ b/src/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.ts @@ -13,13 +13,13 @@ import { registerThemingParticipant, themeColorFromId } from 'vs/platform/theme/ const wordHighlightBackground = registerColor('editor.wordHighlightBackground', { dark: '#575757B8', light: '#57575740', hcDark: null, hcLight: null }, nls.localize('wordHighlight', 'Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.'), true); registerColor('editor.wordHighlightStrongBackground', { dark: '#004972B8', light: '#0e639c40', hcDark: null, hcLight: null }, nls.localize('wordHighlightStrong', 'Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.'), true); -registerColor('editor.wordHighlightTextBackground', { light: wordHighlightBackground, dark: wordHighlightBackground, hcDark: wordHighlightBackground, hcLight: wordHighlightBackground }, nls.localize('wordHighlightText', 'Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.'), true); +registerColor('editor.wordHighlightTextBackground', wordHighlightBackground, nls.localize('wordHighlightText', 'Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.'), true); const wordHighlightBorder = registerColor('editor.wordHighlightBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, nls.localize('wordHighlightBorder', 'Border color of a symbol during read-access, like reading a variable.')); registerColor('editor.wordHighlightStrongBorder', { light: null, dark: null, hcDark: activeContrastBorder, hcLight: activeContrastBorder }, nls.localize('wordHighlightStrongBorder', 'Border color of a symbol during write-access, like writing to a variable.')); -registerColor('editor.wordHighlightTextBorder', { light: wordHighlightBorder, dark: wordHighlightBorder, hcDark: wordHighlightBorder, hcLight: wordHighlightBorder }, nls.localize('wordHighlightTextBorder', "Border color of a textual occurrence for a symbol.")); -const overviewRulerWordHighlightForeground = registerColor('editorOverviewRuler.wordHighlightForeground', { dark: '#A0A0A0CC', light: '#A0A0A0CC', hcDark: '#A0A0A0CC', hcLight: '#A0A0A0CC' }, nls.localize('overviewRulerWordHighlightForeground', 'Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true); -const overviewRulerWordHighlightStrongForeground = registerColor('editorOverviewRuler.wordHighlightStrongForeground', { dark: '#C0A0C0CC', light: '#C0A0C0CC', hcDark: '#C0A0C0CC', hcLight: '#C0A0C0CC' }, nls.localize('overviewRulerWordHighlightStrongForeground', 'Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true); -const overviewRulerWordHighlightTextForeground = registerColor('editorOverviewRuler.wordHighlightTextForeground', { dark: overviewRulerSelectionHighlightForeground, light: overviewRulerSelectionHighlightForeground, hcDark: overviewRulerSelectionHighlightForeground, hcLight: overviewRulerSelectionHighlightForeground }, nls.localize('overviewRulerWordHighlightTextForeground', 'Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.'), true); +registerColor('editor.wordHighlightTextBorder', wordHighlightBorder, nls.localize('wordHighlightTextBorder', "Border color of a textual occurrence for a symbol.")); +const overviewRulerWordHighlightForeground = registerColor('editorOverviewRuler.wordHighlightForeground', '#A0A0A0CC', nls.localize('overviewRulerWordHighlightForeground', 'Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true); +const overviewRulerWordHighlightStrongForeground = registerColor('editorOverviewRuler.wordHighlightStrongForeground', '#C0A0C0CC', nls.localize('overviewRulerWordHighlightStrongForeground', 'Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true); +const overviewRulerWordHighlightTextForeground = registerColor('editorOverviewRuler.wordHighlightTextForeground', overviewRulerSelectionHighlightForeground, nls.localize('overviewRulerWordHighlightTextForeground', 'Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.'), true); const _WRITE_OPTIONS = ModelDecorationOptions.register({ description: 'word-highlight-strong', diff --git a/src/vs/platform/actionWidget/browser/actionWidget.ts b/src/vs/platform/actionWidget/browser/actionWidget.ts index e7b26382eaeba..20a030b67ab5f 100644 --- a/src/vs/platform/actionWidget/browser/actionWidget.ts +++ b/src/vs/platform/actionWidget/browser/actionWidget.ts @@ -21,7 +21,7 @@ import { inputActiveOptionBackground, registerColor } from 'vs/platform/theme/co registerColor( 'actionBar.toggledBackground', - { dark: inputActiveOptionBackground, light: inputActiveOptionBackground, hcDark: inputActiveOptionBackground, hcLight: inputActiveOptionBackground, }, + inputActiveOptionBackground, localize('actionBar.toggledBackground', 'Background color for toggled action items in action bar.') ); diff --git a/src/vs/platform/theme/common/colorUtils.ts b/src/vs/platform/theme/common/colorUtils.ts index 0f21708a437d4..14ceea8847b5c 100644 --- a/src/vs/platform/theme/common/colorUtils.ts +++ b/src/vs/platform/theme/common/colorUtils.ts @@ -20,7 +20,7 @@ export type ColorIdentifier = string; export interface ColorContribution { readonly id: ColorIdentifier; readonly description: string; - readonly defaults: ColorDefaults | null; + readonly defaults: ColorDefaults | ColorValue | null; readonly needsTransparency: boolean; readonly deprecationMessage: string | undefined; } @@ -62,10 +62,6 @@ export type ColorTransform = | { op: ColorTransformType.LessProminent; value: ColorValue; background: ColorValue; factor: number; transparency: number } | { op: ColorTransformType.IfDefinedThenElse; if: ColorIdentifier; then: ColorValue; else: ColorValue }; -export function isColorTransform(value: unknown): value is ColorTransform { - return typeof value === 'object' && !!value && 'op' in value && typeof value.op === 'number'; -} - export interface ColorDefaults { light: ColorValue | null; dark: ColorValue | null; @@ -73,16 +69,15 @@ export interface ColorDefaults { hcLight: ColorValue | null; } +export function isColorDefaults(value: unknown): value is ColorDefaults { + return value !== null && typeof value === 'object' && 'light' in value && 'dark' in value; +} /** * A Color Value is either a color literal, a reference to an other color or a derived color */ export type ColorValue = Color | string | ColorIdentifier | ColorTransform; -export function isColorValue(value: unknown): value is ColorValue { - return typeof value === 'string' || value instanceof Color || isColorTransform(value); -} - // color registry export const Extensions = { ColorContribution: 'base.contributions.colors' @@ -161,7 +156,7 @@ class ColorRegistry implements IColorRegistry { this._onDidChangeSchema.fire(); } - public registerColor(id: string, defaults: ColorDefaults | null, description: string, needsTransparency = false, deprecationMessage?: string): ColorIdentifier { + public registerColor(id: string, defaults: ColorDefaults | ColorValue | null, description: string, needsTransparency = false, deprecationMessage?: string): ColorIdentifier { const colorContribution: ColorContribution = { id, description, defaults, needsTransparency, deprecationMessage }; this.colorsById[id] = colorContribution; const propertySchema: IJSONSchemaWithSnippets = { type: 'string', description, format: 'color-hex', defaultSnippets: [{ body: '${1:#ff0000}' }] }; @@ -203,8 +198,8 @@ class ColorRegistry implements IColorRegistry { public resolveDefaultColor(id: ColorIdentifier, theme: IColorTheme): Color | undefined { const colorDesc = this.colorsById[id]; - if (colorDesc && colorDesc.defaults) { - const colorValue = colorDesc.defaults[theme.type]; + if (colorDesc?.defaults) { + const colorValue = isColorDefaults(colorDesc.defaults) ? colorDesc.defaults[theme.type] : colorDesc.defaults; return resolveColorValue(colorValue, theme); } return undefined; @@ -238,14 +233,6 @@ platform.Registry.add(Extensions.ColorContribution, colorRegistry); export function registerColor(id: string, defaults: ColorDefaults | ColorValue | null, description: string, needsTransparency?: boolean, deprecationMessage?: string): ColorIdentifier { - if (isColorValue(defaults)) { - defaults = { - dark: defaults, - light: defaults, - hcDark: defaults, - hcLight: defaults - } satisfies ColorDefaults; - } return colorRegistry.registerColor(id, defaults, description, needsTransparency, deprecationMessage); } diff --git a/src/vs/platform/theme/common/colors/baseColors.ts b/src/vs/platform/theme/common/colors/baseColors.ts index 1d19b3adc1fc4..baf6b86f27f16 100644 --- a/src/vs/platform/theme/common/colors/baseColors.ts +++ b/src/vs/platform/theme/common/colors/baseColors.ts @@ -43,7 +43,7 @@ export const activeContrastBorder = registerColor('contrastActiveBorder', nls.localize('activeContrastBorder', "An extra border around active elements to separate them from others for greater contrast.")); export const selectionBackground = registerColor('selection.background', - { light: null, dark: null, hcDark: null, hcLight: null }, + null, nls.localize('selectionBackground', "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.")); diff --git a/src/vs/platform/theme/common/colors/chartsColors.ts b/src/vs/platform/theme/common/colors/chartsColors.ts index eb63b6022347d..a35e296d2ad2c 100644 --- a/src/vs/platform/theme/common/colors/chartsColors.ts +++ b/src/vs/platform/theme/common/colors/chartsColors.ts @@ -12,27 +12,27 @@ import { minimapFindMatch } from 'vs/platform/theme/common/colors/minimapColors' export const chartsForeground = registerColor('charts.foreground', - { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, + foreground, nls.localize('chartsForeground', "The foreground color used in charts.")); export const chartsLines = registerColor('charts.lines', - { dark: transparent(foreground, .5), light: transparent(foreground, .5), hcDark: transparent(foreground, .5), hcLight: transparent(foreground, .5) }, + transparent(foreground, .5), nls.localize('chartsLines', "The color used for horizontal lines in charts.")); export const chartsRed = registerColor('charts.red', - { dark: editorErrorForeground, light: editorErrorForeground, hcDark: editorErrorForeground, hcLight: editorErrorForeground }, + editorErrorForeground, nls.localize('chartsRed', "The red color used in chart visualizations.")); export const chartsBlue = registerColor('charts.blue', - { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoForeground, hcLight: editorInfoForeground }, + editorInfoForeground, nls.localize('chartsBlue', "The blue color used in chart visualizations.")); export const chartsYellow = registerColor('charts.yellow', - { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningForeground, hcLight: editorWarningForeground }, + editorWarningForeground, nls.localize('chartsYellow', "The yellow color used in chart visualizations.")); export const chartsOrange = registerColor('charts.orange', - { dark: minimapFindMatch, light: minimapFindMatch, hcDark: minimapFindMatch, hcLight: minimapFindMatch }, + minimapFindMatch, nls.localize('chartsOrange', "The orange color used in chart visualizations.")); export const chartsGreen = registerColor('charts.green', diff --git a/src/vs/platform/theme/common/colors/editorColors.ts b/src/vs/platform/theme/common/colors/editorColors.ts index a57b85e2c29ca..cac6dea162ccb 100644 --- a/src/vs/platform/theme/common/colors/editorColors.ts +++ b/src/vs/platform/theme/common/colors/editorColors.ts @@ -26,7 +26,7 @@ export const editorForeground = registerColor('editor.foreground', export const editorStickyScrollBackground = registerColor('editorStickyScroll.background', - { light: editorBackground, dark: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, + editorBackground, nls.localize('editorStickyScrollBackground', "Background color of sticky scroll in the editor")); export const editorStickyScrollHoverBackground = registerColor('editorStickyScrollHover.background', @@ -38,7 +38,7 @@ export const editorStickyScrollBorder = registerColor('editorStickyScroll.border nls.localize('editorStickyScrollBorder', "Border color of sticky scroll in the editor")); export const editorStickyScrollShadow = registerColor('editorStickyScroll.shadow', - { dark: scrollbarShadow, light: scrollbarShadow, hcDark: scrollbarShadow, hcLight: scrollbarShadow }, + scrollbarShadow, nls.localize('editorStickyScrollShadow', " Shadow color of sticky scroll in the editor")); @@ -47,7 +47,7 @@ export const editorWidgetBackground = registerColor('editorWidget.background', nls.localize('editorWidgetBackground', 'Background color of editor widgets, such as find/replace.')); export const editorWidgetForeground = registerColor('editorWidget.foreground', - { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, + foreground, nls.localize('editorWidgetForeground', 'Foreground color of editor widgets, such as find/replace.')); export const editorWidgetBorder = registerColor('editorWidget.border', @@ -55,12 +55,12 @@ export const editorWidgetBorder = registerColor('editorWidget.border', nls.localize('editorWidgetBorder', 'Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.')); export const editorWidgetResizeBorder = registerColor('editorWidget.resizeBorder', - { light: null, dark: null, hcDark: null, hcLight: null }, + null, nls.localize('editorWidgetResizeBorder', "Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")); export const editorErrorBackground = registerColor('editorError.background', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('editorError.background', 'Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true); export const editorErrorForeground = registerColor('editorError.foreground', @@ -73,7 +73,7 @@ export const editorErrorBorder = registerColor('editorError.border', export const editorWarningBackground = registerColor('editorWarning.background', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('editorWarning.background', 'Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true); export const editorWarningForeground = registerColor('editorWarning.foreground', @@ -86,7 +86,7 @@ export const editorWarningBorder = registerColor('editorWarning.border', export const editorInfoBackground = registerColor('editorInfo.background', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('editorInfo.background', 'Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.'), true); export const editorInfoForeground = registerColor('editorInfo.foreground', @@ -142,7 +142,7 @@ export const editorFindMatch = registerColor('editor.findMatchBackground', nls.localize('editorFindMatch', "Color of the current search match.")); export const editorFindMatchForeground = registerColor('editor.findMatchForeground', - { light: null, dark: null, hcDark: null, hcLight: null }, + null, nls.localize('editorFindMatchForeground', "Text color of the current search match.")); export const editorFindMatchHighlight = registerColor('editor.findMatchHighlightBackground', @@ -150,7 +150,7 @@ export const editorFindMatchHighlight = registerColor('editor.findMatchHighlight nls.localize('findMatchHighlight', "Color of the other search matches. The color must not be opaque so as not to hide underlying decorations."), true); export const editorFindMatchHighlightForeground = registerColor('editor.findMatchHighlightForeground', - { light: null, dark: null, hcDark: null, hcLight: null }, + null, nls.localize('findMatchHighlightForeground', "Foreground color of the other search matches."), true); export const editorFindRangeHighlight = registerColor('editor.findRangeHighlightBackground', @@ -177,15 +177,15 @@ export const editorHoverHighlight = registerColor('editor.hoverHighlightBackgrou nls.localize('hoverHighlight', 'Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations.'), true); export const editorHoverBackground = registerColor('editorHoverWidget.background', - { light: editorWidgetBackground, dark: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, + editorWidgetBackground, nls.localize('hoverBackground', 'Background color of the editor hover.')); export const editorHoverForeground = registerColor('editorHoverWidget.foreground', - { light: editorWidgetForeground, dark: editorWidgetForeground, hcDark: editorWidgetForeground, hcLight: editorWidgetForeground }, + editorWidgetForeground, nls.localize('hoverForeground', 'Foreground color of the editor hover.')); export const editorHoverBorder = registerColor('editorHoverWidget.border', - { light: editorWidgetBorder, dark: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, + editorWidgetBorder, nls.localize('hoverBorder', 'Border color of the editor hover.')); export const editorHoverStatusBarBackground = registerColor('editorHoverWidget.statusBarBackground', @@ -204,19 +204,19 @@ export const editorInlayHintBackground = registerColor('editorInlayHint.backgrou nls.localize('editorInlayHintBackground', 'Background color of inline hints')); export const editorInlayHintTypeForeground = registerColor('editorInlayHint.typeForeground', - { dark: editorInlayHintForeground, light: editorInlayHintForeground, hcDark: editorInlayHintForeground, hcLight: editorInlayHintForeground }, + editorInlayHintForeground, nls.localize('editorInlayHintForegroundTypes', 'Foreground color of inline hints for types')); export const editorInlayHintTypeBackground = registerColor('editorInlayHint.typeBackground', - { dark: editorInlayHintBackground, light: editorInlayHintBackground, hcDark: editorInlayHintBackground, hcLight: editorInlayHintBackground }, + editorInlayHintBackground, nls.localize('editorInlayHintBackgroundTypes', 'Background color of inline hints for types')); export const editorInlayHintParameterForeground = registerColor('editorInlayHint.parameterForeground', - { dark: editorInlayHintForeground, light: editorInlayHintForeground, hcDark: editorInlayHintForeground, hcLight: editorInlayHintForeground }, + editorInlayHintForeground, nls.localize('editorInlayHintForegroundParameter', 'Foreground color of inline hints for parameters')); export const editorInlayHintParameterBackground = registerColor('editorInlayHint.parameterBackground', - { dark: editorInlayHintBackground, light: editorInlayHintBackground, hcDark: editorInlayHintBackground, hcLight: editorInlayHintBackground }, + editorInlayHintBackground, nls.localize('editorInlayHintBackgroundParameter', 'Background color of inline hints for parameters')); @@ -231,7 +231,7 @@ export const editorLightBulbAutoFixForeground = registerColor('editorLightBulbAu nls.localize('editorLightBulbAutoFixForeground', "The color used for the lightbulb auto fix actions icon.")); export const editorLightBulbAiForeground = registerColor('editorLightBulbAi.foreground', - { dark: editorLightBulbForeground, light: editorLightBulbForeground, hcDark: editorLightBulbForeground, hcLight: editorLightBulbForeground }, + editorLightBulbForeground, nls.localize('editorLightBulbAiForeground', "The color used for the lightbulb AI icon.")); @@ -242,11 +242,11 @@ export const snippetTabstopHighlightBackground = registerColor('editor.snippetTa nls.localize('snippetTabstopHighlightBackground', "Highlight background color of a snippet tabstop.")); export const snippetTabstopHighlightBorder = registerColor('editor.snippetTabstopHighlightBorder', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('snippetTabstopHighlightBorder', "Highlight border color of a snippet tabstop.")); export const snippetFinalTabstopHighlightBackground = registerColor('editor.snippetFinalTabstopHighlightBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('snippetFinalTabstopHighlightBackground', "Highlight background color of the final tabstop of a snippet.")); export const snippetFinalTabstopHighlightBorder = registerColor('editor.snippetFinalTabstopHighlightBorder', @@ -278,20 +278,20 @@ export const diffRemovedLine = registerColor('diffEditor.removedLineBackground', export const diffInsertedLineGutter = registerColor('diffEditorGutter.insertedLineBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('diffEditorInsertedLineGutter', 'Background color for the margin where lines got inserted.')); export const diffRemovedLineGutter = registerColor('diffEditorGutter.removedLineBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('diffEditorRemovedLineGutter', 'Background color for the margin where lines got removed.')); export const diffOverviewRulerInserted = registerColor('diffEditorOverview.insertedForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('diffEditorOverviewInserted', 'Diff overview ruler foreground for inserted content.')); export const diffOverviewRulerRemoved = registerColor('diffEditorOverview.removedForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('diffEditorOverviewRemoved', 'Diff overview ruler foreground for removed content.')); @@ -314,11 +314,11 @@ export const diffDiagonalFill = registerColor('diffEditor.diagonalFill', export const diffUnchangedRegionBackground = registerColor('diffEditor.unchangedRegionBackground', - { dark: 'sideBar.background', light: 'sideBar.background', hcDark: 'sideBar.background', hcLight: 'sideBar.background' }, + 'sideBar.background', nls.localize('diffEditor.unchangedRegionBackground', "The background color of unchanged blocks in the diff editor.")); export const diffUnchangedRegionForeground = registerColor('diffEditor.unchangedRegionForeground', - { dark: 'foreground', light: 'foreground', hcDark: 'foreground', hcLight: 'foreground' }, + 'foreground', nls.localize('diffEditor.unchangedRegionForeground', "The foreground color of unchanged blocks in the diff editor.")); export const diffUnchangedTextBackground = registerColor('diffEditor.unchangedCodeBackground', @@ -355,11 +355,11 @@ export const toolbarActiveBackground = registerColor('toolbar.activeBackground', // ----- breadcumbs export const breadcrumbsForeground = registerColor('breadcrumb.foreground', - { light: transparent(foreground, 0.8), dark: transparent(foreground, 0.8), hcDark: transparent(foreground, 0.8), hcLight: transparent(foreground, 0.8) }, + transparent(foreground, 0.8), nls.localize('breadcrumbsFocusForeground', "Color of focused breadcrumb items.")); export const breadcrumbsBackground = registerColor('breadcrumb.background', - { light: editorBackground, dark: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, + editorBackground, nls.localize('breadcrumbsBackground', "Background color of breadcrumb items.")); export const breadcrumbsFocusForeground = registerColor('breadcrumb.focusForeground', @@ -371,7 +371,7 @@ export const breadcrumbsActiveSelectionForeground = registerColor('breadcrumb.ac nls.localize('breadcrumbsSelectedForeground', "Color of selected breadcrumb items.")); export const breadcrumbsPickerBackground = registerColor('breadcrumbPicker.background', - { light: editorWidgetBackground, dark: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, + editorWidgetBackground, nls.localize('breadcrumbsSelectedBackground', "Background color of breadcrumb item picker.")); @@ -389,7 +389,7 @@ export const mergeCurrentHeaderBackground = registerColor('merge.currentHeaderBa nls.localize('mergeCurrentHeaderBackground', 'Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true); export const mergeCurrentContentBackground = registerColor('merge.currentContentBackground', - { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hcDark: transparent(mergeCurrentHeaderBackground, contentTransparency), hcLight: transparent(mergeCurrentHeaderBackground, contentTransparency) }, + transparent(mergeCurrentHeaderBackground, contentTransparency), nls.localize('mergeCurrentContentBackground', 'Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true); export const mergeIncomingHeaderBackground = registerColor('merge.incomingHeaderBackground', @@ -397,7 +397,7 @@ export const mergeIncomingHeaderBackground = registerColor('merge.incomingHeader nls.localize('mergeIncomingHeaderBackground', 'Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true); export const mergeIncomingContentBackground = registerColor('merge.incomingContentBackground', - { dark: transparent(mergeIncomingHeaderBackground, contentTransparency), light: transparent(mergeIncomingHeaderBackground, contentTransparency), hcDark: transparent(mergeIncomingHeaderBackground, contentTransparency), hcLight: transparent(mergeIncomingHeaderBackground, contentTransparency) }, + transparent(mergeIncomingHeaderBackground, contentTransparency), nls.localize('mergeIncomingContentBackground', 'Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true); export const mergeCommonHeaderBackground = registerColor('merge.commonHeaderBackground', @@ -405,7 +405,7 @@ export const mergeCommonHeaderBackground = registerColor('merge.commonHeaderBack nls.localize('mergeCommonHeaderBackground', 'Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true); export const mergeCommonContentBackground = registerColor('merge.commonContentBackground', - { dark: transparent(mergeCommonHeaderBackground, contentTransparency), light: transparent(mergeCommonHeaderBackground, contentTransparency), hcDark: transparent(mergeCommonHeaderBackground, contentTransparency), hcLight: transparent(mergeCommonHeaderBackground, contentTransparency) }, + transparent(mergeCommonHeaderBackground, contentTransparency), nls.localize('mergeCommonContentBackground', 'Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.'), true); export const mergeBorder = registerColor('merge.border', @@ -430,20 +430,20 @@ export const overviewRulerFindMatchForeground = registerColor('editorOverviewRul nls.localize('overviewRulerFindMatchForeground', 'Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.'), true); export const overviewRulerSelectionHighlightForeground = registerColor('editorOverviewRuler.selectionHighlightForeground', - { dark: '#A0A0A0CC', light: '#A0A0A0CC', hcDark: '#A0A0A0CC', hcLight: '#A0A0A0CC' }, + '#A0A0A0CC', nls.localize('overviewRulerSelectionHighlightForeground', 'Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.'), true); // ----- problems export const problemsErrorIconForeground = registerColor('problemsErrorIcon.foreground', - { dark: editorErrorForeground, light: editorErrorForeground, hcDark: editorErrorForeground, hcLight: editorErrorForeground }, + editorErrorForeground, nls.localize('problemsErrorIconForeground', "The color used for the problems error icon.")); export const problemsWarningIconForeground = registerColor('problemsWarningIcon.foreground', - { dark: editorWarningForeground, light: editorWarningForeground, hcDark: editorWarningForeground, hcLight: editorWarningForeground }, + editorWarningForeground, nls.localize('problemsWarningIconForeground', "The color used for the problems warning icon.")); export const problemsInfoIconForeground = registerColor('problemsInfoIcon.foreground', - { dark: editorInfoForeground, light: editorInfoForeground, hcDark: editorInfoForeground, hcLight: editorInfoForeground }, + editorInfoForeground, nls.localize('problemsInfoIconForeground', "The color used for the problems info icon.")); diff --git a/src/vs/platform/theme/common/colors/inputColors.ts b/src/vs/platform/theme/common/colors/inputColors.ts index dc38222d402d0..c79c1d2840b8e 100644 --- a/src/vs/platform/theme/common/colors/inputColors.ts +++ b/src/vs/platform/theme/common/colors/inputColors.ts @@ -21,7 +21,7 @@ export const inputBackground = registerColor('input.background', nls.localize('inputBoxBackground', "Input box background.")); export const inputForeground = registerColor('input.foreground', - { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, + foreground, nls.localize('inputBoxForeground', "Input box foreground.")); export const inputBorder = registerColor('input.border', @@ -110,11 +110,11 @@ export const selectBorder = registerColor('dropdown.border', // ------ button export const buttonForeground = registerColor('button.foreground', - { dark: Color.white, light: Color.white, hcDark: Color.white, hcLight: Color.white }, + Color.white, nls.localize('buttonForeground', "Button foreground color.")); export const buttonSeparator = registerColor('button.separator', - { dark: transparent(buttonForeground, .4), light: transparent(buttonForeground, .4), hcDark: transparent(buttonForeground, .4), hcLight: transparent(buttonForeground, .4) }, + transparent(buttonForeground, .4), nls.localize('buttonSeparator', "Button separator color.")); export const buttonBackground = registerColor('button.background', @@ -126,7 +126,7 @@ export const buttonHoverBackground = registerColor('button.hoverBackground', nls.localize('buttonHoverBackground', "Button background color when hovering.")); export const buttonBorder = registerColor('button.border', - { dark: contrastBorder, light: contrastBorder, hcDark: contrastBorder, hcLight: contrastBorder }, + contrastBorder, nls.localize('buttonBorder', "Button border color.")); export const buttonSecondaryForeground = registerColor('button.secondaryForeground', @@ -145,23 +145,23 @@ export const buttonSecondaryHoverBackground = registerColor('button.secondaryHov // ------ checkbox export const checkboxBackground = registerColor('checkbox.background', - { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, + selectBackground, nls.localize('checkbox.background', "Background color of checkbox widget.")); export const checkboxSelectBackground = registerColor('checkbox.selectBackground', - { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, + editorWidgetBackground, nls.localize('checkbox.select.background', "Background color of checkbox widget when the element it's in is selected.")); export const checkboxForeground = registerColor('checkbox.foreground', - { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, + selectForeground, nls.localize('checkbox.foreground', "Foreground color of checkbox widget.")); export const checkboxBorder = registerColor('checkbox.border', - { dark: selectBorder, light: selectBorder, hcDark: selectBorder, hcLight: selectBorder }, + selectBorder, nls.localize('checkbox.border', "Border color of checkbox widget.")); export const checkboxSelectBorder = registerColor('checkbox.selectBorder', - { dark: iconForeground, light: iconForeground, hcDark: iconForeground, hcLight: iconForeground }, + iconForeground, nls.localize('checkbox.select.border', "Border color of checkbox widget when the element it's in is selected.")); diff --git a/src/vs/platform/theme/common/colors/listColors.ts b/src/vs/platform/theme/common/colors/listColors.ts index b6f51e3696b07..dd5c405199c80 100644 --- a/src/vs/platform/theme/common/colors/listColors.ts +++ b/src/vs/platform/theme/common/colors/listColors.ts @@ -15,11 +15,11 @@ import { editorWidgetBackground, editorFindMatchHighlightBorder, editorFindMatch export const listFocusBackground = registerColor('list.focusBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listFocusBackground', "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listFocusForeground = registerColor('list.focusForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listFocusForeground', "List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listFocusOutline = registerColor('list.focusOutline', @@ -27,7 +27,7 @@ export const listFocusOutline = registerColor('list.focusOutline', nls.localize('listFocusOutline', "List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listFocusAndSelectionOutline = registerColor('list.focusAndSelectionOutline', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listFocusAndSelectionOutline', "List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.")); export const listActiveSelectionBackground = registerColor('list.activeSelectionBackground', @@ -39,7 +39,7 @@ export const listActiveSelectionForeground = registerColor('list.activeSelection nls.localize('listActiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listActiveSelectionIconForeground = registerColor('list.activeSelectionIconForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listActiveSelectionIconForeground', "List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionBackground = registerColor('list.inactiveSelectionBackground', @@ -47,19 +47,19 @@ export const listInactiveSelectionBackground = registerColor('list.inactiveSelec nls.localize('listInactiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionForeground = registerColor('list.inactiveSelectionForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listInactiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionIconForeground = registerColor('list.inactiveSelectionIconForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listInactiveSelectionIconForeground', "List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveFocusBackground = registerColor('list.inactiveFocusBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listInactiveFocusBackground', "List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveFocusOutline = registerColor('list.inactiveFocusOutline', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listInactiveFocusOutline', "List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listHoverBackground = registerColor('list.hoverBackground', @@ -67,7 +67,7 @@ export const listHoverBackground = registerColor('list.hoverBackground', nls.localize('listHoverBackground', "List/Tree background when hovering over items using the mouse.")); export const listHoverForeground = registerColor('list.hoverForeground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('listHoverForeground', "List/Tree foreground when hovering over items using the mouse.")); export const listDropOverBackground = registerColor('list.dropBackground', @@ -109,7 +109,7 @@ export const listFilterWidgetNoMatchesOutline = registerColor('listFilterWidget. nls.localize('listFilterWidgetNoMatchesOutline', 'Outline color of the type filter widget in lists and trees, when there are no matches.')); export const listFilterWidgetShadow = registerColor('listFilterWidget.shadow', - { dark: widgetShadow, light: widgetShadow, hcDark: widgetShadow, hcLight: widgetShadow }, + widgetShadow, nls.localize('listFilterWidgetShadow', 'Shadow color of the type filter widget in lists and trees.')); export const listFilterMatchHighlight = registerColor('list.filterMatchBackground', @@ -132,7 +132,7 @@ export const treeIndentGuidesStroke = registerColor('tree.indentGuidesStroke', nls.localize('treeIndentGuidesStroke', "Tree stroke color for the indentation guides.")); export const treeInactiveIndentGuidesStroke = registerColor('tree.inactiveIndentGuidesStroke', - { dark: transparent(treeIndentGuidesStroke, 0.4), light: transparent(treeIndentGuidesStroke, 0.4), hcDark: transparent(treeIndentGuidesStroke, 0.4), hcLight: transparent(treeIndentGuidesStroke, 0.4) }, + transparent(treeIndentGuidesStroke, 0.4), nls.localize('treeInactiveIndentGuidesStroke', "Tree stroke color for the indentation guides that are not active.")); diff --git a/src/vs/platform/theme/common/colors/menuColors.ts b/src/vs/platform/theme/common/colors/menuColors.ts index 6fa9a0ec3267a..05bf549195248 100644 --- a/src/vs/platform/theme/common/colors/menuColors.ts +++ b/src/vs/platform/theme/common/colors/menuColors.ts @@ -19,19 +19,19 @@ export const menuBorder = registerColor('menu.border', nls.localize('menuBorder', "Border color of menus.")); export const menuForeground = registerColor('menu.foreground', - { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, + selectForeground, nls.localize('menuForeground', "Foreground color of menu items.")); export const menuBackground = registerColor('menu.background', - { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, + selectBackground, nls.localize('menuBackground', "Background color of menu items.")); export const menuSelectionForeground = registerColor('menu.selectionForeground', - { dark: listActiveSelectionForeground, light: listActiveSelectionForeground, hcDark: listActiveSelectionForeground, hcLight: listActiveSelectionForeground }, + listActiveSelectionForeground, nls.localize('menuSelectionForeground', "Foreground color of the selected menu item in menus.")); export const menuSelectionBackground = registerColor('menu.selectionBackground', - { dark: listActiveSelectionBackground, light: listActiveSelectionBackground, hcDark: listActiveSelectionBackground, hcLight: listActiveSelectionBackground }, + listActiveSelectionBackground, nls.localize('menuSelectionBackground', "Background color of the selected menu item in menus.")); export const menuSelectionBorder = registerColor('menu.selectionBorder', diff --git a/src/vs/platform/theme/common/colors/minimapColors.ts b/src/vs/platform/theme/common/colors/minimapColors.ts index 0b051994d09d3..ade38578c28ad 100644 --- a/src/vs/platform/theme/common/colors/minimapColors.ts +++ b/src/vs/platform/theme/common/colors/minimapColors.ts @@ -39,21 +39,21 @@ export const minimapError = registerColor('minimap.errorHighlight', nls.localize('minimapError', 'Minimap marker color for errors.')); export const minimapBackground = registerColor('minimap.background', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, nls.localize('minimapBackground', "Minimap background color.")); export const minimapForegroundOpacity = registerColor('minimap.foregroundOpacity', - { dark: Color.fromHex('#000f'), light: Color.fromHex('#000f'), hcDark: Color.fromHex('#000f'), hcLight: Color.fromHex('#000f') }, + Color.fromHex('#000f'), nls.localize('minimapForegroundOpacity', 'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')); export const minimapSliderBackground = registerColor('minimapSlider.background', - { light: transparent(scrollbarSliderBackground, 0.5), dark: transparent(scrollbarSliderBackground, 0.5), hcDark: transparent(scrollbarSliderBackground, 0.5), hcLight: transparent(scrollbarSliderBackground, 0.5) }, + transparent(scrollbarSliderBackground, 0.5), nls.localize('minimapSliderBackground', "Minimap slider background color.")); export const minimapSliderHoverBackground = registerColor('minimapSlider.hoverBackground', - { light: transparent(scrollbarSliderHoverBackground, 0.5), dark: transparent(scrollbarSliderHoverBackground, 0.5), hcDark: transparent(scrollbarSliderHoverBackground, 0.5), hcLight: transparent(scrollbarSliderHoverBackground, 0.5) }, + transparent(scrollbarSliderHoverBackground, 0.5), nls.localize('minimapSliderHoverBackground', "Minimap slider background color when hovering.")); export const minimapSliderActiveBackground = registerColor('minimapSlider.activeBackground', - { light: transparent(scrollbarSliderActiveBackground, 0.5), dark: transparent(scrollbarSliderActiveBackground, 0.5), hcDark: transparent(scrollbarSliderActiveBackground, 0.5), hcLight: transparent(scrollbarSliderActiveBackground, 0.5) }, + transparent(scrollbarSliderActiveBackground, 0.5), nls.localize('minimapSliderActiveBackground', "Minimap slider background color when clicked on.")); diff --git a/src/vs/platform/theme/common/colors/miscColors.ts b/src/vs/platform/theme/common/colors/miscColors.ts index 5a2ea49b7026b..42a00e23e6ae8 100644 --- a/src/vs/platform/theme/common/colors/miscColors.ts +++ b/src/vs/platform/theme/common/colors/miscColors.ts @@ -16,7 +16,7 @@ import { contrastBorder, focusBorder } from 'vs/platform/theme/common/colors/bas // ----- sash export const sashHoverBorder = registerColor('sash.hoverBorder', - { dark: focusBorder, light: focusBorder, hcDark: focusBorder, hcLight: focusBorder }, + focusBorder, nls.localize('sashActiveBorder', "Border color of active sashes.")); diff --git a/src/vs/platform/theme/common/colors/quickpickColors.ts b/src/vs/platform/theme/common/colors/quickpickColors.ts index 7f8fc271a6e0c..3b109a21872ae 100644 --- a/src/vs/platform/theme/common/colors/quickpickColors.ts +++ b/src/vs/platform/theme/common/colors/quickpickColors.ts @@ -15,11 +15,11 @@ import { listActiveSelectionBackground, listActiveSelectionForeground, listActiv export const quickInputBackground = registerColor('quickInput.background', - { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, + editorWidgetBackground, nls.localize('pickerBackground', "Quick picker background color. The quick picker widget is the container for pickers like the command palette.")); export const quickInputForeground = registerColor('quickInput.foreground', - { dark: editorWidgetForeground, light: editorWidgetForeground, hcDark: editorWidgetForeground, hcLight: editorWidgetForeground }, + editorWidgetForeground, nls.localize('pickerForeground', "Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.")); export const quickInputTitleBackground = registerColor('quickInputTitle.background', @@ -35,15 +35,15 @@ export const pickerGroupBorder = registerColor('pickerGroup.border', nls.localize('pickerGroupBorder', "Quick picker color for grouping borders.")); export const _deprecatedQuickInputListFocusBackground = registerColor('quickInput.list.focusBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, '', undefined, + null, '', undefined, nls.localize('quickInput.list.focusBackground deprecation', "Please use quickInputList.focusBackground instead")); export const quickInputListFocusForeground = registerColor('quickInputList.focusForeground', - { dark: listActiveSelectionForeground, light: listActiveSelectionForeground, hcDark: listActiveSelectionForeground, hcLight: listActiveSelectionForeground }, + listActiveSelectionForeground, nls.localize('quickInput.listFocusForeground', "Quick picker foreground color for the focused item.")); export const quickInputListFocusIconForeground = registerColor('quickInputList.focusIconForeground', - { dark: listActiveSelectionIconForeground, light: listActiveSelectionIconForeground, hcDark: listActiveSelectionIconForeground, hcLight: listActiveSelectionIconForeground }, + listActiveSelectionIconForeground, nls.localize('quickInput.listFocusIconForeground', "Quick picker icon foreground color for the focused item.")); export const quickInputListFocusBackground = registerColor('quickInputList.focusBackground', diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 3412f81c3bfbc..1e6aba052fd54 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -28,19 +28,9 @@ export function WORKBENCH_BACKGROUND(theme: IColorTheme): Color { //#region Tab Background -export const TAB_ACTIVE_BACKGROUND = registerColor('tab.activeBackground', { - dark: editorBackground, - light: editorBackground, - hcDark: editorBackground, - hcLight: editorBackground -}, localize('tabActiveBackground', "Active tab background color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); - -export const TAB_UNFOCUSED_ACTIVE_BACKGROUND = registerColor('tab.unfocusedActiveBackground', { - dark: TAB_ACTIVE_BACKGROUND, - light: TAB_ACTIVE_BACKGROUND, - hcDark: TAB_ACTIVE_BACKGROUND, - hcLight: TAB_ACTIVE_BACKGROUND, -}, localize('tabUnfocusedActiveBackground', "Active tab background color in an unfocused group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_ACTIVE_BACKGROUND = registerColor('tab.activeBackground', editorBackground, localize('tabActiveBackground', "Active tab background color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + +export const TAB_UNFOCUSED_ACTIVE_BACKGROUND = registerColor('tab.unfocusedActiveBackground', TAB_ACTIVE_BACKGROUND, localize('tabUnfocusedActiveBackground', "Active tab background color in an unfocused group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); export const TAB_INACTIVE_BACKGROUND = registerColor('tab.inactiveBackground', { dark: '#2D2D2D', @@ -49,12 +39,7 @@ export const TAB_INACTIVE_BACKGROUND = registerColor('tab.inactiveBackground', { hcLight: null, }, localize('tabInactiveBackground', "Inactive tab background color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); -export const TAB_UNFOCUSED_INACTIVE_BACKGROUND = registerColor('tab.unfocusedInactiveBackground', { - dark: TAB_INACTIVE_BACKGROUND, - light: TAB_INACTIVE_BACKGROUND, - hcDark: TAB_INACTIVE_BACKGROUND, - hcLight: TAB_INACTIVE_BACKGROUND -}, localize('tabUnfocusedInactiveBackground', "Inactive tab background color in an unfocused group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_UNFOCUSED_INACTIVE_BACKGROUND = registerColor('tab.unfocusedInactiveBackground', TAB_INACTIVE_BACKGROUND, localize('tabUnfocusedInactiveBackground', "Inactive tab background color in an unfocused group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); //#endregion @@ -92,12 +77,7 @@ export const TAB_UNFOCUSED_INACTIVE_FOREGROUND = registerColor('tab.unfocusedIna //#region Tab Hover Foreground/Background -export const TAB_HOVER_BACKGROUND = registerColor('tab.hoverBackground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('tabHoverBackground', "Tab background color when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_HOVER_BACKGROUND = registerColor('tab.hoverBackground', null, localize('tabHoverBackground', "Tab background color when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); export const TAB_UNFOCUSED_HOVER_BACKGROUND = registerColor('tab.unfocusedHoverBackground', { dark: transparent(TAB_HOVER_BACKGROUND, 0.5), @@ -106,12 +86,7 @@ export const TAB_UNFOCUSED_HOVER_BACKGROUND = registerColor('tab.unfocusedHoverB hcLight: null }, localize('tabUnfocusedHoverBackground', "Tab background color in an unfocused group when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); -export const TAB_HOVER_FOREGROUND = registerColor('tab.hoverForeground', { - dark: null, - light: null, - hcDark: null, - hcLight: null, -}, localize('tabHoverForeground', "Tab foreground color when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_HOVER_FOREGROUND = registerColor('tab.hoverForeground', null, localize('tabHoverForeground', "Tab foreground color when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); export const TAB_UNFOCUSED_HOVER_FOREGROUND = registerColor('tab.unfocusedHoverForeground', { dark: transparent(TAB_HOVER_FOREGROUND, 0.5), @@ -138,12 +113,7 @@ export const TAB_LAST_PINNED_BORDER = registerColor('tab.lastPinnedBorder', { hcLight: contrastBorder }, localize('lastPinnedTabBorder', "Border to separate pinned tabs from other tabs. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); -export const TAB_ACTIVE_BORDER = registerColor('tab.activeBorder', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('tabActiveBorder', "Border on the bottom of an active tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_ACTIVE_BORDER = registerColor('tab.activeBorder', null, localize('tabActiveBorder', "Border on the bottom of an active tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); export const TAB_UNFOCUSED_ACTIVE_BORDER = registerColor('tab.unfocusedActiveBorder', { dark: transparent(TAB_ACTIVE_BORDER, 0.5), @@ -166,34 +136,14 @@ export const TAB_UNFOCUSED_ACTIVE_BORDER_TOP = registerColor('tab.unfocusedActiv hcLight: '#B5200D' }, localize('tabActiveUnfocusedBorderTop', "Border to the top of an active tab in an unfocused group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); -export const TAB_SELECTED_BORDER_TOP = registerColor('tab.selectedBorderTop', { - dark: TAB_ACTIVE_BORDER_TOP, - light: TAB_ACTIVE_BORDER_TOP, - hcDark: TAB_ACTIVE_BORDER_TOP, - hcLight: TAB_ACTIVE_BORDER_TOP -}, localize('tabSelectedBorderTop', "Border to the top of a selected tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); - -export const TAB_SELECTED_BACKGROUND = registerColor('tab.selectedBackground', { - dark: TAB_ACTIVE_BACKGROUND, - light: TAB_ACTIVE_BACKGROUND, - hcDark: TAB_ACTIVE_BACKGROUND, - hcLight: TAB_ACTIVE_BACKGROUND -}, localize('tabSelectedBackground', "Background of a selected tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); - -export const TAB_SELECTED_FOREGROUND = registerColor('tab.selectedForeground', { - dark: TAB_ACTIVE_FOREGROUND, - light: TAB_ACTIVE_FOREGROUND, - hcDark: TAB_ACTIVE_FOREGROUND, - hcLight: TAB_ACTIVE_FOREGROUND -}, localize('tabSelectedForeground', "Foreground of a selected tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_SELECTED_BORDER_TOP = registerColor('tab.selectedBorderTop', TAB_ACTIVE_BORDER_TOP, localize('tabSelectedBorderTop', "Border to the top of a selected tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_SELECTED_BACKGROUND = registerColor('tab.selectedBackground', TAB_ACTIVE_BACKGROUND, localize('tabSelectedBackground', "Background of a selected tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); -export const TAB_HOVER_BORDER = registerColor('tab.hoverBorder', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('tabHoverBorder', "Border to highlight tabs when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +export const TAB_SELECTED_FOREGROUND = registerColor('tab.selectedForeground', TAB_ACTIVE_FOREGROUND, localize('tabSelectedForeground', "Foreground of a selected tab. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + + +export const TAB_HOVER_BORDER = registerColor('tab.hoverBorder', null, localize('tabHoverBorder', "Border to highlight tabs when hovering. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); export const TAB_UNFOCUSED_HOVER_BORDER = registerColor('tab.unfocusedHoverBorder', { dark: transparent(TAB_HOVER_BORDER, 0.5), @@ -249,19 +199,9 @@ export const TAB_UNFOCUSED_INACTIVE_MODIFIED_BORDER = registerColor('tab.unfocus // < --- Editors --- > -export const EDITOR_PANE_BACKGROUND = registerColor('editorPane.background', { - dark: editorBackground, - light: editorBackground, - hcDark: editorBackground, - hcLight: editorBackground -}, localize('editorPaneBackground', "Background color of the editor pane visible on the left and right side of the centered editor layout.")); +export const EDITOR_PANE_BACKGROUND = registerColor('editorPane.background', editorBackground, localize('editorPaneBackground', "Background color of the editor pane visible on the left and right side of the centered editor layout.")); -export const EDITOR_GROUP_EMPTY_BACKGROUND = registerColor('editorGroup.emptyBackground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('editorGroupEmptyBackground', "Background color of an empty editor group. Editor groups are the containers of editors.")); +export const EDITOR_GROUP_EMPTY_BACKGROUND = registerColor('editorGroup.emptyBackground', null, localize('editorGroupEmptyBackground', "Background color of an empty editor group. Editor groups are the containers of editors.")); export const EDITOR_GROUP_FOCUSED_EMPTY_BORDER = registerColor('editorGroup.focusedEmptyBorder', { dark: null, @@ -277,19 +217,9 @@ export const EDITOR_GROUP_HEADER_TABS_BACKGROUND = registerColor('editorGroupHea hcLight: null }, localize('tabsContainerBackground', "Background color of the editor group title header when tabs are enabled. Editor groups are the containers of editors.")); -export const EDITOR_GROUP_HEADER_TABS_BORDER = registerColor('editorGroupHeader.tabsBorder', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('tabsContainerBorder', "Border color of the editor group title header when tabs are enabled. Editor groups are the containers of editors.")); +export const EDITOR_GROUP_HEADER_TABS_BORDER = registerColor('editorGroupHeader.tabsBorder', null, localize('tabsContainerBorder', "Border color of the editor group title header when tabs are enabled. Editor groups are the containers of editors.")); -export const EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND = registerColor('editorGroupHeader.noTabsBackground', { - dark: editorBackground, - light: editorBackground, - hcDark: editorBackground, - hcLight: editorBackground -}, localize('editorGroupHeaderBackground', "Background color of the editor group title header when (`\"workbench.editor.showTabs\": \"single\"`). Editor groups are the containers of editors.")); +export const EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND = registerColor('editorGroupHeader.noTabsBackground', editorBackground, localize('editorGroupHeaderBackground', "Background color of the editor group title header when (`\"workbench.editor.showTabs\": \"single\"`). Editor groups are the containers of editors.")); export const EDITOR_GROUP_HEADER_BORDER = registerColor('editorGroupHeader.border', { dark: null, @@ -312,19 +242,9 @@ export const EDITOR_DRAG_AND_DROP_BACKGROUND = registerColor('editorGroup.dropBa hcLight: Color.fromHex('#0F4A85').transparent(0.50) }, localize('editorDragAndDropBackground', "Background color when dragging editors around. The color should have transparency so that the editor contents can still shine through.")); -export const EDITOR_DROP_INTO_PROMPT_FOREGROUND = registerColor('editorGroup.dropIntoPromptForeground', { - dark: editorWidgetForeground, - light: editorWidgetForeground, - hcDark: editorWidgetForeground, - hcLight: editorWidgetForeground -}, localize('editorDropIntoPromptForeground', "Foreground color of text shown over editors when dragging files. This text informs the user that they can hold shift to drop into the editor.")); +export const EDITOR_DROP_INTO_PROMPT_FOREGROUND = registerColor('editorGroup.dropIntoPromptForeground', editorWidgetForeground, localize('editorDropIntoPromptForeground', "Foreground color of text shown over editors when dragging files. This text informs the user that they can hold shift to drop into the editor.")); -export const EDITOR_DROP_INTO_PROMPT_BACKGROUND = registerColor('editorGroup.dropIntoPromptBackground', { - dark: editorWidgetBackground, - light: editorWidgetBackground, - hcDark: editorWidgetBackground, - hcLight: editorWidgetBackground -}, localize('editorDropIntoPromptBackground', "Background color of text shown over editors when dragging files. This text informs the user that they can hold shift to drop into the editor.")); +export const EDITOR_DROP_INTO_PROMPT_BACKGROUND = registerColor('editorGroup.dropIntoPromptBackground', editorWidgetBackground, localize('editorDropIntoPromptBackground', "Background color of text shown over editors when dragging files. This text informs the user that they can hold shift to drop into the editor.")); export const EDITOR_DROP_INTO_PROMPT_BORDER = registerColor('editorGroup.dropIntoPromptBorder', { dark: null, @@ -333,28 +253,13 @@ export const EDITOR_DROP_INTO_PROMPT_BORDER = registerColor('editorGroup.dropInt hcLight: contrastBorder }, localize('editorDropIntoPromptBorder', "Border color of text shown over editors when dragging files. This text informs the user that they can hold shift to drop into the editor.")); -export const SIDE_BY_SIDE_EDITOR_HORIZONTAL_BORDER = registerColor('sideBySideEditor.horizontalBorder', { - dark: EDITOR_GROUP_BORDER, - light: EDITOR_GROUP_BORDER, - hcDark: EDITOR_GROUP_BORDER, - hcLight: EDITOR_GROUP_BORDER -}, localize('sideBySideEditor.horizontalBorder', "Color to separate two editors from each other when shown side by side in an editor group from top to bottom.")); +export const SIDE_BY_SIDE_EDITOR_HORIZONTAL_BORDER = registerColor('sideBySideEditor.horizontalBorder', EDITOR_GROUP_BORDER, localize('sideBySideEditor.horizontalBorder', "Color to separate two editors from each other when shown side by side in an editor group from top to bottom.")); -export const SIDE_BY_SIDE_EDITOR_VERTICAL_BORDER = registerColor('sideBySideEditor.verticalBorder', { - dark: EDITOR_GROUP_BORDER, - light: EDITOR_GROUP_BORDER, - hcDark: EDITOR_GROUP_BORDER, - hcLight: EDITOR_GROUP_BORDER -}, localize('sideBySideEditor.verticalBorder', "Color to separate two editors from each other when shown side by side in an editor group from left to right.")); +export const SIDE_BY_SIDE_EDITOR_VERTICAL_BORDER = registerColor('sideBySideEditor.verticalBorder', EDITOR_GROUP_BORDER, localize('sideBySideEditor.verticalBorder', "Color to separate two editors from each other when shown side by side in an editor group from left to right.")); // < --- Panels --- > -export const PANEL_BACKGROUND = registerColor('panel.background', { - dark: editorBackground, - light: editorBackground, - hcDark: editorBackground, - hcLight: editorBackground -}, localize('panelBackground', "Panel background color. Panels are shown below the editor area and contain views like output and integrated terminal.")); +export const PANEL_BACKGROUND = registerColor('panel.background', editorBackground, localize('panelBackground', "Panel background color. Panels are shown below the editor area and contain views like output and integrated terminal.")); export const PANEL_BORDER = registerColor('panel.border', { dark: Color.fromHex('#808080').transparent(0.35), @@ -391,19 +296,9 @@ export const PANEL_INPUT_BORDER = registerColor('panelInput.border', { hcLight: inputBorder }, localize('panelInputBorder', "Input box border for inputs in the panel.")); -export const PANEL_DRAG_AND_DROP_BORDER = registerColor('panel.dropBorder', { - dark: PANEL_ACTIVE_TITLE_FOREGROUND, - light: PANEL_ACTIVE_TITLE_FOREGROUND, - hcDark: PANEL_ACTIVE_TITLE_FOREGROUND, - hcLight: PANEL_ACTIVE_TITLE_FOREGROUND -}, localize('panelDragAndDropBorder', "Drag and drop feedback color for the panel titles. Panels are shown below the editor area and contain views like output and integrated terminal.")); +export const PANEL_DRAG_AND_DROP_BORDER = registerColor('panel.dropBorder', PANEL_ACTIVE_TITLE_FOREGROUND, localize('panelDragAndDropBorder', "Drag and drop feedback color for the panel titles. Panels are shown below the editor area and contain views like output and integrated terminal.")); -export const PANEL_SECTION_DRAG_AND_DROP_BACKGROUND = registerColor('panelSection.dropBackground', { - dark: EDITOR_DRAG_AND_DROP_BACKGROUND, - light: EDITOR_DRAG_AND_DROP_BACKGROUND, - hcDark: EDITOR_DRAG_AND_DROP_BACKGROUND, - hcLight: EDITOR_DRAG_AND_DROP_BACKGROUND -}, localize('panelSectionDragAndDropBackground', "Drag and drop feedback color for the panel sections. The color should have transparency so that the panel sections can still shine through. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); +export const PANEL_SECTION_DRAG_AND_DROP_BACKGROUND = registerColor('panelSection.dropBackground', EDITOR_DRAG_AND_DROP_BACKGROUND, localize('panelSectionDragAndDropBackground', "Drag and drop feedback color for the panel sections. The color should have transparency so that the panel sections can still shine through. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); export const PANEL_SECTION_HEADER_BACKGROUND = registerColor('panelSectionHeader.background', { dark: Color.fromHex('#808080').transparent(0.2), @@ -412,64 +307,24 @@ export const PANEL_SECTION_HEADER_BACKGROUND = registerColor('panelSectionHeader hcLight: null, }, localize('panelSectionHeaderBackground', "Panel section header background color. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); -export const PANEL_SECTION_HEADER_FOREGROUND = registerColor('panelSectionHeader.foreground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('panelSectionHeaderForeground', "Panel section header foreground color. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); +export const PANEL_SECTION_HEADER_FOREGROUND = registerColor('panelSectionHeader.foreground', null, localize('panelSectionHeaderForeground', "Panel section header foreground color. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); -export const PANEL_SECTION_HEADER_BORDER = registerColor('panelSectionHeader.border', { - dark: contrastBorder, - light: contrastBorder, - hcDark: contrastBorder, - hcLight: contrastBorder -}, localize('panelSectionHeaderBorder', "Panel section header border color used when multiple views are stacked vertically in the panel. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); - -export const PANEL_SECTION_BORDER = registerColor('panelSection.border', { - dark: PANEL_BORDER, - light: PANEL_BORDER, - hcDark: PANEL_BORDER, - hcLight: PANEL_BORDER -}, localize('panelSectionBorder', "Panel section border color used when multiple views are stacked horizontally in the panel. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); - -export const PANEL_STICKY_SCROLL_BACKGROUND = registerColor('panelStickyScroll.background', { - dark: PANEL_BACKGROUND, - light: PANEL_BACKGROUND, - hcDark: PANEL_BACKGROUND, - hcLight: PANEL_BACKGROUND -}, localize('panelStickyScrollBackground', "Background color of sticky scroll in the panel.")); - -export const PANEL_STICKY_SCROLL_BORDER = registerColor('panelStickyScroll.border', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('panelStickyScrollBorder', "Border color of sticky scroll in the panel.")); +export const PANEL_SECTION_HEADER_BORDER = registerColor('panelSectionHeader.border', contrastBorder, localize('panelSectionHeaderBorder', "Panel section header border color used when multiple views are stacked vertically in the panel. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); + +export const PANEL_SECTION_BORDER = registerColor('panelSection.border', PANEL_BORDER, localize('panelSectionBorder', "Panel section border color used when multiple views are stacked horizontally in the panel. Panels are shown below the editor area and contain views like output and integrated terminal. Panel sections are views nested within the panels.")); -export const PANEL_STICKY_SCROLL_SHADOW = registerColor('panelStickyScroll.shadow', { - dark: scrollbarShadow, - light: scrollbarShadow, - hcDark: scrollbarShadow, - hcLight: scrollbarShadow -}, localize('panelStickyScrollShadow', "Shadow color of sticky scroll in the panel.")); +export const PANEL_STICKY_SCROLL_BACKGROUND = registerColor('panelStickyScroll.background', PANEL_BACKGROUND, localize('panelStickyScrollBackground', "Background color of sticky scroll in the panel.")); + +export const PANEL_STICKY_SCROLL_BORDER = registerColor('panelStickyScroll.border', null, localize('panelStickyScrollBorder', "Border color of sticky scroll in the panel.")); + +export const PANEL_STICKY_SCROLL_SHADOW = registerColor('panelStickyScroll.shadow', scrollbarShadow, localize('panelStickyScrollShadow', "Shadow color of sticky scroll in the panel.")); // < --- Output Editor --> -const OUTPUT_VIEW_BACKGROUND = registerColor('outputView.background', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('outputViewBackground', "Output view background color.")); +const OUTPUT_VIEW_BACKGROUND = registerColor('outputView.background', null, localize('outputViewBackground', "Output view background color.")); -registerColor('outputViewStickyScroll.background', { - dark: OUTPUT_VIEW_BACKGROUND, - light: OUTPUT_VIEW_BACKGROUND, - hcDark: OUTPUT_VIEW_BACKGROUND, - hcLight: OUTPUT_VIEW_BACKGROUND -}, localize('outputViewStickyScrollBackground', "Output view sticky scroll background color.")); +registerColor('outputViewStickyScroll.background', OUTPUT_VIEW_BACKGROUND, localize('outputViewStickyScrollBackground', "Output view sticky scroll background color.")); // < --- Banner --- > @@ -481,19 +336,9 @@ export const BANNER_BACKGROUND = registerColor('banner.background', { hcLight: listActiveSelectionBackground }, localize('banner.background', "Banner background color. The banner is shown under the title bar of the window.")); -export const BANNER_FOREGROUND = registerColor('banner.foreground', { - dark: listActiveSelectionForeground, - light: listActiveSelectionForeground, - hcDark: listActiveSelectionForeground, - hcLight: listActiveSelectionForeground -}, localize('banner.foreground', "Banner foreground color. The banner is shown under the title bar of the window.")); +export const BANNER_FOREGROUND = registerColor('banner.foreground', listActiveSelectionForeground, localize('banner.foreground', "Banner foreground color. The banner is shown under the title bar of the window.")); -export const BANNER_ICON_FOREGROUND = registerColor('banner.iconForeground', { - dark: editorInfoForeground, - light: editorInfoForeground, - hcDark: editorInfoForeground, - hcLight: editorInfoForeground -}, localize('banner.iconForeground', "Banner icon color. The banner is shown under the title bar of the window.")); +export const BANNER_ICON_FOREGROUND = registerColor('banner.iconForeground', editorInfoForeground, localize('banner.iconForeground', "Banner icon color. The banner is shown under the title bar of the window.")); // < --- Status --- > @@ -504,12 +349,7 @@ export const STATUS_BAR_FOREGROUND = registerColor('statusBar.foreground', { hcLight: editorForeground }, localize('statusBarForeground', "Status bar foreground color when a workspace or folder is opened. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_NO_FOLDER_FOREGROUND = registerColor('statusBar.noFolderForeground', { - dark: STATUS_BAR_FOREGROUND, - light: STATUS_BAR_FOREGROUND, - hcDark: STATUS_BAR_FOREGROUND, - hcLight: STATUS_BAR_FOREGROUND -}, localize('statusBarNoFolderForeground', "Status bar foreground color when no folder is opened. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_NO_FOLDER_FOREGROUND = registerColor('statusBar.noFolderForeground', STATUS_BAR_FOREGROUND, localize('statusBarNoFolderForeground', "Status bar foreground color when no folder is opened. The status bar is shown in the bottom of the window.")); export const STATUS_BAR_BACKGROUND = registerColor('statusBar.background', { dark: '#007ACC', @@ -539,12 +379,7 @@ export const STATUS_BAR_FOCUS_BORDER = registerColor('statusBar.focusBorder', { hcLight: STATUS_BAR_FOREGROUND }, localize('statusBarFocusBorder', "Status bar border color when focused on keyboard navigation. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_NO_FOLDER_BORDER = registerColor('statusBar.noFolderBorder', { - dark: STATUS_BAR_BORDER, - light: STATUS_BAR_BORDER, - hcDark: STATUS_BAR_BORDER, - hcLight: STATUS_BAR_BORDER -}, localize('statusBarNoFolderBorder', "Status bar border color separating to the sidebar and editor when no folder is opened. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_NO_FOLDER_BORDER = registerColor('statusBar.noFolderBorder', STATUS_BAR_BORDER, localize('statusBarNoFolderBorder', "Status bar border color separating to the sidebar and editor when no folder is opened. The status bar is shown in the bottom of the window.")); export const STATUS_BAR_ITEM_ACTIVE_BACKGROUND = registerColor('statusBarItem.activeBackground', { dark: Color.white.transparent(0.18), @@ -567,12 +402,7 @@ export const STATUS_BAR_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.hov hcLight: Color.black.transparent(0.12) }, localize('statusBarItemHoverBackground', "Status bar item background color when hovering. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.hoverForeground', { - dark: STATUS_BAR_FOREGROUND, - light: STATUS_BAR_FOREGROUND, - hcDark: STATUS_BAR_FOREGROUND, - hcLight: STATUS_BAR_FOREGROUND -}, localize('statusBarItemHoverForeground', "Status bar item foreground color when hovering. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.hoverForeground', STATUS_BAR_FOREGROUND, localize('statusBarItemHoverForeground', "Status bar item foreground color when hovering. The status bar is shown in the bottom of the window.")); export const STATUS_BAR_ITEM_COMPACT_HOVER_BACKGROUND = registerColor('statusBarItem.compactHoverBackground', { dark: Color.white.transparent(0.20), @@ -581,26 +411,11 @@ export const STATUS_BAR_ITEM_COMPACT_HOVER_BACKGROUND = registerColor('statusBar hcLight: Color.black.transparent(0.20) }, localize('statusBarItemCompactHoverBackground', "Status bar item background color when hovering an item that contains two hovers. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_PROMINENT_ITEM_FOREGROUND = registerColor('statusBarItem.prominentForeground', { - dark: STATUS_BAR_FOREGROUND, - light: STATUS_BAR_FOREGROUND, - hcDark: STATUS_BAR_FOREGROUND, - hcLight: STATUS_BAR_FOREGROUND -}, localize('statusBarProminentItemForeground', "Status bar prominent items foreground color. Prominent items stand out from other status bar entries to indicate importance. The status bar is shown in the bottom of the window.")); - -export const STATUS_BAR_PROMINENT_ITEM_BACKGROUND = registerColor('statusBarItem.prominentBackground', { - dark: Color.black.transparent(0.5), - light: Color.black.transparent(0.5), - hcDark: Color.black.transparent(0.5), - hcLight: Color.black.transparent(0.5), -}, localize('statusBarProminentItemBackground', "Status bar prominent items background color. Prominent items stand out from other status bar entries to indicate importance. The status bar is shown in the bottom of the window.")); - -export const STATUS_BAR_PROMINENT_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.prominentHoverForeground', { - dark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - light: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_FOREGROUND -}, localize('statusBarProminentItemHoverForeground', "Status bar prominent items foreground color when hovering. Prominent items stand out from other status bar entries to indicate importance. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_PROMINENT_ITEM_FOREGROUND = registerColor('statusBarItem.prominentForeground', STATUS_BAR_FOREGROUND, localize('statusBarProminentItemForeground', "Status bar prominent items foreground color. Prominent items stand out from other status bar entries to indicate importance. The status bar is shown in the bottom of the window.")); + +export const STATUS_BAR_PROMINENT_ITEM_BACKGROUND = registerColor('statusBarItem.prominentBackground', Color.black.transparent(0.5), localize('statusBarProminentItemBackground', "Status bar prominent items background color. Prominent items stand out from other status bar entries to indicate importance. The status bar is shown in the bottom of the window.")); + +export const STATUS_BAR_PROMINENT_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.prominentHoverForeground', STATUS_BAR_ITEM_HOVER_FOREGROUND, localize('statusBarProminentItemHoverForeground', "Status bar prominent items foreground color when hovering. Prominent items stand out from other status bar entries to indicate importance. The status bar is shown in the bottom of the window.")); export const STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.prominentHoverBackground', { dark: Color.black.transparent(0.3), @@ -616,26 +431,11 @@ export const STATUS_BAR_ERROR_ITEM_BACKGROUND = registerColor('statusBarItem.err hcLight: '#B5200D' }, localize('statusBarErrorItemBackground', "Status bar error items background color. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_ERROR_ITEM_FOREGROUND = registerColor('statusBarItem.errorForeground', { - dark: Color.white, - light: Color.white, - hcDark: Color.white, - hcLight: Color.white -}, localize('statusBarErrorItemForeground', "Status bar error items foreground color. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_ERROR_ITEM_FOREGROUND = registerColor('statusBarItem.errorForeground', Color.white, localize('statusBarErrorItemForeground', "Status bar error items foreground color. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_ERROR_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.errorHoverForeground', { - dark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - light: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_FOREGROUND -}, localize('statusBarErrorItemHoverForeground', "Status bar error items foreground color when hovering. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_ERROR_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.errorHoverForeground', STATUS_BAR_ITEM_HOVER_FOREGROUND, localize('statusBarErrorItemHoverForeground', "Status bar error items foreground color when hovering. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_ERROR_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.errorHoverBackground', { - dark: STATUS_BAR_ITEM_HOVER_BACKGROUND, - light: STATUS_BAR_ITEM_HOVER_BACKGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_BACKGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_BACKGROUND -}, localize('statusBarErrorItemHoverBackground', "Status bar error items background color when hovering. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_ERROR_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.errorHoverBackground', STATUS_BAR_ITEM_HOVER_BACKGROUND, localize('statusBarErrorItemHoverBackground', "Status bar error items background color when hovering. Error items stand out from other status bar entries to indicate error conditions. The status bar is shown in the bottom of the window.")); export const STATUS_BAR_WARNING_ITEM_BACKGROUND = registerColor('statusBarItem.warningBackground', { dark: darken(editorWarningForeground, .4), @@ -644,26 +444,11 @@ export const STATUS_BAR_WARNING_ITEM_BACKGROUND = registerColor('statusBarItem.w hcLight: '#895503' }, localize('statusBarWarningItemBackground', "Status bar warning items background color. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_WARNING_ITEM_FOREGROUND = registerColor('statusBarItem.warningForeground', { - dark: Color.white, - light: Color.white, - hcDark: Color.white, - hcLight: Color.white -}, localize('statusBarWarningItemForeground', "Status bar warning items foreground color. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_WARNING_ITEM_FOREGROUND = registerColor('statusBarItem.warningForeground', Color.white, localize('statusBarWarningItemForeground', "Status bar warning items foreground color. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_WARNING_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.warningHoverForeground', { - dark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - light: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_FOREGROUND -}, localize('statusBarWarningItemHoverForeground', "Status bar warning items foreground color when hovering. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_WARNING_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.warningHoverForeground', STATUS_BAR_ITEM_HOVER_FOREGROUND, localize('statusBarWarningItemHoverForeground', "Status bar warning items foreground color when hovering. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); -export const STATUS_BAR_WARNING_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.warningHoverBackground', { - dark: STATUS_BAR_ITEM_HOVER_BACKGROUND, - light: STATUS_BAR_ITEM_HOVER_BACKGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_BACKGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_BACKGROUND -}, localize('statusBarWarningItemHoverBackground', "Status bar warning items background color when hovering. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_WARNING_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.warningHoverBackground', STATUS_BAR_ITEM_HOVER_BACKGROUND, localize('statusBarWarningItemHoverBackground', "Status bar warning items background color when hovering. Warning items stand out from other status bar entries to indicate warning conditions. The status bar is shown in the bottom of the window.")); // < --- Activity Bar --- > @@ -710,12 +495,7 @@ export const ACTIVITY_BAR_ACTIVE_FOCUS_BORDER = registerColor('activityBar.activ hcLight: '#B5200D' }, localize('activityBarActiveFocusBorder', "Activity bar focus border color for the active item. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); -export const ACTIVITY_BAR_ACTIVE_BACKGROUND = registerColor('activityBar.activeBackground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('activityBarActiveBackground', "Activity bar background color for the active item. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); +export const ACTIVITY_BAR_ACTIVE_BACKGROUND = registerColor('activityBar.activeBackground', null, localize('activityBarActiveBackground', "Activity bar background color for the active item. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); export const ACTIVITY_BAR_DRAG_AND_DROP_BORDER = registerColor('activityBar.dropBorder', { dark: ACTIVITY_BAR_FOREGROUND, @@ -731,12 +511,7 @@ export const ACTIVITY_BAR_BADGE_BACKGROUND = registerColor('activityBarBadge.bac hcLight: '#0F4A85' }, localize('activityBarBadgeBackground', "Activity notification badge background color. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); -export const ACTIVITY_BAR_BADGE_FOREGROUND = registerColor('activityBarBadge.foreground', { - dark: Color.white, - light: Color.white, - hcDark: Color.white, - hcLight: Color.white -}, localize('activityBarBadgeForeground', "Activity notification badge foreground color. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); +export const ACTIVITY_BAR_BADGE_FOREGROUND = registerColor('activityBarBadge.foreground', Color.white, localize('activityBarBadgeForeground', "Activity notification badge foreground color. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); export const ACTIVITY_BAR_TOP_FOREGROUND = registerColor('activityBarTop.foreground', { dark: '#E7E7E7', @@ -752,12 +527,7 @@ export const ACTIVITY_BAR_TOP_ACTIVE_BORDER = registerColor('activityBarTop.acti hcLight: '#B5200D' }, localize('activityBarTopActiveFocusBorder', "Focus border color for the active item in the Activity bar when it is on top / bottom. The activity allows to switch between views of the side bar.")); -export const ACTIVITY_BAR_TOP_ACTIVE_BACKGROUND = registerColor('activityBarTop.activeBackground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('activityBarTopActiveBackground', "Background color for the active item in the Activity bar when it is on top / bottom. The activity allows to switch between views of the side bar.")); +export const ACTIVITY_BAR_TOP_ACTIVE_BACKGROUND = registerColor('activityBarTop.activeBackground', null, localize('activityBarTopActiveBackground', "Background color for the active item in the Activity bar when it is on top / bottom. The activity allows to switch between views of the side bar.")); export const ACTIVITY_BAR_TOP_INACTIVE_FOREGROUND = registerColor('activityBarTop.inactiveForeground', { dark: transparent(ACTIVITY_BAR_TOP_FOREGROUND, 0.6), @@ -766,19 +536,9 @@ export const ACTIVITY_BAR_TOP_INACTIVE_FOREGROUND = registerColor('activityBarTo hcLight: editorForeground }, localize('activityBarTopInActiveForeground', "Inactive foreground color of the item in the Activity bar when it is on top / bottom. The activity allows to switch between views of the side bar.")); -export const ACTIVITY_BAR_TOP_DRAG_AND_DROP_BORDER = registerColor('activityBarTop.dropBorder', { - dark: ACTIVITY_BAR_TOP_FOREGROUND, - light: ACTIVITY_BAR_TOP_FOREGROUND, - hcDark: ACTIVITY_BAR_TOP_FOREGROUND, - hcLight: ACTIVITY_BAR_TOP_FOREGROUND -}, localize('activityBarTopDragAndDropBorder', "Drag and drop feedback color for the items in the Activity bar when it is on top / bottom. The activity allows to switch between views of the side bar.")); +export const ACTIVITY_BAR_TOP_DRAG_AND_DROP_BORDER = registerColor('activityBarTop.dropBorder', ACTIVITY_BAR_TOP_FOREGROUND, localize('activityBarTopDragAndDropBorder', "Drag and drop feedback color for the items in the Activity bar when it is on top / bottom. The activity allows to switch between views of the side bar.")); -export const ACTIVITY_BAR_TOP_BACKGROUND = registerColor('activityBarTop.background', { - dark: null, - light: null, - hcDark: null, - hcLight: null, -}, localize('activityBarTopBackground', "Background color of the activity bar when set to top / bottom.")); +export const ACTIVITY_BAR_TOP_BACKGROUND = registerColor('activityBarTop.background', null, localize('activityBarTopBackground', "Background color of the activity bar when set to top / bottom.")); // < --- Profiles --- > @@ -799,26 +559,11 @@ export const PROFILE_BADGE_FOREGROUND = registerColor('profileBadge.foreground', // < --- Remote --- > -export const STATUS_BAR_REMOTE_ITEM_BACKGROUND = registerColor('statusBarItem.remoteBackground', { - dark: ACTIVITY_BAR_BADGE_BACKGROUND, - light: ACTIVITY_BAR_BADGE_BACKGROUND, - hcDark: ACTIVITY_BAR_BADGE_BACKGROUND, - hcLight: ACTIVITY_BAR_BADGE_BACKGROUND -}, localize('statusBarItemHostBackground', "Background color for the remote indicator on the status bar.")); - -export const STATUS_BAR_REMOTE_ITEM_FOREGROUND = registerColor('statusBarItem.remoteForeground', { - dark: ACTIVITY_BAR_BADGE_FOREGROUND, - light: ACTIVITY_BAR_BADGE_FOREGROUND, - hcDark: ACTIVITY_BAR_BADGE_FOREGROUND, - hcLight: ACTIVITY_BAR_BADGE_FOREGROUND -}, localize('statusBarItemHostForeground', "Foreground color for the remote indicator on the status bar.")); - -export const STATUS_BAR_REMOTE_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.remoteHoverForeground', { - dark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - light: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_FOREGROUND -}, localize('statusBarRemoteItemHoverForeground', "Foreground color for the remote indicator on the status bar when hovering.")); +export const STATUS_BAR_REMOTE_ITEM_BACKGROUND = registerColor('statusBarItem.remoteBackground', ACTIVITY_BAR_BADGE_BACKGROUND, localize('statusBarItemHostBackground', "Background color for the remote indicator on the status bar.")); + +export const STATUS_BAR_REMOTE_ITEM_FOREGROUND = registerColor('statusBarItem.remoteForeground', ACTIVITY_BAR_BADGE_FOREGROUND, localize('statusBarItemHostForeground', "Foreground color for the remote indicator on the status bar.")); + +export const STATUS_BAR_REMOTE_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.remoteHoverForeground', STATUS_BAR_ITEM_HOVER_FOREGROUND, localize('statusBarRemoteItemHoverForeground', "Foreground color for the remote indicator on the status bar when hovering.")); export const STATUS_BAR_REMOTE_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.remoteHoverBackground', { dark: STATUS_BAR_ITEM_HOVER_BACKGROUND, @@ -827,26 +572,11 @@ export const STATUS_BAR_REMOTE_ITEM_HOVER_BACKGROUND = registerColor('statusBarI hcLight: null }, localize('statusBarRemoteItemHoverBackground', "Background color for the remote indicator on the status bar when hovering.")); -export const STATUS_BAR_OFFLINE_ITEM_BACKGROUND = registerColor('statusBarItem.offlineBackground', { - dark: '#6c1717', - light: '#6c1717', - hcDark: '#6c1717', - hcLight: '#6c1717' -}, localize('statusBarItemOfflineBackground', "Status bar item background color when the workbench is offline.")); - -export const STATUS_BAR_OFFLINE_ITEM_FOREGROUND = registerColor('statusBarItem.offlineForeground', { - dark: STATUS_BAR_REMOTE_ITEM_FOREGROUND, - light: STATUS_BAR_REMOTE_ITEM_FOREGROUND, - hcDark: STATUS_BAR_REMOTE_ITEM_FOREGROUND, - hcLight: STATUS_BAR_REMOTE_ITEM_FOREGROUND -}, localize('statusBarItemOfflineForeground', "Status bar item foreground color when the workbench is offline.")); - -export const STATUS_BAR_OFFLINE_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.offlineHoverForeground', { - dark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - light: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcDark: STATUS_BAR_ITEM_HOVER_FOREGROUND, - hcLight: STATUS_BAR_ITEM_HOVER_FOREGROUND -}, localize('statusBarOfflineItemHoverForeground', "Status bar item foreground hover color when the workbench is offline.")); +export const STATUS_BAR_OFFLINE_ITEM_BACKGROUND = registerColor('statusBarItem.offlineBackground', '#6c1717', localize('statusBarItemOfflineBackground', "Status bar item background color when the workbench is offline.")); + +export const STATUS_BAR_OFFLINE_ITEM_FOREGROUND = registerColor('statusBarItem.offlineForeground', STATUS_BAR_REMOTE_ITEM_FOREGROUND, localize('statusBarItemOfflineForeground', "Status bar item foreground color when the workbench is offline.")); + +export const STATUS_BAR_OFFLINE_ITEM_HOVER_FOREGROUND = registerColor('statusBarItem.offlineHoverForeground', STATUS_BAR_ITEM_HOVER_FOREGROUND, localize('statusBarOfflineItemHoverForeground', "Status bar item foreground hover color when the workbench is offline.")); export const STATUS_BAR_OFFLINE_ITEM_HOVER_BACKGROUND = registerColor('statusBarItem.offlineHoverBackground', { dark: STATUS_BAR_ITEM_HOVER_BACKGROUND, @@ -855,19 +585,9 @@ export const STATUS_BAR_OFFLINE_ITEM_HOVER_BACKGROUND = registerColor('statusBar hcLight: null }, localize('statusBarOfflineItemHoverBackground', "Status bar item background hover color when the workbench is offline.")); -export const EXTENSION_BADGE_REMOTE_BACKGROUND = registerColor('extensionBadge.remoteBackground', { - dark: ACTIVITY_BAR_BADGE_BACKGROUND, - light: ACTIVITY_BAR_BADGE_BACKGROUND, - hcDark: ACTIVITY_BAR_BADGE_BACKGROUND, - hcLight: ACTIVITY_BAR_BADGE_BACKGROUND -}, localize('extensionBadge.remoteBackground', "Background color for the remote badge in the extensions view.")); +export const EXTENSION_BADGE_REMOTE_BACKGROUND = registerColor('extensionBadge.remoteBackground', ACTIVITY_BAR_BADGE_BACKGROUND, localize('extensionBadge.remoteBackground', "Background color for the remote badge in the extensions view.")); -export const EXTENSION_BADGE_REMOTE_FOREGROUND = registerColor('extensionBadge.remoteForeground', { - dark: ACTIVITY_BAR_BADGE_FOREGROUND, - light: ACTIVITY_BAR_BADGE_FOREGROUND, - hcDark: ACTIVITY_BAR_BADGE_FOREGROUND, - hcLight: ACTIVITY_BAR_BADGE_FOREGROUND -}, localize('extensionBadge.remoteForeground', "Foreground color for the remote badge in the extensions view.")); +export const EXTENSION_BADGE_REMOTE_FOREGROUND = registerColor('extensionBadge.remoteForeground', ACTIVITY_BAR_BADGE_FOREGROUND, localize('extensionBadge.remoteForeground', "Foreground color for the remote badge in the extensions view.")); // < --- Side Bar --- > @@ -879,12 +599,7 @@ export const SIDE_BAR_BACKGROUND = registerColor('sideBar.background', { hcLight: '#FFFFFF' }, localize('sideBarBackground', "Side bar background color. The side bar is the container for views like explorer and search.")); -export const SIDE_BAR_FOREGROUND = registerColor('sideBar.foreground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('sideBarForeground', "Side bar foreground color. The side bar is the container for views like explorer and search.")); +export const SIDE_BAR_FOREGROUND = registerColor('sideBar.foreground', null, localize('sideBarForeground', "Side bar foreground color. The side bar is the container for views like explorer and search.")); export const SIDE_BAR_BORDER = registerColor('sideBar.border', { dark: null, @@ -893,26 +608,11 @@ export const SIDE_BAR_BORDER = registerColor('sideBar.border', { hcLight: contrastBorder }, localize('sideBarBorder', "Side bar border color on the side separating to the editor. The side bar is the container for views like explorer and search.")); -export const SIDE_BAR_TITLE_BACKGROUND = registerColor('sideBarTitle.background', { - dark: SIDE_BAR_BACKGROUND, - light: SIDE_BAR_BACKGROUND, - hcDark: SIDE_BAR_BACKGROUND, - hcLight: SIDE_BAR_BACKGROUND -}, localize('sideBarTitleBackground', "Side bar title background color. The side bar is the container for views like explorer and search.")); - -export const SIDE_BAR_TITLE_FOREGROUND = registerColor('sideBarTitle.foreground', { - dark: SIDE_BAR_FOREGROUND, - light: SIDE_BAR_FOREGROUND, - hcDark: SIDE_BAR_FOREGROUND, - hcLight: SIDE_BAR_FOREGROUND -}, localize('sideBarTitleForeground', "Side bar title foreground color. The side bar is the container for views like explorer and search.")); - -export const SIDE_BAR_DRAG_AND_DROP_BACKGROUND = registerColor('sideBar.dropBackground', { - dark: EDITOR_DRAG_AND_DROP_BACKGROUND, - light: EDITOR_DRAG_AND_DROP_BACKGROUND, - hcDark: EDITOR_DRAG_AND_DROP_BACKGROUND, - hcLight: EDITOR_DRAG_AND_DROP_BACKGROUND -}, localize('sideBarDragAndDropBackground', "Drag and drop feedback color for the side bar sections. The color should have transparency so that the side bar sections can still shine through. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); +export const SIDE_BAR_TITLE_BACKGROUND = registerColor('sideBarTitle.background', SIDE_BAR_BACKGROUND, localize('sideBarTitleBackground', "Side bar title background color. The side bar is the container for views like explorer and search.")); + +export const SIDE_BAR_TITLE_FOREGROUND = registerColor('sideBarTitle.foreground', SIDE_BAR_FOREGROUND, localize('sideBarTitleForeground', "Side bar title foreground color. The side bar is the container for views like explorer and search.")); + +export const SIDE_BAR_DRAG_AND_DROP_BACKGROUND = registerColor('sideBar.dropBackground', EDITOR_DRAG_AND_DROP_BACKGROUND, localize('sideBarDragAndDropBackground', "Drag and drop feedback color for the side bar sections. The color should have transparency so that the side bar sections can still shine through. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); export const SIDE_BAR_SECTION_HEADER_BACKGROUND = registerColor('sideBarSectionHeader.background', { dark: Color.fromHex('#808080').transparent(0.2), @@ -921,47 +621,17 @@ export const SIDE_BAR_SECTION_HEADER_BACKGROUND = registerColor('sideBarSectionH hcLight: null }, localize('sideBarSectionHeaderBackground', "Side bar section header background color. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); -export const SIDE_BAR_SECTION_HEADER_FOREGROUND = registerColor('sideBarSectionHeader.foreground', { - dark: SIDE_BAR_FOREGROUND, - light: SIDE_BAR_FOREGROUND, - hcDark: SIDE_BAR_FOREGROUND, - hcLight: SIDE_BAR_FOREGROUND -}, localize('sideBarSectionHeaderForeground', "Side bar section header foreground color. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); +export const SIDE_BAR_SECTION_HEADER_FOREGROUND = registerColor('sideBarSectionHeader.foreground', SIDE_BAR_FOREGROUND, localize('sideBarSectionHeaderForeground', "Side bar section header foreground color. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); -export const SIDE_BAR_SECTION_HEADER_BORDER = registerColor('sideBarSectionHeader.border', { - dark: contrastBorder, - light: contrastBorder, - hcDark: contrastBorder, - hcLight: contrastBorder -}, localize('sideBarSectionHeaderBorder', "Side bar section header border color. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); - -export const ACTIVITY_BAR_TOP_BORDER = registerColor('sideBarActivityBarTop.border', { - dark: SIDE_BAR_SECTION_HEADER_BORDER, - light: SIDE_BAR_SECTION_HEADER_BORDER, - hcDark: SIDE_BAR_SECTION_HEADER_BORDER, - hcLight: SIDE_BAR_SECTION_HEADER_BORDER -}, localize('sideBarActivityBarTopBorder', "Border color between the activity bar at the top/bottom and the views.")); - -export const SIDE_BAR_STICKY_SCROLL_BACKGROUND = registerColor('sideBarStickyScroll.background', { - dark: SIDE_BAR_BACKGROUND, - light: SIDE_BAR_BACKGROUND, - hcDark: SIDE_BAR_BACKGROUND, - hcLight: SIDE_BAR_BACKGROUND -}, localize('sideBarStickyScrollBackground', "Background color of sticky scroll in the side bar.")); - -export const SIDE_BAR_STICKY_SCROLL_BORDER = registerColor('sideBarStickyScroll.border', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('sideBarStickyScrollBorder', "Border color of sticky scroll in the side bar.")); +export const SIDE_BAR_SECTION_HEADER_BORDER = registerColor('sideBarSectionHeader.border', contrastBorder, localize('sideBarSectionHeaderBorder', "Side bar section header border color. The side bar is the container for views like explorer and search. Side bar sections are views nested within the side bar.")); + +export const ACTIVITY_BAR_TOP_BORDER = registerColor('sideBarActivityBarTop.border', SIDE_BAR_SECTION_HEADER_BORDER, localize('sideBarActivityBarTopBorder', "Border color between the activity bar at the top/bottom and the views.")); + +export const SIDE_BAR_STICKY_SCROLL_BACKGROUND = registerColor('sideBarStickyScroll.background', SIDE_BAR_BACKGROUND, localize('sideBarStickyScrollBackground', "Background color of sticky scroll in the side bar.")); -export const SIDE_BAR_STICKY_SCROLL_SHADOW = registerColor('sideBarStickyScroll.shadow', { - dark: scrollbarShadow, - light: scrollbarShadow, - hcDark: scrollbarShadow, - hcLight: scrollbarShadow -}, localize('sideBarStickyScrollShadow', "Shadow color of sticky scroll in the side bar.")); +export const SIDE_BAR_STICKY_SCROLL_BORDER = registerColor('sideBarStickyScroll.border', null, localize('sideBarStickyScrollBorder', "Border color of sticky scroll in the side bar.")); + +export const SIDE_BAR_STICKY_SCROLL_SHADOW = registerColor('sideBarStickyScroll.shadow', scrollbarShadow, localize('sideBarStickyScrollShadow', "Shadow color of sticky scroll in the side bar.")); // < --- Title Bar --- > @@ -1002,12 +672,7 @@ export const TITLE_BAR_BORDER = registerColor('titleBar.border', { // < --- Menubar --- > -export const MENUBAR_SELECTION_FOREGROUND = registerColor('menubar.selectionForeground', { - dark: TITLE_BAR_ACTIVE_FOREGROUND, - light: TITLE_BAR_ACTIVE_FOREGROUND, - hcDark: TITLE_BAR_ACTIVE_FOREGROUND, - hcLight: TITLE_BAR_ACTIVE_FOREGROUND, -}, localize('menubarSelectionForeground', "Foreground color of the selected menu item in the menubar.")); +export const MENUBAR_SELECTION_FOREGROUND = registerColor('menubar.selectionForeground', TITLE_BAR_ACTIVE_FOREGROUND, localize('menubarSelectionForeground', "Foreground color of the selected menu item in the menubar.")); export const MENUBAR_SELECTION_BACKGROUND = registerColor('menubar.selectionBackground', { dark: toolbarHoverBackground, @@ -1028,19 +693,19 @@ export const MENUBAR_SELECTION_BORDER = registerColor('menubar.selectionBorder', // foreground (inactive and active) export const COMMAND_CENTER_FOREGROUND = registerColor( 'commandCenter.foreground', - { dark: TITLE_BAR_ACTIVE_FOREGROUND, hcDark: TITLE_BAR_ACTIVE_FOREGROUND, light: TITLE_BAR_ACTIVE_FOREGROUND, hcLight: TITLE_BAR_ACTIVE_FOREGROUND }, + TITLE_BAR_ACTIVE_FOREGROUND, localize('commandCenter-foreground', "Foreground color of the command center"), false ); export const COMMAND_CENTER_ACTIVEFOREGROUND = registerColor( 'commandCenter.activeForeground', - { dark: MENUBAR_SELECTION_FOREGROUND, hcDark: MENUBAR_SELECTION_FOREGROUND, light: MENUBAR_SELECTION_FOREGROUND, hcLight: MENUBAR_SELECTION_FOREGROUND }, + MENUBAR_SELECTION_FOREGROUND, localize('commandCenter-activeForeground', "Active foreground color of the command center"), false ); export const COMMAND_CENTER_INACTIVEFOREGROUND = registerColor( 'commandCenter.inactiveForeground', - { dark: TITLE_BAR_INACTIVE_FOREGROUND, hcDark: TITLE_BAR_INACTIVE_FOREGROUND, light: TITLE_BAR_INACTIVE_FOREGROUND, hcLight: TITLE_BAR_INACTIVE_FOREGROUND }, + TITLE_BAR_INACTIVE_FOREGROUND, localize('commandCenter-inactiveForeground', "Foreground color of the command center when the window is inactive"), false ); @@ -1070,7 +735,7 @@ export const COMMAND_CENTER_ACTIVEBORDER = registerColor( ); // border: defaults to active background export const COMMAND_CENTER_INACTIVEBORDER = registerColor( - 'commandCenter.inactiveBorder', { dark: transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), hcDark: transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), light: transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), hcLight: transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25) }, + 'commandCenter.inactiveBorder', transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), localize('commandCenter-inactiveBorder', "Border color of the command center when the window is inactive"), false ); @@ -1092,33 +757,13 @@ export const NOTIFICATIONS_TOAST_BORDER = registerColor('notificationToast.borde hcLight: contrastBorder }, localize('notificationToastBorder', "Notification toast border color. Notifications slide in from the bottom right of the window.")); -export const NOTIFICATIONS_FOREGROUND = registerColor('notifications.foreground', { - dark: editorWidgetForeground, - light: editorWidgetForeground, - hcDark: editorWidgetForeground, - hcLight: editorWidgetForeground -}, localize('notificationsForeground', "Notifications foreground color. Notifications slide in from the bottom right of the window.")); - -export const NOTIFICATIONS_BACKGROUND = registerColor('notifications.background', { - dark: editorWidgetBackground, - light: editorWidgetBackground, - hcDark: editorWidgetBackground, - hcLight: editorWidgetBackground -}, localize('notificationsBackground', "Notifications background color. Notifications slide in from the bottom right of the window.")); - -export const NOTIFICATIONS_LINKS = registerColor('notificationLink.foreground', { - dark: textLinkForeground, - light: textLinkForeground, - hcDark: textLinkForeground, - hcLight: textLinkForeground -}, localize('notificationsLink', "Notification links foreground color. Notifications slide in from the bottom right of the window.")); - -export const NOTIFICATIONS_CENTER_HEADER_FOREGROUND = registerColor('notificationCenterHeader.foreground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('notificationCenterHeaderForeground', "Notifications center header foreground color. Notifications slide in from the bottom right of the window.")); +export const NOTIFICATIONS_FOREGROUND = registerColor('notifications.foreground', editorWidgetForeground, localize('notificationsForeground', "Notifications foreground color. Notifications slide in from the bottom right of the window.")); + +export const NOTIFICATIONS_BACKGROUND = registerColor('notifications.background', editorWidgetBackground, localize('notificationsBackground', "Notifications background color. Notifications slide in from the bottom right of the window.")); + +export const NOTIFICATIONS_LINKS = registerColor('notificationLink.foreground', textLinkForeground, localize('notificationsLink', "Notification links foreground color. Notifications slide in from the bottom right of the window.")); + +export const NOTIFICATIONS_CENTER_HEADER_FOREGROUND = registerColor('notificationCenterHeader.foreground', null, localize('notificationCenterHeaderForeground', "Notifications center header foreground color. Notifications slide in from the bottom right of the window.")); export const NOTIFICATIONS_CENTER_HEADER_BACKGROUND = registerColor('notificationCenterHeader.background', { dark: lighten(NOTIFICATIONS_BACKGROUND, 0.3), @@ -1127,33 +772,13 @@ export const NOTIFICATIONS_CENTER_HEADER_BACKGROUND = registerColor('notificatio hcLight: NOTIFICATIONS_BACKGROUND }, localize('notificationCenterHeaderBackground', "Notifications center header background color. Notifications slide in from the bottom right of the window.")); -export const NOTIFICATIONS_BORDER = registerColor('notifications.border', { - dark: NOTIFICATIONS_CENTER_HEADER_BACKGROUND, - light: NOTIFICATIONS_CENTER_HEADER_BACKGROUND, - hcDark: NOTIFICATIONS_CENTER_HEADER_BACKGROUND, - hcLight: NOTIFICATIONS_CENTER_HEADER_BACKGROUND -}, localize('notificationsBorder', "Notifications border color separating from other notifications in the notifications center. Notifications slide in from the bottom right of the window.")); - -export const NOTIFICATIONS_ERROR_ICON_FOREGROUND = registerColor('notificationsErrorIcon.foreground', { - dark: editorErrorForeground, - light: editorErrorForeground, - hcDark: editorErrorForeground, - hcLight: editorErrorForeground -}, localize('notificationsErrorIconForeground', "The color used for the icon of error notifications. Notifications slide in from the bottom right of the window.")); - -export const NOTIFICATIONS_WARNING_ICON_FOREGROUND = registerColor('notificationsWarningIcon.foreground', { - dark: editorWarningForeground, - light: editorWarningForeground, - hcDark: editorWarningForeground, - hcLight: editorWarningForeground -}, localize('notificationsWarningIconForeground', "The color used for the icon of warning notifications. Notifications slide in from the bottom right of the window.")); - -export const NOTIFICATIONS_INFO_ICON_FOREGROUND = registerColor('notificationsInfoIcon.foreground', { - dark: editorInfoForeground, - light: editorInfoForeground, - hcDark: editorInfoForeground, - hcLight: editorInfoForeground -}, localize('notificationsInfoIconForeground', "The color used for the icon of info notifications. Notifications slide in from the bottom right of the window.")); +export const NOTIFICATIONS_BORDER = registerColor('notifications.border', NOTIFICATIONS_CENTER_HEADER_BACKGROUND, localize('notificationsBorder', "Notifications border color separating from other notifications in the notifications center. Notifications slide in from the bottom right of the window.")); + +export const NOTIFICATIONS_ERROR_ICON_FOREGROUND = registerColor('notificationsErrorIcon.foreground', editorErrorForeground, localize('notificationsErrorIconForeground', "The color used for the icon of error notifications. Notifications slide in from the bottom right of the window.")); + +export const NOTIFICATIONS_WARNING_ICON_FOREGROUND = registerColor('notificationsWarningIcon.foreground', editorWarningForeground, localize('notificationsWarningIconForeground', "The color used for the icon of warning notifications. Notifications slide in from the bottom right of the window.")); + +export const NOTIFICATIONS_INFO_ICON_FOREGROUND = registerColor('notificationsInfoIcon.foreground', editorInfoForeground, localize('notificationsInfoIconForeground', "The color used for the icon of info notifications. Notifications slide in from the bottom right of the window.")); export const WINDOW_ACTIVE_BORDER = registerColor('window.activeBorder', { dark: null, diff --git a/src/vs/workbench/contrib/chat/common/chatColors.ts b/src/vs/workbench/contrib/chat/common/chatColors.ts index 3c4cce05e0165..15451f0de58c6 100644 --- a/src/vs/workbench/contrib/chat/common/chatColors.ts +++ b/src/vs/workbench/contrib/chat/common/chatColors.ts @@ -39,6 +39,6 @@ export const chatAvatarBackground = registerColor( export const chatAvatarForeground = registerColor( 'chat.avatarForeground', - { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground, }, + foreground, localize('chat.avatarForeground', 'The foreground color of a chat avatar.') ); diff --git a/src/vs/workbench/contrib/comments/browser/commentColors.ts b/src/vs/workbench/contrib/comments/browser/commentColors.ts index 08d44a3224bca..b66b9590f763c 100644 --- a/src/vs/workbench/contrib/comments/browser/commentColors.ts +++ b/src/vs/workbench/contrib/comments/browser/commentColors.ts @@ -13,11 +13,11 @@ import { IColorTheme } from 'vs/platform/theme/common/themeService'; const resolvedCommentViewIcon = registerColor('commentsView.resolvedIcon', { dark: disabledForeground, light: disabledForeground, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('resolvedCommentIcon', 'Icon color for resolved comments.')); const unresolvedCommentViewIcon = registerColor('commentsView.unresolvedIcon', { dark: listFocusOutline, light: listFocusOutline, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('unresolvedCommentIcon', 'Icon color for unresolved comments.')); -registerColor('editorCommentsWidget.replyInputBackground', { dark: peekViewTitleBackground, light: peekViewTitleBackground, hcDark: peekViewTitleBackground, hcLight: peekViewTitleBackground }, nls.localize('commentReplyInputBackground', 'Background color for comment reply input box.')); +registerColor('editorCommentsWidget.replyInputBackground', peekViewTitleBackground, nls.localize('commentReplyInputBackground', 'Background color for comment reply input box.')); const resolvedCommentBorder = registerColor('editorCommentsWidget.resolvedBorder', { dark: resolvedCommentViewIcon, light: resolvedCommentViewIcon, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('resolvedCommentBorder', 'Color of borders and arrow for resolved comments.')); const unresolvedCommentBorder = registerColor('editorCommentsWidget.unresolvedBorder', { dark: unresolvedCommentViewIcon, light: unresolvedCommentViewIcon, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('unresolvedCommentBorder', 'Color of borders and arrow for unresolved comments.')); -export const commentThreadRangeBackground = registerColor('editorCommentsWidget.rangeBackground', { dark: transparent(unresolvedCommentBorder, .1), light: transparent(unresolvedCommentBorder, .1), hcDark: transparent(unresolvedCommentBorder, .1), hcLight: transparent(unresolvedCommentBorder, .1) }, nls.localize('commentThreadRangeBackground', 'Color of background for comment ranges.')); -export const commentThreadRangeActiveBackground = registerColor('editorCommentsWidget.rangeActiveBackground', { dark: transparent(unresolvedCommentBorder, .1), light: transparent(unresolvedCommentBorder, .1), hcDark: transparent(unresolvedCommentBorder, .1), hcLight: transparent(unresolvedCommentBorder, .1) }, nls.localize('commentThreadActiveRangeBackground', 'Color of background for currently selected or hovered comment range.')); +export const commentThreadRangeBackground = registerColor('editorCommentsWidget.rangeBackground', transparent(unresolvedCommentBorder, .1), nls.localize('commentThreadRangeBackground', 'Color of background for comment ranges.')); +export const commentThreadRangeActiveBackground = registerColor('editorCommentsWidget.rangeActiveBackground', transparent(unresolvedCommentBorder, .1), nls.localize('commentThreadActiveRangeBackground', 'Color of background for currently selected or hovered comment range.')); const commentThreadStateBorderColors = new Map([ [languages.CommentThreadState.Unresolved, unresolvedCommentBorder], diff --git a/src/vs/workbench/contrib/comments/browser/commentGlyphWidget.ts b/src/vs/workbench/contrib/comments/browser/commentGlyphWidget.ts index 92b52ac5402b3..725b522f9561d 100644 --- a/src/vs/workbench/contrib/comments/browser/commentGlyphWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentGlyphWidget.ts @@ -14,11 +14,11 @@ import { IEditorDecorationsCollection } from 'vs/editor/common/editorCommon'; import { CommentThreadState } from 'vs/editor/common/languages'; export const overviewRulerCommentingRangeForeground = registerColor('editorGutter.commentRangeForeground', { dark: opaque(listInactiveSelectionBackground, editorBackground), light: darken(opaque(listInactiveSelectionBackground, editorBackground), .05), hcDark: Color.white, hcLight: Color.black }, nls.localize('editorGutterCommentRangeForeground', 'Editor gutter decoration color for commenting ranges. This color should be opaque.')); -const overviewRulerCommentForeground = registerColor('editorOverviewRuler.commentForeground', { dark: overviewRulerCommentingRangeForeground, light: overviewRulerCommentingRangeForeground, hcDark: overviewRulerCommentingRangeForeground, hcLight: overviewRulerCommentingRangeForeground }, nls.localize('editorOverviewRuler.commentForeground', 'Editor overview ruler decoration color for resolved comments. This color should be opaque.')); -const overviewRulerCommentUnresolvedForeground = registerColor('editorOverviewRuler.commentUnresolvedForeground', { dark: overviewRulerCommentForeground, light: overviewRulerCommentForeground, hcDark: overviewRulerCommentForeground, hcLight: overviewRulerCommentForeground }, nls.localize('editorOverviewRuler.commentUnresolvedForeground', 'Editor overview ruler decoration color for unresolved comments. This color should be opaque.')); +const overviewRulerCommentForeground = registerColor('editorOverviewRuler.commentForeground', overviewRulerCommentingRangeForeground, nls.localize('editorOverviewRuler.commentForeground', 'Editor overview ruler decoration color for resolved comments. This color should be opaque.')); +const overviewRulerCommentUnresolvedForeground = registerColor('editorOverviewRuler.commentUnresolvedForeground', overviewRulerCommentForeground, nls.localize('editorOverviewRuler.commentUnresolvedForeground', 'Editor overview ruler decoration color for unresolved comments. This color should be opaque.')); const editorGutterCommentGlyphForeground = registerColor('editorGutter.commentGlyphForeground', { dark: editorForeground, light: editorForeground, hcDark: Color.black, hcLight: Color.white }, nls.localize('editorGutterCommentGlyphForeground', 'Editor gutter decoration color for commenting glyphs.')); -registerColor('editorGutter.commentUnresolvedGlyphForeground', { dark: editorGutterCommentGlyphForeground, light: editorGutterCommentGlyphForeground, hcDark: editorGutterCommentGlyphForeground, hcLight: editorGutterCommentGlyphForeground }, nls.localize('editorGutterCommentUnresolvedGlyphForeground', 'Editor gutter decoration color for commenting glyphs for unresolved comment threads.')); +registerColor('editorGutter.commentUnresolvedGlyphForeground', editorGutterCommentGlyphForeground, nls.localize('editorGutterCommentUnresolvedGlyphForeground', 'Editor gutter decoration color for commenting glyphs for unresolved comment threads.')); export class CommentGlyphWidget { public static description = 'comment-glyph-widget'; diff --git a/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts index 1b53d40047f18..d29256d907240 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts @@ -869,8 +869,8 @@ registerThemingParticipant((theme, collector) => { } }); -export const debugIconBreakpointForeground = registerColor('debugIcon.breakpointForeground', { dark: '#E51400', light: '#E51400', hcDark: '#E51400', hcLight: '#E51400' }, nls.localize('debugIcon.breakpointForeground', 'Icon color for breakpoints.')); -const debugIconBreakpointDisabledForeground = registerColor('debugIcon.breakpointDisabledForeground', { dark: '#848484', light: '#848484', hcDark: '#848484', hcLight: '#848484' }, nls.localize('debugIcon.breakpointDisabledForeground', 'Icon color for disabled breakpoints.')); -const debugIconBreakpointUnverifiedForeground = registerColor('debugIcon.breakpointUnverifiedForeground', { dark: '#848484', light: '#848484', hcDark: '#848484', hcLight: '#848484' }, nls.localize('debugIcon.breakpointUnverifiedForeground', 'Icon color for unverified breakpoints.')); +export const debugIconBreakpointForeground = registerColor('debugIcon.breakpointForeground', '#E51400', nls.localize('debugIcon.breakpointForeground', 'Icon color for breakpoints.')); +const debugIconBreakpointDisabledForeground = registerColor('debugIcon.breakpointDisabledForeground', '#848484', nls.localize('debugIcon.breakpointDisabledForeground', 'Icon color for disabled breakpoints.')); +const debugIconBreakpointUnverifiedForeground = registerColor('debugIcon.breakpointUnverifiedForeground', '#848484', nls.localize('debugIcon.breakpointUnverifiedForeground', 'Icon color for unverified breakpoints.')); const debugIconBreakpointCurrentStackframeForeground = registerColor('debugIcon.breakpointCurrentStackframeForeground', { dark: '#FFCC00', light: '#BE8700', hcDark: '#FFCC00', hcLight: '#BE8700' }, nls.localize('debugIcon.breakpointCurrentStackframeForeground', 'Icon color for the current breakpoint stack frame.')); -const debugIconBreakpointStackframeForeground = registerColor('debugIcon.breakpointStackframeForeground', { dark: '#89D185', light: '#89D185', hcDark: '#89D185', hcLight: '#89D185' }, nls.localize('debugIcon.breakpointStackframeForeground', 'Icon color for all breakpoint stack frames.')); +const debugIconBreakpointStackframeForeground = registerColor('debugIcon.breakpointStackframeForeground', '#89D185', nls.localize('debugIcon.breakpointStackframeForeground', 'Icon color for all breakpoint stack frames.')); diff --git a/src/vs/workbench/contrib/debug/browser/debugColors.ts b/src/vs/workbench/contrib/debug/browser/debugColors.ts index 654a9b983b6e2..19b4728052475 100644 --- a/src/vs/workbench/contrib/debug/browser/debugColors.ts +++ b/src/vs/workbench/contrib/debug/browser/debugColors.ts @@ -18,12 +18,7 @@ export const debugToolBarBackground = registerColor('debugToolBar.background', { hcLight: '#FFFFFF' }, localize('debugToolBarBackground', "Debug toolbar background color.")); -export const debugToolBarBorder = registerColor('debugToolBar.border', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, localize('debugToolBarBorder', "Debug toolbar border color.")); +export const debugToolBarBorder = registerColor('debugToolBar.border', null, localize('debugToolBarBorder', "Debug toolbar border color.")); export const debugIconStartForeground = registerColor('debugIcon.startForeground', { dark: '#89D185', @@ -44,15 +39,15 @@ export function registerColors() { const debugViewExceptionLabelForeground = registerColor('debugView.exceptionLabelForeground', { dark: foreground, light: '#FFF', hcDark: foreground, hcLight: foreground }, 'Foreground color for a label shown in the CALL STACK view when the debugger breaks on an exception.'); const debugViewExceptionLabelBackground = registerColor('debugView.exceptionLabelBackground', { dark: '#6C2022', light: '#A31515', hcDark: '#6C2022', hcLight: '#A31515' }, 'Background color for a label shown in the CALL STACK view when the debugger breaks on an exception.'); - const debugViewStateLabelForeground = registerColor('debugView.stateLabelForeground', { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, 'Foreground color for a label in the CALL STACK view showing the current session\'s or thread\'s state.'); - const debugViewStateLabelBackground = registerColor('debugView.stateLabelBackground', { dark: '#88888844', light: '#88888844', hcDark: '#88888844', hcLight: '#88888844' }, 'Background color for a label in the CALL STACK view showing the current session\'s or thread\'s state.'); - const debugViewValueChangedHighlight = registerColor('debugView.valueChangedHighlight', { dark: '#569CD6', light: '#569CD6', hcDark: '#569CD6', hcLight: '#569CD6' }, 'Color used to highlight value changes in the debug views (ie. in the Variables view).'); + const debugViewStateLabelForeground = registerColor('debugView.stateLabelForeground', foreground, 'Foreground color for a label in the CALL STACK view showing the current session\'s or thread\'s state.'); + const debugViewStateLabelBackground = registerColor('debugView.stateLabelBackground', '#88888844', 'Background color for a label in the CALL STACK view showing the current session\'s or thread\'s state.'); + const debugViewValueChangedHighlight = registerColor('debugView.valueChangedHighlight', '#569CD6', 'Color used to highlight value changes in the debug views (ie. in the Variables view).'); const debugConsoleInfoForeground = registerColor('debugConsole.infoForeground', { dark: editorInfoForeground, light: editorInfoForeground, hcDark: foreground, hcLight: foreground }, 'Foreground color for info messages in debug REPL console.'); const debugConsoleWarningForeground = registerColor('debugConsole.warningForeground', { dark: editorWarningForeground, light: editorWarningForeground, hcDark: '#008000', hcLight: editorWarningForeground }, 'Foreground color for warning messages in debug REPL console.'); - const debugConsoleErrorForeground = registerColor('debugConsole.errorForeground', { dark: errorForeground, light: errorForeground, hcDark: errorForeground, hcLight: errorForeground }, 'Foreground color for error messages in debug REPL console.'); - const debugConsoleSourceForeground = registerColor('debugConsole.sourceForeground', { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, 'Foreground color for source filenames in debug REPL console.'); - const debugConsoleInputIconForeground = registerColor('debugConsoleInputIcon.foreground', { dark: foreground, light: foreground, hcDark: foreground, hcLight: foreground }, 'Foreground color for debug console input marker icon.'); + const debugConsoleErrorForeground = registerColor('debugConsole.errorForeground', errorForeground, 'Foreground color for error messages in debug REPL console.'); + const debugConsoleSourceForeground = registerColor('debugConsole.sourceForeground', foreground, 'Foreground color for source filenames in debug REPL console.'); + const debugConsoleInputIconForeground = registerColor('debugConsoleInputIcon.foreground', foreground, 'Foreground color for debug console input marker icon.'); const debugIconPauseForeground = registerColor('debugIcon.pauseForeground', { dark: '#75BEFF', diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts index 7ef1947ea2c2a..5e3d5e9d583db 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts @@ -66,12 +66,7 @@ export const debugInlineForeground = registerColor('editor.inlineValuesForegroun hcLight: '#00000080' }, nls.localize('editor.inlineValuesForeground', "Color for the debug inline value text.")); -export const debugInlineBackground = registerColor('editor.inlineValuesBackground', { - dark: '#ffc80033', - light: '#ffc80033', - hcDark: '#ffc80033', - hcLight: '#ffc80033' -}, nls.localize('editor.inlineValuesBackground', "Color for the debug inline value background.")); +export const debugInlineBackground = registerColor('editor.inlineValuesBackground', '#ffc80033', nls.localize('editor.inlineValuesBackground', "Color for the debug inline value background.")); class InlineSegment { constructor(public column: number, public text: string) { diff --git a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts index 1b920801decf9..7c9b48503a20c 100644 --- a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts @@ -24,7 +24,7 @@ const $ = dom.$; // theming -const debugExceptionWidgetBorder = registerColor('debugExceptionWidget.border', { dark: '#a31515', light: '#a31515', hcDark: '#a31515', hcLight: '#a31515' }, nls.localize('debugExceptionWidgetBorder', 'Exception widget border color.')); +const debugExceptionWidgetBorder = registerColor('debugExceptionWidget.border', '#a31515', nls.localize('debugExceptionWidgetBorder', 'Exception widget border color.')); const debugExceptionWidgetBackground = registerColor('debugExceptionWidget.background', { dark: '#420b0d', light: '#f1dfde', hcDark: '#420b0d', hcLight: '#f1dfde' }, nls.localize('debugExceptionWidgetBackground', 'Exception widget background color.')); export class ExceptionWidget extends ZoneWidget { diff --git a/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts index 1968c0ccdeb47..54c881dfb53d5 100644 --- a/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts +++ b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { ColorTransformType, asCssVariable, asCssVariableName, registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { asCssVariable, asCssVariableName, registerColor, transparent } from 'vs/platform/theme/common/colorRegistry'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IDebugService, State, IDebugSession, IDebugConfiguration } from 'vs/workbench/contrib/debug/common/debug'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -31,21 +31,11 @@ export const STATUS_BAR_DEBUGGING_FOREGROUND = registerColor('statusBar.debuggin hcLight: '#FFFFFF' }, localize('statusBarDebuggingForeground', "Status bar foreground color when a program is being debugged. The status bar is shown in the bottom of the window")); -export const STATUS_BAR_DEBUGGING_BORDER = registerColor('statusBar.debuggingBorder', { - dark: STATUS_BAR_BORDER, - light: STATUS_BAR_BORDER, - hcDark: STATUS_BAR_BORDER, - hcLight: STATUS_BAR_BORDER -}, localize('statusBarDebuggingBorder', "Status bar border color separating to the sidebar and editor when a program is being debugged. The status bar is shown in the bottom of the window")); +export const STATUS_BAR_DEBUGGING_BORDER = registerColor('statusBar.debuggingBorder', STATUS_BAR_BORDER, localize('statusBarDebuggingBorder', "Status bar border color separating to the sidebar and editor when a program is being debugged. The status bar is shown in the bottom of the window")); export const COMMAND_CENTER_DEBUGGING_BACKGROUND = registerColor( 'commandCenter.debuggingBackground', - { - dark: { value: STATUS_BAR_DEBUGGING_BACKGROUND, op: ColorTransformType.Transparent, factor: 0.258 }, - hcDark: { value: STATUS_BAR_DEBUGGING_BACKGROUND, op: ColorTransformType.Transparent, factor: 0.258 }, - light: { value: STATUS_BAR_DEBUGGING_BACKGROUND, op: ColorTransformType.Transparent, factor: 0.258 }, - hcLight: { value: STATUS_BAR_DEBUGGING_BACKGROUND, op: ColorTransformType.Transparent, factor: 0.258 } - }, + transparent(STATUS_BAR_DEBUGGING_BACKGROUND, 0.258), localize('commandCenter-activeBackground', "Command center background color when a program is being debugged"), true ); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 7141e8effe416..0b5323a75a06d 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -3092,12 +3092,7 @@ registerColor('extensionButton.hoverBackground', { hcLight: null }, localize('extensionButtonHoverBackground', "Button background hover color for extension actions.")); -registerColor('extensionButton.separator', { - dark: buttonSeparator, - light: buttonSeparator, - hcDark: buttonSeparator, - hcLight: buttonSeparator -}, localize('extensionButtonSeparator', "Button separator color for extension actions")); +registerColor('extensionButton.separator', buttonSeparator, localize('extensionButtonSeparator', "Button separator color for extension actions")); export const extensionButtonProminentBackground = registerColor('extensionButton.prominentBackground', { dark: buttonBackground, diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts index 3a92bc9aa69a3..4b53d91cbc5a6 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts @@ -824,7 +824,7 @@ export class ExtensionRecommendationWidget extends ExtensionWidget { } export const extensionRatingIconColor = registerColor('extensionIcon.starForeground', { light: '#DF6100', dark: '#FF8E00', hcDark: '#FF8E00', hcLight: textLinkForeground }, localize('extensionIconStarForeground', "The icon color for extension ratings."), true); -export const extensionVerifiedPublisherIconColor = registerColor('extensionIcon.verifiedForeground', { dark: textLinkForeground, light: textLinkForeground, hcDark: textLinkForeground, hcLight: textLinkForeground }, localize('extensionIconVerifiedForeground', "The icon color for extension verified publisher."), true); +export const extensionVerifiedPublisherIconColor = registerColor('extensionIcon.verifiedForeground', textLinkForeground, localize('extensionIconVerifiedForeground', "The icon color for extension verified publisher."), true); export const extensionPreReleaseIconColor = registerColor('extensionIcon.preReleaseForeground', { dark: '#1d9271', light: '#1d9271', hcDark: '#1d9271', hcLight: textLinkForeground }, localize('extensionPreReleaseForeground', "The icon color for pre-release extension."), true); export const extensionSponsorIconColor = registerColor('extensionIcon.sponsorForeground', { light: '#B51E78', dark: '#D758B3', hcDark: null, hcLight: '#B51E78' }, localize('extensionIcon.sponsorForeground', "The icon color for extension sponsor."), true); diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index 3ab26fb433556..ee60b223f56dc 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -124,18 +124,18 @@ export const MENU_INLINE_CHAT_WIDGET_STATUS = MenuId.for('inlineChatWidget.statu // --- colors -export const inlineChatForeground = registerColor('inlineChat.foreground', { dark: editorWidgetForeground, light: editorWidgetForeground, hcDark: editorWidgetForeground, hcLight: editorWidgetForeground }, localize('inlineChat.foreground', "Foreground color of the interactive editor widget")); -export const inlineChatBackground = registerColor('inlineChat.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, localize('inlineChat.background', "Background color of the interactive editor widget")); -export const inlineChatBorder = registerColor('inlineChat.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize('inlineChat.border', "Border color of the interactive editor widget")); -export const inlineChatShadow = registerColor('inlineChat.shadow', { dark: widgetShadow, light: widgetShadow, hcDark: widgetShadow, hcLight: widgetShadow }, localize('inlineChat.shadow', "Shadow color of the interactive editor widget")); -export const inlineChatInputBorder = registerColor('inlineChatInput.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize('inlineChatInput.border', "Border color of the interactive editor input")); -export const inlineChatInputFocusBorder = registerColor('inlineChatInput.focusBorder', { dark: focusBorder, light: focusBorder, hcDark: focusBorder, hcLight: focusBorder }, localize('inlineChatInput.focusBorder', "Border color of the interactive editor input when focused")); -export const inlineChatInputPlaceholderForeground = registerColor('inlineChatInput.placeholderForeground', { dark: inputPlaceholderForeground, light: inputPlaceholderForeground, hcDark: inputPlaceholderForeground, hcLight: inputPlaceholderForeground }, localize('inlineChatInput.placeholderForeground', "Foreground color of the interactive editor input placeholder")); -export const inlineChatInputBackground = registerColor('inlineChatInput.background', { dark: inputBackground, light: inputBackground, hcDark: inputBackground, hcLight: inputBackground }, localize('inlineChatInput.background', "Background color of the interactive editor input")); - -export const inlineChatDiffInserted = registerColor('inlineChatDiff.inserted', { dark: transparent(diffInserted, .5), light: transparent(diffInserted, .5), hcDark: transparent(diffInserted, .5), hcLight: transparent(diffInserted, .5) }, localize('inlineChatDiff.inserted', "Background color of inserted text in the interactive editor input")); +export const inlineChatForeground = registerColor('inlineChat.foreground', editorWidgetForeground, localize('inlineChat.foreground', "Foreground color of the interactive editor widget")); +export const inlineChatBackground = registerColor('inlineChat.background', editorWidgetBackground, localize('inlineChat.background', "Background color of the interactive editor widget")); +export const inlineChatBorder = registerColor('inlineChat.border', editorWidgetBorder, localize('inlineChat.border', "Border color of the interactive editor widget")); +export const inlineChatShadow = registerColor('inlineChat.shadow', widgetShadow, localize('inlineChat.shadow', "Shadow color of the interactive editor widget")); +export const inlineChatInputBorder = registerColor('inlineChatInput.border', editorWidgetBorder, localize('inlineChatInput.border', "Border color of the interactive editor input")); +export const inlineChatInputFocusBorder = registerColor('inlineChatInput.focusBorder', focusBorder, localize('inlineChatInput.focusBorder', "Border color of the interactive editor input when focused")); +export const inlineChatInputPlaceholderForeground = registerColor('inlineChatInput.placeholderForeground', inputPlaceholderForeground, localize('inlineChatInput.placeholderForeground', "Foreground color of the interactive editor input placeholder")); +export const inlineChatInputBackground = registerColor('inlineChatInput.background', inputBackground, localize('inlineChatInput.background', "Background color of the interactive editor input")); + +export const inlineChatDiffInserted = registerColor('inlineChatDiff.inserted', transparent(diffInserted, .5), localize('inlineChatDiff.inserted', "Background color of inserted text in the interactive editor input")); export const overviewRulerInlineChatDiffInserted = registerColor('editorOverviewRuler.inlineChatInserted', { dark: transparent(diffInserted, 0.6), light: transparent(diffInserted, 0.8), hcDark: transparent(diffInserted, 0.6), hcLight: transparent(diffInserted, 0.8) }, localize('editorOverviewRuler.inlineChatInserted', 'Overview ruler marker color for inline chat inserted content.')); export const minimapInlineChatDiffInserted = registerColor('editorOverviewRuler.inlineChatInserted', { dark: transparent(diffInserted, 0.6), light: transparent(diffInserted, 0.8), hcDark: transparent(diffInserted, 0.6), hcLight: transparent(diffInserted, 0.8) }, localize('editorOverviewRuler.inlineChatInserted', 'Overview ruler marker color for inline chat inserted content.')); -export const inlineChatDiffRemoved = registerColor('inlineChatDiff.removed', { dark: transparent(diffRemoved, .5), light: transparent(diffRemoved, .5), hcDark: transparent(diffRemoved, .5), hcLight: transparent(diffRemoved, .5) }, localize('inlineChatDiff.removed', "Background color of removed text in the interactive editor input")); +export const inlineChatDiffRemoved = registerColor('inlineChatDiff.removed', transparent(diffRemoved, .5), localize('inlineChatDiff.removed', "Background color of removed text in the interactive editor input")); export const overviewRulerInlineChatDiffRemoved = registerColor('editorOverviewRuler.inlineChatRemoved', { dark: transparent(diffRemoved, 0.6), light: transparent(diffRemoved, 0.8), hcDark: transparent(diffRemoved, 0.6), hcLight: transparent(diffRemoved, 0.8) }, localize('editorOverviewRuler.inlineChatRemoved', 'Overview ruler marker color for inline chat removed content.')); diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/colors.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/colors.ts index cc6e57008128c..f8d1d8b6fcdae 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/colors.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/colors.ts @@ -8,7 +8,7 @@ import { mergeCurrentHeaderBackground, mergeIncomingHeaderBackground, registerCo export const diff = registerColor( 'mergeEditor.change.background', - { dark: '#9bb95533', light: '#9bb95533', hcDark: '#9bb95533', hcLight: '#9bb95533', }, + '#9bb95533', localize('mergeEditor.change.background', 'The background color for changes.') ); @@ -38,49 +38,49 @@ export const conflictBorderUnhandledUnfocused = registerColor( export const conflictBorderUnhandledFocused = registerColor( 'mergeEditor.conflict.unhandledFocused.border', - { dark: '#ffa600', light: '#ffa600', hcDark: '#ffa600', hcLight: '#ffa600', }, + '#ffa600', localize('mergeEditor.conflict.unhandledFocused.border', 'The border color of unhandled focused conflicts.') ); export const conflictBorderHandledUnfocused = registerColor( 'mergeEditor.conflict.handledUnfocused.border', - { dark: '#86868649', light: '#86868649', hcDark: '#86868649', hcLight: '#86868649', }, + '#86868649', localize('mergeEditor.conflict.handledUnfocused.border', 'The border color of handled unfocused conflicts.') ); export const conflictBorderHandledFocused = registerColor( 'mergeEditor.conflict.handledFocused.border', - { dark: '#c1c1c1cc', light: '#c1c1c1cc', hcDark: '#c1c1c1cc', hcLight: '#c1c1c1cc', }, + '#c1c1c1cc', localize('mergeEditor.conflict.handledFocused.border', 'The border color of handled focused conflicts.') ); export const handledConflictMinimapOverViewRulerColor = registerColor( 'mergeEditor.conflict.handled.minimapOverViewRuler', - { dark: '#adaca8ee', light: '#adaca8ee', hcDark: '#adaca8ee', hcLight: '#adaca8ee', }, + '#adaca8ee', localize('mergeEditor.conflict.handled.minimapOverViewRuler', 'The foreground color for changes in input 1.') ); export const unhandledConflictMinimapOverViewRulerColor = registerColor( 'mergeEditor.conflict.unhandled.minimapOverViewRuler', - { dark: '#fcba03FF', light: '#fcba03FF', hcDark: '#fcba03FF', hcLight: '#fcba03FF', }, + '#fcba03FF', localize('mergeEditor.conflict.unhandled.minimapOverViewRuler', 'The foreground color for changes in input 1.') ); export const conflictingLinesBackground = registerColor( 'mergeEditor.conflictingLines.background', - { dark: '#ffea0047', light: '#ffea0047', hcDark: '#ffea0047', hcLight: '#ffea0047', }, + '#ffea0047', localize('mergeEditor.conflictingLines.background', 'The background of the "Conflicting Lines" text.') ); const contentTransparency = 0.4; export const conflictInput1Background = registerColor( 'mergeEditor.conflict.input1.background', - { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hcDark: transparent(mergeCurrentHeaderBackground, contentTransparency), hcLight: transparent(mergeCurrentHeaderBackground, contentTransparency) }, + transparent(mergeCurrentHeaderBackground, contentTransparency), localize('mergeEditor.conflict.input1.background', 'The background color of decorations in input 1.') ); export const conflictInput2Background = registerColor( 'mergeEditor.conflict.input2.background', - { dark: transparent(mergeIncomingHeaderBackground, contentTransparency), light: transparent(mergeIncomingHeaderBackground, contentTransparency), hcDark: transparent(mergeIncomingHeaderBackground, contentTransparency), hcLight: transparent(mergeIncomingHeaderBackground, contentTransparency) }, + transparent(mergeIncomingHeaderBackground, contentTransparency), localize('mergeEditor.conflict.input2.background', 'The background color of decorations in input 2.') ); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 1e59c4cc13826..072a2a70593ba 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -3227,54 +3227,19 @@ export const notebookCellBorder = registerColor('notebook.cellBorderColor', { hcLight: PANEL_BORDER }, nls.localize('notebook.cellBorderColor', "The border color for notebook cells.")); -export const focusedEditorBorderColor = registerColor('notebook.focusedEditorBorder', { - light: focusBorder, - dark: focusBorder, - hcDark: focusBorder, - hcLight: focusBorder -}, nls.localize('notebook.focusedEditorBorder', "The color of the notebook cell editor border.")); - -export const cellStatusIconSuccess = registerColor('notebookStatusSuccessIcon.foreground', { - light: debugIconStartForeground, - dark: debugIconStartForeground, - hcDark: debugIconStartForeground, - hcLight: debugIconStartForeground -}, nls.localize('notebookStatusSuccessIcon.foreground', "The error icon color of notebook cells in the cell status bar.")); - -export const runningCellRulerDecorationColor = registerColor('notebookEditorOverviewRuler.runningCellForeground', { - light: debugIconStartForeground, - dark: debugIconStartForeground, - hcDark: debugIconStartForeground, - hcLight: debugIconStartForeground -}, nls.localize('notebookEditorOverviewRuler.runningCellForeground', "The color of the running cell decoration in the notebook editor overview ruler.")); - -export const cellStatusIconError = registerColor('notebookStatusErrorIcon.foreground', { - light: errorForeground, - dark: errorForeground, - hcDark: errorForeground, - hcLight: errorForeground -}, nls.localize('notebookStatusErrorIcon.foreground', "The error icon color of notebook cells in the cell status bar.")); - -export const cellStatusIconRunning = registerColor('notebookStatusRunningIcon.foreground', { - light: foreground, - dark: foreground, - hcDark: foreground, - hcLight: foreground -}, nls.localize('notebookStatusRunningIcon.foreground', "The running icon color of notebook cells in the cell status bar.")); - -export const notebookOutputContainerBorderColor = registerColor('notebook.outputContainerBorderColor', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, nls.localize('notebook.outputContainerBorderColor', "The border color of the notebook output container.")); +export const focusedEditorBorderColor = registerColor('notebook.focusedEditorBorder', focusBorder, nls.localize('notebook.focusedEditorBorder', "The color of the notebook cell editor border.")); -export const notebookOutputContainerColor = registerColor('notebook.outputContainerBackgroundColor', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, nls.localize('notebook.outputContainerBackgroundColor', "The color of the notebook output container background.")); +export const cellStatusIconSuccess = registerColor('notebookStatusSuccessIcon.foreground', debugIconStartForeground, nls.localize('notebookStatusSuccessIcon.foreground', "The error icon color of notebook cells in the cell status bar.")); + +export const runningCellRulerDecorationColor = registerColor('notebookEditorOverviewRuler.runningCellForeground', debugIconStartForeground, nls.localize('notebookEditorOverviewRuler.runningCellForeground', "The color of the running cell decoration in the notebook editor overview ruler.")); + +export const cellStatusIconError = registerColor('notebookStatusErrorIcon.foreground', errorForeground, nls.localize('notebookStatusErrorIcon.foreground', "The error icon color of notebook cells in the cell status bar.")); + +export const cellStatusIconRunning = registerColor('notebookStatusRunningIcon.foreground', foreground, nls.localize('notebookStatusRunningIcon.foreground', "The running icon color of notebook cells in the cell status bar.")); + +export const notebookOutputContainerBorderColor = registerColor('notebook.outputContainerBorderColor', null, nls.localize('notebook.outputContainerBorderColor', "The border color of the notebook output container.")); + +export const notebookOutputContainerColor = registerColor('notebook.outputContainerBackgroundColor', null, nls.localize('notebook.outputContainerBackgroundColor', "The color of the notebook output container background.")); // TODO@rebornix currently also used for toolbar border, if we keep all of this, pick a generic name export const CELL_TOOLBAR_SEPERATOR = registerColor('notebook.cellToolbarSeparator', { @@ -3284,12 +3249,7 @@ export const CELL_TOOLBAR_SEPERATOR = registerColor('notebook.cellToolbarSeparat hcLight: contrastBorder }, nls.localize('notebook.cellToolbarSeparator', "The color of the separator in the cell bottom toolbar")); -export const focusedCellBackground = registerColor('notebook.focusedCellBackground', { - dark: null, - light: null, - hcDark: null, - hcLight: null -}, nls.localize('focusedCellBackground', "The background color of a cell when the cell is focused.")); +export const focusedCellBackground = registerColor('notebook.focusedCellBackground', null, nls.localize('focusedCellBackground', "The background color of a cell when the cell is focused.")); export const selectedCellBackground = registerColor('notebook.selectedCellBackground', { dark: listInactiveSelectionBackground, @@ -3320,19 +3280,9 @@ export const inactiveSelectedCellBorder = registerColor('notebook.inactiveSelect hcLight: focusBorder }, nls.localize('notebook.inactiveSelectedCellBorder', "The color of the cell's borders when multiple cells are selected.")); -export const focusedCellBorder = registerColor('notebook.focusedCellBorder', { - dark: focusBorder, - light: focusBorder, - hcDark: focusBorder, - hcLight: focusBorder -}, nls.localize('notebook.focusedCellBorder', "The color of the cell's focus indicator borders when the cell is focused.")); +export const focusedCellBorder = registerColor('notebook.focusedCellBorder', focusBorder, nls.localize('notebook.focusedCellBorder', "The color of the cell's focus indicator borders when the cell is focused.")); -export const inactiveFocusedCellBorder = registerColor('notebook.inactiveFocusedCellBorder', { - dark: notebookCellBorder, - light: notebookCellBorder, - hcDark: notebookCellBorder, - hcLight: notebookCellBorder -}, nls.localize('notebook.inactiveFocusedCellBorder', "The color of the cell's top and bottom border when a cell is focused while the primary focus is outside of the editor.")); +export const inactiveFocusedCellBorder = registerColor('notebook.inactiveFocusedCellBorder', notebookCellBorder, nls.localize('notebook.inactiveFocusedCellBorder', "The color of the cell's top and bottom border when a cell is focused while the primary focus is outside of the editor.")); export const cellStatusBarItemHover = registerColor('notebook.cellStatusBarItemHoverBackground', { light: new Color(new RGBA(0, 0, 0, 0.08)), @@ -3341,33 +3291,13 @@ export const cellStatusBarItemHover = registerColor('notebook.cellStatusBarItemH hcLight: new Color(new RGBA(0, 0, 0, 0.08)), }, nls.localize('notebook.cellStatusBarItemHoverBackground', "The background color of notebook cell status bar items.")); -export const cellInsertionIndicator = registerColor('notebook.cellInsertionIndicator', { - light: focusBorder, - dark: focusBorder, - hcDark: focusBorder, - hcLight: focusBorder -}, nls.localize('notebook.cellInsertionIndicator', "The color of the notebook cell insertion indicator.")); - -export const listScrollbarSliderBackground = registerColor('notebookScrollbarSlider.background', { - dark: scrollbarSliderBackground, - light: scrollbarSliderBackground, - hcDark: scrollbarSliderBackground, - hcLight: scrollbarSliderBackground -}, nls.localize('notebookScrollbarSliderBackground', "Notebook scrollbar slider background color.")); - -export const listScrollbarSliderHoverBackground = registerColor('notebookScrollbarSlider.hoverBackground', { - dark: scrollbarSliderHoverBackground, - light: scrollbarSliderHoverBackground, - hcDark: scrollbarSliderHoverBackground, - hcLight: scrollbarSliderHoverBackground -}, nls.localize('notebookScrollbarSliderHoverBackground', "Notebook scrollbar slider background color when hovering.")); - -export const listScrollbarSliderActiveBackground = registerColor('notebookScrollbarSlider.activeBackground', { - dark: scrollbarSliderActiveBackground, - light: scrollbarSliderActiveBackground, - hcDark: scrollbarSliderActiveBackground, - hcLight: scrollbarSliderActiveBackground -}, nls.localize('notebookScrollbarSliderActiveBackground', "Notebook scrollbar slider background color when clicked on.")); +export const cellInsertionIndicator = registerColor('notebook.cellInsertionIndicator', focusBorder, nls.localize('notebook.cellInsertionIndicator', "The color of the notebook cell insertion indicator.")); + +export const listScrollbarSliderBackground = registerColor('notebookScrollbarSlider.background', scrollbarSliderBackground, nls.localize('notebookScrollbarSliderBackground', "Notebook scrollbar slider background color.")); + +export const listScrollbarSliderHoverBackground = registerColor('notebookScrollbarSlider.hoverBackground', scrollbarSliderHoverBackground, nls.localize('notebookScrollbarSliderHoverBackground', "Notebook scrollbar slider background color when hovering.")); + +export const listScrollbarSliderActiveBackground = registerColor('notebookScrollbarSlider.activeBackground', scrollbarSliderActiveBackground, nls.localize('notebookScrollbarSliderActiveBackground', "Notebook scrollbar slider background color when clicked on.")); export const cellSymbolHighlight = registerColor('notebook.symbolHighlightBackground', { dark: Color.fromHex('#ffffff0b'), diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index d1bbf48e3e86a..6f3c50861869d 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -1248,8 +1248,8 @@ class AccessibilityProvider implements IListAccessibilityProvider { const foregroundColor = theme.getColor(foreground); diff --git a/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.ts b/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.ts index 29841a282480a..bd5e4ef29c9c3 100644 --- a/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.ts +++ b/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.ts @@ -10,36 +10,36 @@ import { PANEL_BORDER } from 'vs/workbench/common/theme'; // General setting colors export const settingsHeaderForeground = registerColor('settings.headerForeground', { light: '#444444', dark: '#e7e7e7', hcDark: '#ffffff', hcLight: '#292929' }, localize('headerForeground', "The foreground color for a section header or active title.")); -export const settingsHeaderHoverForeground = registerColor('settings.settingsHeaderHoverForeground', { light: transparent(settingsHeaderForeground, 0.7), dark: transparent(settingsHeaderForeground, 0.7), hcDark: transparent(settingsHeaderForeground, 0.7), hcLight: transparent(settingsHeaderForeground, 0.7) }, localize('settingsHeaderHoverForeground', "The foreground color for a section header or hovered title.")); +export const settingsHeaderHoverForeground = registerColor('settings.settingsHeaderHoverForeground', transparent(settingsHeaderForeground, 0.7), localize('settingsHeaderHoverForeground', "The foreground color for a section header or hovered title.")); export const modifiedItemIndicator = registerColor('settings.modifiedItemIndicator', { light: new Color(new RGBA(102, 175, 224)), dark: new Color(new RGBA(12, 125, 157)), hcDark: new Color(new RGBA(0, 73, 122)), hcLight: new Color(new RGBA(102, 175, 224)), }, localize('modifiedItemForeground', "The color of the modified setting indicator.")); -export const settingsHeaderBorder = registerColor('settings.headerBorder', { dark: PANEL_BORDER, light: PANEL_BORDER, hcDark: PANEL_BORDER, hcLight: PANEL_BORDER }, localize('settingsHeaderBorder', "The color of the header container border.")); -export const settingsSashBorder = registerColor('settings.sashBorder', { dark: PANEL_BORDER, light: PANEL_BORDER, hcDark: PANEL_BORDER, hcLight: PANEL_BORDER }, localize('settingsSashBorder', "The color of the Settings editor splitview sash border.")); +export const settingsHeaderBorder = registerColor('settings.headerBorder', PANEL_BORDER, localize('settingsHeaderBorder', "The color of the header container border.")); +export const settingsSashBorder = registerColor('settings.sashBorder', PANEL_BORDER, localize('settingsSashBorder', "The color of the Settings editor splitview sash border.")); // Enum control colors -export const settingsSelectBackground = registerColor(`settings.dropdownBackground`, { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, localize('settingsDropdownBackground', "Settings editor dropdown background.")); -export const settingsSelectForeground = registerColor('settings.dropdownForeground', { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, localize('settingsDropdownForeground', "Settings editor dropdown foreground.")); -export const settingsSelectBorder = registerColor('settings.dropdownBorder', { dark: selectBorder, light: selectBorder, hcDark: selectBorder, hcLight: selectBorder }, localize('settingsDropdownBorder', "Settings editor dropdown border.")); -export const settingsSelectListBorder = registerColor('settings.dropdownListBorder', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, localize('settingsDropdownListBorder', "Settings editor dropdown list border. This surrounds the options and separates the options from the description.")); +export const settingsSelectBackground = registerColor(`settings.dropdownBackground`, selectBackground, localize('settingsDropdownBackground', "Settings editor dropdown background.")); +export const settingsSelectForeground = registerColor('settings.dropdownForeground', selectForeground, localize('settingsDropdownForeground', "Settings editor dropdown foreground.")); +export const settingsSelectBorder = registerColor('settings.dropdownBorder', selectBorder, localize('settingsDropdownBorder', "Settings editor dropdown border.")); +export const settingsSelectListBorder = registerColor('settings.dropdownListBorder', editorWidgetBorder, localize('settingsDropdownListBorder', "Settings editor dropdown list border. This surrounds the options and separates the options from the description.")); // Bool control colors -export const settingsCheckboxBackground = registerColor('settings.checkboxBackground', { dark: checkboxBackground, light: checkboxBackground, hcDark: checkboxBackground, hcLight: checkboxBackground }, localize('settingsCheckboxBackground', "Settings editor checkbox background.")); -export const settingsCheckboxForeground = registerColor('settings.checkboxForeground', { dark: checkboxForeground, light: checkboxForeground, hcDark: checkboxForeground, hcLight: checkboxForeground }, localize('settingsCheckboxForeground', "Settings editor checkbox foreground.")); -export const settingsCheckboxBorder = registerColor('settings.checkboxBorder', { dark: checkboxBorder, light: checkboxBorder, hcDark: checkboxBorder, hcLight: checkboxBorder }, localize('settingsCheckboxBorder', "Settings editor checkbox border.")); +export const settingsCheckboxBackground = registerColor('settings.checkboxBackground', checkboxBackground, localize('settingsCheckboxBackground', "Settings editor checkbox background.")); +export const settingsCheckboxForeground = registerColor('settings.checkboxForeground', checkboxForeground, localize('settingsCheckboxForeground', "Settings editor checkbox foreground.")); +export const settingsCheckboxBorder = registerColor('settings.checkboxBorder', checkboxBorder, localize('settingsCheckboxBorder', "Settings editor checkbox border.")); // Text control colors -export const settingsTextInputBackground = registerColor('settings.textInputBackground', { dark: inputBackground, light: inputBackground, hcDark: inputBackground, hcLight: inputBackground }, localize('textInputBoxBackground', "Settings editor text input box background.")); -export const settingsTextInputForeground = registerColor('settings.textInputForeground', { dark: inputForeground, light: inputForeground, hcDark: inputForeground, hcLight: inputForeground }, localize('textInputBoxForeground', "Settings editor text input box foreground.")); -export const settingsTextInputBorder = registerColor('settings.textInputBorder', { dark: inputBorder, light: inputBorder, hcDark: inputBorder, hcLight: inputBorder }, localize('textInputBoxBorder', "Settings editor text input box border.")); +export const settingsTextInputBackground = registerColor('settings.textInputBackground', inputBackground, localize('textInputBoxBackground', "Settings editor text input box background.")); +export const settingsTextInputForeground = registerColor('settings.textInputForeground', inputForeground, localize('textInputBoxForeground', "Settings editor text input box foreground.")); +export const settingsTextInputBorder = registerColor('settings.textInputBorder', inputBorder, localize('textInputBoxBorder', "Settings editor text input box border.")); // Number control colors -export const settingsNumberInputBackground = registerColor('settings.numberInputBackground', { dark: inputBackground, light: inputBackground, hcDark: inputBackground, hcLight: inputBackground }, localize('numberInputBoxBackground', "Settings editor number input box background.")); -export const settingsNumberInputForeground = registerColor('settings.numberInputForeground', { dark: inputForeground, light: inputForeground, hcDark: inputForeground, hcLight: inputForeground }, localize('numberInputBoxForeground', "Settings editor number input box foreground.")); -export const settingsNumberInputBorder = registerColor('settings.numberInputBorder', { dark: inputBorder, light: inputBorder, hcDark: inputBorder, hcLight: inputBorder }, localize('numberInputBoxBorder', "Settings editor number input box border.")); +export const settingsNumberInputBackground = registerColor('settings.numberInputBackground', inputBackground, localize('numberInputBoxBackground', "Settings editor number input box background.")); +export const settingsNumberInputForeground = registerColor('settings.numberInputForeground', inputForeground, localize('numberInputBoxForeground', "Settings editor number input box foreground.")); +export const settingsNumberInputBorder = registerColor('settings.numberInputBorder', inputBorder, localize('numberInputBoxBorder', "Settings editor number input box border.")); export const focusedRowBackground = registerColor('settings.focusedRowBackground', { dark: transparent(listHoverBackground, .6), @@ -55,9 +55,4 @@ export const rowHoverBackground = registerColor('settings.rowHoverBackground', { hcLight: null }, localize('settings.rowHoverBackground', "The background color of a settings row when hovered.")); -export const focusedRowBorder = registerColor('settings.focusedRowBorder', { - dark: focusBorder, - light: focusBorder, - hcDark: focusBorder, - hcLight: focusBorder -}, localize('settings.focusedRowBorder', "The color of the row's top and bottom border when the row is focused.")); +export const focusedRowBorder = registerColor('settings.focusedRowBorder', focusBorder, localize('settings.focusedRowBorder', "The color of the row's top and bottom border when the row is focused.")); diff --git a/src/vs/workbench/contrib/remote/browser/tunnelView.ts b/src/vs/workbench/contrib/remote/browser/tunnelView.ts index aa8ce0ff5145b..a1b6e3ae2bec3 100644 --- a/src/vs/workbench/contrib/remote/browser/tunnelView.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelView.ts @@ -1818,10 +1818,5 @@ MenuRegistry.appendMenuItem(MenuId.TunnelLocalAddressInline, ({ when: isForwardedOrDetectedExpr })); -registerColor('ports.iconRunningProcessForeground', { - light: STATUS_BAR_REMOTE_ITEM_BACKGROUND, - dark: STATUS_BAR_REMOTE_ITEM_BACKGROUND, - hcDark: STATUS_BAR_REMOTE_ITEM_BACKGROUND, - hcLight: STATUS_BAR_REMOTE_ITEM_BACKGROUND -}, nls.localize('portWithRunningProcess.foreground', "The color of the icon for a port that has an associated running process.")); +registerColor('ports.iconRunningProcessForeground', STATUS_BAR_REMOTE_ITEM_BACKGROUND, nls.localize('portWithRunningProcess.foreground', "The color of the icon for a port that has an associated running process.")); diff --git a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts index 7537f80f534cd..173cdb04fd046 100644 --- a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts @@ -1013,37 +1013,17 @@ const editorGutterAddedBackground = registerColor('editorGutter.addedBackground' hcLight: '#48985D' }, nls.localize('editorGutterAddedBackground', "Editor gutter background color for lines that are added.")); -const editorGutterDeletedBackground = registerColor('editorGutter.deletedBackground', { - dark: editorErrorForeground, - light: editorErrorForeground, - hcDark: editorErrorForeground, - hcLight: editorErrorForeground -}, nls.localize('editorGutterDeletedBackground', "Editor gutter background color for lines that are deleted.")); - -const minimapGutterModifiedBackground = registerColor('minimapGutter.modifiedBackground', { - dark: editorGutterModifiedBackground, - light: editorGutterModifiedBackground, - hcDark: editorGutterModifiedBackground, - hcLight: editorGutterModifiedBackground -}, nls.localize('minimapGutterModifiedBackground', "Minimap gutter background color for lines that are modified.")); - -const minimapGutterAddedBackground = registerColor('minimapGutter.addedBackground', { - dark: editorGutterAddedBackground, - light: editorGutterAddedBackground, - hcDark: editorGutterAddedBackground, - hcLight: editorGutterAddedBackground -}, nls.localize('minimapGutterAddedBackground', "Minimap gutter background color for lines that are added.")); - -const minimapGutterDeletedBackground = registerColor('minimapGutter.deletedBackground', { - dark: editorGutterDeletedBackground, - light: editorGutterDeletedBackground, - hcDark: editorGutterDeletedBackground, - hcLight: editorGutterDeletedBackground -}, nls.localize('minimapGutterDeletedBackground', "Minimap gutter background color for lines that are deleted.")); - -const overviewRulerModifiedForeground = registerColor('editorOverviewRuler.modifiedForeground', { dark: transparent(editorGutterModifiedBackground, 0.6), light: transparent(editorGutterModifiedBackground, 0.6), hcDark: transparent(editorGutterModifiedBackground, 0.6), hcLight: transparent(editorGutterModifiedBackground, 0.6) }, nls.localize('overviewRulerModifiedForeground', 'Overview ruler marker color for modified content.')); -const overviewRulerAddedForeground = registerColor('editorOverviewRuler.addedForeground', { dark: transparent(editorGutterAddedBackground, 0.6), light: transparent(editorGutterAddedBackground, 0.6), hcDark: transparent(editorGutterAddedBackground, 0.6), hcLight: transparent(editorGutterAddedBackground, 0.6) }, nls.localize('overviewRulerAddedForeground', 'Overview ruler marker color for added content.')); -const overviewRulerDeletedForeground = registerColor('editorOverviewRuler.deletedForeground', { dark: transparent(editorGutterDeletedBackground, 0.6), light: transparent(editorGutterDeletedBackground, 0.6), hcDark: transparent(editorGutterDeletedBackground, 0.6), hcLight: transparent(editorGutterDeletedBackground, 0.6) }, nls.localize('overviewRulerDeletedForeground', 'Overview ruler marker color for deleted content.')); +const editorGutterDeletedBackground = registerColor('editorGutter.deletedBackground', editorErrorForeground, nls.localize('editorGutterDeletedBackground', "Editor gutter background color for lines that are deleted.")); + +const minimapGutterModifiedBackground = registerColor('minimapGutter.modifiedBackground', editorGutterModifiedBackground, nls.localize('minimapGutterModifiedBackground', "Minimap gutter background color for lines that are modified.")); + +const minimapGutterAddedBackground = registerColor('minimapGutter.addedBackground', editorGutterAddedBackground, nls.localize('minimapGutterAddedBackground', "Minimap gutter background color for lines that are added.")); + +const minimapGutterDeletedBackground = registerColor('minimapGutter.deletedBackground', editorGutterDeletedBackground, nls.localize('minimapGutterDeletedBackground', "Minimap gutter background color for lines that are deleted.")); + +const overviewRulerModifiedForeground = registerColor('editorOverviewRuler.modifiedForeground', transparent(editorGutterModifiedBackground, 0.6), nls.localize('overviewRulerModifiedForeground', 'Overview ruler marker color for modified content.')); +const overviewRulerAddedForeground = registerColor('editorOverviewRuler.addedForeground', transparent(editorGutterAddedBackground, 0.6), nls.localize('overviewRulerAddedForeground', 'Overview ruler marker color for added content.')); +const overviewRulerDeletedForeground = registerColor('editorOverviewRuler.deletedForeground', transparent(editorGutterDeletedBackground, 0.6), nls.localize('overviewRulerDeletedForeground', 'Overview ruler marker color for deleted content.')); class DirtyDiffDecorator extends Disposable { diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 988cbda14041e..0961bec262787 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -130,33 +130,13 @@ type TreeElement = type ShowChangesSetting = 'always' | 'never' | 'auto'; -registerColor('scm.historyItemAdditionsForeground', { - dark: 'gitDecoration.addedResourceForeground', - light: 'gitDecoration.addedResourceForeground', - hcDark: 'gitDecoration.addedResourceForeground', - hcLight: 'gitDecoration.addedResourceForeground' -}, localize('scm.historyItemAdditionsForeground', "History item additions foreground color.")); - -registerColor('scm.historyItemDeletionsForeground', { - dark: 'gitDecoration.deletedResourceForeground', - light: 'gitDecoration.deletedResourceForeground', - hcDark: 'gitDecoration.deletedResourceForeground', - hcLight: 'gitDecoration.deletedResourceForeground' -}, localize('scm.historyItemDeletionsForeground', "History item deletions foreground color.")); - -registerColor('scm.historyItemStatisticsBorder', { - dark: transparent(foreground, 0.2), - light: transparent(foreground, 0.2), - hcDark: transparent(foreground, 0.2), - hcLight: transparent(foreground, 0.2) -}, localize('scm.historyItemStatisticsBorder', "History item statistics border color.")); - -registerColor('scm.historyItemSelectedStatisticsBorder', { - dark: transparent(listActiveSelectionForeground, 0.2), - light: transparent(listActiveSelectionForeground, 0.2), - hcDark: transparent(listActiveSelectionForeground, 0.2), - hcLight: transparent(listActiveSelectionForeground, 0.2) -}, localize('scm.historyItemSelectedStatisticsBorder', "History item selected statistics border color.")); +registerColor('scm.historyItemAdditionsForeground', 'gitDecoration.addedResourceForeground', localize('scm.historyItemAdditionsForeground', "History item additions foreground color.")); + +registerColor('scm.historyItemDeletionsForeground', 'gitDecoration.deletedResourceForeground', localize('scm.historyItemDeletionsForeground', "History item deletions foreground color.")); + +registerColor('scm.historyItemStatisticsBorder', transparent(foreground, 0.2), localize('scm.historyItemStatisticsBorder', "History item statistics border color.")); + +registerColor('scm.historyItemSelectedStatisticsBorder', transparent(listActiveSelectionForeground, 0.2), localize('scm.historyItemSelectedStatisticsBorder', "History item selected statistics border color.")); function processResourceFilterData(uri: URI, filterData: FuzzyScore | LabelFuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] { if (!filterData) { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index 5bf122311af97..c3577b4e873d4 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -776,7 +776,7 @@ export class SearchEditor extends AbstractTextCodeEditor } } -const searchEditorTextInputBorder = registerColor('searchEditor.textInputBorder', { dark: inputBorder, light: inputBorder, hcDark: inputBorder, hcLight: inputBorder }, localize('textInputBoxBorder', "Search editor text input box border.")); +const searchEditorTextInputBorder = registerColor('searchEditor.textInputBorder', inputBorder, localize('textInputBoxBorder', "Search editor text input box border.")); function findNextRange(matchRanges: Range[], currentPosition: Position) { for (const matchRange of matchRanges) { diff --git a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts index 0750923f614b1..86a5a037b4dd2 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts @@ -23,12 +23,7 @@ export const TERMINAL_FOREGROUND_COLOR = registerColor('terminal.foreground', { }, nls.localize('terminal.foreground', 'The foreground color of the terminal.')); export const TERMINAL_CURSOR_FOREGROUND_COLOR = registerColor('terminalCursor.foreground', null, nls.localize('terminalCursor.foreground', 'The foreground color of the terminal cursor.')); export const TERMINAL_CURSOR_BACKGROUND_COLOR = registerColor('terminalCursor.background', null, nls.localize('terminalCursor.background', 'The background color of the terminal cursor. Allows customizing the color of a character overlapped by a block cursor.')); -export const TERMINAL_SELECTION_BACKGROUND_COLOR = registerColor('terminal.selectionBackground', { - light: editorSelectionBackground, - dark: editorSelectionBackground, - hcDark: editorSelectionBackground, - hcLight: editorSelectionBackground -}, nls.localize('terminal.selectionBackground', 'The selection background color of the terminal.')); +export const TERMINAL_SELECTION_BACKGROUND_COLOR = registerColor('terminal.selectionBackground', editorSelectionBackground, nls.localize('terminal.selectionBackground', 'The selection background color of the terminal.')); export const TERMINAL_INACTIVE_SELECTION_BACKGROUND_COLOR = registerColor('terminal.inactiveSelectionBackground', { light: transparent(TERMINAL_SELECTION_BACKGROUND_COLOR, 0.5), dark: transparent(TERMINAL_SELECTION_BACKGROUND_COLOR, 0.5), @@ -59,18 +54,8 @@ export const TERMINAL_COMMAND_DECORATION_ERROR_BACKGROUND_COLOR = registerColor( hcDark: '#F14C4C', hcLight: '#B5200D' }, nls.localize('terminalCommandDecoration.errorBackground', 'The terminal command decoration background color for error commands.')); -export const TERMINAL_OVERVIEW_RULER_CURSOR_FOREGROUND_COLOR = registerColor('terminalOverviewRuler.cursorForeground', { - dark: '#A0A0A0CC', - light: '#A0A0A0CC', - hcDark: '#A0A0A0CC', - hcLight: '#A0A0A0CC' -}, nls.localize('terminalOverviewRuler.cursorForeground', 'The overview ruler cursor color.')); -export const TERMINAL_BORDER_COLOR = registerColor('terminal.border', { - dark: PANEL_BORDER, - light: PANEL_BORDER, - hcDark: PANEL_BORDER, - hcLight: PANEL_BORDER -}, nls.localize('terminal.border', 'The color of the border that separates split panes within the terminal. This defaults to panel.border.')); +export const TERMINAL_OVERVIEW_RULER_CURSOR_FOREGROUND_COLOR = registerColor('terminalOverviewRuler.cursorForeground', '#A0A0A0CC', nls.localize('terminalOverviewRuler.cursorForeground', 'The overview ruler cursor color.')); +export const TERMINAL_BORDER_COLOR = registerColor('terminal.border', PANEL_BORDER, nls.localize('terminal.border', 'The color of the border that separates split panes within the terminal. This defaults to panel.border.')); export const TERMINAL_FIND_MATCH_BACKGROUND_COLOR = registerColor('terminal.findMatchBackground', { dark: editorFindMatch, light: editorFindMatch, @@ -78,12 +63,7 @@ export const TERMINAL_FIND_MATCH_BACKGROUND_COLOR = registerColor('terminal.find hcDark: null, hcLight: '#0F4A85' }, nls.localize('terminal.findMatchBackground', 'Color of the current search match in the terminal. The color must not be opaque so as not to hide underlying terminal content.'), true); -export const TERMINAL_HOVER_HIGHLIGHT_BACKGROUND_COLOR = registerColor('terminal.hoverHighlightBackground', { - dark: transparent(editorHoverHighlight, 0.5), - light: transparent(editorHoverHighlight, 0.5), - hcDark: transparent(editorHoverHighlight, 0.5), - hcLight: transparent(editorHoverHighlight, 0.5) -}, nls.localize('terminal.findMatchHighlightBorder', 'Border color of the other search matches in the terminal.')); +export const TERMINAL_HOVER_HIGHLIGHT_BACKGROUND_COLOR = registerColor('terminal.hoverHighlightBackground', transparent(editorHoverHighlight, 0.5), nls.localize('terminal.findMatchHighlightBorder', 'Border color of the other search matches in the terminal.')); export const TERMINAL_FIND_MATCH_BORDER_COLOR = registerColor('terminal.findMatchBorder', { dark: null, light: null, @@ -108,18 +88,8 @@ export const TERMINAL_OVERVIEW_RULER_FIND_MATCH_FOREGROUND_COLOR = registerColor hcDark: '#f38518', hcLight: '#0F4A85' }, nls.localize('terminalOverviewRuler.findMatchHighlightForeground', 'Overview ruler marker color for find matches in the terminal.')); -export const TERMINAL_DRAG_AND_DROP_BACKGROUND = registerColor('terminal.dropBackground', { - dark: EDITOR_DRAG_AND_DROP_BACKGROUND, - light: EDITOR_DRAG_AND_DROP_BACKGROUND, - hcDark: EDITOR_DRAG_AND_DROP_BACKGROUND, - hcLight: EDITOR_DRAG_AND_DROP_BACKGROUND -}, nls.localize('terminal.dragAndDropBackground', "Background color when dragging on top of terminals. The color should have transparency so that the terminal contents can still shine through."), true); -export const TERMINAL_TAB_ACTIVE_BORDER = registerColor('terminal.tab.activeBorder', { - dark: TAB_ACTIVE_BORDER, - light: TAB_ACTIVE_BORDER, - hcDark: TAB_ACTIVE_BORDER, - hcLight: TAB_ACTIVE_BORDER -}, nls.localize('terminal.tab.activeBorder', 'Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.')); +export const TERMINAL_DRAG_AND_DROP_BACKGROUND = registerColor('terminal.dropBackground', EDITOR_DRAG_AND_DROP_BACKGROUND, nls.localize('terminal.dragAndDropBackground', "Background color when dragging on top of terminals. The color should have transparency so that the terminal contents can still shine through."), true); +export const TERMINAL_TAB_ACTIVE_BORDER = registerColor('terminal.tab.activeBorder', TAB_ACTIVE_BORDER, nls.localize('terminal.tab.activeBorder', 'Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.')); export const TERMINAL_INITIAL_HINT_FOREGROUND = registerColor('terminal.initialHintForeground', { dark: '#ffffff56', light: '#0007', diff --git a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts index bc18c7db09379..ed805826706e6 100644 --- a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts +++ b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollColorRegistry.ts @@ -6,12 +6,7 @@ import { localize } from 'vs/nls'; import { registerColor } from 'vs/platform/theme/common/colorUtils'; -export const terminalStickyScrollBackground = registerColor('terminalStickyScroll.background', { - light: null, - dark: null, - hcDark: null, - hcLight: null -}, localize('terminalStickyScroll.background', 'The background color of the sticky scroll overlay in the terminal.')); +export const terminalStickyScrollBackground = registerColor('terminalStickyScroll.background', null, localize('terminalStickyScroll.background', 'The background color of the sticky scroll overlay in the terminal.')); export const terminalStickyScrollHoverBackground = registerColor('terminalStickyScrollHover.background', { dark: '#2A2D2E', diff --git a/src/vs/workbench/contrib/testing/browser/theme.ts b/src/vs/workbench/contrib/testing/browser/theme.ts index 536c03da5f99f..0c088a787c36e 100644 --- a/src/vs/workbench/contrib/testing/browser/theme.ts +++ b/src/vs/workbench/contrib/testing/browser/theme.ts @@ -30,33 +30,13 @@ export const testingColorIconPassed = registerColor('testing.iconPassed', { hcLight: '#007100' }, localize('testing.iconPassed', "Color for the 'passed' icon in the test explorer.")); -export const testingColorRunAction = registerColor('testing.runAction', { - dark: testingColorIconPassed, - light: testingColorIconPassed, - hcDark: testingColorIconPassed, - hcLight: testingColorIconPassed -}, localize('testing.runAction', "Color for 'run' icons in the editor.")); - -export const testingColorIconQueued = registerColor('testing.iconQueued', { - dark: '#cca700', - light: '#cca700', - hcDark: '#cca700', - hcLight: '#cca700' -}, localize('testing.iconQueued', "Color for the 'Queued' icon in the test explorer.")); - -export const testingColorIconUnset = registerColor('testing.iconUnset', { - dark: '#848484', - light: '#848484', - hcDark: '#848484', - hcLight: '#848484' -}, localize('testing.iconUnset', "Color for the 'Unset' icon in the test explorer.")); - -export const testingColorIconSkipped = registerColor('testing.iconSkipped', { - dark: '#848484', - light: '#848484', - hcDark: '#848484', - hcLight: '#848484' -}, localize('testing.iconSkipped', "Color for the 'Skipped' icon in the test explorer.")); +export const testingColorRunAction = registerColor('testing.runAction', testingColorIconPassed, localize('testing.runAction', "Color for 'run' icons in the editor.")); + +export const testingColorIconQueued = registerColor('testing.iconQueued', '#cca700', localize('testing.iconQueued', "Color for the 'Queued' icon in the test explorer.")); + +export const testingColorIconUnset = registerColor('testing.iconUnset', '#848484', localize('testing.iconUnset', "Color for the 'Unset' icon in the test explorer.")); + +export const testingColorIconSkipped = registerColor('testing.iconSkipped', '#848484', localize('testing.iconSkipped', "Color for the 'Skipped' icon in the test explorer.")); export const testingPeekBorder = registerColor('testing.peekBorder', { dark: editorErrorForeground, @@ -135,19 +115,9 @@ export const testingUncoveredGutterBackground = registerColor('testing.uncovered hcLight: chartsRed }, localize('testing.uncoveredGutterBackground', 'Gutter color of regions where code not covered.')); -export const testingCoverCountBadgeBackground = registerColor('testing.coverCountBadgeBackground', { - dark: badgeBackground, - light: badgeBackground, - hcDark: badgeBackground, - hcLight: badgeBackground -}, localize('testing.coverCountBadgeBackground', 'Background for the badge indicating execution count')); +export const testingCoverCountBadgeBackground = registerColor('testing.coverCountBadgeBackground', badgeBackground, localize('testing.coverCountBadgeBackground', 'Background for the badge indicating execution count')); -export const testingCoverCountBadgeForeground = registerColor('testing.coverCountBadgeForeground', { - dark: badgeForeground, - light: badgeForeground, - hcDark: badgeForeground, - hcLight: badgeForeground -}, localize('testing.coverCountBadgeForeground', 'Foreground for the badge indicating execution count')); +export const testingCoverCountBadgeForeground = registerColor('testing.coverCountBadgeForeground', badgeForeground, localize('testing.coverCountBadgeForeground', 'Foreground for the badge indicating execution count')); export const testMessageSeverityColors: { [K in TestMessageType]: { @@ -170,12 +140,12 @@ export const testMessageSeverityColors: { [TestMessageType.Output]: { decorationForeground: registerColor( 'testing.message.info.decorationForeground', - { dark: transparent(editorForeground, 0.5), light: transparent(editorForeground, 0.5), hcDark: transparent(editorForeground, 0.5), hcLight: transparent(editorForeground, 0.5) }, + transparent(editorForeground, 0.5), localize('testing.message.info.decorationForeground', 'Text color of test info messages shown inline in the editor.') ), marginBackground: registerColor( 'testing.message.info.lineBackground', - { dark: null, light: null, hcDark: null, hcLight: null }, + null, localize('testing.message.info.marginBackground', 'Margin color beside info messages shown inline in the editor.') ), }, @@ -190,47 +160,17 @@ export const testStatesToIconColors: { [K in TestResultState]?: string } = { [TestResultState.Skipped]: testingColorIconSkipped, }; -export const testingRetiredColorIconErrored = registerColor('testing.iconErrored.retired', { - dark: transparent(testingColorIconErrored, 0.7), - light: transparent(testingColorIconErrored, 0.7), - hcDark: transparent(testingColorIconErrored, 0.7), - hcLight: transparent(testingColorIconErrored, 0.7) -}, localize('testing.iconErrored.retired', "Retired color for the 'Errored' icon in the test explorer.")); - -export const testingRetiredColorIconFailed = registerColor('testing.iconFailed.retired', { - dark: transparent(testingColorIconFailed, 0.7), - light: transparent(testingColorIconFailed, 0.7), - hcDark: transparent(testingColorIconFailed, 0.7), - hcLight: transparent(testingColorIconFailed, 0.7) -}, localize('testing.iconFailed.retired', "Retired color for the 'failed' icon in the test explorer.")); - -export const testingRetiredColorIconPassed = registerColor('testing.iconPassed.retired', { - dark: transparent(testingColorIconPassed, 0.7), - light: transparent(testingColorIconPassed, 0.7), - hcDark: transparent(testingColorIconPassed, 0.7), - hcLight: transparent(testingColorIconPassed, 0.7) -}, localize('testing.iconPassed.retired', "Retired color for the 'passed' icon in the test explorer.")); - -export const testingRetiredColorIconQueued = registerColor('testing.iconQueued.retired', { - dark: transparent(testingColorIconQueued, 0.7), - light: transparent(testingColorIconQueued, 0.7), - hcDark: transparent(testingColorIconQueued, 0.7), - hcLight: transparent(testingColorIconQueued, 0.7) -}, localize('testing.iconQueued.retired', "Retired color for the 'Queued' icon in the test explorer.")); - -export const testingRetiredColorIconUnset = registerColor('testing.iconUnset.retired', { - dark: transparent(testingColorIconUnset, 0.7), - light: transparent(testingColorIconUnset, 0.7), - hcDark: transparent(testingColorIconUnset, 0.7), - hcLight: transparent(testingColorIconUnset, 0.7) -}, localize('testing.iconUnset.retired', "Retired color for the 'Unset' icon in the test explorer.")); - -export const testingRetiredColorIconSkipped = registerColor('testing.iconSkipped.retired', { - dark: transparent(testingColorIconSkipped, 0.7), - light: transparent(testingColorIconSkipped, 0.7), - hcDark: transparent(testingColorIconSkipped, 0.7), - hcLight: transparent(testingColorIconSkipped, 0.7) -}, localize('testing.iconSkipped.retired', "Retired color for the 'Skipped' icon in the test explorer.")); +export const testingRetiredColorIconErrored = registerColor('testing.iconErrored.retired', transparent(testingColorIconErrored, 0.7), localize('testing.iconErrored.retired', "Retired color for the 'Errored' icon in the test explorer.")); + +export const testingRetiredColorIconFailed = registerColor('testing.iconFailed.retired', transparent(testingColorIconFailed, 0.7), localize('testing.iconFailed.retired', "Retired color for the 'failed' icon in the test explorer.")); + +export const testingRetiredColorIconPassed = registerColor('testing.iconPassed.retired', transparent(testingColorIconPassed, 0.7), localize('testing.iconPassed.retired', "Retired color for the 'passed' icon in the test explorer.")); + +export const testingRetiredColorIconQueued = registerColor('testing.iconQueued.retired', transparent(testingColorIconQueued, 0.7), localize('testing.iconQueued.retired', "Retired color for the 'Queued' icon in the test explorer.")); + +export const testingRetiredColorIconUnset = registerColor('testing.iconUnset.retired', transparent(testingColorIconUnset, 0.7), localize('testing.iconUnset.retired', "Retired color for the 'Unset' icon in the test explorer.")); + +export const testingRetiredColorIconSkipped = registerColor('testing.iconSkipped.retired', transparent(testingColorIconSkipped, 0.7), localize('testing.iconSkipped.retired', "Retired color for the 'Skipped' icon in the test explorer.")); export const testStatesToRetiredIconColors: { [K in TestResultState]?: string } = { [TestResultState.Errored]: testingRetiredColorIconErrored, diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 6c47eb9557c4e..8ddcc3527b531 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -56,7 +56,7 @@ import { Codicon } from 'vs/base/common/codicons'; import { WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { createInstantHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; -export const profilesSashBorder = registerColor('profiles.sashBorder', { dark: PANEL_BORDER, light: PANEL_BORDER, hcDark: PANEL_BORDER, hcLight: PANEL_BORDER }, localize('profilesSashBorder', "The color of the Profiles editor splitview sash border.")); +export const profilesSashBorder = registerColor('profiles.sashBorder', PANEL_BORDER, localize('profilesSashBorder', "The color of the Profiles editor splitview sash border.")); export class UserDataProfilesEditor extends EditorPane implements IUserDataProfilesEditor { diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.ts index 8e934b891a3f6..e3227a80af487 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.ts @@ -7,14 +7,14 @@ import { darken, inputBackground, editorWidgetBackground, lighten, registerColor import { localize } from 'vs/nls'; // Seprate from main module to break dependency cycles between welcomePage and gettingStarted. -export const welcomePageBackground = registerColor('welcomePage.background', { light: null, dark: null, hcDark: null, hcLight: null }, localize('welcomePage.background', 'Background color for the Welcome page.')); +export const welcomePageBackground = registerColor('welcomePage.background', null, localize('welcomePage.background', 'Background color for the Welcome page.')); export const welcomePageTileBackground = registerColor('welcomePage.tileBackground', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: '#000', hcLight: editorWidgetBackground }, localize('welcomePage.tileBackground', 'Background color for the tiles on the Welcome page.')); export const welcomePageTileHoverBackground = registerColor('welcomePage.tileHoverBackground', { dark: lighten(editorWidgetBackground, .2), light: darken(editorWidgetBackground, .1), hcDark: null, hcLight: null }, localize('welcomePage.tileHoverBackground', 'Hover background color for the tiles on the Welcome.')); export const welcomePageTileBorder = registerColor('welcomePage.tileBorder', { dark: '#ffffff1a', light: '#0000001a', hcDark: contrastBorder, hcLight: contrastBorder }, localize('welcomePage.tileBorder', 'Border color for the tiles on the Welcome page.')); -export const welcomePageProgressBackground = registerColor('welcomePage.progress.background', { light: inputBackground, dark: inputBackground, hcDark: inputBackground, hcLight: inputBackground }, localize('welcomePage.progress.background', 'Foreground color for the Welcome page progress bars.')); -export const welcomePageProgressForeground = registerColor('welcomePage.progress.foreground', { light: textLinkForeground, dark: textLinkForeground, hcDark: textLinkForeground, hcLight: textLinkForeground }, localize('welcomePage.progress.foreground', 'Background color for the Welcome page progress bars.')); +export const welcomePageProgressBackground = registerColor('welcomePage.progress.background', inputBackground, localize('welcomePage.progress.background', 'Foreground color for the Welcome page progress bars.')); +export const welcomePageProgressForeground = registerColor('welcomePage.progress.foreground', textLinkForeground, localize('welcomePage.progress.foreground', 'Background color for the Welcome page progress bars.')); export const walkthroughStepTitleForeground = registerColor('walkthrough.stepTitle.foreground', { light: '#000000', dark: '#ffffff', hcDark: null, hcLight: null }, localize('walkthrough.stepTitle.foreground', 'Foreground color of the heading of each walkthrough step')); From b36286db80c68b7fdc6bfee2f55e0208c8833dfc Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:16:20 +0200 Subject: [PATCH 478/755] Fix property undefined bug (#217800) * fix property undefined bug * only set source of overrides --- .../common/configurationRegistry.ts | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index d7e9ae576b0bd..322e807f0a73a 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -406,31 +406,41 @@ class ConfigurationRegistry implements IConfigurationRegistry { this.defaultLanguageConfigurationOverridesNode.properties![key] = property; } else { const property = this.configurationProperties[key]; - let defaultValue = overrides[key]; - let defaultValueSource: ConfigurationDefaultValueSource | undefined = source; + + const existingDefaultOverride = this.configurationDefaultsOverrides.get(key); + let existingDefaultValue = existingDefaultOverride?.value ?? property?.defaultDefaultValue; + + let newDefaultValue = overrides[key]; + let newDefaultValueSource: ConfigurationDefaultValueSource | undefined = source; + + const isObjectSetting = types.isObject(newDefaultValue) && ( + property !== undefined && property.type === 'object' || + property === undefined && (types.isUndefined(existingDefaultValue) || types.isObject(existingDefaultValue))); // If the default value is an object, merge the objects and store the source of each keys - if (property.type === 'object' && types.isObject(overrides[key])) { - const objectDefaults = this.configurationDefaultsOverrides.get(key); - const existingDefaultValue = objectDefaults?.value ?? property.defaultDefaultValue ?? {}; - defaultValue = { ...existingDefaultValue, ...overrides[key] }; + if (isObjectSetting) { + if (!types.isObject(existingDefaultValue)) { + existingDefaultValue = {}; + } + + newDefaultValue = { ...existingDefaultValue, ...newDefaultValue }; - defaultValueSource = objectDefaults?.source ?? new Map(); - if (!(defaultValueSource instanceof Map)) { + newDefaultValueSource = existingDefaultOverride?.source ?? new Map(); + if (!(newDefaultValueSource instanceof Map)) { console.error('defaultValueSource is not a Map'); continue; } - for (const objectKey in overrides[key]) { + for (const overrideObjectKey in overrides[key]) { if (source) { - defaultValueSource.set(objectKey, source); + newDefaultValueSource.set(overrideObjectKey, source); } else { - defaultValueSource.delete(objectKey); + newDefaultValueSource.delete(overrideObjectKey); } } } - this.configurationDefaultsOverrides.set(key, { value: defaultValue, source: defaultValueSource }); + this.configurationDefaultsOverrides.set(key, { value: newDefaultValue, source: newDefaultValueSource }); if (property) { this.updatePropertyDefaultValue(key, property); From 1b27e602ed26c3aa7d232788c5ca32edc41b9bba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 13:45:49 +0200 Subject: [PATCH 479/755] Bump ws from 8.13.0 to 8.17.1 in /extensions/notebook-renderers (#216556) Bumps [ws](https://github.com/websockets/ws) from 8.13.0 to 8.17.1. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.13.0...8.17.1) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- extensions/notebook-renderers/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/notebook-renderers/yarn.lock b/extensions/notebook-renderers/yarn.lock index 3cbe531e0fd2e..00c3e704dba1f 100644 --- a/extensions/notebook-renderers/yarn.lock +++ b/extensions/notebook-renderers/yarn.lock @@ -408,9 +408,9 @@ word-wrap@~1.2.3: integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== xml-name-validator@^4.0.0: version "4.0.0" From a28cbc207a08017f8f020bfb0a008defc927eb73 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 25 Jun 2024 16:26:48 +0200 Subject: [PATCH 480/755] css/json/html web: adopt LanguageClient API change (#218060) --- .../client/src/browser/cssClientMain.ts | 9 +-------- extensions/css-language-features/client/tsconfig.json | 5 ++++- .../client/src/browser/htmlClientMain.ts | 9 +-------- extensions/html-language-features/client/tsconfig.json | 5 ++++- .../client/src/browser/jsonClientMain.ts | 8 +------- extensions/json-language-features/client/tsconfig.json | 5 ++++- 6 files changed, 15 insertions(+), 26 deletions(-) diff --git a/extensions/css-language-features/client/src/browser/cssClientMain.ts b/extensions/css-language-features/client/src/browser/cssClientMain.ts index 6522c78638988..c89997ffaa041 100644 --- a/extensions/css-language-features/client/src/browser/cssClientMain.ts +++ b/extensions/css-language-features/client/src/browser/cssClientMain.ts @@ -8,13 +8,6 @@ import { BaseLanguageClient, LanguageClientOptions } from 'vscode-languageclient import { startClient, LanguageClientConstructor } from '../cssClient'; import { LanguageClient } from 'vscode-languageclient/browser'; -declare const Worker: { - new(stringUrl: string): any; -}; -declare const TextDecoder: { - new(encoding?: string): { decode(buffer: ArrayBuffer): string }; -}; - let client: BaseLanguageClient | undefined; // this method is called when vs code is activated @@ -25,7 +18,7 @@ export async function activate(context: ExtensionContext) { worker.postMessage({ i10lLocation: l10n.uri?.toString(false) ?? '' }); const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { - return new LanguageClient(id, name, clientOptions, worker); + return new LanguageClient(id, name, worker, clientOptions); }; client = await startClient(context, newLanguageClient, { TextDecoder }); diff --git a/extensions/css-language-features/client/tsconfig.json b/extensions/css-language-features/client/tsconfig.json index 573b24b4aa636..44b77895c10b7 100644 --- a/extensions/css-language-features/client/tsconfig.json +++ b/extensions/css-language-features/client/tsconfig.json @@ -1,7 +1,10 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "outDir": "./out" + "outDir": "./out", + "lib": [ + "webworker" + ] }, "include": [ "src/**/*", diff --git a/extensions/html-language-features/client/src/browser/htmlClientMain.ts b/extensions/html-language-features/client/src/browser/htmlClientMain.ts index 3f10e6d131fa7..06997d39fb0af 100644 --- a/extensions/html-language-features/client/src/browser/htmlClientMain.ts +++ b/extensions/html-language-features/client/src/browser/htmlClientMain.ts @@ -8,13 +8,6 @@ import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor, AsyncDisposable } from '../htmlClient'; import { LanguageClient } from 'vscode-languageclient/browser'; -declare const Worker: { - new(stringUrl: string): any; -}; -declare const TextDecoder: { - new(encoding?: string): { decode(buffer: ArrayBuffer): string }; -}; - let client: AsyncDisposable | undefined; // this method is called when vs code is activated @@ -25,7 +18,7 @@ export async function activate(context: ExtensionContext) { worker.postMessage({ i10lLocation: l10n.uri?.toString(false) ?? '' }); const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { - return new LanguageClient(id, name, clientOptions, worker); + return new LanguageClient(id, name, worker, clientOptions); }; const timer = { diff --git a/extensions/html-language-features/client/tsconfig.json b/extensions/html-language-features/client/tsconfig.json index 8f5cef74fd3a3..349af163eea53 100644 --- a/extensions/html-language-features/client/tsconfig.json +++ b/extensions/html-language-features/client/tsconfig.json @@ -1,7 +1,10 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "outDir": "./out" + "outDir": "./out", + "lib": [ + "webworker" + ] }, "include": [ "src/**/*", diff --git a/extensions/json-language-features/client/src/browser/jsonClientMain.ts b/extensions/json-language-features/client/src/browser/jsonClientMain.ts index f78f494d72713..91ed937fe6fad 100644 --- a/extensions/json-language-features/client/src/browser/jsonClientMain.ts +++ b/extensions/json-language-features/client/src/browser/jsonClientMain.ts @@ -8,12 +8,6 @@ import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor, SchemaRequestService, AsyncDisposable, languageServerDescription } from '../jsonClient'; import { LanguageClient } from 'vscode-languageclient/browser'; -declare const Worker: { - new(stringUrl: string): any; -}; - -declare function fetch(uri: string, options: any): any; - let client: AsyncDisposable | undefined; // this method is called when vs code is activated @@ -24,7 +18,7 @@ export async function activate(context: ExtensionContext) { worker.postMessage({ i10lLocation: l10n.uri?.toString(false) ?? '' }); const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { - return new LanguageClient(id, name, clientOptions, worker); + return new LanguageClient(id, name, worker, clientOptions); }; const schemaRequests: SchemaRequestService = { diff --git a/extensions/json-language-features/client/tsconfig.json b/extensions/json-language-features/client/tsconfig.json index aa51e4d0157e1..89e6a6c12b7e4 100644 --- a/extensions/json-language-features/client/tsconfig.json +++ b/extensions/json-language-features/client/tsconfig.json @@ -1,7 +1,10 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "outDir": "./out" + "outDir": "./out", + "lib": [ + "webworker" + ] }, "include": [ "src/**/*", From 4580ba51fe1914ca29916f829adb35930089b013 Mon Sep 17 00:00:00 2001 From: Mohammad Baqer Date: Tue, 25 Jun 2024 09:28:39 -0500 Subject: [PATCH 481/755] make collapsedText theme-able (#173203) Co-authored-by: Martin Aeschlimann --- build/lib/stylelint/vscode-known-variables.json | 1 + src/vs/editor/contrib/folding/browser/folding.css | 3 +-- src/vs/editor/contrib/folding/browser/foldingDecorations.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index 97be6f79cefd1..272347c6c9915 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -128,6 +128,7 @@ "--vscode-dropdown-foreground", "--vscode-dropdown-listBackground", "--vscode-editor-background", + "--vscode-editor-collapsedText", "--vscode-editor-findMatchBackground", "--vscode-editor-findMatchBorder", "--vscode-editor-findMatchForeground", diff --git a/src/vs/editor/contrib/folding/browser/folding.css b/src/vs/editor/contrib/folding/browser/folding.css index f973d5f7a30dd..9a7c91ced43ce 100644 --- a/src/vs/editor/contrib/folding/browser/folding.css +++ b/src/vs/editor/contrib/folding/browser/folding.css @@ -31,7 +31,7 @@ } .monaco-editor .inline-folded:after { - color: grey; + color: var(--vscode-editor-collapsedText); margin: 0.1em 0.2em 0 0.2em; content: "\22EF"; /* ellipses unicode character */ display: inline; @@ -49,4 +49,3 @@ .monaco-editor .cldr.codicon.codicon-folding-manual-collapsed { color: var(--vscode-editorGutter-foldingControlForeground) !important; } - diff --git a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts index b6ae9cd31e266..d30d019ca98a4 100644 --- a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts +++ b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts @@ -15,6 +15,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { ThemeIcon } from 'vs/base/common/themables'; const foldBackground = registerColor('editor.foldBackground', { light: transparent(editorSelectionBackground, 0.3), dark: transparent(editorSelectionBackground, 0.3), hcDark: null, hcLight: null }, localize('foldBackgroundBackground', "Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."), true); +registerColor('editor.collapsedText', { light: '#808080', dark: '#808080', hcDark: null, hcLight: null }, localize('collapsedTextColor', "Color of the collapsed text after the first line of a folded range.")); registerColor('editorGutter.foldingControlForeground', iconForeground, localize('editorGutter.foldingControlForeground', 'Color of the folding control in the editor gutter.')); export const foldingExpandedIcon = registerIcon('folding-expanded', Codicon.chevronDown, localize('foldingExpandedIcon', 'Icon for expanded ranges in the editor glyph margin.')); From 682fa68122e75d59ba7f522b1ac38292aa5325e3 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 08:52:49 -0700 Subject: [PATCH 482/755] Adopt link decoration var (#216859) * Adopt link decoration var * Ensure links in walkthrough markdown content get underlines and react to setting change --- .../contrib/markdown/browser/markdownDocumentRenderer.ts | 2 +- src/vs/workbench/contrib/webview/browser/pre/index.html | 6 +++++- src/vs/workbench/contrib/webview/browser/themeing.ts | 4 +++- .../welcomeGettingStarted/browser/media/gettingStarted.css | 1 + .../welcomeWalkthrough/browser/media/walkThroughPart.css | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts b/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts index 68dfb0f33505d..b1c6b962fab53 100644 --- a/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts +++ b/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts @@ -32,7 +32,7 @@ img { } a { - text-decoration: none; + text-decoration: var(--text-link-decoration); } a:hover { diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 0c6829c08f8b0..f46e124042850 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -6,7 +6,7 @@ + content="default-src 'none'; script-src 'sha256-ikaxwm2UFoiIKkEZTEU4mnSxpYf3lmsrhy5KqqJZfek=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> @@ -112,6 +112,10 @@ color: var(--vscode-textLink-foreground); } + p > a { + text-decoration: var(--text-link-decoration); + } + a:hover { color: var(--vscode-textLink-activeForeground); } diff --git a/src/vs/workbench/contrib/webview/browser/themeing.ts b/src/vs/workbench/contrib/webview/browser/themeing.ts index eda7179665f24..75ee4b7306135 100644 --- a/src/vs/workbench/contrib/webview/browser/themeing.ts +++ b/src/vs/workbench/contrib/webview/browser/themeing.ts @@ -37,7 +37,7 @@ export class WebviewThemeDataProvider extends Disposable { this._reset(); })); - const webviewConfigurationKeys = ['editor.fontFamily', 'editor.fontWeight', 'editor.fontSize']; + const webviewConfigurationKeys = ['editor.fontFamily', 'editor.fontWeight', 'editor.fontSize', 'accessibility.underlineLinks']; this._register(this._configurationService.onDidChangeConfiguration(e => { if (webviewConfigurationKeys.some(key => e.affectsConfiguration(key))) { this._reset(); @@ -55,6 +55,7 @@ export class WebviewThemeDataProvider extends Disposable { const editorFontFamily = configuration.fontFamily || EDITOR_FONT_DEFAULTS.fontFamily; const editorFontWeight = configuration.fontWeight || EDITOR_FONT_DEFAULTS.fontWeight; const editorFontSize = configuration.fontSize || EDITOR_FONT_DEFAULTS.fontSize; + const linkUnderlines = this._configurationService.getValue('accessibility.underlineLinks'); const theme = this._themeService.getColorTheme(); const exportedColors = colorRegistry.getColorRegistry().getColors().reduce>((colors, entry) => { @@ -72,6 +73,7 @@ export class WebviewThemeDataProvider extends Disposable { 'vscode-editor-font-family': editorFontFamily, 'vscode-editor-font-weight': editorFontWeight, 'vscode-editor-font-size': editorFontSize + 'px', + 'text-link-decoration': linkUnderlines ? 'underline' : 'none', ...exportedColors }; diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css index 80cddd5958bb0..f979b73960189 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css @@ -923,6 +923,7 @@ .monaco-workbench .part.editor > .content .gettingStartedContainer .button-link { color: var(--vscode-textLink-foreground); + text-decoration: var(--text-link-decoration); } .monaco-workbench .part.editor > .content .gettingStartedContainer .button-link .codicon { diff --git a/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css b/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css index 9622dd1b858c1..7ab127eaab4a7 100644 --- a/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css @@ -18,7 +18,7 @@ } .monaco-workbench .part.editor > .content .walkThroughContent a { - text-decoration: none; + text-decoration: var(--text-link-decoration); } .monaco-workbench .part.editor > .content .walkThroughContent a:focus, From e9b254e731c3e849a6e8b06521f1b07432ab73b4 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Tue, 25 Jun 2024 11:30:26 -0700 Subject: [PATCH 483/755] use chord instead of label (#218107) --- .../browser/replInputHintContentWidget.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts index e7f72559e6200..b42ea604df8a7 100644 --- a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts +++ b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts @@ -7,6 +7,7 @@ import * as dom from 'vs/base/browser/dom'; import { status } from 'vs/base/browser/ui/aria/aria'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; import { Event } from 'vs/base/common/event'; +import { ResolvedKeybinding } from 'vs/base/common/keybindings'; import { Disposable } from 'vs/base/common/lifecycle'; import { OS } from 'vs/base/common/platform'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; @@ -121,25 +122,29 @@ export class ReplInputHintContentWidget extends Disposable implements IContentWi private getKeybinding() { const keybindings = this.keybindingService.lookupKeybindings('interactive.execute'); const shiftEnterConfig = this.configurationService.getValue(InteractiveWindowSetting.executeWithShiftEnter); + const hasChord = (chord: string, kb: ResolvedKeybinding) => { + const chords = kb.getDispatchChords(); + return chords.length === 1 && chords[0] === chord; + }; if (shiftEnterConfig) { - const keybinding = keybindings.find(kb => kb.getLabel() === 'Shift+Enter'); + const keybinding = keybindings.find(kb => hasChord('shift+Enter', kb)); if (keybinding) { return keybinding; } } else { - let keybinding = keybindings.find(kb => kb.getLabel() === 'Enter'); + let keybinding = keybindings.find(kb => hasChord('Enter', kb)); if (keybinding) { return keybinding; } keybinding = this.keybindingService.lookupKeybindings('python.execInREPLEnter') - .find(kb => kb.getLabel() === 'Enter'); + .find(kb => hasChord('Enter', kb)); if (keybinding) { return keybinding; } } - return undefined; + return keybindings?.[0]; } override dispose(): void { From 3106eec8ecdd4905e98af8b62b0dee2aea92190b Mon Sep 17 00:00:00 2001 From: Eleanor Boyd Date: Tue, 25 Jun 2024 11:37:44 -0700 Subject: [PATCH 484/755] add anthony to endgame notebook --- .vscode/notebooks/my-endgame.github-issues | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues index ce02ecfa5777e..0b260270ed7b0 100644 --- a/.vscode/notebooks/my-endgame.github-issues +++ b/.vscode/notebooks/my-endgame.github-issues @@ -157,7 +157,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:*out-of-scope -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:paulacamargo25 -author:ulugbekna -author:aiday-mar -author:daviddossett -author:bhavyaus -author:justschen -author:benibenj -author:luabud" + "value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:*out-of-scope -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:paulacamargo25 -author:ulugbekna -author:aiday-mar -author:daviddossett -author:bhavyaus -author:justschen -author:benibenj -author:luabud -author:anthonykim1" }, { "kind": 1, From 01ef3f75267ede77ea95f2f59702b54f680a3873 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 25 Jun 2024 21:02:05 +0200 Subject: [PATCH 485/755] Fix #218058 (#218182) --- .../extensionManagement/common/extensionsScannerService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 74c8eeaeb1f5e..a65142d2c65fc 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -657,7 +657,7 @@ class ExtensionsScanner extends Disposable { const type = metadata?.isSystem ? ExtensionType.System : input.type; const isBuiltin = type === ExtensionType.System || !!metadata?.isBuiltin; manifest = await this.translateManifest(input.location, manifest, ExtensionScannerInput.createNlsConfiguration(input)); - if (manifest.enabledApiProposals && !this.extensionsEnabledWithApiProposalVersion?.includes(id.toLowerCase())) { + if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion?.includes(id.toLowerCase())) { manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); } const extension: IRelaxedScannedExtension = { From 393e1222caaea0b1c1d21138bd493d7a2b9bc1ac Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 25 Jun 2024 21:52:08 +0200 Subject: [PATCH 486/755] proper fix for #218058 (#218200) --- .../common/extensionsScannerService.ts | 16 ++++++++++------ .../extensions/common/extensionValidator.ts | 4 ++-- .../browser/webExtensionsScannerService.ts | 15 +++++++++++---- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index a65142d2c65fc..1b6d8f3dab9db 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -657,10 +657,7 @@ class ExtensionsScanner extends Disposable { const type = metadata?.isSystem ? ExtensionType.System : input.type; const isBuiltin = type === ExtensionType.System || !!metadata?.isBuiltin; manifest = await this.translateManifest(input.location, manifest, ExtensionScannerInput.createNlsConfiguration(input)); - if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion?.includes(id.toLowerCase())) { - manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); - } - const extension: IRelaxedScannedExtension = { + let extension: IRelaxedScannedExtension = { type, identifier, manifest, @@ -672,7 +669,13 @@ class ExtensionsScanner extends Disposable { isValid: true, validations: [] }; - return input.validate ? this.validate(extension, input) : extension; + if (input.validate) { + extension = this.validate(extension, input); + } + if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase())) { + manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); + } + return extension; } } catch (e) { if (input.type !== ExtensionType.System) { @@ -684,7 +687,8 @@ class ExtensionsScanner extends Disposable { validate(extension: IRelaxedScannedExtension, input: ExtensionScannerInput): IRelaxedScannedExtension { let isValid = true; - const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin); + const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(extension.identifier.id.toLowerCase()); + const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin, validateApiVersion); for (const [severity, message] of validations) { if (severity === Severity.Error) { isValid = false; diff --git a/src/vs/platform/extensions/common/extensionValidator.ts b/src/vs/platform/extensions/common/extensionValidator.ts index 08cb360de78bb..5fae8b4b1e2fa 100644 --- a/src/vs/platform/extensions/common/extensionValidator.ts +++ b/src/vs/platform/extensions/common/extensionValidator.ts @@ -240,7 +240,7 @@ export function isValidVersion(_inputVersion: string | INormalizedVersion, _inpu type ProductDate = string | Date | undefined; -export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean): readonly [Severity, string][] { +export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean, validateApiVersion: boolean): readonly [Severity, string][] { const validations: [Severity, string][] = []; if (typeof extensionManifest.publisher !== 'undefined' && typeof extensionManifest.publisher !== 'string') { validations.push([Severity.Error, nls.localize('extensionDescription.publisher', "property publisher must be of type `string`.")]); @@ -322,7 +322,7 @@ export function validateExtensionManifest(productVersion: string, productDate: P } } - if (extensionManifest.enabledApiProposals?.length) { + if (validateApiVersion && extensionManifest.enabledApiProposals?.length) { const incompatibleNotices: string[] = []; if (!areApiProposalsCompatible([...extensionManifest.enabledApiProposals], incompatibleNotices)) { for (const notice of incompatibleNotices) { diff --git a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts index 17c6ac2cb10db..525a29618750c 100644 --- a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest, TargetPlatform, IRelaxedExtensionManifest, parseEnabledApiProposalNames } from 'vs/platform/extensions/common/extensions'; import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IScannedExtension, IWebExtensionsScannerService, ScanOptions } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { isWeb, Language } from 'vs/base/common/platform'; @@ -99,6 +99,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten private readonly systemExtensionsCacheResource: URI | undefined = undefined; private readonly customBuiltinExtensionsCacheResource: URI | undefined = undefined; private readonly resourcesAccessQueueMap = new ResourceMap>(); + private readonly extensionsEnabledWithApiProposalVersion: string[]; constructor( @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @@ -123,6 +124,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten // Eventually update caches lifecycleService.when(LifecyclePhase.Eventually).then(() => this.updateCaches()); } + this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; } private _customBuiltinExtensionsInfoPromise: Promise<{ extensions: ExtensionInfo[]; extensionsToMigrate: [string, string][]; extensionLocations: URI[]; extensionGalleryResources: URI[] }> | undefined; @@ -735,7 +737,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten private async toScannedExtension(webExtension: IWebExtension, isBuiltin: boolean, type: ExtensionType = ExtensionType.User): Promise { const validations: [Severity, string][] = []; - let manifest: IExtensionManifest | undefined = webExtension.manifest; + let manifest: IRelaxedExtensionManifest | undefined = webExtension.manifest; if (!manifest) { try { @@ -766,7 +768,8 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten const uuid = (webExtension.metadata)?.id; - validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false)); + const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(webExtension.identifier.id.toLowerCase()); + validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false, validateApiVersion)); let isValid = true; for (const [severity, message] of validations) { if (severity === Severity.Error) { @@ -775,6 +778,10 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten } } + if (manifest.enabledApiProposals && validateApiVersion) { + manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); + } + return { identifier: { id: webExtension.identifier.id, uuid: webExtension.identifier.uuid || uuid }, location: webExtension.location, @@ -800,7 +807,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return []; } - private async translateManifest(manifest: IExtensionManifest, nlsURL: ITranslations | URI, fallbackNLS?: ITranslations | URI): Promise { + private async translateManifest(manifest: IExtensionManifest, nlsURL: ITranslations | URI, fallbackNLS?: ITranslations | URI): Promise { try { const translations = URI.isUri(nlsURL) ? await this.getTranslations(nlsURL) : nlsURL; const fallbackTranslations = URI.isUri(fallbackNLS) ? await this.getTranslations(fallbackNLS) : fallbackNLS; From 477babf454bc990c6dcc746ea281be4623d357e3 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 13:57:52 -0700 Subject: [PATCH 487/755] Opt in to link underlines for settings commands --- .../contrib/preferences/browser/media/settingsEditor2.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 74caeb8c44e9b..eb2ca0e190763 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -512,6 +512,11 @@ color: var(--vscode-textLink-foreground); } +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .edit-in-settings-button { + text-decoration: var(--text-link-decoration); +} + .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:focus, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .edit-in-settings-button:focus { outline: 1px solid -webkit-focus-ring-color; From 75280e7c4363bc63fb9d4991da0d72217f370c35 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 14:16:13 -0700 Subject: [PATCH 488/755] Opt in to link underlines in extensions details page --- .../contrib/extensions/browser/media/extensionEditor.css | 1 + .../contrib/extensions/browser/media/extensionsWidgets.css | 1 + 2 files changed, 2 insertions(+) diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css index a59e7c53d77ed..1de72e81ee9be 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css @@ -485,6 +485,7 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + text-decoration: var(--text-link-decoration); } .extension-editor > .body > .content > .details > .additional-details-container .resources-container > .resources > .resource:hover { diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionsWidgets.css b/src/vs/workbench/contrib/extensions/browser/media/extensionsWidgets.css index d77881dfa3920..9179fa761d368 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionsWidgets.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionsWidgets.css @@ -39,6 +39,7 @@ .extension-verified-publisher > .extension-verified-publisher-domain { padding-left: 2px; color: var(--vscode-extensionIcon-verifiedForeground); + text-decoration: var(--text-link-decoration); } .extension-bookmark { From 9191f5dbeb05cfc0c32ed661be2c7a3f39aaf037 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 14:26:22 -0700 Subject: [PATCH 489/755] Use link decoration in ports view --- src/vs/workbench/contrib/remote/browser/media/tunnelView.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/contrib/remote/browser/media/tunnelView.css b/src/vs/workbench/contrib/remote/browser/media/tunnelView.css index 70a8ba93492ef..b52d115425ca7 100644 --- a/src/vs/workbench/contrib/remote/browser/media/tunnelView.css +++ b/src/vs/workbench/contrib/remote/browser/media/tunnelView.css @@ -44,6 +44,11 @@ margin-top: -40px; } +.ports-view .monaco-list .monaco-list-row .ports-view-actionbar-cell .ports-view-actionbar-cell-localaddress { + color: var(--vscode-textLink-foreground); + text-decoration: var(--text-link-decoration); +} + .ports-view .monaco-list .monaco-list-row .ports-view-actionbar-cell .ports-view-actionbar-cell-localaddress:hover { text-decoration: underline; } From 1ab0dbf34bea5e1f686f2929396331a1c6dfac40 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 14:54:14 -0700 Subject: [PATCH 490/755] Opt in to link underlines in hover status bar actions --- src/vs/base/browser/ui/hover/hoverWidget.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/base/browser/ui/hover/hoverWidget.css b/src/vs/base/browser/ui/hover/hoverWidget.css index a1d72c2e581df..a1b3b43211e95 100644 --- a/src/vs/base/browser/ui/hover/hoverWidget.css +++ b/src/vs/base/browser/ui/hover/hoverWidget.css @@ -134,6 +134,11 @@ padding-right: 4px; } +.monaco-hover .hover-row.status-bar .actions .action-container a { + color: var(--vscode-textLink-foreground); + text-decoration: var(--text-link-decoration); +} + .monaco-hover .markdown-hover .hover-contents .codicon { color: inherit; font-size: inherit; From 9b81d8a366bbe07d2a48f6f73be706170aac2005 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 14:57:07 -0700 Subject: [PATCH 491/755] Opt in language status actions too --- .../contrib/languageStatus/browser/media/languageStatus.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css b/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css index 4354ad022df87..25433bee4a4e0 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css +++ b/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css @@ -113,6 +113,7 @@ .monaco-workbench .hover-language-status > .element .right .monaco-link { margin: auto 0; white-space: nowrap; + text-decoration: var(--text-link-decoration); } .monaco-workbench .hover-language-status > .element .right .monaco-action-bar:not(:first-child) { From e076510d89114ae8715e921be5101b2dd81d5eaa Mon Sep 17 00:00:00 2001 From: David Dossett Date: Tue, 25 Jun 2024 15:12:55 -0700 Subject: [PATCH 492/755] Use link color and underline var for setting overrides links (#218212) --- .../contrib/preferences/browser/media/settingsEditor2.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index eb2ca0e190763..b42d6a194a7e6 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -408,7 +408,8 @@ } .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides a.modified-scope { - text-decoration: underline; + color: var(--vscode-textLink-foreground); + text-decoration: var(--text-link-decoration); cursor: pointer; } From 45db560b8daad3459c5a4772622c9536c6305479 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Jun 2024 16:09:55 -0700 Subject: [PATCH 493/755] Check disposal in async rendering (#218235) Fixes #218000 --- src/vs/workbench/contrib/chat/browser/codeBlockPart.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts index 9346615d4873f..c9e952ffcd073 100644 --- a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts +++ b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts @@ -144,6 +144,7 @@ export class CodeBlockPart extends Disposable { private currentScrollWidth = 0; private readonly disposableStore = this._register(new DisposableStore()); + private isDisposed = false; constructor( private readonly options: ChatEditorOptions, @@ -264,6 +265,11 @@ export class CodeBlockPart extends Disposable { } } + override dispose() { + this.isDisposed = true; + super.dispose(); + } + get uri(): URI | undefined { return this.editor.getModel()?.uri; } @@ -356,6 +362,9 @@ export class CodeBlockPart extends Disposable { } await this.updateEditor(data); + if (this.isDisposed) { + return; + } this.layout(width); if (editable) { From e53968c415d2021cb1bf550f3cc89c0ffbab4f66 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 25 Jun 2024 16:41:10 -0700 Subject: [PATCH 494/755] Re #209158. Output replacement might use legacy output id. (#218237) --- .../contrib/notebook/browser/controller/cellOutputActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts index db449afafdba6..1350fefa69de4 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts @@ -96,7 +96,7 @@ function getOutputViewModelFromId(outputId: string, notebookEditor: INotebookEdi if (notebookViewModel) { const codeCells = notebookViewModel.viewCells.filter(cell => cell.cellKind === CellKind.Code) as CodeCellViewModel[]; for (const cell of codeCells) { - const output = cell.outputsViewModels.find(output => output.model.outputId === outputId); + const output = cell.outputsViewModels.find(output => output.model.outputId === outputId || output.model.alternativeOutputId === outputId); if (output) { return output; } From 0feeac7b7618ea5301168ec5c3f1177ccb743a13 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 25 Jun 2024 18:23:34 -0700 Subject: [PATCH 495/755] Still fix incomplete markdown when the response is complete but still streaming (#218241) Fix #217915 --- src/vs/workbench/contrib/chat/browser/chatListRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 5a8915ba0ceb4..01a8fccfea94b 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -822,7 +822,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer acc + (part instanceof ChatMarkdownContentPart ? part.codeblocks.length : 0), 0); const markdownPart = this.instantiationService.createInstance(ChatMarkdownContentPart, markdown, context, this._editorPool, fillInIncompleteTokens, codeBlockStartIndex, this.renderer, this._currentLayoutWidth, this.codeBlockModelCollection, this.rendererOptions); markdownPart.addDisposable(markdownPart.onDidChangeHeight(() => { From 6e345d46061e168159401db49cd659c89573ac16 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Tue, 25 Jun 2024 22:34:31 -0700 Subject: [PATCH 496/755] Remove getSessions API in favor of getAccounts (#218238) Azure folks (the only ones using this proposed API) have not depended on getSessions yet so it's safe to delete. --- .../api/browser/mainThreadAuthentication.ts | 12 ------------ .../workbench/api/common/extHost.api.impl.ts | 4 ---- .../workbench/api/common/extHost.protocol.ts | 1 - .../api/common/extHostAuthentication.ts | 11 ----------- .../vscode.proposed.authGetSessions.d.ts | 19 ------------------- 5 files changed, 47 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index c60acfa9739f0..5780ec8797e74 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -260,18 +260,6 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu return session; } - async $getSessions(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string): Promise { - const sessions = await this.authenticationService.getSessions(providerId, [...scopes], undefined, true); - const accessibleSessions = sessions.filter(s => this.authenticationAccessService.isAccessAllowed(providerId, s.account.label, extensionId)); - if (accessibleSessions.length) { - this.sendProviderUsageTelemetry(extensionId, providerId); - for (const session of accessibleSessions) { - this.authenticationUsageService.addAccountUsage(providerId, session.account.label, extensionId, extensionName); - } - } - return accessibleSessions; - } - async $getAccounts(providerId: string): Promise> { const sessions = await this.authenticationService.getSessions(providerId); const accounts = new Array(); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index fe15a50233db8..4b6a73823dcec 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -294,10 +294,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I } return extHostAuthentication.getSession(extension, providerId, scopes, options as any); }, - getSessions(providerId: string, scopes: readonly string[]) { - checkProposedApiEnabled(extension, 'authGetSessions'); - return extHostAuthentication.getSessions(extension, providerId, scopes); - }, getAccounts(providerId: string) { checkProposedApiEnabled(extension, 'authGetSessions'); return extHostAuthentication.getAccounts(providerId); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 8fb7d046b4dfd..5785393c0e18f 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -162,7 +162,6 @@ export interface MainThreadAuthenticationShape extends IDisposable { $ensureProvider(id: string): Promise; $sendDidChangeSessions(providerId: string, event: AuthenticationSessionsChangeEvent): void; $getSession(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string, options: { createIfNone?: boolean; forceNewSession?: boolean | AuthenticationForceNewSessionOptions; clearSessionPreference?: boolean }): Promise; - $getSessions(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string): Promise; $getAccounts(providerId: string): Promise>; $removeSession(providerId: string, sessionId: string): Promise; } diff --git a/src/vs/workbench/api/common/extHostAuthentication.ts b/src/vs/workbench/api/common/extHostAuthentication.ts index 5c75a1318ca09..c5ba402ef072f 100644 --- a/src/vs/workbench/api/common/extHostAuthentication.ts +++ b/src/vs/workbench/api/common/extHostAuthentication.ts @@ -32,7 +32,6 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { readonly onDidChangeSessions: Event = this._onDidChangeSessions.event; private _getSessionTaskSingler = new TaskSingler(); - private _getSessionsTaskSingler = new TaskSingler>(); constructor( @IExtHostRpcService extHostRpc: IExtHostRpcService @@ -54,16 +53,6 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { }); } - async getSessions(requestingExtension: IExtensionDescription, providerId: string, scopes: readonly string[]): Promise> { - const extensionId = ExtensionIdentifier.toKey(requestingExtension.identifier); - const sortedScopes = [...scopes].sort().join(' '); - return await this._getSessionsTaskSingler.getOrCreate(`${extensionId} ${sortedScopes}`, async () => { - await this._proxy.$ensureProvider(providerId); - const extensionName = requestingExtension.displayName || requestingExtension.name; - return this._proxy.$getSessions(providerId, scopes, extensionId, extensionName); - }); - } - async getAccounts(providerId: string) { await this._proxy.$ensureProvider(providerId); return await this._proxy.$getAccounts(providerId); diff --git a/src/vscode-dts/vscode.proposed.authGetSessions.d.ts b/src/vscode-dts/vscode.proposed.authGetSessions.d.ts index 45049789f506a..6d425ed3232b3 100644 --- a/src/vscode-dts/vscode.proposed.authGetSessions.d.ts +++ b/src/vscode-dts/vscode.proposed.authGetSessions.d.ts @@ -67,23 +67,4 @@ declare module 'vscode' { */ createSession(scopes: readonly string[], options: AuthenticationProviderSessionOptions): Thenable; } - - // THE BELOW IS THE OLD PROPOSAL WHICH WILL BE REMOVED BUT KEPT UNTIL THE NEW PROPOSAL IS ADOPTED BY ALL PARTIES - - export namespace authentication { - /** - * Get all authentication sessions matching the desired scopes that this extension has access to. In order to request access, - * use {@link getSession}. To request an additional account, specify {@link AuthenticationGetSessionOptions.clearSessionPreference} - * and {@link AuthenticationGetSessionOptions.createIfNone} together. - * - * Currently, there are only two authentication providers that are contributed from built in extensions - * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. - * - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @returns A thenable that resolves to a readonly array of authentication sessions. - * @deprecated Use {@link getAccounts} instead. - */ - export function getSessions(providerId: string, scopes: readonly string[]): Thenable; - } } From df8835a974606e016f3526b349ddd9808fc91a5e Mon Sep 17 00:00:00 2001 From: Robo Date: Wed, 26 Jun 2024 14:34:51 +0900 Subject: [PATCH 497/755] fix: processing runtime arguments with non boolean values (#218243) --- src/main.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main.js b/src/main.js index 7da82450a4cfa..1b3d4632fad74 100644 --- a/src/main.js +++ b/src/main.js @@ -246,10 +246,7 @@ function configureCommandlineSwitchesSync(cliArgs) { app.commandLine.appendSwitch(argvKey); } } else if (argvValue) { - if (argvKey === 'force-color-profile') { - // Color profile - app.commandLine.appendSwitch(argvKey, argvValue); - } else if (argvKey === 'password-store') { + if (argvKey === 'password-store') { // Password store // TODO@TylerLeonhardt: Remove this migration in 3 months let migratedArgvValue = argvValue; @@ -257,6 +254,8 @@ function configureCommandlineSwitchesSync(cliArgs) { migratedArgvValue = 'gnome-libsecret'; } app.commandLine.appendSwitch(argvKey, migratedArgvValue); + } else { + app.commandLine.appendSwitch(argvKey, argvValue); } } } From 0354163c1c66b950b0762364f5b4cd37937b624a Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:35:35 +0200 Subject: [PATCH 498/755] SCM - fix commit input text selection (#218249) --- .../contrib/scm/browser/media/scm.css | 17 ---------- .../contrib/scm/browser/scmViewPane.ts | 32 +++++++++++++++++-- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css index a84c1dd22c972..7b94eac418752 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm.css +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -353,23 +353,6 @@ border-radius: 2px; } -.scm-view .scm-editor-container .monaco-editor .selected-text { - background-color: rgba(var(--vscode-input-background), 0.4); - border-radius: 0; -} - -.scm-view .scm-editor-container .monaco-editor .focused .selected-text { - background-color: var(--vscode-selection-background, var(--vscode-editor-selectionBackground)); -} - -.scm-view .scm-editor-container .monaco-editor .view-line span.inline-selected-text { - color: var(--vscode-input-foreground); -} - -.scm-view .scm-editor-container .monaco-editor-background { - background-color: var(--vscode-input-background); -} - .scm-view .scm-editor { box-sizing: border-box; width: 100%; diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 0961bec262787..8b47b5cec4dd6 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -23,7 +23,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MenuItemAction, IMenuService, registerAction2, MenuId, IAction2Options, MenuRegistry, Action2, IMenu } from 'vs/platform/actions/common/actions'; import { IAction, ActionRunner, Action, Separator, IActionRunner } from 'vs/base/common/actions'; import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IThemeService, IFileIconTheme } from 'vs/platform/theme/common/themeService'; +import { IThemeService, IFileIconTheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar, isSCMRepository, isSCMInput, collectContextMenuActions, getActionViewItemProvider, isSCMActionButton, isSCMViewService, isSCMHistoryItemGroupTreeElement, isSCMHistoryItemTreeElement, isSCMHistoryItemChangeTreeElement, toDiffEditorArguments, isSCMResourceNode, isSCMHistoryItemChangeNode, isSCMViewSeparator, connectPrimaryMenu, isSCMHistoryItemViewModelTreeElement } from './util'; import { WorkbenchCompressibleAsyncDataTree, IOpenEvent } from 'vs/platform/list/browser/listService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; @@ -96,7 +96,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' import { EditOperation } from 'vs/editor/common/core/editOperation'; import { stripIcons } from 'vs/base/common/iconLabels'; import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; -import { foreground, listActiveSelectionForeground, registerColor, transparent } from 'vs/platform/theme/common/colorRegistry'; +import { editorSelectionBackground, foreground, inputBackground, inputForeground, listActiveSelectionForeground, registerColor, selectionBackground, transparent } from 'vs/platform/theme/common/colorRegistry'; import { IMenuWorkbenchToolBarOptions, MenuWorkbenchToolBar, WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; @@ -4246,3 +4246,31 @@ export class SCMActionButton implements IDisposable { } } } + +// Override styles in selections.ts +registerThemingParticipant((theme, collector) => { + const selectionBackgroundColor = theme.getColor(selectionBackground); + + if (selectionBackgroundColor) { + // Override inactive selection bg + const inputBackgroundColor = theme.getColor(inputBackground); + if (inputBackgroundColor) { + collector.addRule(`.scm-view .scm-editor-container .monaco-editor .selected-text { background-color: ${inputBackgroundColor.transparent(0.4)}; }`); + } + + // Override selected fg + const inputForegroundColor = theme.getColor(inputForeground); + if (inputForegroundColor) { + collector.addRule(`.scm-view .scm-editor-container .monaco-editor .view-line span.inline-selected-text { color: ${inputForegroundColor}; }`); + } + + const backgroundColor = theme.getColor(inputBackground); + if (backgroundColor) { + collector.addRule(`.scm-view .scm-editor-container .monaco-editor-background { background-color: ${backgroundColor}; } `); + } + collector.addRule(`.scm-view .scm-editor-container .monaco-editor .focused .selected-text { background-color: ${selectionBackgroundColor}; }`); + } else { + // Use editor selection color if theme has not set a selection background color + collector.addRule(`.scm-view .scm-editor-container .monaco-editor .focused .selected-text { background-color: ${theme.getColor(editorSelectionBackground)}; }`); + } +}); From 44623fa268474d0b3ecac7824a56f57b4c59fe81 Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Wed, 26 Jun 2024 12:14:04 +0200 Subject: [PATCH 499/755] Add action label and keybindings for the editor hover status bar in the editor hover accessible view/help (#218269) adding label and keybindings into the editor hover accessibility view and help --- src/vs/base/browser/ui/hover/hoverWidget.ts | 6 ++++++ .../hover/browser/contentHoverRendered.ts | 21 ++++++++++++++++++- .../hover/browser/contentHoverStatusBar.ts | 6 +++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/hover/hoverWidget.ts b/src/vs/base/browser/ui/hover/hoverWidget.ts index 2e9ecbdd1fe88..9d83612126774 100644 --- a/src/vs/base/browser/ui/hover/hoverWidget.ts +++ b/src/vs/base/browser/ui/hover/hoverWidget.ts @@ -50,12 +50,18 @@ export class HoverAction extends Disposable { return new HoverAction(parent, actionOptions, keybindingLabel); } + public readonly actionLabel: string; + public readonly actionKeybindingLabel: string | null; + private readonly actionContainer: HTMLElement; private readonly action: HTMLElement; private constructor(parent: HTMLElement, actionOptions: { label: string; iconClass?: string; run: (target: HTMLElement) => void; commandId: string }, keybindingLabel: string | null) { super(); + this.actionLabel = actionOptions.label; + this.actionKeybindingLabel = keybindingLabel; + this.actionContainer = dom.append(parent, $('div.action-container')); this.actionContainer.setAttribute('tabindex', '0'); diff --git a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts index 6384984b529cf..e808e9d5942f9 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts @@ -21,6 +21,7 @@ import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/col import { localize } from 'vs/nls'; import { InlayHintsHover } from 'vs/editor/contrib/inlayHints/browser/inlayHintsHover'; import { BugIndicatingError } from 'vs/base/common/errors'; +import { HoverAction } from 'vs/base/browser/ui/hover/hoverWidget'; export class RenderedContentHover extends Disposable { @@ -175,6 +176,10 @@ interface IRenderedContentStatusBar { * The HTML element containing the hover status bar. */ hoverElement: HTMLElement; + /** + * The actions of the hover status bar. + */ + actions: HoverAction[]; } type IRenderedContentHoverPartOrStatusBar = IRenderedContentHoverPart | IRenderedContentStatusBar; @@ -189,6 +194,10 @@ class RenderedStatusBar implements IDisposable { return this._statusBar.hoverElement; } + get actions(): HoverAction[] { + return this._statusBar.actions; + } + dispose() { this._statusBar.dispose(); } @@ -270,6 +279,7 @@ class RenderedContentHoverParts extends Disposable { this._renderedParts.push({ type: 'statusBar', hoverElement: renderedStatusBar.hoverElement, + actions: renderedStatusBar.actions, }); } return toDisposable(() => { disposables.dispose(); }); @@ -332,7 +342,16 @@ class RenderedContentHoverParts extends Disposable { return ''; } if (renderedPart.type === 'statusBar') { - return localize('hoverAccessibilityStatusBar', "This is a hover status bar."); + const statusBarDescription = [localize('hoverAccessibilityStatusBar', "This is a hover status bar.")]; + for (const action of renderedPart.actions) { + const keybinding = action.actionKeybindingLabel; + if (keybinding) { + statusBarDescription.push(localize('hoverAccessibilityStatusBarActionWithKeybinding', "It has an action with label {0} and keybinding {1}.", action.actionLabel, keybinding)); + } else { + statusBarDescription.push(localize('hoverAccessibilityStatusBarActionWithoutKeybinding', "It has an action with label {0}.", action.actionLabel)); + } + } + return statusBarDescription.join('\n'); } return renderedPart.participant.getAccessibleContent(renderedPart.hoverPart); } diff --git a/src/vs/editor/contrib/hover/browser/contentHoverStatusBar.ts b/src/vs/editor/contrib/hover/browser/contentHoverStatusBar.ts index 04d84593d06ee..bb43959419bdb 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverStatusBar.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverStatusBar.ts @@ -13,6 +13,8 @@ const $ = dom.$; export class EditorHoverStatusBar extends Disposable implements IEditorHoverStatusBar { public readonly hoverElement: HTMLElement; + public readonly actions: HoverAction[] = []; + private readonly actionsElement: HTMLElement; private _hasContent: boolean = false; @@ -39,7 +41,9 @@ export class EditorHoverStatusBar extends Disposable implements IEditorHoverStat const keybinding = this._keybindingService.lookupKeybinding(actionOptions.commandId); const keybindingLabel = keybinding ? keybinding.getLabel() : null; this._hasContent = true; - return this._register(HoverAction.render(this.actionsElement, actionOptions, keybindingLabel)); + const action = this._register(HoverAction.render(this.actionsElement, actionOptions, keybindingLabel)); + this.actions.push(action); + return action; } public append(element: HTMLElement): HTMLElement { From 979ad0af36f79113fd7d5e86705a181743812ccc Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Wed, 26 Jun 2024 12:14:41 +0200 Subject: [PATCH 500/755] Set focus back to the editor hover part on escape from the accessible view/help (#218274) adding code in order to focus back a specific hover part on escaping from the accessible view/help --- .../contrib/hover/browser/contentHoverController.ts | 4 ++++ .../contrib/hover/browser/contentHoverRendered.ts | 11 +++++++++++ .../contrib/hover/browser/hoverAccessibleViews.ts | 6 +++++- .../editor/contrib/hover/browser/hoverController.ts | 4 ++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index 5ae7773bd1d0b..d79984f24c1a5 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -321,6 +321,10 @@ export class ContentHoverController extends Disposable implements IHoverWidget { this._contentHoverWidget.focus(); } + public focusHoverPartWithIndex(index: number): void { + this._renderedContentHover?.focusHoverPartWithIndex(index); + } + public scrollUp(): void { this._contentHoverWidget.scrollUp(); } diff --git a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts index e808e9d5942f9..9308e6f295dbe 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverRendered.ts @@ -77,6 +77,10 @@ export class RenderedContentHover extends Disposable { return this._renderedHoverParts.focusedHoverPartIndex; } + public focusHoverPartWithIndex(index: number): void { + this._renderedHoverParts.focusHoverPartWithIndex(index); + } + public getAccessibleWidgetContent(): string { return this._renderedHoverParts.getAccessibleContent(); } @@ -328,6 +332,13 @@ class RenderedContentHoverParts extends Disposable { this._colorHoverParticipant = participants.find(p => p instanceof ColorHoverParticipant); } + public focusHoverPartWithIndex(index: number): void { + if (index < 0 || index >= this._renderedParts.length) { + return; + } + this._renderedParts[index].hoverElement.focus(); + } + public getAccessibleContent(): string { const content: string[] = []; for (let i = 0; i < this._renderedParts.length; i++) { diff --git a/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts b/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts index 462df2e9d60fb..41a7fbdfce992 100644 --- a/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts +++ b/src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts @@ -117,8 +117,12 @@ abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAc if (!this._hoverController) { return; } + if (this._focusedHoverPartIndex === -1) { + this._hoverController.focus(); + } else { + this._hoverController.focusHoverPartWithIndex(this._focusedHoverPartIndex); + } this._focusedHoverPartIndex = -1; - this._hoverController.focus(); this._hoverController.shouldKeepOpenOnEditorMouseMoveOrLeave = false; this.dispose(); } diff --git a/src/vs/editor/contrib/hover/browser/hoverController.ts b/src/vs/editor/contrib/hover/browser/hoverController.ts index 9dbae0ce6430f..b6ef34860ca52 100644 --- a/src/vs/editor/contrib/hover/browser/hoverController.ts +++ b/src/vs/editor/contrib/hover/browser/hoverController.ts @@ -433,6 +433,10 @@ export class HoverController extends Disposable implements IEditorContribution { this._contentWidget?.focus(); } + public focusHoverPartWithIndex(index: number): void { + this._contentWidget?.focusHoverPartWithIndex(index); + } + public scrollUp(): void { this._contentWidget?.scrollUp(); } From e5d157c069adc9f9d4c6ad31c71ec6cf519f9ed0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2024 13:18:47 +0200 Subject: [PATCH 501/755] Inline chat fixes (#218318) * fix https://github.com/microsoft/vscode/issues/218059 * Change enablement of "Toggle Changes" instead of visibility mitigates/fixes https://github.com/microsoft/vscode/issues/218099 * have padding per part (actions, input, list) fixes https://github.com/microsoft/vscode/issues/218083 * fixes https://github.com/microsoft/vscode/issues/218021 * fix notebook button groups for inline chat * tweak inline chat content widget when text btn are enabled --- .../contrib/chat/browser/chatListRenderer.ts | 2 +- .../contrib/chat/browser/media/chat.css | 8 +++++++- .../inlineChat/browser/inlineChatActions.ts | 6 +++--- .../browser/inlineChatContentWidget.ts | 8 ++++---- .../inlineChat/browser/inlineChatWidget.ts | 2 +- .../inlineChat/browser/media/inlineChat.css | 18 +++++++++++++----- .../browser/media/inlineChatContentWidget.css | 7 ++++++- .../browser/controller/chat/cellChatActions.ts | 4 ++-- 8 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 01a8fccfea94b..21047f36d1cbb 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -255,7 +255,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer .username { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index 063e2de835c7a..2009001a7ea25 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -525,9 +525,9 @@ export class ToggleDiffForChange extends AbstractInlineChatAction { }, menu: { id: MENU_INLINE_CHAT_WIDGET_STATUS, - group: 'more', - when: ContextKeyExpr.and(CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live), CTX_INLINE_CHAT_CHANGE_HAS_DIFF), - order: 10, + group: 'zzz', + when: ContextKeyExpr.and(CTX_INLINE_CHAT_EDIT_MODE.isEqualTo(EditMode.Live)), + order: 1, } }); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts index e22cab4975c1b..20004ab3eb27c 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts @@ -101,9 +101,9 @@ export class InlineChatContentWidget implements IContentWidget { this._domNode.appendChild(this._inputContainer); this._toolbarContainer.classList.add('toolbar'); - if (!configurationService.getValue(InlineChatConfigKeys.ExpTextButtons)) { - this._toolbarContainer.style.display = 'none'; - this._domNode.style.paddingBottom = '6px'; + if (configurationService.getValue(InlineChatConfigKeys.ExpTextButtons)) { + this._toolbarContainer.style.display = 'inherit'; + this._domNode.style.paddingBottom = '4px'; } this._domNode.appendChild(this._toolbarContainer); @@ -188,7 +188,6 @@ export class InlineChatContentWidget implements IContentWidget { this._focusNext = true; this._editor.revealRangeNearTopIfOutsideViewport(Range.fromPositions(position), ScrollType.Immediate); - this._widget.inputEditor.setValue(''); const wordInfo = this._editor.getModel()?.getWordAtPosition(position); @@ -202,6 +201,7 @@ export class InlineChatContentWidget implements IContentWidget { if (this._visible) { this._visible = false; this._editor.removeContentWidget(this); + this._widget.inputEditor.setValue(''); this._widget.saveState(); this._widget.setVisible(false); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 4bc0e13939fac..e5ff46f597fe6 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -361,7 +361,7 @@ export class InlineChatWidget { } protected _getExtraHeight(): number { - return 4 /* padding */ + 2 /*border*/ + 12 /*shadow*/; + return 4 /* padding */ + 2 /*border*/ + 4 /*shadow*/; } updateProgress(show: boolean) { diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index a345f1cc0c987..e8fd1d5e04762 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -13,14 +13,16 @@ .monaco-workbench .inline-chat { color: inherit; - padding: 0 8px; border-radius: 4px; border: 1px solid var(--vscode-inlineChat-border); box-shadow: 0 2px 4px 0 var(--vscode-widget-shadow); - margin-top: 8px; background: var(--vscode-inlineChat-background); } +.monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-input-part { + padding: 4px 6px 0 6px; +} + .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-input-part .interactive-execute-toolbar { margin-bottom: 1px; } @@ -35,8 +37,10 @@ } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.interactive-item-compact { - padding: 2px 0; gap: 6px; + padding-top: 2px; + padding-right: 20px; + padding-left: 6px; } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.interactive-item-compact .header .avatar { @@ -53,6 +57,10 @@ border: none; } +.monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.minimal > .header { + right: 10px; +} + /* progress bit */ .monaco-workbench .inline-chat .progress { @@ -66,10 +74,11 @@ /* status */ -.monaco-workbench .inline-chat .status { +.monaco-workbench .inline-chat > .status { display: flex; justify-content: space-between; align-items: center; + padding: 4px 6px 0 6px } .monaco-workbench .inline-chat .status .actions.hidden { @@ -147,7 +156,6 @@ display: flex; height: 18px; - padding: 3px 0; /* makes space for action focus borders: https://github.com/microsoft/vscode-copilot/issues/5814 */ .actions-container { gap: 3px diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css index 8800ca13e35ea..cc5f706404cec 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css @@ -5,7 +5,7 @@ .monaco-workbench .inline-chat-content-widget { z-index: 50; - padding: 6px 6px 0px 6px; + padding: 6px; border-radius: 4px; background-color: var(--vscode-inlineChat-background); box-shadow: 0 4px 8px var(--vscode-inlineChat-shadow); @@ -23,3 +23,8 @@ .monaco-workbench .inline-chat-content-widget.interactive-session .interactive-input-part.compact { padding: 0; } + +.monaco-workbench .inline-chat-content-widget.interactive-session .toolbar { + display: none; + padding-top: 4px; +} diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts index f7651b21fe923..f474b4dfc6b43 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.ts @@ -258,7 +258,7 @@ registerAction2(class extends NotebookAction { menu: [ { id: MENU_CELL_CHAT_WIDGET_STATUS, - group: 'inline', + group: '0_main', order: 0, when: CTX_INLINE_CHAT_RESPONSE_TYPE.notEqualsTo(InlineChatResponseType.Messages), } @@ -286,7 +286,7 @@ registerAction2(class extends NotebookAction { }, menu: { id: MENU_CELL_CHAT_WIDGET_STATUS, - group: 'main', + group: '0_main', order: 1 }, f1: false From ea9edd00c565a2287610b6fd89eb34e9d84681cb Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Wed, 26 Jun 2024 14:03:10 +0200 Subject: [PATCH 502/755] Replace inner text whitespace unicode characters other than `\n` and `\r` with ` ` (#218324) replacing the inner text unicode characters other than \n and \r with whitespace --- .../editor/contrib/hover/browser/markdownHoverParticipant.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts index 86626b4bf69d6..aaeb5796aa61a 100644 --- a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts @@ -379,7 +379,8 @@ class MarkdownRenderedHoverParts implements IRenderedHoverParts { if (!renderedHoverPart) { return undefined; } - const accessibleContent = renderedHoverPart.hoverElement.innerText.trim(); + const hoverElementInnerText = renderedHoverPart.hoverElement.innerText; + const accessibleContent = hoverElementInnerText.replace(/[^\S\n\r]+/gu, ' '); return accessibleContent; } From b4eb54551bcfd36866cc714e5702705165d5c67c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20Ng=E1=BB=8Dc=20Minh?= Date: Wed, 26 Jun 2024 19:21:17 +0700 Subject: [PATCH 503/755] fix: do not show activity bar's focus border on click (#217837) --- .../browser/parts/activitybar/media/activityaction.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css index f42d3307fb75d..b40341d217ce1 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css @@ -104,7 +104,8 @@ display: none; } -.monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.clicked:focus:before { +.monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.clicked:focus:before, +.monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.clicked:focus .active-item-indicator::before { border-left: none !important; /* no focus feedback when using mouse */ } From d193d821387ceaf45ee68674348ef3dad0007b02 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 26 Jun 2024 14:40:48 +0200 Subject: [PATCH 504/755] "default" colorCustomization doesn't get unset when removing setting override (#218362) --- .../services/themes/common/colorThemeData.ts | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/services/themes/common/colorThemeData.ts b/src/vs/workbench/services/themes/common/colorThemeData.ts index 6c2bd95258bff..e74a4ab1e05f0 100644 --- a/src/vs/workbench/services/themes/common/colorThemeData.ts +++ b/src/vs/workbench/services/themes/common/colorThemeData.ts @@ -45,6 +45,10 @@ export type TokenStyleDefinitions = { [P in keyof TokenStyleData]?: TokenStyleDe export type TextMateThemingRuleDefinitions = { [P in keyof TokenStyleData]?: ITextMateThemingRule | undefined; } & { scope?: ProbeScope }; +interface IColorOrDefaultMap { + [id: string]: Color | typeof DEFAULT_COLOR_CONFIG_VALUE; +} + export class ColorThemeData implements IWorkbenchColorTheme { static readonly STORAGE_KEY = 'colorThemeData'; @@ -65,7 +69,7 @@ export class ColorThemeData implements IWorkbenchColorTheme { private themeTokenColors: ITextMateThemingRule[] = []; private customTokenColors: ITextMateThemingRule[] = []; private colorMap: IColorMap = {}; - private customColorMap: IColorMap = {}; + private customColorMap: IColorOrDefaultMap = {}; private semanticTokenRules: SemanticTokenRule[] = []; private customSemanticTokenRules: SemanticTokenRule[] = []; @@ -132,15 +136,20 @@ export class ColorThemeData implements IWorkbenchColorTheme { } public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color | undefined { - let color: Color | undefined = this.customColorMap[colorId]; - if (color) { - return color; + const customColor = this.customColorMap[colorId]; + if (customColor instanceof Color) { + return customColor; + } + if (customColor === undefined) { /* !== DEFAULT_COLOR_CONFIG_VALUE */ + const color = this.colorMap[colorId]; + if (color !== undefined) { + return color; + } } - color = this.colorMap[colorId]; - if (useDefault !== false && types.isUndefined(color)) { - color = this.getDefault(colorId); + if (useDefault !== false) { + return this.getDefault(colorId); } - return color; + return undefined; } private getTokenStyle(type: string, modifiers: string[], language: string, useDefault = true, definitions: TokenStyleDefinitions = {}): TokenStyle | undefined { @@ -346,7 +355,11 @@ export class ColorThemeData implements IWorkbenchColorTheme { } public defines(colorId: ColorIdentifier): boolean { - return this.customColorMap.hasOwnProperty(colorId) || this.colorMap.hasOwnProperty(colorId); + const customColor = this.customColorMap[colorId]; + if (customColor instanceof Color) { + return true; + } + return customColor === undefined /* !== DEFAULT_COLOR_CONFIG_VALUE */ && this.colorMap.hasOwnProperty(colorId); } public setCustomizations(settings: ThemeConfiguration) { @@ -373,7 +386,7 @@ export class ColorThemeData implements IWorkbenchColorTheme { for (const id in colors) { const colorVal = colors[id]; if (colorVal === DEFAULT_COLOR_CONFIG_VALUE) { - delete this.colorMap[id]; + this.customColorMap[id] = DEFAULT_COLOR_CONFIG_VALUE; } else if (typeof colorVal === 'string') { this.customColorMap[id] = Color.fromHex(colorVal); } @@ -719,9 +732,9 @@ async function _loadColorTheme(extensionResourceLoaderService: IExtensionResourc // new JSON color themes format for (const colorId in colors) { const colorVal = colors[colorId]; - if (colorVal === DEFAULT_COLOR_CONFIG_VALUE) { + if (colorVal === DEFAULT_COLOR_CONFIG_VALUE) { // ignore colors that are set to to default delete result.colors[colorId]; - } else if (typeof colorVal === 'string') { // ignore colors that are null + } else if (typeof colorVal === 'string') { result.colors[colorId] = Color.fromHex(colors[colorId]); } } From 7ebe6d364f25ae0b38b0320302d589c84f481246 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2024 14:55:52 +0200 Subject: [PATCH 505/755] use `globalThis` instead of `window` (#218368) fixes https://github.com/microsoft/vscode/issues/214945 --- src/vs/base/browser/trustedTypes.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/base/browser/trustedTypes.ts b/src/vs/base/browser/trustedTypes.ts index 48c02ca8c97f2..0ef4b0845285f 100644 --- a/src/vs/base/browser/trustedTypes.ts +++ b/src/vs/base/browser/trustedTypes.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { mainWindow } from 'vs/base/browser/window'; import { onUnexpectedError } from 'vs/base/common/errors'; export function createTrustedTypesPolicy( @@ -28,7 +27,7 @@ export function createTrustedTypesPolicy Date: Wed, 26 Jun 2024 15:01:21 +0200 Subject: [PATCH 506/755] Refactor createConfigureKeybindingAction to support disabling keybinding configuration for SCM statusbar actions (#218372) chore: refactor createConfigureKeybindingAction to support disabling keybinding configuration for scm statusbar actions --- src/vs/platform/actions/browser/toolbar.ts | 3 ++- src/vs/platform/actions/common/menuService.ts | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/actions/browser/toolbar.ts b/src/vs/platform/actions/browser/toolbar.ts index 4857d4bc07bfc..a525f06ae9ec0 100644 --- a/src/vs/platform/actions/browser/toolbar.ts +++ b/src/vs/platform/actions/browser/toolbar.ts @@ -202,7 +202,8 @@ export class WorkbenchToolBar extends ToolBar { if (action instanceof MenuItemAction && action.menuKeybinding) { primaryActions.push(action.menuKeybinding); } else if (!(action instanceof SubmenuItemAction || action instanceof ToggleMenuAction)) { - primaryActions.push(createConfigureKeybindingAction(action.id, undefined, this._commandService, this._keybindingService)); + const isDisabled = action.id.startsWith('statusbaraction'); // We can't support keybinding configuration for scm statusbar actions + primaryActions.push(createConfigureKeybindingAction(this._commandService, this._keybindingService, action.id, undefined, !isDisabled)); } // -- Hide Actions -- diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts index 61fefa8e4ae30..0b2f255d9be3e 100644 --- a/src/vs/platform/actions/common/menuService.ts +++ b/src/vs/platform/actions/common/menuService.ts @@ -248,7 +248,7 @@ class MenuInfo { const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates); if (isMenuItem) { // MenuItemAction - const menuKeybinding = createConfigureKeybindingAction(item.command.id, item.when, this._commandService, this._keybindingService); + const menuKeybinding = createConfigureKeybindingAction(this._commandService, this._keybindingService, item.command.id, item.when); (activeActions ??= []).push(new MenuItemAction(item.command, item.alt, options, menuHide, menuKeybinding, this._contextKeyService, this._commandService)); } else { // SubmenuItemAction @@ -442,10 +442,11 @@ function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, st }; } -export function createConfigureKeybindingAction(commandId: string, when: ContextKeyExpression | undefined = undefined, commandService: ICommandService, keybindingService: IKeybindingService): IAction { +export function createConfigureKeybindingAction(commandService: ICommandService, keybindingService: IKeybindingService, commandId: string, when: ContextKeyExpression | undefined = undefined, enabled = true): IAction { return toAction({ id: `configureKeybinding/${commandId}`, label: localize('configure keybinding', "Configure Keybinding"), + enabled, run() { // Only set the when clause when there is no keybinding // It is possible that the action and the keybinding have different when clauses From 64c1b1cc60a02dfe1a3db23670a641c884573189 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:04:40 +0200 Subject: [PATCH 507/755] Revert "Git - do not show smart commit dialog when using Commit (Amend) (#214595)" (#218377) This reverts commit 5422f5f940537615c984af76ff0ab4ba5932127e. --- extensions/git/src/commands.ts | 52 ++++++++++++++++------------------ 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 00045c14ea39f..a5325033e778b 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2103,38 +2103,36 @@ export class CommandCenter { } } - if (!opts.amend) { - // no changes, and the user has not configured to commit all in this case - if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) { - const suggestSmartCommit = config.get('suggestSmartCommit') === true; + // no changes, and the user has not configured to commit all in this case + if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) { + const suggestSmartCommit = config.get('suggestSmartCommit') === true; - if (!suggestSmartCommit) { - return; - } - - // prompt the user if we want to commit all or not - const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?'); - const yes = l10n.t('Yes'); - const always = l10n.t('Always'); - const never = l10n.t('Never'); - const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); - - if (pick === always) { - config.update('enableSmartCommit', true, true); - } else if (pick === never) { - config.update('suggestSmartCommit', false, true); - return; - } else if (pick !== yes) { - return; // do not commit on cancel - } + if (!suggestSmartCommit) { + return; } - if (opts.all === undefined) { - opts = { ...opts, all: noStagedChanges }; - } else if (!opts.all && noStagedChanges) { - opts = { ...opts, all: true }; + // prompt the user if we want to commit all or not + const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?'); + const yes = l10n.t('Yes'); + const always = l10n.t('Always'); + const never = l10n.t('Never'); + const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); + + if (pick === always) { + config.update('enableSmartCommit', true, true); + } else if (pick === never) { + config.update('suggestSmartCommit', false, true); + return; + } else if (pick !== yes) { + return; // do not commit on cancel } } + + if (opts.all === undefined) { + opts = { ...opts, all: noStagedChanges }; + } else if (!opts.all && noStagedChanges) { + opts = { ...opts, all: true }; + } } // enable signing of commits if configured From 68f6b9113e1031e896484860604e20651cdd6bf5 Mon Sep 17 00:00:00 2001 From: Cristopher Claeys Date: Wed, 26 Jun 2024 15:07:55 +0200 Subject: [PATCH 508/755] Add seen set to service instantiation --- src/vs/platform/instantiation/common/instantiationService.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 4b313ed32ebd0..cab2957b1468c 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -216,8 +216,13 @@ export class InstantiationService implements IInstantiationService { let cycleCount = 0; const stack = [{ id, desc, _trace }]; + const seen = new Set(); while (stack.length) { const item = stack.pop()!; + + if (seen.has(String(item.id))) continue; + seen.add(String(item.id)); + graph.lookupOrInsertNode(item); // a weak but working heuristic for cycle checks From fdec5a0ec0d50bcfd61ae4a76e6f5a809b5c5d81 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2024 15:11:26 +0200 Subject: [PATCH 509/755] fix https://github.com/microsoft/vscode/issues/217853 (#218380) --- .../inlineChat/browser/media/inlineChatContentWidget.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css index cc5f706404cec..7da5cc3e97ef3 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChatContentWidget.css @@ -24,6 +24,10 @@ padding: 0; } +.monaco-workbench .inline-chat-content-widget.interactive-session .interactive-list { + display: none; +} + .monaco-workbench .inline-chat-content-widget.interactive-session .toolbar { display: none; padding-top: 4px; From 05b1eafd91974570a054aed949f642bbf24831c0 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 26 Jun 2024 07:38:27 -0700 Subject: [PATCH 510/755] Improve casing of environment changes actions Fixes #218118 --- .../contrib/terminal/browser/environmentVariableInfo.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts b/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts index e355b287f63f4..606202e883775 100644 --- a/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts +++ b/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts @@ -39,7 +39,7 @@ export class EnvironmentVariableInfoStale implements IEnvironmentVariableInfo { private _getActions(): ITerminalStatusHoverAction[] { return [{ - label: localize('relaunchTerminalLabel', "Relaunch terminal"), + label: localize('relaunchTerminalLabel', "Relaunch Terminal"), run: () => this._terminalService.getInstanceFromId(this._terminalId)?.relaunch(), commandId: TerminalCommandId.Relaunch }]; @@ -77,7 +77,7 @@ export class EnvironmentVariableInfoChangesActive implements IEnvironmentVariabl private _getActions(scope: EnvironmentVariableScope | undefined): ITerminalStatusHoverAction[] { return [{ - label: localize('showEnvironmentContributions', "Show environment contributions"), + label: localize('showEnvironmentContributions', "Show Environment Contributions"), run: () => this._commandService.executeCommand(TerminalCommandId.ShowEnvironmentContributions, scope), commandId: TerminalCommandId.ShowEnvironmentContributions }]; From da06c08a328a7519e87e2fe085abdc7e691161a1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 26 Jun 2024 16:48:28 +0200 Subject: [PATCH 511/755] Inline chat fixes and polish (#218398) * react to changes of `inlineChat.experimental.textButtons` (no more window reload) https://github.com/microsoft/vscode/issues/217845 * fix status label wrapping * remove unused toolbar * fix https://github.com/microsoft/vscode/issues/218395 --- .../browser/inlineChat.contribution.ts | 6 ++ .../inlineChat/browser/inlineChatWidget.ts | 81 ++++++++----------- .../inlineChat/browser/media/inlineChat.css | 24 +++++- .../contrib/inlineChat/common/inlineChat.ts | 2 +- 4 files changed, 61 insertions(+), 52 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts index 21f02771f96a6..7d3e40412716f 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts @@ -125,9 +125,15 @@ class MenuCopier implements IDisposable { updateMenu(); } }); + const listener2 = configService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(InlineChatConfigKeys.ExpTextButtons)) { + updateMenu(); + } + }); this.dispose = () => { listener.dispose(); + listener2.dispose(); store.dispose(); }; } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index e5ff46f597fe6..fad3466eefead 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -64,11 +64,6 @@ export interface IInlineChatWidgetConstructionOptions { */ statusMenuId: MenuId | { menu: MenuId; options: IWorkbenchButtonBarOptions }; - /** - * The men that rendered in the lower right corner, use for feedback - */ - feedbackMenuId?: MenuId; - /** * The options for the chat widget */ @@ -97,9 +92,9 @@ export class InlineChatWidget { h('div.accessibleViewer@accessibleViewer'), h('div.status@status', [ h('div.label.info.hidden@infoLabel'), - h('div.actions.hidden@statusToolbar'), + h('div.actions.text-style.hidden@toolbar1'), + h('div.actions.button-style.hidden@toolbar2'), h('div.label.status.hidden@statusLabel'), - h('div.actions.hidden@feedbackToolbar'), ]), ] ); @@ -200,46 +195,34 @@ export class InlineChatWidget { const statusMenuId = options.statusMenuId instanceof MenuId ? options.statusMenuId : options.statusMenuId.menu; - if (this._configurationService.getValue(InlineChatConfigKeys.ExpTextButtons)) { - // TEXT-ONLY bar - const statusToolbarMenu = scopedInstaService.createInstance(MenuWorkbenchToolBar, this._elements.statusToolbar, statusMenuId, { - hiddenItemStrategy: HiddenItemStrategy.NoHide, - telemetrySource: options.chatWidgetViewOptions?.menus?.telemetrySource, - actionViewItemProvider: action => action instanceof MenuItemAction ? this._instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { conversational: true }) : undefined, - toolbarOptions: { primaryGroup: '0_main' }, - menuOptions: { renderShortTitle: true }, - label: true, - icon: false - }); - this._store.add(statusToolbarMenu.onDidChangeMenuItems(() => this._onDidChangeHeight.fire())); - this._store.add(statusToolbarMenu); - - } else { - // BUTTON bar - const statusMenuOptions = options.statusMenuId instanceof MenuId ? undefined : options.statusMenuId.options; - const statusButtonBar = scopedInstaService.createInstance(MenuWorkbenchButtonBar, this._elements.statusToolbar, statusMenuId, { - toolbarOptions: { primaryGroup: '0_main' }, - telemetrySource: options.chatWidgetViewOptions?.menus?.telemetrySource, - menuOptions: { renderShortTitle: true }, - ...statusMenuOptions, - }); - this._store.add(statusButtonBar.onDidChange(() => this._onDidChangeHeight.fire())); - this._store.add(statusButtonBar); - } - - const workbenchToolbarOptions = { + // TEXT-ONLY bar + const statusToolbarMenu = scopedInstaService.createInstance(MenuWorkbenchToolBar, this._elements.toolbar1, statusMenuId, { hiddenItemStrategy: HiddenItemStrategy.NoHide, - toolbarOptions: { - primaryGroup: () => true, - useSeparatorsInPrimaryActions: true - } - }; + telemetrySource: options.chatWidgetViewOptions?.menus?.telemetrySource, + actionViewItemProvider: action => action instanceof MenuItemAction ? this._instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { conversational: true }) : undefined, + toolbarOptions: { primaryGroup: '0_main' }, + menuOptions: { renderShortTitle: true }, + label: true, + icon: false + }); + this._store.add(statusToolbarMenu.onDidChangeMenuItems(() => this._onDidChangeHeight.fire())); + this._store.add(statusToolbarMenu); + + // BUTTON bar + const statusMenuOptions = options.statusMenuId instanceof MenuId ? undefined : options.statusMenuId.options; + const statusButtonBar = scopedInstaService.createInstance(MenuWorkbenchButtonBar, this._elements.toolbar2, statusMenuId, { + toolbarOptions: { primaryGroup: '0_main' }, + telemetrySource: options.chatWidgetViewOptions?.menus?.telemetrySource, + menuOptions: { renderShortTitle: true }, + ...statusMenuOptions, + }); + this._store.add(statusButtonBar.onDidChange(() => this._onDidChangeHeight.fire())); + this._store.add(statusButtonBar); + + const toggleToolbar = () => this._elements.status.classList.toggle('text', this._configurationService.getValue(InlineChatConfigKeys.ExpTextButtons)); + this._store.add(this._configurationService.onDidChangeConfiguration(e => e.affectsConfiguration(InlineChatConfigKeys.ExpTextButtons) && toggleToolbar())); + toggleToolbar(); - if (options.feedbackMenuId) { - const feedbackToolbar = this._instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.feedbackToolbar, options.feedbackMenuId, { ...workbenchToolbarOptions, hiddenItemStrategy: HiddenItemStrategy.Ignore }); - this._store.add(feedbackToolbar.onDidChangeMenuItems(() => this._onDidChangeHeight.fire())); - this._store.add(feedbackToolbar); - } this._store.add(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(AccessibilityVerbositySettingId.InlineChat)) { @@ -402,8 +385,8 @@ export class InlineChatWidget { updateToolbar(show: boolean) { this._elements.root.classList.toggle('toolbar', show); - this._elements.statusToolbar.classList.toggle('hidden', !show); - this._elements.feedbackToolbar.classList.toggle('hidden', !show); + this._elements.toolbar1.classList.toggle('hidden', !show); + this._elements.toolbar2.classList.toggle('hidden', !show); this._elements.status.classList.toggle('actions', show); this._elements.infoLabel.classList.toggle('hidden', show); this._onDidChangeHeight.fire(); @@ -533,8 +516,8 @@ export class InlineChatWidget { reset(this._elements.statusLabel); this._elements.statusLabel.classList.toggle('hidden', true); - this._elements.statusToolbar.classList.add('hidden'); - this._elements.feedbackToolbar.classList.add('hidden'); + this._elements.toolbar1.classList.add('hidden'); + this._elements.toolbar2.classList.add('hidden'); this.updateInfo(''); this.chatWidget.setModel(this._defaultChatModel, {}); diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index e8fd1d5e04762..279fea6e71be1 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -58,6 +58,7 @@ } .monaco-workbench .inline-chat .chat-widget .interactive-session .interactive-list .interactive-item-container.minimal > .header { + top: 5px; right: 10px; } @@ -89,7 +90,8 @@ overflow: hidden; color: var(--vscode-descriptionForeground); font-size: 11px; - display: inline-flex; + display: flex; + white-space: nowrap; } .monaco-workbench .inline-chat .status .label.info { @@ -114,7 +116,7 @@ } .monaco-workbench .inline-chat .status .label > .codicon { - padding: 0 5px; + padding: 0 3px; font-size: 12px; line-height: 18px; } @@ -185,6 +187,24 @@ } } +.monaco-workbench .inline-chat .status { + .actions.text-style { + display: none; + } + .actions.button-style { + display: inherit; + } +} + +.monaco-workbench .inline-chat .status.text { + .actions.text-style { + display: inherit; + } + .actions.button-style { + display: none; + } +} + .monaco-workbench .inline-chat .status .actions > .monaco-button, .monaco-workbench .inline-chat .status .actions > .monaco-button-dropdown { margin-right: 4px; diff --git a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts index ee60b223f56dc..b4c754b17590a 100644 --- a/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts +++ b/src/vs/workbench/contrib/inlineChat/common/inlineChat.ts @@ -67,7 +67,7 @@ Registry.as(Extensions.Configuration).registerConfigurat ], }, [InlineChatConfigKeys.ExpTextButtons]: { - description: localize('txtButtons', "Whether to use textual buttons (Requires restart)."), + description: localize('txtButtons', "Whether to use textual buttons."), default: false, type: 'boolean', tags: ['experimental'] From 59c040741899a64de6c4a1bd6ce71066d4bcb234 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 26 Jun 2024 08:09:11 -0700 Subject: [PATCH 512/755] Reset inline chat widget before terminal chat widget Fixes #218402 --- .../contrib/terminalContrib/chat/browser/terminalChatWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index edb6b3af10933..c680814669965 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -194,11 +194,11 @@ export class TerminalChatWidget extends Disposable { hide(): void { this._container.classList.add('hide'); + this._inlineChatWidget.reset(); this._reset(); this._inlineChatWidget.updateChatMessage(undefined); this._inlineChatWidget.updateProgress(false); this._inlineChatWidget.updateToolbar(false); - this._inlineChatWidget.reset(); this._focusedContextKey.set(false); this._visibleContextKey.set(false); this._inlineChatWidget.value = ''; From 14b094becc5b012b46f8694087b8a59e2550d2a4 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Wed, 26 Jun 2024 17:21:53 +0200 Subject: [PATCH 513/755] fix: add disposable to elementDisposables instead of templateDisposables in renderElement function in SettingEnumRenderer (#216855) --- src/vs/workbench/contrib/preferences/browser/settingsTree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 06efb414415c6..0be46bd177af7 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -1737,7 +1737,7 @@ export class SettingEnumRenderer extends AbstractSettingRenderer implements ITre const enumDescriptionsAreMarkdown = dataElement.setting.enumDescriptionsAreMarkdown; const disposables = new DisposableStore(); - template.toDispose.add(disposables); + template.elementDisposables.add(disposables); let createdDefault = false; if (!settingEnum.includes(dataElement.defaultValue)) { From ed2036106c45099917689dbb413d4b3ff89b2066 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Wed, 26 Jun 2024 17:25:15 +0200 Subject: [PATCH 514/755] fix: possible memory leak in SettingTreeRenderers (#216768) --- .../preferences/browser/settingsEditor2.ts | 6 +++--- .../preferences/browser/settingsTree.ts | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index f583071dee18f..f9b11cf76a87d 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -794,10 +794,10 @@ export class SettingsEditor2 extends EditorPane { this.createTOC(this.tocTreeContainer); this.createSettingsTree(this.settingsTreeContainer); - this.splitView = new SplitView(this.bodyContainer, { + this.splitView = this._register(new SplitView(this.bodyContainer, { orientation: Orientation.HORIZONTAL, proportionalLayout: true - }); + })); const startingWidth = this.storageService.getNumber('settingsEditor2.splitViewWidth', StorageScope.PROFILE, SettingsEditor2.TOC_RESET_WIDTH); this.splitView.addView({ onDidChange: Event.None, @@ -914,7 +914,7 @@ export class SettingsEditor2 extends EditorPane { } private createSettingsTree(container: HTMLElement): void { - this.settingRenderers = this.instantiationService.createInstance(SettingTreeRenderers); + this.settingRenderers = this._register(this.instantiationService.createInstance(SettingTreeRenderers)); this._register(this.settingRenderers.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value, e.type, e.manualReset, e.scope))); this._register(this.settingRenderers.onDidOpenSettings(settingKey => { this.openSettingsFile({ revealSetting: { key: settingKey, edit: true } }); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 0be46bd177af7..62a948e5a082c 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -1985,10 +1985,10 @@ export class SettingsExtensionToggleRenderer extends AbstractSettingRenderer imp } } -export class SettingTreeRenderers { +export class SettingTreeRenderers extends Disposable { readonly onDidClickOverrideElement: Event; - private readonly _onDidChangeSetting = new Emitter(); + private readonly _onDidChangeSetting = this._register(new Emitter()); readonly onDidChangeSetting: Event; readonly onDidOpenSettings: Event; @@ -2012,6 +2012,7 @@ export class SettingTreeRenderers { @IUserDataProfilesService private readonly _userDataProfilesService: IUserDataProfilesService, @IUserDataSyncEnablementService private readonly _userDataSyncEnablementService: IUserDataSyncEnablementService, ) { + super(); this.settingActions = [ new Action('settings.resetSetting', localize('resetSettingLabel', "Reset Setting"), undefined, undefined, async context => { if (context instanceof SettingsTreeSettingElement) { @@ -2117,6 +2118,20 @@ export class SettingTreeRenderers { const settingElement = this.getSettingDOMElementForDOMElement(element); return settingElement && settingElement.getAttribute(AbstractSettingRenderer.SETTING_ID_ATTR); } + + override dispose(): void { + super.dispose(); + this.settingActions.forEach(action => { + if (isDisposable(action)) { + action.dispose(); + } + }); + this.allRenderers.forEach(renderer => { + if (isDisposable(renderer)) { + renderer.dispose(); + } + }); + } } /** From c6e312a80ee32d6e6af957533f6e309ba100f581 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:10:25 -0700 Subject: [PATCH 515/755] Fix terminalChatFocus behavior Fixes #216624 --- .../terminalContrib/chat/browser/terminalChatWidget.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index c680814669965..33c01afbb634c 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -96,11 +96,14 @@ export class TerminalChatWidget extends Disposable { this._container.appendChild(this._inlineChatWidget.domNode); this._focusTracker = this._register(trackFocus(this._container)); + this._register(this._focusTracker.onDidFocus(() => this._focusedContextKey.set(true))); this._register(this._focusTracker.onDidBlur(() => { + this._focusedContextKey.set(false); if (!this.inlineChatWidget.responseContent) { this.hide(); } })); + this.hide(); } @@ -150,7 +153,6 @@ export class TerminalChatWidget extends Disposable { reveal(): void { this._doLayout(this._inlineChatWidget.contentHeight); this._container.classList.remove('hide'); - this._focusedContextKey.set(true); this._visibleContextKey.set(true); this._inlineChatWidget.focus(); this._instance.scrollToBottom(); @@ -199,7 +201,6 @@ export class TerminalChatWidget extends Disposable { this._inlineChatWidget.updateChatMessage(undefined); this._inlineChatWidget.updateProgress(false); this._inlineChatWidget.updateToolbar(false); - this._focusedContextKey.set(false); this._visibleContextKey.set(false); this._inlineChatWidget.value = ''; this._instance.focus(); From a11a0d7edcd2931f520916446743d3ba39429e00 Mon Sep 17 00:00:00 2001 From: Ole Date: Wed, 26 Jun 2024 18:10:56 +0200 Subject: [PATCH 516/755] Fix two bugs in #214589 fixing #213535. (#218357) * Fix two bugs in #214589. 1. We must not `dispose()` the `MutableDisposable` `this._commentThreadWidget` - as that disposes the MutableDisposable itself, and it cannot then later be reassigned to a new value. Instead, we need to assign `value=undefined`, which disposes the previous `value`, but keeps the `MutableDisposable` available to be reused later. 2. `initialize()` is a no-op if `this.currentElement` is already identical to the passed `element`, so we must not do that assignment before calling initialize - instead `initialize()` does the assignment after checking. * Fix blank line. * Register the _commentThreadWidget MutableDisposable so that it gets disposed when CellComments is disposed. --- .../notebook/browser/view/cellParts/cellComments.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index cbf886228ef67..44e5866b04faf 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -20,14 +20,13 @@ import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; export class CellComments extends CellContentPart { - private readonly _commentThreadWidget = new MutableDisposable>; + private readonly _commentThreadWidget: MutableDisposable>; private currentElement: CodeCellViewModel | undefined; private readonly _commentThreadDisposables = this._register(new DisposableStore()); constructor( private readonly notebookEditor: INotebookEditorDelegate, private readonly container: HTMLElement, - @IContextKeyService private readonly contextKeyService: IContextKeyService, @IThemeService private readonly themeService: IThemeService, @ICommentService private readonly commentService: ICommentService, @@ -37,6 +36,8 @@ export class CellComments extends CellContentPart { super(); this.container.classList.add('review-widget'); + this._register(this._commentThreadWidget = new MutableDisposable>()); + this._register(this.themeService.onDidColorThemeChange(this._applyTheme, this)); // TODO @rebornix onDidChangeLayout (font change) // this._register(this.notebookEditor.onDidchangeLa) @@ -108,7 +109,7 @@ export class CellComments extends CellContentPart { if (this._commentThreadWidget.value) { if (!info) { this._commentThreadDisposables.clear(); - this._commentThreadWidget.dispose(); + this._commentThreadWidget.value = undefined; this.currentElement.commentHeight = 0; return; } @@ -154,7 +155,6 @@ export class CellComments extends CellContentPart { override didRenderCell(element: ICellViewModel): void { if (element.cellKind === CellKind.Code) { - this.currentElement = element as CodeCellViewModel; this.initialize(element); this._bindListeners(); } From b37c33ddcb0640891675d51d127eeb083e605f54 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:38:19 -0700 Subject: [PATCH 517/755] Fix missing cases for not reporting prompts Fixes #215482 --- .../terminal/browser/media/shellIntegration-bash.sh | 4 +++- .../terminal/browser/media/shellIntegration.ps1 | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index e46d83c6bb16b..06036fcbaae34 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -175,7 +175,9 @@ __vsc_stable="$VSCODE_STABLE" unset VSCODE_STABLE # Report continuation prompt -builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a" +if [ "$__vsc_stable" = "0" ]; then + builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a" +fi __vsc_report_prompt() { # Expand the original PS1 similarly to how bash would normally diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 index 53603022c2924..6c92130ec958c 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 @@ -98,7 +98,7 @@ function Global:Prompt() { # Prompt # OSC 633 ; = ST - if ($isStable -eq "1") { + if ($isStable -eq "0") { $Result += "$([char]0x1b)]633;P;Prompt=$(__VSCode-Escape-Value $OriginalPrompt)`a" } @@ -147,9 +147,11 @@ else { } # Set ContinuationPrompt property -$ContinuationPrompt = (Get-PSReadLineOption).ContinuationPrompt -if ($ContinuationPrompt) { - [Console]::Write("$([char]0x1b)]633;P;ContinuationPrompt=$(__VSCode-Escape-Value $ContinuationPrompt)`a") +if ($isStable -eq "0") { + $ContinuationPrompt = (Get-PSReadLineOption).ContinuationPrompt + if ($ContinuationPrompt) { + [Console]::Write("$([char]0x1b)]633;P;ContinuationPrompt=$(__VSCode-Escape-Value $ContinuationPrompt)`a") + } } # Set always on key handlers which map to default VS Code keybindings From 47262beab72adf41e9194ddb19d862404a50628a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:46:12 -0700 Subject: [PATCH 518/755] Disable terminal initial hint when ctrl+i is triggered Previously this would only happen when _clicked_. Fixes #213820 --- .../chat/browser/terminal.initialHint.contribution.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts index 9bd955a1ab7d4..21d5f88714554 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts @@ -261,6 +261,7 @@ class TerminalInitialHintWidget extends Disposable { }; this.toDispose.add(this.commandService.onDidExecuteCommand(e => { if (e.commandId === TerminalChatCommandId.Start) { + this._storageService.store(Constants.InitialHintHideStorageKey, true, StorageScope.APPLICATION, StorageTarget.USER); this.dispose(); } })); From 955be758398c3da33192f52d1a2dbaaa1f69ae24 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:10:19 -0700 Subject: [PATCH 519/755] Add new line before end of fenced code block Fixes #218397 --- src/vs/base/browser/markdownRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 61e10f19359ad..49cb39a06b024 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -636,7 +636,7 @@ const plainTextRenderer = new Lazy((withCodeBlocks?: boolean) = const plainTextWithCodeBlocksRenderer = new Lazy(() => { const renderer = createRenderer(); renderer.code = (code: string): string => { - return '\n' + '```' + '\n' + code + '```' + '\n'; + return `\n\`\`\`\n${code}\n\`\`\`\n`; }; return renderer; }); From 7607e75d696186379355fd1e815e180bc27ba218 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 26 Jun 2024 11:08:09 -0700 Subject: [PATCH 520/755] debug: bump js-debug for 1.91 (#218469) --- product.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product.json b/product.json index d2d3bf7a36158..27ae53fe16bcd 100644 --- a/product.json +++ b/product.json @@ -50,8 +50,8 @@ }, { "name": "ms-vscode.js-debug", - "version": "1.90.0", - "sha256": "1317dd7d1ac50641c1534a3e957ecbc94349f4fbd897acb916da11eea3208a66", + "version": "1.91.0", + "sha256": "53b99146c7fa280f00c74414e09721530c622bf3e5eac2c967ddfb9906b51c80", "repo": "https://github.com/microsoft/vscode-js-debug", "metadata": { "id": "25629058-ddac-4e17-abba-74678e126c5d", From b9f2435180d51a26185b00b71ec43a07a4739ddd Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 26 Jun 2024 11:25:07 -0700 Subject: [PATCH 521/755] Fix up markdown lists that use * (#218483) * Fix up markdown lists that use * Fix #217946 * Comment --- src/vs/base/browser/markdownRenderer.ts | 4 ++-- src/vs/base/test/browser/markdownRenderer.test.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 49cb39a06b024..265a57113f7c0 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -768,8 +768,8 @@ function completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List | const previousListItemsText = mergeRawTokenText(list.items.slice(0, -1)); - // Grabbing the `- ` or `1. ` off the list item because I can't find a better way to do this - const lastListItemLead = lastListItem.raw.match(/^(\s*(-|\d+\.) +)/)?.[0]; + // Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this + const lastListItemLead = lastListItem.raw.match(/^(\s*(-|\d+\.|\*) +)/)?.[0]; if (!lastListItemLead) { // Is badly formatted return; diff --git a/src/vs/base/test/browser/markdownRenderer.test.ts b/src/vs/base/test/browser/markdownRenderer.test.ts index 81abf8c9c9ecb..4ea38c815c390 100644 --- a/src/vs/base/test/browser/markdownRenderer.test.ts +++ b/src/vs/base/test/browser/markdownRenderer.test.ts @@ -607,6 +607,15 @@ const y = 2; assert.deepStrictEqual(newTokens, completeTokens); }); + test(`incomplete ${name} in asterisk list`, () => { + const text = `* list item one\n* list item two and ${delimiter}text`; + const tokens = marked.lexer(text); + const newTokens = fillInIncompleteTokens(tokens); + + const completeTokens = marked.lexer(text + delimiter); + assert.deepStrictEqual(newTokens, completeTokens); + }); + test(`incomplete ${name} in numbered list`, () => { const text = `1. list item one\n2. list item two and ${delimiter}text`; const tokens = marked.lexer(text); From 9e7cd445fa9bf1cf67f695201130744ee7cc30da Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Wed, 26 Jun 2024 14:03:37 -0700 Subject: [PATCH 522/755] fix: show context menu option to disable empty editor hint (#218548) * fix: show context menu option to disable empty editor hint * Fix action name --- .../emptyTextEditorHint.ts | 45 +++++++++++++++---- .../contrib/editorHint/emptyCellEditorHint.ts | 7 ++- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index c8a1443ab1ed8..327554fd78153 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -34,6 +34,8 @@ import { SEARCH_RESULT_LANGUAGE_ID } from 'vs/workbench/services/search/common/s import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { IHoverService } from 'vs/platform/hover/browser/hover'; import { ChatAgentLocation, IChatAgent, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; const $ = dom.$; @@ -60,6 +62,7 @@ export class EmptyTextEditorHintContribution implements IEditorContribution { @IChatAgentService private readonly chatAgentService: IChatAgentService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IProductService protected readonly productService: IProductService, + @IContextMenuService private readonly contextMenuService: IContextMenuService ) { this.toDispose = []; this.toDispose.push(this.editor.onDidChangeModel(() => this.update())); @@ -145,7 +148,8 @@ export class EmptyTextEditorHintContribution implements IEditorContribution { this.keybindingService, this.chatAgentService, this.telemetryService, - this.productService + this.productService, + this.contextMenuService ); } else if (!shouldRenderHint && this.textHintContentWidget) { this.textHintContentWidget.dispose(); @@ -178,7 +182,8 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { private readonly keybindingService: IKeybindingService, private readonly chatAgentService: IChatAgentService, private readonly telemetryService: ITelemetryService, - private readonly productService: IProductService + private readonly productService: IProductService, + private readonly contextMenuService: IContextMenuService, ) { this.toDispose = new DisposableStore(); this.toDispose.add(this.editor.onDidChangeConfiguration((e: ConfigurationChangedEvent) => { @@ -199,10 +204,34 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { return EmptyTextEditorHintContentWidget.ID; } - private _disableHint() { - this.configurationService.updateValue(emptyTextEditorHintSetting, 'hidden'); - this.dispose(); - this.editor.focus(); + private _disableHint(e?: MouseEvent) { + const disableHint = () => { + this.configurationService.updateValue(emptyTextEditorHintSetting, 'hidden'); + this.dispose(); + this.editor.focus(); + }; + + if (!e) { + disableHint(); + return; + } + + this.contextMenuService.showContextMenu({ + getAnchor: () => { return new StandardMouseEvent(dom.getActiveWindow(), e); }, + getActions: () => { + return [{ + id: 'workench.action.disableEmptyEditorHint', + label: localize('disableEditorEmptyHint', "Disable Empty Editor Hint"), + tooltip: localize('disableEditorEmptyHint', "Disable Empty Editor Hint"), + enabled: true, + class: undefined, + run: () => { + disableHint(); + } + } + ]; + } + }); } private _getHintInlineChat(providers: IChatAgent[]) { @@ -244,7 +273,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { const hintPart = $('a', undefined, fragment); hintPart.style.fontStyle = 'italic'; hintPart.style.cursor = 'pointer'; - this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CONTEXT_MENU, () => this._disableHint())); + this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CONTEXT_MENU, (e) => this._disableHint(e))); this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CLICK, handleClick)); return hintPart; } else { @@ -263,7 +292,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { if (this.options.clickable) { label.element.style.cursor = 'pointer'; - this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, () => this._disableHint())); + this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, (e) => this._disableHint(e))); this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CLICK, handleClick)); } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/editorHint/emptyCellEditorHint.ts b/src/vs/workbench/contrib/notebook/browser/contrib/editorHint/emptyCellEditorHint.ts index eeef10e64d2af..205bce806e1a3 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/editorHint/emptyCellEditorHint.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/editorHint/emptyCellEditorHint.ts @@ -8,6 +8,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IHoverService } from 'vs/platform/hover/browser/hover'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -32,7 +33,8 @@ export class EmptyCellEditorHintContribution extends EmptyTextEditorHintContribu @IInlineChatSessionService inlineChatSessionService: IInlineChatSessionService, @IChatAgentService chatAgentService: IChatAgentService, @ITelemetryService telemetryService: ITelemetryService, - @IProductService productService: IProductService + @IProductService productService: IProductService, + @IContextMenuService contextMenuService: IContextMenuService ) { super( editor, @@ -44,7 +46,8 @@ export class EmptyCellEditorHintContribution extends EmptyTextEditorHintContribu inlineChatSessionService, chatAgentService, telemetryService, - productService + productService, + contextMenuService ); const activeEditor = getNotebookEditorFromEditorPane(this._editorService.activeEditorPane); From fb3bace29e1f3e130c4d625d349f314f341cbfd4 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Wed, 26 Jun 2024 14:51:08 -0700 Subject: [PATCH 523/755] switch order of keybinding registration (#218622) --- .../interactive/browser/interactive.contribution.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index 5705f2e7f3ba2..2109f7ef7052d 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -458,6 +458,11 @@ registerAction2(class extends Action2 { title: localize2('interactive.execute', 'Execute Code'), category: interactiveWindowCategory, keybinding: [{ + // when: NOTEBOOK_CELL_LIST_FOCUSED, + when: ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'), + primary: KeyMod.CtrlCmd | KeyCode.Enter, + weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT + }, { when: ContextKeyExpr.and( ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'), ContextKeyExpr.equals('config.interactiveWindow.executeWithShiftEnter', true) @@ -471,11 +476,6 @@ registerAction2(class extends Action2 { ), primary: KeyCode.Enter, weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT - }, { - // when: NOTEBOOK_CELL_LIST_FOCUSED, - when: ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'), - primary: KeyMod.CtrlCmd | KeyCode.Enter, - weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT }], menu: [ { From 5950c290984ea5b2c47ac6ec666eb1c62d72a155 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 26 Jun 2024 19:18:00 -0700 Subject: [PATCH 524/755] Fix 'cancel chat' keybinding on windows (#218647) Fix #217861 --- .../workbench/contrib/chat/browser/actions/chatExecuteActions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts index 5a6574db112f7..b7d76a5a22719 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts @@ -161,6 +161,7 @@ export class CancelAction extends Action2 { keybinding: { weight: KeybindingWeight.WorkbenchContrib, primary: KeyMod.CtrlCmd | KeyCode.Escape, + win: { primary: KeyMod.Alt | KeyCode.Backspace }, } }); } From cb9d1e4589a05bed292f298acba7369e812f8cf1 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 26 Jun 2024 19:18:24 -0700 Subject: [PATCH 525/755] Don't throw for $updateAgent failure (#218649) Fix #214157 This can happen after something else went wrong, and the exception doesn't go back to the extension or anywhere helpful besides error telemetry. --- src/vs/workbench/api/browser/mainThreadChatAgents2.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/mainThreadChatAgents2.ts b/src/vs/workbench/api/browser/mainThreadChatAgents2.ts index 0d63847dae5ce..35126b7998d27 100644 --- a/src/vs/workbench/api/browser/mainThreadChatAgents2.ts +++ b/src/vs/workbench/api/browser/mainThreadChatAgents2.ts @@ -199,7 +199,8 @@ export class MainThreadChatAgents2 extends Disposable implements MainThreadChatA $updateAgent(handle: number, metadataUpdate: IExtensionChatAgentMetadata): void { const data = this._agents.get(handle); if (!data) { - throw new Error(`No agent with handle ${handle} registered`); + this._logService.error(`MainThreadChatAgents2#$updateAgent: No agent with handle ${handle} registered`); + return; } data.hasFollowups = metadataUpdate.hasFollowups; this._chatAgentService.updateAgent(data.id, revive(metadataUpdate)); From 5ba8a8b7a1b2413eecc5a38a56f4309d31833b9c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2024 11:21:43 +0200 Subject: [PATCH 526/755] fix #218126 (#218679) --- .../services/userDataProfile/common/userDataProfileIcons.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfileIcons.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfileIcons.ts index 93251b9b1c34f..6e0e28a0347b2 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfileIcons.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfileIcons.ts @@ -71,7 +71,7 @@ export const ICONS = [ Codicon.pulse, Codicon.radioTower, Codicon.smiley, - Codicon.symbolEvent, + Codicon.zap, Codicon.squirrel, Codicon.symbolColor, Codicon.mail, From 53ed07606e51c2047564d8cefebc36a177fa3e6f Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 27 Jun 2024 11:29:37 +0200 Subject: [PATCH 527/755] Fix comment threads starting expanded (#218684) --- src/vs/workbench/api/browser/mainThreadComments.ts | 8 +++++++- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostComments.ts | 4 +--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 2e342290e96a6..6bbeb159248bb 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -185,6 +185,7 @@ export class MainThreadCommentThread implements languages.CommentThread { public threadId: string, public resource: string, private _range: T | undefined, + comments: languages.Comment[] | undefined, private _canReply: boolean, private _isTemplate: boolean, public editorId?: string @@ -192,6 +193,8 @@ export class MainThreadCommentThread implements languages.CommentThread { this._isDisposed = false; if (_isTemplate) { this.comments = []; + } else if (comments) { + this._comments = comments; } } @@ -298,6 +301,7 @@ export class MainThreadCommentController implements ICommentController { threadId: string, resource: UriComponents, range: IRange | ICellRange | undefined, + comments: languages.Comment[], isTemplate: boolean, editorId?: string ): languages.CommentThread { @@ -308,6 +312,7 @@ export class MainThreadCommentController implements ICommentController { threadId, URI.revive(resource).toString(), range, + comments, true, isTemplate, editorId @@ -590,6 +595,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments threadId: string, resource: UriComponents, range: IRange | ICellRange | undefined, + comments: languages.Comment[], extensionId: ExtensionIdentifier, isTemplate: boolean, editorId?: string @@ -600,7 +606,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments return undefined; } - return provider.createCommentThread(extensionId.value, commentThreadHandle, threadId, resource, range, isTemplate, editorId); + return provider.createCommentThread(extensionId.value, commentThreadHandle, threadId, resource, range, comments, isTemplate, editorId); } $updateCommentThread(handle: number, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 5785393c0e18f..d810c7b892d41 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -144,7 +144,7 @@ export interface MainThreadCommentsShape extends IDisposable { $registerCommentController(handle: number, id: string, label: string, extensionId: string): void; $unregisterCommentController(handle: number): void; $updateCommentControllerFeatures(handle: number, features: CommentProviderFeatures): void; - $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange | ICellRange | undefined, extensionId: ExtensionIdentifier, isTemplate: boolean, editorId?: string): languages.CommentThread | undefined; + $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange | ICellRange | undefined, comments: languages.Comment[], extensionId: ExtensionIdentifier, isTemplate: boolean, editorId?: string): languages.CommentThread | undefined; $updateCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, changes: CommentThreadChanges): void; $deleteCommentThread(handle: number, commentThreadHandle: number): void; $updateCommentingRanges(handle: number, resourceHints?: languages.CommentingRangeResourceHint): void; diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index 53b5176c25bbb..c84fb4782f9eb 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -424,6 +424,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo this._id, this._uri, extHostTypeConverter.Range.from(this._range), + this._comments.map(cmt => convertToDTOComment(this, cmt, this._commentsMap, this.extensionDescription)), extensionDescription.identifier, this._isTemplate, editorId @@ -436,9 +437,6 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo this.eventuallyUpdateCommentThread(); })); - // set up comments after ctor to batch update events. - this.comments = _comments; - this._localDisposables.push({ dispose: () => { proxy.$deleteCommentThread( From 56a2eb0dbbd056498013283317dc50d001c38c5c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2024 12:27:05 +0200 Subject: [PATCH 528/755] fix #217851 (#218698) --- .../userDataProfile/browser/userDataProfilesEditorModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 4b3d9947286a2..7cbee83dc20f8 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -744,7 +744,7 @@ export class UserDataProfilesEditorModel extends EditorModel { const newWindowAction = disposables.add(new Action( 'userDataProfile.newWindow', - localize('open new window', "New Window"), + localize('open new window', "Open New Window with this Profile"), ThemeIcon.asClassName(Codicon.emptyWindow), true, () => this.openWindow(profile) From 9e9eb5e3f66cd52d62b180f6fc46aa3135739c70 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 27 Jun 2024 12:29:50 +0200 Subject: [PATCH 529/755] Don't check `locked` stat in file picker (#218707) Fixes #212408 --- src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts index 5f3b9cbda7de3..95be556e81aa0 100644 --- a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts @@ -832,7 +832,7 @@ export class SimpleFileDialog implements ISimpleFileDialog { } else if (!statDirname.isDirectory) { this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateNonexistentDir', 'Please enter a path that exists.'); return Promise.resolve(false); - } else if (statDirname.readonly || statDirname.locked) { + } else if (statDirname.readonly) { this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateReadonlyFolder', 'This folder cannot be used as a save destination. Please choose another folder'); return Promise.resolve(false); } From 2e3a1d8bd9270480fc548d9351c7efebfd52bfed Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2024 12:46:29 +0200 Subject: [PATCH 530/755] fix #217902 (#218716) --- .../browser/userDataProfilesEditorModel.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index 7cbee83dc20f8..a2e56bc5c7be7 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -716,14 +716,14 @@ export class UserDataProfilesEditorModel extends EditorModel { localize('active', "Use for Current Window"), ThemeIcon.asClassName(Codicon.check), true, - () => this.userDataProfileManagementService.switchProfile(profile) + () => this.userDataProfileManagementService.switchProfile(profileElement.profile) )); const copyFromProfileAction = disposables.add(new Action( 'userDataProfile.copyFromProfile', localize('copyFromProfile', "Duplicate..."), ThemeIcon.asClassName(Codicon.copy), - true, () => this.createNewProfile(profile) + true, () => this.createNewProfile(profileElement.profile) )); const exportAction = disposables.add(new Action( @@ -731,7 +731,7 @@ export class UserDataProfilesEditorModel extends EditorModel { localize('export', "Export..."), ThemeIcon.asClassName(Codicon.export), true, - () => this.exportProfile(profile) + () => this.exportProfile(profileElement.profile) )); const deleteAction = disposables.add(new Action( @@ -739,7 +739,7 @@ export class UserDataProfilesEditorModel extends EditorModel { localize('delete', "Delete"), ThemeIcon.asClassName(Codicon.trash), true, - () => this.removeProfile(profile) + () => this.removeProfile(profileElement.profile) )); const newWindowAction = disposables.add(new Action( @@ -747,12 +747,12 @@ export class UserDataProfilesEditorModel extends EditorModel { localize('open new window', "Open New Window with this Profile"), ThemeIcon.asClassName(Codicon.emptyWindow), true, - () => this.openWindow(profile) + () => this.openWindow(profileElement.profile) )); const useAsNewWindowProfileAction = disposables.add(new Action( 'userDataProfile.useAsNewWindowProfile', - localize('use as new window', "Use for New Windows", profile.name), + localize('use as new window', "Use for New Windows"), undefined, true, () => profileElement.toggleNewWindowProfile() @@ -788,9 +788,9 @@ export class UserDataProfilesEditorModel extends EditorModel { [primaryActions, secondaryActions] )); - activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id; + activateAction.checked = this.userDataProfileService.currentProfile.id === profileElement.profile.id; disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(() => - activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id)); + activateAction.checked = this.userDataProfileService.currentProfile.id === profileElement.profile.id)); useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile; disposables.add(profileElement.onDidChange(e => { From 1ae48f15b767a33382ae54959018036ec3d19f8e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 27 Jun 2024 14:45:52 +0200 Subject: [PATCH 531/755] fix https://github.com/microsoft/vscode/issues/218804 (#218822) --- .../inlineChat/browser/inlineChatController.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 8fdf2669f596a..0befb284dbfd2 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -50,6 +50,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { isEqual } from 'vs/base/common/resources'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; export const enum State { CREATE_SESSION = 'CREATE_SESSION', @@ -433,7 +434,7 @@ export class InlineChatController implements IEditorContribution { })); // #region DEBT - // DEBT@jrieken + // DEBT@jrieken https://github.com/microsoft/vscode/issues/218819 // REMOVE when agents are adopted this._sessionStore.add(this._languageFeatureService.completionProvider.register({ scheme: ChatInputPart.INPUT_SCHEME, hasAccessToAllModels: true }, { _debugDisplayName: 'inline chat commands', @@ -456,7 +457,7 @@ export class InlineChatController implements IEditorContribution { result.suggestions.push({ label: { label: withSlash, description: command.description ?? '' }, kind: CompletionItemKind.Text, - insertText: withSlash, + insertText: `${withSlash} `, range: Range.fromPositions(new Position(1, 1), position), }); } @@ -471,16 +472,12 @@ export class InlineChatController implements IEditorContribution { for (const command of (this._session?.agent.slashCommands ?? []).sort((a, b) => b.name.length - a.name.length)) { const withSlash = `/${command.name}`; const firstLine = model.getLineContent(1); - if (firstLine.startsWith(withSlash)) { + if (firstLine.match(new RegExp(`^${escapeRegExpCharacters(withSlash)}(\\s|$)`))) { newDecorations.push({ range: new Range(1, 1, 1, withSlash.length + 1), options: { description: 'inline-chat-slash-command', inlineClassName: 'inline-chat-slash-command', - after: { - // Force some space between slash command and placeholder - content: ' ' - } } }); From 9a2ef8f356fd5077497e87fa8ff4f5632b2669cf Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 27 Jun 2024 15:22:00 +0200 Subject: [PATCH 532/755] Update distro hash --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49c83a768b773..ae706deebbcf1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.91.0", - "distro": "9cef7f933867933892cb3b591231ed071fe861a8", + "distro": "a08799837ca498c02f445ca7a896f446419af238", "author": { "name": "Microsoft Corporation" }, From 973dc3065b154f31e6ca21b5fe80f0b23cf858a6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 27 Jun 2024 16:48:33 +0200 Subject: [PATCH 533/755] fix #218219 (#218876) --- .../contrib/extensions/browser/extensions.contribution.ts | 6 +++--- .../contrib/extensions/browser/extensionsActions.ts | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 55dfb610a3205..33f961fc45593 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -1493,7 +1493,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi menu: { id: MenuId.ExtensionContext, group: '0_install', - when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), CONTEXT_SYNC_ENABLEMENT), + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.not('extensionDisallowInstall'), CONTEXT_SYNC_ENABLEMENT), order: 1 }, run: async (accessor: ServicesAccessor, extensionId: string) => { @@ -1516,7 +1516,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi menu: { id: MenuId.ExtensionContext, group: '0_install', - when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.has('extensionHasPreReleaseVersion'), CONTEXT_SYNC_ENABLEMENT), + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.has('extensionHasPreReleaseVersion'), ContextKeyExpr.not('extensionDisallowInstall'), CONTEXT_SYNC_ENABLEMENT), order: 2 }, run: async (accessor: ServicesAccessor, extensionId: string) => { @@ -1540,7 +1540,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi menu: { id: MenuId.ExtensionContext, group: '0_install', - when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension')), + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.not('extensionDisallowInstall')), order: 3 }, run: async (accessor: ServicesAccessor, extensionId: string) => { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 0b5323a75a06d..fccbb361feb2c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -1170,6 +1170,7 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['galleryExtensionHasPreReleaseVersion', extension.gallery?.hasPreReleaseVersion]); cksOverlay.push(['extensionHasPreReleaseVersion', extension.hasPreReleaseVersion]); cksOverlay.push(['extensionHasReleaseVersion', extension.hasReleaseVersion]); + cksOverlay.push(['extensionDisallowInstall', !!extension.deprecationInfo?.disallowInstall]); const [colorThemes, fileIconThemes, productIconThemes] = await Promise.all([workbenchThemeService.getColorThemes(), workbenchThemeService.getFileIconThemes(), workbenchThemeService.getProductIconThemes()]); cksOverlay.push(['extensionHasColorThemes', colorThemes.some(theme => isThemeFromExtension(theme, extension))]); From 52be6e6cb7e33efe7f46eac134435d7e64040994 Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 27 Jun 2024 17:06:23 +0200 Subject: [PATCH 534/755] let inline chat use default command and agent completions --- .../chatMarkdownDecorationsRenderer.ts | 4 +- .../browser/contrib/chatInputCompletions.ts | 23 +++-- .../browser/contrib/chatInputEditorContrib.ts | 4 +- .../contrib/chat/common/chatParserTypes.ts | 4 + .../contrib/chat/common/chatRequestParser.ts | 12 ++- .../browser/inlineChatController.ts | 91 +------------------ 6 files changed, 40 insertions(+), 98 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts index 9af542462c305..bb016c0f1fab3 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts @@ -87,7 +87,9 @@ export class ChatMarkdownDecorationsRenderer { if (part instanceof ChatRequestTextPart) { result += part.text; } else if (part instanceof ChatRequestAgentPart) { - result += this.instantiationService.invokeFunction(accessor => agentToMarkdown(part.agent, false, accessor)); + if (!part.agent.isDefault) { + result += this.instantiationService.invokeFunction(accessor => agentToMarkdown(part.agent, false, accessor)); + } } else { const uri = part instanceof ChatRequestDynamicVariablePart && part.data instanceof URI ? part.data : diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts index 9509e38f8d1e9..4b10231de2415 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts @@ -40,7 +40,7 @@ class SlashCommandCompletions extends Disposable { triggerCharacters: ['/'], provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, _token: CancellationToken) => { const widget = this.chatWidgetService.getWidgetByInputUri(model.uri); - if (!widget || !widget.viewModel || (widget.location !== ChatAgentLocation.Panel && widget.location !== ChatAgentLocation.Notebook) /* TODO@jrieken - enable when agents are adopted*/) { + if (!widget || !widget.viewModel) { return null; } @@ -96,7 +96,7 @@ class AgentCompletions extends Disposable { triggerCharacters: ['@'], provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, _token: CancellationToken) => { const widget = this.chatWidgetService.getWidgetByInputUri(model.uri); - if (!widget || !widget.viewModel || (widget.location !== ChatAgentLocation.Panel && widget.location !== ChatAgentLocation.Notebook) /* TODO@jrieken - enable when agents are adopted*/) { + if (!widget || !widget.viewModel) { return null; } @@ -140,7 +140,7 @@ class AgentCompletions extends Disposable { triggerCharacters: ['/'], provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken) => { const widget = this.chatWidgetService.getWidgetByInputUri(model.uri); - if (!widget || !widget.viewModel || widget.location !== ChatAgentLocation.Panel /* TODO@jrieken - enable when agents are adopted*/) { + if (!widget || !widget.viewModel) { return; } @@ -192,7 +192,7 @@ class AgentCompletions extends Disposable { provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken) => { const widget = this.chatWidgetService.getWidgetByInputUri(model.uri); const viewModel = widget?.viewModel; - if (!widget || !viewModel || widget.location !== ChatAgentLocation.Panel /* TODO@jrieken - enable when agents are adopted*/) { + if (!widget || !viewModel) { return; } @@ -239,7 +239,7 @@ class AgentCompletions extends Disposable { agents.flatMap(agent => agent.slashCommands.map((c, i) => { const { label: agentLabel, isDupe } = this.getAgentCompletionDetails(agent); const withSlash = `${chatSubcommandLeader}${c.name}`; - return { + const item: CompletionItem = { label: { label: withSlash, description: agentLabel, detail: isDupe ? ` (${agent.publisherDisplayName})` : undefined }, filterText: getFilterText(agent, c.name), commitCharacters: [' '], @@ -249,7 +249,16 @@ class AgentCompletions extends Disposable { kind: CompletionItemKind.Text, // The icons are disabled here anyway sortText: `${chatSubcommandLeader}${agent.name}${c.name}`, command: { id: AssignSelectedAgentAction.ID, title: AssignSelectedAgentAction.ID, arguments: [{ agent, widget } satisfies AssignSelectedAgentActionArgs] }, - } satisfies CompletionItem; + }; + + if (agent.isDefault) { + // default agent isn't mentioned or inserted + item.label = { label: withSlash, description: c.description }; + item.insertText = `${withSlash} `; + item.detail = c.description; + } + + return item; }))) }; } @@ -305,7 +314,7 @@ class BuiltinDynamicCompletions extends Disposable { triggerCharacters: [chatVariableLeader], provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, _token: CancellationToken) => { const widget = this.chatWidgetService.getWidgetByInputUri(model.uri); - if (!widget || !widget.supportsFileReferences || widget.location !== ChatAgentLocation.Panel /* TODO@jrieken - enable when agents are adopted*/) { + if (!widget || !widget.supportsFileReferences) { return null; } diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts index e58d0fd829436..0234253d3b800 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts @@ -14,7 +14,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IChatWidget } from 'vs/workbench/contrib/chat/browser/chat'; import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { dynamicVariableDecorationType } from 'vs/workbench/contrib/chat/browser/contrib/chatDynamicVariables'; -import { ChatAgentLocation, IChatAgentCommand, IChatAgentData, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { IChatAgentCommand, IChatAgentData, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; import { chatSlashCommandBackground, chatSlashCommandForeground } from 'vs/workbench/contrib/chat/common/chatColors'; import { ChatRequestAgentPart, ChatRequestAgentSubcommandPart, ChatRequestSlashCommandPart, ChatRequestTextPart, ChatRequestVariablePart, IParsedChatRequestPart, chatAgentLeader, chatSubcommandLeader } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { ChatRequestParser } from 'vs/workbench/contrib/chat/common/chatRequestParser'; @@ -275,7 +275,7 @@ class ChatTokenDeleter extends Disposable { // If this was a simple delete, try to find out whether it was inside a token if (!change.text && this.widget.viewModel) { - const previousParsedValue = parser.parseChatRequest(this.widget.viewModel.sessionId, previousInputValue, ChatAgentLocation.Panel, { selectedAgent: previousSelectedAgent }); + const previousParsedValue = parser.parseChatRequest(this.widget.viewModel.sessionId, previousInputValue, widget.location, { selectedAgent: previousSelectedAgent }); // For dynamic variables, this has to happen in ChatDynamicVariableModel with the other bookkeeping const deletableTokens = previousParsedValue.parts.filter(p => p instanceof ChatRequestAgentPart || p instanceof ChatRequestAgentSubcommandPart || p instanceof ChatRequestSlashCommandPart || p instanceof ChatRequestVariablePart); diff --git a/src/vs/workbench/contrib/chat/common/chatParserTypes.ts b/src/vs/workbench/contrib/chat/common/chatParserTypes.ts index 66bc10c2061db..f155cd631945f 100644 --- a/src/vs/workbench/contrib/chat/common/chatParserTypes.ts +++ b/src/vs/workbench/contrib/chat/common/chatParserTypes.ts @@ -81,6 +81,10 @@ export class ChatRequestAgentPart implements IParsedChatRequestPart { get promptText(): string { return ''; } + + get isSynthetic(): boolean { + return this.range.length === 0; + } } /** diff --git a/src/vs/workbench/contrib/chat/common/chatRequestParser.ts b/src/vs/workbench/contrib/chat/common/chatRequestParser.ts index 73276b9464dc1..21795795d3493 100644 --- a/src/vs/workbench/contrib/chat/common/chatRequestParser.ts +++ b/src/vs/workbench/contrib/chat/common/chatRequestParser.ts @@ -31,6 +31,11 @@ export class ChatRequestParser { const parts: IParsedChatRequestPart[] = []; const references = this.variableService.getDynamicVariables(sessionId); // must access this list before any async calls + const defaultAgent = this.agentService.getDefaultAgent(location); + if (defaultAgent) { + parts.push(new ChatRequestAgentPart(OffsetRange.ofLength(0), new Range(1, 1, 1, 1), defaultAgent)); + } + let lineNumber = 1; let column = 1; for (let i = 0; i < message.length; i++) { @@ -90,12 +95,17 @@ export class ChatRequestParser { }; } - private tryToParseAgent(message: string, fullMessage: string, offset: number, position: IPosition, parts: ReadonlyArray, location: ChatAgentLocation, context: IChatParserContext | undefined): ChatRequestAgentPart | ChatRequestVariablePart | undefined { + private tryToParseAgent(message: string, fullMessage: string, offset: number, position: IPosition, parts: Array, location: ChatAgentLocation, context: IChatParserContext | undefined): ChatRequestAgentPart | ChatRequestVariablePart | undefined { const nextAgentMatch = message.match(agentReg); if (!nextAgentMatch) { return; } + const syntheticDefaultAgent = parts.findIndex(candidate => candidate instanceof ChatRequestAgentPart && candidate.isSynthetic); + if (syntheticDefaultAgent >= 0) { + parts.splice(syntheticDefaultAgent, 1); + } + const [full, name] = nextAgentMatch; const agentRange = new OffsetRange(offset, offset + full.length); const agentEditorRange = new Range(position.lineNumber, position.column, position.lineNumber, position.column + full.length); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 0befb284dbfd2..f0eee6e63a8ed 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -18,8 +18,8 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; -import { IEditorContribution, IEditorDecorationsCollection } from 'vs/editor/common/editorCommon'; -import { CompletionItemKind, CompletionList, TextEdit } from 'vs/editor/common/languages'; +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { TextEdit } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController'; import { localize } from 'vs/nls'; @@ -28,7 +28,7 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { IChatWidgetService, showChatView } from 'vs/workbench/contrib/chat/browser/chat'; +import { showChatView } from 'vs/workbench/contrib/chat/browser/chat'; import { IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { IInlineChatSavingService } from './inlineChatSavingService'; import { EmptyResponse, ErrorResponse, ReplyResponse, Session, SessionPrompt } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; @@ -37,20 +37,17 @@ import { EditModeStrategy, IEditObserver, LiveStrategy, PreviewStrategy, Progres import { InlineChatZoneWidget } from './inlineChatZoneWidget'; import { CTX_INLINE_CHAT_REQUEST_IN_PROGRESS, CTX_INLINE_CHAT_RESPONSE_TYPE, CTX_INLINE_CHAT_USER_DID_EDIT, CTX_INLINE_CHAT_VISIBLE, EditMode, INLINE_CHAT_ID, InlineChatConfigKeys, InlineChatResponseType } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { StashedSession } from './inlineChatSession'; -import { IModelDeltaDecoration, ITextModel, IValidEditOperation } from 'vs/editor/common/model'; +import { IValidEditOperation } from 'vs/editor/common/model'; import { InlineChatContentWidget } from 'vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget'; import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import { ChatModel, ChatRequestRemovalReason, IChatRequestModel, IChatTextEditGroup, IChatTextEditGroupState, IResponse } from 'vs/workbench/contrib/chat/common/chatModel'; import { InlineChatError } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl'; -import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; -import { ChatInputPart } from 'vs/workbench/contrib/chat/browser/chatInputPart'; import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; import { DefaultModelSHA1Computer } from 'vs/editor/common/services/modelService'; import { generateUuid } from 'vs/base/common/uuid'; import { isEqual } from 'vs/base/common/resources'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; -import { escapeRegExpCharacters } from 'vs/base/common/strings'; export const enum State { CREATE_SESSION = 'CREATE_SESSION', @@ -144,8 +141,6 @@ export class InlineChatController implements IEditorContribution { @IDialogService private readonly _dialogService: IDialogService, @IContextKeyService contextKeyService: IContextKeyService, @IChatService private readonly _chatService: IChatService, - @ILanguageFeaturesService private readonly _languageFeatureService: ILanguageFeaturesService, - @IChatWidgetService private readonly _chatWidgetService: IChatWidgetService, @INotebookEditorService notebookEditorService: INotebookEditorService, ) { this._ctxVisible = CTX_INLINE_CHAT_VISIBLE.bindTo(contextKeyService); @@ -433,84 +428,6 @@ export class InlineChatController implements IEditorContribution { } })); - // #region DEBT - // DEBT@jrieken https://github.com/microsoft/vscode/issues/218819 - // REMOVE when agents are adopted - this._sessionStore.add(this._languageFeatureService.completionProvider.register({ scheme: ChatInputPart.INPUT_SCHEME, hasAccessToAllModels: true }, { - _debugDisplayName: 'inline chat commands', - triggerCharacters: ['/'], - provideCompletionItems: (model, position, context, token) => { - if (position.lineNumber !== 1) { - return undefined; - } - if (!this._session || !this._session.agent.slashCommands) { - return undefined; - } - const widget = this._chatWidgetService.getWidgetByInputUri(model.uri); - if (widget !== this._ui.value.zone.widget.chatWidget && widget !== this._ui.value.content.chatWidget) { - return undefined; - } - - const result: CompletionList = { suggestions: [], incomplete: false }; - for (const command of this._session.agent.slashCommands) { - const withSlash = `/${command.name}`; - result.suggestions.push({ - label: { label: withSlash, description: command.description ?? '' }, - kind: CompletionItemKind.Text, - insertText: `${withSlash} `, - range: Range.fromPositions(new Position(1, 1), position), - }); - } - - return result; - } - })); - - const updateSlashDecorations = (collection: IEditorDecorationsCollection, model: ITextModel) => { - - const newDecorations: IModelDeltaDecoration[] = []; - for (const command of (this._session?.agent.slashCommands ?? []).sort((a, b) => b.name.length - a.name.length)) { - const withSlash = `/${command.name}`; - const firstLine = model.getLineContent(1); - if (firstLine.match(new RegExp(`^${escapeRegExpCharacters(withSlash)}(\\s|$)`))) { - newDecorations.push({ - range: new Range(1, 1, 1, withSlash.length + 1), - options: { - description: 'inline-chat-slash-command', - inlineClassName: 'inline-chat-slash-command', - } - }); - - // inject detail when otherwise empty - if (firstLine.trim() === `/${command.name}`) { - newDecorations.push({ - range: new Range(1, withSlash.length, 1, withSlash.length), - options: { - description: 'inline-chat-slash-command-detail', - after: { - content: `${command.description}`, - inlineClassName: 'inline-chat-slash-command-detail' - } - } - }); - } - break; - } - } - collection.set(newDecorations); - }; - const inputInputEditor = this._ui.value.content.chatWidget.inputEditor; - const zoneInputEditor = this._ui.value.zone.widget.chatWidget.inputEditor; - const inputDecorations = inputInputEditor.createDecorationsCollection(); - const zoneDecorations = zoneInputEditor.createDecorationsCollection(); - this._sessionStore.add(inputInputEditor.onDidChangeModelContent(() => updateSlashDecorations(inputDecorations, inputInputEditor.getModel()!))); - this._sessionStore.add(zoneInputEditor.onDidChangeModelContent(() => updateSlashDecorations(zoneDecorations, zoneInputEditor.getModel()!))); - this._sessionStore.add(toDisposable(() => { - inputDecorations.clear(); - zoneDecorations.clear(); - })); - - //#endregion ------- DEBT if (!this._session.chatModel.hasRequests) { return State.WAIT_FOR_INPUT; From 4b28f5d48cc29faa1576e3da304854faeed35ad7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:00:50 -0700 Subject: [PATCH 535/755] Use webgl in terminal sticky scroll Fixes #216817 Fixes #218427 --- .../browser/terminalStickyScrollOverlay.ts | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts index 194ee23694e42..639ec2c883330 100644 --- a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts +++ b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import type { SerializeAddon as SerializeAddonType } from '@xterm/addon-serialize'; +import type { WebglAddon as WebglAddonType } from '@xterm/addon-webgl'; import type { IBufferLine, IMarker, ITerminalOptions, ITheme, Terminal as RawXtermTerminal, Terminal as XTermTerminal } from '@xterm/xterm'; import { importAMDNodeModule } from 'vs/amdX'; import { $, addDisposableListener, addStandardDisposableListener, getWindow } from 'vs/base/browser/dom'; @@ -21,7 +22,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandDetectionCapability, ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities'; import { ICurrentPartialCommand } from 'vs/platform/terminal/common/capabilities/commandDetection/terminalCommand'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { ITerminalInstance, IXtermColorProvider, IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalConfigurationService, ITerminalInstance, IXtermColorProvider, IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal'; import { openContextMenu } from 'vs/workbench/contrib/terminal/browser/terminalContextMenu'; import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { TERMINAL_CONFIG_SECTION, TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; @@ -46,6 +47,7 @@ const enum Constants { export class TerminalStickyScrollOverlay extends Disposable { private _stickyScrollOverlay?: RawXtermTerminal; private _serializeAddon?: SerializeAddonType; + private _webglAddon?: WebglAddonType; private _element?: HTMLElement; private _currentStickyCommand?: ITerminalCommand | ICurrentPartialCommand; @@ -69,6 +71,7 @@ export class TerminalStickyScrollOverlay extends Disposable { @IContextMenuService private readonly _contextMenuService: IContextMenuService, @IKeybindingService private readonly _keybindingService: IKeybindingService, @IMenuService menuService: IMenuService, + @ITerminalConfigurationService private readonly _terminalConfigurationService: ITerminalConfigurationService, @IThemeService private readonly _themeService: IThemeService, ) { super(); @@ -101,6 +104,7 @@ export class TerminalStickyScrollOverlay extends Disposable { allowProposedApi: true, ...this._getOptions() })); + this._refreshGpuAcceleration(); this._register(configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(TERMINAL_CONFIG_SECTION)) { this._syncOptions(); @@ -413,6 +417,7 @@ export class TerminalStickyScrollOverlay extends Disposable { } this._stickyScrollOverlay.resize(this._xterm.raw.cols, this._stickyScrollOverlay.rows); this._stickyScrollOverlay.options = this._getOptions(); + this._refreshGpuAcceleration(); } private _getOptions(): ITerminalOptions { @@ -435,9 +440,29 @@ export class TerminalStickyScrollOverlay extends Disposable { minimumContrastRatio: o.minimumContrastRatio, tabStopWidth: o.tabStopWidth, overviewRulerWidth: o.overviewRulerWidth, + customGlyphs: o.customGlyphs, }; } + @throttle(0) + private async _refreshGpuAcceleration() { + if (this._shouldLoadWebgl() && !this._webglAddon) { + const WebglAddon = await this._getWebglAddonConstructor(); + if (this._store.isDisposed) { + return; + } + this._webglAddon = this._register(new WebglAddon()); + this._stickyScrollOverlay?.loadAddon(this._webglAddon); + } else if (!this._shouldLoadWebgl() && this._webglAddon) { + this._webglAddon.dispose(); + this._webglAddon = undefined; + } + } + + private _shouldLoadWebgl(): boolean { + return this._terminalConfigurationService.config.gpuAcceleration === 'auto' || this._terminalConfigurationService.config.gpuAcceleration === 'on'; + } + private _getTheme(isHovering: boolean): ITheme { const theme = this._themeService.getColorTheme(); return { @@ -452,8 +477,12 @@ export class TerminalStickyScrollOverlay extends Disposable { @memoize private async _getSerializeAddonConstructor(): Promise { - const m = await importAMDNodeModule('@xterm/addon-serialize', 'lib/addon-serialize.js'); - return m.SerializeAddon; + return (await importAMDNodeModule('@xterm/addon-serialize', 'lib/addon-serialize.js')).SerializeAddon; + } + + @memoize + private async _getWebglAddonConstructor(): Promise { + return (await importAMDNodeModule('@xterm/addon-webgl', 'lib/addon-webgl.js')).WebglAddon; } } From 8d54ffc9f6e7c2ba7de3e564290659a9a5381f5a Mon Sep 17 00:00:00 2001 From: Snoppy Date: Fri, 28 Jun 2024 04:01:19 +0800 Subject: [PATCH 536/755] chore: fix typos (#216562) Signed-off-by: snoppy --- cli/src/async_pipe.rs | 2 +- cli/src/auth.rs | 2 +- cli/src/commands/args.rs | 4 ++-- cli/src/constants.rs | 2 +- src/vs/workbench/contrib/debug/common/debug.ts | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cli/src/async_pipe.rs b/cli/src/async_pipe.rs index e9b710c1d6815..78aed6fe3e769 100644 --- a/cli/src/async_pipe.rs +++ b/cli/src/async_pipe.rs @@ -227,7 +227,7 @@ impl hyper::server::accept::Accept for PollableAsyncListener { } } -/// Gets a random name for a pipe/socket on the paltform +/// Gets a random name for a pipe/socket on the platform pub fn get_socket_name() -> PathBuf { cfg_if::cfg_if! { if #[cfg(unix)] { diff --git a/cli/src/auth.rs b/cli/src/auth.rs index 67f1bfa6bc7ae..2d9162c548321 100644 --- a/cli/src/auth.rs +++ b/cli/src/auth.rs @@ -287,7 +287,7 @@ impl StorageImplementation for ThreadKeyringStorage { #[derive(Default)] struct KeyringStorage { - // keywring storage can be split into multiple entries due to entry length limits + // keyring storage can be split into multiple entries due to entry length limits // on Windows https://github.com/microsoft/vscode-cli/issues/358 entries: Vec, } diff --git a/cli/src/commands/args.rs b/cli/src/commands/args.rs index 79c4d3767a157..05e22e0cfb372 100644 --- a/cli/src/commands/args.rs +++ b/cli/src/commands/args.rs @@ -64,7 +64,7 @@ pub struct IntegratedCli { pub core: CliCore, } -/// Common CLI shared between intergated and standalone interfaces. +/// Common CLI shared between integrated and standalone interfaces. #[derive(Args, Debug, Default, Clone)] pub struct CliCore { /// One or more files, folders, or URIs to open. @@ -619,7 +619,7 @@ pub enum OutputFormat { #[derive(Args, Clone, Debug, Default)] pub struct ExistingTunnelArgs { /// Name you'd like to assign preexisting tunnel to use to connect the tunnel - /// Old option, new code sohuld just use `--name`. + /// Old option, new code should just use `--name`. #[clap(long, hide = true)] pub tunnel_name: Option, diff --git a/cli/src/constants.rs b/cli/src/constants.rs index 6f604e8876ee6..1e277a89d6af2 100644 --- a/cli/src/constants.rs +++ b/cli/src/constants.rs @@ -13,7 +13,7 @@ use crate::options::Quality; pub const CONTROL_PORT: u16 = 31545; -/// Protocol version sent to clients. This can be used to indiciate new or +/// Protocol version sent to clients. This can be used to indicate new or /// changed capabilities that clients may wish to leverage. /// 1 - Initial protocol version /// 2 - Addition of `serve.compressed` property to control whether servermsg's diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index c9ec64206bd05..41f1a55b5570c 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -51,9 +51,9 @@ export const CONTEXT_IN_DEBUG_REPL = new RawContextKey('inDebugRepl', f export const CONTEXT_BREAKPOINT_WIDGET_VISIBLE = new RawContextKey('breakpointWidgetVisible', false, { type: 'boolean', description: nls.localize('breakpointWidgetVisibile', "True when breakpoint editor zone widget is visible, false otherwise.") }); export const CONTEXT_IN_BREAKPOINT_WIDGET = new RawContextKey('inBreakpointWidget', false, { type: 'boolean', description: nls.localize('inBreakpointWidget', "True when focus is in the breakpoint editor zone widget, false otherwise.") }); export const CONTEXT_BREAKPOINTS_FOCUSED = new RawContextKey('breakpointsFocused', true, { type: 'boolean', description: nls.localize('breakpointsFocused', "True when the BREAKPOINTS view is focused, false otherwise.") }); -export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey('watchExpressionsFocused', true, { type: 'boolean', description: nls.localize('watchExpressionsFocused', "True when the WATCH view is focused, false otherwsie.") }); +export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey('watchExpressionsFocused', true, { type: 'boolean', description: nls.localize('watchExpressionsFocused', "True when the WATCH view is focused, false otherwise.") }); export const CONTEXT_WATCH_EXPRESSIONS_EXIST = new RawContextKey('watchExpressionsExist', false, { type: 'boolean', description: nls.localize('watchExpressionsExist', "True when at least one watch expression exists, false otherwise.") }); -export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey('variablesFocused', true, { type: 'boolean', description: nls.localize('variablesFocused', "True when the VARIABLES views is focused, false otherwsie") }); +export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey('variablesFocused', true, { type: 'boolean', description: nls.localize('variablesFocused', "True when the VARIABLES views is focused, false otherwise") }); export const CONTEXT_EXPRESSION_SELECTED = new RawContextKey('expressionSelected', false, { type: 'boolean', description: nls.localize('expressionSelected', "True when an expression input box is open in either the WATCH or the VARIABLES view, false otherwise.") }); export const CONTEXT_BREAKPOINT_INPUT_FOCUSED = new RawContextKey('breakpointInputFocused', false, { type: 'boolean', description: nls.localize('breakpointInputFocused', "True when the input box has focus in the BREAKPOINTS view.") }); export const CONTEXT_CALLSTACK_ITEM_TYPE = new RawContextKey('callStackItemType', undefined, { type: 'string', description: nls.localize('callStackItemType', "Represents the item type of the focused element in the CALL STACK view. For example: 'session', 'thread', 'stackFrame'") }); @@ -72,7 +72,7 @@ export const CONTEXT_FOCUSED_SESSION_IS_ATTACH = new RawContextKey('foc export const CONTEXT_FOCUSED_SESSION_IS_NO_DEBUG = new RawContextKey('focusedSessionIsNoDebug', false, { type: 'boolean', description: nls.localize('focusedSessionIsNoDebug', "True when the focused session is run without debugging.") }); export const CONTEXT_STEP_BACK_SUPPORTED = new RawContextKey('stepBackSupported', false, { type: 'boolean', description: nls.localize('stepBackSupported', "True when the focused session supports 'stepBack' requests.") }); export const CONTEXT_RESTART_FRAME_SUPPORTED = new RawContextKey('restartFrameSupported', false, { type: 'boolean', description: nls.localize('restartFrameSupported', "True when the focused session supports 'restartFrame' requests.") }); -export const CONTEXT_STACK_FRAME_SUPPORTS_RESTART = new RawContextKey('stackFrameSupportsRestart', false, { type: 'boolean', description: nls.localize('stackFrameSupportsRestart', "True when the focused stack frame suppots 'restartFrame'.") }); +export const CONTEXT_STACK_FRAME_SUPPORTS_RESTART = new RawContextKey('stackFrameSupportsRestart', false, { type: 'boolean', description: nls.localize('stackFrameSupportsRestart', "True when the focused stack frame supports 'restartFrame'.") }); export const CONTEXT_JUMP_TO_CURSOR_SUPPORTED = new RawContextKey('jumpToCursorSupported', false, { type: 'boolean', description: nls.localize('jumpToCursorSupported', "True when the focused session supports 'jumpToCursor' request.") }); export const CONTEXT_STEP_INTO_TARGETS_SUPPORTED = new RawContextKey('stepIntoTargetsSupported', false, { type: 'boolean', description: nls.localize('stepIntoTargetsSupported', "True when the focused session supports 'stepIntoTargets' request.") }); export const CONTEXT_BREAKPOINTS_EXIST = new RawContextKey('breakpointsExist', false, { type: 'boolean', description: nls.localize('breakpointsExist', "True when at least one breakpoint exists.") }); From 2eedc1373c9f73f75300e788b7f576ce21b4fa42 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Thu, 27 Jun 2024 14:20:34 -0700 Subject: [PATCH 537/755] look for keylabel that is used for mac as well (#219015) look for mac keylabel as well --- .../browser/replInputHintContentWidget.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts index b42ea604df8a7..6dc4644b71ad2 100644 --- a/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts +++ b/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.ts @@ -122,23 +122,25 @@ export class ReplInputHintContentWidget extends Disposable implements IContentWi private getKeybinding() { const keybindings = this.keybindingService.lookupKeybindings('interactive.execute'); const shiftEnterConfig = this.configurationService.getValue(InteractiveWindowSetting.executeWithShiftEnter); - const hasChord = (chord: string, kb: ResolvedKeybinding) => { + const hasEnterChord = (kb: ResolvedKeybinding, modifier: string = '') => { const chords = kb.getDispatchChords(); - return chords.length === 1 && chords[0] === chord; + const chord = modifier + 'Enter'; + const chordAlt = modifier + '[Enter]'; + return chords.length === 1 && (chords[0] === chord || chords[0] === chordAlt); }; if (shiftEnterConfig) { - const keybinding = keybindings.find(kb => hasChord('shift+Enter', kb)); + const keybinding = keybindings.find(kb => hasEnterChord(kb, 'shift+')); if (keybinding) { return keybinding; } } else { - let keybinding = keybindings.find(kb => hasChord('Enter', kb)); + let keybinding = keybindings.find(kb => hasEnterChord(kb)); if (keybinding) { return keybinding; } keybinding = this.keybindingService.lookupKeybindings('python.execInREPLEnter') - .find(kb => hasChord('Enter', kb)); + .find(kb => hasEnterChord(kb)); if (keybinding) { return keybinding; } From aea213b7fcc7de5c24ad797ac1af209b159d451f Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:21:14 -0700 Subject: [PATCH 538/755] chore: bump braces in build (#219010) --- build/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build/yarn.lock b/build/yarn.lock index d0c7960a11ebb..d99ceffaadf07 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -848,11 +848,11 @@ brace-expansion@^1.1.7: concat-map "0.0.1" braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -1371,10 +1371,10 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" From d390b22c6d0b9f9e90a74690fef3e385e0d1c5ca Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 28 Jun 2024 09:31:37 +0200 Subject: [PATCH 539/755] fix lint error --- src/vs/platform/instantiation/common/instantiationService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index cab2957b1468c..a61ef74333df5 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -220,7 +220,9 @@ export class InstantiationService implements IInstantiationService { while (stack.length) { const item = stack.pop()!; - if (seen.has(String(item.id))) continue; + if (seen.has(String(item.id))) { + continue; + } seen.add(String(item.id)); graph.lookupOrInsertNode(item); From cb1514f9a64ab342f94092f79bdf1a768635d96f Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:08:40 +0200 Subject: [PATCH 540/755] Bump version to 1.92.0 (#219067) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae706deebbcf1..f8bfdf775a30c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-oss-dev", - "version": "1.91.0", + "version": "1.92.0", "distro": "a08799837ca498c02f445ca7a896f446419af238", "author": { "name": "Microsoft Corporation" From 8277c0eba8840d3248f988055ace0bf9d4466ea0 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 28 Jun 2024 11:12:56 +0200 Subject: [PATCH 541/755] allow `tryToParseSlashCommand` to respect default agent commands with default agent being part of the query --- .../browser/contrib/chatInputCompletions.ts | 4 ++-- .../contrib/chat/common/chatParserTypes.ts | 4 ---- .../contrib/chat/common/chatRequestParser.ts | 22 +++++++++---------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts index 4b10231de2415..2c1cd05400b70 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts @@ -252,8 +252,8 @@ class AgentCompletions extends Disposable { }; if (agent.isDefault) { - // default agent isn't mentioned or inserted - item.label = { label: withSlash, description: c.description }; + // default agent isn't mentioned nor inserted + item.label = withSlash; item.insertText = `${withSlash} `; item.detail = c.description; } diff --git a/src/vs/workbench/contrib/chat/common/chatParserTypes.ts b/src/vs/workbench/contrib/chat/common/chatParserTypes.ts index f155cd631945f..66bc10c2061db 100644 --- a/src/vs/workbench/contrib/chat/common/chatParserTypes.ts +++ b/src/vs/workbench/contrib/chat/common/chatParserTypes.ts @@ -81,10 +81,6 @@ export class ChatRequestAgentPart implements IParsedChatRequestPart { get promptText(): string { return ''; } - - get isSynthetic(): boolean { - return this.range.length === 0; - } } /** diff --git a/src/vs/workbench/contrib/chat/common/chatRequestParser.ts b/src/vs/workbench/contrib/chat/common/chatRequestParser.ts index 21795795d3493..c14bb36a65f5e 100644 --- a/src/vs/workbench/contrib/chat/common/chatRequestParser.ts +++ b/src/vs/workbench/contrib/chat/common/chatRequestParser.ts @@ -31,11 +31,6 @@ export class ChatRequestParser { const parts: IParsedChatRequestPart[] = []; const references = this.variableService.getDynamicVariables(sessionId); // must access this list before any async calls - const defaultAgent = this.agentService.getDefaultAgent(location); - if (defaultAgent) { - parts.push(new ChatRequestAgentPart(OffsetRange.ofLength(0), new Range(1, 1, 1, 1), defaultAgent)); - } - let lineNumber = 1; let column = 1; for (let i = 0; i < message.length; i++) { @@ -48,7 +43,7 @@ export class ChatRequestParser { } else if (char === chatAgentLeader) { newPart = this.tryToParseAgent(message.slice(i), message, i, new Position(lineNumber, column), parts, location, context); } else if (char === chatSubcommandLeader) { - newPart = this.tryToParseSlashCommand(message.slice(i), message, i, new Position(lineNumber, column), parts); + newPart = this.tryToParseSlashCommand(message.slice(i), message, i, new Position(lineNumber, column), parts, location); } if (!newPart) { @@ -101,11 +96,6 @@ export class ChatRequestParser { return; } - const syntheticDefaultAgent = parts.findIndex(candidate => candidate instanceof ChatRequestAgentPart && candidate.isSynthetic); - if (syntheticDefaultAgent >= 0) { - parts.splice(syntheticDefaultAgent, 1); - } - const [full, name] = nextAgentMatch; const agentRange = new OffsetRange(offset, offset + full.length); const agentEditorRange = new Range(position.lineNumber, position.column, position.lineNumber, position.column + full.length); @@ -169,7 +159,7 @@ export class ChatRequestParser { return; } - private tryToParseSlashCommand(remainingMessage: string, fullMessage: string, offset: number, position: IPosition, parts: ReadonlyArray): ChatRequestSlashCommandPart | ChatRequestAgentSubcommandPart | undefined { + private tryToParseSlashCommand(remainingMessage: string, fullMessage: string, offset: number, position: IPosition, parts: ReadonlyArray, location: ChatAgentLocation): ChatRequestSlashCommandPart | ChatRequestAgentSubcommandPart | undefined { const nextSlashMatch = remainingMessage.match(slashReg); if (!nextSlashMatch) { return; @@ -209,6 +199,14 @@ export class ChatRequestParser { if (slashCommand) { // Valid standalone slash command return new ChatRequestSlashCommandPart(slashRange, slashEditorRange, slashCommand); + } else { + // check for with default agent for this location + const defaultAgent = this.agentService.getDefaultAgent(location); + const subCommand = defaultAgent?.slashCommands.find(c => c.name === command); + if (subCommand) { + // Valid default agent subcommand + return new ChatRequestAgentSubcommandPart(slashRange, slashEditorRange, subCommand); + } } } From e4fa43f16886adb970b75e7578a317e4f8801115 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 28 Jun 2024 11:29:28 +0200 Subject: [PATCH 542/755] decorate agent command part when alone (with agent) --- .../browser/contrib/chatInputEditorContrib.ts | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts index 0234253d3b800..24aafd6c10177 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib.ts @@ -175,8 +175,8 @@ class InputEditorDecorations extends Disposable { } } - const onlyAgentCommandAndWhitespace = agentPart && agentSubcommandPart && parsedRequest.every(p => p instanceof ChatRequestTextPart && !p.text.trim().length || p instanceof ChatRequestAgentPart || p instanceof ChatRequestAgentSubcommandPart); - if (onlyAgentCommandAndWhitespace) { + const onlyAgentAndAgentCommandAndWhitespace = agentPart && agentSubcommandPart && parsedRequest.every(p => p instanceof ChatRequestTextPart && !p.text.trim().length || p instanceof ChatRequestAgentPart || p instanceof ChatRequestAgentSubcommandPart); + if (onlyAgentAndAgentCommandAndWhitespace) { // Agent reference and subcommand with no other text - show the placeholder const isFollowupSlashCommand = this.previouslyUsedAgents.has(agentAndCommandToKey(agentPart.agent, agentSubcommandPart.command.name)); const shouldRenderFollowupPlaceholder = isFollowupSlashCommand && agentSubcommandPart.command.followupPlaceholder; @@ -193,14 +193,30 @@ class InputEditorDecorations extends Disposable { } } + const onlyAgentCommandAndWhitespace = agentSubcommandPart && parsedRequest.every(p => p instanceof ChatRequestTextPart && !p.text.trim().length || p instanceof ChatRequestAgentSubcommandPart); + if (onlyAgentCommandAndWhitespace) { + // Agent subcommand with no other text - show the placeholder + if (agentSubcommandPart?.command.description && exactlyOneSpaceAfterPart(agentSubcommandPart)) { + placeholderDecoration = [{ + range: getRangeForPlaceholder(agentSubcommandPart), + renderOptions: { + after: { + contentText: agentSubcommandPart.command.description, + color: this.getPlaceholderColor(), + } + } + }]; + } + } + this.widget.inputEditor.setDecorationsByType(decorationDescription, placeholderDecorationType, placeholderDecoration ?? []); const textDecorations: IDecorationOptions[] | undefined = []; if (agentPart) { textDecorations.push({ range: agentPart.editorRange }); - if (agentSubcommandPart) { - textDecorations.push({ range: agentSubcommandPart.editorRange, hoverMessage: new MarkdownString(agentSubcommandPart.command.description) }); - } + } + if (agentSubcommandPart) { + textDecorations.push({ range: agentSubcommandPart.editorRange, hoverMessage: new MarkdownString(agentSubcommandPart.command.description) }); } if (slashCommandPart) { From 375d8c8bebfb43800a1f0ffc32f702b4a495a582 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 28 Jun 2024 11:42:01 +0200 Subject: [PATCH 543/755] make `SlashCommandService` location aware, scope /clear and /help to panel location --- .../contrib/chat/browser/chat.contribution.ts | 6 ++++-- .../browser/contrib/chatInputCompletions.ts | 2 +- .../contrib/chat/common/chatRequestParser.ts | 2 +- .../contrib/chat/common/chatServiceImpl.ts | 2 +- .../contrib/chat/common/chatSlashCommands.ts | 17 +++++++++-------- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 4937c6afbfd6d..46c8fa3be700d 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -176,7 +176,8 @@ class ChatSlashStaticSlashCommandsContribution extends Disposable { command: 'clear', detail: nls.localize('clear', "Start a new chat"), sortText: 'z2_clear', - executeImmediately: true + executeImmediately: true, + locations: [ChatAgentLocation.Panel] }, async () => { commandService.executeCommand(ACTION_ID_NEW_CHAT); })); @@ -184,7 +185,8 @@ class ChatSlashStaticSlashCommandsContribution extends Disposable { command: 'help', detail: '', sortText: 'z1_help', - executeImmediately: true + executeImmediately: true, + locations: [ChatAgentLocation.Panel] }, async (prompt, progress) => { const defaultAgent = chatAgentService.getDefaultAgent(ChatAgentLocation.Panel); const agents = chatAgentService.getAgents(); diff --git a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts index 2c1cd05400b70..8910e307eab93 100644 --- a/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts +++ b/src/vs/workbench/contrib/chat/browser/contrib/chatInputCompletions.ts @@ -56,7 +56,7 @@ class SlashCommandCompletions extends Disposable { return; } - const slashCommands = this.chatSlashCommandService.getCommands(); + const slashCommands = this.chatSlashCommandService.getCommands(widget.location); if (!slashCommands) { return null; } diff --git a/src/vs/workbench/contrib/chat/common/chatRequestParser.ts b/src/vs/workbench/contrib/chat/common/chatRequestParser.ts index c14bb36a65f5e..e6492570295d6 100644 --- a/src/vs/workbench/contrib/chat/common/chatRequestParser.ts +++ b/src/vs/workbench/contrib/chat/common/chatRequestParser.ts @@ -194,7 +194,7 @@ export class ChatRequestParser { return new ChatRequestAgentSubcommandPart(slashRange, slashEditorRange, subCommand); } } else { - const slashCommands = this.slashCommandService.getCommands(); + const slashCommands = this.slashCommandService.getCommands(location); const slashCommand = slashCommands.find(c => c.command === command); if (slashCommand) { // Valid standalone slash command diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index ff8d83fc2c378..42d17335b845e 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -617,7 +617,7 @@ export class ChatService extends Disposable implements IChatService { const message = parsedRequest.text; const commandResult = await this.chatSlashCommandService.executeCommand(commandPart.slashCommand.command, message.substring(commandPart.slashCommand.command.length + 1).trimStart(), new Progress(p => { progressCallback(p); - }), history, token); + }), history, location, token); agentOrCommandFollowups = Promise.resolve(commandResult?.followUp); rawResult = {}; diff --git a/src/vs/workbench/contrib/chat/common/chatSlashCommands.ts b/src/vs/workbench/contrib/chat/common/chatSlashCommands.ts index 2d43f1c039682..3b19cd512b9b1 100644 --- a/src/vs/workbench/contrib/chat/common/chatSlashCommands.ts +++ b/src/vs/workbench/contrib/chat/common/chatSlashCommands.ts @@ -11,6 +11,7 @@ import { IProgress } from 'vs/platform/progress/common/progress'; import { IChatMessage } from 'vs/workbench/contrib/chat/common/languageModels'; import { IChatFollowup, IChatProgress, IChatResponseProgressFileTreeData } from 'vs/workbench/contrib/chat/common/chatService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; //#region slash service, commands etc @@ -18,18 +19,18 @@ export interface IChatSlashData { command: string; detail: string; sortText?: string; - /** * Whether the command should execute as soon * as it is entered. Defaults to `false`. */ executeImmediately?: boolean; + locations: ChatAgentLocation[]; } export interface IChatSlashFragment { content: string | { treeData: IChatResponseProgressFileTreeData }; } -export type IChatSlashCallback = { (prompt: string, progress: IProgress, history: IChatMessage[], token: CancellationToken): Promise<{ followUp: IChatFollowup[] } | void> }; +export type IChatSlashCallback = { (prompt: string, progress: IProgress, history: IChatMessage[], location: ChatAgentLocation, token: CancellationToken): Promise<{ followUp: IChatFollowup[] } | void> }; export const IChatSlashCommandService = createDecorator('chatSlashCommandService'); @@ -40,8 +41,8 @@ export interface IChatSlashCommandService { _serviceBrand: undefined; readonly onDidChangeCommands: Event; registerSlashCommand(data: IChatSlashData, command: IChatSlashCallback): IDisposable; - executeCommand(id: string, prompt: string, progress: IProgress, history: IChatMessage[], token: CancellationToken): Promise<{ followUp: IChatFollowup[] } | void>; - getCommands(): Array; + executeCommand(id: string, prompt: string, progress: IProgress, history: IChatMessage[], location: ChatAgentLocation, token: CancellationToken): Promise<{ followUp: IChatFollowup[] } | void>; + getCommands(location: ChatAgentLocation): Array; hasCommand(id: string): boolean; } @@ -80,15 +81,15 @@ export class ChatSlashCommandService extends Disposable implements IChatSlashCom }); } - getCommands(): Array { - return Array.from(this._commands.values(), v => v.data); + getCommands(location: ChatAgentLocation): Array { + return Array.from(this._commands.values(), v => v.data).filter(c => c.locations.includes(location)); } hasCommand(id: string): boolean { return this._commands.has(id); } - async executeCommand(id: string, prompt: string, progress: IProgress, history: IChatMessage[], token: CancellationToken): Promise<{ followUp: IChatFollowup[] } | void> { + async executeCommand(id: string, prompt: string, progress: IProgress, history: IChatMessage[], location: ChatAgentLocation, token: CancellationToken): Promise<{ followUp: IChatFollowup[] } | void> { const data = this._commands.get(id); if (!data) { throw new Error('No command with id ${id} NOT registered'); @@ -100,6 +101,6 @@ export class ChatSlashCommandService extends Disposable implements IChatSlashCom throw new Error(`No command with id ${id} NOT resolved`); } - return await data.command(prompt, progress, history, token); + return await data.command(prompt, progress, history, location, token); } } From 7b299714f521ff25fc3db85dfce0072fe52ea6e2 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 28 Jun 2024 11:44:11 +0200 Subject: [PATCH 544/755] disable file references for inline chat for now --- src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index fad3466eefead..9209fb404c036 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -153,7 +153,7 @@ export class InlineChatWidget { renderStyle: 'minimal', renderInputOnTop: false, renderFollowups: true, - supportsFileReferences: true, + supportsFileReferences: false, filter: item => !isWelcomeVM(item), ...options.chatWidgetViewOptions }, From f6f90e016301f288ac5b36936d15ff8af9d70923 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2024 11:55:48 +0200 Subject: [PATCH 545/755] Implement NLS without AMD loader (#214588) --- .eslintrc.json | 4 - .vscode/settings.json | 2 - build/azure-pipelines/product-build.yml | 209 +++++------ build/azure-pipelines/upload-nlsmetadata.js | 30 +- build/azure-pipelines/upload-nlsmetadata.ts | 138 +++++--- .../azure-pipelines/web/product-build-web.yml | 2 +- build/gulpfile.editor.js | 2 +- build/gulpfile.reh.js | 6 + build/gulpfile.vscode.js | 11 +- build/lib/compilation.js | 10 +- build/lib/compilation.ts | 19 +- build/lib/i18n.js | 172 ++-------- build/lib/i18n.ts | 181 +++------- build/lib/nls.js | 126 ++++--- build/lib/nls.ts | 150 ++++---- build/lib/optimize.js | 1 + build/lib/optimize.ts | 1 + src/bootstrap-amd.js | 102 +++++- src/bootstrap-window.js | 32 +- src/bootstrap.js | 135 -------- src/cli.js | 34 +- src/main.js | 111 +++--- src/server-cli.js | 38 +- src/server-main.js | 26 +- src/tsconfig.monaco.json | 1 + src/typings/vscode-globals-nls.d.ts | 36 ++ src/vs/base/browser/defaultWorkerFactory.ts | 48 +-- src/vs/base/common/platform.ts | 45 +-- src/vs/base/node/languagePacks.d.ts | 25 -- src/vs/base/node/languagePacks.js | 264 -------------- src/vs/base/node/nls.d.ts | 38 ++ src/vs/base/node/nls.js | 288 ++++++++++++++++ .../base/parts/sandbox/common/sandboxTypes.ts | 17 + src/vs/code/browser/workbench/workbench.html | 25 +- src/vs/code/electron-main/app.ts | 41 +-- .../electron-sandbox/workbench/workbench.js | 5 +- src/vs/nls.ts | 324 +++++++----------- .../electron-main/environmentMainService.ts | 6 - .../issue/electron-main/issueMainService.ts | 7 +- .../issue/electron-main/processMainService.ts | 7 +- .../electron-main/windowsMainService.ts | 6 + src/vs/server/node/extensionHostConnection.ts | 2 +- .../server/node/extensionsScannerService.ts | 6 +- src/vs/server/node/remoteLanguagePacks.ts | 61 ++-- src/vs/server/node/webClientServer.ts | 19 +- .../browser/webWorkerExtensionHost.ts | 17 + .../worker/webWorkerExtensionHostIframe.html | 37 +- .../localization/browser/localeService.ts | 78 ++++- .../workingCopyBackupService.test.ts | 4 + .../workbench/workbench.desktop.main.nls.js | 8 - src/vs/workbench/workbench.web.main.ts | 1 - test/unit/browser/index.js | 12 + test/unit/electron/renderer.js | 11 + test/unit/node/index.js | 8 + 54 files changed, 1490 insertions(+), 1499 deletions(-) create mode 100644 src/typings/vscode-globals-nls.d.ts delete mode 100644 src/vs/base/node/languagePacks.d.ts delete mode 100644 src/vs/base/node/languagePacks.js create mode 100644 src/vs/base/node/nls.d.ts create mode 100644 src/vs/base/node/nls.js delete mode 100644 src/vs/workbench/workbench.desktop.main.nls.js diff --git a/.eslintrc.json b/.eslintrc.json index 1a9117cfaeb69..5e0a792f4920c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1015,10 +1015,6 @@ "vs/base/common/*" ] }, - { - "target": "src/vs/workbench/{workbench.desktop.main.nls.js,workbench.web.main.nls.js}", - "restrictions": [] - }, { "target": "src/vs/{loader.d.ts,css.ts,css.build.ts,monaco.d.ts,nls.ts,nls.build.ts,nls.mock.ts}", "restrictions": [] diff --git a/.vscode/settings.json b/.vscode/settings.json index ef93d2deda155..52dac9d796032 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,8 +40,6 @@ "**/Cargo.lock": true, "src/vs/workbench/workbench.web.main.css": true, "src/vs/workbench/workbench.desktop.main.css": true, - "src/vs/workbench/workbench.desktop.main.nls.js": true, - "src/vs/workbench/workbench.web.main.nls.js": true, "build/**/*.js": true, "out/**": true, "out-build/**": true, diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 5357697484eb9..97adeb0cd83c5 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -216,104 +216,105 @@ extends: parameters: VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - - stage: CompileCLI - dependsOn: [] - jobs: - - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}: - - job: CLILinuxX64 - pool: - name: 1es-ubuntu-20.04-x64 - os: linux - steps: - - template: build/azure-pipelines/linux/cli-build-linux.yml@self - parameters: - VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }} - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_LINUX: ${{ parameters.VSCODE_BUILD_LINUX }} - - - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), or(eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true))) }}: - - job: CLILinuxGnuARM - pool: - name: 1es-ubuntu-20.04-x64 - os: linux - steps: - - template: build/azure-pipelines/linux/cli-build-linux.yml@self - parameters: - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_LINUX_ARMHF: ${{ parameters.VSCODE_BUILD_LINUX_ARMHF }} - VSCODE_BUILD_LINUX_ARM64: ${{ parameters.VSCODE_BUILD_LINUX_ARM64 }} - - - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE, true)) }}: - - job: CLIAlpineX64 - pool: - name: 1es-ubuntu-20.04-x64 - os: linux - steps: - - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self - parameters: - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_ALPINE: ${{ parameters.VSCODE_BUILD_ALPINE }} - - - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true)) }}: - - job: CLIAlpineARM64 - pool: - name: 1es-mariner-2.0-arm64 - os: linux - hostArchitecture: arm64 - container: ubuntu-2004-arm64 - steps: - - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self - parameters: - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_ALPINE_ARM64: ${{ parameters.VSCODE_BUILD_ALPINE_ARM64 }} - - - ${{ if eq(parameters.VSCODE_BUILD_MACOS, true) }}: - - job: CLIMacOSX64 - pool: - name: Azure Pipelines - image: macOS-13 - os: macOS - steps: - - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self - parameters: - VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }} - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_MACOS: ${{ parameters.VSCODE_BUILD_MACOS }} - - - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}: - - job: CLIMacOSARM64 - pool: - name: Azure Pipelines - image: macOS-13 - os: macOS - steps: - - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self - parameters: - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_MACOS_ARM64: ${{ parameters.VSCODE_BUILD_MACOS_ARM64 }} - - - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}: - - job: CLIWindowsX64 - pool: - name: 1es-windows-2019-x64 - os: windows - steps: - - template: build/azure-pipelines/win32/cli-build-win32.yml@self - parameters: - VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }} - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_WIN32: ${{ parameters.VSCODE_BUILD_WIN32 }} - - - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: - - job: CLIWindowsARM64 - pool: - name: 1es-windows-2019-x64 - os: windows - steps: - - template: build/azure-pipelines/win32/cli-build-win32.yml@self - parameters: - VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} - VSCODE_BUILD_WIN32_ARM64: ${{ parameters.VSCODE_BUILD_WIN32_ARM64 }} + - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: + - stage: CompileCLI + dependsOn: [] + jobs: + - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}: + - job: CLILinuxX64 + pool: + name: 1es-ubuntu-20.04-x64 + os: linux + steps: + - template: build/azure-pipelines/linux/cli-build-linux.yml@self + parameters: + VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }} + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_LINUX: ${{ parameters.VSCODE_BUILD_LINUX }} + + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), or(eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true))) }}: + - job: CLILinuxGnuARM + pool: + name: 1es-ubuntu-20.04-x64 + os: linux + steps: + - template: build/azure-pipelines/linux/cli-build-linux.yml@self + parameters: + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_LINUX_ARMHF: ${{ parameters.VSCODE_BUILD_LINUX_ARMHF }} + VSCODE_BUILD_LINUX_ARM64: ${{ parameters.VSCODE_BUILD_LINUX_ARM64 }} + + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE, true)) }}: + - job: CLIAlpineX64 + pool: + name: 1es-ubuntu-20.04-x64 + os: linux + steps: + - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self + parameters: + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_ALPINE: ${{ parameters.VSCODE_BUILD_ALPINE }} + + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true)) }}: + - job: CLIAlpineARM64 + pool: + name: 1es-mariner-2.0-arm64 + os: linux + hostArchitecture: arm64 + container: ubuntu-2004-arm64 + steps: + - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self + parameters: + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_ALPINE_ARM64: ${{ parameters.VSCODE_BUILD_ALPINE_ARM64 }} + + - ${{ if eq(parameters.VSCODE_BUILD_MACOS, true) }}: + - job: CLIMacOSX64 + pool: + name: Azure Pipelines + image: macOS-13 + os: macOS + steps: + - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self + parameters: + VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }} + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_MACOS: ${{ parameters.VSCODE_BUILD_MACOS }} + + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}: + - job: CLIMacOSARM64 + pool: + name: Azure Pipelines + image: macOS-13 + os: macOS + steps: + - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self + parameters: + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_MACOS_ARM64: ${{ parameters.VSCODE_BUILD_MACOS_ARM64 }} + + - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}: + - job: CLIWindowsX64 + pool: + name: 1es-windows-2019-x64 + os: windows + steps: + - template: build/azure-pipelines/win32/cli-build-win32.yml@self + parameters: + VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }} + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_WIN32: ${{ parameters.VSCODE_BUILD_WIN32 }} + + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: + - job: CLIWindowsARM64 + pool: + name: 1es-windows-2019-x64 + os: windows + steps: + - template: build/azure-pipelines/win32/cli-build-win32.yml@self + parameters: + VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} + VSCODE_BUILD_WIN32_ARM64: ${{ parameters.VSCODE_BUILD_WIN32_ARM64 }} - stage: CustomSDL dependsOn: [] @@ -331,7 +332,8 @@ extends: - stage: Windows dependsOn: - Compile - - CompileCLI + - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: + - CompileCLI pool: name: 1es-windows-2019-x64 os: windows @@ -422,7 +424,8 @@ extends: - stage: Linux dependsOn: - Compile - - CompileCLI + - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: + - CompileCLI pool: name: 1es-ubuntu-20.04-x64 os: linux @@ -580,7 +583,8 @@ extends: - stage: Alpine dependsOn: - Compile - - CompileCLI + - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: + - CompileCLI pool: name: 1es-ubuntu-20.04-x64 os: linux @@ -606,7 +610,8 @@ extends: - stage: macOS dependsOn: - Compile - - CompileCLI + - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: + - CompileCLI pool: name: Azure Pipelines image: macOS-13 diff --git a/build/azure-pipelines/upload-nlsmetadata.js b/build/azure-pipelines/upload-nlsmetadata.js index 34c2005a30fde..5b6cd3ed1fd55 100644 --- a/build/azure-pipelines/upload-nlsmetadata.js +++ b/build/azure-pipelines/upload-nlsmetadata.js @@ -16,13 +16,33 @@ const commit = process.env['BUILD_SOURCEVERSION']; const credential = new identity_1.ClientSecretCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], process.env['AZURE_CLIENT_SECRET']); function main() { return new Promise((c, e) => { - es.merge(vfs.src('out-vscode-web-min/nls.metadata.json', { base: 'out-vscode-web-min' }), vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' })) + const combinedMetadataJson = es.merge( + // vscode: we are not using `out-build/nls.metadata.json` here because + // it includes metadata for translators for `keys`. but for our purpose + // we want only the `keys` and `messages` as `string`. + es.merge(vfs.src('out-build/nls.keys.json', { base: 'out-build' }), vfs.src('out-build/nls.messages.json', { base: 'out-build' })) .pipe(merge({ + fileName: 'vscode.json', + jsonSpace: '', + concatArrays: true, + edit: (parsedJson, file) => { + if (file.base === 'out-build') { + if (file.basename === 'nls.keys.json') { + return { keys: parsedJson }; + } + else { + return { messages: parsedJson }; + } + } + } + })), + // extensions + vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' })).pipe(merge({ fileName: 'combined.nls.metadata.json', jsonSpace: '', concatArrays: true, edit: (parsedJson, file) => { - if (file.base === 'out-vscode-web-min') { + if (file.basename === 'vscode.json') { return { vscode: parsedJson }; } // Handle extensions and follow the same structure as the Core nls file. @@ -72,13 +92,15 @@ function main() { const key = manifestJson.publisher + '.' + manifestJson.name; return { [key]: parsedJson }; }, - })) + })); + const nlsMessagesJs = vfs.src('out-build/nls.messages.js', { base: 'out-build' }); + es.merge(combinedMetadataJson, nlsMessagesJs) .pipe(gzip({ append: false })) .pipe(vfs.dest('./nlsMetadata')) .pipe(es.through(function (data) { console.log(`Uploading ${data.path}`); // trigger artifact upload - console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=combined.nls.metadata.json]${data.path}`); + console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=${data.basename}]${data.path}`); this.emit('data', data); })) .pipe(azure.upload({ diff --git a/build/azure-pipelines/upload-nlsmetadata.ts b/build/azure-pipelines/upload-nlsmetadata.ts index 416d0eec408f7..030cc8f0e5a6c 100644 --- a/build/azure-pipelines/upload-nlsmetadata.ts +++ b/build/azure-pipelines/upload-nlsmetadata.ts @@ -24,79 +24,103 @@ interface NlsMetadata { function main(): Promise { return new Promise((c, e) => { + const combinedMetadataJson = es.merge( + // vscode: we are not using `out-build/nls.metadata.json` here because + // it includes metadata for translators for `keys`. but for our purpose + // we want only the `keys` and `messages` as `string`. + es.merge( + vfs.src('out-build/nls.keys.json', { base: 'out-build' }), + vfs.src('out-build/nls.messages.json', { base: 'out-build' })) + .pipe(merge({ + fileName: 'vscode.json', + jsonSpace: '', + concatArrays: true, + edit: (parsedJson, file) => { + if (file.base === 'out-build') { + if (file.basename === 'nls.keys.json') { + return { keys: parsedJson }; + } else { + return { messages: parsedJson }; + } + } + } + })), - es.merge( - vfs.src('out-vscode-web-min/nls.metadata.json', { base: 'out-vscode-web-min' }), + // extensions vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }), - vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' })) - .pipe(merge({ - fileName: 'combined.nls.metadata.json', - jsonSpace: '', - concatArrays: true, - edit: (parsedJson, file) => { - if (file.base === 'out-vscode-web-min') { - return { vscode: parsedJson }; - } + vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' }) + ).pipe(merge({ + fileName: 'combined.nls.metadata.json', + jsonSpace: '', + concatArrays: true, + edit: (parsedJson, file) => { + if (file.basename === 'vscode.json') { + return { vscode: parsedJson }; + } - // Handle extensions and follow the same structure as the Core nls file. - switch (file.basename) { - case 'package.nls.json': - // put package.nls.json content in Core NlsMetadata format - // language packs use the key "package" to specify that - // translations are for the package.json file - parsedJson = { - messages: { - package: Object.values(parsedJson) - }, - keys: { - package: Object.keys(parsedJson) - }, - bundles: { - main: ['package'] - } - }; - break; + // Handle extensions and follow the same structure as the Core nls file. + switch (file.basename) { + case 'package.nls.json': + // put package.nls.json content in Core NlsMetadata format + // language packs use the key "package" to specify that + // translations are for the package.json file + parsedJson = { + messages: { + package: Object.values(parsedJson) + }, + keys: { + package: Object.keys(parsedJson) + }, + bundles: { + main: ['package'] + } + }; + break; - case 'nls.metadata.header.json': - parsedJson = { header: parsedJson }; - break; + case 'nls.metadata.header.json': + parsedJson = { header: parsedJson }; + break; - case 'nls.metadata.json': { - // put nls.metadata.json content in Core NlsMetadata format - const modules = Object.keys(parsedJson); + case 'nls.metadata.json': { + // put nls.metadata.json content in Core NlsMetadata format + const modules = Object.keys(parsedJson); - const json: NlsMetadata = { - keys: {}, - messages: {}, - bundles: { - main: [] - } - }; - for (const module of modules) { - json.messages[module] = parsedJson[module].messages; - json.keys[module] = parsedJson[module].keys; - json.bundles.main.push(module); + const json: NlsMetadata = { + keys: {}, + messages: {}, + bundles: { + main: [] } - parsedJson = json; - break; + }; + for (const module of modules) { + json.messages[module] = parsedJson[module].messages; + json.keys[module] = parsedJson[module].keys; + json.bundles.main.push(module); } + parsedJson = json; + break; } + } - // Get extension id and use that as the key - const folderPath = path.join(file.base, file.relative.split('/')[0]); - const manifest = readFileSync(path.join(folderPath, 'package.json'), 'utf-8'); - const manifestJson = JSON.parse(manifest); - const key = manifestJson.publisher + '.' + manifestJson.name; - return { [key]: parsedJson }; - }, - })) + // Get extension id and use that as the key + const folderPath = path.join(file.base, file.relative.split('/')[0]); + const manifest = readFileSync(path.join(folderPath, 'package.json'), 'utf-8'); + const manifestJson = JSON.parse(manifest); + const key = manifestJson.publisher + '.' + manifestJson.name; + return { [key]: parsedJson }; + }, + })); + + const nlsMessagesJs = vfs.src('out-build/nls.messages.js', { base: 'out-build' }); + + es.merge(combinedMetadataJson, nlsMessagesJs) .pipe(gzip({ append: false })) .pipe(vfs.dest('./nlsMetadata')) .pipe(es.through(function (data: Vinyl) { console.log(`Uploading ${data.path}`); // trigger artifact upload - console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=combined.nls.metadata.json]${data.path}`); + console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=${data.basename}]${data.path}`); this.emit('data', data); })) .pipe(azure.upload({ diff --git a/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml index 5e423d077c7e2..a522e845f3bee 100644 --- a/build/azure-pipelines/web/product-build-web.yml +++ b/build/azure-pipelines/web/product-build-web.yml @@ -152,7 +152,7 @@ steps: - script: | set -e - AZURE_STORAGE_ACCOUNT="ticino" \ + AZURE_STORAGE_ACCOUNT="vscodeweb" \ AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \ AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \ AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \ diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index 22b70a953dfb5..a02456e7a2e3e 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -86,7 +86,7 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => { }); // Disable mangling for the editor, as it complicates debugging & quite a few users rely on private/protected fields. -const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true, { disableMangle: true })); +const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true, { disableMangle: true, preserveEnglish: true })); const optimizeEditorAMDTask = task.define('optimize-editor-amd', optimize.optimizeTask( { diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index a6cfbe5a61d8f..ff2bf482a8d47 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -58,6 +58,9 @@ const serverResources = [ 'out-build/bootstrap-amd.js', 'out-build/bootstrap-node.js', + // NLS + 'out-build/nls.messages.json', + // Performance 'out-build/vs/base/common/performance.js', @@ -82,6 +85,9 @@ const serverWithWebResources = [ // Include all of server... ...serverResources, + // NLS + 'out-build/nls.messages.js', + // ...and all of web ...vscodeWebResourceIncludes ]; diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index c6202c7088305..b2967504fc5a0 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -56,6 +56,8 @@ const vscodeResources = [ 'out-build/bootstrap-amd.js', 'out-build/bootstrap-node.js', 'out-build/bootstrap-window.js', + 'out-build/nls.messages.json', + 'out-build/nls.keys.json', 'out-build/vs/**/*.{svg,png,html,jpg,mp3}', '!out-build/vs/code/browser/**/*.html', '!out-build/vs/code/**/*-dev.html', @@ -496,17 +498,12 @@ gulp.task(task.define( core, compileExtensionsBuildTask, function () { - const pathToMetadata = './out-vscode/nls.metadata.json'; - const pathToRehWebMetadata = './out-vscode-reh-web/nls.metadata.json'; + const pathToMetadata = './out-build/nls.metadata.json'; const pathToExtensions = '.build/extensions/*'; const pathToSetup = 'build/win32/i18n/messages.en.isl'; return es.merge( - gulp.src([pathToMetadata, pathToRehWebMetadata]).pipe(merge({ - fileName: 'nls.metadata.json', - jsonSpace: '', - concatArrays: true - })).pipe(i18n.createXlfFilesForCoreBundle()), + gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()), gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()), gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions()) ).pipe(vfs.dest('../vscode-translations-export')); diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 2f408d562ced9..cafca34a0d834 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -41,7 +41,7 @@ function getTypeScriptCompilerOptions(src) { options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 0 : 1; return options; } -function createCompile(src, build, emitError, transpileOnly) { +function createCompile(src, { build, emitError, transpileOnly, preserveEnglish }) { const tsb = require('./tsb'); const sourcemaps = require('gulp-sourcemaps'); const projectPath = path.join(__dirname, '../../', src, 'tsconfig.json'); @@ -71,7 +71,7 @@ function createCompile(src, build, emitError, transpileOnly) { .pipe(util.loadSourcemaps()) .pipe(compilation(token)) .pipe(noDeclarationsFilter) - .pipe(util.$if(build, nls.nls())) + .pipe(util.$if(build, nls.nls({ preserveEnglish }))) .pipe(noDeclarationsFilter.restore) .pipe(util.$if(!transpileOnly, sourcemaps.write('.', { addComment: false, @@ -90,7 +90,7 @@ function createCompile(src, build, emitError, transpileOnly) { } function transpileTask(src, out, swc) { const task = () => { - const transpile = createCompile(src, false, true, { swc }); + const transpile = createCompile(src, { build: false, emitError: true, transpileOnly: { swc }, preserveEnglish: false }); const srcPipe = gulp.src(`${src}/**`, { base: `${src}` }); return srcPipe .pipe(transpile()) @@ -104,7 +104,7 @@ function compileTask(src, out, build, options = {}) { if (os.totalmem() < 4_000_000_000) { throw new Error('compilation requires 4GB of RAM'); } - const compile = createCompile(src, build, true, false); + const compile = createCompile(src, { build, emitError: true, transpileOnly: false, preserveEnglish: !!options.preserveEnglish }); const srcPipe = gulp.src(`${src}/**`, { base: `${src}` }); const generator = new MonacoGenerator(false); if (src === 'src') { @@ -141,7 +141,7 @@ function compileTask(src, out, build, options = {}) { } function watchTask(out, build) { const task = () => { - const compile = createCompile('src', build, false, false); + const compile = createCompile('src', { build, emitError: false, transpileOnly: false, preserveEnglish: false }); const src = gulp.src('src/**', { base: 'src' }); const watchSrc = watch('src/**', { base: 'src', readDelay: 200 }); const generator = new MonacoGenerator(true); diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index 3b6fa2df33960..8c3614b4c137c 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -42,7 +42,14 @@ function getTypeScriptCompilerOptions(src: string): ts.CompilerOptions { return options; } -function createCompile(src: string, build: boolean, emitError: boolean, transpileOnly: boolean | { swc: boolean }) { +interface ICompileTaskOptions { + readonly build: boolean; + readonly emitError: boolean; + readonly transpileOnly: boolean | { swc: boolean }; + readonly preserveEnglish: boolean; +} + +function createCompile(src: string, { build, emitError, transpileOnly, preserveEnglish }: ICompileTaskOptions) { const tsb = require('./tsb') as typeof import('./tsb'); const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps'); @@ -79,7 +86,7 @@ function createCompile(src: string, build: boolean, emitError: boolean, transpil .pipe(util.loadSourcemaps()) .pipe(compilation(token)) .pipe(noDeclarationsFilter) - .pipe(util.$if(build, nls.nls())) + .pipe(util.$if(build, nls.nls({ preserveEnglish }))) .pipe(noDeclarationsFilter.restore) .pipe(util.$if(!transpileOnly, sourcemaps.write('.', { addComment: false, @@ -102,7 +109,7 @@ export function transpileTask(src: string, out: string, swc: boolean): task.Stre const task = () => { - const transpile = createCompile(src, false, true, { swc }); + const transpile = createCompile(src, { build: false, emitError: true, transpileOnly: { swc }, preserveEnglish: false }); const srcPipe = gulp.src(`${src}/**`, { base: `${src}` }); return srcPipe @@ -114,7 +121,7 @@ export function transpileTask(src: string, out: string, swc: boolean): task.Stre return task; } -export function compileTask(src: string, out: string, build: boolean, options: { disableMangle?: boolean } = {}): task.StreamTask { +export function compileTask(src: string, out: string, build: boolean, options: { disableMangle?: boolean; preserveEnglish?: boolean } = {}): task.StreamTask { const task = () => { @@ -122,7 +129,7 @@ export function compileTask(src: string, out: string, build: boolean, options: { throw new Error('compilation requires 4GB of RAM'); } - const compile = createCompile(src, build, true, false); + const compile = createCompile(src, { build, emitError: true, transpileOnly: false, preserveEnglish: !!options.preserveEnglish }); const srcPipe = gulp.src(`${src}/**`, { base: `${src}` }); const generator = new MonacoGenerator(false); if (src === 'src') { @@ -166,7 +173,7 @@ export function compileTask(src: string, out: string, build: boolean, options: { export function watchTask(out: string, build: boolean): task.StreamTask { const task = () => { - const compile = createCompile('src', build, false, false); + const compile = createCompile('src', { build, emitError: false, transpileOnly: false, preserveEnglish: false }); const src = gulp.src('src/**', { base: 'src' }); const watchSrc = watch('src/**', { base: 'src', readDelay: 200 }); diff --git a/build/lib/i18n.js b/build/lib/i18n.js index c33994987f0d2..a837cbc4ac0c2 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -23,6 +23,7 @@ const fancyLog = require("fancy-log"); const ansiColors = require("ansi-colors"); const iconv = require("@vscode/iconv-lite-umd"); const l10n_dev_1 = require("@vscode/l10n-dev"); +const REPO_ROOT_PATH = path.join(__dirname, '../..'); function log(message, ...rest) { fancyLog(ansiColors.green('[i18n]'), message, ...rest); } @@ -63,6 +64,17 @@ var BundledFormat; } BundledFormat.is = is; })(BundledFormat || (BundledFormat = {})); +var NLSKeysFormat; +(function (NLSKeysFormat) { + function is(value) { + if (value === undefined) { + return false; + } + const candidate = value; + return Array.isArray(candidate) && Array.isArray(candidate[1]); + } + NLSKeysFormat.is = is; +})(NLSKeysFormat || (NLSKeysFormat = {})); class Line { buffer = []; constructor(indent = 0) { @@ -265,67 +277,8 @@ function stripComments(content) { }); return result; } -function escapeCharacters(value) { - const result = []; - for (let i = 0; i < value.length; i++) { - const ch = value.charAt(i); - switch (ch) { - case '\'': - result.push('\\\''); - break; - case '"': - result.push('\\"'); - break; - case '\\': - result.push('\\\\'); - break; - case '\n': - result.push('\\n'); - break; - case '\r': - result.push('\\r'); - break; - case '\t': - result.push('\\t'); - break; - case '\b': - result.push('\\b'); - break; - case '\f': - result.push('\\f'); - break; - default: - result.push(ch); - } - } - return result.join(''); -} -function processCoreBundleFormat(fileHeader, languages, json, emitter) { - const keysSection = json.keys; - const messageSection = json.messages; - const bundleSection = json.bundles; - const statistics = Object.create(null); - const defaultMessages = Object.create(null); - const modules = Object.keys(keysSection); - modules.forEach((module) => { - const keys = keysSection[module]; - const messages = messageSection[module]; - if (!messages || keys.length !== messages.length) { - emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`); - return; - } - const messageMap = Object.create(null); - defaultMessages[module] = messageMap; - keys.map((key, i) => { - if (typeof key === 'string') { - messageMap[key] = messages[i]; - } - else { - messageMap[key.key] = messages[i]; - } - }); - }); - const languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n'); +function processCoreBundleFormat(base, fileHeader, languages, json, emitter) { + const languageDirectory = path.join(REPO_ROOT_PATH, '..', 'vscode-loc', 'i18n'); if (!fs.existsSync(languageDirectory)) { log(`No VS Code localization repository found. Looking at ${languageDirectory}`); log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`); @@ -335,8 +288,6 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) { if (process.env['VSCODE_BUILD_VERBOSE']) { log(`Generating nls bundles for: ${language.id}`); } - statistics[language.id] = 0; - const localizedModules = Object.create(null); const languageFolderName = language.translationId || language.id; const i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json'); let allMessages; @@ -344,87 +295,36 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) { const content = stripComments(fs.readFileSync(i18nFile, 'utf8')); allMessages = JSON.parse(content); } - modules.forEach((module) => { - const order = keysSection[module]; - let moduleMessage; - if (allMessages) { - moduleMessage = allMessages.contents[module]; + let nlsIndex = 0; + const nlsResult = []; + for (const [moduleId, nlsKeys] of json) { + const moduleTranslations = allMessages?.contents[moduleId]; + for (const nlsKey of nlsKeys) { + nlsResult.push(moduleTranslations?.[nlsKey]); // pushing `undefined` is fine, as we keep english strings as fallback for monaco editor in the build + nlsIndex++; } - if (!moduleMessage) { - if (process.env['VSCODE_BUILD_VERBOSE']) { - log(`No localized messages found for module ${module}. Using default messages.`); - } - moduleMessage = defaultMessages[module]; - statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length; - } - const localizedMessages = []; - order.forEach((keyInfo) => { - let key = null; - if (typeof keyInfo === 'string') { - key = keyInfo; - } - else { - key = keyInfo.key; - } - let message = moduleMessage[key]; - if (!message) { - if (process.env['VSCODE_BUILD_VERBOSE']) { - log(`No localized message found for key ${key} in module ${module}. Using default message.`); - } - message = defaultMessages[module][key]; - statistics[language.id] = statistics[language.id] + 1; - } - localizedMessages.push(message); - }); - localizedModules[module] = localizedMessages; - }); - Object.keys(bundleSection).forEach((bundle) => { - const modules = bundleSection[bundle]; - const contents = [ - fileHeader, - `define("${bundle}.nls.${language.id}", {` - ]; - modules.forEach((module, index) => { - contents.push(`\t"${module}": [`); - const messages = localizedModules[module]; - if (!messages) { - emitter.emit('error', `Didn't find messages for module ${module}.`); - return; - } - messages.forEach((message, index) => { - contents.push(`\t\t"${escapeCharacters(message)}${index < messages.length ? '",' : '"'}`); - }); - contents.push(index < modules.length - 1 ? '\t],' : '\t]'); - }); - contents.push('});'); - emitter.queue(new File({ path: bundle + '.nls.' + language.id + '.js', contents: Buffer.from(contents.join('\n'), 'utf-8') })); - }); - }); - Object.keys(statistics).forEach(key => { - const value = statistics[key]; - log(`${key} has ${value} untranslated strings.`); - }); - sortedLanguages.forEach(language => { - const stats = statistics[language.id]; - if (!stats) { - log(`\tNo translations found for language ${language.id}. Using default language instead.`); } + emitter.queue(new File({ + contents: Buffer.from(`${fileHeader} +globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(nlsResult)}; +globalThis._VSCODE_NLS_LANGUAGE=${JSON.stringify(language.id)};`), + base, + path: `${base}/nls.messages.${language.id}.js` + })); }); } function processNlsFiles(opts) { return (0, event_stream_1.through)(function (file) { const fileName = path.basename(file.path); - if (fileName === 'nls.metadata.json') { - let json = null; - if (file.isBuffer()) { - json = JSON.parse(file.contents.toString('utf8')); - } - else { - this.emit('error', `Failed to read component file: ${file.relative}`); - return; + if (fileName === 'bundleInfo.json') { // pick a root level file to put the core bundles + try { + const json = JSON.parse(fs.readFileSync(path.join(REPO_ROOT_PATH, opts.out, 'nls.keys.json')).toString()); + if (NLSKeysFormat.is(json)) { + processCoreBundleFormat(file.base, opts.fileHeader, opts.languages, json, this); + } } - if (BundledFormat.is(json)) { - processCoreBundleFormat(opts.fileHeader, opts.languages, json, this); + catch (error) { + this.emit('error', `Failed to read component file: ${error}`); } } this.queue(file); diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index 444e3abe59c5a..28f8cc993e642 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -16,6 +16,8 @@ import * as ansiColors from 'ansi-colors'; import * as iconv from '@vscode/iconv-lite-umd'; import { l10nJsonFormat, getL10nXlf, l10nJsonDetails, getL10nFilesFromXlf, getL10nJson } from '@vscode/l10n-dev'; +const REPO_ROOT_PATH = path.join(__dirname, '../..'); + function log(message: any, ...rest: any[]): void { fancyLog(ansiColors.green('[i18n]'), message, ...rest); } @@ -91,6 +93,19 @@ module BundledFormat { } } +type NLSKeysFormat = [string /* module ID */, string[] /* keys */]; + +module NLSKeysFormat { + export function is(value: any): value is NLSKeysFormat { + if (value === undefined) { + return false; + } + + const candidate = value as NLSKeysFormat; + return Array.isArray(candidate) && Array.isArray(candidate[1]); + } +} + interface BundledExtensionFormat { [key: string]: { messages: string[]; @@ -329,70 +344,8 @@ function stripComments(content: string): string { return result; } -function escapeCharacters(value: string): string { - const result: string[] = []; - for (let i = 0; i < value.length; i++) { - const ch = value.charAt(i); - switch (ch) { - case '\'': - result.push('\\\''); - break; - case '"': - result.push('\\"'); - break; - case '\\': - result.push('\\\\'); - break; - case '\n': - result.push('\\n'); - break; - case '\r': - result.push('\\r'); - break; - case '\t': - result.push('\\t'); - break; - case '\b': - result.push('\\b'); - break; - case '\f': - result.push('\\f'); - break; - default: - result.push(ch); - } - } - return result.join(''); -} - -function processCoreBundleFormat(fileHeader: string, languages: Language[], json: BundledFormat, emitter: ThroughStream) { - const keysSection = json.keys; - const messageSection = json.messages; - const bundleSection = json.bundles; - - const statistics: Record = Object.create(null); - - const defaultMessages: Record> = Object.create(null); - const modules = Object.keys(keysSection); - modules.forEach((module) => { - const keys = keysSection[module]; - const messages = messageSection[module]; - if (!messages || keys.length !== messages.length) { - emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`); - return; - } - const messageMap: Record = Object.create(null); - defaultMessages[module] = messageMap; - keys.map((key, i) => { - if (typeof key === 'string') { - messageMap[key] = messages[i]; - } else { - messageMap[key.key] = messages[i]; - } - }); - }); - - const languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n'); +function processCoreBundleFormat(base: string, fileHeader: string, languages: Language[], json: NLSKeysFormat, emitter: ThroughStream) { + const languageDirectory = path.join(REPO_ROOT_PATH, '..', 'vscode-loc', 'i18n'); if (!fs.existsSync(languageDirectory)) { log(`No VS Code localization repository found. Looking at ${languageDirectory}`); log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`); @@ -403,8 +356,6 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json log(`Generating nls bundles for: ${language.id}`); } - statistics[language.id] = 0; - const localizedModules: Record = Object.create(null); const languageFolderName = language.translationId || language.id; const i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json'); let allMessages: I18nFormat | undefined; @@ -412,86 +363,38 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json const content = stripComments(fs.readFileSync(i18nFile, 'utf8')); allMessages = JSON.parse(content); } - modules.forEach((module) => { - const order = keysSection[module]; - let moduleMessage: { [messageKey: string]: string } | undefined; - if (allMessages) { - moduleMessage = allMessages.contents[module]; - } - if (!moduleMessage) { - if (process.env['VSCODE_BUILD_VERBOSE']) { - log(`No localized messages found for module ${module}. Using default messages.`); - } - moduleMessage = defaultMessages[module]; - statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length; + + let nlsIndex = 0; + const nlsResult: Array = []; + for (const [moduleId, nlsKeys] of json) { + const moduleTranslations = allMessages?.contents[moduleId]; + for (const nlsKey of nlsKeys) { + nlsResult.push(moduleTranslations?.[nlsKey]); // pushing `undefined` is fine, as we keep english strings as fallback for monaco editor in the build + nlsIndex++; } - const localizedMessages: string[] = []; - order.forEach((keyInfo) => { - let key: string | null = null; - if (typeof keyInfo === 'string') { - key = keyInfo; - } else { - key = keyInfo.key; - } - let message: string = moduleMessage![key]; - if (!message) { - if (process.env['VSCODE_BUILD_VERBOSE']) { - log(`No localized message found for key ${key} in module ${module}. Using default message.`); - } - message = defaultMessages[module][key]; - statistics[language.id] = statistics[language.id] + 1; - } - localizedMessages.push(message); - }); - localizedModules[module] = localizedMessages; - }); - Object.keys(bundleSection).forEach((bundle) => { - const modules = bundleSection[bundle]; - const contents: string[] = [ - fileHeader, - `define("${bundle}.nls.${language.id}", {` - ]; - modules.forEach((module, index) => { - contents.push(`\t"${module}": [`); - const messages = localizedModules[module]; - if (!messages) { - emitter.emit('error', `Didn't find messages for module ${module}.`); - return; - } - messages.forEach((message, index) => { - contents.push(`\t\t"${escapeCharacters(message)}${index < messages.length ? '",' : '"'}`); - }); - contents.push(index < modules.length - 1 ? '\t],' : '\t]'); - }); - contents.push('});'); - emitter.queue(new File({ path: bundle + '.nls.' + language.id + '.js', contents: Buffer.from(contents.join('\n'), 'utf-8') })); - }); - }); - Object.keys(statistics).forEach(key => { - const value = statistics[key]; - log(`${key} has ${value} untranslated strings.`); - }); - sortedLanguages.forEach(language => { - const stats = statistics[language.id]; - if (!stats) { - log(`\tNo translations found for language ${language.id}. Using default language instead.`); } + + emitter.queue(new File({ + contents: Buffer.from(`${fileHeader} +globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(nlsResult)}; +globalThis._VSCODE_NLS_LANGUAGE=${JSON.stringify(language.id)};`), + base, + path: `${base}/nls.messages.${language.id}.js` + })); }); } -export function processNlsFiles(opts: { fileHeader: string; languages: Language[] }): ThroughStream { +export function processNlsFiles(opts: { out: string; fileHeader: string; languages: Language[] }): ThroughStream { return through(function (this: ThroughStream, file: File) { const fileName = path.basename(file.path); - if (fileName === 'nls.metadata.json') { - let json = null; - if (file.isBuffer()) { - json = JSON.parse((file.contents).toString('utf8')); - } else { - this.emit('error', `Failed to read component file: ${file.relative}`); - return; - } - if (BundledFormat.is(json)) { - processCoreBundleFormat(opts.fileHeader, opts.languages, json, this); + if (fileName === 'bundleInfo.json') { // pick a root level file to put the core bundles + try { + const json = JSON.parse(fs.readFileSync(path.join(REPO_ROOT_PATH, opts.out, 'nls.keys.json')).toString()); + if (NLSKeysFormat.is(json)) { + processCoreBundleFormat(file.base, opts.fileHeader, opts.languages, json, this); + } + } catch (error) { + this.emit('error', `Failed to read component file: ${error}`); } } this.queue(file); diff --git a/build/lib/nls.js b/build/lib/nls.js index 48ca84f243317..ae235a5a534b2 100644 --- a/build/lib/nls.js +++ b/build/lib/nls.js @@ -38,21 +38,11 @@ function clone(object) { } return result; } -function template(lines) { - let indent = '', wrap = ''; - if (lines.length > 1) { - indent = '\t'; - wrap = '\n'; - } - return `/*--------------------------------------------------------- - * Copyright (C) Microsoft Corporation. All rights reserved. - *--------------------------------------------------------*/ -define([], [${wrap + lines.map(l => indent + l).join(',\n') + wrap}]);`; -} /** * Returns a stream containing the patched JavaScript and source maps. */ -function nls() { +function nls(options) { + let base; const input = (0, event_stream_1.through)(); const output = input.pipe((0, event_stream_1.through)(function (f) { if (!f.sourceMap) { @@ -70,7 +60,40 @@ function nls() { if (!typescript) { return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`)); } - _nls.patchFiles(f, typescript).forEach(f => this.emit('data', f)); + base = f.base; + this.emit('data', _nls.patchFile(f, typescript, options)); + }, function () { + for (const file of [ + new File({ + contents: Buffer.from(JSON.stringify({ + keys: _nls.moduleToNLSKeys, + messages: _nls.moduleToNLSMessages, + }, null, '\t')), + base, + path: `${base}/nls.metadata.json` + }), + new File({ + contents: Buffer.from(JSON.stringify(_nls.allNLSMessages)), + base, + path: `${base}/nls.messages.json` + }), + new File({ + contents: Buffer.from(JSON.stringify(_nls.allNLSModulesAndKeys)), + base, + path: `${base}/nls.keys.json` + }), + new File({ + contents: Buffer.from(`/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ +globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(_nls.allNLSMessages)};`), + base, + path: `${base}/nls.messages.js` + }) + ]) { + this.emit('data', file); + } + this.emit('end'); })); return (0, event_stream_1.duplex)(input, output); } @@ -79,6 +102,11 @@ function isImportNode(ts, node) { } var _nls; (function (_nls) { + _nls.moduleToNLSKeys = {}; + _nls.moduleToNLSMessages = {}; + _nls.allNLSMessages = []; + _nls.allNLSModulesAndKeys = []; + let allNLSMessagesIndex = 0; function fileFrom(file, contents, path = file.path) { return new File({ contents: Buffer.from(contents), @@ -146,13 +174,6 @@ var _nls; .filter(d => d.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral) .filter(d => d.moduleSpecifier.getText() === '\'vs/nls\'') .filter(d => !!d.importClause && !!d.importClause.namedBindings); - const nlsExpressions = importEqualsDeclarations - .map(d => d.moduleReference.expression) - .concat(importDeclarations.map(d => d.moduleSpecifier)) - .map(d => ({ - start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()), - end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd()) - })); // `nls.localize(...)` calls const nlsLocalizeCallExpressions = importDeclarations .filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport)) @@ -206,8 +227,7 @@ var _nls; value: a[1].getText() })); return { - localizeCalls: localizeCalls.toArray(), - nlsExpressions: nlsExpressions.toArray() + localizeCalls: localizeCalls.toArray() }; } class TextModel { @@ -262,14 +282,10 @@ var _nls; .flatten().toArray().join(''); } } - function patchJavascript(patches, contents, moduleId) { + function patchJavascript(patches, contents) { const model = new TextModel(contents); // patch the localize calls lazy(patches).reverse().each(p => model.apply(p)); - // patch the 'vs/nls' imports - const firstLine = model.get(0); - const patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`); - model.set(0, patchedFirstLine); return model.toString(); } function patchSourcemap(patches, rsm, smc) { @@ -307,14 +323,21 @@ var _nls; } return JSON.parse(smg.toString()); } - function patch(ts, moduleId, typescript, javascript, sourcemap) { - const { localizeCalls, nlsExpressions } = analyze(ts, typescript, 'localize'); - const { localizeCalls: localize2Calls, nlsExpressions: nls2Expressions } = analyze(ts, typescript, 'localize2'); + function parseLocalizeKeyOrValue(sourceExpression) { + // sourceValue can be "foo", 'foo', `foo` or { .... } + // in its evalulated form + // we want to return either the string or the object + // eslint-disable-next-line no-eval + return eval(`(${sourceExpression})`); + } + function patch(ts, typescript, javascript, sourcemap, options) { + const { localizeCalls } = analyze(ts, typescript, 'localize'); + const { localizeCalls: localize2Calls } = analyze(ts, typescript, 'localize2'); if (localizeCalls.length === 0 && localize2Calls.length === 0) { return { javascript, sourcemap }; } - const nlsKeys = template(localizeCalls.map(lc => lc.key).concat(localize2Calls.map(lc => lc.key))); - const nls = template(localizeCalls.map(lc => lc.value).concat(localize2Calls.map(lc => lc.value))); + const nlsKeys = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.key)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.key))); + const nlsMessages = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.value)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.value))); const smc = new sm.SourceMapConsumer(sourcemap); const positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]); // build patches @@ -323,16 +346,18 @@ var _nls; const end = lcFrom(smc.generatedPositionFor(positionFrom(c.range.end))); return { span: { start, end }, content: c.content }; }; - let i = 0; const localizePatches = lazy(localizeCalls) - .map(lc => ([ - { range: lc.keySpan, content: '' + (i++) }, + .map(lc => (options.preserveEnglish ? [ + { range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize('key', "message") => localize(, "message") + ] : [ + { range: lc.keySpan, content: `${allNLSMessagesIndex++}` }, // localize('key', "message") => localize(, null) { range: lc.valueSpan, content: 'null' } ])) .flatten() .map(toPatch); const localize2Patches = lazy(localize2Calls) - .map(lc => ({ range: lc.keySpan, content: '' + (i++) })) + .map(lc => ({ range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize2('key', "message") => localize(, "message") + )) .map(toPatch); // Sort patches by their start position const patches = localizePatches.concat(localize2Patches).toArray().sort((a, b) => { @@ -352,34 +377,29 @@ var _nls; return 0; } }); - javascript = patchJavascript(patches, javascript, moduleId); - // since imports are not within the sourcemap information, - // we must do this MacGyver style - if (nlsExpressions.length || nls2Expressions.length) { - javascript = javascript.replace(/^define\(.*$/m, line => { - return line.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`); - }); - } + javascript = patchJavascript(patches, javascript); sourcemap = patchSourcemap(patches, sourcemap, smc); - return { javascript, sourcemap, nlsKeys, nls }; + return { javascript, sourcemap, nlsKeys, nlsMessages }; } - function patchFiles(javascriptFile, typescript) { + function patchFile(javascriptFile, typescript, options) { const ts = require('typescript'); // hack? const moduleId = javascriptFile.relative .replace(/\.js$/, '') .replace(/\\/g, '/'); - const { javascript, sourcemap, nlsKeys, nls } = patch(ts, moduleId, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap); - const result = [fileFrom(javascriptFile, javascript)]; - result[0].sourceMap = sourcemap; + const { javascript, sourcemap, nlsKeys, nlsMessages } = patch(ts, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap, options); + const result = fileFrom(javascriptFile, javascript); + result.sourceMap = sourcemap; if (nlsKeys) { - result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js'))); + _nls.moduleToNLSKeys[moduleId] = nlsKeys; + _nls.allNLSModulesAndKeys.push([moduleId, nlsKeys.map(nlsKey => typeof nlsKey === 'string' ? nlsKey : nlsKey.key)]); } - if (nls) { - result.push(fileFrom(javascriptFile, nls, javascriptFile.path.replace(/\.js$/, '.nls.js'))); + if (nlsMessages) { + _nls.moduleToNLSMessages[moduleId] = nlsMessages; + _nls.allNLSMessages.push(...nlsMessages); } return result; } - _nls.patchFiles = patchFiles; + _nls.patchFile = patchFile; })(_nls || (_nls = {})); //# sourceMappingURL=nls.js.map \ No newline at end of file diff --git a/build/lib/nls.ts b/build/lib/nls.ts index c4ee031b2ebf4..066dc1440c2a2 100644 --- a/build/lib/nls.ts +++ b/build/lib/nls.ts @@ -48,24 +48,11 @@ function clone(object: T): T { return result; } -function template(lines: string[]): string { - let indent = '', wrap = ''; - - if (lines.length > 1) { - indent = '\t'; - wrap = '\n'; - } - - return `/*--------------------------------------------------------- - * Copyright (C) Microsoft Corporation. All rights reserved. - *--------------------------------------------------------*/ -define([], [${wrap + lines.map(l => indent + l).join(',\n') + wrap}]);`; -} - /** * Returns a stream containing the patched JavaScript and source maps. */ -export function nls(): NodeJS.ReadWriteStream { +export function nls(options: { preserveEnglish: boolean }): NodeJS.ReadWriteStream { + let base: string; const input = through(); const output = input.pipe(through(function (f: FileSourceMap) { if (!f.sourceMap) { @@ -87,7 +74,41 @@ export function nls(): NodeJS.ReadWriteStream { return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`)); } - _nls.patchFiles(f, typescript).forEach(f => this.emit('data', f)); + base = f.base; + this.emit('data', _nls.patchFile(f, typescript, options)); + }, function () { + for (const file of [ + new File({ + contents: Buffer.from(JSON.stringify({ + keys: _nls.moduleToNLSKeys, + messages: _nls.moduleToNLSMessages, + }, null, '\t')), + base, + path: `${base}/nls.metadata.json` + }), + new File({ + contents: Buffer.from(JSON.stringify(_nls.allNLSMessages)), + base, + path: `${base}/nls.messages.json` + }), + new File({ + contents: Buffer.from(JSON.stringify(_nls.allNLSModulesAndKeys)), + base, + path: `${base}/nls.keys.json` + }), + new File({ + contents: Buffer.from(`/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ +globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(_nls.allNLSMessages)};`), + base, + path: `${base}/nls.messages.js` + }) + ]) { + this.emit('data', file); + } + + this.emit('end'); })); return duplex(input, output); @@ -99,11 +120,19 @@ function isImportNode(ts: typeof import('typescript'), node: ts.Node): boolean { module _nls { - interface INlsStringResult { + export const moduleToNLSKeys: { [name: string /* module ID */]: ILocalizeKey[] /* keys */ } = {}; + export const moduleToNLSMessages: { [name: string /* module ID */]: string[] /* messages */ } = {}; + export const allNLSMessages: string[] = []; + export const allNLSModulesAndKeys: Array<[string /* module ID */, string[] /* keys */]> = []; + let allNLSMessagesIndex = 0; + + type ILocalizeKey = string | { key: string }; // key might contain metadata for translators and then is not just a string + + interface INlsPatchResult { javascript: string; sourcemap: sm.RawSourceMap; - nls?: string; - nlsKeys?: string; + nlsMessages?: string[]; + nlsKeys?: ILocalizeKey[]; } interface ISpan { @@ -120,7 +149,6 @@ module _nls { interface ILocalizeAnalysisResult { localizeCalls: ILocalizeCall[]; - nlsExpressions: ISpan[]; } interface IPatch { @@ -210,14 +238,6 @@ module _nls { .filter(d => d.moduleSpecifier.getText() === '\'vs/nls\'') .filter(d => !!d.importClause && !!d.importClause.namedBindings); - const nlsExpressions = importEqualsDeclarations - .map(d => (d.moduleReference).expression) - .concat(importDeclarations.map(d => d.moduleSpecifier)) - .map(d => ({ - start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()), - end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd()) - })); - // `nls.localize(...)` calls const nlsLocalizeCallExpressions = importDeclarations .filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport)) @@ -280,8 +300,7 @@ module _nls { })); return { - localizeCalls: localizeCalls.toArray(), - nlsExpressions: nlsExpressions.toArray() + localizeCalls: localizeCalls.toArray() }; } @@ -351,17 +370,12 @@ module _nls { } } - function patchJavascript(patches: IPatch[], contents: string, moduleId: string): string { + function patchJavascript(patches: IPatch[], contents: string): string { const model = new TextModel(contents); // patch the localize calls lazy(patches).reverse().each(p => model.apply(p)); - // patch the 'vs/nls' imports - const firstLine = model.get(0); - const patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`); - model.set(0, patchedFirstLine); - return model.toString(); } @@ -410,16 +424,24 @@ module _nls { return JSON.parse(smg.toString()); } - function patch(ts: typeof import('typescript'), moduleId: string, typescript: string, javascript: string, sourcemap: sm.RawSourceMap): INlsStringResult { - const { localizeCalls, nlsExpressions } = analyze(ts, typescript, 'localize'); - const { localizeCalls: localize2Calls, nlsExpressions: nls2Expressions } = analyze(ts, typescript, 'localize2'); + function parseLocalizeKeyOrValue(sourceExpression: string) { + // sourceValue can be "foo", 'foo', `foo` or { .... } + // in its evalulated form + // we want to return either the string or the object + // eslint-disable-next-line no-eval + return eval(`(${sourceExpression})`); + } + + function patch(ts: typeof import('typescript'), typescript: string, javascript: string, sourcemap: sm.RawSourceMap, options: { preserveEnglish: boolean }): INlsPatchResult { + const { localizeCalls } = analyze(ts, typescript, 'localize'); + const { localizeCalls: localize2Calls } = analyze(ts, typescript, 'localize2'); if (localizeCalls.length === 0 && localize2Calls.length === 0) { return { javascript, sourcemap }; } - const nlsKeys = template(localizeCalls.map(lc => lc.key).concat(localize2Calls.map(lc => lc.key))); - const nls = template(localizeCalls.map(lc => lc.value).concat(localize2Calls.map(lc => lc.value))); + const nlsKeys = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.key)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.key))); + const nlsMessages = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.value)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.value))); const smc = new sm.SourceMapConsumer(sourcemap); const positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]); @@ -430,18 +452,20 @@ module _nls { return { span: { start, end }, content: c.content }; }; - let i = 0; const localizePatches = lazy(localizeCalls) - .map(lc => ([ - { range: lc.keySpan, content: '' + (i++) }, - { range: lc.valueSpan, content: 'null' } - ])) + .map(lc => ( + options.preserveEnglish ? [ + { range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize('key', "message") => localize(, "message") + ] : [ + { range: lc.keySpan, content: `${allNLSMessagesIndex++}` }, // localize('key', "message") => localize(, null) + { range: lc.valueSpan, content: 'null' } + ])) .flatten() .map(toPatch); const localize2Patches = lazy(localize2Calls) .map(lc => ( - { range: lc.keySpan, content: '' + (i++) } + { range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize2('key', "message") => localize(, "message") )) .map(toPatch); @@ -460,45 +484,39 @@ module _nls { } }); - javascript = patchJavascript(patches, javascript, moduleId); - - // since imports are not within the sourcemap information, - // we must do this MacGyver style - if (nlsExpressions.length || nls2Expressions.length) { - javascript = javascript.replace(/^define\(.*$/m, line => { - return line.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`); - }); - } + javascript = patchJavascript(patches, javascript); sourcemap = patchSourcemap(patches, sourcemap, smc); - return { javascript, sourcemap, nlsKeys, nls }; + return { javascript, sourcemap, nlsKeys, nlsMessages }; } - export function patchFiles(javascriptFile: File, typescript: string): File[] { + export function patchFile(javascriptFile: File, typescript: string, options: { preserveEnglish: boolean }): File { const ts = require('typescript') as typeof import('typescript'); // hack? const moduleId = javascriptFile.relative .replace(/\.js$/, '') .replace(/\\/g, '/'); - const { javascript, sourcemap, nlsKeys, nls } = patch( + const { javascript, sourcemap, nlsKeys, nlsMessages } = patch( ts, - moduleId, typescript, javascriptFile.contents.toString(), - (javascriptFile).sourceMap + (javascriptFile).sourceMap, + options ); - const result: File[] = [fileFrom(javascriptFile, javascript)]; - (result[0]).sourceMap = sourcemap; + const result = fileFrom(javascriptFile, javascript); + (result).sourceMap = sourcemap; if (nlsKeys) { - result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js'))); + moduleToNLSKeys[moduleId] = nlsKeys; + allNLSModulesAndKeys.push([moduleId, nlsKeys.map(nlsKey => typeof nlsKey === 'string' ? nlsKey : nlsKey.key)]); } - if (nls) { - result.push(fileFrom(javascriptFile, nls, javascriptFile.path.replace(/\.js$/, '.nls.js'))); + if (nlsMessages) { + moduleToNLSMessages[moduleId] = nlsMessages; + allNLSMessages.push(...nlsMessages); } return result; diff --git a/build/lib/optimize.js b/build/lib/optimize.js index d48235ebf15a1..83527762f7391 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -192,6 +192,7 @@ function optimizeAMDTask(opts) { includeContent: true })) .pipe(opts.languages && opts.languages.length ? (0, i18n_1.processNlsFiles)({ + out: opts.src, fileHeader: bundledFileHeader, languages: opts.languages }) : es.through()); diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index 5b6dee9bf6555..cd269a0f02b6a 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -269,6 +269,7 @@ function optimizeAMDTask(opts: IOptimizeAMDTaskOpts): NodeJS.ReadWriteStream { includeContent: true })) .pipe(opts.languages && opts.languages.length ? processNlsFiles({ + out: opts.src, fileHeader: bundledFileHeader, languages: opts.languages }) : es.through()); diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index cc47b050fb54d..87fea16e97ab9 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -6,6 +6,10 @@ //@ts-check 'use strict'; +/** + * @typedef {import('./vs/nls').INLSConfiguration} INLSConfiguration + */ + // Store the node.js require function in a variable // before loading our AMD loader to avoid issues // when this file is bundled with other files. @@ -31,16 +35,13 @@ globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); const loader = require('./vs/loader'); const bootstrap = require('./bootstrap'); const performance = require('./vs/base/common/performance'); - -// Bootstrap: NLS -const nlsConfig = bootstrap.setupNLS(); +const fs = require('fs'); // Bootstrap: Loader loader.config({ baseUrl: bootstrap.fileUriFromPath(__dirname, { isWindows: process.platform === 'win32' }), catchError: true, nodeRequire, - 'vs/nls': nlsConfig, amdModulesPattern: /^vs\//, recordStats: true }); @@ -52,13 +53,90 @@ if (process.env['ELECTRON_RUN_AS_NODE'] || process.versions['electron']) { }); } -// Pseudo NLS support -if (nlsConfig && nlsConfig.pseudo) { - loader(['vs/nls'], function (/** @type {import('vs/nls')} */nlsPlugin) { - nlsPlugin.setPseudoTranslation(!!nlsConfig.pseudo); - }); +//#region NLS helpers + +/** @type {Promise | undefined} */ +let setupNLSResult = undefined; + +/** + * @returns {Promise} + */ +function setupNLS() { + if (!setupNLSResult) { + setupNLSResult = doSetupNLS(); + } + + return setupNLSResult; } +/** + * @returns {Promise} + */ +async function doSetupNLS() { + performance.mark('code/fork/willLoadNls'); + + /** @type {INLSConfiguration | undefined} */ + let nlsConfig = undefined; + + /** @type {string | undefined} */ + let messagesFile; + if (process.env['VSCODE_NLS_CONFIG']) { + try { + /** @type {INLSConfiguration} */ + nlsConfig = JSON.parse(process.env['VSCODE_NLS_CONFIG']); + if (nlsConfig?.languagePack?.messagesFile) { + messagesFile = nlsConfig.languagePack.messagesFile; + } else if (nlsConfig?.defaultMessagesFile) { + messagesFile = nlsConfig.defaultMessagesFile; + } + + // VSCODE_GLOBALS: NLS + globalThis._VSCODE_NLS_LANGUAGE = nlsConfig?.resolvedLanguage; + } catch (e) { + console.error(`Error reading VSCODE_NLS_CONFIG from environment: ${e}`); + } + } + + if ( + process.env['VSCODE_DEV'] || // no NLS support in dev mode + !messagesFile // no NLS messages file + ) { + return undefined; + } + + try { + // VSCODE_GLOBALS: NLS + globalThis._VSCODE_NLS_MESSAGES = JSON.parse((await fs.promises.readFile(messagesFile)).toString()); + } catch (error) { + console.error(`Error reading NLS messages file ${messagesFile}: ${error}`); + + // Mark as corrupt: this will re-create the language pack cache next startup + if (nlsConfig?.languagePack?.corruptMarkerFile) { + try { + await fs.promises.writeFile(nlsConfig.languagePack.corruptMarkerFile, 'corrupted'); + } catch (error) { + console.error(`Error writing corrupted NLS marker file: ${error}`); + } + } + + // Fallback to the default message file to ensure english translation at least + if (nlsConfig?.defaultMessagesFile && nlsConfig.defaultMessagesFile !== messagesFile) { + try { + // VSCODE_GLOBALS: NLS + globalThis._VSCODE_NLS_MESSAGES = JSON.parse((await fs.promises.readFile(nlsConfig.defaultMessagesFile)).toString()); + } catch (error) { + console.error(`Error reading default NLS messages file ${nlsConfig.defaultMessagesFile}: ${error}`); + } + } + } + + performance.mark('code/fork/didLoadNls'); + + return nlsConfig; +} + +//#endregion + /** * @param {string=} entrypoint * @param {(value: any) => void=} onLoad @@ -82,6 +160,8 @@ exports.load = function (entrypoint, onLoad, onError) { onLoad = onLoad || function () { }; onError = onError || function (err) { console.error(err); }; - performance.mark('code/fork/willLoadCode'); - loader([entrypoint], onLoad, onError); + setupNLS().then(() => { + performance.mark('code/fork/willLoadCode'); + loader([entrypoint], onLoad, onError); + }); }; diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index d231657094d88..cd859a847f918 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -82,28 +82,23 @@ developerDeveloperKeybindingsDisposable = registerDeveloperKeybindings(disallowReloadKeybinding); } - // Get the nls configuration into the process.env as early as possible - // @ts-ignore - const nlsConfig = globalThis.MonacoBootstrap.setupNLS(); - - let locale = nlsConfig.availableLanguages['*'] || 'en'; - if (locale === 'zh-tw') { - locale = 'zh-Hant'; - } else if (locale === 'zh-cn') { - locale = 'zh-Hans'; + // VSCODE_GLOBALS: NLS + globalThis._VSCODE_NLS_MESSAGES = configuration.nls.messages; + globalThis._VSCODE_NLS_LANGUAGE = configuration.nls.language; + let language = configuration.nls.language || 'en'; + if (language === 'zh-tw') { + language = 'zh-Hant'; + } else if (language === 'zh-cn') { + language = 'zh-Hans'; } - window.document.documentElement.setAttribute('lang', locale); + window.document.documentElement.setAttribute('lang', language); window['MonacoEnvironment'] = {}; - /** - * @typedef {any} LoaderConfig - */ - /** @type {LoaderConfig} */ + /** @type {any} */ const loaderConfig = { baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out`, - 'vs/nls': nlsConfig, preferScriptTags: true }; @@ -147,13 +142,6 @@ // Configure loader require.config(loaderConfig); - // Handle pseudo NLS - if (nlsConfig.pseudo) { - require(['vs/nls'], function (nlsPlugin) { - nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); - }); - } - // Signal before require() if (typeof options?.beforeRequire === 'function') { options.beforeRequire(configuration); diff --git a/src/bootstrap.js b/src/bootstrap.js index bd0e92e672c10..8be098f41998b 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -22,8 +22,6 @@ }(this, function () { const Module = typeof require === 'function' ? require('module') : undefined; const path = typeof require === 'function' ? require('path') : undefined; - const fs = typeof require === 'function' ? require('fs') : undefined; - const util = typeof require === 'function' ? require('util') : undefined; //#region global bootstrapping @@ -118,141 +116,8 @@ //#endregion - - //#region NLS helpers - - /** - * @returns {{locale?: string, availableLanguages: {[lang: string]: string;}, pseudo?: boolean } | undefined} - */ - function setupNLS() { - - // Get the nls configuration as early as possible. - const process = safeProcess(); - /** @type {{ availableLanguages: {}; loadBundle?: (bundle: string, language: string, cb: (err: Error | undefined, result: string | undefined) => void) => void; _resolvedLanguagePackCoreLocation?: string; _corruptedFile?: string }} */ - let nlsConfig = { availableLanguages: {} }; - if (process && process.env['VSCODE_NLS_CONFIG']) { - try { - nlsConfig = JSON.parse(process.env['VSCODE_NLS_CONFIG']); - } catch (e) { - // Ignore - } - } - - if (nlsConfig._resolvedLanguagePackCoreLocation) { - const bundles = Object.create(null); - - /** - * @param {string} bundle - * @param {string} language - * @param {(err: Error | undefined, result: string | undefined) => void} cb - */ - nlsConfig.loadBundle = function (bundle, language, cb) { - const result = bundles[bundle]; - if (result) { - cb(undefined, result); - - return; - } - - // @ts-ignore - safeReadNlsFile(nlsConfig._resolvedLanguagePackCoreLocation, `${bundle.replace(/\//g, '!')}.nls.json`).then(function (content) { - const json = JSON.parse(content); - bundles[bundle] = json; - - cb(undefined, json); - }).catch((error) => { - try { - if (nlsConfig._corruptedFile) { - safeWriteNlsFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); - } - } finally { - cb(error, undefined); - } - }); - }; - } - - return nlsConfig; - } - - /** - * @returns {typeof import('./vs/base/parts/sandbox/electron-sandbox/globals') | undefined} - */ - function safeSandboxGlobals() { - const globals = (typeof self === 'object' ? self : typeof global === 'object' ? global : {}); - - // @ts-ignore - return globals.vscode; - } - - /** - * @returns {import('./vs/base/parts/sandbox/electron-sandbox/globals').ISandboxNodeProcess | NodeJS.Process | undefined} - */ - function safeProcess() { - const sandboxGlobals = safeSandboxGlobals(); - if (sandboxGlobals) { - return sandboxGlobals.process; // Native environment (sandboxed) - } - - if (typeof process !== 'undefined') { - return process; // Native environment (non-sandboxed) - } - - return undefined; - } - - /** - * @returns {import('./vs/base/parts/sandbox/electron-sandbox/electronTypes').IpcRenderer | undefined} - */ - function safeIpcRenderer() { - const sandboxGlobals = safeSandboxGlobals(); - if (sandboxGlobals) { - return sandboxGlobals.ipcRenderer; - } - - return undefined; - } - - /** - * @param {string[]} pathSegments - * @returns {Promise} - */ - async function safeReadNlsFile(...pathSegments) { - const ipcRenderer = safeIpcRenderer(); - if (ipcRenderer) { - return ipcRenderer.invoke('vscode:readNlsFile', ...pathSegments); - } - - if (fs && path && util) { - return (await util.promisify(fs.readFile)(path.join(...pathSegments))).toString(); - } - - throw new Error('Unsupported operation (read NLS files)'); - } - - /** - * @param {string} path - * @param {string} content - * @returns {Promise} - */ - function safeWriteNlsFile(path, content) { - const ipcRenderer = safeIpcRenderer(); - if (ipcRenderer) { - return ipcRenderer.invoke('vscode:writeNlsFile', path, content); - } - - if (fs && util) { - return util.promisify(fs.writeFile)(path, content); - } - - throw new Error('Unsupported operation (write NLS files)'); - } - - //#endregion - return { enableASARSupport, - setupNLS, fileUriFromPath }; })); diff --git a/src/cli.js b/src/cli.js index a8aaa1f0d54c8..686f7ab80c3bb 100644 --- a/src/cli.js +++ b/src/cli.js @@ -6,6 +6,10 @@ //@ts-check 'use strict'; +/** + * @import { IProductConfiguration } from './vs/base/common/product' + */ + // Delete `VSCODE_CWD` very early even before // importing bootstrap files. We have seen // reports where `code .` would use the wrong @@ -16,17 +20,29 @@ delete process.env['VSCODE_CWD']; const bootstrap = require('./bootstrap'); const bootstrapNode = require('./bootstrap-node'); +/** @type {Partial} */ +// @ts-ignore const product = require('../product.json'); +const { resolveNLSConfiguration } = require('./vs/base/node/nls'); -// Enable portable support -// @ts-ignore -bootstrapNode.configurePortable(product); +async function start() { + + // NLS + const nlsConfiguration = await resolveNLSConfiguration({ userLocale: 'en', osLocale: 'en', commit: product.commit, userDataPath: '', nlsMetadataPath: __dirname }); + process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfiguration); // required for `bootstrap-amd` to pick up NLS messages + + // Enable portable support + // @ts-ignore + bootstrapNode.configurePortable(product); + + // Enable ASAR support + bootstrap.enableASARSupport(); -// Enable ASAR support -bootstrap.enableASARSupport(); + // Signal processes that we got launched as CLI + process.env['VSCODE_CLI'] = '1'; -// Signal processes that we got launched as CLI -process.env['VSCODE_CLI'] = '1'; + // Load CLI through AMD loader + require('./bootstrap-amd').load('vs/code/node/cli'); +} -// Load CLI through AMD loader -require('./bootstrap-amd').load('vs/code/node/cli'); +start(); diff --git a/src/main.js b/src/main.js index 1b3d4632fad74..795d8a31729dd 100644 --- a/src/main.js +++ b/src/main.js @@ -8,7 +8,7 @@ /** * @import { IProductConfiguration } from './vs/base/common/product' - * @import { NLSConfiguration } from './vs/base/node/languagePacks' + * @import { INLSConfiguration } from './vs/nls' * @import { NativeParsedArgs } from './vs/platform/environment/common/argv' */ @@ -109,27 +109,29 @@ protocol.registerSchemesAsPrivileged([ registerListeners(); /** - * Support user defined locale: load it early before app('ready') - * to have more things running in parallel. + * We can resolve the NLS configuration early if it is defined + * in argv.json before `app.ready` event. Otherwise we can only + * resolve NLS after `app.ready` event to resolve the OS locale. * - * @type {Promise | undefined} + * @type {Promise | undefined} */ let nlsConfigurationPromise = undefined; -/** - * @type {String} - **/ // Use the most preferred OS language for language recommendation. // The API might return an empty array on Linux, such as when // the 'C' locale is the user's only configured locale. // No matter the OS, if the array is empty, default back to 'en'. -const resolved = app.getPreferredSystemLanguages()?.[0] ?? 'en'; -const osLocale = processZhLocale(resolved.toLowerCase()); -const metaDataFile = path.join(__dirname, 'nls.metadata.json'); -const locale = getUserDefinedLocale(argvConfig); -if (locale) { - const { getNLSConfiguration } = require('./vs/base/node/languagePacks'); - nlsConfigurationPromise = getNLSConfiguration(product.commit, userDataPath, metaDataFile, locale, osLocale); +const osLocale = processZhLocale((app.getPreferredSystemLanguages()?.[0] ?? 'en').toLowerCase()); +const userLocale = getUserDefinedLocale(argvConfig); +if (userLocale) { + const { resolveNLSConfiguration } = require('./vs/base/node/nls'); + nlsConfigurationPromise = resolveNLSConfiguration({ + userLocale, + osLocale, + commit: product.commit, + userDataPath, + nlsMetadataPath: __dirname + }); } // Pass in the locale to Electron so that the @@ -141,7 +143,7 @@ if (locale) { // In that case, use `en` as the Electron locale. if (process.platform === 'win32' || process.platform === 'linux') { - const electronLocale = (!locale || locale === 'qps-ploc') ? 'en' : locale; + const electronLocale = (!userLocale || userLocale === 'qps-ploc') ? 'en' : userLocale; app.commandLine.appendSwitch('lang', electronLocale); } @@ -161,15 +163,28 @@ app.once('ready', function () { } }); +async function onReady() { + perf.mark('code/mainAppReady'); + + try { + const [, nlsConfig] = await Promise.all([ + mkdirpIgnoreError(codeCachePath), + resolveNlsConfiguration() + ]); + + startup(codeCachePath, nlsConfig); + } catch (error) { + console.error(error); + } +} + /** * Main startup routine * * @param {string | undefined} codeCachePath - * @param {NLSConfiguration} nlsConfig + * @param {INLSConfiguration} nlsConfig */ function startup(codeCachePath, nlsConfig) { - nlsConfig._languagePackSupport = true; - process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); process.env['VSCODE_CODE_CACHE_PATH'] = codeCachePath || ''; @@ -180,18 +195,6 @@ function startup(codeCachePath, nlsConfig) { }); } -async function onReady() { - perf.mark('code/mainAppReady'); - - try { - const [, nlsConfig] = await Promise.all([mkdirpIgnoreError(codeCachePath), resolveNlsConfiguration()]); - - startup(codeCachePath, nlsConfig); - } catch (error) { - console.error(error); - } -} - /** * @param {NativeParsedArgs} cliArgs */ @@ -643,35 +646,47 @@ function processZhLocale(appLocale) { /** * Resolve the NLS configuration * - * @return {Promise} + * @return {Promise} */ async function resolveNlsConfiguration() { - // First, we need to test a user defined locale. If it fails we try the app locale. + // First, we need to test a user defined locale. + // If it fails we try the app locale. // If that fails we fall back to English. - let nlsConfiguration = nlsConfigurationPromise ? await nlsConfigurationPromise : undefined; + + const nlsConfiguration = nlsConfigurationPromise ? await nlsConfigurationPromise : undefined; if (nlsConfiguration) { return nlsConfiguration; } - // Try to use the app locale. Please note that the app locale is only - // valid after we have received the app ready event. This is why the - // code is here. + // Try to use the app locale which is only valid + // after the app ready event has been fired. - /** - * @type string - */ - let appLocale = app.getLocale(); - if (!appLocale) { - return { locale: 'en', osLocale, availableLanguages: {} }; + let userLocale = app.getLocale(); + if (!userLocale) { + return { + userLocale: 'en', + osLocale, + resolvedLanguage: 'en', + defaultMessagesFile: path.join(__dirname, 'nls.messages.json'), + + // NLS: below 2 are a relic from old times only used by vscode-nls and deprecated + locale: 'en', + availableLanguages: {} + }; } // See above the comment about the loader and case sensitiveness - appLocale = processZhLocale(appLocale.toLowerCase()); - - const { getNLSConfiguration } = require('./vs/base/node/languagePacks'); - nlsConfiguration = await getNLSConfiguration(product.commit, userDataPath, metaDataFile, appLocale, osLocale); - return nlsConfiguration ?? { locale: 'en', osLocale, availableLanguages: {} }; + userLocale = processZhLocale(userLocale.toLowerCase()); + + const { resolveNLSConfiguration } = require('./vs/base/node/nls'); + return resolveNLSConfiguration({ + userLocale, + osLocale, + commit: product.commit, + userDataPath, + nlsMetadataPath: __dirname + }); } /** @@ -689,7 +704,7 @@ function getUserDefinedLocale(argvConfig) { return locale.toLowerCase(); // a directly provided --locale always wins } - return argvConfig.locale && typeof argvConfig.locale === 'string' ? argvConfig.locale.toLowerCase() : undefined; + return typeof argvConfig?.locale === 'string' ? argvConfig.locale.toLowerCase() : undefined; } //#endregion diff --git a/src/server-cli.js b/src/server-cli.js index fdfdac48b9959..3479ae3f1d674 100644 --- a/src/server-cli.js +++ b/src/server-cli.js @@ -4,18 +4,36 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check +'use strict'; + +/** + * @import { IProductConfiguration } from './vs/base/common/product' + */ const path = require('path'); +/** @type {Partial} */ +// @ts-ignore +const product = require('../product.json'); +const { resolveNLSConfiguration } = require('./vs/base/node/nls'); + +async function start() { -// Keep bootstrap-amd.js from redefining 'fs'. -delete process.env['ELECTRON_RUN_AS_NODE']; + // Keep bootstrap-amd.js from redefining 'fs'. + delete process.env['ELECTRON_RUN_AS_NODE']; -if (process.env['VSCODE_DEV']) { - // When running out of sources, we need to load node modules from remote/node_modules, - // which are compiled against nodejs, not electron - process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] = process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] || path.join(__dirname, '..', 'remote', 'node_modules'); - require('./bootstrap-node').injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); -} else { - delete process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']; + // NLS + const nlsConfiguration = await resolveNLSConfiguration({ userLocale: 'en', osLocale: 'en', commit: product.commit, userDataPath: '', nlsMetadataPath: __dirname }); + process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfiguration); // required for `bootstrap-amd` to pick up NLS messages + + if (process.env['VSCODE_DEV']) { + // When running out of sources, we need to load node modules from remote/node_modules, + // which are compiled against nodejs, not electron + process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] = process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] || path.join(__dirname, '..', 'remote', 'node_modules'); + require('./bootstrap-node').injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); + } else { + delete process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']; + } + require('./bootstrap-amd').load('vs/server/node/server.cli'); } -require('./bootstrap-amd').load('vs/server/node/server.cli'); + +start(); diff --git a/src/server-main.js b/src/server-main.js index e5feac4a62760..18f700a404fdf 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -4,6 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check +'use strict'; + +/** + * @import { IProductConfiguration } from './vs/base/common/product' + * @import { INLSConfiguration } from './vs/nls' + */ /** * @import { IServerAPI } from './vs/server/node/remoteExtensionHostAgentServer' @@ -11,9 +17,12 @@ const perf = require('./vs/base/common/performance'); const performance = require('perf_hooks').performance; +/** @type {Partial} */ +// @ts-ignore const product = require('../product.json'); const readline = require('readline'); const http = require('http'); +const { resolveNLSConfiguration } = require('./vs/base/node/nls'); perf.mark('code/server/start'); // @ts-ignore @@ -42,8 +51,10 @@ async function start() { const shouldSpawnCli = parsedArgs.help || parsedArgs.version || extensionLookupArgs.some(a => !!parsedArgs[a]) || (extensionInstallArgs.some(a => !!parsedArgs[a]) && !parsedArgs['start-server']); + const nlsConfiguration = await resolveNLSConfiguration({ userLocale: 'en', osLocale: 'en', commit: product.commit, userDataPath: '', nlsMetadataPath: __dirname }); + if (shouldSpawnCli) { - loadCode().then((mod) => { + loadCode(nlsConfiguration).then((mod) => { mod.spawnCli(); }); return; @@ -56,7 +67,7 @@ async function start() { /** @returns {Promise} */ const getRemoteExtensionHostAgentServer = () => { if (!_remoteExtensionHostAgentServerPromise) { - _remoteExtensionHostAgentServerPromise = loadCode().then(async (mod) => { + _remoteExtensionHostAgentServerPromise = loadCode(nlsConfiguration).then(async (mod) => { const server = await mod.createServer(address); _remoteExtensionHostAgentServer = server; return server; @@ -249,13 +260,19 @@ async function findFreePort(host, start, end) { return undefined; } -/** @returns { Promise } */ -function loadCode() { +/** + * @param {INLSConfiguration} nlsConfiguration + * @returns { Promise } + */ +function loadCode(nlsConfiguration) { return new Promise((resolve, reject) => { const path = require('path'); delete process.env['ELECTRON_RUN_AS_NODE']; // Keep bootstrap-amd.js from redefining 'fs'. + /** @type {INLSConfiguration} */ + process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfiguration); // required for `bootstrap-amd` to pick up NLS messages + // See https://github.com/microsoft/vscode-remote-release/issues/6543 // We would normally install a SIGPIPE listener in bootstrap.js // But in certain situations, the console itself can be in a broken pipe state @@ -308,5 +325,4 @@ function prompt(question) { }); } - start(); diff --git a/src/tsconfig.monaco.json b/src/tsconfig.monaco.json index 988f0485713ce..8f955fa3c9fc4 100644 --- a/src/tsconfig.monaco.json +++ b/src/tsconfig.monaco.json @@ -19,6 +19,7 @@ "typings/require.d.ts", "typings/thenable.d.ts", "typings/vscode-globals-product.d.ts", + "typings/vscode-globals-nls.d.ts", "vs/loader.d.ts", "vs/monaco.d.ts", "vs/editor/*", diff --git a/src/typings/vscode-globals-nls.d.ts b/src/typings/vscode-globals-nls.d.ts new file mode 100644 index 0000000000000..bc480767623d5 --- /dev/null +++ b/src/typings/vscode-globals-nls.d.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// AMD2ESM mirgation relevant + +/** + * NLS Globals: these need to be defined in all contexts that make + * use of our `nls.localize` and `nls.localize2` functions. This includes: + * - Electron main process + * - Electron window (renderer) process + * - Utility Process + * - Node.js + * - Browser + * - Web worker + * + * That is because during build time we strip out all english strings from + * the resulting JS code and replace it with a that is then looked + * up from the `_VSCODE_NLS_MESSAGES` array. + */ +declare global { + /** + * All NLS messages produced by `localize` and `localize2` calls + * under `src/vs` translated to the language as indicated by + * `_VSCODE_NLS_LANGUAGE`. + */ + var _VSCODE_NLS_MESSAGES: string[]; + /** + * The actual language of the NLS messages (e.g. 'en', de' or 'pt-br'). + */ + var _VSCODE_NLS_LANGUAGE: string | undefined; +} + +// fake export to make global work +export { } diff --git a/src/vs/base/browser/defaultWorkerFactory.ts b/src/vs/base/browser/defaultWorkerFactory.ts index 71391b063f332..834fa4d3c1a21 100644 --- a/src/vs/base/browser/defaultWorkerFactory.ts +++ b/src/vs/base/browser/defaultWorkerFactory.ts @@ -50,27 +50,35 @@ export function getWorkerBootstrapUrl(scriptPath: string, label: string): string if (/^((http:)|(https:)|(file:))/.test(scriptPath) && scriptPath.substring(0, globalThis.origin.length) !== globalThis.origin) { // this is the cross-origin case // i.e. the webpage is running at a different origin than where the scripts are loaded from - const myPath = 'vs/base/worker/defaultWorkerFactory.js'; - const workerBaseUrl = require.toUrl(myPath).slice(0, -myPath.length); // explicitly using require.toUrl(), see https://github.com/microsoft/vscode/issues/107440#issuecomment-698982321 - const js = `/*${label}*/globalThis.MonacoEnvironment={baseUrl: '${workerBaseUrl}'};const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });importScripts(ttPolicy?.createScriptURL('${scriptPath}') ?? '${scriptPath}');/*${label}*/`; - const blob = new Blob([js], { type: 'application/javascript' }); - return URL.createObjectURL(blob); - } - - const start = scriptPath.lastIndexOf('?'); - const end = scriptPath.lastIndexOf('#', start); - const params = start > 0 - ? new URLSearchParams(scriptPath.substring(start + 1, ~end ? end : undefined)) - : new URLSearchParams(); - - COI.addSearchParam(params, true, true); - const search = params.toString(); - - if (!search) { - return `${scriptPath}#${label}`; } else { - return `${scriptPath}?${params.toString()}#${label}`; + const start = scriptPath.lastIndexOf('?'); + const end = scriptPath.lastIndexOf('#', start); + const params = start > 0 + ? new URLSearchParams(scriptPath.substring(start + 1, ~end ? end : undefined)) + : new URLSearchParams(); + + COI.addSearchParam(params, true, true); + const search = params.toString(); + if (!search) { + scriptPath = `${scriptPath}#${label}`; + } else { + scriptPath = `${scriptPath}?${params.toString()}#${label}`; + } } + + const factoryModuleId = 'vs/base/worker/defaultWorkerFactory.js'; + const workerBaseUrl = require.toUrl(factoryModuleId).slice(0, -factoryModuleId.length); // explicitly using require.toUrl(), see https://github.com/microsoft/vscode/issues/107440#issuecomment-698982321 + const blob = new Blob([[ + `/*${label}*/`, + `globalThis.MonacoEnvironment = { baseUrl: '${workerBaseUrl}' };`, + // VSCODE_GLOBALS: NLS + `globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(globalThis._VSCODE_NLS_MESSAGES)};`, + `globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(globalThis._VSCODE_NLS_LANGUAGE)};`, + `const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });`, + `importScripts(ttPolicy?.createScriptURL('${scriptPath}') ?? '${scriptPath}');`, + `/*${label}*/` + ].join('')], { type: 'application/javascript' }); + return URL.createObjectURL(blob); } // ESM-comment-end @@ -136,8 +144,6 @@ class WebWorker extends Disposable implements IWorker { } }); } - - } export class DefaultWorkerFactory implements IWorkerFactory { diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index 2251c7db5ba04..d931e64dfa9e6 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -2,6 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + import * as nls from 'vs/nls'; export const LANGUAGE_DEFAULT = 'en'; @@ -22,13 +23,6 @@ let _platformLocale: string = LANGUAGE_DEFAULT; let _translationsConfigFile: string | undefined = undefined; let _userAgent: string | undefined = undefined; -interface NLSConfig { - locale: string; - osLocale: string; - availableLanguages: { [key: string]: string }; - _translationsConfigFile: string; -} - export interface IProcessEnvironment { [key: string]: string | undefined; } @@ -89,13 +83,11 @@ if (typeof nodeProcess === 'object') { const rawNlsConfig = nodeProcess.env['VSCODE_NLS_CONFIG']; if (rawNlsConfig) { try { - const nlsConfig: NLSConfig = JSON.parse(rawNlsConfig); - const resolved = nlsConfig.availableLanguages['*']; - _locale = nlsConfig.locale; + const nlsConfig: nls.INLSConfiguration = JSON.parse(rawNlsConfig); + _locale = nlsConfig.userLocale; _platformLocale = nlsConfig.osLocale; - // VSCode's default language is 'en' - _language = resolved ? resolved : LANGUAGE_DEFAULT; - _translationsConfigFile = nlsConfig._translationsConfigFile; + _language = nlsConfig.resolvedLanguage || LANGUAGE_DEFAULT; + _translationsConfigFile = nlsConfig.languagePack?.translationsConfigFile; } catch (e) { } } @@ -111,18 +103,10 @@ else if (typeof navigator === 'object' && !isElectronRenderer) { _isLinux = _userAgent.indexOf('Linux') >= 0; _isMobile = _userAgent?.indexOf('Mobi') >= 0; _isWeb = true; - - const configuredLocale = nls.getConfiguredDefaultLocale( - // This call _must_ be done in the file that calls `nls.getConfiguredDefaultLocale` - // to ensure that the NLS AMD Loader plugin has been loaded and configured. - // This is because the loader plugin decides what the default locale is based on - // how it's able to resolve the strings. - nls.localize({ key: 'ensureLoaderPluginIsLoaded', comment: ['{Locked}'] }, '_') - ); - - _locale = configuredLocale || LANGUAGE_DEFAULT; - _language = _locale; - _platformLocale = navigator.language; + // VSCODE_GLOBALS: NLS + _language = globalThis._VSCODE_NLS_LANGUAGE || LANGUAGE_DEFAULT; + _locale = navigator.language.toLowerCase(); + _platformLocale = _locale; } // Unknown environment @@ -178,7 +162,7 @@ export const userAgent = _userAgent; /** * The language used for the user interface. The format of * the string is all lower case (e.g. zh-tw for Traditional - * Chinese) + * Chinese or de for German) */ export const language = _language; @@ -204,15 +188,16 @@ export namespace Language { } /** - * The OS locale or the locale specified by --locale. The format of - * the string is all lower case (e.g. zh-tw for Traditional - * Chinese). The UI is not necessarily shown in the provided locale. + * Desktop: The OS locale or the locale specified by --locale or `argv.json`. + * Web: matches `platformLocale`. + * + * The UI is not necessarily shown in the provided locale. */ export const locale = _locale; /** * This will always be set to the OS/browser's locale regardless of - * what was specified by --locale. The format of the string is all + * what was specified otherwise. The format of the string is all * lower case (e.g. zh-tw for Traditional Chinese). The UI is not * necessarily shown in the provided locale. */ diff --git a/src/vs/base/node/languagePacks.d.ts b/src/vs/base/node/languagePacks.d.ts deleted file mode 100644 index 5dd1b1f1ee9c2..0000000000000 --- a/src/vs/base/node/languagePacks.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export interface NLSConfiguration { - locale: string; - osLocale: string; - availableLanguages: { - [key: string]: string; - }; - pseudo?: boolean; - _languagePackSupport?: boolean; -} - -export interface InternalNLSConfiguration extends NLSConfiguration { - _languagePackId: string; - _translationsConfigFile: string; - _cacheRoot: string; - _resolvedLanguagePackCoreLocation: string; - _corruptedFile: string; - _languagePackSupport?: boolean; -} - -export function getNLSConfiguration(commit: string | undefined, userDataPath: string, metaDataFile: string, locale: string, osLocale: string): Promise; diff --git a/src/vs/base/node/languagePacks.js b/src/vs/base/node/languagePacks.js deleted file mode 100644 index 0d3d1acf6a30e..0000000000000 --- a/src/vs/base/node/languagePacks.js +++ /dev/null @@ -1,264 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/// - -//@ts-check -(function () { - 'use strict'; - - /** - * @param {typeof import('path')} path - * @param {typeof import('fs')} fs - * @param {typeof import('../common/performance')} perf - */ - function factory(path, fs, perf) { - - /** - * @param {string} file - * @returns {Promise} - */ - function exists(file) { - return new Promise(c => fs.exists(file, c)); - } - - /** - * @param {string} file - * @returns {Promise} - */ - function touch(file) { - return new Promise((c, e) => { const d = new Date(); fs.utimes(file, d, d, err => err ? e(err) : c()); }); - } - - /** - * @param {string} dir - * @returns {Promise} - */ - function mkdirp(dir) { - return new Promise((c, e) => fs.mkdir(dir, { recursive: true }, err => (err && err.code !== 'EEXIST') ? e(err) : c(dir))); - } - - /** - * @param {string} location - * @returns {Promise} - */ - function rimraf(location) { - return new Promise((c, e) => fs.rm(location, { recursive: true, force: true, maxRetries: 3 }, err => err ? e(err) : c())); - } - - /** - * @param {string} file - * @returns {Promise} - */ - function readFile(file) { - return new Promise((c, e) => fs.readFile(file, 'utf8', (err, data) => err ? e(err) : c(data))); - } - - /** - * @param {string} file - * @param {string} content - * @returns {Promise} - */ - function writeFile(file, content) { - return new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c())); - } - - /** - * @param {string} userDataPath - * @returns {Promise} - */ - async function getLanguagePackConfigurations(userDataPath) { - const configFile = path.join(userDataPath, 'languagepacks.json'); - try { - return JSON.parse(await readFile(configFile)); - } catch (err) { - // Do nothing. If we can't read the file we have no - // language pack config. - } - return undefined; - } - - /** - * @param {object} config - * @param {string | undefined} locale - */ - function resolveLanguagePackLocale(config, locale) { - try { - while (locale) { - if (config[locale]) { - return locale; - } else { - const index = locale.lastIndexOf('-'); - if (index > 0) { - locale = locale.substring(0, index); - } else { - return undefined; - } - } - } - } catch (err) { - console.error('Resolving language pack configuration failed.', err); - } - return undefined; - } - - /** - * @param {string | undefined} commit - * @param {string} userDataPath - * @param {string} metaDataFile - * @param {string} locale - * @param {string} osLocale - * @returns {Promise} - */ - function getNLSConfiguration(commit, userDataPath, metaDataFile, locale, osLocale) { - const defaultResult = function (locale) { - perf.mark('code/didGenerateNls'); - return Promise.resolve({ locale, osLocale, availableLanguages: {} }); - }; - - perf.mark('code/willGenerateNls'); - - if (locale === 'pseudo') { - return Promise.resolve({ locale, osLocale, availableLanguages: {}, pseudo: true }); - } - - if (process.env['VSCODE_DEV']) { - return Promise.resolve({ locale, osLocale, availableLanguages: {} }); - } - - // We have a built version so we have extracted nls file. Try to find - // the right file to use. - - // Check if we have an English or English US locale. If so fall to default since that is our - // English translation (we don't ship *.nls.en.json files) - if (locale && (locale === 'en' || locale === 'en-us')) { - return Promise.resolve({ locale, osLocale, availableLanguages: {} }); - } - - const initialLocale = locale; - - try { - if (!commit) { - return defaultResult(initialLocale); - } - return getLanguagePackConfigurations(userDataPath).then(configs => { - if (!configs) { - return defaultResult(initialLocale); - } - const resolvedLocale = resolveLanguagePackLocale(configs, locale); - if (!resolvedLocale) { - return defaultResult(initialLocale); - } - locale = resolvedLocale; - const packConfig = configs[locale]; - let mainPack; - if (!packConfig || typeof packConfig.hash !== 'string' || !packConfig.translations || typeof (mainPack = packConfig.translations['vscode']) !== 'string') { - return defaultResult(initialLocale); - } - return exists(mainPack).then(fileExists => { - if (!fileExists) { - return defaultResult(initialLocale); - } - const packId = packConfig.hash + '.' + locale; - const cacheRoot = path.join(userDataPath, 'clp', packId); - const coreLocation = path.join(cacheRoot, commit); - const translationsConfigFile = path.join(cacheRoot, 'tcf.json'); - const corruptedFile = path.join(cacheRoot, 'corrupted.info'); - const result = { - locale: initialLocale, - osLocale, - availableLanguages: { '*': locale }, - _languagePackId: packId, - _translationsConfigFile: translationsConfigFile, - _cacheRoot: cacheRoot, - _resolvedLanguagePackCoreLocation: coreLocation, - _corruptedFile: corruptedFile - }; - return exists(corruptedFile).then(corrupted => { - // The nls cache directory is corrupted. - let toDelete; - if (corrupted) { - toDelete = rimraf(cacheRoot); - } else { - toDelete = Promise.resolve(undefined); - } - return toDelete.then(() => { - return exists(coreLocation).then(fileExists => { - if (fileExists) { - // We don't wait for this. No big harm if we can't touch - touch(coreLocation).catch(() => { }); - perf.mark('code/didGenerateNls'); - return result; - } - return mkdirp(coreLocation).then(() => { - return Promise.all([readFile(metaDataFile), readFile(mainPack)]); - }).then(values => { - const metadata = JSON.parse(values[0]); - const packData = JSON.parse(values[1]).contents; - const bundles = Object.keys(metadata.bundles); - const writes = []; - for (const bundle of bundles) { - const modules = metadata.bundles[bundle]; - const target = Object.create(null); - for (const module of modules) { - const keys = metadata.keys[module]; - const defaultMessages = metadata.messages[module]; - const translations = packData[module]; - let targetStrings; - if (translations) { - targetStrings = []; - for (let i = 0; i < keys.length; i++) { - const elem = keys[i]; - const key = typeof elem === 'string' ? elem : elem.key; - let translatedMessage = translations[key]; - if (translatedMessage === undefined) { - translatedMessage = defaultMessages[i]; - } - targetStrings.push(translatedMessage); - } - } else { - targetStrings = defaultMessages; - } - target[module] = targetStrings; - } - writes.push(writeFile(path.join(coreLocation, bundle.replace(/\//g, '!') + '.nls.json'), JSON.stringify(target))); - } - writes.push(writeFile(translationsConfigFile, JSON.stringify(packConfig.translations))); - return Promise.all(writes); - }).then(() => { - perf.mark('code/didGenerateNls'); - return result; - }).catch(err => { - console.error('Generating translation files failed.', err); - return defaultResult(locale); - }); - }); - }); - }); - }); - }); - } catch (err) { - console.error('Generating translation files failed.', err); - return defaultResult(locale); - } - } - - return { - getNLSConfiguration - }; - } - - if (typeof define === 'function') { - // amd - define(['path', 'fs', 'vs/base/common/performance'], function (/** @type {typeof import('path')} */ path, /** @type {typeof import('fs')} */ fs, /** @type {typeof import('../common/performance')} */ perf) { return factory(path, fs, perf); }); - } else if (typeof module === 'object' && typeof module.exports === 'object') { - const path = require('path'); - const fs = require('fs'); - const perf = require('../common/performance'); - module.exports = factory(path, fs, perf); - } else { - throw new Error('Unknown context'); - } -}()); diff --git a/src/vs/base/node/nls.d.ts b/src/vs/base/node/nls.d.ts new file mode 100644 index 0000000000000..94ef503e4e31f --- /dev/null +++ b/src/vs/base/node/nls.d.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { INLSConfiguration } from 'vs/nls'; + +export interface IResolveNLSConfigurationContext { + + /** + * Location where `nls.messages.json` and `nls.keys.json` are stored. + */ + readonly nlsMetadataPath: string; + + /** + * Path to the user data directory. Used as a cache for + * language packs converted to the format we need. + */ + readonly userDataPath: string; + + /** + * Commit of the running application. Can be `undefined` + * when not built. + */ + readonly commit: string | undefined; + + /** + * Locale as defined in `argv.json` or `app.getLocale()`. + */ + readonly userLocale: string; + + /** + * Locale as defined by the OS (e.g. `app.getPreferredSystemLanguages()`). + */ + readonly osLocale: string; +} + +export function resolveNLSConfiguration(context: IResolveNLSConfigurationContext): Promise; diff --git a/src/vs/base/node/nls.js b/src/vs/base/node/nls.js new file mode 100644 index 0000000000000..d4bac146516a2 --- /dev/null +++ b/src/vs/base/node/nls.js @@ -0,0 +1,288 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/// + +//@ts-check +'use strict'; + +/** + * @import { INLSConfiguration, ILanguagePacks } from '../../nls' + * @import { IResolveNLSConfigurationContext } from './nls' + */ + +(function () { + + /** + * @param {typeof import('path')} path + * @param {typeof import('fs')} fs + * @param {typeof import('../common/performance')} perf + */ + function factory(path, fs, perf) { + + //#region fs helpers + + /** + * @param {string} path + */ + async function exists(path) { + try { + await fs.promises.access(path); + + return true; + } catch { + return false; + } + } + + /** + * @param {string} path + */ + function touch(path) { + const date = new Date(); + return fs.promises.utimes(path, date, date); + } + + /** + * @param {string} path + */ + function mkdirp(path) { + return fs.promises.mkdir(path, { recursive: true }); + } + + /** + * @param {string} path + */ + function rimraf(path) { + return fs.promises.rm(path, { recursive: true, force: true, maxRetries: 3 }); + } + + /** + * @param {string} path + */ + function readFile(path) { + return fs.promises.readFile(path, 'utf-8'); + } + + /** + * @param {string} path + * @param {string} content + */ + function writeFile(path, content) { + return fs.promises.writeFile(path, content, 'utf-8'); + } + + //#endregion + + /** + * The `languagepacks.json` file is a JSON file that contains all metadata + * about installed language extensions per language. Specifically, for + * core (`vscode`) and all extensions it supports, it points to the related + * translation files. + * + * The file is updated whenever a new language pack is installed or removed. + * + * @param {string} userDataPath + * @returns {Promise} + */ + async function getLanguagePackConfigurations(userDataPath) { + const configFile = path.join(userDataPath, 'languagepacks.json'); + try { + return JSON.parse(await readFile(configFile)); + } catch (err) { + return undefined; // Do nothing. If we can't read the file we have no language pack config. + } + } + + /** + * @param {ILanguagePacks} languagePacks + * @param {string | undefined} locale + */ + function resolveLanguagePackLanguage(languagePacks, locale) { + try { + while (locale) { + if (languagePacks[locale]) { + return locale; + } + + const index = locale.lastIndexOf('-'); + if (index > 0) { + locale = locale.substring(0, index); + } else { + return undefined; + } + } + } catch (error) { + console.error('Resolving language pack configuration failed.', error); + } + + return undefined; + } + + /** + * @param {string} userLocale + * @param {string} osLocale + * @param {string} nlsMetadataPath + * @returns {INLSConfiguration} + */ + function defaultNLSConfiguration(userLocale, osLocale, nlsMetadataPath) { + perf.mark('code/didGenerateNls'); + + return { + userLocale, + osLocale, + resolvedLanguage: 'en', + defaultMessagesFile: path.join(nlsMetadataPath, 'nls.messages.json'), + + // NLS: below 2 are a relic from old times only used by vscode-nls and deprecated + locale: 'en', + availableLanguages: {} + }; + } + + /** + * @param {IResolveNLSConfigurationContext} context + * @returns {Promise} + */ + async function resolveNLSConfiguration({ userLocale, osLocale, userDataPath, commit, nlsMetadataPath }) { + perf.mark('code/willGenerateNls'); + + if ( + process.env['VSCODE_DEV'] || + userLocale === 'pseudo' || + userLocale === 'en' || userLocale === 'en-us' || + !commit || + !userDataPath + ) { + return defaultNLSConfiguration(userLocale, osLocale, nlsMetadataPath); + } + + try { + const languagePacks = await getLanguagePackConfigurations(userDataPath); + if (!languagePacks) { + return defaultNLSConfiguration(userLocale, osLocale, nlsMetadataPath); + } + + const resolvedLanguage = resolveLanguagePackLanguage(languagePacks, userLocale); + if (!resolvedLanguage) { + return defaultNLSConfiguration(userLocale, osLocale, nlsMetadataPath); + } + + const languagePack = languagePacks[resolvedLanguage]; + const mainLanguagePackPath = languagePack?.translations?.['vscode']; + if ( + !languagePack || + typeof languagePack.hash !== 'string' || + !languagePack.translations || + typeof mainLanguagePackPath !== 'string' || + !(await exists(mainLanguagePackPath)) + ) { + return defaultNLSConfiguration(userLocale, osLocale, nlsMetadataPath); + } + + const languagePackId = `${languagePack.hash}.${resolvedLanguage}`; + const globalLanguagePackCachePath = path.join(userDataPath, 'clp', languagePackId); + const commitLanguagePackCachePath = path.join(globalLanguagePackCachePath, commit); + const languagePackMessagesFile = path.join(commitLanguagePackCachePath, 'nls.messages.json'); + const translationsConfigFile = path.join(globalLanguagePackCachePath, 'tcf.json'); + const languagePackCorruptMarkerFile = path.join(globalLanguagePackCachePath, 'corrupted.info'); + + if (await exists(languagePackCorruptMarkerFile)) { + await rimraf(globalLanguagePackCachePath); // delete corrupted cache folder + } + + /** @type {INLSConfiguration} */ + const result = { + userLocale, + osLocale, + resolvedLanguage, + defaultMessagesFile: path.join(nlsMetadataPath, 'nls.messages.json'), + languagePack: { + translationsConfigFile, + messagesFile: languagePackMessagesFile, + corruptMarkerFile: languagePackCorruptMarkerFile + }, + + // NLS: below properties are a relic from old times only used by vscode-nls and deprecated + locale: userLocale, + availableLanguages: { '*': resolvedLanguage }, + _languagePackId: languagePackId, + _languagePackSupport: true, + _translationsConfigFile: translationsConfigFile, + _cacheRoot: globalLanguagePackCachePath, + _resolvedLanguagePackCoreLocation: commitLanguagePackCachePath, + _corruptedFile: languagePackCorruptMarkerFile + }; + + if (await exists(commitLanguagePackCachePath)) { + touch(commitLanguagePackCachePath).catch(() => { }); // We don't wait for this. No big harm if we can't touch + perf.mark('code/didGenerateNls'); + return result; + } + + /** @type {[unknown, Array<[string, string[]]>, string[], { contents: Record> }]} */ + // ^moduleId ^nlsKeys ^moduleId ^nlsKey ^nlsValue + const [ + , + nlsDefaultKeys, + nlsDefaultMessages, + nlsPackdata + ] = await Promise.all([ + mkdirp(commitLanguagePackCachePath), + JSON.parse(await readFile(path.join(nlsMetadataPath, 'nls.keys.json'))), + JSON.parse(await readFile(path.join(nlsMetadataPath, 'nls.messages.json'))), + JSON.parse(await readFile(mainLanguagePackPath)) + ]); + + /** @type {string[]} */ + const nlsResult = []; + + // We expect NLS messages to be in a flat array in sorted order as they + // where produced during build time. We use `nls.keys.json` to know the + // right order and then lookup the related message from the translation. + // If a translation does not exist, we fallback to the default message. + + let nlsIndex = 0; + for (const [moduleId, nlsKeys] of nlsDefaultKeys) { + const moduleTranslations = nlsPackdata.contents[moduleId]; + for (const nlsKey of nlsKeys) { + nlsResult.push(moduleTranslations?.[nlsKey] || nlsDefaultMessages[nlsIndex]); + nlsIndex++; + } + } + + await Promise.all([ + writeFile(languagePackMessagesFile, JSON.stringify(nlsResult)), + writeFile(translationsConfigFile, JSON.stringify(languagePack.translations)) + ]); + + perf.mark('code/didGenerateNls'); + + return result; + } catch (error) { + console.error('Generating translation files failed.', error); + } + + return defaultNLSConfiguration(userLocale, osLocale, nlsMetadataPath); + } + + return { + resolveNLSConfiguration + }; + } + + if (typeof define === 'function') { + // amd + define(['path', 'fs', 'vs/base/common/performance'], function (/** @type {typeof import('path')} */ path, /** @type {typeof import('fs')} */ fs, /** @type {typeof import('../common/performance')} */ perf) { return factory(path, fs, perf); }); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + // commonjs + const path = require('path'); + const fs = require('fs'); + const perf = require('../common/performance'); + module.exports = factory(path, fs, perf); + } else { + throw new Error('vs/base/node/nls defined in UNKNOWN context (neither requirejs or commonjs)'); + } +})(); diff --git a/src/vs/base/parts/sandbox/common/sandboxTypes.ts b/src/vs/base/parts/sandbox/common/sandboxTypes.ts index 8c296184f7d25..9b607da8103ab 100644 --- a/src/vs/base/parts/sandbox/common/sandboxTypes.ts +++ b/src/vs/base/parts/sandbox/common/sandboxTypes.ts @@ -53,4 +53,21 @@ export interface ISandboxConfiguration { * Location of V8 code cache. */ codeCachePath?: string; + + /** + * NLS support + */ + nls: { + + /** + * All NLS messages produced by `localize` and `localize2` calls + * under `src/vs`. + */ + messages: string[]; + + /** + * The actual language of the NLS messages (e.g. 'en', de' or 'pt-br'). + */ + language: string | undefined; + }; } diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 700231f035710..019f0b949f098 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -36,25 +36,14 @@ - + + + + diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 1c4a565adec4e..890691d24ef26 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -10,13 +10,12 @@ import { hostname, release } from 'os'; import { VSBuffer } from 'vs/base/common/buffer'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { isSigPipeError, onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; -import { isEqualOrParent } from 'vs/base/common/extpath'; import { Event } from 'vs/base/common/event'; import { parse } from 'vs/base/common/jsonc'; import { getPathLabel } from 'vs/base/common/labels'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas, VSCODE_AUTHORITY } from 'vs/base/common/network'; -import { isAbsolute, join, posix } from 'vs/base/common/path'; +import { join, posix } from 'vs/base/common/path'; import { IProcessEnvironment, isLinux, isLinuxSnap, isMacintosh, isWindows, OS } from 'vs/base/common/platform'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; @@ -496,24 +495,6 @@ export class CodeApplication extends Disposable { return this.resolveShellEnvironment(args, env, false); }); - validatedIpcMain.handle('vscode:writeNlsFile', (event, path: unknown, data: unknown) => { - const uri = this.validateNlsPath([path]); - if (!uri || typeof data !== 'string') { - throw new Error('Invalid operation (vscode:writeNlsFile)'); - } - - return this.fileService.writeFile(uri, VSBuffer.fromString(data)); - }); - - validatedIpcMain.handle('vscode:readNlsFile', async (event, ...paths: unknown[]) => { - const uri = this.validateNlsPath(paths); - if (!uri) { - throw new Error('Invalid operation (vscode:readNlsFile)'); - } - - return (await this.fileService.readFile(uri)).value.toString(); - }); - validatedIpcMain.on('vscode:toggleDevTools', event => event.sender.toggleDevTools()); validatedIpcMain.on('vscode:openDevTools', event => event.sender.openDevTools()); @@ -529,26 +510,6 @@ export class CodeApplication extends Disposable { //#endregion } - private validateNlsPath(pathSegments: unknown[]): URI | undefined { - let path: string | undefined = undefined; - - for (const pathSegment of pathSegments) { - if (typeof pathSegment === 'string') { - if (typeof path !== 'string') { - path = pathSegment; - } else { - path = join(path, pathSegment); - } - } - } - - if (typeof path !== 'string' || !isAbsolute(path) || !isEqualOrParent(path, this.environmentMainService.cachedLanguagesPath, !isLinux)) { - return undefined; - } - - return URI.file(path); - } - private onUnexpectedError(error: Error): void { if (error) { diff --git a/src/vs/code/electron-sandbox/workbench/workbench.js b/src/vs/code/electron-sandbox/workbench/workbench.js index 2583062323776..9f41e508bb3c3 100644 --- a/src/vs/code/electron-sandbox/workbench/workbench.js +++ b/src/vs/code/electron-sandbox/workbench/workbench.js @@ -20,13 +20,12 @@ // Add a perf entry right from the top performance.mark('code/didStartRenderer'); - // Load workbench main JS, CSS and NLS all in parallel. This is an + // Load workbench main JS and CSS all in parallel. This is an // optimization to prevent a waterfall of loading to happen, because // we know for a fact that workbench.desktop.main will depend on - // the related CSS and NLS counterparts. + // the related CSS counterpart. bootstrapWindow.load([ 'vs/workbench/workbench.desktop.main', - 'vs/nls!vs/workbench/workbench.desktop.main', 'vs/css!vs/workbench/workbench.desktop.main' ], function (desktopMain, configuration) { diff --git a/src/vs/nls.ts b/src/vs/nls.ts index 233840e65abff..5a546325fc7a2 100644 --- a/src/vs/nls.ts +++ b/src/vs/nls.ts @@ -3,27 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -let isPseudo = (typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0); -const DEFAULT_TAG = 'i-default'; - -interface INLSPluginConfig { - availableLanguages?: INLSPluginConfigAvailableLanguages; - loadBundle?: BundleLoader; - translationServiceUrl?: string; -} - -export interface INLSPluginConfigAvailableLanguages { - '*'?: string; - [module: string]: string | undefined; -} - -interface BundleLoader { - (bundle: string, locale: string | null, cb: (err: Error, messages: string[] | IBundledStrings) => void): void; -} - -interface IBundledStrings { - [moduleId: string]: string[]; -} +// VSCODE_GLOBALS: NLS +const isPseudo = globalThis._VSCODE_NLS_LANGUAGE === 'pseudo' || (typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0); export interface ILocalizeInfo { key: string; @@ -35,30 +16,6 @@ export interface ILocalizedString { value: string; } -interface ILocalizeFunc { - (info: ILocalizeInfo, message: string, ...args: (string | number | boolean | undefined | null)[]): string; - (key: string, message: string, ...args: (string | number | boolean | undefined | null)[]): string; -} - -interface IBoundLocalizeFunc { - (idx: number, defaultValue: null): string; -} - -interface ILocalize2Func { - (info: ILocalizeInfo, message: string, ...args: (string | number | boolean | undefined | null)[]): ILocalizedString; - (key: string, message: string, ...args: (string | number | boolean | undefined | null)[]): ILocalizedString; -} - -interface IBoundLocalize2Func { - (idx: number, defaultValue: string): ILocalizedString; -} - -interface IConsumerAPI { - localize: ILocalizeFunc | IBoundLocalizeFunc; - localize2: ILocalize2Func | IBoundLocalize2Func; - getConfiguredDefaultLocale(stringFromLocalizeCall: string): string | undefined; -} - function _format(message: string, args: (string | number | boolean | undefined | null)[]): string { let result: string; @@ -86,49 +43,6 @@ function _format(message: string, args: (string | number | boolean | undefined | return result; } -function findLanguageForModule(config: INLSPluginConfigAvailableLanguages, name: string) { - let result = config[name]; - if (result) { - return result; - } - result = config['*']; - if (result) { - return result; - } - return null; -} - -function endWithSlash(path: string): string { - if (path.charAt(path.length - 1) === '/') { - return path; - } - return path + '/'; -} - -async function getMessagesFromTranslationsService(translationServiceUrl: string, language: string, name: string): Promise { - const url = endWithSlash(translationServiceUrl) + endWithSlash(language) + 'vscode/' + endWithSlash(name); - const res = await fetch(url); - if (res.ok) { - const messages = await res.json() as string[] | IBundledStrings; - return messages; - } - throw new Error(`${res.status} - ${res.statusText}`); -} - -function createScopedLocalize(scope: string[]): IBoundLocalizeFunc { - return function (idx: number, defaultValue: null) { - const restArgs = Array.prototype.slice.call(arguments, 2); - return _format(scope[idx], restArgs); - }; -} - -function createScopedLocalize2(scope: string[]): IBoundLocalize2Func { - return (idx: number, defaultValue: string, ...args) => ({ - value: _format(scope[idx], args), - original: _format(defaultValue, args) - }); -} - /** * Marks a string to be localized. Returns the localized string. * @@ -160,10 +74,30 @@ export function localize(key: string, message: string, ...args: (string | number /** * @skipMangle */ -export function localize(data: ILocalizeInfo | string, message: string, ...args: (string | number | boolean | undefined | null)[]): string { +export function localize(data: ILocalizeInfo | string /* | number when built */, message: string /* | null when built */, ...args: (string | number | boolean | undefined | null)[]): string { + if (typeof data === 'number') { + return _format(lookupMessage(data, message), args); + } return _format(message, args); } +/** + * Only used when built: Looks up the message in the global NLS table. + * This table is being made available as a global through bootstrapping + * depending on the target context. + */ +function lookupMessage(index: number, fallback: string | null): string { + // VSCODE_GLOBALS: NLS + const message = globalThis._VSCODE_NLS_MESSAGES?.[index]; + if (typeof message !== 'string') { + if (typeof fallback === 'string') { + return fallback; + } + throw new Error(`!!! NLS MISSING: ${index} !!!`); + } + return message; +} + /** * Marks a string to be localized. Returns an {@linkcode ILocalizedString} * which contains the localized string and the original string. @@ -197,123 +131,107 @@ export function localize2(key: string, message: string, ...args: (string | numbe /** * @skipMangle */ -export function localize2(data: ILocalizeInfo | string, message: string, ...args: (string | number | boolean | undefined | null)[]): ILocalizedString { - const original = _format(message, args); - return { - value: original, - original - }; -} - -/** - * - * @param stringFromLocalizeCall You must pass in a string that was returned from a `nls.localize()` call - * in order to ensure the loader plugin has been initialized before this function is called. - */ -export function getConfiguredDefaultLocale(stringFromLocalizeCall: string): string | undefined; -/** - * @skipMangle - */ -export function getConfiguredDefaultLocale(_: string): string | undefined { - // This returns undefined because this implementation isn't used and is overwritten by the loader - // when loaded. - return undefined; -} +export function localize2(data: ILocalizeInfo | string /* | number when built */, originalMessage: string, ...args: (string | number | boolean | undefined | null)[]): ILocalizedString { + let message: string; + if (typeof data === 'number') { + message = lookupMessage(data, originalMessage); + } else { + message = originalMessage; + } -/** - * @skipMangle - */ -export function setPseudoTranslation(value: boolean) { - isPseudo = value; -} + const value = _format(message, args); -/** - * Invoked in a built product at run-time - * @skipMangle - */ -export function create(key: string, data: IBundledStrings & IConsumerAPI): IConsumerAPI { return { - localize: createScopedLocalize(data[key]), - localize2: createScopedLocalize2(data[key]), - getConfiguredDefaultLocale: data.getConfiguredDefaultLocale ?? ((_: string) => undefined) + value, + original: originalMessage === message ? value : _format(originalMessage, args) }; } -/** - * Invoked by the loader at run-time - * @skipMangle - */ -export function load(name: string, req: AMDLoader.IRelativeRequire, load: AMDLoader.IPluginLoadCallback, config: AMDLoader.IConfigurationOptions): void { - const pluginConfig: INLSPluginConfig = config['vs/nls'] ?? {}; - if (!name || name.length === 0) { - // TODO: We need to give back the mangled names here - return load({ - localize: localize, - localize2: localize2, - getConfiguredDefaultLocale: () => pluginConfig.availableLanguages?.['*'] - } as IConsumerAPI); - } - const language = pluginConfig.availableLanguages ? findLanguageForModule(pluginConfig.availableLanguages, name) : null; - const useDefaultLanguage = language === null || language === DEFAULT_TAG; - let suffix = '.nls'; - if (!useDefaultLanguage) { - suffix = suffix + '.' + language; - } - const messagesLoaded = (messages: string[] | IBundledStrings) => { - if (Array.isArray(messages)) { - (messages as any as IConsumerAPI).localize = createScopedLocalize(messages); - (messages as any as IConsumerAPI).localize2 = createScopedLocalize2(messages); - } else { - (messages as any as IConsumerAPI).localize = createScopedLocalize(messages[name]); - (messages as any as IConsumerAPI).localize2 = createScopedLocalize2(messages[name]); - } - (messages as any as IConsumerAPI).getConfiguredDefaultLocale = () => pluginConfig.availableLanguages?.['*']; - load(messages); - }; - if (typeof pluginConfig.loadBundle === 'function') { - (pluginConfig.loadBundle as BundleLoader)(name, language, (err: Error, messages) => { - // We have an error. Load the English default strings to not fail - if (err) { - req([name + '.nls'], messagesLoaded); - } else { - messagesLoaded(messages); - } - }); - } else if (pluginConfig.translationServiceUrl && !useDefaultLanguage) { - (async () => { - try { - const messages = await getMessagesFromTranslationsService(pluginConfig.translationServiceUrl!, language, name); - return messagesLoaded(messages); - } catch (err) { - // Language is already as generic as it gets, so require default messages - if (!language.includes('-')) { - console.error(err); - return req([name + '.nls'], messagesLoaded); - } - try { - // Since there is a dash, the language configured is a specific sub-language of the same generic language. - // Since we were unable to load the specific language, try to load the generic language. Ex. we failed to find a - // Swiss German (de-CH), so try to load the generic German (de) messages instead. - const genericLanguage = language.split('-')[0]; - const messages = await getMessagesFromTranslationsService(pluginConfig.translationServiceUrl!, genericLanguage, name); - // We got some messages, so we configure the configuration to use the generic language for this session. - pluginConfig.availableLanguages ??= {}; - pluginConfig.availableLanguages['*'] = genericLanguage; - return messagesLoaded(messages); - } catch (err) { - console.error(err); - return req([name + '.nls'], messagesLoaded); - } - } - })(); - } else { - req([name + suffix], messagesLoaded, (err: Error) => { - if (suffix === '.nls') { - console.error('Failed trying to load default language strings', err); - return; - } - console.error(`Failed to load message bundle for language ${language}. Falling back to the default language:`, err); - req([name + '.nls'], messagesLoaded); - }); - } -} +export interface INLSLanguagePackConfiguration { + + /** + * The path to the translations config file that contains pointers to + * all message bundles for `main` and extensions. + */ + readonly translationsConfigFile: string; + + /** + * The path to the file containing the translations for this language + * pack as flat string array. + */ + readonly messagesFile: string; + + /** + * The path to the file that can be used to signal a corrupt language + * pack, for example when reading the `messagesFile` fails. This will + * instruct the application to re-create the cache on next startup. + */ + readonly corruptMarkerFile: string; +} + +export interface INLSConfiguration { + + /** + * Locale as defined in `argv.json` or `app.getLocale()`. + */ + readonly userLocale: string; + + /** + * Locale as defined by the OS (e.g. `app.getPreferredSystemLanguages()`). + */ + readonly osLocale: string; + + /** + * The actual language of the UI that ends up being used considering `userLocale` + * and `osLocale`. + */ + readonly resolvedLanguage: string; + + /** + * Defined if a language pack is used that is not the + * default english language pack. This requires a language + * pack to be installed as extension. + */ + readonly languagePack?: INLSLanguagePackConfiguration; + + /** + * The path to the file containing the default english messages + * as flat string array. The file is only present in built + * versions of the application. + */ + readonly defaultMessagesFile: string; + + /** + * Below properties are deprecated and only there to continue support + * for `vscode-nls` module that depends on them. + * Refs https://github.com/microsoft/vscode-nls/blob/main/src/node/main.ts#L36-L46 + */ + /** @deprecated */ + readonly locale: string; + /** @deprecated */ + readonly availableLanguages: Record; + /** @deprecated */ + readonly _languagePackSupport?: boolean; + /** @deprecated */ + readonly _languagePackId?: string; + /** @deprecated */ + readonly _translationsConfigFile?: string; + /** @deprecated */ + readonly _cacheRoot?: string; + /** @deprecated */ + readonly _resolvedLanguagePackCoreLocation?: string; + /** @deprecated */ + readonly _corruptedFile?: string; +} + +export interface ILanguagePack { + readonly hash: string; + readonly label: string | undefined; + readonly extensions: { + readonly extensionIdentifier: { readonly id: string; readonly uuid?: string }; + readonly version: string; + }[]; + readonly translations: Record; +} + +export type ILanguagePacks = Record; diff --git a/src/vs/platform/environment/electron-main/environmentMainService.ts b/src/vs/platform/environment/electron-main/environmentMainService.ts index 748ff075783dd..dec04406afaf3 100644 --- a/src/vs/platform/environment/electron-main/environmentMainService.ts +++ b/src/vs/platform/environment/electron-main/environmentMainService.ts @@ -19,9 +19,6 @@ export const IEnvironmentMainService = refineServiceDecorator = {}; - @memoize - get cachedLanguagesPath(): string { return join(this.userDataPath, 'clp'); } - @memoize get backupHome(): string { return join(this.userDataPath, 'Backups'); } diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 40f1df2e7be4a..8f7ac7dfcc396 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -81,7 +81,12 @@ export class IssueMainService implements IIssueMainService { arch: arch(), release: release(), }, - product + product, + nls: { + // VSCODE_GLOBALS: NLS + messages: globalThis._VSCODE_NLS_MESSAGES, + language: globalThis._VSCODE_NLS_LANGUAGE + } }); this.issueReporterWindow.loadURL( diff --git a/src/vs/platform/issue/electron-main/processMainService.ts b/src/vs/platform/issue/electron-main/processMainService.ts index 9e2cc9d0fd38f..76da45d897cf9 100644 --- a/src/vs/platform/issue/electron-main/processMainService.ts +++ b/src/vs/platform/issue/electron-main/processMainService.ts @@ -153,7 +153,12 @@ export class ProcessMainService implements IProcessMainService { windowId: this.processExplorerWindow.id, userEnv: this.userEnv, data, - product + product, + nls: { + // VSCODE_GLOBALS: NLS + messages: globalThis._VSCODE_NLS_MESSAGES, + language: globalThis._VSCODE_NLS_LANGUAGE + } }); this.processExplorerWindow.loadURL( diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index fd704a5cfe6b5..290b3f7a67c5f 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -1444,6 +1444,12 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic workspace: options.workspace, userEnv: { ...this.initialUserEnv, ...options.userEnv }, + nls: { + // VSCODE_GLOBALS: NLS + messages: globalThis._VSCODE_NLS_MESSAGES, + language: globalThis._VSCODE_NLS_LANGUAGE + }, + filesToOpenOrCreate: options.filesToOpen?.filesToOpenOrCreate, filesToDiff: options.filesToOpen?.filesToDiff, filesToMerge: options.filesToOpen?.filesToMerge, diff --git a/src/vs/server/node/extensionHostConnection.ts b/src/vs/server/node/extensionHostConnection.ts index 9fbb33d3ece74..f345bd69a2db9 100644 --- a/src/vs/server/node/extensionHostConnection.ts +++ b/src/vs/server/node/extensionHostConnection.ts @@ -43,7 +43,7 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri ...{ VSCODE_AMD_ENTRYPOINT: 'vs/workbench/api/node/extensionHostProcess', VSCODE_HANDLES_UNCAUGHT_ERRORS: 'true', - VSCODE_NLS_CONFIG: JSON.stringify(nlsConfig, undefined, 0) + VSCODE_NLS_CONFIG: JSON.stringify(nlsConfig) }, ...startParamsEnv }; diff --git a/src/vs/server/node/extensionsScannerService.ts b/src/vs/server/node/extensionsScannerService.ts index 5430ae1916281..78dc3bce4f007 100644 --- a/src/vs/server/node/extensionsScannerService.ts +++ b/src/vs/server/node/extensionsScannerService.ts @@ -14,7 +14,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; -import { getNLSConfiguration, InternalNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; +import { getNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; export class ExtensionsScannerService extends AbstractExtensionsScannerService implements IExtensionsScannerService { @@ -38,9 +38,9 @@ export class ExtensionsScannerService extends AbstractExtensionsScannerService i protected async getTranslations(language: string): Promise { const config = await getNLSConfiguration(language, this.nativeEnvironmentService.userDataPath); - if (InternalNLSConfiguration.is(config)) { + if (config.languagePack) { try { - const content = await this.fileService.readFile(URI.file(config._translationsConfigFile)); + const content = await this.fileService.readFile(URI.file(config.languagePack.translationsConfigFile)); return JSON.parse(content.value.toString()); } catch (err) { /* Ignore error */ } } diff --git a/src/vs/server/node/remoteLanguagePacks.ts b/src/vs/server/node/remoteLanguagePacks.ts index 682b6f2b088ad..2a1ea9f5699be 100644 --- a/src/vs/server/node/remoteLanguagePacks.ts +++ b/src/vs/server/node/remoteLanguagePacks.ts @@ -3,46 +3,37 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as fs from 'fs'; import { FileAccess } from 'vs/base/common/network'; -import * as path from 'vs/base/common/path'; - -import * as lp from 'vs/base/node/languagePacks'; +import { join } from 'vs/base/common/path'; +import type { INLSConfiguration } from 'vs/nls'; +import { resolveNLSConfiguration } from 'vs/base/node/nls'; +import { Promises } from 'vs/base/node/pfs'; import product from 'vs/platform/product/common/product'; -const metaData = path.join(FileAccess.asFileUri('').fsPath, 'nls.metadata.json'); -const _cache: Map> = new Map(); +const nlsMetadataPath = join(FileAccess.asFileUri('').fsPath); +const defaultMessagesFile = join(nlsMetadataPath, 'nls.messages.json'); +const nlsConfigurationCache = new Map>(); -function exists(file: string) { - return new Promise(c => fs.exists(file, c)); -} +export async function getNLSConfiguration(language: string, userDataPath: string): Promise { + if (!product.commit || !(await Promises.exists(defaultMessagesFile))) { + return { + userLocale: 'en', + osLocale: 'en', + resolvedLanguage: 'en', + defaultMessagesFile, -export function getNLSConfiguration(language: string, userDataPath: string): Promise { - return exists(metaData).then((fileExists) => { - if (!fileExists || !product.commit) { - // console.log(`==> MetaData or commit unknown. Using default language.`); - // The OS Locale on the remote side really doesn't matter, so we return the default locale - return Promise.resolve({ locale: 'en', osLocale: 'en', availableLanguages: {} }); - } - const key = `${language}||${userDataPath}`; - let result = _cache.get(key); - if (!result) { - // The OS Locale on the remote side really doesn't matter, so we pass in the same language - result = lp.getNLSConfiguration(product.commit, userDataPath, metaData, language, language).then(value => { - if (InternalNLSConfiguration.is(value)) { - value._languagePackSupport = true; - } - return value; - }); - _cache.set(key, result); - } - return result; - }); -} + // NLS: below 2 are a relic from old times only used by vscode-nls and deprecated + locale: 'en', + availableLanguages: {} + }; + } -export namespace InternalNLSConfiguration { - export function is(value: lp.NLSConfiguration): value is lp.InternalNLSConfiguration { - const candidate: lp.InternalNLSConfiguration = value as lp.InternalNLSConfiguration; - return candidate && typeof candidate._languagePackId === 'string'; + const cacheKey = `${language}||${userDataPath}`; + let result = nlsConfigurationCache.get(cacheKey); + if (!result) { + result = resolveNLSConfiguration({ userLocale: language, osLocale: language, commit: product.commit, userDataPath, nlsMetadataPath }); + nlsConfigurationCache.set(cacheKey, result); } + + return result; } diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts index 6dc550b6cf010..20c96da8f1f3d 100644 --- a/src/vs/server/node/webClientServer.ts +++ b/src/vs/server/node/webClientServer.ts @@ -338,12 +338,23 @@ export class WebClientServer { callbackRoute: this._callbackRoute }; - const nlsBaseUrl = this._productService.extensionsGallery?.nlsBaseUrl; + const cookies = cookie.parse(req.headers.cookie || ''); + const locale = cookies['vscode.nls.locale'] || req.headers['accept-language']?.split(',')[0]?.toLowerCase() || 'en'; + let WORKBENCH_NLS_BASE_URL: string | undefined; + let WORKBENCH_NLS_URL: string; + if (!locale.startsWith('en')) { + WORKBENCH_NLS_BASE_URL = `https://www.vscode-unpkg.net/nls/`; + WORKBENCH_NLS_URL = `${WORKBENCH_NLS_BASE_URL}${this._productService.commit}/${this._productService.version}/${locale}/nls.messages.js`; // TODO@bpasero make it a product.json thing + } else { + WORKBENCH_NLS_URL = ''; // fallback will apply + } + const values: { [key: string]: string } = { WORKBENCH_WEB_CONFIGURATION: asJSON(workbenchWebConfiguration), WORKBENCH_AUTH_SESSION: authSessionInfo ? asJSON(authSessionInfo) : '', WORKBENCH_WEB_BASE_URL: this._staticRoute, - WORKBENCH_NLS_BASE_URL: nlsBaseUrl ? `${nlsBaseUrl}${!nlsBaseUrl.endsWith('/') ? '/' : ''}${this._productService.commit}/${this._productService.version}/` : '', + WORKBENCH_NLS_URL, + WORKBENCH_NLS_FALLBACK_URL: `${this._staticRoute}/out/nls.messages.js` }; if (useTestResolver) { @@ -364,13 +375,13 @@ export class WebClientServer { return void res.end('Not found'); } - const webWorkerExtensionHostIframeScriptSHA = 'sha256-75NYUUvf+5++1WbfCZOV3PSWxBhONpaxwx+mkOFRv/Y='; + const webWorkerExtensionHostIframeScriptSHA = 'sha256-V28GQnL3aYxbwgpV3yW1oJ+VKKe/PBSzWntNyH8zVXA='; const cspDirectives = [ 'default-src \'self\';', 'img-src \'self\' https: data: blob:;', 'media-src \'self\';', - `script-src 'self' 'unsafe-eval' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html + `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html 'child-src \'self\';', `frame-src 'self' https://*.vscode-cdn.net data:;`, 'worker-src \'self\' data: blob:;', diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts index 0c8d2e2731728..8f4dc4a6b57a8 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts @@ -181,6 +181,23 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost err.stack = stack; return rejectBarrier(ExtensionHostExitCode.UnexpectedError, err); } + if (event.data.type === 'vscode.bootstrap.nls') { + const factoryModuleId = 'vs/base/worker/workerMain.js'; + const baseUrl = require.toUrl(factoryModuleId).slice(0, -factoryModuleId.length); + iframe.contentWindow!.postMessage({ + type: event.data.type, + data: { + baseUrl, + workerUrl: require.toUrl(factoryModuleId), + nls: { + // VSCODE_GLOBALS: NLS + messages: globalThis._VSCODE_NLS_MESSAGES, + language: globalThis._VSCODE_NLS_LANGUAGE + } + } + }, '*'); + return; + } const { data } = event.data; if (barrier.isOpen() || !(data instanceof MessagePort)) { console.warn('UNEXPECTED message', event); diff --git a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html index 6a16dd10210cb..aded7faefeba7 100644 --- a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html +++ b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html @@ -4,7 +4,7 @@ @@ -66,13 +66,44 @@ } function start() { + + // Before we can load the worker, we need to get the current set of NLS + // configuration into this iframe. We ask the parent window to send it + // together with the necessary information to load the worker via Blob. + + const bootstrapNlsType = 'vscode.bootstrap.nls'; + + self.onmessage = (event) => { + if (event.origin !== parentOrigin || event.data.type !== bootstrapNlsType) { + return; + } + const { data } = event.data; + createWorker(data.baseUrl, data.workerUrl, data.nls.messages, data.nls.language); + }; + + window.parent.postMessage({ + vscodeWebWorkerExtHostId, + type: bootstrapNlsType + }, '*'); + } + + function createWorker(baseUrl, workerUrl, nlsMessages, nlsLanguage) { try { - let workerUrl = '../../../../base/worker/workerMain.js'; if (globalThis.crossOriginIsolated) { workerUrl += '?vscode-coi=2'; // COEP } - const worker = new Worker(workerUrl, { name }); + const blob = new Blob([[ + `/*extensionHostWorker*/`, + `globalThis.MonacoEnvironment = { baseUrl: '${baseUrl}' };`, + // VSCODE_GLOBALS: NLS + `globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(nlsMessages)};`, + `globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(nlsLanguage)};`, + `importScripts('${workerUrl}');`, + `/*extensionHostWorker*/` + ].join('')], { type: 'application/javascript' }); + + const worker = new Worker(URL.createObjectURL(blob), { name }); worker.postMessage('vs/workbench/api/worker/extensionHostWorker'); const nestedWorkers = new Map(); diff --git a/src/vs/workbench/services/localization/browser/localeService.ts b/src/vs/workbench/services/localization/browser/localeService.ts index 0d9c51c72cfb6..07616fa0a2e55 100644 --- a/src/vs/workbench/services/localization/browser/localeService.ts +++ b/src/vs/workbench/services/localization/browser/localeService.ts @@ -14,11 +14,69 @@ import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/ import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ILogService } from 'vs/platform/log/common/log'; +import { getCookieValue } from 'vs/base/browser/dom'; + +const localeStorage = new class LocaleStorage { + + private static readonly LOCAL_STORAGE_LOCALE_KEY = 'vscode.nls.locale'; + private static readonly LOCAL_STORAGE_EXTENSION_ID_KEY = 'vscode.nls.languagePackExtensionId'; + + constructor() { + this.migrateCookie(); // TODO@bpasero remove me eventually + } + + private migrateCookie(): void { + const localeCookieValue = getCookieValue(LocaleStorage.LOCAL_STORAGE_LOCALE_KEY); + const localeStorageValue = localStorage.getItem(LocaleStorage.LOCAL_STORAGE_LOCALE_KEY); + + if ( + (typeof localeCookieValue !== 'string' && typeof localeStorageValue !== 'string') || + (localeCookieValue === localeStorageValue) + ) { + return; // already matching + } + + if (typeof localeStorageValue === 'string') { + this.doSetLocaleToCookie(localeStorageValue); + } else { + this.doClearLocaleToCookie(); + } + } + + setLocale(locale: string): void { + localStorage.setItem(LocaleStorage.LOCAL_STORAGE_LOCALE_KEY, locale); + this.doSetLocaleToCookie(locale); + } + + private doSetLocaleToCookie(locale: string): void { + document.cookie = `${LocaleStorage.LOCAL_STORAGE_LOCALE_KEY}=${locale};path=/;max-age=3153600000`; + } + + clearLocale(): void { + localStorage.removeItem(LocaleStorage.LOCAL_STORAGE_LOCALE_KEY); + this.doClearLocaleToCookie(); + } + + private doClearLocaleToCookie(): void { + document.cookie = `${LocaleStorage.LOCAL_STORAGE_LOCALE_KEY}=;path=/;max-age=0`; + } + + setExtensionId(extensionId: string): void { + localStorage.setItem(LocaleStorage.LOCAL_STORAGE_EXTENSION_ID_KEY, extensionId); + } + + getExtensionId(): string | null { + return localStorage.getItem(LocaleStorage.LOCAL_STORAGE_EXTENSION_ID_KEY); + } + + clearExtensionId(): void { + localStorage.removeItem(LocaleStorage.LOCAL_STORAGE_EXTENSION_ID_KEY); + } +}; export class WebLocaleService implements ILocaleService { + declare readonly _serviceBrand: undefined; - static readonly _LOCAL_STORAGE_EXTENSION_ID_KEY = 'vscode.nls.languagePackExtensionId'; - static readonly _LOCAL_STORAGE_LOCALE_KEY = 'vscode.nls.locale'; constructor( @IDialogService private readonly dialogService: IDialogService, @@ -32,13 +90,13 @@ export class WebLocaleService implements ILocaleService { return; } if (locale) { - localStorage.setItem(WebLocaleService._LOCAL_STORAGE_LOCALE_KEY, locale); + localeStorage.setLocale(locale); if (languagePackItem.extensionId) { - localStorage.setItem(WebLocaleService._LOCAL_STORAGE_EXTENSION_ID_KEY, languagePackItem.extensionId); + localeStorage.setExtensionId(languagePackItem.extensionId); } } else { - localStorage.removeItem(WebLocaleService._LOCAL_STORAGE_LOCALE_KEY); - localStorage.removeItem(WebLocaleService._LOCAL_STORAGE_EXTENSION_ID_KEY); + localeStorage.clearLocale(); + localeStorage.clearExtensionId(); } const restartDialog = await this.dialogService.confirm({ @@ -54,8 +112,8 @@ export class WebLocaleService implements ILocaleService { } async clearLocalePreference(): Promise { - localStorage.removeItem(WebLocaleService._LOCAL_STORAGE_LOCALE_KEY); - localStorage.removeItem(WebLocaleService._LOCAL_STORAGE_EXTENSION_ID_KEY); + localeStorage.clearLocale(); + localeStorage.clearExtensionId(); if (Language.value() === navigator.language.toLowerCase()) { return; @@ -87,7 +145,7 @@ class WebActiveLanguagePackService implements IActiveLanguagePackService { if (language === LANGUAGE_DEFAULT) { return undefined; } - const extensionId = localStorage.getItem(WebLocaleService._LOCAL_STORAGE_EXTENSION_ID_KEY); + const extensionId = localeStorage.getExtensionId(); if (extensionId) { return extensionId; } @@ -102,7 +160,7 @@ class WebActiveLanguagePackService implements IActiveLanguagePackService { // Only install extensions that are published by Microsoft and start with vscode-language-pack for extra certainty const extensionToInstall = tagResult.firstPage.find(e => e.publisher === 'MS-CEINTL' && e.name.startsWith('vscode-language-pack')); if (extensionToInstall) { - localStorage.setItem(WebLocaleService._LOCAL_STORAGE_EXTENSION_ID_KEY, extensionToInstall.identifier.id); + localeStorage.setExtensionId(extensionToInstall.identifier.id); return extensionToInstall.identifier.id; } diff --git a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts index 2e70ca1e8b48d..daa2930e27a11 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-sandbox/workingCopyBackupService.test.ts @@ -71,6 +71,10 @@ const TestNativeWindowConfiguration: INativeWindowConfiguration = { tmpDir: tmpDir.fsPath, userDataDir: joinPath(homeDir, product.nameShort).fsPath, profiles: { profile: NULL_PROFILE, all: [NULL_PROFILE], home: homeDir }, + nls: { + messages: [], + language: 'en' + }, _: [] }; diff --git a/src/vs/workbench/workbench.desktop.main.nls.js b/src/vs/workbench/workbench.desktop.main.nls.js deleted file mode 100644 index d6a8b487eaf92..0000000000000 --- a/src/vs/workbench/workbench.desktop.main.nls.js +++ /dev/null @@ -1,8 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// NOTE: THIS FILE WILL BE OVERWRITTEN DURING BUILD TIME, DO NOT EDIT - -define([], {}); \ No newline at end of file diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index ca5c357ed7fa4..e4a0a7e3e7240 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -156,7 +156,6 @@ import 'vs/workbench/contrib/tags/browser/workspaceTagsService'; // Issues import 'vs/workbench/contrib/issue/browser/issue.contribution'; - // Splash import 'vs/workbench/contrib/splash/browser/splash.contribution'; diff --git a/test/unit/browser/index.js b/test/unit/browser/index.js index 322e5b7d510da..b0a0f4ddb23e0 100644 --- a/test/unit/browser/index.js +++ b/test/unit/browser/index.js @@ -246,6 +246,18 @@ async function runTestsInBrowser(testModules, browserType) { await page.goto(target.href); + if (args.build) { + const nlsMessages = await fs.promises.readFile(path.join(out, 'nls.messages.json'), 'utf8'); + await page.evaluate(value => { + // when running from `out-build`, ensure to load the default + // messages file, because all `nls.localize` calls have their + // english values removed and replaced by an index. + // VSCODE_GLOBALS: NLS + // @ts-ignore + globalThis._VSCODE_NLS_MESSAGES = JSON.parse(value); + }, nlsMessages); + } + page.on('console', async msg => { consoleLogFn(msg)(msg.text(), await Promise.all(msg.args().map(async arg => await arg.jsonValue()))); }); diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 22fdd384eab2d..d4d85a185219b 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -97,6 +97,16 @@ const _tests_glob = '**/test/**/*.test.js'; let loader; let _out; +function initNls(opts) { + if (opts.build) { + // when running from `out-build`, ensure to load the default + // messages file, because all `nls.localize` calls have their + // english values removed and replaced by an index. + // VSCODE_GLOBALS: NLS + globalThis._VSCODE_NLS_MESSAGES = (require.__$__nodeRequire ?? require)(`../../../out-build/nls.messages.json`); + } +} + function initLoader(opts) { const outdir = opts.build ? 'out-build' : 'out'; _out = path.join(__dirname, `../../../${outdir}`); @@ -438,6 +448,7 @@ function runTests(opts) { } ipcRenderer.on('run', (e, opts) => { + initNls(opts); initLoader(opts); runTests(opts).catch(err => { if (typeof err !== 'string') { diff --git a/test/unit/node/index.js b/test/unit/node/index.js index e876bd1e0075f..9f0ec662a7345 100644 --- a/test/unit/node/index.js +++ b/test/unit/node/index.js @@ -84,6 +84,14 @@ function main() { globalThis._VSCODE_PRODUCT_JSON = require(`${REPO_ROOT}/product.json`); globalThis._VSCODE_PACKAGE_JSON = require(`${REPO_ROOT}/package.json`); + if (args.build) { + // when running from `out-build`, ensure to load the default + // messages file, because all `nls.localize` calls have their + // english values removed and replaced by an index. + // VSCODE_GLOBALS: NLS + globalThis._VSCODE_NLS_MESSAGES = require(`../../../${out}/nls.messages.json`); + } + // Test file operations that are common across platforms. Used for test infra, namely snapshot tests Object.assign(globalThis, { __analyzeSnapshotInTests: takeSnapshotAndCountClasses, From ed4e6eda599f37bac9a11952403a6e63fd4f5a4d Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 28 Jun 2024 11:56:38 +0200 Subject: [PATCH 546/755] Update grammars (#219070) --- extensions/csharp/cgmanifest.json | 2 +- .../csharp/syntaxes/csharp.tmLanguage.json | 5 +- extensions/fsharp/cgmanifest.json | 2 +- .../fsharp/syntaxes/fsharp.tmLanguage.json | 13 +- extensions/go/cgmanifest.json | 4 +- extensions/go/syntaxes/go.tmLanguage.json | 113 +++++++----------- .../latex/syntaxes/LaTeX.tmLanguage.json | 8 +- extensions/python/cgmanifest.json | 2 +- extensions/swift/cgmanifest.json | 2 +- .../swift/syntaxes/swift.tmLanguage.json | 8 +- 10 files changed, 66 insertions(+), 93 deletions(-) diff --git a/extensions/csharp/cgmanifest.json b/extensions/csharp/cgmanifest.json index 1c88bd17296ca..58a7408dbbe7d 100644 --- a/extensions/csharp/cgmanifest.json +++ b/extensions/csharp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "dotnet/csharp-tmLanguage", "repositoryUrl": "https://github.com/dotnet/csharp-tmLanguage", - "commitHash": "7a7482ffc72a6677a87eb1ed76005593a4f7f131" + "commitHash": "d63e2661d4e0c83b6c7810eb1d0eedc5da843b04" } }, "license": "MIT", diff --git a/extensions/csharp/syntaxes/csharp.tmLanguage.json b/extensions/csharp/syntaxes/csharp.tmLanguage.json index 96dbe04473c32..4a2497a064abe 100644 --- a/extensions/csharp/syntaxes/csharp.tmLanguage.json +++ b/extensions/csharp/syntaxes/csharp.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/dotnet/csharp-tmLanguage/commit/7a7482ffc72a6677a87eb1ed76005593a4f7f131", + "version": "https://github.com/dotnet/csharp-tmLanguage/commit/d63e2661d4e0c83b6c7810eb1d0eedc5da843b04", "name": "C#", "scopeName": "source.cs", "patterns": [ @@ -512,6 +512,9 @@ { "include": "#type-name" }, + { + "include": "#type-arguments" + }, { "include": "#attribute-arguments" } diff --git a/extensions/fsharp/cgmanifest.json b/extensions/fsharp/cgmanifest.json index 524b3fa0d46a4..0b3c5d112e57d 100644 --- a/extensions/fsharp/cgmanifest.json +++ b/extensions/fsharp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "ionide/ionide-fsgrammar", "repositoryUrl": "https://github.com/ionide/ionide-fsgrammar", - "commitHash": "7d029a46f17637228b2ee85dd02e511c3e8039b3" + "commitHash": "0100f551f6c32598a58aba97344bf828673fec7a" } }, "license": "MIT", diff --git a/extensions/fsharp/syntaxes/fsharp.tmLanguage.json b/extensions/fsharp/syntaxes/fsharp.tmLanguage.json index 5063f1c5210c0..7806c100eae96 100644 --- a/extensions/fsharp/syntaxes/fsharp.tmLanguage.json +++ b/extensions/fsharp/syntaxes/fsharp.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/ionide/ionide-fsgrammar/commit/7d029a46f17637228b2ee85dd02e511c3e8039b3", + "version": "https://github.com/ionide/ionide-fsgrammar/commit/0100f551f6c32598a58aba97344bf828673fec7a", "name": "fsharp", "scopeName": "source.fsharp", "patterns": [ @@ -617,7 +617,7 @@ }, { "name": "constant.numeric.float.fsharp", - "match": "\\b-?[0-9][0-9_]*((\\.([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))" + "match": "\\b-?[0-9][0-9_]*((\\.(?!\\.)([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))" }, { "name": "constant.numeric.integer.nativeint.fsharp", @@ -635,7 +635,7 @@ }, "abstract_definition": { "name": "abstract.definition.fsharp", - "begin": "\\b(abstract)\\s+(member)?(\\s+\\[\\<.*\\>\\])?\\s*([_[:alpha:]0-9,\\._`\\s]+)(<)?", + "begin": "\\b(static)?\\s+(abstract)\\s+(member)?(\\s+\\[\\<.*\\>\\])?\\s*([_[:alpha:]0-9,\\._`\\s]+)(<)?", "end": "\\s*(with)\\b|=|$", "beginCaptures": { "1": { @@ -645,6 +645,9 @@ "name": "keyword.fsharp" }, "3": { + "name": "keyword.fsharp" + }, + "4": { "name": "support.function.attribute.fsharp" }, "5": { @@ -933,7 +936,7 @@ "patterns": [ { "name": "binding.fsharp", - "begin": "\\b(let mutable|static let mutable|static let|let inline|let|and|member val|static member inline|static member|default|member|override|let!)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9\\._`\\s]+|(?<=,)\\s)*)?", + "begin": "\\b(let mutable|static let mutable|static let|let inline|let|and|member val|member inline|static member inline|static member|default|member|override|let!)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9\\._`\\s]+|(?<=,)\\s)*)?", "end": "\\s*((with\\b)|(=|\\n+=|(?<=\\=)))", "beginCaptures": { "1": { @@ -1008,7 +1011,7 @@ }, { "name": "binding.fsharp", - "begin": "\\b(static val mutable|val mutable|val)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9,\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9,\\._`\\s]+|(?<=,)\\s)*)?", + "begin": "\\b(static val mutable|val mutable|val inline|val)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9,\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9,\\._`\\s]+|(?<=,)\\s)*)?", "end": "\\n$", "beginCaptures": { "1": { diff --git a/extensions/go/cgmanifest.json b/extensions/go/cgmanifest.json index d27352e133961..bd8f2d6105f02 100644 --- a/extensions/go/cgmanifest.json +++ b/extensions/go/cgmanifest.json @@ -6,12 +6,12 @@ "git": { "name": "go-syntax", "repositoryUrl": "https://github.com/worlpaker/go-syntax", - "commitHash": "092c45ec9a51fe40188408d1371f123eaa4796fa" + "commitHash": "21f28840e04d4fa04682d19d6fe64de437f40b64" } }, "license": "MIT", "description": "The file syntaxes/go.tmLanguage.json is from https://github.com/worlpaker/go-syntax, which in turn was derived from https://github.com/jeff-hykin/better-go-syntax.", - "version": "0.6.8" + "version": "0.7.5" } ], "version": 1 diff --git a/extensions/go/syntaxes/go.tmLanguage.json b/extensions/go/syntaxes/go.tmLanguage.json index 21b370514d0a9..b8a6604de88b1 100644 --- a/extensions/go/syntaxes/go.tmLanguage.json +++ b/extensions/go/syntaxes/go.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/worlpaker/go-syntax/commit/092c45ec9a51fe40188408d1371f123eaa4796fa", + "version": "https://github.com/worlpaker/go-syntax/commit/21f28840e04d4fa04682d19d6fe64de437f40b64", "name": "Go", "scopeName": "source.go", "patterns": [ @@ -321,7 +321,7 @@ "name": "punctuation.definition.begin.bracket.square.go" } }, - "end": "(?:(\\])((?:(?:(?:[\\*\\[\\]]+)?(?:\\<\\-\\s*)?\\bchan\\b(?:\\s*\\<\\-)?\\s*)+)?(?!(?:[\\[\\]\\*]+)?\\b(?:func|struct|map)\\b)(?:[\\*\\[\\]]+)?(?:[\\w\\.]+))?)", + "end": "(?:(\\])((?:(?:(?:[\\*\\[\\]]+)?(?:\\<\\-\\s*)?\\bchan\\b(?:\\s*\\<\\-)?\\s*)+)?(?!(?:[\\[\\]\\*]+)?\\b(?:func|struct|map)\\b)(?:[\\*\\[\\]]+)?(?:[\\w\\.]+)(?:\\[(?:(?:[\\w\\.\\*\\[\\]\\{\\}]+)(?:(?:\\,\\s*(?:[\\w\\.\\*\\[\\]\\{\\}]+))*))?\\])?)?)", "endCaptures": { "1": { "name": "punctuation.definition.end.bracket.square.go" @@ -1862,7 +1862,7 @@ }, { "comment": "property variables and types", - "match": "(?:((?:(?:\\w+\\,\\s*)+)?(?:\\w+\\s+))([\\s\\S]+))", + "match": "(?:((?:(?:\\w+\\,\\s*)+)?(?:\\w+\\s+))([^\\`]+))", "captures": { "1": { "patterns": [ @@ -2007,6 +2007,29 @@ } ] }, + { + "comment": "one type only with multi line raw string", + "begin": "(?:((?:(?:\\s*(?:[\\*\\[\\]]+)?(?:\\<\\-\\s*)?\\bchan\\b(?:\\s*\\<\\-)?\\s*)+)?(?\\|\\&]+))(\\.\\(\\btype\\b\\)\\s*)(\\{)", "beginCaptures": { "1": { "patterns": [ @@ -2770,7 +2796,7 @@ }, "slice_index_variables": { "comment": "slice index and capacity variables, to not scope them as property variables", - "match": "(?<=\\w\\[)((?:(?:\\b[\\w\\.\\*\\+/\\-\\*\\%\\<\\>\\|\\&]+\\:)|(?:\\:\\b[\\w\\.\\*\\+/\\-\\*\\%\\<\\>\\|\\&]+))(?:\\b[\\w\\.\\*\\+/\\-\\*\\%\\<\\>\\|\\&]+)?(?:\\:\\b[\\w\\.\\*\\+/\\-\\*\\%\\<\\>\\|\\&]+)?)(?=\\])", + "match": "(?<=\\w\\[)((?:(?:\\b[\\w\\.\\*\\+/\\-\\%\\<\\>\\|\\&]+\\:)|(?:\\:\\b[\\w\\.\\*\\+/\\-\\%\\<\\>\\|\\&]+))(?:\\b[\\w\\.\\*\\+/\\-\\%\\<\\>\\|\\&]+)?(?:\\:\\b[\\w\\.\\*\\+/\\-\\%\\<\\>\\|\\&]+)?)(?=\\])", "captures": { "1": { "patterns": [ @@ -2786,8 +2812,8 @@ } }, "property_variables": { - "comment": "Property variables in struct | parameter field in struct initialization", - "match": "(?:(?:((?:\\b[\\w\\.]+)(?:\\:(?!\\=))))(?:(?:\\s*([\\w\\.\\*\\&\\[\\]]+)(\\.\\w+)(?![\\w\\.\\*\\&\\[\\]]*(?:\\{|\\()))((?:\\s*(?:\\<|\\>|\\<\\=|\\>\\=|\\=\\=|\\!\\=|\\|\\||\\&\\&|\\+|/|\\-|\\*|\\%|\\||\\&)\\s*(?:[\\w\\.\\*\\&\\[\\]]+)(?:\\.\\w+)(?![\\w\\.\\*\\&\\[\\]]*(?:\\{|\\()))*))?)", + "comment": "Property variables in struct", + "match": "((?:\\b[\\w\\.]+)(?:\\:(?!\\=)))", "captures": { "1": { "patterns": [ @@ -2799,68 +2825,6 @@ "name": "variable.other.property.go" } ] - }, - "2": { - "patterns": [ - { - "include": "#type-declarations" - }, - { - "match": "\\w+", - "name": "variable.other.go" - }, - { - "include": "$self" - } - ] - }, - "3": { - "patterns": [ - { - "include": "#type-declarations" - }, - { - "match": "\\w+", - "name": "variable.other.property.field.go" - }, - { - "include": "$self" - } - ] - }, - "4": { - "patterns": [ - { - "match": "([\\w\\.\\*\\&\\[\\]]+)(\\.\\w+)", - "captures": { - "1": { - "patterns": [ - { - "include": "#type-declarations" - }, - { - "match": "\\w+", - "name": "variable.other.go" - } - ] - }, - "2": { - "patterns": [ - { - "include": "#type-declarations" - }, - { - "match": "\\w+", - "name": "variable.other.property.field.go" - } - ] - } - } - }, - { - "include": "$self" - } - ] } } }, @@ -2931,13 +2895,16 @@ }, "2": { "patterns": [ - { - "include": "#type-declarations" - }, { "match": "\\binvalid\\b\\s+\\btype\\b", "name": "invalid.field.go" }, + { + "include": "#type-declarations-without-brackets" + }, + { + "include": "#parameter-variable-types" + }, { "match": "\\w+", "name": "entity.name.type.go" diff --git a/extensions/latex/syntaxes/LaTeX.tmLanguage.json b/extensions/latex/syntaxes/LaTeX.tmLanguage.json index aad6c5c4bd9f2..7648673219530 100644 --- a/extensions/latex/syntaxes/LaTeX.tmLanguage.json +++ b/extensions/latex/syntaxes/LaTeX.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jlelong/vscode-latex-basics/commit/3d141a124a16558958e95c54267f7ca37986de6f", + "version": "https://github.com/jlelong/vscode-latex-basics/commit/9cd6bc151f4b9df5d9aeb1e39e30071018d3cb2a", "name": "LaTeX", "scopeName": "text.tex.latex", "patterns": [ @@ -2646,7 +2646,7 @@ ] }, { - "begin": "((\\\\)(?:\\w*[rR]ef\\*?))(\\{)", + "begin": "((\\\\)(?:\\w*[rR]ef\\*?))(?:\\[[^\\]]*\\])?(\\{)", "beginCaptures": { "1": { "name": "keyword.control.ref.latex" @@ -3048,7 +3048,7 @@ "name": "punctuation.definition.variable.latex" } }, - "match": "(\\\\)[cgl](?:[_\\p{Alphabetic}@]+)+_(?:bitset|clist|dim|fp|int|muskip|str|tl|bool|box|coffin|flag|fparray|intarray|ior|iow|prop|regex|seq)", + "match": "(\\\\)[cgl](?:[_\\p{Alphabetic}@]+)+_[a-z]+", "name": "variable.other.latex3.latex" }, { @@ -3148,7 +3148,7 @@ "match": "\\s*((\\\\)(?:begin|end))(\\{)([a-zA-Z]*\\*?)(\\})(?:(\\[)([^\\]]*)(\\])){,2}(?:(\\{)([^{}]*)(\\}))?" }, "definition-label": { - "begin": "((\\\\)label)((?:\\[[^\\[]*?\\])*)(\\{)", + "begin": "((\\\\)z?label)((?:\\[[^\\[]*?\\])*)(\\{)", "beginCaptures": { "1": { "name": "keyword.control.label.latex" diff --git a/extensions/python/cgmanifest.json b/extensions/python/cgmanifest.json index 37a21b2de54cb..ace7056c99523 100644 --- a/extensions/python/cgmanifest.json +++ b/extensions/python/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "MagicStack/MagicPython", "repositoryUrl": "https://github.com/MagicStack/MagicPython", - "commitHash": "c9b3409deb69acec31bbf7913830e93a046b30cc" + "commitHash": "7d0f2b22a5ad8fccbd7341bc7b7a715169283044" } }, "license": "MIT", diff --git a/extensions/swift/cgmanifest.json b/extensions/swift/cgmanifest.json index 816621e4170ee..cb1ca02310f9f 100644 --- a/extensions/swift/cgmanifest.json +++ b/extensions/swift/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "jtbandes/swift-tmlanguage", "repositoryUrl": "https://github.com/jtbandes/swift-tmlanguage", - "commitHash": "ab893c684dd7eeb7c249139e29e931334316fda7" + "commitHash": "860eface4241cf9f2174d5fa690bd34389ac8d26" } }, "license": "MIT" diff --git a/extensions/swift/syntaxes/swift.tmLanguage.json b/extensions/swift/syntaxes/swift.tmLanguage.json index 6259b151369fb..b18b340f2c686 100644 --- a/extensions/swift/syntaxes/swift.tmLanguage.json +++ b/extensions/swift/syntaxes/swift.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jtbandes/swift-tmlanguage/commit/ab893c684dd7eeb7c249139e29e931334316fda7", + "version": "https://github.com/jtbandes/swift-tmlanguage/commit/860eface4241cf9f2174d5fa690bd34389ac8d26", "name": "Swift", "scopeName": "source.swift", "comment": "See swift.tmbundle/grammar-test.swift for test cases.", @@ -52,7 +52,7 @@ }, "patterns": [ { - "match": "\\b(swift|(?:iOS|macOS|OSX|watchOS|tvOS|UIKitForMac)(?:ApplicationExtension)?)\\b(?:\\s+([0-9]+(?:\\.[0-9]+)*\\b))?", + "match": "\\b(swift|(?:iOS|macOS|OSX|watchOS|tvOS|visionOS|UIKitForMac)(?:ApplicationExtension)?)\\b(?:\\s+([0-9]+(?:\\.[0-9]+)*\\b))?", "captures": { "1": { "name": "keyword.other.platform.os.swift" @@ -580,7 +580,7 @@ } }, { - "match": "\\b(os)\\s*(\\()\\s*(?:(macOS|OSX|iOS|tvOS|watchOS|Android|Linux|FreeBSD|Windows|PS4)|\\w+)\\s*(\\))", + "match": "\\b(os)\\s*(\\()\\s*(?:(macOS|OSX|iOS|tvOS|watchOS|visionOS|Android|Linux|FreeBSD|Windows|PS4)|\\w+)\\s*(\\))", "captures": { "1": { "name": "keyword.other.condition.swift" @@ -2586,7 +2586,7 @@ }, "patterns": [ { - "match": "\\s*\\b((?:iOS|macOS|OSX|watchOS|tvOS|UIKitForMac)(?:ApplicationExtension)?)\\b(?:\\s+([0-9]+(?:\\.[0-9]+)*\\b))", + "match": "\\s*\\b((?:iOS|macOS|OSX|watchOS|tvOS|visionOS|UIKitForMac)(?:ApplicationExtension)?)\\b(?:\\s+([0-9]+(?:\\.[0-9]+)*\\b))", "captures": { "1": { "name": "keyword.other.platform.os.swift" From d0db6d013faef7943da972136e38e5323337a152 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2024 14:46:05 +0200 Subject: [PATCH 547/755] fix https://github.com/microsoft/vscode/issues/218692 (#219078) --- build/gulpfile.vscode.web.js | 1 - 1 file changed, 1 deletion(-) diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 50c7e6fb6318f..8fb431e94f9a8 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -70,7 +70,6 @@ const vscodeWebEntryPoints = [ buildfile.workerNotebook, buildfile.workerLanguageDetection, buildfile.workerLocalFileSearch, - buildfile.workerProfileAnalysis, buildfile.keyboardMaps, buildfile.workbenchWeb ].flat(); From 388469b7b4bfbf0440761feff63eee3b37aeb9c6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2024 14:48:54 +0200 Subject: [PATCH 548/755] debt - CSS cleanup, accessibile diff viewer padding (#219102) * remove `InlineChatWidget#updateProgress` because the chat widget already shows progress * debt - CSS cleanup, accessibile diff viewer padding --- .../inlineChat/browser/inlineChatWidget.ts | 29 +--- .../inlineChat/browser/media/inlineChat.css | 124 +----------------- .../controller/chat/notebookChatController.ts | 1 - .../chat/browser/terminalChatController.ts | 2 - .../chat/browser/terminalChatWidget.ts | 6 - 5 files changed, 9 insertions(+), 153 deletions(-) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index fad3466eefead..fe4509dabeeed 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -5,7 +5,6 @@ import { Dimension, getActiveElement, getTotalHeight, h, reset, trackFocus } from 'vs/base/browser/dom'; import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; -import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { Emitter, Event } from 'vs/base/common/event'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; @@ -87,8 +86,6 @@ export class InlineChatWidget { 'div.inline-chat@root', [ h('div.chat-widget@chatWidget'), - h('div.progress@progress'), - h('div.previewDiff.hidden@previewDiff'), h('div.accessibleViewer@accessibleViewer'), h('div.status@status', [ h('div.label.info.hidden@infoLabel'), @@ -105,7 +102,6 @@ export class InlineChatWidget { private readonly _ctxInputEditorFocused: IContextKey; private readonly _ctxResponseFocused: IContextKey; - private readonly _progressBar: ProgressBar; private readonly _chatWidget: ChatWidget; protected readonly _onDidChangeHeight = this._store.add(new Emitter()); @@ -131,10 +127,6 @@ export class InlineChatWidget { @IChatService private readonly _chatService: IChatService, @IHoverService private readonly _hoverService: IHoverService, ) { - // toolbars - this._progressBar = new ProgressBar(this._elements.progress); - this._store.add(this._progressBar); - this.scopedContextKeyService = this._store.add(_contextKeyService.createScoped(this._elements.chatWidget)); const scopedInstaService = _instantiationService.createChild( new ServiceCollection([ @@ -296,17 +288,15 @@ export class InlineChatWidget { protected _doLayout(dimension: Dimension): void { const extraHeight = this._getExtraHeight(); - const progressHeight = getTotalHeight(this._elements.progress); const statusHeight = getTotalHeight(this._elements.status); // console.log('ZONE#Widget#layout', { height: dimension.height, extraHeight, progressHeight, followUpsHeight, statusHeight, LIST: dimension.height - progressHeight - followUpsHeight - statusHeight - extraHeight }); this._elements.root.style.height = `${dimension.height - extraHeight}px`; this._elements.root.style.width = `${dimension.width}px`; - this._elements.progress.style.width = `${dimension.width}px`; this._chatWidget.layout( - dimension.height - progressHeight - statusHeight - extraHeight, + dimension.height - statusHeight - extraHeight, dimension.width ); } @@ -317,11 +307,10 @@ export class InlineChatWidget { get contentHeight(): number { const data = { chatWidgetContentHeight: this._chatWidget.contentHeight, - progressHeight: getTotalHeight(this._elements.progress), statusHeight: getTotalHeight(this._elements.status), extraHeight: this._getExtraHeight() }; - const result = data.progressHeight + data.chatWidgetContentHeight + data.statusHeight + data.extraHeight; + const result = data.chatWidgetContentHeight + data.statusHeight + data.extraHeight; return result; } @@ -347,16 +336,6 @@ export class InlineChatWidget { return 4 /* padding */ + 2 /*border*/ + 4 /*shadow*/; } - updateProgress(show: boolean) { - if (show) { - this._progressBar.show(); - this._progressBar.infinite(); - } else { - this._progressBar.stop(); - this._progressBar.hide(); - } - } - get value(): string { return this._chatWidget.getInput(); } @@ -565,7 +544,7 @@ export class EditorBasedInlineChatWidget extends InlineChatWidget { let result = super.contentHeight; if (this._accessibleViewer.value) { - result += this._accessibleViewer.value.height; + result += this._accessibleViewer.value.height + 8 /* padding */; } return result; @@ -577,7 +556,7 @@ export class EditorBasedInlineChatWidget extends InlineChatWidget { if (this._accessibleViewer.value) { this._accessibleViewer.value.width = dimension.width - 12; - newHeight -= this._accessibleViewer.value.height; + newHeight -= this._accessibleViewer.value.height + 8; } super._doLayout(dimension.with(undefined, newHeight)); diff --git a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css index 279fea6e71be1..a6b855ff0461c 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css +++ b/src/vs/workbench/contrib/inlineChat/browser/media/inlineChat.css @@ -62,16 +62,6 @@ right: 10px; } -/* progress bit */ - -.monaco-workbench .inline-chat .progress { - position: relative; -} - -/* UGLY - fighting against workbench styles */ -.monaco-workbench .part.editor > .content .inline-chat .progress .monaco-progress-container { - top: 0; -} /* status */ @@ -121,37 +111,6 @@ line-height: 18px; } -.monaco-workbench .inline-chat .chatMessage .chatMessageContent .value { - overflow: hidden; - -webkit-user-select: text; - user-select: text; -} - -.monaco-workbench .inline-chat .followUps { - padding: 5px 5px; -} - -.monaco-workbench .inline-chat .followUps .interactive-session-followups .monaco-button { - display: block; - color: var(--vscode-textLink-foreground); - font-size: 12px; -} - -.monaco-workbench .inline-chat .followUps.hidden { - display: none; -} - -.monaco-workbench .inline-chat .chatMessage { - padding: 0 3px; -} - -.monaco-workbench .inline-chat .chatMessage .chatMessageContent { - padding: 2px 2px; -} - -.monaco-workbench .inline-chat .chatMessage.hidden { - display: none; -} .monaco-workbench .inline-chat .status .actions, .monaco-workbench .inline-chat-content-widget .toolbar { @@ -241,45 +200,17 @@ background-color: var(--vscode-button-hoverBackground); } -/* preview */ +/* accessible diff viewer */ -.monaco-workbench .inline-chat .preview { - display: none; +.monaco-workbench .inline-chat .diff-review { + padding: 4px 6px; + background-color: unset; } -.monaco-workbench .inline-chat .previewDiff, -.monaco-workbench .inline-chat .previewCreate { - display: inherit; - border: 1px solid var(--vscode-inlineChat-border); - border-radius: 2px; - margin: 6px 0px; -} - -.monaco-workbench .inline-chat .previewCreateTitle { - padding-top: 6px; -} - -.monaco-workbench .inline-chat .diff-review.hidden, -.monaco-workbench .inline-chat .previewDiff.hidden, -.monaco-workbench .inline-chat .previewCreate.hidden, -.monaco-workbench .inline-chat .previewCreateTitle.hidden { +.monaco-workbench .inline-chat .diff-review.hidden { display: none; } -.monaco-workbench .inline-chat-toolbar { - display: flex; -} - -.monaco-workbench .inline-chat-toolbar > .monaco-button { - margin-right: 6px; -} - -.monaco-workbench .inline-chat-toolbar .action-label.checked { - color: var(--vscode-inputOption-activeForeground); - background-color: var(--vscode-inputOption-activeBackground); - outline: 1px solid var(--vscode-inputOption-activeBorder); -} - /* decoration styles */ .monaco-workbench .inline-chat-inserted-range { @@ -303,51 +234,6 @@ background-color: var(--vscode-inlineChat-regionHighlight); } -.monaco-workbench .interactive-session .interactive-input-and-execute-toolbar .monaco-editor .inline-chat-slash-command { - background-color: var(--vscode-chat-slashCommandBackground); - color: var(--vscode-chat-slashCommandForeground); /* Overrides the foreground color rule in chat.css */ - border-radius: 2px; - padding: 1px; -} - -.monaco-workbench .inline-chat-slash-command-detail { - opacity: 0.5; -} - -/* diff zone */ - -.monaco-workbench .inline-chat-diff-widget .monaco-diff-editor .monaco-editor-background, -.monaco-workbench .inline-chat-diff-widget .monaco-diff-editor .monaco-workbench .margin-view-overlays { - background-color: var(--vscode-inlineChat-regionHighlight); -} - -/* create zone */ - -.monaco-workbench .inline-chat-newfile-widget { - background-color: var(--vscode-inlineChat-regionHighlight); -} - -.monaco-workbench .inline-chat-newfile-widget .title { - display: flex; - align-items: center; - justify-content: space-between; -} - -.monaco-workbench .inline-chat-newfile-widget .title .detail { - margin-left: 4px; -} - -.monaco-workbench .inline-chat-newfile-widget .buttonbar-widget { - display: flex; - margin-left: auto; - margin-right: 8px; -} - -.monaco-workbench .inline-chat-newfile-widget .buttonbar-widget > .monaco-button { - display: inline-flex; - white-space: nowrap; - margin-left: 4px; -} /* gutter decoration */ diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts index fc164d21321a8..d9eee2ec600c9 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts @@ -665,7 +665,6 @@ export class NotebookChatController extends Disposable implements INotebookEdito store.dispose(); this._ctxHasActiveRequest.set(false); - this._widget.inlineChatWidget.updateProgress(false); this._widget.inlineChatWidget.updateInfo(''); this._widget.inlineChatWidget.updateToolbar(true); } diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts index fb9ded6f870cd..005fdf6ca7e1c 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatController.ts @@ -227,7 +227,6 @@ export class TerminalChatController extends Disposable implements ITerminalContr if (response) { store.add(response.onDidChange(async () => { responseContent += response.response.value; - this._chatWidget?.value.inlineChatWidget.updateProgress(true); if (response.isCanceled) { this._requestActiveContextKey.set(false); responsePromise.complete(undefined); @@ -243,7 +242,6 @@ export class TerminalChatController extends Disposable implements ITerminalContr this._responseContainsCodeBlockContextKey.set(!!firstCodeBlock); this._responseContainsMulitpleCodeBlocksContextKey.set(!!secondCodeBlock); this._chatWidget?.value.inlineChatWidget.updateToolbar(true); - this._chatWidget?.value.inlineChatWidget.updateProgress(false); responsePromise.complete(response); } })); diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index 33c01afbb634c..61d1b7147f665 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -13,7 +13,6 @@ import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { IChatProgress } from 'vs/workbench/contrib/chat/common/chatService'; import { InlineChatWidget } from 'vs/workbench/contrib/inlineChat/browser/inlineChatWidget'; import { ITerminalInstance, type IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal'; import { MENU_TERMINAL_CHAT_INPUT, MENU_TERMINAL_CHAT_WIDGET, MENU_TERMINAL_CHAT_WIDGET_STATUS, TerminalChatCommandId, TerminalChatContextKeys } from 'vs/workbench/contrib/terminalContrib/chat/browser/terminalChat'; @@ -199,7 +198,6 @@ export class TerminalChatWidget extends Disposable { this._inlineChatWidget.reset(); this._reset(); this._inlineChatWidget.updateChatMessage(undefined); - this._inlineChatWidget.updateProgress(false); this._inlineChatWidget.updateToolbar(false); this._visibleContextKey.set(false); this._inlineChatWidget.value = ''; @@ -240,10 +238,6 @@ export class TerminalChatWidget extends Disposable { this._instance.runCommand(code, shouldExecute); this.hide(); } - - updateProgress(progress?: IChatProgress): void { - this._inlineChatWidget.updateProgress(progress?.kind === 'markdownContent'); - } public get focusTracker(): IFocusTracker { return this._focusTracker; } From ff1b0028adb49cc14524f68bf170fff8759a8769 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 28 Jun 2024 14:49:35 +0200 Subject: [PATCH 549/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20remove=20custo?= =?UTF-8?q?m=20observable=20logging=20(#219101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vs/workbench/api/browser/mainThreadSCM.ts | 10 +++----- src/vs/workbench/api/common/extHostSCM.ts | 5 +--- .../workbench/contrib/scm/browser/activity.ts | 24 ------------------- 3 files changed, 4 insertions(+), 35 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 5ae48f451068f..af9d3f401cfb9 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -27,7 +27,6 @@ import { IModelService } from 'vs/editor/common/services/model'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { Schemas } from 'vs/base/common/network'; import { ITextModel } from 'vs/editor/common/model'; -import { ILogService } from 'vs/platform/log/common/log'; function getIconFromIconDto(iconDto?: UriComponents | { light: UriComponents; dark: UriComponents } | ThemeIcon): URI | { light: URI; dark: URI } | ThemeIcon | undefined { if (iconDto === undefined) { @@ -283,8 +282,7 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { private readonly _inputBoxTextModel: ITextModel, private readonly _quickDiffService: IQuickDiffService, private readonly _uriIdentService: IUriIdentityService, - private readonly _workspaceContextService: IWorkspaceContextService, - private readonly _logService: ILogService + private readonly _workspaceContextService: IWorkspaceContextService ) { if (_rootUri) { const folder = this._workspaceContextService.getWorkspaceFolder(_rootUri); @@ -309,7 +307,6 @@ class MainThreadSCMProvider implements ISCMProvider, QuickDiffProvider { } if (typeof features.statusBarCommands !== 'undefined') { - this._logService.trace(`MainThreadSCMProvider#updateSourceControl (${this._id}): ${features.statusBarCommands.map(c => c.title).join(', ')}`); this._statusBarCommands.set(features.statusBarCommands, undefined); } @@ -490,8 +487,7 @@ export class MainThreadSCM implements MainThreadSCMShape { @ITextModelService private readonly textModelService: ITextModelService, @IQuickDiffService private readonly quickDiffService: IQuickDiffService, @IUriIdentityService private readonly _uriIdentService: IUriIdentityService, - @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, - @ILogService private readonly logService: ILogService + @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSCM); @@ -512,7 +508,7 @@ export class MainThreadSCM implements MainThreadSCMShape { this._repositoryBarriers.set(handle, new Barrier()); const inputBoxTextModelRef = await this.textModelService.createModelReference(URI.revive(inputBoxDocumentUri)); - const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService, this.logService); + const provider = new MainThreadSCMProvider(this._proxy, handle, id, label, rootUri ? URI.revive(rootUri) : undefined, inputBoxTextModelRef.object.textEditorModel, this.quickDiffService, this._uriIdentService, this.workspaceContextService); const repository = this.scmService.registerSCMProvider(provider); this._repositories.set(handle, repository); diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 6ce319f73342e..46f25cb7dd276 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -654,9 +654,7 @@ class ExtHostSourceControl implements vscode.SourceControl { } set statusBarCommands(statusBarCommands: vscode.Command[] | undefined) { - this.logService.trace('ExtHostSourceControl#statusBarCommands', (statusBarCommands ?? []).map(c => c.command).join(', ')); if (this._statusBarCommands && statusBarCommands && commandListEquals(this._statusBarCommands, statusBarCommands)) { - this.logService.trace('ExtHostSourceControl#statusBarCommands are equal'); return; } @@ -684,7 +682,6 @@ class ExtHostSourceControl implements vscode.SourceControl { _extHostDocuments: ExtHostDocuments, proxy: MainThreadSCMShape, private _commands: ExtHostCommands, - private readonly logService: ILogService, private _id: string, private _label: string, private _rootUri?: vscode.Uri @@ -864,7 +861,7 @@ export class ExtHostSCM implements ExtHostSCMShape { }); const handle = ExtHostSCM._handlePool++; - const sourceControl = new ExtHostSourceControl(extension, this._extHostDocuments, this._proxy, this._commands, this.logService, id, label, rootUri); + const sourceControl = new ExtHostSourceControl(extension, this._extHostDocuments, this._proxy, this._commands, id, label, rootUri); this._sourceControls.set(handle, sourceControl); const sourceControls = this._sourceControlsByExtension.get(extension.identifier) || []; diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index 718c14752333c..de21368d9b9dd 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -27,7 +27,6 @@ import { observableConfigValue } from 'vs/platform/observable/common/platformObs import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts } from 'vs/base/common/observableInternal/utils'; import { Command } from 'vs/editor/common/languages'; import { ISCMHistoryItemGroup } from 'vs/workbench/contrib/scm/common/history'; -import { ILogService } from 'vs/platform/log/common/log'; export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -49,13 +48,11 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private readonly _activeEditorRepository = derivedObservableWithCache(this, (reader, lastValue) => { const activeResource = EditorResourceAccessor.getOriginalUri(this._activeEditor.read(reader)); if (!activeResource) { - this.logService.trace('SCMActiveRepositoryController (activeEditorRepository derived): no activeResource'); return lastValue; } const repository = this.scmService.getRepository(activeResource); if (!repository) { - this.logService.trace(`SCMActiveRepositoryController (activeEditorRepository derived): no repository for '${activeResource.toString()}'`); return lastValue; } @@ -106,7 +103,6 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe @IConfigurationService private readonly configurationService: IConfigurationService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @IEditorService private readonly editorService: IEditorService, - @ILogService private readonly logService: ILogService, @ISCMService private readonly scmService: ISCMService, @ISCMViewService private readonly scmViewService: ISCMViewService, @IStatusbarService private readonly statusbarService: IStatusbarService, @@ -122,22 +118,6 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe { name: 'activeRepositoryBranchName', contextKey: ActiveRepositoryContextKeys.ActiveRepositoryBranchName.key, } ]); - this._register(autorun(reader => { - const repository = this._focusedRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader); - - this.logService.trace('SCMActiveRepositoryController (focusedRepository):', repository?.id ?? 'no id'); - this.logService.trace('SCMActiveRepositoryController (focusedRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); - })); - - this._register(autorun(reader => { - const repository = this._activeEditorRepository.read(reader); - const commands = repository?.provider.statusBarCommands.read(reader); - - this.logService.trace('SCMActiveRepositoryController (activeEditorRepository):', repository?.id ?? 'no id'); - this.logService.trace('SCMActiveRepositoryController (activeEditorRepository):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); - })); - this._register(autorunWithStore((reader, store) => { this._updateActivityCountBadge(this._countBadge.read(reader), store); })); @@ -146,9 +126,6 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe const repository = this._activeRepository.read(reader); const commands = repository?.provider.statusBarCommands.read(reader); - this.logService.trace('SCMActiveRepositoryController (status bar):', repository?.id ?? 'no id'); - this.logService.trace('SCMActiveRepositoryController (status bar):', commands ? commands.map(c => c.title).join(', ') : 'no commands'); - this._updateStatusBar(repository, commands ?? [], store); })); @@ -175,7 +152,6 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe private _updateStatusBar(repository: ISCMRepository | undefined, commands: readonly Command[], store: DisposableStore): void { if (!repository) { - this.logService.trace('SCMActiveRepositoryController (status bar): repository is undefined'); return; } From 2014f1ddb28add8a3f07e80c8aa2961778f53b84 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 28 Jun 2024 15:45:52 +0200 Subject: [PATCH 550/755] nls - removal of loader plugin (#219098) --- .eslintrc.json | 2 +- build/gulpfile.editor.js | 10 ++--- build/gulpfile.reh.js | 10 ++--- build/lib/bundle.js | 5 --- build/lib/bundle.ts | 5 --- build/lib/mangle/index.js | 1 - build/lib/mangle/index.ts | 1 - build/lib/optimize.js | 7 +--- build/lib/optimize.ts | 8 +--- build/lib/standalone.js | 5 +-- build/lib/standalone.ts | 5 +-- src/buildfile.js | 6 +-- src/vs/nls.build.ts | 88 --------------------------------------- src/vs/nls.mock.ts | 43 ------------------- 14 files changed, 18 insertions(+), 178 deletions(-) delete mode 100644 src/vs/nls.build.ts delete mode 100644 src/vs/nls.mock.ts diff --git a/.eslintrc.json b/.eslintrc.json index 5e0a792f4920c..db383e0b9b482 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1016,7 +1016,7 @@ ] }, { - "target": "src/vs/{loader.d.ts,css.ts,css.build.ts,monaco.d.ts,nls.ts,nls.build.ts,nls.mock.ts}", + "target": "src/vs/{loader.d.ts,css.ts,css.build.ts,monaco.d.ts,nls.ts}", "restrictions": [] }, { diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index a02456e7a2e3e..b585fa665c16e 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -29,19 +29,17 @@ const editorEntryPoints = [ { name: 'vs/editor/editor.main', include: [], - exclude: ['vs/css', 'vs/nls'], + exclude: ['vs/css'], prepend: [ - { path: 'out-editor-build/vs/css.js', amdModuleId: 'vs/css' }, - { path: 'out-editor-build/vs/nls.js', amdModuleId: 'vs/nls' } + { path: 'out-editor-build/vs/css.js', amdModuleId: 'vs/css' } ], }, { name: 'vs/base/common/worker/simpleWorker', include: ['vs/editor/common/services/editorSimpleWorker'], - exclude: ['vs/nls'], + exclude: [], prepend: [ { path: 'vs/loader.js' }, - { path: 'vs/nls.js', amdModuleId: 'vs/nls' }, { path: 'vs/base/worker/workerMain.js' } ], dest: 'vs/base/worker/workerMain.js' @@ -99,7 +97,6 @@ const optimizeEditorAMDTask = task.define('optimize-editor-amd', optimize.optimi paths: { 'vs': 'out-editor-build/vs', 'vs/css': 'out-editor-build/vs/css.build', - 'vs/nls': 'out-editor-build/vs/nls.build', 'vscode': 'empty:' } }, @@ -124,7 +121,6 @@ const createESMSourcesAndResourcesTask = task.define('extract-editor-esm', () => 'vs/base/worker/workerMain.ts', ], renames: { - 'vs/nls.mock.ts': 'vs/nls.ts' } }); }); diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index ff2bf482a8d47..c6e8699d5bd6a 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -95,23 +95,23 @@ const serverWithWebResources = [ const serverEntryPoints = [ { name: 'vs/server/node/server.main', - exclude: ['vs/css', 'vs/nls'] + exclude: ['vs/css'] }, { name: 'vs/server/node/server.cli', - exclude: ['vs/css', 'vs/nls'] + exclude: ['vs/css'] }, { name: 'vs/workbench/api/node/extensionHostProcess', - exclude: ['vs/css', 'vs/nls'] + exclude: ['vs/css'] }, { name: 'vs/platform/files/node/watcher/watcherMain', - exclude: ['vs/css', 'vs/nls'] + exclude: ['vs/css'] }, { name: 'vs/platform/terminal/node/ptyHostMain', - exclude: ['vs/css', 'vs/nls'] + exclude: ['vs/css'] } ]; diff --git a/build/lib/bundle.js b/build/lib/bundle.js index 1a2f870991f3c..a0989638f7cc7 100644 --- a/build/lib/bundle.js +++ b/build/lib/bundle.js @@ -36,14 +36,10 @@ function bundle(entryPoints, config, callback) { const loader = loaderModule.exports; config.isBuild = true; config.paths = config.paths || {}; - if (!config.paths['vs/nls']) { - config.paths['vs/nls'] = 'out-build/vs/nls.build'; - } if (!config.paths['vs/css']) { config.paths['vs/css'] = 'out-build/vs/css.build'; } config.buildForceInvokeFactory = config.buildForceInvokeFactory || {}; - config.buildForceInvokeFactory['vs/nls'] = true; config.buildForceInvokeFactory['vs/css'] = true; loader.config(config); loader(['require'], (localRequire) => { @@ -53,7 +49,6 @@ function bundle(entryPoints, config, callback) { r += '.js'; } // avoid packaging the build version of plugins: - r = r.replace('vs/nls.build.js', 'vs/nls.js'); r = r.replace('vs/css.build.js', 'vs/css.js'); return { path: r, amdModuleId: entry.amdModuleId }; }; diff --git a/build/lib/bundle.ts b/build/lib/bundle.ts index 2efa081b47197..692100ff51581 100644 --- a/build/lib/bundle.ts +++ b/build/lib/bundle.ts @@ -138,14 +138,10 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba const loader: any = loaderModule.exports; config.isBuild = true; config.paths = config.paths || {}; - if (!config.paths['vs/nls']) { - config.paths['vs/nls'] = 'out-build/vs/nls.build'; - } if (!config.paths['vs/css']) { config.paths['vs/css'] = 'out-build/vs/css.build'; } config.buildForceInvokeFactory = config.buildForceInvokeFactory || {}; - config.buildForceInvokeFactory['vs/nls'] = true; config.buildForceInvokeFactory['vs/css'] = true; loader.config(config); @@ -156,7 +152,6 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba r += '.js'; } // avoid packaging the build version of plugins: - r = r.replace('vs/nls.build.js', 'vs/nls.js'); r = r.replace('vs/css.build.js', 'vs/css.js'); return { path: r, amdModuleId: entry.amdModuleId }; }; diff --git a/build/lib/mangle/index.js b/build/lib/mangle/index.js index bb6b414e845af..10e1aeb0d5acd 100644 --- a/build/lib/mangle/index.js +++ b/build/lib/mangle/index.js @@ -250,7 +250,6 @@ function isNameTakenInFile(node, name) { const skippedExportMangledFiles = [ // Build 'css.build', - 'nls.build', // Monaco 'editorCommon', 'editorOptions', diff --git a/build/lib/mangle/index.ts b/build/lib/mangle/index.ts index 4a7544f162b53..a148c4dd637ec 100644 --- a/build/lib/mangle/index.ts +++ b/build/lib/mangle/index.ts @@ -283,7 +283,6 @@ function isNameTakenInFile(node: ts.Node, name: string): boolean { const skippedExportMangledFiles = [ // Build 'css.build', - 'nls.build', // Monaco 'editorCommon', diff --git a/build/lib/optimize.js b/build/lib/optimize.js index 83527762f7391..79509e9a2d5ac 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -53,7 +53,7 @@ function loaderPlugin(src, base, amdModuleId) { function loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo) { let loaderStream = gulp.src(`${src}/vs/loader.js`, { base: `${src}` }); if (bundleLoader) { - loaderStream = es.merge(loaderStream, loaderPlugin(`${src}/vs/css.js`, `${src}`, 'vs/css'), loaderPlugin(`${src}/vs/nls.js`, `${src}`, 'vs/nls')); + loaderStream = es.merge(loaderStream, loaderPlugin(`${src}/vs/css.js`, `${src}`, 'vs/css')); } const files = []; const order = (f) => { @@ -63,10 +63,7 @@ function loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo) { if (f.path.endsWith('css.js')) { return 1; } - if (f.path.endsWith('nls.js')) { - return 2; - } - return 3; + return 2; }; return (loaderStream .pipe(es.through(function (data) { diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index cd269a0f02b6a..6f9786b4d1e00 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -60,8 +60,7 @@ function loader(src: string, bundledFileHeader: string, bundleLoader: boolean, e if (bundleLoader) { loaderStream = es.merge( loaderStream, - loaderPlugin(`${src}/vs/css.js`, `${src}`, 'vs/css'), - loaderPlugin(`${src}/vs/nls.js`, `${src}`, 'vs/nls'), + loaderPlugin(`${src}/vs/css.js`, `${src}`, 'vs/css') ); } @@ -73,10 +72,7 @@ function loader(src: string, bundledFileHeader: string, bundleLoader: boolean, e if (f.path.endsWith('css.js')) { return 1; } - if (f.path.endsWith('nls.js')) { - return 2; - } - return 3; + return 2; }; return ( diff --git a/build/lib/standalone.js b/build/lib/standalone.js index dbc47db0833fe..cf0e452aff33d 100644 --- a/build/lib/standalone.js +++ b/build/lib/standalone.js @@ -106,10 +106,7 @@ function extractEditor(options) { 'vs/css.build.ts', 'vs/css.ts', 'vs/loader.js', - 'vs/loader.d.ts', - 'vs/nls.build.ts', - 'vs/nls.ts', - 'vs/nls.mock.ts', + 'vs/loader.d.ts' ].forEach(copyFile); } function createESMSourcesAndResources2(options) { diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts index 775a1be5996d7..9a65bfa744478 100644 --- a/build/lib/standalone.ts +++ b/build/lib/standalone.ts @@ -118,10 +118,7 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str 'vs/css.build.ts', 'vs/css.ts', 'vs/loader.js', - 'vs/loader.d.ts', - 'vs/nls.build.ts', - 'vs/nls.ts', - 'vs/nls.mock.ts', + 'vs/loader.d.ts' ].forEach(copyFile); } diff --git a/src/buildfile.js b/src/buildfile.js index 9898cd44d1fc4..cfe4b389e5565 100644 --- a/src/buildfile.js +++ b/src/buildfile.js @@ -9,7 +9,7 @@ */ function createModuleDescription(name, exclude) { - let excludes = ['vs/css', 'vs/nls']; + let excludes = ['vs/css']; if (Array.isArray(exclude) && exclude.length > 0) { excludes = excludes.concat(exclude); } @@ -32,7 +32,7 @@ exports.base = [ { name: 'vs/editor/common/services/editorSimpleWorker', include: ['vs/base/common/worker/simpleWorker'], - exclude: ['vs/nls'], + exclude: [], prepend: [ { path: 'vs/loader.js' }, { path: 'vs/base/worker/workerMain.js' } @@ -41,7 +41,7 @@ exports.base = [ }, { name: 'vs/base/common/worker/simpleWorker', - exclude: ['vs/nls'], + exclude: [], } ]; diff --git a/src/vs/nls.build.ts b/src/vs/nls.build.ts deleted file mode 100644 index 05c063fa291a3..0000000000000 --- a/src/vs/nls.build.ts +++ /dev/null @@ -1,88 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const buildMap: { [name: string]: string[] } = {}; -const buildMapKeys: { [name: string]: string[] } = {}; -const entryPoints: { [entryPoint: string]: string[] } = {}; - -export interface ILocalizeInfo { - key: string; - comment: string[]; -} - -export function localize(data: ILocalizeInfo | string, message: string, ...args: (string | number | boolean | undefined | null)[]): string { - throw new Error(`Not supported at build time!`); -} - -export function localize2(data: ILocalizeInfo | string, message: string, ...args: (string | number | boolean | undefined | null)[]): never { - throw new Error(`Not supported at build time!`); -} - -export function getConfiguredDefaultLocale(): string | undefined { - throw new Error(`Not supported at build time!`); -} - -/** - * Invoked by the loader at build-time - */ -export function load(name: string, req: AMDLoader.IRelativeRequire, load: AMDLoader.IPluginLoadCallback, config: AMDLoader.IConfigurationOptions): void { - if (!name || name.length === 0) { - load({ localize, localize2, getConfiguredDefaultLocale }); - } else { - req([name + '.nls', name + '.nls.keys'], function (messages: string[], keys: string[]) { - buildMap[name] = messages; - buildMapKeys[name] = keys; - load(messages); - }); - } -} - -/** - * Invoked by the loader at build-time - */ -export function write(pluginName: string, moduleName: string, write: AMDLoader.IPluginWriteCallback): void { - const entryPoint = write.getEntryPoint(); - - entryPoints[entryPoint] = entryPoints[entryPoint] || []; - entryPoints[entryPoint].push(moduleName); - - if (moduleName !== entryPoint) { - write.asModule(pluginName + '!' + moduleName, 'define([\'vs/nls\', \'vs/nls!' + entryPoint + '\'], function(nls, data) { return nls.create("' + moduleName + '", data); });'); - } -} - -/** - * Invoked by the loader at build-time - */ -export function writeFile(pluginName: string, moduleName: string, req: AMDLoader.IRelativeRequire, write: AMDLoader.IPluginWriteFileCallback, config: AMDLoader.IConfigurationOptions): void { - if (entryPoints.hasOwnProperty(moduleName)) { - const fileName = req.toUrl(moduleName + '.nls.js'); - const contents = [ - '/*---------------------------------------------------------', - ' * Copyright (c) Microsoft Corporation. All rights reserved.', - ' *--------------------------------------------------------*/' - ], - entries = entryPoints[moduleName]; - - const data: { [moduleName: string]: string[] } = {}; - for (let i = 0; i < entries.length; i++) { - data[entries[i]] = buildMap[entries[i]]; - } - - contents.push('define("' + moduleName + '.nls", ' + JSON.stringify(data, null, '\t') + ');'); - write(fileName, contents.join('\r\n')); - } -} - -/** - * Invoked by the loader at build-time - */ -export function finishBuild(write: AMDLoader.IPluginWriteFileCallback): void { - write('nls.metadata.json', JSON.stringify({ - keys: buildMapKeys, - messages: buildMap, - bundles: entryPoints - }, null, '\t')); -} diff --git a/src/vs/nls.mock.ts b/src/vs/nls.mock.ts deleted file mode 100644 index 5323c6c6340d8..0000000000000 --- a/src/vs/nls.mock.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export interface ILocalizeInfo { - key: string; - comment: string[]; -} - -export interface ILocalizedString { - original: string; - value: string; -} - -function _format(message: string, args: any[]): string { - let result: string; - if (args.length === 0) { - result = message; - } else { - result = message.replace(/\{(\d+)\}/g, function (match, rest) { - const index = rest[0]; - return typeof args[index] !== 'undefined' ? args[index] : match; - }); - } - return result; -} - -export function localize(data: ILocalizeInfo | string, message: string, ...args: any[]): string { - return _format(message, args); -} - -export function localize2(data: ILocalizeInfo | string, message: string, ...args: any[]): ILocalizedString { - const res = _format(message, args); - return { - original: res, - value: res - }; -} - -export function getConfiguredDefaultLocale(_: string) { - return undefined; -} From c50fcf3d7c26ec9bd12b39d505a617fdb25946cb Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 28 Jun 2024 15:46:43 +0200 Subject: [PATCH 551/755] Fix selection issue with filtered group models (#218889) Review: Filtered Editor Group Models and Selections - fixes #213163 --- .../parts/editor/multiEditorTabsControl.ts | 26 +++++++++---------- .../common/editor/filteredEditorGroupModel.ts | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts index 588c334451a9b..36a087361f5af 100644 --- a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts +++ b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts @@ -1288,24 +1288,24 @@ export class MultiEditorTabsControl extends EditorTabsControl { throw new BugIndicatingError(); } - const anchorIndex = this.groupView.getIndexOfEditor(anchor); - if (anchorIndex === -1) { + const anchorEditorIndex = this.groupView.getIndexOfEditor(anchor); + if (anchorEditorIndex === -1) { throw new BugIndicatingError(); } let selection = this.groupView.selectedEditors; // Unselect editors on other side of anchor in relation to the target - let currentIndex = anchorIndex; - while (currentIndex >= 0 && currentIndex <= this.groupView.count - 1) { - currentIndex = anchorIndex < editorIndex ? currentIndex - 1 : currentIndex + 1; + let currentEditorIndex = anchorEditorIndex; + while (currentEditorIndex >= 0 && currentEditorIndex <= this.groupView.count - 1) { + currentEditorIndex = anchorEditorIndex < editorIndex ? currentEditorIndex - 1 : currentEditorIndex + 1; - if (!this.tabsModel.isSelected(currentIndex)) { + const currentEditor = this.groupView.getEditorByIndex(currentEditorIndex); + if (!currentEditor) { break; } - const currentEditor = this.groupView.getEditorByIndex(currentIndex); - if (!currentEditor) { + if (!this.groupView.isSelected(currentEditor)) { break; } @@ -1313,12 +1313,12 @@ export class MultiEditorTabsControl extends EditorTabsControl { } // Select editors between anchor and target - const fromIndex = anchorIndex < editorIndex ? anchorIndex : editorIndex; - const toIndex = anchorIndex < editorIndex ? editorIndex : anchorIndex; + const fromEditorIndex = anchorEditorIndex < editorIndex ? anchorEditorIndex : editorIndex; + const toEditorIndex = anchorEditorIndex < editorIndex ? editorIndex : anchorEditorIndex; - const editorsToSelect = this.groupView.getEditors(EditorsOrder.SEQUENTIAL).slice(fromIndex, toIndex + 1); + const editorsToSelect = this.groupView.getEditors(EditorsOrder.SEQUENTIAL).slice(fromEditorIndex, toEditorIndex + 1); for (const editor of editorsToSelect) { - if (!this.tabsModel.isSelected(editor)) { + if (!this.groupView.isSelected(editor)) { selection.push(editor); } } @@ -1343,7 +1343,7 @@ export class MultiEditorTabsControl extends EditorTabsControl { const recentEditors = this.groupView.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); for (let i = 1; i < recentEditors.length; i++) { // First one is the active editor const recentEditor = recentEditors[i]; - if (this.tabsModel.isSelected(recentEditor)) { + if (this.groupView.isSelected(recentEditor)) { newActiveEditor = recentEditor; break; } diff --git a/src/vs/workbench/common/editor/filteredEditorGroupModel.ts b/src/vs/workbench/common/editor/filteredEditorGroupModel.ts index 61d4f6a7c8009..b872c92677b01 100644 --- a/src/vs/workbench/common/editor/filteredEditorGroupModel.ts +++ b/src/vs/workbench/common/editor/filteredEditorGroupModel.ts @@ -36,7 +36,7 @@ abstract class FilteredEditorGroupModel extends Disposable implements IReadonlyE get activeEditor(): EditorInput | null { return this.model.activeEditor && this.filter(this.model.activeEditor) ? this.model.activeEditor : null; } get previewEditor(): EditorInput | null { return this.model.previewEditor && this.filter(this.model.previewEditor) ? this.model.previewEditor : null; } - get selectedEditors(): EditorInput[] { return this.model.selectedEditors.filter(e => this.filter(e)); } + get selectedEditors(): EditorInput[] { throw new Error('Filtered Editor Group Model should not be used for selectedEditors'); } isPinned(editorOrIndex: EditorInput | number): boolean { return this.model.isPinned(editorOrIndex); } isTransient(editorOrIndex: EditorInput | number): boolean { return this.model.isTransient(editorOrIndex); } From f272e4d094a1d60835dc53492a6606eb11e9de2b Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 28 Jun 2024 15:47:18 +0200 Subject: [PATCH 552/755] Disable compare action when no resource selected (#218875) Fix #212925 --- .../browser/parts/editor/editorGroupView.ts | 4 +- src/vs/workbench/common/contextkeys.ts | 1 + .../files/browser/fileActions.contribution.ts | 8 +- .../contrib/files/browser/fileConstants.ts | 1 + .../files/browser/views/openEditorsView.ts | 82 ++++++++++++------- 5 files changed, 60 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 6c8c42ec330a3..405049cfd1b50 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/editorgroupview'; import { EditorGroupModel, IEditorOpenOptions, IGroupModelChangeEvent, ISerializedEditorGroupModel, isGroupEditorCloseEvent, isGroupEditorOpenEvent, isSerializedEditorGroupModel } from 'vs/workbench/common/editor/editorGroupModel'; import { GroupIdentifier, CloseDirection, IEditorCloseEvent, IEditorPane, SaveReason, IEditorPartOptionsChangeEvent, EditorsOrder, IVisibleEditorPane, EditorResourceAccessor, EditorInputCapabilities, IUntypedEditorInput, DEFAULT_EDITOR_ASSOCIATION, SideBySideEditor, EditorCloseContext, IEditorWillMoveEvent, IEditorWillOpenEvent, IMatchEditorOptions, GroupModelChangeKind, IActiveEditorChangeEvent, IFindEditorOptions, IToolbarActions, TEXT_DIFF_EDITOR_ID } from 'vs/workbench/common/editor'; -import { ActiveEditorGroupLockedContext, ActiveEditorDirtyContext, EditorGroupEditorsCountContext, ActiveEditorStickyContext, ActiveEditorPinnedContext, ActiveEditorLastInGroupContext, ActiveEditorFirstInGroupContext, ResourceContextKey, applyAvailableEditorIds, ActiveEditorAvailableEditorIdsContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorContext, ActiveEditorReadonlyContext, ActiveEditorCanRevertContext, ActiveEditorCanToggleReadonlyContext, ActiveCompareEditorCanSwapContext, MultipleEditorsSelectedInGroupContext, TwoEditorsSelectedInGroupContext } from 'vs/workbench/common/contextkeys'; +import { ActiveEditorGroupLockedContext, ActiveEditorDirtyContext, EditorGroupEditorsCountContext, ActiveEditorStickyContext, ActiveEditorPinnedContext, ActiveEditorLastInGroupContext, ActiveEditorFirstInGroupContext, ResourceContextKey, applyAvailableEditorIds, ActiveEditorAvailableEditorIdsContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorContext, ActiveEditorReadonlyContext, ActiveEditorCanRevertContext, ActiveEditorCanToggleReadonlyContext, ActiveCompareEditorCanSwapContext, MultipleEditorsSelectedInGroupContext, TwoEditorsSelectedInGroupContext, SelectedEditorsInGroupFileOrUntitledResourceContextKey } from 'vs/workbench/common/contextkeys'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { Emitter, Relay } from 'vs/base/common/event'; @@ -259,6 +259,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const multipleEditorsSelectedContext = MultipleEditorsSelectedInGroupContext.bindTo(this.scopedContextKeyService); const twoEditorsSelectedContext = TwoEditorsSelectedInGroupContext.bindTo(this.scopedContextKeyService); + const selectedEditorsHaveFileOrUntitledResourceContext = SelectedEditorsInGroupFileOrUntitledResourceContextKey.bindTo(this.scopedContextKeyService); const groupActiveEditorContext = this.editorPartsView.bind(ActiveEditorContext, this); const groupActiveEditorIsReadonly = this.editorPartsView.bind(ActiveEditorReadonlyContext, this); @@ -355,6 +356,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { case GroupModelChangeKind.EDITORS_SELECTION: multipleEditorsSelectedContext.set(this.model.selectedEditors.length > 1); twoEditorsSelectedContext.set(this.model.selectedEditors.length === 2); + selectedEditorsHaveFileOrUntitledResourceContext.set(this.model.selectedEditors.every(e => e.resource && (this.fileService.hasProvider(e.resource) || e.resource.scheme === Schemas.untitled))); break; } diff --git a/src/vs/workbench/common/contextkeys.ts b/src/vs/workbench/common/contextkeys.ts index 97937218bbb36..d02f9e0e89dda 100644 --- a/src/vs/workbench/common/contextkeys.ts +++ b/src/vs/workbench/common/contextkeys.ts @@ -74,6 +74,7 @@ export const MultipleEditorGroupsContext = new RawContextKey('multipleE export const SingleEditorGroupsContext = MultipleEditorGroupsContext.toNegated(); export const MultipleEditorsSelectedInGroupContext = new RawContextKey('multipleEditorsSelectedInGroup', false, localize('multipleEditorsSelectedInGroup', "Whether multiple editors have been selected in an editor group")); export const TwoEditorsSelectedInGroupContext = new RawContextKey('twoEditorsSelectedInGroup', false, localize('twoEditorsSelectedInGroup', "Whether exactly two editors have been selected in an editor group")); +export const SelectedEditorsInGroupFileOrUntitledResourceContextKey = new RawContextKey('SelectedEditorsInGroupFileOrUntitledResourceContextKey', true, localize('SelectedEditorsInGroupFileOrUntitledResourceContextKey', "Whether all selected editors in a group have a file or untitled resource associated")); // Editor Part Context Keys export const EditorPartMultipleEditorGroupsContext = new RawContextKey('editorPartMultipleEditorGroups', false, localize('editorPartMultipleEditorGroups', "Whether there are multiple editor groups opened in an editor part")); diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 963e5c5692506..b910fb3f2eef2 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -10,7 +10,7 @@ import { MenuId, MenuRegistry, registerAction2 } from 'vs/platform/actions/commo import { ICommandAction } from 'vs/platform/action/common/action'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { openWindowCommand, newWindowCommand } from 'vs/workbench/contrib/files/browser/fileCommands'; -import { COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, OpenEditorsDirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL, OpenEditorsReadonlyEditorContext, OPEN_WITH_EXPLORER_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID, NEW_UNTITLED_FILE_LABEL, SAVE_ALL_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileConstants'; +import { COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, OpenEditorsDirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL, OpenEditorsReadonlyEditorContext, OPEN_WITH_EXPLORER_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID, NEW_UNTITLED_FILE_LABEL, SAVE_ALL_COMMAND_ID, OpenEditorsSelectedFileOrUntitledContext } from 'vs/workbench/contrib/files/browser/fileConstants'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -20,7 +20,7 @@ import { CLOSE_SAVED_EDITORS_COMMAND_ID, CLOSE_EDITORS_IN_GROUP_COMMAND_ID, CLOS import { AutoSaveAfterShortDelayContext } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { WorkbenchListDoubleSelection } from 'vs/platform/list/browser/listService'; import { Schemas } from 'vs/base/common/network'; -import { DirtyWorkingCopiesContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, WorkbenchStateContext, WorkspaceFolderCountContext, SidebarFocusContext, ActiveEditorCanRevertContext, ActiveEditorContext, ResourceContextKey, ActiveEditorAvailableEditorIdsContext, MultipleEditorsSelectedInGroupContext, TwoEditorsSelectedInGroupContext } from 'vs/workbench/common/contextkeys'; +import { DirtyWorkingCopiesContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, WorkbenchStateContext, WorkspaceFolderCountContext, SidebarFocusContext, ActiveEditorCanRevertContext, ActiveEditorContext, ResourceContextKey, ActiveEditorAvailableEditorIdsContext, MultipleEditorsSelectedInGroupContext, TwoEditorsSelectedInGroupContext, SelectedEditorsInGroupFileOrUntitledResourceContextKey } from 'vs/workbench/common/contextkeys'; import { IsWebContext } from 'vs/platform/contextkey/common/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ThemeIcon } from 'vs/base/common/themables'; @@ -413,14 +413,14 @@ MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { group: '3_compare', order: 30, command: compareSelectedCommand, - when: ContextKeyExpr.and(ResourceContextKey.HasResource, WorkbenchListDoubleSelection, isFileOrUntitledResourceContextKey) + when: ContextKeyExpr.and(ResourceContextKey.HasResource, WorkbenchListDoubleSelection, OpenEditorsSelectedFileOrUntitledContext) }); MenuRegistry.appendMenuItem(MenuId.EditorTitleContext, { group: '3_compare', order: 30, command: compareSelectedCommand, - when: ContextKeyExpr.and(ResourceContextKey.HasResource, TwoEditorsSelectedInGroupContext, isFileOrUntitledResourceContextKey) + when: ContextKeyExpr.and(ResourceContextKey.HasResource, TwoEditorsSelectedInGroupContext, SelectedEditorsInGroupFileOrUntitledResourceContextKey) }); MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { diff --git a/src/vs/workbench/contrib/files/browser/fileConstants.ts b/src/vs/workbench/contrib/files/browser/fileConstants.ts index c38f9987d22e0..555cff9f3d257 100644 --- a/src/vs/workbench/contrib/files/browser/fileConstants.ts +++ b/src/vs/workbench/contrib/files/browser/fileConstants.ts @@ -35,6 +35,7 @@ export const SAVE_FILES_COMMAND_ID = 'workbench.action.files.saveFiles'; export const OpenEditorsGroupContext = new RawContextKey('groupFocusedInOpenEditors', false); export const OpenEditorsDirtyEditorContext = new RawContextKey('dirtyEditorFocusedInOpenEditors', false); export const OpenEditorsReadonlyEditorContext = new RawContextKey('readonlyEditorFocusedInOpenEditors', false); +export const OpenEditorsSelectedFileOrUntitledContext = new RawContextKey('openEditorsSelectedFileOrUntitled', true); export const ResourceSelectedForCompareContext = new RawContextKey('resourceSelectedForCompare', false); export const REMOVE_ROOT_FOLDER_COMMAND_ID = 'removeRootFolder'; diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index a5de264bfcfdc..f7560f5a89f7a 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -18,7 +18,7 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SaveAllInGroupAction, CloseGroupAction } from 'vs/workbench/contrib/files/browser/fileActions'; import { OpenEditorsFocusedContext, ExplorerFocusedContext, IFilesConfiguration, OpenEditor } from 'vs/workbench/contrib/files/common/files'; import { CloseAllEditorsAction, CloseEditorAction, UnpinEditorAction } from 'vs/workbench/browser/parts/editor/editorActions'; -import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { asCssVariable, badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; @@ -28,7 +28,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { DisposableMap, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { MenuId, Action2, registerAction2, MenuRegistry } from 'vs/platform/actions/common/actions'; -import { OpenEditorsDirtyEditorContext, OpenEditorsGroupContext, OpenEditorsReadonlyEditorContext, SAVE_ALL_LABEL, SAVE_ALL_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileConstants'; +import { OpenEditorsDirtyEditorContext, OpenEditorsGroupContext, OpenEditorsReadonlyEditorContext, SAVE_ALL_LABEL, SAVE_ALL_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID, OpenEditorsSelectedFileOrUntitledContext } from 'vs/workbench/contrib/files/browser/fileConstants'; import { ResourceContextKey, MultipleEditorGroupsContext } from 'vs/workbench/common/contextkeys'; import { CodeDataTransfers, containsDragType } from 'vs/platform/dnd/browser/dnd'; import { ResourcesDropHandler, fillEditorsDragData } from 'vs/workbench/browser/dnd'; @@ -55,6 +55,7 @@ import { ILocalizedString } from 'vs/platform/action/common/action'; import { mainWindow } from 'vs/base/browser/window'; import { EditorGroupView } from 'vs/workbench/browser/parts/editor/editorGroupView'; import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { IFileService } from 'vs/platform/files/common/files'; const $ = dom.$; @@ -74,10 +75,6 @@ export class OpenEditorsView extends ViewPane { private needsRefresh = false; private elements: (OpenEditor | IEditorGroup)[] = []; private sortOrder: 'editorOrder' | 'alphabetical' | 'fullPath'; - private resourceContext!: ResourceContextKey; - private groupFocusedContext!: IContextKey; - private dirtyEditorFocusedContext!: IContextKey; - private readonlyEditorFocusedContext!: IContextKey; private blockFocusActiveEditorTracking = false; constructor( @@ -95,6 +92,7 @@ export class OpenEditorsView extends ViewPane { @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, @IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService, @IOpenerService openerService: IOpenerService, + @IFileService private readonly fileService: IFileService ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService); @@ -245,32 +243,8 @@ export class OpenEditorsView extends ViewPane { this.updateSize(); - // Bind context keys - OpenEditorsFocusedContext.bindTo(this.list.contextKeyService); - ExplorerFocusedContext.bindTo(this.list.contextKeyService); - - this.resourceContext = this.instantiationService.createInstance(ResourceContextKey); - this._register(this.resourceContext); - this.groupFocusedContext = OpenEditorsGroupContext.bindTo(this.contextKeyService); - this.dirtyEditorFocusedContext = OpenEditorsDirtyEditorContext.bindTo(this.contextKeyService); - this.readonlyEditorFocusedContext = OpenEditorsReadonlyEditorContext.bindTo(this.contextKeyService); - + this.handleContextKeys(); this._register(this.list.onContextMenu(e => this.onListContextMenu(e))); - this._register(this.list.onDidChangeFocus(e => { - this.resourceContext.reset(); - this.groupFocusedContext.reset(); - this.dirtyEditorFocusedContext.reset(); - this.readonlyEditorFocusedContext.reset(); - const element = e.elements.length ? e.elements[0] : undefined; - if (element instanceof OpenEditor) { - const resource = element.getResource(); - this.dirtyEditorFocusedContext.set(element.editor.isDirty() && !element.editor.isSaving()); - this.readonlyEditorFocusedContext.set(!!element.editor.isReadonly()); - this.resourceContext.set(resource ?? null); - } else if (!!element) { - this.groupFocusedContext.set(true); - } - })); // Open when selecting via keyboard this._register(this.list.onMouseMiddleClick(e => { @@ -318,6 +292,52 @@ export class OpenEditorsView extends ViewPane { })); } + private handleContextKeys() { + if (!this.list) { + return; + } + + // Bind context keys + OpenEditorsFocusedContext.bindTo(this.list.contextKeyService); + ExplorerFocusedContext.bindTo(this.list.contextKeyService); + + const groupFocusedContext = OpenEditorsGroupContext.bindTo(this.contextKeyService); + const dirtyEditorFocusedContext = OpenEditorsDirtyEditorContext.bindTo(this.contextKeyService); + const readonlyEditorFocusedContext = OpenEditorsReadonlyEditorContext.bindTo(this.contextKeyService); + const openEditorsSelectedFileOrUntitledContext = OpenEditorsSelectedFileOrUntitledContext.bindTo(this.contextKeyService); + + const resourceContext = this.instantiationService.createInstance(ResourceContextKey); + this._register(resourceContext); + + this._register(this.list.onDidChangeFocus(e => { + resourceContext.reset(); + groupFocusedContext.reset(); + dirtyEditorFocusedContext.reset(); + readonlyEditorFocusedContext.reset(); + + const element = e.elements.length ? e.elements[0] : undefined; + if (element instanceof OpenEditor) { + const resource = element.getResource(); + dirtyEditorFocusedContext.set(element.editor.isDirty() && !element.editor.isSaving()); + readonlyEditorFocusedContext.set(!!element.editor.isReadonly()); + resourceContext.set(resource ?? null); + } else if (!!element) { + groupFocusedContext.set(true); + } + })); + + this._register(this.list.onDidChangeSelection(e => { + const selectedAreFileOrUntitled = e.elements.every(e => { + if (e instanceof OpenEditor) { + const resource = e.getResource(); + return resource && (resource.scheme === Schemas.untitled || this.fileService.hasProvider(resource)); + } + return false; + }); + openEditorsSelectedFileOrUntitledContext.set(selectedAreFileOrUntitled); + })); + } + override focus(): void { super.focus(); From efa1397e63cc9184a2e838fcc05e43f6ed8744b7 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 28 Jun 2024 15:47:48 +0200 Subject: [PATCH 553/755] Update default color for sticky scroll and location specific ones (#218712) default color for sticky scroll and location specific ones --- src/vs/platform/theme/browser/defaultStyles.ts | 2 +- .../contrib/extensions/browser/extensionsViews.ts | 5 +---- .../contrib/scm/browser/scmRepositoriesViewPane.ts | 5 +---- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 7 ++----- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/vs/platform/theme/browser/defaultStyles.ts b/src/vs/platform/theme/browser/defaultStyles.ts index 871178faf38c1..a0df50920abb2 100644 --- a/src/vs/platform/theme/browser/defaultStyles.ts +++ b/src/vs/platform/theme/browser/defaultStyles.ts @@ -176,7 +176,7 @@ export const defaultListStyles: IListStyles = { treeInactiveIndentGuidesStroke: asCssVariable(treeInactiveIndentGuidesStroke), treeStickyScrollBackground: undefined, treeStickyScrollBorder: undefined, - treeStickyScrollShadow: undefined, + treeStickyScrollShadow: asCssVariable(scrollbarShadow), tableColumnsBorder: asCssVariable(tableColumnsBorder), tableOddRowsBackgroundColor: asCssVariable(tableOddRowsBackgroundColor), }; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index 4dcb55bb040ba..933788b162f06 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -41,7 +41,6 @@ import { CancelablePromise, createCancelablePromise, ThrottledDelayer } from 'vs import { IProductService } from 'vs/platform/product/common/productService'; import { SeverityIcon } from 'vs/platform/severityIcon/browser/severityIcon'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; @@ -214,9 +213,7 @@ export class ExtensionsListView extends ViewPane { return localize('extensions', "Extensions"); } }, - overrideStyles: { - listBackground: SIDE_BAR_BACKGROUND - }, + overrideStyles: this.getLocationBasedColors().listOverrideStyles, openOnSingleClick: true }) as WorkbenchPagedList; this._register(this.list.onContextMenu(e => this.onContextMenu(e), this)); diff --git a/src/vs/workbench/contrib/scm/browser/scmRepositoriesViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmRepositoriesViewPane.ts index 890e39b459f00..99e9f61f835c4 100644 --- a/src/vs/workbench/contrib/scm/browser/scmRepositoriesViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmRepositoriesViewPane.ts @@ -18,7 +18,6 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewDescriptorService } from 'vs/workbench/common/views'; -import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { RepositoryActionRunner, RepositoryRenderer } from 'vs/workbench/contrib/scm/browser/scmRepositoryRenderer'; @@ -82,9 +81,7 @@ export class SCMRepositoriesViewPane extends ViewPane { this.list = this.instantiationService.createInstance(WorkbenchList, `SCM Main`, listContainer, delegate, [renderer], { identityProvider, horizontalScrolling: false, - overrideStyles: { - listBackground: SIDE_BAR_BACKGROUND - }, + overrideStyles: this.getLocationBasedColors().listOverrideStyles, accessibilityProvider: { getAriaLabel(r: ISCMRepository) { return r.provider.label; diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 8b47b5cec4dd6..028ef92e15936 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -37,11 +37,10 @@ import { URI } from 'vs/base/common/uri'; import { FileKind } from 'vs/platform/files/common/files'; import { compareFileNames, comparePaths } from 'vs/base/common/comparers'; import { FuzzyScore, createMatches, IMatch } from 'vs/base/common/filters'; -import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { IViewDescriptorService } from 'vs/workbench/common/views'; import { localize } from 'vs/nls'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; -import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; @@ -3089,9 +3088,7 @@ export class SCMViewPane extends ViewPane { identityProvider: new SCMResourceIdentityProvider(), sorter: new SCMTreeSorter(() => this.viewMode, () => this.viewSortKey), keyboardNavigationLabelProvider: this.instantiationService.createInstance(SCMTreeKeyboardNavigationLabelProvider, () => this.viewMode), - overrideStyles: { - listBackground: this.viewDescriptorService.getViewLocationById(this.id) === ViewContainerLocation.Panel ? PANEL_BACKGROUND : SIDE_BAR_BACKGROUND - }, + overrideStyles: this.getLocationBasedColors().listOverrideStyles, collapseByDefault: (e: unknown) => { // Repository, Resource Group, Resource Folder (Tree), History Item Change Folder (Tree) if (isSCMRepository(e) || isSCMResourceGroup(e) || isSCMResourceNode(e) || isSCMHistoryItemChangeNode(e)) { From ecf818849d272b41e0d4d17ae5e2301de4474e68 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2024 16:27:08 +0200 Subject: [PATCH 554/755] add location specific data along when making chat request (#219114) with this PR the implicit variables tricks aren't needed anymore --- .vscode/settings.json | 3 +- .../common/extensionsApiProposals.ts | 1 + .../workbench/api/common/extHost.api.impl.ts | 4 +- .../workbench/api/common/extHost.protocol.ts | 4 +- .../api/common/extHostChatAgents2.ts | 41 +++++++++++++++---- .../api/common/extHostTypeConverters.ts | 5 ++- src/vs/workbench/api/common/extHostTypes.ts | 14 +++++++ .../contrib/chat/browser/chatWidget.ts | 31 ++++++++++++-- .../contrib/chat/common/chatAgents.ts | 3 +- .../contrib/chat/common/chatService.ts | 21 ++++++++++ .../contrib/chat/common/chatServiceImpl.ts | 1 + .../browser/inlineChatContentWidget.ts | 4 +- .../browser/inlineChatController.ts | 22 ++++++++-- .../inlineChat/browser/inlineChatWidget.ts | 6 +-- .../browser/inlineChatZoneWidget.ts | 4 +- .../controller/chat/notebookChatController.ts | 14 ++++++- .../chat/browser/terminalChatWidget.ts | 8 +++- ...scode.proposed.chatParticipantPrivate.d.ts | 26 ++++++++++++ 18 files changed, 180 insertions(+), 32 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 52dac9d796032..9255a781bd487 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -160,8 +160,7 @@ "@xterm/headless", "node-pty", "vscode-notebook-renderer", - "src/vs/workbench/workbench.web.main.ts", - "src/vs/workbench/api/common/extHostTypes.ts" + "src/vs/workbench/workbench.web.main.ts" ], "[github-issues]": { "editor.wordWrap": "on" diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index abfd6c5228c52..a3f677336d139 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -35,6 +35,7 @@ const _allApiProposals = { }, chatParticipantPrivate: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', + version: 2 }, chatProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatProvider.d.ts', diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 4b6a73823dcec..214c68cc394bd 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -210,7 +210,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostUriOpeners = rpcProtocol.set(ExtHostContext.ExtHostUriOpeners, new ExtHostUriOpeners(rpcProtocol)); const extHostProfileContentHandlers = rpcProtocol.set(ExtHostContext.ExtHostProfileContentHandlers, new ExtHostProfileContentHandlers(rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostInteractive, new ExtHostInteractive(rpcProtocol, extHostNotebook, extHostDocumentsAndEditors, extHostCommands, extHostLogService)); - const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands)); + const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, extHostDocuments, extHostNotebook)); const extHostChatVariables = rpcProtocol.set(ExtHostContext.ExtHostChatVariables, new ExtHostChatVariables(rpcProtocol)); const extHostLanguageModelTools = rpcProtocol.set(ExtHostContext.ExtHostLanguageModelTools, new ExtHostLanguageModelTools(rpcProtocol)); const extHostAiRelatedInformation = rpcProtocol.set(ExtHostContext.ExtHostAiRelatedInformation, new ExtHostRelatedInformation(rpcProtocol)); @@ -1740,6 +1740,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I ChatRequestTurn: extHostTypes.ChatRequestTurn, ChatResponseTurn: extHostTypes.ChatResponseTurn, ChatLocation: extHostTypes.ChatLocation, + ChatRequestEditorData: extHostTypes.ChatRequestEditorData, + ChatRequestNotebookData: extHostTypes.ChatRequestNotebookData, LanguageModelChatMessageRole: extHostTypes.LanguageModelChatMessageRole, LanguageModelChatMessage: extHostTypes.LanguageModelChatMessage, LanguageModelChatMessageFunctionResultPart: extHostTypes.LanguageModelFunctionResultPart, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index d810c7b892d41..b1dcc4981a372 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1274,8 +1274,8 @@ export type IChatAgentHistoryEntryDto = { }; export interface ExtHostChatAgentsShape2 { - $invokeAgent(handle: number, request: IChatAgentRequest, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise; - $provideFollowups(request: IChatAgentRequest, handle: number, result: IChatAgentResult, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise; + $invokeAgent(handle: number, request: Dto, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise; + $provideFollowups(request: Dto, handle: number, result: IChatAgentResult, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise; $acceptFeedback(handle: number, result: IChatAgentResult, vote: ChatAgentVoteDirection, reportIssue?: boolean): void; $acceptAction(handle: number, result: IChatAgentResult, action: IChatUserActionEvent): void; $invokeCompletionProvider(handle: number, query: string, token: CancellationToken): Promise; diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index 37a81b0034df9..a34438f1da150 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -11,6 +11,7 @@ import { Emitter } from 'vs/base/common/event'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Iterable } from 'vs/base/common/iterator'; import { Disposable, DisposableMap, DisposableStore } from 'vs/base/common/lifecycle'; +import { revive } from 'vs/base/common/marshalling'; import { StopWatch } from 'vs/base/common/stopwatch'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; @@ -19,6 +20,8 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostChatAgentsShape2, IChatAgentCompletionItem, IChatAgentHistoryEntryDto, IChatProgressDto, IExtensionChatAgentMetadata, IMainContext, MainContext, MainThreadChatAgentsShape2 } from 'vs/workbench/api/common/extHost.protocol'; import { CommandsConverter, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; +import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebook'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { ChatAgentLocation, IChatAgentRequest, IChatAgentResult } from 'vs/workbench/contrib/chat/common/chatAgents'; @@ -262,7 +265,9 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS constructor( mainContext: IMainContext, private readonly _logService: ILogService, - private readonly commands: ExtHostCommands, + private readonly _commands: ExtHostCommands, + private readonly _documents: ExtHostDocuments, + private readonly _notebooks: ExtHostNotebookController ) { super(); this._proxy = mainContext.getProxy(MainContext.MainThreadChatAgents2); @@ -290,12 +295,14 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS return agent.apiAgent; } - async $invokeAgent(handle: number, request: IChatAgentRequest, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise { + async $invokeAgent(handle: number, requestDto: Dto, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise { const agent = this._agents.get(handle); if (!agent) { throw new Error(`[CHAT](${handle}) CANNOT invoke agent because the agent is not registered`); } + const request = revive(requestDto); + // Init session disposables let sessionDisposables = this._sessionDisposables.get(request.sessionId); if (!sessionDisposables) { @@ -303,11 +310,28 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS this._sessionDisposables.set(request.sessionId, sessionDisposables); } - const stream = new ChatAgentResponseStream(agent.extension, request, this._proxy, this.commands.converter, sessionDisposables); + const stream = new ChatAgentResponseStream(agent.extension, request, this._proxy, this._commands.converter, sessionDisposables); try { const convertedHistory = await this.prepareHistoryTurns(request.agentId, context); + + // in-place converting for location-data + let location2: vscode.ChatRequestEditorData | vscode.ChatRequestNotebookData | undefined; + if (request.locationData?.type === ChatAgentLocation.Editor) { + // editor data + const document = this._documents.getDocument(request.locationData.document); + location2 = new extHostTypes.ChatRequestEditorData(document, typeConvert.Selection.to(request.locationData.selection), typeConvert.Range.to(request.locationData.wholeRange)); + + } else if (request.locationData?.type === ChatAgentLocation.Notebook) { + // notebook data + const notebook = this._notebooks.getNotebookDocument(request.locationData.sessionInputUri); + location2 = new extHostTypes.ChatRequestNotebookData(notebook.apiNotebook); + + } else if (request.locationData?.type === ChatAgentLocation.Terminal) { + // TBD + } + const task = agent.invoke( - typeConvert.ChatAgentRequest.to(request), + typeConvert.ChatAgentRequest.to(request, location2), { history: convertedHistory }, stream.apiObject, token @@ -364,7 +388,7 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS res.push(new extHostTypes.ChatRequestTurn(h.request.message, h.request.command, h.request.variables.variables.map(typeConvert.ChatAgentValueReference.to), h.request.agentId)); // RESPONSE turn - const parts = coalesce(h.response.map(r => typeConvert.ChatResponsePart.toContent(r, this.commands.converter))); + const parts = coalesce(h.response.map(r => typeConvert.ChatResponsePart.toContent(r, this._commands.converter))); res.push(new extHostTypes.ChatResponseTurn(parts, result, h.request.agentId, h.request.command)); } @@ -375,12 +399,13 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS this._sessionDisposables.deleteAndDispose(sessionId); } - async $provideFollowups(request: IChatAgentRequest, handle: number, result: IChatAgentResult, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise { + async $provideFollowups(requestDto: Dto, handle: number, result: IChatAgentResult, context: { history: IChatAgentHistoryEntryDto[] }, token: CancellationToken): Promise { const agent = this._agents.get(handle); if (!agent) { return Promise.resolve([]); } + const request = revive(requestDto); const convertedHistory = await this.prepareHistoryTurns(agent.id, context); const ehResult = typeConvert.ChatAgentResult.to(result); @@ -429,7 +454,7 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS return; } - const ehAction = typeConvert.ChatAgentUserActionEvent.to(result, event, this.commands.converter); + const ehAction = typeConvert.ChatAgentUserActionEvent.to(result, event, this._commands.converter); if (ehAction) { agent.acceptAction(Object.freeze(ehAction)); } @@ -452,7 +477,7 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS const items = await agent.invokeCompletionProvider(query, token); - return items.map((i) => typeConvert.ChatAgentCompletionItem.from(i, this.commands.converter, disposables)); + return items.map((i) => typeConvert.ChatAgentCompletionItem.from(i, this._commands.converter, disposables)); } async $provideWelcomeMessage(handle: number, location: ChatAgentLocation, token: CancellationToken): Promise<(string | IMarkdownString)[] | undefined> { diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 32d972e986224..36f83b564e0b3 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2592,7 +2592,7 @@ export namespace ChatResponsePart { } export namespace ChatAgentRequest { - export function to(request: IChatAgentRequest): vscode.ChatRequest { + export function to(request: IChatAgentRequest, location2: vscode.ChatRequestEditorData | vscode.ChatRequestNotebookData | undefined): vscode.ChatRequest { return { prompt: request.message, command: request.command, @@ -2601,7 +2601,8 @@ export namespace ChatAgentRequest { references: request.variables.variables.map(ChatAgentValueReference.to), location: ChatLocation.to(request.location), acceptedConfirmationData: request.acceptedConfirmationData, - rejectedConfirmationData: request.rejectedConfirmationData + rejectedConfirmationData: request.rejectedConfirmationData, + location2 }; } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 65854c6551230..4189c61331fae 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4449,6 +4449,20 @@ export enum ChatLocation { Editor = 4, } +export class ChatRequestEditorData { + constructor( + readonly document: vscode.TextDocument, + readonly selection: vscode.Selection, + readonly wholeRange: vscode.Range, + ) { } +} + +export class ChatRequestNotebookData { + constructor( + readonly notebook: vscode.NotebookDocument + ) { } +} + export enum LanguageModelChatMessageRole { User = 1, Assistant = 2, diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index 1d1dc4b817c00..4a8aca892cfa8 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -36,7 +36,7 @@ import { CONTEXT_CHAT_INPUT_HAS_AGENT, CONTEXT_CHAT_LOCATION, CONTEXT_CHAT_REQUE import { ChatModelInitState, IChatModel, IChatRequestVariableEntry, IChatResponseModel } from 'vs/workbench/contrib/chat/common/chatModel'; import { ChatRequestAgentPart, IParsedChatRequest, chatAgentLeader, chatSubcommandLeader } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { ChatRequestParser } from 'vs/workbench/contrib/chat/common/chatRequestParser'; -import { IChatFollowup, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatFollowup, IChatLocationData, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { IChatSlashCommandService } from 'vs/workbench/contrib/chat/common/chatSlashCommands'; import { ChatViewModel, IChatResponseViewModel, isRequestVM, isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { CodeBlockModelCollection } from 'vs/workbench/contrib/chat/common/codeBlockModelCollection'; @@ -77,6 +77,11 @@ export interface IChatWidgetContrib extends IDisposable { setInputState?(s: any): void; } +export interface IChatWidgetLocationOptions { + location: ChatAgentLocation; + resolveData?(): IChatLocationData | undefined; +} + export class ChatWidget extends Disposable implements IChatWidget { public static readonly CONTRIBS: { new(...args: [IChatWidget, ...any]): IChatWidgetContrib }[] = []; @@ -176,8 +181,14 @@ export class ChatWidget extends Disposable implements IChatWidget { return this.contextKeyService; } + private readonly _location: IChatWidgetLocationOptions; + + get location() { + return this._location.location; + } + constructor( - readonly location: ChatAgentLocation, + location: ChatAgentLocation | IChatWidgetLocationOptions, readonly viewContext: IChatWidgetViewContext, private readonly viewOptions: IChatWidgetViewOptions, private readonly styles: IChatWidgetStyles, @@ -194,8 +205,15 @@ export class ChatWidget extends Disposable implements IChatWidget { @IChatSlashCommandService private readonly chatSlashCommandService: IChatSlashCommandService, ) { super(); + + if (typeof location === 'object') { + this._location = location; + } else { + this._location = { location }; + } + CONTEXT_IN_CHAT_SESSION.bindTo(contextKeyService).set(true); - CONTEXT_CHAT_LOCATION.bindTo(contextKeyService).set(location); + CONTEXT_CHAT_LOCATION.bindTo(contextKeyService).set(this._location.location); CONTEXT_IN_QUICK_CHAT.bindTo(contextKeyService).set('resource' in viewContext); this.agentInInput = CONTEXT_CHAT_INPUT_HAS_AGENT.bindTo(contextKeyService); this.requestInProgress = CONTEXT_CHAT_REQUEST_IN_PROGRESS.bindTo(contextKeyService); @@ -748,7 +766,12 @@ export class ChatWidget extends Disposable implements IChatWidget { 'query' in opts ? opts.query : `${opts.prefix} ${editorValue}`; const isUserQuery = !opts || 'prefix' in opts; - const result = await this.chatService.sendRequest(this.viewModel.sessionId, input, { location: this.location, parserContext: { selectedAgent: this._lastSelectedAgent }, attachedContext: [...this.inputPart.attachedContext.values()] }); + const result = await this.chatService.sendRequest(this.viewModel.sessionId, input, { + location: this.location, + locationData: this._location.resolveData?.(), + parserContext: { selectedAgent: this._lastSelectedAgent }, + attachedContext: [...this.inputPart.attachedContext.values()] + }); if (result) { this.inputPart.attachedContext.clear(); diff --git a/src/vs/workbench/contrib/chat/common/chatAgents.ts b/src/vs/workbench/contrib/chat/common/chatAgents.ts index e2f703325b14f..a3c9016944be7 100644 --- a/src/vs/workbench/contrib/chat/common/chatAgents.ts +++ b/src/vs/workbench/contrib/chat/common/chatAgents.ts @@ -27,7 +27,7 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { CONTEXT_CHAT_ENABLED } from 'vs/workbench/contrib/chat/common/chatContextKeys'; import { IChatProgressResponseContent, IChatRequestVariableData, ISerializableChatAgentData } from 'vs/workbench/contrib/chat/common/chatModel'; import { IRawChatCommandContribution, RawChatParticipantLocation } from 'vs/workbench/contrib/chat/common/chatParticipantContribTypes'; -import { IChatFollowup, IChatProgress, IChatResponseErrorDetails, IChatTaskDto } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatFollowup, IChatLocationData, IChatProgress, IChatResponseErrorDetails, IChatTaskDto } from 'vs/workbench/contrib/chat/common/chatService'; //#region agent service, commands etc @@ -126,6 +126,7 @@ export interface IChatAgentRequest { enableCommandDetection?: boolean; variables: IChatRequestVariableData; location: ChatAgentLocation; + locationData?: IChatLocationData; acceptedConfirmationData?: any[]; rejectedConfirmationData?: any[]; } diff --git a/src/vs/workbench/contrib/chat/common/chatService.ts b/src/vs/workbench/contrib/chat/common/chatService.ts index a6921314d1896..fc4add785ffef 100644 --- a/src/vs/workbench/contrib/chat/common/chatService.ts +++ b/src/vs/workbench/contrib/chat/common/chatService.ts @@ -10,6 +10,7 @@ import { IMarkdownString } from 'vs/base/common/htmlContent'; import { ThemeIcon } from 'vs/base/common/themables'; import { URI } from 'vs/base/common/uri'; import { IRange, Range } from 'vs/editor/common/core/range'; +import { ISelection } from 'vs/editor/common/core/selection'; import { Command, Location, TextEdit } from 'vs/editor/common/languages'; import { FileType } from 'vs/platform/files/common/files'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -298,8 +299,28 @@ export interface IChatSendRequestData extends IChatSendRequestResponseState { slashCommand?: IChatAgentCommand; } +export interface IChatEditorLocationData { + type: ChatAgentLocation.Editor; + document: URI; + selection: ISelection; + wholeRange: IRange; +} + +export interface IChatNotebookLocationData { + type: ChatAgentLocation.Notebook; + sessionInputUri: URI; +} + +export interface IChatTerminalLocationData { + type: ChatAgentLocation.Terminal; + // TBD +} + +export type IChatLocationData = IChatEditorLocationData | IChatNotebookLocationData | IChatTerminalLocationData; + export interface IChatSendRequestOptions { location?: ChatAgentLocation; + locationData?: IChatLocationData; parserContext?: IChatParserContext; attempt?: number; noCommandDetection?: boolean; diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index ff8d83fc2c378..7c115514e9113 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -594,6 +594,7 @@ export class ChatService extends Disposable implements IChatService { enableCommandDetection, attempt, location, + locationData: options?.locationData, acceptedConfirmationData: options?.acceptedConfirmationData, rejectedConfirmationData: options?.rejectedConfirmationData, }; diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts index 20004ab3eb27c..92ba84eb48e70 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatContentWidget.ts @@ -13,7 +13,7 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { inlineChatBackground, InlineChatConfigKeys, MENU_INLINE_CHAT_CONTENT_STATUS, MENU_INLINE_CHAT_EXECUTE } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; -import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; +import { ChatWidget, IChatWidgetLocationOptions } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { editorBackground, editorForeground, inputBackground } from 'vs/platform/theme/common/colorRegistry'; import { ChatModel } from 'vs/workbench/contrib/chat/common/chatModel'; @@ -49,7 +49,7 @@ export class InlineChatContentWidget implements IContentWidget { private readonly _widget: ChatWidget; constructor( - location: ChatAgentLocation, + location: IChatWidgetLocationOptions, private readonly _editor: ICodeEditor, @IInstantiationService instaService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 0befb284dbfd2..ec0d7cf665d9f 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -51,6 +51,7 @@ import { isEqual } from 'vs/base/common/resources'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; +import { IChatWidgetLocationOptions } from 'vs/workbench/contrib/chat/browser/chatWidget'; export const enum State { CREATE_SESSION = 'CREATE_SESSION', @@ -154,19 +155,34 @@ export class InlineChatController implements IEditorContribution { this._ctxRequestInProgress = CTX_INLINE_CHAT_REQUEST_IN_PROGRESS.bindTo(contextKeyService); this._ui = new Lazy(() => { - let location = ChatAgentLocation.Editor; + + const location: IChatWidgetLocationOptions = { + location: ChatAgentLocation.Editor, + resolveData: () => { + assertType(this._editor.hasModel()); + assertType(this._session); + return { + type: ChatAgentLocation.Editor, + selection: this._editor.getSelection(), + document: this._session.textModelN.uri, + wholeRange: this._session?.wholeRange.trackedInitialRange, + }; + } + }; // inline chat in notebooks // check if this editor is part of a notebook editor - // and iff so, use the notebook location + // and iff so, use the notebook location but keep the resolveData + // talk about editor data for (const notebookEditor of notebookEditorService.listNotebookEditors()) { for (const [, codeEditor] of notebookEditor.codeEditors) { if (codeEditor === this._editor) { - location = ChatAgentLocation.Notebook; + location.location = ChatAgentLocation.Notebook; break; } } } + const content = this._store.add(_instaService.createInstance(InlineChatContentWidget, location, this._editor)); const zone = this._store.add(_instaService.createInstance(InlineChatZoneWidget, location, this._editor)); return { content, zone }; diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index fe4509dabeeed..48539e61df835 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -37,7 +37,7 @@ import { ChatModel, IChatModel } from 'vs/workbench/contrib/chat/common/chatMode import { isResponseVM, isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { HunkInformation, Session } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED, inlineChatBackground, InlineChatConfigKeys, inlineChatForeground } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; -import { ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; +import { ChatWidget, IChatWidgetLocationOptions } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { chatRequestBackground } from 'vs/workbench/contrib/chat/common/chatColors'; import { Selection } from 'vs/editor/common/core/selection'; import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; @@ -115,7 +115,7 @@ export class InlineChatWidget { readonly scopedContextKeyService: IContextKeyService; constructor( - location: ChatAgentLocation, + location: IChatWidgetLocationOptions, options: IInlineChatWidgetConstructionOptions, @IInstantiationService protected readonly _instantiationService: IInstantiationService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, @@ -522,7 +522,7 @@ export class EditorBasedInlineChatWidget extends InlineChatWidget { private readonly _accessibleViewer = this._store.add(new MutableDisposable()); constructor( - location: ChatAgentLocation, + location: IChatWidgetLocationOptions, private readonly _parentEditor: ICodeEditor, options: IInlineChatWidgetConstructionOptions, @IContextKeyService contextKeyService: IContextKeyService, diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts index 793600ccf0c93..adc3b413558d5 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.ts @@ -20,8 +20,8 @@ import { isEqual } from 'vs/base/common/resources'; import { StableEditorBottomScrollState } from 'vs/editor/browser/stableEditorScroll'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents'; import { ILogService } from 'vs/platform/log/common/log'; +import { IChatWidgetLocationOptions } from 'vs/workbench/contrib/chat/browser/chatWidget'; export class InlineChatZoneWidget extends ZoneWidget { @@ -31,7 +31,7 @@ export class InlineChatZoneWidget extends ZoneWidget { private _dimension?: Dimension; constructor( - location: ChatAgentLocation, + location: IChatWidgetLocationOptions, editor: ICodeEditor, @IInstantiationService private readonly _instaService: IInstantiationService, @ILogService private _logService: ILogService, diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts index d9eee2ec600c9..3de91da698d74 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController.ts @@ -411,7 +411,19 @@ export class NotebookChatController extends Disposable implements INotebookEdito const inlineChatWidget = this._widgetDisposableStore.add(this._instantiationService.createInstance( InlineChatWidget, - ChatAgentLocation.Notebook, + { + location: ChatAgentLocation.Notebook, + resolveData: () => { + const sessionInputUri = this.getSessionInputUri(); + if (!sessionInputUri) { + return undefined; + } + return { + type: ChatAgentLocation.Notebook, + sessionInputUri + }; + } + }, { statusMenuId: MENU_CELL_CHAT_WIDGET_STATUS, chatWidgetViewOptions: { diff --git a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts index 61d1b7147f665..d28f3cf845505 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.ts @@ -56,7 +56,13 @@ export class TerminalChatWidget extends Disposable { this._inlineChatWidget = this._instantiationService.createInstance( InlineChatWidget, - ChatAgentLocation.Terminal, + { + location: ChatAgentLocation.Terminal, + resolveData: () => { + // TODO@meganrogge return something that identifies this terminal + return undefined; + } + }, { statusMenuId: { menu: MENU_TERMINAL_CHAT_WIDGET_STATUS, diff --git a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts index 4e328978a9dcd..d3c0ca44e261f 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +// version: 2 + declare module 'vscode' { /** @@ -27,6 +29,22 @@ declare module 'vscode' { Editor = 4 } + export class ChatRequestEditorData { + //TODO@API should be the editor + document: TextDocument; + selection: Selection; + wholeRange: Range; + + constructor(document: TextDocument, selection: Selection, wholeRange: Range); + } + + export class ChatRequestNotebookData { + //TODO@API should be the editor + notebook: NotebookDocument; + + constructor(notebook: NotebookDocument); + } + export interface ChatRequest { /** * The attempt number of the request. The first request has attempt number 0. @@ -40,8 +58,16 @@ declare module 'vscode' { /** * The location at which the chat is happening. This will always be one of the supported values + * + * @deprecated */ readonly location: ChatLocation; + + /** + * Information that is specific to the location at which chat is happening, e.g within a document, notebook, + * or terminal. Will be `undefined` for the chat panel. + */ + readonly location2: ChatRequestEditorData | ChatRequestNotebookData | undefined; } export interface ChatParticipant { From 6889c34d61849e2b33fa6878aefbe0cb0d41b017 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 28 Jun 2024 16:55:07 +0200 Subject: [PATCH 555/755] Adopt editor placeholder for comment widget (#219119) --- .../contrib/comments/browser/commentReply.ts | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentReply.ts b/src/vs/workbench/contrib/comments/browser/commentReply.ts index 3868281f8e518..0a73f27023a44 100644 --- a/src/vs/workbench/contrib/comments/browser/commentReply.ts +++ b/src/vs/workbench/contrib/comments/browser/commentReply.ts @@ -22,8 +22,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { editorForeground, resolveColorValue } from 'vs/platform/theme/common/colorRegistry'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; import { CommentFormActions } from 'vs/workbench/contrib/comments/browser/commentFormActions'; import { CommentMenus } from 'vs/workbench/contrib/comments/browser/commentMenus'; import { ICommentService } from 'vs/workbench/contrib/comments/browser/commentService'; @@ -63,7 +61,6 @@ export class CommentReply extends Disposable { focus: boolean, private _actionRunDelegate: (() => void) | null, @ICommentService private commentService: ICommentService, - @IThemeService private themeService: IThemeService, @IConfigurationService configurationService: IConfigurationService, @IKeybindingService private keybindingService: IKeybindingService, @IHoverService private hoverService: IHoverService, @@ -213,32 +210,12 @@ export class CommentReply extends Disposable { } setCommentEditorDecorations() { - const model = this.commentEditor.getModel(); - if (model) { - const valueLength = model.getValueLength(); - const hasExistingComments = this._commentThread.comments && this._commentThread.comments.length > 0; - const placeholder = valueLength > 0 - ? '' - : hasExistingComments - ? (this._commentOptions?.placeHolder || nls.localize('reply', "Reply...")) - : (this._commentOptions?.placeHolder || nls.localize('newComment', "Type a new comment")); - const decorations = [{ - range: { - startLineNumber: 0, - endLineNumber: 0, - startColumn: 0, - endColumn: 1 - }, - renderOptions: { - after: { - contentText: placeholder, - color: `${resolveColorValue(editorForeground, this.themeService.getColorTheme())?.transparent(0.4)}` - } - } - }]; + const hasExistingComments = this._commentThread.comments && this._commentThread.comments.length > 0; + const placeholder = hasExistingComments + ? (this._commentOptions?.placeHolder || nls.localize('reply', "Reply...")) + : (this._commentOptions?.placeHolder || nls.localize('newComment', "Type a new comment")); - this.commentEditor.setDecorationsByType('review-zone-widget', COMMENTEDITOR_DECORATION_KEY, decorations); - } + this.commentEditor.updateOptions({ placeholder }); } private createTextModelListener(commentEditor: ICodeEditor, commentForm: HTMLElement) { From dd7d9376fb6b9a361da6070a40196edb13465dfb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Jun 2024 17:03:26 +0200 Subject: [PATCH 556/755] remove dead types from old proposal versions (#219120) --- src/vs/workbench/api/common/extHost.api.impl.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 214c68cc394bd..402b55888f4dd 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1747,10 +1747,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I LanguageModelChatMessageFunctionResultPart: extHostTypes.LanguageModelFunctionResultPart, LanguageModelChatResponseTextPart: extHostTypes.LanguageModelTextPart, LanguageModelChatResponseFunctionUsePart: extHostTypes.LanguageModelFunctionUsePart, - LanguageModelChatMessage2: extHostTypes.LanguageModelChatMessage, // TODO@jrieken REMOVE - LanguageModelChatSystemMessage: extHostTypes.LanguageModelChatSystemMessage,// TODO@jrieken REMOVE - LanguageModelChatUserMessage: extHostTypes.LanguageModelChatUserMessage,// TODO@jrieken REMOVE - LanguageModelChatAssistantMessage: extHostTypes.LanguageModelChatAssistantMessage,// TODO@jrieken REMOVE LanguageModelError: extHostTypes.LanguageModelError, NewSymbolName: extHostTypes.NewSymbolName, NewSymbolNameTag: extHostTypes.NewSymbolNameTag, From d9744cf206355348e541fdaa1ab226236abeff86 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 28 Jun 2024 17:59:27 +0200 Subject: [PATCH 557/755] skip version check in oss (#219127) --- .../extensionManagement/common/extensionsScannerService.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 1b6d8f3dab9db..386dfed2a29e8 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -562,10 +562,11 @@ class ExtensionsScanner extends Disposable { @IUriIdentityService protected readonly uriIdentityService: IUriIdentityService, @IFileService protected readonly fileService: IFileService, @IProductService productService: IProductService, + @IEnvironmentService environmentService: IEnvironmentService, @ILogService protected readonly logService: ILogService ) { super(); - this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; + this.extensionsEnabledWithApiProposalVersion = environmentService.isBuilt ? productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? [] : []; } async scanExtensions(input: ExtensionScannerInput): Promise { @@ -890,9 +891,10 @@ class CachedExtensionsScanner extends ExtensionsScanner { @IUriIdentityService uriIdentityService: IUriIdentityService, @IFileService fileService: IFileService, @IProductService productService: IProductService, + @IEnvironmentService environmentService: IEnvironmentService, @ILogService logService: ILogService ) { - super(obsoleteFile, extensionsProfileScannerService, uriIdentityService, fileService, productService, logService); + super(obsoleteFile, extensionsProfileScannerService, uriIdentityService, fileService, productService, environmentService, logService); } override async scanExtensions(input: ExtensionScannerInput): Promise { From 46362deb3698b288289fd050f1a9f997935b1884 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 28 Jun 2024 11:06:45 -0700 Subject: [PATCH 558/755] Support and in chat (#219053) --- src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts index 50c6029a9e881..4f08d298d9c44 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownRenderer.ts @@ -29,6 +29,8 @@ const allowedHtmlTags = [ 'p', 'pre', 'strong', + 'sub', + 'sup', 'table', 'tbody', 'td', From fe473c806fcd2b76d63644584fad1e355180aa11 Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Fri, 28 Jun 2024 13:05:29 -0700 Subject: [PATCH 559/755] issue reporter short circuit logic fix (#219002) * add better desccription check * check on listener change --- src/vs/workbench/contrib/issue/browser/issue.ts | 7 ++++--- .../issue/electron-sandbox/issueReporterService2.ts | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/issue/browser/issue.ts b/src/vs/workbench/contrib/issue/browser/issue.ts index 3bc09a5a6c63f..4f097ba4603ac 100644 --- a/src/vs/workbench/contrib/issue/browser/issue.ts +++ b/src/vs/workbench/contrib/issue/browser/issue.ts @@ -770,7 +770,9 @@ export class BaseIssueReporterService extends Disposable { const inputElement = (this.getElementById(inputId)); const inputValidationMessage = this.getElementById(`${inputId}-empty-error`); const descriptionShortMessage = this.getElementById(`description-short-error`); - if (!inputElement.value) { + if (inputId === 'description' && this.nonGitHubIssueUrl && this.data.extensionId) { + return true; + } else if (!inputElement.value) { inputElement.classList.add('invalid-input'); inputValidationMessage?.classList.remove('hidden'); descriptionShortMessage?.classList.add('hidden'); @@ -780,8 +782,7 @@ export class BaseIssueReporterService extends Disposable { descriptionShortMessage?.classList.remove('hidden'); inputValidationMessage?.classList.add('hidden'); return false; - } - else { + } else { inputElement.classList.remove('invalid-input'); inputValidationMessage?.classList.add('hidden'); if (inputId === 'description') { diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts index abb6680a5d2f4..02b3adb817d6b 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporterService2.ts @@ -238,6 +238,7 @@ export class IssueReporter2 extends BaseIssueReporterService { if (this.issueReporterModel.fileOnExtension()) { this.addEventListener('extension-selector', 'change', _ => { this.validateInput('extension-selector'); + this.validateInput('description'); }); } From 5fc4b6e87337784009de1006228b0dfe65960c7f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 28 Jun 2024 22:31:08 +0200 Subject: [PATCH 560/755] skip version check in oss (#219206) --- .../common/extensionsScannerService.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 386dfed2a29e8..55073608fa9fb 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -562,11 +562,11 @@ class ExtensionsScanner extends Disposable { @IUriIdentityService protected readonly uriIdentityService: IUriIdentityService, @IFileService protected readonly fileService: IFileService, @IProductService productService: IProductService, - @IEnvironmentService environmentService: IEnvironmentService, + @IEnvironmentService private readonly environmentService: IEnvironmentService, @ILogService protected readonly logService: ILogService ) { super(); - this.extensionsEnabledWithApiProposalVersion = environmentService.isBuilt ? productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? [] : []; + this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; } async scanExtensions(input: ExtensionScannerInput): Promise { @@ -673,7 +673,7 @@ class ExtensionsScanner extends Disposable { if (input.validate) { extension = this.validate(extension, input); } - if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase())) { + if (manifest.enabledApiProposals && (!this.environmentService.isBuilt || this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase()))) { manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); } return extension; @@ -688,7 +688,7 @@ class ExtensionsScanner extends Disposable { validate(extension: IRelaxedScannedExtension, input: ExtensionScannerInput): IRelaxedScannedExtension { let isValid = true; - const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(extension.identifier.id.toLowerCase()); + const validateApiVersion = this.environmentService.isBuilt && this.extensionsEnabledWithApiProposalVersion.includes(extension.identifier.id.toLowerCase()); const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin, validateApiVersion); for (const [severity, message] of validations) { if (severity === Severity.Error) { From da36fe717e16f8989b19724e8eaba8bea31a2e21 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 28 Jun 2024 22:47:41 +0200 Subject: [PATCH 561/755] fix #218133 (#219212) --- .../contrib/userDataProfile/browser/userDataProfilesEditor.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index 8ddcc3527b531..b84e1af173b0f 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -1001,9 +1001,11 @@ class ExistingProfileResourceTreeRenderer extends AbstractProfileResourceTreeRen templateData.label.textContent = this.getResourceTypeTitle(element.resourceType); if (root instanceof UserDataProfileElement && root.profile.isDefault) { + templateData.checkbox.domNode.removeAttribute('tabindex'); templateData.checkbox.domNode.classList.add('hide'); } else { templateData.checkbox.domNode.classList.remove('hide'); + templateData.checkbox.domNode.setAttribute('tabindex', '0'); templateData.checkbox.checked = root.getFlag(element.resourceType); templateData.elementDisposables.add(templateData.checkbox.onChange(() => root.setFlag(element.resourceType, templateData.checkbox.checked))); } @@ -1136,6 +1138,7 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe } if (element.checkbox) { + templateData.checkbox.domNode.setAttribute('tabindex', '0'); templateData.checkbox.domNode.classList.remove('hide'); templateData.checkbox.checked = element.checkbox.isChecked; templateData.checkbox.domNode.ariaLabel = element.checkbox.accessibilityInformation?.label ?? ''; @@ -1143,6 +1146,7 @@ class ProfileResourceChildTreeItemRenderer extends AbstractProfileResourceTreeRe templateData.checkbox.domNode.role = element.checkbox.accessibilityInformation.role; } } else { + templateData.checkbox.domNode.removeAttribute('tabindex'); templateData.checkbox.domNode.classList.add('hide'); } From 206e438ff4390f873715c6ab41fae493eca8aeca Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 28 Jun 2024 13:48:14 -0700 Subject: [PATCH 562/755] Fix #218031 (#219215) --- src/vs/workbench/contrib/chat/browser/media/chat.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/media/chat.css b/src/vs/workbench/contrib/chat/browser/media/chat.css index 403c41b83a11c..23de8d70e1d0b 100644 --- a/src/vs/workbench/contrib/chat/browser/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/media/chat.css @@ -40,7 +40,6 @@ display: flex; align-items: center; gap: 8px; - width: 100%; } .interactive-item-container .header .username { From 032c1b75447ade317715c3d2a82c2d9cd3e55dde Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Fri, 28 Jun 2024 14:07:28 -0700 Subject: [PATCH 563/755] don't show output items if they are empty (#216844) * wait for content to attach toolbar * command to show hidden outputs * avoid perf hit of checking innerText on resize * empty based on 0 content height * just rely on height=0 for empty output * use event to attach toolbar * leave border in, but account for the height it adds * hide again if content goes back to zero height * zero * tests, fix memory leaks * move magic number to common function --- .../browser/controller/cellOutputActions.ts | 31 ++++- .../browser/controller/editActions.ts | 4 +- .../notebook/browser/notebookBrowser.ts | 3 + .../contrib/notebook/browser/view/cellPart.ts | 2 +- .../browser/view/cellParts/cellOutput.ts | 59 +++++--- .../browser/view/renderers/webviewPreloads.ts | 40 ++++-- .../browser/viewModel/cellOutputViewModel.ts | 17 +++ .../browser/viewModel/codeCellViewModel.ts | 9 +- .../notebook/common/notebookContextKeys.ts | 2 + .../notebook/test/browser/cellOutput.test.ts | 130 ++++++++++++++++++ .../test/browser/testNotebookEditor.ts | 3 +- 11 files changed, 261 insertions(+), 39 deletions(-) create mode 100644 src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts diff --git a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts index 1350fefa69de4..310a367f197ff 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/cellOutputActions.ts @@ -9,7 +9,7 @@ import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/act import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { INotebookOutputActionContext, NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { NOTEBOOK_CELL_HAS_OUTPUTS } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { NOTEBOOK_CELL_HAS_HIDDEN_OUTPUTS, NOTEBOOK_CELL_HAS_OUTPUTS } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { ILogService } from 'vs/platform/log/common/log'; import { copyCellOutput } from 'vs/workbench/contrib/notebook/browser/contrib/clipboard/cellOutputClipboard'; @@ -17,9 +17,38 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { ICellOutputViewModel, ICellViewModel, INotebookEditor, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind, CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; export const COPY_OUTPUT_COMMAND_ID = 'notebook.cellOutput.copy'; +registerAction2(class ShowAllOutputsAction extends Action2 { + constructor() { + super({ + id: 'notebook.cellOuput.showEmptyOutputs', + title: localize('notebookActions.showAllOutput', "Show empty outputs"), + menu: { + id: MenuId.NotebookOutputToolbar, + when: ContextKeyExpr.and(NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_HAS_HIDDEN_OUTPUTS) + }, + f1: false, + category: NOTEBOOK_ACTIONS_CATEGORY + }); + } + + run(accessor: ServicesAccessor, context: INotebookOutputActionContext): void { + const cell = context.cell; + if (cell && cell.cellKind === CellKind.Code) { + + for (let i = 1; i < cell.outputsViewModels.length; i++) { + if (!cell.outputsViewModels[i].visible.get()) { + cell.outputsViewModels[i].setVisible(true, true); + (cell as CodeCellViewModel).updateOutputHeight(i, 1, 'command'); + } + } + } + } +}); + registerAction2(class CopyCellOutputAction extends Action2 { constructor() { super({ diff --git a/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts index c73973e433ee5..82b3f2b8eafc6 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts @@ -28,7 +28,7 @@ import { CELL_TITLE_CELL_GROUP_ID, CELL_TITLE_OUTPUT_GROUP_ID, CellToolbarOrder, import { NotebookChangeTabDisplaySize, NotebookIndentUsingSpaces, NotebookIndentUsingTabs, NotebookIndentationToSpacesAction, NotebookIndentationToTabsAction } from 'vs/workbench/contrib/notebook/browser/controller/notebookIndentationActions'; import { CHANGE_CELL_LANGUAGE, CellEditState, DETECT_CELL_LANGUAGE, QUIT_EDIT_CELL_COMMAND_ID, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellEditType, CellKind, ICellEditOperation, NotebookCellExecutionState, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_OUTPUT_INPUT_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_OUTPUT_INPUT_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON, NOTEBOOK_CELL_IS_FIRST_OUTPUT } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -227,7 +227,7 @@ registerAction2(class ClearCellOutputsAction extends NotebookCellAction { }, { id: MenuId.NotebookOutputToolbar, - when: ContextKeyExpr.and(NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_CELL_EDITABLE) + when: ContextKeyExpr.and(NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_IS_FIRST_OUTPUT, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON) }, ], keybinding: { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index 18e44f2a6637d..f08c5886c4276 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -31,6 +31,7 @@ import { IWebviewElement } from 'vs/workbench/contrib/webview/browser/webview'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IObservable } from 'vs/base/common/observable'; //#region Shared commands export const EXPAND_CELL_INPUT_COMMAND_ID = 'notebook.cell.expandCellInput'; @@ -108,6 +109,8 @@ export interface ICellOutputViewModel extends IDisposable { pickedMimeType: IOrderedMimeType | undefined; hasMultiMimeType(): boolean; readonly onDidResetRenderer: Event; + readonly visible: IObservable; + setVisible(visible: boolean, force?: boolean): void; resetRenderer(): void; toRawJSON(): any; } diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts index 546637fae83d1..1ae8bf98ef5df 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts @@ -16,7 +16,7 @@ import { ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/c */ export abstract class CellContentPart extends Disposable { protected currentCell: ICellViewModel | undefined; - protected readonly cellDisposables = new DisposableStore(); + protected readonly cellDisposables = this._register(new DisposableStore()); constructor() { super(); diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts index f864ea9345ddd..5300567754b44 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts @@ -33,8 +33,9 @@ import { INotebookKernel } from 'vs/workbench/contrib/notebook/common/notebookKe import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { COPY_OUTPUT_COMMAND_ID } from 'vs/workbench/contrib/notebook/browser/controller/cellOutputActions'; -import { CLEAR_CELL_OUTPUTS_COMMAND_ID } from 'vs/workbench/contrib/notebook/browser/controller/editActions'; import { TEXT_BASED_MIMETYPES } from 'vs/workbench/contrib/notebook/browser/contrib/clipboard/cellOutputClipboard'; +import { autorun, observableValue } from 'vs/base/common/observable'; +import { NOTEBOOK_CELL_HAS_HIDDEN_OUTPUTS, NOTEBOOK_CELL_IS_FIRST_OUTPUT } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; interface IMimeTypeRenderer extends IQuickPickItem { index: number; @@ -60,13 +61,14 @@ interface IRenderResult { // | | #cell-output-toolbar // | | #output-element class CellOutputElement extends Disposable { - private readonly _renderDisposableStore = this._register(new DisposableStore()); + private readonly toolbarDisposables = this._register(new DisposableStore()); innerContainer?: HTMLElement; renderedOutputContainer!: HTMLElement; renderResult?: IInsetRenderOutput; private readonly contextKeyService: IContextKeyService; + private toolbarAttached = false; constructor( private notebookEditor: INotebookEditorDelegate, @@ -151,7 +153,7 @@ class CellOutputElement extends Disposable { } else { // Another mimetype or renderer is picked, we need to clear the current output and re-render const nextElement = this.innerContainer.nextElementSibling; - this._renderDisposableStore.clear(); + this.toolbarDisposables.clear(); const element = this.innerContainer; if (element) { element.remove(); @@ -207,7 +209,20 @@ class CellOutputElement extends Disposable { } const innerContainer = this._generateInnerOutputContainer(previousSibling, selectedPresentation); - this._attachToolbar(innerContainer, notebookTextModel, this.notebookEditor.activeKernel, index, mimeTypes); + if (index === 0 || this.output.visible.get()) { + this._attachToolbar(innerContainer, notebookTextModel, this.notebookEditor.activeKernel, index, mimeTypes); + } else { + this._register(autorun((reader) => { + const visible = reader.readObservable(this.output.visible); + if (visible && !this.toolbarAttached) { + this._attachToolbar(innerContainer, notebookTextModel, this.notebookEditor.activeKernel, index, mimeTypes); + } else if (!visible) { + this.toolbarDisposables.clear(); + } + this.cellOutputContainer.checkForHiddenOutputs(); + })); + this.cellOutputContainer.hasHiddenOutputs.set(true, undefined); + } this.renderedOutputContainer = DOM.append(innerContainer, DOM.$('.rendered-output')); @@ -291,14 +306,12 @@ class CellOutputElement extends Disposable { return; } - const useConsolidatedButton = this.notebookEditor.notebookOptions.getDisplayOptions().consolidatedOutputButton; - outputItemDiv.style.position = 'relative'; const mimeTypePicker = DOM.$('.cell-output-toolbar'); outputItemDiv.appendChild(mimeTypePicker); - const toolbar = this._renderDisposableStore.add(this.instantiationService.createInstance(WorkbenchToolBar, mimeTypePicker, { + const toolbar = this.toolbarDisposables.add(this.instantiationService.createInstance(WorkbenchToolBar, mimeTypePicker, { renderDropdownAsChildElement: false })); toolbar.context = { @@ -310,20 +323,22 @@ class CellOutputElement extends Disposable { }; // TODO: This could probably be a real registered action, but it has to talk to this output element - const pickAction = new Action('notebook.output.pickMimetype', nls.localize('pickMimeType', "Change Presentation"), ThemeIcon.asClassName(mimetypeIcon), undefined, - async _context => this._pickActiveMimeTypeRenderer(outputItemDiv, notebookTextModel, kernel, this.output)); + const pickAction = this.toolbarDisposables.add(new Action('notebook.output.pickMimetype', nls.localize('pickMimeType', "Change Presentation"), ThemeIcon.asClassName(mimetypeIcon), undefined, + async _context => this._pickActiveMimeTypeRenderer(outputItemDiv, notebookTextModel, kernel, this.output))); + + const menuContextKeyService = this.toolbarDisposables.add(this.contextKeyService.createScoped(outputItemDiv)); + const hasHiddenOutputs = NOTEBOOK_CELL_HAS_HIDDEN_OUTPUTS.bindTo(menuContextKeyService); + const isFirstCellOutput = NOTEBOOK_CELL_IS_FIRST_OUTPUT.bindTo(menuContextKeyService); + isFirstCellOutput.set(index === 0); + this.toolbarDisposables.add(autorun((reader) => { hasHiddenOutputs.set(reader.readObservable(this.cellOutputContainer.hasHiddenOutputs)); })); + const menu = this.toolbarDisposables.add(this.menuService.createMenu(MenuId.NotebookOutputToolbar, menuContextKeyService)); - const menu = this._renderDisposableStore.add(this.menuService.createMenu(MenuId.NotebookOutputToolbar, this.contextKeyService)); const updateMenuToolbar = () => { const primary: IAction[] = []; let secondary: IAction[] = []; const result = { primary, secondary }; - createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, result, () => false); - if (index > 0 || !useConsolidatedButton) { - // clear outputs should only appear in the first output item's menu - secondary = secondary.filter((action) => action.id !== CLEAR_CELL_OUTPUTS_COMMAND_ID); - } + createAndFillInActionBarActions(menu!, { shouldForwardArgs: true }, result, () => false); if (!isCopyEnabled) { secondary = secondary.filter((action) => action.id !== COPY_OUTPUT_COMMAND_ID); } @@ -334,8 +349,7 @@ class CellOutputElement extends Disposable { toolbar.setActions([], secondary); }; updateMenuToolbar(); - this._renderDisposableStore.add(menu.onDidChange(updateMenuToolbar)); - + this.toolbarDisposables.add(menu.onDidChange(updateMenuToolbar)); } private async _pickActiveMimeTypeRenderer(outputItemDiv: HTMLElement, notebookTextModel: NotebookTextModel, kernel: INotebookKernel | undefined, viewModel: ICellOutputViewModel) { @@ -397,7 +411,7 @@ class CellOutputElement extends Disposable { // user chooses another mimetype const nextElement = outputItemDiv.nextElementSibling; - this._renderDisposableStore.clear(); + this.toolbarDisposables.clear(); const element = this.innerContainer; if (element) { element.remove(); @@ -479,6 +493,15 @@ export class CellOutputContainer extends CellContentPart { private _outputEntries: OutputEntryViewHandler[] = []; private _hasStaleOutputs: boolean = false; + hasHiddenOutputs = observableValue('hasHiddenOutputs', false); + checkForHiddenOutputs() { + if (this._outputEntries.find(entry => { return entry.model.visible; })) { + this.hasHiddenOutputs.set(true, undefined); + } else { + this.hasHiddenOutputs.set(false, undefined); + } + } + get renderedOutputEntries() { return this._outputEntries; } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index 7f79531b37ee3..f80e4f40ccc8c 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -461,7 +461,7 @@ async function webviewPreloads(ctx: PreloadContext) { id, height, init: update.init, - isOutput: update.isOutput, + isOutput: update.isOutput }); } else { this.pending.set(id, { @@ -484,6 +484,11 @@ async function webviewPreloads(ctx: PreloadContext) { } }; + function elementHasContent(height: number) { + // we need to account for a potential 1px top and bottom border on a child within the output container + return height > 2.1; + } + const resizeObserver = new class { private readonly _observer: ResizeObserver; @@ -519,23 +524,23 @@ async function webviewPreloads(ctx: PreloadContext) { continue; } - const newHeight = entry.contentRect.height; + const hasContent = elementHasContent(entry.contentRect.height); const shouldUpdatePadding = - (newHeight !== 0 && observedElementInfo.lastKnownPadding === 0) || - (newHeight === 0 && observedElementInfo.lastKnownPadding !== 0); + (hasContent && observedElementInfo.lastKnownPadding === 0) || + (!hasContent && observedElementInfo.lastKnownPadding !== 0); if (shouldUpdatePadding) { // Do not update dimension in resize observer window.requestAnimationFrame(() => { - if (newHeight !== 0) { + if (hasContent) { entry.target.style.padding = `${ctx.style.outputNodePadding}px ${ctx.style.outputNodePadding}px ${ctx.style.outputNodePadding}px ${ctx.style.outputNodeLeftPadding}px`; } else { entry.target.style.padding = `0px`; } - this.updateHeight(observedElementInfo, entry.target.offsetHeight); + this.updateHeight(observedElementInfo, hasContent ? entry.target.offsetHeight : 0); }); } else { - this.updateHeight(observedElementInfo, entry.target.offsetHeight); + this.updateHeight(observedElementInfo, hasContent ? entry.target.offsetHeight : 0); } } }); @@ -2755,10 +2760,6 @@ async function webviewPreloads(ctx: PreloadContext) { this.element.style.visibility = ''; this.element.style.top = `${top}px`; - - dimensionUpdater.updateHeight(outputId, outputContainer.element.offsetHeight, { - isOutput: true, - }); } public hide() { @@ -2941,17 +2942,26 @@ async function webviewPreloads(ctx: PreloadContext) { const offsetHeight = this.element.offsetHeight; const cps = document.defaultView!.getComputedStyle(this.element); - if (offsetHeight !== 0 && cps.padding === '0px') { - // we set padding to zero if the output height is zero (then we can have a zero-height output DOM node) + const verticalPadding = parseFloat(cps.paddingTop) + parseFloat(cps.paddingBottom); + const contentHeight = offsetHeight - verticalPadding; + if (elementHasContent(contentHeight) && cps.padding === '0px') { + // we set padding to zero if the output has no content (then we can have a zero-height output DOM node) // thus we need to ensure the padding is accounted when updating the init height of the output dimensionUpdater.updateHeight(this.outputId, offsetHeight + ctx.style.outputNodePadding * 2, { isOutput: true, - init: true, + init: true }); this.element.style.padding = `${ctx.style.outputNodePadding}px ${ctx.style.outputNodePadding}px ${ctx.style.outputNodePadding}px ${ctx.style.outputNodeLeftPadding}`; - } else { + } else if (elementHasContent(contentHeight)) { dimensionUpdater.updateHeight(this.outputId, this.element.offsetHeight, { + isOutput: true, + init: true + }); + this.element.style.padding = `0 ${ctx.style.outputNodePadding}px 0 ${ctx.style.outputNodeLeftPadding}`; + } else { + // we have a zero-height output DOM node + dimensionUpdater.updateHeight(this.outputId, 0, { isOutput: true, init: true, }); diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel.ts index e8cf31df9e38b..5c523a51fac74 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel.ts @@ -5,6 +5,7 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; +import { observableValue } from 'vs/base/common/observable'; import { ICellOutputViewModel, IGenericCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { ICellOutput, IOrderedMimeType, RENDERER_NOT_AVAILABLE } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -14,6 +15,22 @@ let handle = 0; export class CellOutputViewModel extends Disposable implements ICellOutputViewModel { private _onDidResetRendererEmitter = this._register(new Emitter()); readonly onDidResetRenderer = this._onDidResetRendererEmitter.event; + + private alwaysShow = false; + visible = observableValue('outputVisible', false); + setVisible(visible = true, force: boolean = false) { + if (!visible && this.alwaysShow) { + // we are forced to show, so no-op + return; + } + + if (force && visible) { + this.alwaysShow = true; + } + + this.visible.set(visible, undefined); + } + outputHandle = handle++; get model(): ICellOutput { return this._outputRawData; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 06c8c851f3b94..8ce1e7f736992 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -464,7 +464,14 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod } this._ensureOutputsTop(); - if (height < 28 && this._outputViewModels[index].hasMultiMimeType()) { + + if (index === 0 || height > 0) { + this._outputViewModels[index].setVisible(true); + } else if (height === 0) { + this._outputViewModels[index].setVisible(false); + } + + if (this._outputViewModels[index].visible.get() && height < 28) { height = 28; } diff --git a/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts b/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts index c4961dd6dadd7..e659674d527f7 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts @@ -47,6 +47,8 @@ export type NotebookCellExecutionStateContext = 'idle' | 'pending' | 'executing' export const NOTEBOOK_CELL_EXECUTION_STATE = new RawContextKey('notebookCellExecutionState', undefined); export const NOTEBOOK_CELL_EXECUTING = new RawContextKey('notebookCellExecuting', false); // This only exists to simplify a context key expression, see #129625 export const NOTEBOOK_CELL_HAS_OUTPUTS = new RawContextKey('notebookCellHasOutputs', false); +export const NOTEBOOK_CELL_IS_FIRST_OUTPUT = new RawContextKey('notebookCellIsFirstOutput', false); +export const NOTEBOOK_CELL_HAS_HIDDEN_OUTPUTS = new RawContextKey('hasHiddenOutputs', false); export const NOTEBOOK_CELL_INPUT_COLLAPSED = new RawContextKey('notebookCellInputIsCollapsed', false); export const NOTEBOOK_CELL_OUTPUT_COLLAPSED = new RawContextKey('notebookCellOutputIsCollapsed', false); export const NOTEBOOK_CELL_RESOURCE = new RawContextKey('notebookCellResource', ''); diff --git a/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts b/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts new file mode 100644 index 0000000000000..f08ca269a47ac --- /dev/null +++ b/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts @@ -0,0 +1,130 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert from 'assert'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { CellOutputContainer } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput'; +import { CodeCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; +import { CellKind, INotebookRendererInfo, IOutputDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { setupInstantiationService, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; +import { FastDomNode } from 'vs/base/browser/fastDomNode'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { mock } from 'vs/base/test/common/mock'; +import { IMenu, IMenuService } from 'vs/platform/actions/common/actions'; +import { Event } from 'vs/base/common/event'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; + +suite('CellOutput', () => { + const store = ensureNoDisposablesAreLeakedInTestSuite(); + let instantiationService: TestInstantiationService; + let outputMenus: IMenu[] = []; + + setup(() => { + outputMenus = []; + instantiationService = setupInstantiationService(store); + instantiationService.stub(INotebookService, new class extends mock() { + override getOutputMimeTypeInfo() { + return [{ + rendererId: 'plainTextRendererId', + mimeType: 'text/plain', + isTrusted: true + }, { + rendererId: 'htmlRendererId', + mimeType: 'text/html', + isTrusted: true + }]; + } + override getRendererInfo(): INotebookRendererInfo { + return { + id: 'rendererId', + displayName: 'Stubbed Renderer', + extensionId: { _lower: 'id', value: 'id' }, + } as INotebookRendererInfo; + } + }); + instantiationService.stub(IMenuService, new class extends mock() { + override createMenu() { + const menu = new class extends mock() { + override onDidChange = Event.None; + override getActions() { return []; } + override dispose() { outputMenus = outputMenus.filter(item => item !== menu); } + }; + outputMenus.push(menu); + return menu; + } + }); + }); + + test('Render cell output items with multiple mime types', async function () { + const outputItem = { data: VSBuffer.fromString('output content'), mime: 'text/plain' }; + const htmlOutputItem = { data: VSBuffer.fromString('output content'), mime: 'text/html' }; + const output1: IOutputDto = { outputId: 'abc', outputs: [outputItem, htmlOutputItem] }; + const output2: IOutputDto = { outputId: 'def', outputs: [outputItem, htmlOutputItem] }; + + await withTestNotebook( + [ + ['print(output content)', 'python', CellKind.Code, [output1, output2], {}], + ], + (editor, viewModel, disposables, accessor) => { + + const cell = viewModel.viewCells[0] as CodeCellViewModel; + const cellTemplate = createCellTemplate(disposables); + const output = disposables.add(accessor.createInstance(CellOutputContainer, editor, cell, cellTemplate, { limit: 100 })); + output.render(); + cell.outputsViewModels[0].setVisible(true); + assert.strictEqual(outputMenus.length, 1, 'should have 1 output menus'); + assert(cellTemplate.outputContainer.domNode.style.display !== 'none', 'output container should be visible'); + cell.outputsViewModels[1].setVisible(true); + assert.strictEqual(outputMenus.length, 2, 'should have 2 output menus'); + cell.outputsViewModels[1].setVisible(true); + assert.strictEqual(outputMenus.length, 2, 'should still have 2 output menus'); + }, + instantiationService + ); + }); + + test('One of many cell outputs becomes hidden', async function () { + const outputItem = { data: VSBuffer.fromString('output content'), mime: 'text/plain' }; + const htmlOutputItem = { data: VSBuffer.fromString('output content'), mime: 'text/html' }; + const output1: IOutputDto = { outputId: 'abc', outputs: [outputItem, htmlOutputItem] }; + const output2: IOutputDto = { outputId: 'def', outputs: [outputItem, htmlOutputItem] }; + const output3: IOutputDto = { outputId: 'ghi', outputs: [outputItem, htmlOutputItem] }; + + await withTestNotebook( + [ + ['print(output content)', 'python', CellKind.Code, [output1, output2, output3], {}], + ], + (editor, viewModel, disposables, accessor) => { + + const cell = viewModel.viewCells[0] as CodeCellViewModel; + const cellTemplate = createCellTemplate(disposables); + const output = disposables.add(accessor.createInstance(CellOutputContainer, editor, cell, cellTemplate, { limit: 100 })); + output.render(); + cell.outputsViewModels[0].setVisible(true); + cell.outputsViewModels[1].setVisible(true); + cell.outputsViewModels[2].setVisible(true); + cell.outputsViewModels[1].setVisible(false); + assert(cellTemplate.outputContainer.domNode.style.display !== 'none', 'output container should be visible'); + assert.strictEqual(outputMenus.length, 2, 'should have 2 output menus'); + }, + instantiationService + ); + }); + + +}); + +function createCellTemplate(disposables: DisposableStore) { + return { + outputContainer: new FastDomNode(document.createElement('div')), + outputShowMoreContainer: new FastDomNode(document.createElement('div')), + focusSinkElement: document.createElement('div'), + templateDisposables: disposables, + elementDisposables: disposables, + } as unknown as CodeCellRenderTemplate; +} diff --git a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts index 830ac41e6a897..117ce7aaeda0d 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts @@ -178,7 +178,7 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi } } -export function setupInstantiationService(disposables: DisposableStore) { +export function setupInstantiationService(disposables: Pick) { const instantiationService = disposables.add(new TestInstantiationService()); const testThemeService = new TestThemeService(); instantiationService.stub(ILanguageService, disposables.add(new LanguageService())); @@ -296,6 +296,7 @@ function _createTestNotebookEditor(instantiationService: TestInstantiationServic override setCellEditorSelection() { } override async revealRangeInCenterIfOutsideViewportAsync() { } override async layoutNotebookCell() { } + override async createOutput() { } override async removeInset() { } override async focusNotebookCell(cell: ICellViewModel, focusItem: 'editor' | 'container' | 'output') { cell.focusMode = focusItem === 'editor' ? CellFocusMode.Editor From c8a4a255778fd9f8ef729b521f0ed0d8c691e5be Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 28 Jun 2024 14:25:19 -0700 Subject: [PATCH 564/755] Add 'command' to chat telemetry (#219218) --- .../browser/actions/chatCodeblockActions.ts | 5 + .../chat/browser/actions/chatTitleActions.ts | 3 + .../contrib/chat/browser/chatWidget.ts | 1 + .../contrib/chat/common/chatService.ts | 1 + .../contrib/chat/common/chatServiceImpl.ts | 94 +------------- .../chat/common/chatServiceTelemetry.ts | 121 ++++++++++++++++++ .../browser/inlineChatController.ts | 2 + 7 files changed, 138 insertions(+), 89 deletions(-) create mode 100644 src/vs/workbench/contrib/chat/common/chatServiceTelemetry.ts diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts index b94a9434cc5e9..378d6857e489b 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.ts @@ -112,6 +112,7 @@ export function registerChatCodeBlockActions() { const chatService = accessor.get(IChatService); chatService.notifyUserAction({ agentId: context.element.agent?.id, + command: context.element.slashCommand?.name, sessionId: context.element.sessionId, requestId: context.element.requestId, result: context.element.result, @@ -157,6 +158,7 @@ export function registerChatCodeBlockActions() { if (element) { chatService.notifyUserAction({ agentId: element.agent?.id, + command: element.slashCommand?.name, sessionId: element.sessionId, requestId: element.requestId, result: element.result, @@ -356,6 +358,7 @@ export function registerChatCodeBlockActions() { const chatService = accessor.get(IChatService); chatService.notifyUserAction({ agentId: context.element.agent?.id, + command: context.element.slashCommand?.name, sessionId: context.element.sessionId, requestId: context.element.requestId, result: context.element.result, @@ -401,6 +404,7 @@ export function registerChatCodeBlockActions() { if (isResponseVM(context.element)) { chatService.notifyUserAction({ agentId: context.element.agent?.id, + command: context.element.slashCommand?.name, sessionId: context.element.sessionId, requestId: context.element.requestId, result: context.element.result, @@ -493,6 +497,7 @@ export function registerChatCodeBlockActions() { if (isResponseVM(context.element)) { chatService.notifyUserAction({ agentId: context.element.agent?.id, + command: context.element.slashCommand?.name, sessionId: context.element.sessionId, requestId: context.element.requestId, result: context.element.result, diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts index 4a2455ea71fda..e5ce3cbefbcea 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts @@ -51,6 +51,7 @@ export function registerChatTitleActions() { const chatService = accessor.get(IChatService); chatService.notifyUserAction({ agentId: item.agent?.id, + command: item.slashCommand?.name, sessionId: item.sessionId, requestId: item.requestId, result: item.result, @@ -90,6 +91,7 @@ export function registerChatTitleActions() { const chatService = accessor.get(IChatService); chatService.notifyUserAction({ agentId: item.agent?.id, + command: item.slashCommand?.name, sessionId: item.sessionId, requestId: item.requestId, result: item.result, @@ -128,6 +130,7 @@ export function registerChatTitleActions() { const chatService = accessor.get(IChatService); chatService.notifyUserAction({ agentId: item.agent?.id, + command: item.slashCommand?.name, sessionId: item.sessionId, requestId: item.requestId, result: item.result, diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index 4a8aca892cfa8..c6493b1a4f03e 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -628,6 +628,7 @@ export class ChatWidget extends Disposable implements IChatWidget { sessionId: this.viewModel.sessionId, requestId: e.response.requestId, agentId: e.response.agent?.id, + command: e.response.slashCommand?.name, result: e.response.result, action: { kind: 'followUp', diff --git a/src/vs/workbench/contrib/chat/common/chatService.ts b/src/vs/workbench/contrib/chat/common/chatService.ts index fc4add785ffef..f10564d782800 100644 --- a/src/vs/workbench/contrib/chat/common/chatService.ts +++ b/src/vs/workbench/contrib/chat/common/chatService.ts @@ -252,6 +252,7 @@ export type ChatUserAction = IChatVoteAction | IChatCopyAction | IChatInsertActi export interface IChatUserActionEvent { action: ChatUserAction; agentId: string | undefined; + command: string | undefined; sessionId: string; requestId: string; result: IChatAgentResult | undefined; diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index 7c115514e9113..a0cf7da28a9c7 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -16,7 +16,6 @@ import { revive } from 'vs/base/common/marshalling'; import { StopWatch } from 'vs/base/common/stopwatch'; import { URI, UriComponents } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { Progress } from 'vs/platform/progress/common/progress'; @@ -27,7 +26,8 @@ import { ChatAgentLocation, IChatAgent, IChatAgentRequest, IChatAgentResult, ICh import { ChatModel, ChatRequestModel, ChatRequestRemovalReason, ChatWelcomeMessageModel, IChatModel, IChatRequestModel, IChatRequestVariableData, IChatRequestVariableEntry, IChatResponseModel, IExportableChatData, ISerializableChatData, ISerializableChatsData, getHistoryEntriesFromModel, updateRanges } from 'vs/workbench/contrib/chat/common/chatModel'; import { ChatRequestAgentPart, ChatRequestAgentSubcommandPart, ChatRequestSlashCommandPart, IParsedChatRequest, chatAgentLeader, chatSubcommandLeader, getPromptText } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { ChatRequestParser } from 'vs/workbench/contrib/chat/common/chatRequestParser'; -import { ChatCopyKind, IChatCompleteResponse, IChatDetail, IChatFollowup, IChatProgress, IChatSendRequestData, IChatSendRequestOptions, IChatSendRequestResponseState, IChatService, IChatTransferredSessionData, IChatUserActionEvent, ChatAgentVoteDirection } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatCompleteResponse, IChatDetail, IChatFollowup, IChatProgress, IChatSendRequestData, IChatSendRequestOptions, IChatSendRequestResponseState, IChatService, IChatTransferredSessionData, IChatUserActionEvent } from 'vs/workbench/contrib/chat/common/chatService'; +import { ChatServiceTelemetry } from 'vs/workbench/contrib/chat/common/chatServiceTelemetry'; import { IChatSlashCommandService } from 'vs/workbench/contrib/chat/common/chatSlashCommands'; import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import { ChatMessageRole, IChatMessage } from 'vs/workbench/contrib/chat/common/languageModels'; @@ -68,64 +68,6 @@ type ChatProviderInvokedClassification = { comment: 'Provides insight into the performance of Chat agents.'; }; -type ChatVoteEvent = { - direction: 'up' | 'down'; - agentId: string; -}; - -type ChatVoteClassification = { - direction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the user voted up or down.' }; - agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the chat agent that this vote is for.' }; - owner: 'roblourens'; - comment: 'Provides insight into the performance of Chat agents.'; -}; - -type ChatCopyEvent = { - copyKind: 'action' | 'toolbar'; - agentId: string; -}; - -type ChatCopyClassification = { - copyKind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'How the copy was initiated.' }; - agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the chat agent that the copy acted on.' }; - owner: 'roblourens'; - comment: 'Provides insight into the usage of Chat features.'; -}; - -type ChatInsertEvent = { - newFile: boolean; - agentId: string; -}; - -type ChatInsertClassification = { - newFile: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the code was inserted into a new untitled file.' }; - agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the chat agent that this insertion is for.' }; - owner: 'roblourens'; - comment: 'Provides insight into the usage of Chat features.'; -}; - -type ChatCommandEvent = { - commandId: string; - agentId: string; -}; - -type ChatCommandClassification = { - commandId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The id of the command that was executed.' }; - agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the related chat agent.' }; - owner: 'roblourens'; - comment: 'Provides insight into the usage of Chat features.'; -}; - -type ChatTerminalEvent = { - languageId: string; -}; - -type ChatTerminalClassification = { - languageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The language of the code that was run in the terminal.' }; - owner: 'roblourens'; - comment: 'Provides insight into the usage of Chat features.'; -}; - const maxPersistedSessions = 25; export class ChatService extends Disposable implements IChatService { @@ -148,6 +90,7 @@ export class ChatService extends Disposable implements IChatService { public readonly onDidDisposeSession = this._onDidDisposeSession.event; private readonly _sessionFollowupCancelTokens = this._register(new DisposableMap()); + private readonly _chatServiceTelemetry: ChatServiceTelemetry; constructor( @IStorageService private readonly storageService: IStorageService, @@ -162,6 +105,7 @@ export class ChatService extends Disposable implements IChatService { ) { super(); + this._chatServiceTelemetry = this.instantiationService.createInstance(ChatServiceTelemetry); const sessionData = storageService.get(serializedChatKey, StorageScope.WORKSPACE, ''); if (sessionData) { this._persistedSessions = this.deserializeChats(sessionData); @@ -212,35 +156,7 @@ export class ChatService extends Disposable implements IChatService { } notifyUserAction(action: IChatUserActionEvent): void { - if (action.action.kind === 'vote') { - this.telemetryService.publicLog2('interactiveSessionVote', { - direction: action.action.direction === ChatAgentVoteDirection.Up ? 'up' : 'down', - agentId: action.agentId ?? '' - }); - } else if (action.action.kind === 'copy') { - this.telemetryService.publicLog2('interactiveSessionCopy', { - copyKind: action.action.copyKind === ChatCopyKind.Action ? 'action' : 'toolbar', - agentId: action.agentId ?? '' - }); - } else if (action.action.kind === 'insert') { - this.telemetryService.publicLog2('interactiveSessionInsert', { - newFile: !!action.action.newFile, - agentId: action.agentId ?? '' - }); - } else if (action.action.kind === 'command') { - // TODO not currently called - const command = CommandsRegistry.getCommand(action.action.commandButton.command.id); - const commandId = command ? action.action.commandButton.command.id : 'INVALID'; - this.telemetryService.publicLog2('interactiveSessionCommand', { - commandId, - agentId: action.agentId ?? '' - }); - } else if (action.action.kind === 'runInTerminal') { - this.telemetryService.publicLog2('interactiveSessionRunInTerminal', { - languageId: action.action.languageId ?? '' - }); - } - + this._chatServiceTelemetry.notifyUserAction(action); this._onDidPerformUserAction.fire(action); } diff --git a/src/vs/workbench/contrib/chat/common/chatServiceTelemetry.ts b/src/vs/workbench/contrib/chat/common/chatServiceTelemetry.ts new file mode 100644 index 0000000000000..ec8d5aa339ecf --- /dev/null +++ b/src/vs/workbench/contrib/chat/common/chatServiceTelemetry.ts @@ -0,0 +1,121 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IChatUserActionEvent, ChatAgentVoteDirection, ChatCopyKind } from 'vs/workbench/contrib/chat/common/chatService'; + +type ChatVoteEvent = { + direction: 'up' | 'down'; + agentId: string; + command: string | undefined; +}; + +type ChatVoteClassification = { + direction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the user voted up or down.' }; + agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the chat agent that this vote is for.' }; + command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The name of the slash command that this vote is for.' }; + owner: 'roblourens'; + comment: 'Provides insight into the performance of Chat agents.'; +}; + +type ChatCopyEvent = { + copyKind: 'action' | 'toolbar'; + agentId: string; + command: string | undefined; +}; + +type ChatCopyClassification = { + copyKind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'How the copy was initiated.' }; + agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the chat agent that the copy acted on.' }; + command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The name of the slash command the copy acted on.' }; + owner: 'roblourens'; + comment: 'Provides insight into the usage of Chat features.'; +}; + +type ChatInsertEvent = { + newFile: boolean; + agentId: string; + command: string | undefined; +}; + +type ChatInsertClassification = { + newFile: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the code was inserted into a new untitled file.' }; + agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the chat agent that this insertion is for.' }; + command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The name of the slash command that this insertion is for.' }; + owner: 'roblourens'; + comment: 'Provides insight into the usage of Chat features.'; +}; + +type ChatCommandEvent = { + commandId: string; + agentId: string; + command: string | undefined; +}; + +type ChatCommandClassification = { + commandId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The id of the command that was executed.' }; + agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the related chat agent.' }; + command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The name of the related slash command.' }; + owner: 'roblourens'; + comment: 'Provides insight into the usage of Chat features.'; +}; + +type ChatTerminalEvent = { + languageId: string; + agentId: string; + command: string | undefined; +}; + +type ChatTerminalClassification = { + languageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The language of the code that was run in the terminal.' }; + agentId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The ID of the related chat agent.' }; + command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The name of the related slash command.' }; + owner: 'roblourens'; + comment: 'Provides insight into the usage of Chat features.'; +}; + +export class ChatServiceTelemetry { + constructor( + @ITelemetryService private readonly telemetryService: ITelemetryService, + ) { } + + notifyUserAction(action: IChatUserActionEvent): void { + if (action.action.kind === 'vote') { + this.telemetryService.publicLog2('interactiveSessionVote', { + direction: action.action.direction === ChatAgentVoteDirection.Up ? 'up' : 'down', + agentId: action.agentId ?? '', + command: action.command, + }); + } else if (action.action.kind === 'copy') { + this.telemetryService.publicLog2('interactiveSessionCopy', { + copyKind: action.action.copyKind === ChatCopyKind.Action ? 'action' : 'toolbar', + agentId: action.agentId ?? '', + command: action.command, + }); + } else if (action.action.kind === 'insert') { + this.telemetryService.publicLog2('interactiveSessionInsert', { + newFile: !!action.action.newFile, + agentId: action.agentId ?? '', + command: action.command, + }); + } else if (action.action.kind === 'command') { + // TODO not currently called + const command = CommandsRegistry.getCommand(action.action.commandButton.command.id); + const commandId = command ? action.action.commandButton.command.id : 'INVALID'; + this.telemetryService.publicLog2('interactiveSessionCommand', { + commandId, + agentId: action.agentId ?? '', + command: action.command, + }); + } else if (action.action.kind === 'runInTerminal') { + this.telemetryService.publicLog2('interactiveSessionRunInTerminal', { + languageId: action.action.languageId ?? '', + agentId: action.agentId ?? '', + command: action.command, + }); + } + } +} diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index ec0d7cf665d9f..eda96113c94bd 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -1074,6 +1074,7 @@ export class InlineChatController implements IEditorContribution { sessionId: response.session.sessionId, requestId: response.requestId, agentId: response.agent?.id, + command: response.slashCommand?.name, result: response.result, action: { kind: 'inlineChat', @@ -1099,6 +1100,7 @@ export class InlineChatController implements IEditorContribution { sessionId: response.session.sessionId, requestId: response.requestId, agentId: response.agent?.id, + command: response.slashCommand?.name, result: response.result, action: { kind: 'inlineChat', From 5bece9e46a005096f4b137b292327d4af1b57073 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 28 Jun 2024 15:39:18 -0700 Subject: [PATCH 565/755] Clear all workspace chats should also clear all open chats (#219198) Fix #218034 --- .../chat/browser/actions/chatActions.ts | 20 +++++++++++++++++++ .../contrib/chat/browser/actions/chatClear.ts | 14 ++++++++----- .../chat/browser/actions/chatClearActions.ts | 2 +- .../chat/browser/actions/chatMoveActions.ts | 13 ++++++------ src/vs/workbench/contrib/chat/browser/chat.ts | 8 ++------ .../contrib/chat/browser/chatEditor.ts | 8 +++++--- .../contrib/chat/browser/chatViewPane.ts | 5 ++--- .../contrib/chat/browser/chatWidget.ts | 2 -- 8 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts index b872b925229ae..6b2e2c26435f1 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts @@ -15,6 +15,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IsLinuxContext, IsWindowsContext } from 'vs/platform/contextkey/common/contextkeys'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IQuickInputButton, IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; +import { clearChatEditor } from 'vs/workbench/contrib/chat/browser/actions/chatClear'; import { CHAT_VIEW_ID, IChatWidgetService, showChatView } from 'vs/workbench/contrib/chat/browser/chat'; import { IChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatEditor'; import { ChatEditorInput } from 'vs/workbench/contrib/chat/browser/chatEditorInput'; @@ -24,6 +25,7 @@ import { CONTEXT_CHAT_ENABLED, CONTEXT_CHAT_INPUT_CURSOR_AT_TOP, CONTEXT_CHAT_LO import { IChatDetail, IChatService } from 'vs/workbench/contrib/chat/common/chatService'; import { IChatRequestViewModel, IChatResponseViewModel, isRequestVM } from 'vs/workbench/contrib/chat/common/chatViewModel'; import { IChatWidgetHistoryService } from 'vs/workbench/contrib/chat/common/chatWidgetHistoryService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ACTIVE_GROUP, IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; @@ -228,8 +230,26 @@ export function registerChatActions() { }); } async run(accessor: ServicesAccessor, ...args: any[]) { + const editorGroupsService = accessor.get(IEditorGroupsService); + const viewsService = accessor.get(IViewsService); + const chatService = accessor.get(IChatService); chatService.clearAllHistoryEntries(); + + const chatView = viewsService.getViewWithId(CHAT_VIEW_ID) as ChatViewPane | undefined; + if (chatView) { + chatView.widget.clear(); + } + + // Clear all chat editors. Have to go this route because the chat editor may be in the background and + // not have a ChatEditorInput. + editorGroupsService.groups.forEach(group => { + group.editors.forEach(editor => { + if (editor instanceof ChatEditorInput) { + clearChatEditor(accessor, editor); + } + }); + }); } }); diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatClear.ts b/src/vs/workbench/contrib/chat/browser/actions/chatClear.ts index 00ffcaed8c73f..cd85340c42a32 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatClear.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatClear.ts @@ -6,18 +6,22 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatEditor'; import { ChatEditorInput } from 'vs/workbench/contrib/chat/browser/chatEditorInput'; -import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -export async function clearChatEditor(accessor: ServicesAccessor): Promise { +export async function clearChatEditor(accessor: ServicesAccessor, chatEditorInput?: ChatEditorInput): Promise { const editorService = accessor.get(IEditorService); - const editorGroupsService = accessor.get(IEditorGroupsService); - const chatEditorInput = editorService.activeEditor; + if (!chatEditorInput) { + const editorInput = editorService.activeEditor; + chatEditorInput = editorInput instanceof ChatEditorInput ? editorInput : undefined; + } + if (chatEditorInput instanceof ChatEditorInput) { + // A chat editor can only be open in one group + const identifier = editorService.findEditors(chatEditorInput.resource)[0]; await editorService.replaceEditors([{ editor: chatEditorInput, replacement: { resource: ChatEditorInput.getNewEditorUri(), options: { pinned: true } satisfies IChatEditorOptions } - }], editorGroupsService.activeGroup); + }], identifier.groupId); } } diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts index b74d1b38b9c9d..1c6572f3415d3 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts @@ -81,7 +81,7 @@ export function registerNewChatActions() { if (isChatViewTitleActionContext(context)) { // Is running in the Chat view title announceChatCleared(accessibilitySignalService); - context.chatView.clear(); + context.chatView.widget.clear(); context.chatView.widget.focusInput(); } else { // Is running from f1 or keybinding diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.ts index 195ab2b3aa10e..d04e49d62188c 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.ts @@ -92,7 +92,6 @@ export function registerMoveActions() { async function executeMoveToAction(accessor: ServicesAccessor, moveTo: MoveToNewLocation, chatView?: ChatViewPane) { const widgetService = accessor.get(IChatWidgetService); - const viewService = accessor.get(IViewsService); const editorService = accessor.get(IEditorService); const widget = chatView?.widget ?? widgetService.lastFocusedWidget; @@ -107,9 +106,8 @@ async function executeMoveToAction(accessor: ServicesAccessor, moveTo: MoveToNew } const sessionId = viewModel.sessionId; - const view = await viewService.openView(widget.viewContext.viewId) as ChatViewPane; - const viewState = view.widget.getViewState(); - view.clear(); + const viewState = widget.getViewState(); + widget.clear(); await editorService.openEditor({ resource: ChatEditorInput.getNewEditorUri(), options: { target: { sessionId }, pinned: true, viewState: viewState } }, moveTo === MoveToNewLocation.Window ? AUX_WINDOW_GROUP : ACTIVE_GROUP); } @@ -120,11 +118,14 @@ async function moveToSidebar(accessor: ServicesAccessor): Promise { const editorGroupService = accessor.get(IEditorGroupsService); const chatEditorInput = editorService.activeEditor; + let view: ChatViewPane; if (chatEditorInput instanceof ChatEditorInput && chatEditorInput.sessionId) { await editorService.closeEditor({ editor: chatEditorInput, groupId: editorGroupService.activeGroup.id }); - const view = await viewsService.openView(CHAT_VIEW_ID) as ChatViewPane; + view = await viewsService.openView(CHAT_VIEW_ID) as ChatViewPane; view.loadSession(chatEditorInput.sessionId); } else { - await viewsService.openView(CHAT_VIEW_ID); + view = await viewsService.openView(CHAT_VIEW_ID) as ChatViewPane; } + + view.focus(); } diff --git a/src/vs/workbench/contrib/chat/browser/chat.ts b/src/vs/workbench/contrib/chat/browser/chat.ts index c02338c87bedd..99bb40c2ca473 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.ts @@ -13,7 +13,7 @@ import { MenuId } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ChatViewPane } from 'vs/workbench/contrib/chat/browser/chatViewPane'; -import { IChatWidgetContrib } from 'vs/workbench/contrib/chat/browser/chatWidget'; +import { IChatViewState, IChatWidgetContrib } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { ICodeBlockActionContext } from 'vs/workbench/contrib/chat/browser/codeBlockPart'; import { ChatAgentLocation, IChatAgentCommand, IChatAgentData } from 'vs/workbench/contrib/chat/common/chatAgents'; import { IChatRequestVariableEntry, IChatResponseModel } from 'vs/workbench/contrib/chat/common/chatModel'; @@ -34,7 +34,6 @@ export interface IChatWidgetService { readonly lastFocusedWidget: IChatWidget | undefined; getWidgetByInputUri(uri: URI): IChatWidget | undefined; - getWidgetBySessionId(sessionId: string): IChatWidget | undefined; } @@ -172,10 +171,7 @@ export interface IChatWidget { getLastFocusedFileTreeForResponse(response: IChatResponseViewModel): IChatFileTreeInfo | undefined; setContext(overwrite: boolean, ...context: IChatRequestVariableEntry[]): void; clear(): void; -} - -export interface IChatViewPane { - clear(): void; + getViewState(): IChatViewState; } diff --git a/src/vs/workbench/contrib/chat/browser/chatEditor.ts b/src/vs/workbench/contrib/chat/browser/chatEditor.ts index 1da5d57b810f0..83d025ae70621 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditor.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditor.ts @@ -50,8 +50,10 @@ export class ChatEditor extends EditorPane { super(ChatEditorInput.EditorID, group, telemetryService, themeService, storageService); } - public async clear() { - return this.instantiationService.invokeFunction(clearChatEditor); + private async clear() { + if (this.input) { + return this.instantiationService.invokeFunction(clearChatEditor, this.input as ChatEditorInput); + } } protected override createEditor(parent: HTMLElement): void { @@ -75,7 +77,7 @@ export class ChatEditor extends EditorPane { this.widget.setVisible(true); } - protected override setEditorVisible(visible: boolean): void { + protected override setEditorVisible(visible: boolean): void { super.setEditorVisible(visible); this.widget?.setVisible(visible); diff --git a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts index b0c5440439958..83a9ef05a8f29 100644 --- a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts +++ b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts @@ -22,7 +22,6 @@ import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/vie import { Memento } from 'vs/workbench/common/memento'; import { SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { IViewDescriptorService } from 'vs/workbench/common/views'; -import { IChatViewPane } from 'vs/workbench/contrib/chat/browser/chat'; import { IChatViewState, ChatWidget } from 'vs/workbench/contrib/chat/browser/chatWidget'; import { ChatAgentLocation, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; import { CHAT_PROVIDER_ID } from 'vs/workbench/contrib/chat/common/chatParticipantContribTypes'; @@ -35,7 +34,7 @@ interface IViewPaneState extends IChatViewState { } export const CHAT_SIDEBAR_PANEL_ID = 'workbench.panel.chatSidebar'; -export class ChatViewPane extends ViewPane implements IChatViewPane { +export class ChatViewPane extends ViewPane { private _widget!: ChatWidget; get widget(): ChatWidget { return this._widget; } @@ -176,7 +175,7 @@ export class ChatViewPane extends ViewPane implements IChatViewPane { this._widget.acceptInput(query); } - clear(): void { + private clear(): void { if (this.widget.viewModel) { this.chatService.clearSession(this.widget.viewModel.sessionId); } diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index c6493b1a4f03e..231d671577ca6 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -963,8 +963,6 @@ export class ChatWidget extends Disposable implements IChatWidget { this.inputPart.saveState(); return { inputValue: this.getInput(), inputState: this.collectInputState() }; } - - } export class ChatWidgetService implements IChatWidgetService { From 39aba8e0afffb3ed32005b1456d911a3cc77d97d Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 29 Jun 2024 05:31:50 -0700 Subject: [PATCH 566/755] Tune chat render rate (#219241) Count words more correctly Don't measure the time before text starts to appear Better logs --- .../chat/browser/actions/chatActions.ts | 2 +- .../chat/browser/actions/chatTitleActions.ts | 2 +- .../chat/browser/chatAccessibilityProvider.ts | 8 +-- .../chat/browser/chatAccessibilityService.ts | 3 +- .../contrib/chat/browser/chatListRenderer.ts | 26 +++---- .../browser/chatResponseAccessibleView.ts | 2 +- .../contrib/chat/common/chatModel.ts | 35 ++++++++-- .../contrib/chat/common/chatServiceImpl.ts | 2 +- .../contrib/chat/common/chatViewModel.ts | 16 +++-- .../contrib/chat/common/chatWordCounter.ts | 8 ++- .../actions/voiceChatActions.ts | 6 +- .../chat/test/common/chatModel.test.ts | 4 +- .../chat/test/common/chatService.test.ts | 2 +- .../chat/test/common/chatWordCounter.test.ts | 67 +++++++++++++------ .../inlineChat/browser/inlineChatWidget.ts | 2 +- 15 files changed, 121 insertions(+), 64 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts index 6b2e2c26435f1..29731511a132a 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatActions.ts @@ -310,6 +310,6 @@ export function stringifyItem(item: IChatRequestViewModel | IChatResponseViewMod if (isRequestVM(item)) { return (includeName ? `${item.username}: ` : '') + item.messageText; } else { - return (includeName ? `${item.username}: ` : '') + item.response.asString(); + return (includeName ? `${item.username}: ` : '') + item.response.toString(); } } diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts index e5ce3cbefbcea..9338bf5b51b10 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.ts @@ -177,7 +177,7 @@ export function registerChatTitleActions() { return; } - const value = item.response.asString(); + const value = item.response.toString(); const splitContents = splitMarkdownAndCodeBlocks(value); const focusRange = notebookEditor.getFocus(); diff --git a/src/vs/workbench/contrib/chat/browser/chatAccessibilityProvider.ts b/src/vs/workbench/contrib/chat/browser/chatAccessibilityProvider.ts index 5eb8edf7f6d7a..ecfaa1653f1c4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatAccessibilityProvider.ts +++ b/src/vs/workbench/contrib/chat/browser/chatAccessibilityProvider.ts @@ -62,16 +62,16 @@ export class ChatAccessibilityProvider implements IListAccessibilityProvider token.type === 'code')?.length ?? 0; + const codeBlockCount = marked.lexer(element.response.toString()).filter(token => token.type === 'code')?.length ?? 0; switch (codeBlockCount) { case 0: - label = accessibleViewHint ? localize('noCodeBlocksHint', "{0} {1} {2}", fileTreeCountHint, element.response.asString(), accessibleViewHint) : localize('noCodeBlocks', "{0} {1}", fileTreeCountHint, element.response.asString()); + label = accessibleViewHint ? localize('noCodeBlocksHint', "{0} {1} {2}", fileTreeCountHint, element.response.toString(), accessibleViewHint) : localize('noCodeBlocks', "{0} {1}", fileTreeCountHint, element.response.toString()); break; case 1: - label = accessibleViewHint ? localize('singleCodeBlockHint', "{0} 1 code block: {1} {2}", fileTreeCountHint, element.response.asString(), accessibleViewHint) : localize('singleCodeBlock', "{0} 1 code block: {1}", fileTreeCountHint, element.response.asString()); + label = accessibleViewHint ? localize('singleCodeBlockHint', "{0} 1 code block: {1} {2}", fileTreeCountHint, element.response.toString(), accessibleViewHint) : localize('singleCodeBlock', "{0} 1 code block: {1}", fileTreeCountHint, element.response.toString()); break; default: - label = accessibleViewHint ? localize('multiCodeBlockHint', "{0} {1} code blocks: {2}", fileTreeCountHint, codeBlockCount, element.response.asString(), accessibleViewHint) : localize('multiCodeBlock', "{0} {1} code blocks", fileTreeCountHint, codeBlockCount, element.response.asString()); + label = accessibleViewHint ? localize('multiCodeBlockHint', "{0} {1} code blocks: {2}", fileTreeCountHint, codeBlockCount, element.response.toString(), accessibleViewHint) : localize('multiCodeBlock', "{0} {1} code blocks", fileTreeCountHint, codeBlockCount, element.response.toString()); break; } return label; diff --git a/src/vs/workbench/contrib/chat/browser/chatAccessibilityService.ts b/src/vs/workbench/contrib/chat/browser/chatAccessibilityService.ts index d35b283ae34de..06e0d0e292f11 100644 --- a/src/vs/workbench/contrib/chat/browser/chatAccessibilityService.ts +++ b/src/vs/workbench/contrib/chat/browser/chatAccessibilityService.ts @@ -34,7 +34,7 @@ export class ChatAccessibilityService extends Disposable implements IChatAccessi acceptResponse(response: IChatResponseViewModel | string | undefined, requestId: number): void { this._pendingSignalMap.deleteAndDispose(requestId); const isPanelChat = typeof response !== 'string'; - const responseContent = typeof response === 'string' ? response : response?.response.asString(); + const responseContent = typeof response === 'string' ? response : response?.response.toString(); this._accessibilitySignalService.playSignal(AccessibilitySignal.chatResponseReceived, { allowManyInParallel: true }); if (!response || !responseContent) { return; @@ -44,4 +44,3 @@ export class ChatAccessibilityService extends Disposable implements IChatAccessi status(plainTextResponse + errorDetails); } } - diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 21047f36d1cbb..1424cf276b17b 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -172,21 +172,19 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer 0 && newRenderedWordCount !== element.renderData?.renderedWordCount) { // Only update lastRenderTime when we actually render new content element.renderData = { lastRenderTime: Date.now(), renderedWordCount: newRenderedWordCount, renderedParts: partsToRender }; } diff --git a/src/vs/workbench/contrib/chat/browser/chatResponseAccessibleView.ts b/src/vs/workbench/contrib/chat/browser/chatResponseAccessibleView.ts index 009d9f4c3b103..6d682b5d72e3c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatResponseAccessibleView.ts +++ b/src/vs/workbench/contrib/chat/browser/chatResponseAccessibleView.ts @@ -47,7 +47,7 @@ export class ChatResponseAccessibleView implements IAccessibleViewImplentation { widget.focus(focusedItem); const isWelcome = focusedItem instanceof ChatWelcomeMessageModel; - let responseContent = isResponseVM(focusedItem) ? focusedItem.response.asString() : undefined; + let responseContent = isResponseVM(focusedItem) ? focusedItem.response.toString() : undefined; if (isWelcome) { const welcomeReplyContents = []; for (const content of focusedItem.content) { diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index 3e71298a2cb2a..b7c992fe5aea0 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -80,7 +80,8 @@ export type IChatProgressRenderableResponseContent = Exclude; - asString(): string; + toMarkdown(): string; + toString(): string; } export interface IChatResponseModel { @@ -159,10 +160,18 @@ export class Response implements IResponse { return this._onDidChangeValue.event; } - // responseParts internally tracks all the response parts, including strings which are currently resolving, so that they can be updated when they do resolve private _responseParts: IChatProgressResponseContent[]; - // responseRepr externally presents the response parts with consolidated contiguous strings (excluding tree data) - private _responseRepr!: string; + + /** + * A stringified representation of response data which might be presented to a screenreader or used when copying a response. + */ + private _responseRepr = ''; + + /** + * Just the markdown content of the response, used for determining the rendering rate of markdown + */ + private _markdownContent = ''; + get value(): IChatProgressResponseContent[] { return this._responseParts; @@ -176,10 +185,14 @@ export class Response implements IResponse { this._updateRepr(true); } - asString(): string { + toString(): string { return this._responseRepr; } + toMarkdown(): string { + return this._markdownContent; + } + clear(): void { this._responseParts = []; this._updateRepr(true); @@ -264,6 +277,18 @@ export class Response implements IResponse { .filter(s => s.length > 0) .join('\n\n'); + this._markdownContent = this._responseParts.map(part => { + if (part.kind === 'inlineReference') { + return basename('uri' in part.inlineReference ? part.inlineReference.uri : part.inlineReference); + } else if (part.kind === 'markdownContent' || part.kind === 'markdownVuln') { + return part.content.value; + } else { + return ''; + } + }) + .filter(s => s.length > 0) + .join('\n\n'); + if (!quiet) { this._onDidChangeValue.fire(); } diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index a0cf7da28a9c7..48e83a11ea9e4 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -529,7 +529,7 @@ export class ChatService extends Disposable implements IChatService { continue; } history.push({ role: ChatMessageRole.User, content: { type: 'text', value: request.message.text } }); - history.push({ role: ChatMessageRole.Assistant, content: { type: 'text', value: request.response.response.asString() } }); + history.push({ role: ChatMessageRole.Assistant, content: { type: 'text', value: request.response.response.toString() } }); } const message = parsedRequest.text; const commandResult = await this.chatSlashCommandService.executeCommand(commandPart.slashCommand.command, message.substring(commandPart.slashCommand.command.length + 1).trimStart(), new Progress(p => { diff --git a/src/vs/workbench/contrib/chat/common/chatViewModel.ts b/src/vs/workbench/contrib/chat/common/chatViewModel.ts index bde3c18d39916..e4e742afcd57f 100644 --- a/src/vs/workbench/contrib/chat/common/chatViewModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatViewModel.ts @@ -129,7 +129,7 @@ export interface IChatReferences { export type IChatRendererContent = IChatProgressRenderableResponseContent | IChatReferences; export interface IChatLiveUpdateData { - loadingStartTime: number; + firstWordTime: number; lastUpdateTime: number; impliedWordLoadRate: number; lastWordCount: number; @@ -506,7 +506,7 @@ export class ChatResponseViewModel extends Disposable implements IChatResponseVi if (!_model.isComplete) { this._contentUpdateTimings = { - loadingStartTime: Date.now(), + firstWordTime: 0, lastUpdateTime: Date.now(), impliedWordLoadRate: 0, lastWordCount: 0 @@ -514,15 +514,17 @@ export class ChatResponseViewModel extends Disposable implements IChatResponseVi } this._register(_model.onDidChange(() => { + // This should be true, if the model is changing if (this._contentUpdateTimings) { - // This should be true, if the model is changing const now = Date.now(); - const wordCount = countWords(_model.response.asString()); - const timeDiff = now - this._contentUpdateTimings.loadingStartTime; + const wordCount = countWords(_model.response.toString()); + + // Apply a min time difference, or the rate is typically too high for first few words + const timeDiff = Math.max(now - this._contentUpdateTimings.firstWordTime, 250); const impliedWordLoadRate = this._contentUpdateTimings.lastWordCount / (timeDiff / 1000); - this.trace('onDidChange', `Update- got ${this._contentUpdateTimings.lastWordCount} words over ${timeDiff}ms = ${impliedWordLoadRate} words/s. ${wordCount} words are now available.`); + this.trace('onDidChange', `Update- got ${this._contentUpdateTimings.lastWordCount} words over last ${timeDiff}ms = ${impliedWordLoadRate} words/s. ${wordCount} words are now available.`); this._contentUpdateTimings = { - loadingStartTime: this._contentUpdateTimings.loadingStartTime, + firstWordTime: this._contentUpdateTimings.firstWordTime === 0 && this.response.value.some(v => v.kind === 'markdownContent') ? now : this._contentUpdateTimings.firstWordTime, lastUpdateTime: now, impliedWordLoadRate, lastWordCount: wordCount diff --git a/src/vs/workbench/contrib/chat/common/chatWordCounter.ts b/src/vs/workbench/contrib/chat/common/chatWordCounter.ts index edd27ddc435d6..b81d391186eae 100644 --- a/src/vs/workbench/contrib/chat/common/chatWordCounter.ts +++ b/src/vs/workbench/contrib/chat/common/chatWordCounter.ts @@ -11,8 +11,12 @@ export interface IWordCountResult { } export function getNWords(str: string, numWordsToCount: number): IWordCountResult { - // Match words and markdown style links - const allWordMatches = Array.from(str.matchAll(/\[([^\]]+)\]\(([^)]+)\)|\p{sc=Han}|[^\s\|\-|\p{sc=Han}]+/gu)); + // This regex matches each word and skips over whitespace and separators. A word is: + // A markdown link + // One chinese character + // One or more + - =, handled so that code like "a=1+2-3" is broken up better + // One or more characters that aren't whitepace or any of the above + const allWordMatches = Array.from(str.matchAll(/\[([^\]]+)\]\(([^)]+)\)|\p{sc=Han}|=+|\++|-+|[^\s\|\p{sc=Han}|=|\+|\-]+/gu)); const targetWords = allWordMatches.slice(0, numWordsToCount); diff --git a/src/vs/workbench/contrib/chat/electron-sandbox/actions/voiceChatActions.ts b/src/vs/workbench/contrib/chat/electron-sandbox/actions/voiceChatActions.ts index 1c0cdf3fe1937..58586530c701a 100644 --- a/src/vs/workbench/contrib/chat/electron-sandbox/actions/voiceChatActions.ts +++ b/src/vs/workbench/contrib/chat/electron-sandbox/actions/voiceChatActions.ts @@ -805,7 +805,7 @@ class ChatSynthesizerSessions { let totalOffset = 0; let complete = false; do { - const responseLength = response.response.asString().length; + const responseLength = response.response.toString().length; const { chunk, offset } = this.parseNextChatResponseChunk(response, totalOffset); totalOffset = offset; complete = response.isComplete; @@ -818,7 +818,7 @@ class ChatSynthesizerSessions { return; } - if (!complete && responseLength === response.response.asString().length) { + if (!complete && responseLength === response.response.toString().length) { await raceCancellation(Event.toPromise(response.onDidChange), token); // wait for the response to change } } while (!token.isCancellationRequested && !complete); @@ -827,7 +827,7 @@ class ChatSynthesizerSessions { private parseNextChatResponseChunk(response: IChatResponseModel, offset: number): { readonly chunk: string | undefined; readonly offset: number } { let chunk: string | undefined = undefined; - const text = response.response.asString(); + const text = response.response.toString(); if (response.isComplete) { chunk = text.substring(offset); diff --git a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts index e7fb3834f67fb..81efbdca4b699 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts @@ -149,7 +149,7 @@ suite('ChatModel', () => { model2.acceptResponseProgress(request1, { content: new MarkdownString('Hello'), kind: 'markdownContent' }); - assert.strictEqual(request1.response.response.asString(), 'Hello'); + assert.strictEqual(request1.response.response.toString(), 'Hello'); }); }); @@ -162,7 +162,7 @@ suite('Response', () => { response.updateContent({ content: new MarkdownString('markdown2'), kind: 'markdownContent' }); await assertSnapshot(response.value); - assert.strictEqual(response.asString(), 'markdown1markdown2'); + assert.strictEqual(response.toString(), 'markdown1markdown2'); }); test('not mergeable markdown', async () => { diff --git a/src/vs/workbench/contrib/chat/test/common/chatService.test.ts b/src/vs/workbench/contrib/chat/test/common/chatService.test.ts index cf1f2a174d597..df32dfed2f4d8 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatService.test.ts @@ -127,7 +127,7 @@ suite('ChatService', () => { await testService.addCompleteRequest(model.sessionId, 'test request', undefined, 0, { message: 'test response' }); assert.strictEqual(model.getRequests().length, 1); assert.ok(model.getRequests()[0].response); - assert.strictEqual(model.getRequests()[0].response?.response.asString(), 'test response'); + assert.strictEqual(model.getRequests()[0].response?.response.toString(), 'test response'); }); test('sendRequest fails', async () => { diff --git a/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts b/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts index 9330dc5be750b..665c2e386b191 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts @@ -16,28 +16,53 @@ suite('ChatWordCounter', () => { assert.strictEqual(result.returnedWordCount, nWords); } - test('getNWords, matching actualWordCount', () => { - const cases: [string, number, string][] = [ - ['hello world', 1, 'hello'], - ['hello', 1, 'hello'], - ['hello world', 0, ''], - ['here\'s, some. punctuation?', 3, 'here\'s, some. punctuation?'], - ['| markdown | _table_ | header |', 3, '| markdown | _table_ | header'], - ['| --- | --- | --- |', 1, '| --- | --- | --- |'], - [' \t some \n whitespace \n\n\nhere ', 3, ' \t some \n whitespace \n\n\nhere'], - ]; - - cases.forEach(([str, nWords, result]) => doTest(str, nWords, result)); - }); + suite('getNWords', () => { + test('matching actualWordCount', () => { + const cases: [string, number, string][] = [ + ['hello world', 1, 'hello'], + ['hello', 1, 'hello'], + ['hello world', 0, ''], + ['here\'s, some. punctuation?', 3, 'here\'s, some. punctuation?'], + ['| markdown | _table_ | header |', 3, '| markdown | _table_ | header'], + ['| --- | --- | --- |', 1, '| ---'], + ['| --- | --- | --- |', 3, '| --- | --- | ---'], + [' \t some \n whitespace \n\n\nhere ', 3, ' \t some \n whitespace \n\n\nhere'], + ]; + + cases.forEach(([str, nWords, result]) => doTest(str, nWords, result)); + }); + + test('matching links', () => { + const cases: [string, number, string][] = [ + ['[hello](https://example.com) world', 1, '[hello](https://example.com)'], + ['[hello](https://example.com) world', 2, '[hello](https://example.com) world'], + ['oh [hello](https://example.com "title") world', 1, 'oh'], + ['oh [hello](https://example.com "title") world', 2, 'oh [hello](https://example.com "title")'], + ]; + + cases.forEach(([str, nWords, result]) => doTest(str, nWords, result)); + }); - test('getNWords, matching links', () => { - const cases: [string, number, string][] = [ - ['[hello](https://example.com) world', 1, '[hello](https://example.com)'], - ['[hello](https://example.com) world', 2, '[hello](https://example.com) world'], - ['oh [hello](https://example.com "title") world', 1, 'oh'], - ['oh [hello](https://example.com "title") world', 2, 'oh [hello](https://example.com "title")'], - ]; + test('code', () => { + const cases: [string, number, string][] = [ + ['let a=1-2', 2, 'let a'], + ['let a=1-2', 3, 'let a='], + ['let a=1-2', 4, 'let a=1'], + ['const myVar = 1+2', 4, 'const myVar = 1'], + ['
', 3, '
', 4, '
'], + ]; - cases.forEach(([str, nWords, result]) => doTest(str, nWords, result)); + cases.forEach(([str, nWords, result]) => doTest(str, nWords, result)); + }); + + test('chinese characters', () => { + const cases: [string, number, string][] = [ + ['我喜欢中国èœ', 3, '我喜欢'], + ]; + + cases.forEach(([str, nWords, result]) => doTest(str, nWords, result)); + }); }); + }); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 48539e61df835..f68ed1d3241a9 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -389,7 +389,7 @@ export class InlineChatWidget { if (!isNonEmptyArray(requests)) { return undefined; } - return tail(requests)?.response?.response.asString(); + return tail(requests)?.response?.response.toString(); } From 943b47ae1726a6c0970d50f90a84e64be102c2d1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 29 Jun 2024 17:47:45 +0200 Subject: [PATCH 567/755] debt - adopt `nlsCoreBaseUrl` (#219165) --- package.json | 2 +- src/vs/base/common/product.ts | 1 + src/vs/server/node/webClientServer.ts | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f8bfdf775a30c..e8e6a3d2e3413 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.92.0", - "distro": "a08799837ca498c02f445ca7a896f446419af238", + "distro": "58e7d90e05684b6937db21dd372f7a088bdc9dc1", "author": { "name": "Microsoft Corporation" }, diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index 026545ba4ae90..754eba4958470 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -82,6 +82,7 @@ export interface IProductConfiguration { readonly webEndpointUrlTemplate?: string; readonly webviewContentExternalBaseUrlTemplate?: string; readonly target?: string; + readonly nlsCoreBaseUrl?: string; readonly settingsSearchBuildId?: number; readonly settingsSearchUrl?: string; diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts index 20c96da8f1f3d..d9c27e100c8b3 100644 --- a/src/vs/server/node/webClientServer.ts +++ b/src/vs/server/node/webClientServer.ts @@ -342,9 +342,9 @@ export class WebClientServer { const locale = cookies['vscode.nls.locale'] || req.headers['accept-language']?.split(',')[0]?.toLowerCase() || 'en'; let WORKBENCH_NLS_BASE_URL: string | undefined; let WORKBENCH_NLS_URL: string; - if (!locale.startsWith('en')) { - WORKBENCH_NLS_BASE_URL = `https://www.vscode-unpkg.net/nls/`; - WORKBENCH_NLS_URL = `${WORKBENCH_NLS_BASE_URL}${this._productService.commit}/${this._productService.version}/${locale}/nls.messages.js`; // TODO@bpasero make it a product.json thing + if (!locale.startsWith('en') && this._productService.nlsCoreBaseUrl) { + WORKBENCH_NLS_BASE_URL = this._productService.nlsCoreBaseUrl; + WORKBENCH_NLS_URL = `${WORKBENCH_NLS_BASE_URL}${this._productService.commit}/${this._productService.version}/${locale}/nls.messages.js`; } else { WORKBENCH_NLS_URL = ''; // fallback will apply } From 02255461788a6fb943cde4809d84328c9772f3b0 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sat, 29 Jun 2024 19:40:07 +0200 Subject: [PATCH 568/755] #212879 dispose child instantiation service (#219217) * #212879 dispose child instantiation service * fix tests --- src/vs/workbench/browser/parts/views/viewPane.ts | 6 ++++-- .../test/electron-sandbox/extensionsViews.test.ts | 6 ------ src/vs/workbench/contrib/output/browser/outputView.ts | 4 ++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewPane.ts b/src/vs/workbench/browser/parts/views/viewPane.ts index b95f8a1071c91..28a82a629df73 100644 --- a/src/vs/workbench/browser/parts/views/viewPane.ts +++ b/src/vs/workbench/browser/parts/views/viewPane.ts @@ -391,7 +391,8 @@ export abstract class ViewPane extends Pane implements IView { const viewLocationKey = this.scopedContextKeyService.createKey('viewLocation', ViewContainerLocationToString(viewDescriptorService.getViewLocationById(this.id)!)); this._register(Event.filter(viewDescriptorService.onDidChangeLocation, e => e.views.some(view => view.id === this.id))(() => viewLocationKey.set(ViewContainerLocationToString(viewDescriptorService.getViewLocationById(this.id)!)))); - this.menuActions = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])).createInstance(CompositeMenuActions, options.titleMenuId ?? MenuId.ViewTitle, MenuId.ViewTitleContext, { shouldForwardArgs: !options.donotForwardArgs, renderShortTitle: true })); + const childInstantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); + this.menuActions = this._register(childInstantiationService.createInstance(CompositeMenuActions, options.titleMenuId ?? MenuId.ViewTitle, MenuId.ViewTitleContext, { shouldForwardArgs: !options.donotForwardArgs, renderShortTitle: true })); this._register(this.menuActions.onDidChange(() => this.updateActions())); } @@ -747,7 +748,8 @@ export abstract class FilterViewPane extends ViewPane { accessibleViewService?: IAccessibleViewInformationService ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService, accessibleViewService); - this.filterWidget = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])).createInstance(FilterWidget, options.filterOptions)); + const childInstantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); + this.filterWidget = this._register(childInstantiationService.createInstance(FilterWidget, options.filterOptions)); } override getFilterWidget(): FilterWidget { diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts index 6d62ecebd615a..ef60bf9660553 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts @@ -505,9 +505,6 @@ suite('ExtensionsViews Tests', () => { }] }); - testableView.dispose(); - testableView = disposableStore.add(instantiationService.createInstance(ExtensionsListView, {}, { id: '', title: '' })); - return testableView.show('search-me').then(result => { const options: IQueryOptions = queryTarget.args[0][0]; @@ -532,9 +529,6 @@ suite('ExtensionsViews Tests', () => { const queryTarget = instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...realResults)); - testableView.dispose(); - disposableStore.add(testableView = instantiationService.createInstance(ExtensionsListView, {}, { id: '', title: '' })); - return testableView.show('search-me @sort:installs').then(result => { const options: IQueryOptions = queryTarget.args[0][0]; diff --git a/src/vs/workbench/contrib/output/browser/outputView.ts b/src/vs/workbench/contrib/output/browser/outputView.ts index 19e5642f145fc..9a23e945d8512 100644 --- a/src/vs/workbench/contrib/output/browser/outputView.ts +++ b/src/vs/workbench/contrib/output/browser/outputView.ts @@ -62,8 +62,8 @@ export class OutputViewPane extends ViewPane { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService); this.scrollLockContextKey = CONTEXT_OUTPUT_SCROLL_LOCK.bindTo(this.contextKeyService); - const editorInstantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])); - this.editor = editorInstantiationService.createInstance(OutputEditor); + const editorInstantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); + this.editor = this._register(editorInstantiationService.createInstance(OutputEditor)); this._register(this.editor.onTitleAreaUpdate(() => { this.updateTitle(this.editor.getTitle()); this.updateActions(); From 0426dd4e2a555f71d003d1abef455d0301a06bd0 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Sat, 29 Jun 2024 20:06:00 +0200 Subject: [PATCH 569/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20adopt=20observ?= =?UTF-8?q?ables=20(#219162)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workbench/contrib/scm/browser/activity.ts | 115 +++++++----------- 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/activity.ts b/src/vs/workbench/contrib/scm/browser/activity.ts index de21368d9b9dd..36a6aeffdb351 100644 --- a/src/vs/workbench/contrib/scm/browser/activity.ts +++ b/src/vs/workbench/contrib/scm/browser/activity.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/resources'; -import { IDisposable, dispose, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { VIEW_PANE_ID, ISCMService, ISCMRepository, ISCMViewService } from 'vs/workbench/contrib/scm/common/scm'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; @@ -16,7 +16,6 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { EditorResourceAccessor } from 'vs/workbench/common/editor'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { Schemas } from 'vs/base/common/network'; import { Iterable } from 'vs/base/common/iterator'; import { ITitleService } from 'vs/workbench/services/title/browser/titleService'; import { IEditorGroupContextKeyProvider, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -28,6 +27,11 @@ import { derivedObservableWithCache, latestChangedValue, observableFromEventOpts import { Command } from 'vs/editor/common/languages'; import { ISCMHistoryItemGroup } from 'vs/workbench/contrib/scm/common/history'; +const ActiveRepositoryContextKeys = { + ActiveRepositoryName: new RawContextKey('scmActiveRepositoryName', ''), + ActiveRepositoryBranchName: new RawContextKey('scmActiveRepositoryBranchName', ''), +}; + export class SCMActiveRepositoryController extends Disposable implements IWorkbenchContribution { private readonly _countBadgeConfig = observableConfigValue<'all' | 'focused' | 'off'>('scm.countBadge', 'all', this.configurationService); @@ -198,105 +202,78 @@ export class SCMActiveRepositoryController extends Disposable implements IWorkbe } } -const ActiveRepositoryContextKeys = { - ActiveRepositoryName: new RawContextKey('scmActiveRepositoryName', ''), - ActiveRepositoryBranchName: new RawContextKey('scmActiveRepositoryBranchName', ''), -}; - -export class SCMActiveResourceContextKeyController implements IWorkbenchContribution { +export class SCMActiveResourceContextKeyController extends Disposable implements IWorkbenchContribution { + private readonly _repositories = observableFromEvent(this, + Event.any(this.scmService.onDidAddRepository, this.scmService.onDidRemoveRepository), + () => this.scmService.repositories); - private readonly disposables = new DisposableStore(); - private repositoryDisposables = new Set(); - private onDidRepositoryChange = new Emitter(); + private readonly _onDidRepositoryChange = new Emitter(); constructor( @IEditorGroupsService editorGroupsService: IEditorGroupsService, @ISCMService private readonly scmService: ISCMService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { + super(); + const activeResourceHasChangesContextKey = new RawContextKey('scmActiveResourceHasChanges', false, localize('scmActiveResourceHasChanges', "Whether the active resource has changes")); const activeResourceRepositoryContextKey = new RawContextKey('scmActiveResourceRepository', undefined, localize('scmActiveResourceRepository', "The active resource's repository")); - this.scmService.onDidAddRepository(this.onDidAddRepository, this, this.disposables); - - for (const repository of this.scmService.repositories) { - this.onDidAddRepository(repository); - } + this._store.add(autorunWithStore((reader, store) => { + for (const repository of this._repositories.read(reader)) { + store.add(Event.runAndSubscribe(repository.provider.onDidChangeResources, () => { + this._onDidRepositoryChange.fire(); + })); + } + })); // Create context key providers which will update the context keys based on each groups active editor const hasChangesContextKeyProvider: IEditorGroupContextKeyProvider = { contextKey: activeResourceHasChangesContextKey, - getGroupContextKeyValue: (group) => this.getEditorHasChanges(group.activeEditor), - onDidChange: this.onDidRepositoryChange.event + getGroupContextKeyValue: (group) => this._getEditorHasChanges(group.activeEditor), + onDidChange: this._onDidRepositoryChange.event }; const repositoryContextKeyProvider: IEditorGroupContextKeyProvider = { contextKey: activeResourceRepositoryContextKey, - getGroupContextKeyValue: (group) => this.getEditorRepositoryId(group.activeEditor), - onDidChange: this.onDidRepositoryChange.event + getGroupContextKeyValue: (group) => this._getEditorRepositoryId(group.activeEditor), + onDidChange: this._onDidRepositoryChange.event }; - this.disposables.add(editorGroupsService.registerContextKeyProvider(hasChangesContextKeyProvider)); - this.disposables.add(editorGroupsService.registerContextKeyProvider(repositoryContextKeyProvider)); + this._store.add(editorGroupsService.registerContextKeyProvider(hasChangesContextKeyProvider)); + this._store.add(editorGroupsService.registerContextKeyProvider(repositoryContextKeyProvider)); } - private onDidAddRepository(repository: ISCMRepository): void { - const onDidChange = Event.any(repository.provider.onDidChange, repository.provider.onDidChangeResources); - const changeDisposable = onDidChange(() => { - this.onDidRepositoryChange.fire(); - }); - - const onDidRemove = Event.filter(this.scmService.onDidRemoveRepository, e => e === repository); - const removeDisposable = onDidRemove(() => { - disposable.dispose(); - this.repositoryDisposables.delete(disposable); - this.onDidRepositoryChange.fire(); - }); - - const disposable = combinedDisposable(changeDisposable, removeDisposable); - this.repositoryDisposables.add(disposable); - } - - private getEditorRepositoryId(activeEditor: EditorInput | null): string | undefined { + private _getEditorHasChanges(activeEditor: EditorInput | null): boolean { const activeResource = EditorResourceAccessor.getOriginalUri(activeEditor); + if (!activeResource) { + return false; + } - if (activeResource?.scheme === Schemas.file || activeResource?.scheme === Schemas.vscodeRemote) { - const activeResourceRepository = Iterable.find( - this.scmService.repositories, - r => Boolean(r.provider.rootUri && this.uriIdentityService.extUri.isEqualOrParent(activeResource, r.provider.rootUri)) - ); - - return activeResourceRepository?.id; + const activeResourceRepository = this.scmService.getRepository(activeResource); + for (const resourceGroup of activeResourceRepository?.provider.groups ?? []) { + if (resourceGroup.resources + .some(scmResource => + this.uriIdentityService.extUri.isEqual(activeResource, scmResource.sourceUri))) { + return true; + } } - return undefined; + return false; } - private getEditorHasChanges(activeEditor: EditorInput | null): boolean { + private _getEditorRepositoryId(activeEditor: EditorInput | null): string | undefined { const activeResource = EditorResourceAccessor.getOriginalUri(activeEditor); - - if (activeResource?.scheme === Schemas.file || activeResource?.scheme === Schemas.vscodeRemote) { - const activeResourceRepository = Iterable.find( - this.scmService.repositories, - r => Boolean(r.provider.rootUri && this.uriIdentityService.extUri.isEqualOrParent(activeResource, r.provider.rootUri)) - ); - - for (const resourceGroup of activeResourceRepository?.provider.groups ?? []) { - if (resourceGroup.resources - .some(scmResource => - this.uriIdentityService.extUri.isEqual(activeResource, scmResource.sourceUri))) { - return true; - } - } + if (!activeResource) { + return undefined; } - return false; + const activeResourceRepository = this.scmService.getRepository(activeResource); + return activeResourceRepository?.id; } - dispose(): void { - this.disposables.dispose(); - dispose(this.repositoryDisposables.values()); - this.repositoryDisposables.clear(); - this.onDidRepositoryChange.dispose(); + override dispose(): void { + this._onDidRepositoryChange.dispose(); + super.dispose(); } } From 44ac947b5f414ece573191a4df8ddbeeaf0f54e0 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 1 Jul 2024 09:02:51 +0200 Subject: [PATCH 570/755] review feedback: remove unneccessary check --- .../contrib/chat/browser/chatMarkdownDecorationsRenderer.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts index bb016c0f1fab3..9af542462c305 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts @@ -87,9 +87,7 @@ export class ChatMarkdownDecorationsRenderer { if (part instanceof ChatRequestTextPart) { result += part.text; } else if (part instanceof ChatRequestAgentPart) { - if (!part.agent.isDefault) { - result += this.instantiationService.invokeFunction(accessor => agentToMarkdown(part.agent, false, accessor)); - } + result += this.instantiationService.invokeFunction(accessor => agentToMarkdown(part.agent, false, accessor)); } else { const uri = part instanceof ChatRequestDynamicVariablePart && part.data instanceof URI ? part.data : From abe5b7d16f33011ed0013ed68c6ebdec1f8aff80 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2024 09:18:40 +0200 Subject: [PATCH 571/755] debt - more direct `fs` use (#219261) --- src/vs/base/node/extpath.ts | 2 +- src/vs/base/node/osDisplayProtocolInfo.ts | 5 +- src/vs/base/node/osReleaseInfo.ts | 7 ++- src/vs/base/node/pfs.ts | 51 +++++-------------- src/vs/base/node/processes.ts | 6 +-- src/vs/base/node/zip.ts | 6 +-- src/vs/base/parts/storage/node/storage.ts | 5 +- .../test/node/storage.integrationTest.ts | 11 ++-- src/vs/base/test/node/crypto.test.ts | 3 +- src/vs/base/test/node/extpath.test.ts | 3 +- src/vs/base/test/node/pfs/pfs.test.ts | 20 ++++---- src/vs/base/test/node/snapshot.test.ts | 7 +-- src/vs/base/test/node/zip/zip.test.ts | 3 +- src/vs/code/electron-main/main.ts | 6 +-- src/vs/code/node/cliProcessMain.ts | 4 +- .../sharedProcess/contrib/codeCacheCleaner.ts | 3 +- .../contrib/languagePackCachedDataCleaner.ts | 5 +- .../electron-main/backupMainService.test.ts | 6 +-- .../diagnostics/node/diagnosticsService.ts | 4 +- src/vs/platform/environment/node/stdin.ts | 8 +-- .../node/extensionManagementService.ts | 3 +- .../files/node/diskFileSystemProvider.ts | 18 +++---- .../node/watcher/nodejs/nodejsWatcherLib.ts | 4 +- .../node/diskFileService.integrationTest.ts | 30 +++++------ .../node/nodejsWatcher.integrationTest.ts | 41 +++++++-------- .../node/parcelWatcher.integrationTest.ts | 48 ++++++++--------- .../languagePacks/node/languagePacks.ts | 3 +- .../electron-main/nativeHostMainService.ts | 7 +-- src/vs/platform/remote/node/wsl.ts | 4 +- src/vs/platform/state/test/node/state.test.ts | 4 +- .../storage/electron-main/storageMain.ts | 3 +- src/vs/platform/telemetry/node/telemetry.ts | 9 ++-- .../platform/terminal/node/terminalProcess.ts | 12 ++--- .../terminal/node/terminalProfiles.ts | 3 +- .../electron-main/updateService.win32.ts | 4 +- .../electron-main/windowsMainService.ts | 4 +- .../workspacesManagementMainService.ts | 5 +- .../test/electron-main/workspaces.test.ts | 2 +- .../workspacesManagementMainService.test.ts | 2 +- src/vs/server/node/serverConnectionToken.ts | 2 +- src/vs/server/node/webClientServer.ts | 13 +++-- .../workbench/api/node/extHostStoragePaths.ts | 12 ++--- .../api/node/extHostTunnelService.ts | 11 ++-- .../test/node/colorRegistry.releaseTest.ts | 5 +- .../test/node/keyboardMapperTestUtils.ts | 5 +- 45 files changed, 206 insertions(+), 213 deletions(-) diff --git a/src/vs/base/node/extpath.ts b/src/vs/base/node/extpath.ts index a7ec9cf6d360c..eb91392e39098 100644 --- a/src/vs/base/node/extpath.ts +++ b/src/vs/base/node/extpath.ts @@ -119,7 +119,7 @@ export async function realpath(path: string): Promise { // to not resolve links but to simply see if the path is read accessible or not. const normalizedPath = normalizePath(path); - await Promises.access(normalizedPath, fs.constants.R_OK); + await fs.promises.access(normalizedPath, fs.constants.R_OK); return normalizedPath; } diff --git a/src/vs/base/node/osDisplayProtocolInfo.ts b/src/vs/base/node/osDisplayProtocolInfo.ts index c028dc8853669..90c825bd29b31 100644 --- a/src/vs/base/node/osDisplayProtocolInfo.ts +++ b/src/vs/base/node/osDisplayProtocolInfo.ts @@ -3,8 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { constants as FSConstants } from 'fs'; -import { access } from 'fs/promises'; +import { constants as FSConstants, promises as FSPromises } from 'fs'; import { join } from 'vs/base/common/path'; import { env } from 'vs/base/common/process'; @@ -44,7 +43,7 @@ export async function getDisplayProtocol(errorLogger: (error: any) => void): Pro const waylandServerPipe = join(xdgRuntimeDir, 'wayland-0'); try { - await access(waylandServerPipe, FSConstants.R_OK); + await FSPromises.access(waylandServerPipe, FSConstants.R_OK); // If the file exists, then the session is wayland. return DisplayProtocolType.Wayland; diff --git a/src/vs/base/node/osReleaseInfo.ts b/src/vs/base/node/osReleaseInfo.ts index f72b0fe82bace..60101f545cbd1 100644 --- a/src/vs/base/node/osReleaseInfo.ts +++ b/src/vs/base/node/osReleaseInfo.ts @@ -3,8 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { constants as FSConstants } from 'fs'; -import { open, FileHandle } from 'fs/promises'; +import { constants as FSConstants, promises as FSPromises } from 'fs'; import { createInterface as readLines } from 'readline'; import * as Platform from 'vs/base/common/platform'; @@ -22,10 +21,10 @@ export async function getOSReleaseInfo(errorLogger: (error: any) => void): Promi // Extract release information on linux based systems // using the identifiers specified in // https://www.freedesktop.org/software/systemd/man/os-release.html - let handle: FileHandle | undefined; + let handle: FSPromises.FileHandle | undefined; for (const filePath of ['/etc/os-release', '/usr/lib/os-release', '/etc/lsb-release']) { try { - handle = await open(filePath, FSConstants.R_OK); + handle = await FSPromises.open(filePath, FSConstants.R_OK); break; } catch (err) { } } diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index 1c0ce08162502..52e8c9e87d41f 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -134,7 +134,7 @@ async function safeReaddirWithFileTypes(path: string): Promise { let isSymbolicLink = false; try { - const lstat = await Promises.lstat(join(path, child)); + const lstat = await fs.promises.lstat(join(path, child)); isFile = lstat.isFile(); isDirectory = lstat.isDirectory(); @@ -259,7 +259,7 @@ export namespace SymlinkSupport { // First stat the link let lstats: fs.Stats | undefined; try { - lstats = await Promises.lstat(path); + lstats = await fs.promises.lstat(path); // Return early if the stat is not a symbolic link at all if (!lstats.isSymbolicLink()) { @@ -272,7 +272,7 @@ export namespace SymlinkSupport { // If the stat is a symbolic link or failed to stat, use fs.stat() // which for symbolic links will stat the target they point to try { - const stats = await Promises.stat(path); + const stats = await fs.promises.stat(path); return { stat: stats, symbolicLink: lstats?.isSymbolicLink() ? { dangling: false } : undefined }; } catch (error) { @@ -287,7 +287,7 @@ export namespace SymlinkSupport { // are not supported (https://github.com/nodejs/node/issues/36790) if (isWindows && error.code === 'EACCES') { try { - const stats = await Promises.stat(await Promises.readlink(path)); + const stats = await fs.promises.stat(await fs.promises.readlink(path)); return { stat: stats, symbolicLink: { dangling: false } }; } catch (error) { @@ -620,7 +620,7 @@ async function doCopy(source: string, target: string, payload: ICopyPayload): Pr async function doCopyDirectory(source: string, target: string, mode: number, payload: ICopyPayload): Promise { // Create folder - await Promises.mkdir(target, { recursive: true, mode }); + await fs.promises.mkdir(target, { recursive: true, mode }); // Copy each file recursively const files = await readdir(source); @@ -632,16 +632,16 @@ async function doCopyDirectory(source: string, target: string, mode: number, pay async function doCopyFile(source: string, target: string, mode: number): Promise { // Copy file - await Promises.copyFile(source, target); + await fs.promises.copyFile(source, target); // restore mode (https://github.com/nodejs/node/issues/1104) - await Promises.chmod(target, mode); + await fs.promises.chmod(target, mode); } async function doCopySymlink(source: string, target: string, payload: ICopyPayload): Promise { // Figure out link target - let linkTarget = await Promises.readlink(source); + let linkTarget = await fs.promises.readlink(source); // Special case: the symlink points to a target that is // actually within the path that is being copied. In that @@ -652,7 +652,7 @@ async function doCopySymlink(source: string, target: string, payload: ICopyPaylo } // Create symlink - await Promises.symlink(linkTarget, target); + await fs.promises.symlink(linkTarget, target); } //#endregion @@ -660,28 +660,19 @@ async function doCopySymlink(source: string, target: string, payload: ICopyPaylo //#region Promise based fs methods /** - * Provides promise based 'fs' methods by wrapping around the - * original callback based methods. + * Some low level `fs` methods provided as `Promises` similar to + * `fs.promises` but with notable differences, either implemented + * by us or by restoring the original callback based behavior. * * At least `realpath` is implemented differently in the promise * based implementation compared to the callback based one. The * promise based implementation actually calls `fs.realpath.native`. * (https://github.com/microsoft/vscode/issues/118562) - * - * TODO@bpasero we should move away from this towards `fs.promises` - * eventually and only keep those methods around where we explicitly - * want the callback based behaviour. */ export const Promises = new class { //#region Implemented by node.js - get access() { return fs.promises.access; } - - get stat() { return fs.promises.stat; } - get lstat() { return fs.promises.lstat; } - get utimes() { return fs.promises.utimes; } - get read() { // Not using `promisify` here for a reason: the return @@ -700,7 +691,6 @@ export const Promises = new class { }); }; } - get readFile() { return fs.promises.readFile; } get write() { @@ -721,26 +711,11 @@ export const Promises = new class { }; } - get appendFile() { return fs.promises.appendFile; } - get fdatasync() { return promisify(fs.fdatasync); } // not exposed as API in 20.x yet - get truncate() { return fs.promises.truncate; } - - get copyFile() { return fs.promises.copyFile; } get open() { return promisify(fs.open); } // changed to return `FileHandle` in promise API get close() { return promisify(fs.close); } // not exposed as API due to the `FileHandle` return type of `open` - get symlink() { return fs.promises.symlink; } - get readlink() { return fs.promises.readlink; } - - get chmod() { return fs.promises.chmod; } - - get mkdir() { return fs.promises.mkdir; } - - get unlink() { return fs.promises.unlink; } - get rmdir() { return fs.promises.rmdir; } - get realpath() { return promisify(fs.realpath); } // `fs.promises.realpath` will use `fs.realpath.native` which we do not want //#endregion @@ -749,7 +724,7 @@ export const Promises = new class { async exists(path: string): Promise { try { - await Promises.access(path); + await fs.promises.access(path); return true; } catch { diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 9c07f10671131..7bd20f80c0735 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import { Stats } from 'fs'; +import { Stats, promises } from 'fs'; import * as path from 'vs/base/common/path'; import * as Platform from 'vs/base/common/platform'; import * as process from 'vs/base/common/process'; @@ -91,11 +91,11 @@ export namespace win32 { if (await pfs.Promises.exists(path)) { let statValue: Stats | undefined; try { - statValue = await pfs.Promises.stat(path); + statValue = await promises.stat(path); } catch (e) { if (e.message.startsWith('EACCES')) { // it might be symlink - statValue = await pfs.Promises.lstat(path); + statValue = await promises.lstat(path); } } return statValue ? !statValue.isDirectory() : false; diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index c0d9b4b8ecbd1..1295944efcfe4 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createWriteStream, WriteStream } from 'fs'; +import { createWriteStream, WriteStream, promises } from 'fs'; import { Readable } from 'stream'; import { createCancelablePromise, Sequencer } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -85,7 +85,7 @@ function extractEntry(stream: Readable, fileName: string, mode: number, targetPa istream?.destroy(); }); - return Promise.resolve(Promises.mkdir(targetDirName, { recursive: true })).then(() => new Promise((c, e) => { + return Promise.resolve(promises.mkdir(targetDirName, { recursive: true })).then(() => new Promise((c, e) => { if (token.isCancellationRequested) { return; } @@ -148,7 +148,7 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, tok // directory file names end with '/' if (/\/$/.test(fileName)) { const targetFileName = path.join(targetPath, fileName); - last = createCancelablePromise(token => Promises.mkdir(targetFileName, { recursive: true }).then(() => readNextEntry(token)).then(undefined, e)); + last = createCancelablePromise(token => promises.mkdir(targetFileName, { recursive: true }).then(() => readNextEntry(token)).then(undefined, e)); return; } diff --git a/src/vs/base/parts/storage/node/storage.ts b/src/vs/base/parts/storage/node/storage.ts index 5d942007580d5..33a8498c7bb63 100644 --- a/src/vs/base/parts/storage/node/storage.ts +++ b/src/vs/base/parts/storage/node/storage.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { timeout } from 'vs/base/common/async'; import { Event } from 'vs/base/common/event'; import { mapToString, setToString } from 'vs/base/common/map'; @@ -194,7 +195,7 @@ export class SQLiteStorageDatabase implements IStorageDatabase { // Delete the existing DB. If the path does not exist or fails to // be deleted, we do not try to recover anymore because we assume // that the path is no longer writeable for us. - return Promises.unlink(this.path).then(() => { + return fs.promises.unlink(this.path).then(() => { // Re-open the DB fresh return this.doConnect(this.path).then(recoveryConnection => { @@ -280,7 +281,7 @@ export class SQLiteStorageDatabase implements IStorageDatabase { // folder is really not writeable for us. // try { - await Promises.unlink(path); + await fs.promises.unlink(path); try { await Promises.rename(this.toBackupPath(path), path, false /* no retry */); } catch (error) { diff --git a/src/vs/base/parts/storage/test/node/storage.integrationTest.ts b/src/vs/base/parts/storage/test/node/storage.integrationTest.ts index 51c66ca1af87d..450687ab70586 100644 --- a/src/vs/base/parts/storage/test/node/storage.integrationTest.ts +++ b/src/vs/base/parts/storage/test/node/storage.integrationTest.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { deepStrictEqual, ok, strictEqual } from 'assert'; import { tmpdir } from 'os'; import { timeout } from 'vs/base/common/async'; @@ -24,7 +25,7 @@ flakySuite('Storage Library', function () { setup(function () { testDir = getRandomTestPath(tmpdir(), 'vsctests', 'storagelibrary'); - return Promises.mkdir(testDir, { recursive: true }); + return fs.promises.mkdir(testDir, { recursive: true }); }); teardown(function () { @@ -353,7 +354,7 @@ flakySuite('SQLite Storage Library', function () { setup(function () { testdir = getRandomTestPath(tmpdir(), 'vsctests', 'storagelibrary'); - return Promises.mkdir(testdir, { recursive: true }); + return fs.promises.mkdir(testdir, { recursive: true }); }); teardown(function () { @@ -534,7 +535,7 @@ flakySuite('SQLite Storage Library', function () { // on shutdown. await storage.checkIntegrity(true).then(null, error => { } /* error is expected here but we do not want to fail */); - await Promises.unlink(backupPath); // also test that the recovery DB is backed up properly + await fs.promises.unlink(backupPath); // also test that the recovery DB is backed up properly let recoveryCalled = false; await storage.close(() => { @@ -798,7 +799,7 @@ flakySuite('SQLite Storage Library', function () { await storage.optimize(); await storage.close(); - const sizeBeforeDeleteAndOptimize = (await Promises.stat(dbPath)).size; + const sizeBeforeDeleteAndOptimize = (await fs.promises.stat(dbPath)).size; storage = new SQLiteStorageDatabase(dbPath); @@ -820,7 +821,7 @@ flakySuite('SQLite Storage Library', function () { await storage.close(); - const sizeAfterDeleteAndOptimize = (await Promises.stat(dbPath)).size; + const sizeAfterDeleteAndOptimize = (await fs.promises.stat(dbPath)).size; strictEqual(sizeAfterDeleteAndOptimize < sizeBeforeDeleteAndOptimize, true); }); diff --git a/src/vs/base/test/node/crypto.test.ts b/src/vs/base/test/node/crypto.test.ts index ff929aaa21c37..5da7d91f743ba 100644 --- a/src/vs/base/test/node/crypto.test.ts +++ b/src/vs/base/test/node/crypto.test.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { tmpdir } from 'os'; import { join } from 'vs/base/common/path'; import { checksum } from 'vs/base/node/crypto'; @@ -19,7 +20,7 @@ flakySuite('Crypto', () => { setup(function () { testDir = getRandomTestPath(tmpdir(), 'vsctests', 'crypto'); - return Promises.mkdir(testDir, { recursive: true }); + return fs.promises.mkdir(testDir, { recursive: true }); }); teardown(function () { diff --git a/src/vs/base/test/node/extpath.test.ts b/src/vs/base/test/node/extpath.test.ts index b7d78dbee4690..bf895f6750d0b 100644 --- a/src/vs/base/test/node/extpath.test.ts +++ b/src/vs/base/test/node/extpath.test.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import assert from 'assert'; import { tmpdir } from 'os'; import { realcase, realcaseSync, realpath, realpathSync } from 'vs/base/node/extpath'; @@ -16,7 +17,7 @@ flakySuite('Extpath', () => { setup(() => { testDir = getRandomTestPath(tmpdir(), 'vsctests', 'extpath'); - return Promises.mkdir(testDir, { recursive: true }); + return fs.promises.mkdir(testDir, { recursive: true }); }); teardown(() => { diff --git a/src/vs/base/test/node/pfs/pfs.test.ts b/src/vs/base/test/node/pfs/pfs.test.ts index 8fec28d2bfc51..1d97e68b68919 100644 --- a/src/vs/base/test/node/pfs/pfs.test.ts +++ b/src/vs/base/test/node/pfs/pfs.test.ts @@ -25,7 +25,7 @@ flakySuite('PFS', function () { setup(() => { testDir = getRandomTestPath(tmpdir(), 'vsctests', 'pfs'); - return Promises.mkdir(testDir, { recursive: true }); + return fs.promises.mkdir(testDir, { recursive: true }); }); teardown(() => { @@ -39,7 +39,7 @@ flakySuite('PFS', function () { await Promises.writeFile(testFile, 'Hello World', (null!)); - assert.strictEqual((await Promises.readFile(testFile)).toString(), 'Hello World'); + assert.strictEqual((await fs.promises.readFile(testFile)).toString(), 'Hello World'); }); test('writeFile - parallel write on different files works', async () => { @@ -241,7 +241,7 @@ flakySuite('PFS', function () { const symLink = randomPath(testDir); const copyTarget = randomPath(testDir); - await Promises.mkdir(symbolicLinkTarget, { recursive: true }); + await fs.promises.mkdir(symbolicLinkTarget, { recursive: true }); fs.symlinkSync(symbolicLinkTarget, symLink, 'junction'); @@ -258,7 +258,7 @@ flakySuite('PFS', function () { assert.ok(symbolicLink); assert.ok(!symbolicLink.dangling); - const target = await Promises.readlink(copyTarget); + const target = await fs.promises.readlink(copyTarget); assert.strictEqual(target, symbolicLinkTarget); // Copy does not preserve symlinks if configured as such @@ -294,7 +294,7 @@ flakySuite('PFS', function () { const sourceLinkTestFolder = join(sourceFolder, 'link-test'); // copy-test/link-test const sourceLinkMD5JSFolder = join(sourceLinkTestFolder, 'md5'); // copy-test/link-test/md5 const sourceLinkMD5JSFile = join(sourceLinkMD5JSFolder, 'md5.js'); // copy-test/link-test/md5/md5.js - await Promises.mkdir(sourceLinkMD5JSFolder, { recursive: true }); + await fs.promises.mkdir(sourceLinkMD5JSFolder, { recursive: true }); await Promises.writeFile(sourceLinkMD5JSFile, 'Hello from MD5'); const sourceLinkMD5JSFolderLinked = join(sourceLinkTestFolder, 'md5-linked'); // copy-test/link-test/md5-linked @@ -319,7 +319,7 @@ flakySuite('PFS', function () { assert.ok(fs.existsSync(targetLinkMD5JSFolderLinked)); assert.ok(fs.lstatSync(targetLinkMD5JSFolderLinked).isSymbolicLink()); - const linkTarget = await Promises.readlink(targetLinkMD5JSFolderLinked); + const linkTarget = await fs.promises.readlink(targetLinkMD5JSFolderLinked); assert.strictEqual(linkTarget, targetLinkMD5JSFolder); await Promises.rm(targetLinkTestFolder); @@ -353,7 +353,7 @@ flakySuite('PFS', function () { const directory = randomPath(testDir); const symbolicLink = randomPath(testDir); - await Promises.mkdir(directory, { recursive: true }); + await fs.promises.mkdir(directory, { recursive: true }); fs.symlinkSync(directory, symbolicLink, 'junction'); @@ -369,7 +369,7 @@ flakySuite('PFS', function () { const directory = randomPath(testDir); const symbolicLink = randomPath(testDir); - await Promises.mkdir(directory, { recursive: true }); + await fs.promises.mkdir(directory, { recursive: true }); fs.symlinkSync(directory, symbolicLink, 'junction'); @@ -385,7 +385,7 @@ flakySuite('PFS', function () { const parent = randomPath(join(testDir, 'pfs')); const newDir = join(parent, 'öäü'); - await Promises.mkdir(newDir, { recursive: true }); + await fs.promises.mkdir(newDir, { recursive: true }); assert.ok(fs.existsSync(newDir)); @@ -397,7 +397,7 @@ flakySuite('PFS', function () { test('readdir (with file types)', async () => { if (typeof process.versions['electron'] !== 'undefined' /* needs electron */) { const newDir = join(testDir, 'öäü'); - await Promises.mkdir(newDir, { recursive: true }); + await fs.promises.mkdir(newDir, { recursive: true }); await Promises.writeFile(join(testDir, 'somefile.txt'), 'contents'); diff --git a/src/vs/base/test/node/snapshot.test.ts b/src/vs/base/test/node/snapshot.test.ts index 48621bed95fd2..c98dfc763cd8f 100644 --- a/src/vs/base/test/node/snapshot.test.ts +++ b/src/vs/base/test/node/snapshot.test.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { tmpdir } from 'os'; import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { Promises } from 'vs/base/node/pfs'; @@ -23,7 +24,7 @@ suite('snapshot', () => { setup(function () { testDir = getRandomTestPath(tmpdir(), 'vsctests', 'snapshot'); - return Promises.mkdir(testDir, { recursive: true }); + return fs.promises.mkdir(testDir, { recursive: true }); }); teardown(function () { @@ -46,8 +47,8 @@ suite('snapshot', () => { const children = await Promises.readdir(dir); for (const child of children) { const p = path.join(dir, child); - if ((await Promises.stat(p)).isFile()) { - const content = await Promises.readFile(p, 'utf-8'); + if ((await fs.promises.stat(p)).isFile()) { + const content = await fs.promises.readFile(p, 'utf-8'); str += `${' '.repeat(indent)}${child}:\n`; for (const line of content.split('\n')) { str += `${' '.repeat(indent + 2)}${line}\n`; diff --git a/src/vs/base/test/node/zip/zip.test.ts b/src/vs/base/test/node/zip/zip.test.ts index bde3eaf748257..0db7981f74392 100644 --- a/src/vs/base/test/node/zip/zip.test.ts +++ b/src/vs/base/test/node/zip/zip.test.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import assert from 'assert'; import { tmpdir } from 'os'; import { createCancelablePromise } from 'vs/base/common/async'; @@ -19,7 +20,7 @@ suite('Zip', () => { test('extract should handle directories', async () => { const testDir = getRandomTestPath(tmpdir(), 'vsctests', 'zip'); - await Promises.mkdir(testDir, { recursive: true }); + await fs.promises.mkdir(testDir, { recursive: true }); const fixtures = FileAccess.asFileUri('vs/base/test/node/zip/fixtures').fsPath; const fixture = path.join(fixtures, 'extract.zip'); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 8548fa7ce4d87..deb0d1eab5624 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -6,7 +6,7 @@ import 'vs/platform/update/common/update.config.contribution'; import { app, dialog } from 'electron'; -import { unlinkSync } from 'fs'; +import { unlinkSync, promises } from 'fs'; import { URI } from 'vs/base/common/uri'; import { coalesce, distinct } from 'vs/base/common/arrays'; import { Promises } from 'vs/base/common/async'; @@ -139,7 +139,7 @@ class CodeMain { Event.once(lifecycleMainService.onWillShutdown)(evt => { fileService.dispose(); configurationService.dispose(); - evt.join('instanceLockfile', FSPromises.unlink(environmentMainService.mainLockfile).catch(() => { /* ignored */ })); + evt.join('instanceLockfile', promises.unlink(environmentMainService.mainLockfile).catch(() => { /* ignored */ })); }); return instantiationService.createInstance(CodeApplication, mainProcessNodeIpcServer, instanceEnvironment).startup(); @@ -257,7 +257,7 @@ class CodeMain { environmentMainService.workspaceStorageHome.with({ scheme: Schemas.file }).fsPath, environmentMainService.localHistoryHome.with({ scheme: Schemas.file }).fsPath, environmentMainService.backupHome - ].map(path => path ? FSPromises.mkdir(path, { recursive: true }) : undefined)), + ].map(path => path ? promises.mkdir(path, { recursive: true }) : undefined)), // State service stateService.init(), diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 2c1d7afc54c58..f940e372ab39a 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { hostname, release } from 'os'; import { raceTimeout } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -13,7 +14,6 @@ import { isAbsolute, join } from 'vs/base/common/path'; import { isWindows } from 'vs/base/common/platform'; import { cwd } from 'vs/base/common/process'; import { URI } from 'vs/base/common/uri'; -import { Promises } from 'vs/base/node/pfs'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; import { IDownloadService } from 'vs/platform/download/common/download'; @@ -124,7 +124,7 @@ class CliMain extends Disposable { await Promise.all([ this.allowWindowsUNCPath(environmentService.appSettingsHome.with({ scheme: Schemas.file }).fsPath), this.allowWindowsUNCPath(environmentService.extensionsPath) - ].map(path => path ? Promises.mkdir(path, { recursive: true }) : undefined)); + ].map(path => path ? fs.promises.mkdir(path, { recursive: true }) : undefined)); // Logger const loggerService = new LoggerService(getLogLevel(environmentService), environmentService.logsHome); diff --git a/src/vs/code/node/sharedProcess/contrib/codeCacheCleaner.ts b/src/vs/code/node/sharedProcess/contrib/codeCacheCleaner.ts index 77ae5d9786a3e..7ca147e384d0a 100644 --- a/src/vs/code/node/sharedProcess/contrib/codeCacheCleaner.ts +++ b/src/vs/code/node/sharedProcess/contrib/codeCacheCleaner.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { RunOnceScheduler } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -54,7 +55,7 @@ export class CodeCacheCleaner extends Disposable { // Delete cache folder if old enough const codeCacheEntryPath = join(codeCacheRootPath, codeCache); - const codeCacheEntryStat = await Promises.stat(codeCacheEntryPath); + const codeCacheEntryStat = await fs.promises.stat(codeCacheEntryPath); if (codeCacheEntryStat.isDirectory() && (now - codeCacheEntryStat.mtime.getTime()) > this._DataMaxAge) { this.logService.trace(`[code cache cleanup]: Removing code cache folder ${codeCache}.`); diff --git a/src/vs/code/node/sharedProcess/contrib/languagePackCachedDataCleaner.ts b/src/vs/code/node/sharedProcess/contrib/languagePackCachedDataCleaner.ts index 68d2cc1666151..0c7e517d4bc73 100644 --- a/src/vs/code/node/sharedProcess/contrib/languagePackCachedDataCleaner.ts +++ b/src/vs/code/node/sharedProcess/contrib/languagePackCachedDataCleaner.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IStringDictionary } from 'vs/base/common/collections'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -58,7 +59,7 @@ export class LanguagePackCachedDataCleaner extends Disposable { try { const installed: IStringDictionary = Object.create(null); - const metaData: ILanguagePackFile = JSON.parse(await Promises.readFile(join(this.environmentService.userDataPath, 'languagepacks.json'), 'utf8')); + const metaData: ILanguagePackFile = JSON.parse(await fs.promises.readFile(join(this.environmentService.userDataPath, 'languagepacks.json'), 'utf8')); for (const locale of Object.keys(metaData)) { const entry = metaData[locale]; installed[`${entry.hash}.${locale}`] = true; @@ -93,7 +94,7 @@ export class LanguagePackCachedDataCleaner extends Disposable { } const candidate = join(folder, entry); - const stat = await Promises.stat(candidate); + const stat = await fs.promises.stat(candidate); if (stat.isDirectory() && (now - stat.mtime.getTime()) > this._DataMaxAge) { this.logService.trace(`[language pack cache cleanup]: Removing language pack cache folder: ${join(packEntry, entry)}`); diff --git a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts index 749cfa4e6e657..5ff0da22ae5bb 100644 --- a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts +++ b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts @@ -131,7 +131,7 @@ flakySuite('BackupMainService', () => { environmentService = new EnvironmentMainService(parseArgs(process.argv, OPTIONS), { _serviceBrand: undefined, ...product }); - await Promises.mkdir(backupHome, { recursive: true }); + await fs.promises.mkdir(backupHome, { recursive: true }); configService = new TestConfigurationService(); stateMainService = new InMemoryTestStateMainService(); @@ -584,8 +584,8 @@ flakySuite('BackupMainService', () => { assert.strictEqual(((await service.getDirtyWorkspaces()).length), 0); try { - await Promises.mkdir(path.join(folderBackupPath, Schemas.file), { recursive: true }); - await Promises.mkdir(path.join(workspaceBackupPath, Schemas.untitled), { recursive: true }); + await fs.promises.mkdir(path.join(folderBackupPath, Schemas.file), { recursive: true }); + await fs.promises.mkdir(path.join(workspaceBackupPath, Schemas.untitled), { recursive: true }); } catch (error) { // ignore - folder might exist already } diff --git a/src/vs/platform/diagnostics/node/diagnosticsService.ts b/src/vs/platform/diagnostics/node/diagnosticsService.ts index 26a715bfc19cf..7e0bc1170e0dd 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsService.ts @@ -2,6 +2,8 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + +import * as fs from 'fs'; import * as osLib from 'os'; import { Promises } from 'vs/base/common/async'; import { getNodeType, parse, ParseError } from 'vs/base/common/json'; @@ -178,7 +180,7 @@ export async function collectLaunchConfigs(folder: string): Promise(); const launchConfig = join(folder, '.vscode', 'launch.json'); - const contents = await pfs.readFile(launchConfig); + const contents = await fs.promises.readFile(launchConfig); const errors: ParseError[] = []; const json = parse(contents.toString(), errors); diff --git a/src/vs/platform/environment/node/stdin.ts b/src/vs/platform/environment/node/stdin.ts index 56ab151407d42..b3e71e04493d4 100644 --- a/src/vs/platform/environment/node/stdin.ts +++ b/src/vs/platform/environment/node/stdin.ts @@ -3,10 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { tmpdir } from 'os'; import { Queue } from 'vs/base/common/async'; import { randomPath } from 'vs/base/common/extpath'; -import { Promises } from 'vs/base/node/pfs'; import { resolveTerminalEncoding } from 'vs/base/node/terminalEncoding'; export function hasStdinWithoutTty() { @@ -43,7 +43,7 @@ export async function readFromStdin(targetPath: string, verbose: boolean, onEnd? let [encoding, iconv] = await Promise.all([ resolveTerminalEncoding(verbose), // respect terminal encoding when piping into file import('@vscode/iconv-lite-umd'), // lazy load encoding module for usage - Promises.appendFile(targetPath, '') // make sure file exists right away (https://github.com/microsoft/vscode/issues/155341) + fs.promises.appendFile(targetPath, '') // make sure file exists right away (https://github.com/microsoft/vscode/issues/155341) ]); if (!iconv.encodingExists(encoding)) { @@ -63,7 +63,7 @@ export async function readFromStdin(targetPath: string, verbose: boolean, onEnd? process.stdin.on('data', chunk => { const chunkStr = decoder.write(chunk); - appendFileQueue.queue(() => Promises.appendFile(targetPath, chunkStr)); + appendFileQueue.queue(() => fs.promises.appendFile(targetPath, chunkStr)); }); process.stdin.on('end', () => { @@ -72,7 +72,7 @@ export async function readFromStdin(targetPath: string, verbose: boolean, onEnd? appendFileQueue.queue(async () => { try { if (typeof end === 'string') { - await Promises.appendFile(targetPath, end); + await fs.promises.appendFile(targetPath, end); } } finally { onEnd?.(); diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 29613dba832e1..d877db4d3c936 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { Promises, Queue } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -363,7 +364,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi const collectFilesFromDirectory = async (dir: string): Promise => { let entries = await pfs.Promises.readdir(dir); entries = entries.map(e => path.join(dir, e)); - const stats = await Promise.all(entries.map(e => pfs.Promises.stat(e))); + const stats = await Promise.all(entries.map(e => fs.promises.stat(e))); let promise: Promise = Promise.resolve([]); stats.forEach((stat, index) => { const entry = entries[index]; diff --git a/src/vs/platform/files/node/diskFileSystemProvider.ts b/src/vs/platform/files/node/diskFileSystemProvider.ts index 5e923bdfab51a..9993c5f82ba91 100644 --- a/src/vs/platform/files/node/diskFileSystemProvider.ts +++ b/src/vs/platform/files/node/diskFileSystemProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Stats } from 'fs'; +import { Stats, promises } from 'fs'; import { Barrier, retry } from 'vs/base/common/async'; import { ResourceMap } from 'vs/base/common/map'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -203,7 +203,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple const filePath = this.toFilePath(resource); - return await Promises.readFile(filePath); + return await promises.readFile(filePath); } catch (error) { throw this.toFileSystemProviderError(error); } finally { @@ -354,7 +354,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple try { const { stat } = await SymlinkSupport.stat(filePath); if (!(stat.mode & 0o200 /* File mode indicating writable by owner */)) { - await Promises.chmod(filePath, stat.mode | 0o200); + await promises.chmod(filePath, stat.mode | 0o200); } } catch (error) { if (error.code !== 'ENOENT') { @@ -373,7 +373,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple // by first truncating the file and then writing with r+ flag. This helps to save hidden files on Windows // (see https://github.com/microsoft/vscode/issues/931) and prevent removing alternate data streams // (see https://github.com/microsoft/vscode/issues/6363) - await Promises.truncate(filePath, 0); + await promises.truncate(filePath, 0); // After a successful truncate() the flag can be set to 'r+' which will not truncate. flags = 'r+'; @@ -595,7 +595,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple async mkdir(resource: URI): Promise { try { - await Promises.mkdir(this.toFilePath(resource)); + await promises.mkdir(this.toFilePath(resource)); } catch (error) { throw this.toFileSystemProviderError(error); } @@ -613,7 +613,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple await Promises.rm(filePath, RimRafMode.MOVE, rmMoveToPath); } else { try { - await Promises.unlink(filePath); + await promises.unlink(filePath); } catch (unlinkError) { // `fs.unlink` will throw when used on directories @@ -631,7 +631,7 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple } if (isDirectory) { - await Promises.rmdir(filePath); + await promises.rmdir(filePath); } else { throw unlinkError; } @@ -778,10 +778,10 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple locks.add(await this.createResourceLock(to)); if (mkdir) { - await Promises.mkdir(dirname(toFilePath), { recursive: true }); + await promises.mkdir(dirname(toFilePath), { recursive: true }); } - await Promises.copyFile(fromFilePath, toFilePath); + await promises.copyFile(fromFilePath, toFilePath); } catch (error) { if (error.code === 'ENOENT' && !mkdir) { return this.doCloneFile(from, to, true); diff --git a/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts b/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts index c71f1581cf6b5..eec6a2232c99c 100644 --- a/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts +++ b/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { watch } from 'fs'; +import { watch, promises } from 'fs'; import { RunOnceWorker, ThrottledWorker } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { isEqualOrParent } from 'vs/base/common/extpath'; @@ -82,7 +82,7 @@ export class NodeJSFileWatcherLibrary extends Disposable { return; } - const stat = await Promises.stat(realPath); + const stat = await promises.stat(realPath); if (this.cts.token.isCancellationRequested) { return; diff --git a/src/vs/platform/files/test/node/diskFileService.integrationTest.ts b/src/vs/platform/files/test/node/diskFileService.integrationTest.ts index fc2f28ffa9741..c3c271abbdd8e 100644 --- a/src/vs/platform/files/test/node/diskFileService.integrationTest.ts +++ b/src/vs/platform/files/test/node/diskFileService.integrationTest.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { createReadStream, existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; +import { createReadStream, existsSync, readdirSync, readFileSync, statSync, writeFileSync, promises } from 'fs'; import { tmpdir } from 'os'; import { timeout } from 'vs/base/common/async'; import { bufferToReadable, bufferToStream, streamToBuffer, streamToBufferReadableStream, VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; @@ -429,7 +429,7 @@ flakySuite('Disk File Service', function () { test('resolve - folder symbolic link', async () => { const link = URI.file(join(testDir, 'deep-link')); - await Promises.symlink(join(testDir, 'deep'), link.fsPath, 'junction'); + await promises.symlink(join(testDir, 'deep'), link.fsPath, 'junction'); const resolved = await service.resolve(link); assert.strictEqual(resolved.children!.length, 4); @@ -439,7 +439,7 @@ flakySuite('Disk File Service', function () { (isWindows ? test.skip /* windows: cannot create file symbolic link without elevated context */ : test)('resolve - file symbolic link', async () => { const link = URI.file(join(testDir, 'lorem.txt-linked')); - await Promises.symlink(join(testDir, 'lorem.txt'), link.fsPath); + await promises.symlink(join(testDir, 'lorem.txt'), link.fsPath); const resolved = await service.resolve(link); assert.strictEqual(resolved.isDirectory, false); @@ -447,7 +447,7 @@ flakySuite('Disk File Service', function () { }); test('resolve - symbolic link pointing to nonexistent file does not break', async () => { - await Promises.symlink(join(testDir, 'foo'), join(testDir, 'bar'), 'junction'); + await promises.symlink(join(testDir, 'foo'), join(testDir, 'bar'), 'junction'); const resolved = await service.resolve(URI.file(testDir)); assert.strictEqual(resolved.isDirectory, true); @@ -530,7 +530,7 @@ flakySuite('Disk File Service', function () { (isWindows ? test.skip /* windows: cannot create file symbolic link without elevated context */ : test)('deleteFile - symbolic link (exists)', async () => { const target = URI.file(join(testDir, 'lorem.txt')); const link = URI.file(join(testDir, 'lorem.txt-linked')); - await Promises.symlink(target.fsPath, link.fsPath); + await promises.symlink(target.fsPath, link.fsPath); const source = await service.resolve(link); @@ -552,7 +552,7 @@ flakySuite('Disk File Service', function () { (isWindows ? test.skip /* windows: cannot create file symbolic link without elevated context */ : test)('deleteFile - symbolic link (pointing to nonexistent file)', async () => { const target = URI.file(join(testDir, 'foo')); const link = URI.file(join(testDir, 'bar')); - await Promises.symlink(target.fsPath, link.fsPath); + await promises.symlink(target.fsPath, link.fsPath); let event: FileOperationEvent; disposables.add(service.onDidRunOperation(e => event = e)); @@ -1692,7 +1692,7 @@ flakySuite('Disk File Service', function () { (isWindows ? test.skip /* windows: cannot create file symbolic link without elevated context */ : test)('readFile - dangling symbolic link - https://github.com/microsoft/vscode/issues/116049', async () => { const link = URI.file(join(testDir, 'small.js-link')); - await Promises.symlink(join(testDir, 'small.js'), link.fsPath); + await promises.symlink(join(testDir, 'small.js'), link.fsPath); let error: FileOperationError | undefined = undefined; try { @@ -1833,7 +1833,7 @@ flakySuite('Disk File Service', function () { (isWindows ? test.skip /* windows: cannot create file symbolic link without elevated context */ : test)('writeFile - atomic writing does not break symlinks', async () => { const link = URI.file(join(testDir, 'lorem.txt-linked')); - await Promises.symlink(join(testDir, 'lorem.txt'), link.fsPath); + await promises.symlink(join(testDir, 'lorem.txt'), link.fsPath); const content = 'Updates to the lorem file'; await service.writeFile(link, VSBuffer.fromString(content), { atomic: { postfix: '.vsctmp' } }); @@ -2006,7 +2006,7 @@ flakySuite('Disk File Service', function () { // Here since `close` is not called, all other writes are // waiting on the barrier to release, so doing a readFile // should give us a consistent view of the file contents - assert.strictEqual((await Promises.readFile(resource.fsPath)).toString(), content); + assert.strictEqual((await promises.readFile(resource.fsPath)).toString(), content); } finally { await provider.close(fd); } @@ -2030,10 +2030,10 @@ flakySuite('Disk File Service', function () { try { await provider.write(fd1, 0, VSBuffer.fromString(newContent).buffer, 0, VSBuffer.fromString(newContent).buffer.byteLength); - assert.strictEqual((await Promises.readFile(resource1.fsPath)).toString(), newContent); + assert.strictEqual((await promises.readFile(resource1.fsPath)).toString(), newContent); await provider.write(fd2, 0, VSBuffer.fromString(newContent).buffer, 0, VSBuffer.fromString(newContent).buffer.byteLength); - assert.strictEqual((await Promises.readFile(resource2.fsPath)).toString(), newContent); + assert.strictEqual((await promises.readFile(resource2.fsPath)).toString(), newContent); } finally { await Promise.allSettled([ await provider.close(fd1), @@ -2059,7 +2059,7 @@ flakySuite('Disk File Service', function () { assert.ok(error); // expected because `new-folder` does not exist - await Promises.mkdir(newFolder); + await promises.mkdir(newFolder); const content = readFileSync(URI.file(join(testDir, 'lorem.txt')).fsPath); const newContent = content.toString() + content.toString(); @@ -2069,7 +2069,7 @@ flakySuite('Disk File Service', function () { try { await provider.write(fd, 0, newContentBuffer, 0, newContentBuffer.byteLength); - assert.strictEqual((await Promises.readFile(newResource.fsPath)).toString(), newContent); + assert.strictEqual((await promises.readFile(newResource.fsPath)).toString(), newContent); } finally { await provider.close(fd); } @@ -2291,8 +2291,8 @@ flakySuite('Disk File Service', function () { const content = await service.writeFile(lockedFile, VSBuffer.fromString('Locked File')); assert.strictEqual(content.locked, false); - const stats = await Promises.stat(lockedFile.fsPath); - await Promises.chmod(lockedFile.fsPath, stats.mode & ~0o200); + const stats = await promises.stat(lockedFile.fsPath); + await promises.chmod(lockedFile.fsPath, stats.mode & ~0o200); let stat = await service.stat(lockedFile); assert.strictEqual(stat.locked, true); diff --git a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts index 77b3946042d4e..d47cf0f69fdc4 100644 --- a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import assert from 'assert'; import { tmpdir } from 'os'; import { basename, dirname, join } from 'vs/base/common/path'; @@ -158,7 +159,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // New folder const newFolderPath = join(testDir, 'New Folder'); changeFuture = awaitEvent(watcher, newFolderPath, FileChangeType.ADDED); - await Promises.mkdir(newFolderPath); + await fs.promises.mkdir(newFolderPath); await changeFuture; // Rename file @@ -220,7 +221,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Copy file const copiedFilepath = join(testDir, 'copiedFile.txt'); changeFuture = awaitEvent(watcher, copiedFilepath, FileChangeType.ADDED); - await Promises.copyFile(movedFilepath, copiedFilepath); + await fs.promises.copyFile(movedFilepath, copiedFilepath); await changeFuture; // Copy folder @@ -242,12 +243,12 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete file changeFuture = awaitEvent(watcher, copiedFilepath, FileChangeType.DELETED); - await Promises.unlink(copiedFilepath); + await fs.promises.unlink(copiedFilepath); await changeFuture; // Delete folder changeFuture = awaitEvent(watcher, copiedFolderpath, FileChangeType.DELETED); - await Promises.rmdir(copiedFolderpath); + await fs.promises.rmdir(copiedFolderpath); await changeFuture; watcher.dispose(); @@ -270,7 +271,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete file changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED); - await Promises.unlink(filePath); + await fs.promises.unlink(filePath); await changeFuture; // Recreate watcher @@ -290,7 +291,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete + Recreate file const newFilePath = join(testDir, 'lorem.txt'); const changeFuture: Promise = awaitEvent(watcher, newFilePath, FileChangeType.UPDATED); - await Promises.unlink(newFilePath); + await fs.promises.unlink(newFilePath); Promises.writeFile(newFilePath, 'Hello Atomic World'); await changeFuture; }); @@ -302,7 +303,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete + Recreate file const newFilePath = join(filePath); const changeFuture: Promise = awaitEvent(watcher, newFilePath, FileChangeType.UPDATED); - await Promises.unlink(newFilePath); + await fs.promises.unlink(newFilePath); Promises.writeFile(newFilePath, 'Hello Atomic World'); await changeFuture; }); @@ -363,9 +364,9 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int const deleteFuture3: Promise = awaitEvent(watcher, newFilePath3, FileChangeType.DELETED); await Promise.all([ - await Promises.unlink(newFilePath1), - await Promises.unlink(newFilePath2), - await Promises.unlink(newFilePath3) + await fs.promises.unlink(newFilePath1), + await fs.promises.unlink(newFilePath2), + await fs.promises.unlink(newFilePath3) ]); await Promise.all([deleteFuture1, deleteFuture2, deleteFuture3]); @@ -444,7 +445,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int (isWindows /* windows: cannot create file symbolic link without elevated context */ ? test.skip : test)('symlink support (folder watch)', async function () { const link = join(testDir, 'deep-linked'); const linkTarget = join(testDir, 'deep'); - await Promises.symlink(linkTarget, link); + await fs.promises.symlink(linkTarget, link); await watcher.watch([{ path: link, excludes: [], recursive: false }]); @@ -471,14 +472,14 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete file changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED, correlationId, expectedCount); - await Promises.unlink(await Promises.realpath(filePath)); // support symlinks + await fs.promises.unlink(await Promises.realpath(filePath)); // support symlinks await changeFuture; } (isWindows /* windows: cannot create file symbolic link without elevated context */ ? test.skip : test)('symlink support (file watch)', async function () { const link = join(testDir, 'lorem.txt-linked'); const linkTarget = join(testDir, 'lorem.txt'); - await Promises.symlink(linkTarget, link); + await fs.promises.symlink(linkTarget, link); await watcher.watch([{ path: link, excludes: [], recursive: false }]); @@ -583,7 +584,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int const onDidWatchFail = Event.toPromise(watcher.onWatchFail); const changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED, 1); - Promises.unlink(filePath); + fs.promises.unlink(filePath); await onDidWatchFail; await changeFuture; assert.strictEqual(instance.failed, true); @@ -638,7 +639,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int let changeFuture = awaitEvent(watcher, folderPath, FileChangeType.ADDED, 1); let onDidWatch = Event.toPromise(watcher.onDidWatch); - await Promises.mkdir(folderPath); + await fs.promises.mkdir(folderPath); await changeFuture; await onDidWatch; @@ -649,12 +650,12 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int if (!isMacintosh) { // macOS does not report DELETE events for folders onDidWatchFail = Event.toPromise(watcher.onWatchFail); - await Promises.rmdir(folderPath); + await fs.promises.rmdir(folderPath); await onDidWatchFail; changeFuture = awaitEvent(watcher, folderPath, FileChangeType.ADDED, 1); onDidWatch = Event.toPromise(watcher.onDidWatch); - await Promises.mkdir(folderPath); + await fs.promises.mkdir(folderPath); await changeFuture; await onDidWatch; @@ -677,7 +678,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int const changeFuture = awaitEvent(watcher, folderPath, FileChangeType.ADDED, 1); const onDidWatch = Event.toPromise(watcher.onDidWatch); - await Promises.mkdir(folderPath); + await fs.promises.mkdir(folderPath); await changeFuture; await onDidWatch; @@ -777,7 +778,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete file changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED, 1); - await Promises.unlink(filePath); + await fs.promises.unlink(filePath); await changeFuture; }); @@ -793,7 +794,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // Delete file changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED, 1); - await Promises.unlink(filePath); + await fs.promises.unlink(filePath); await changeFuture; }); }); diff --git a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts index 341edbff2a109..633e403341530 100644 --- a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { realpathSync } from 'fs'; +import { realpathSync, promises } from 'fs'; import { tmpdir } from 'os'; import { timeout } from 'vs/base/common/async'; import { dirname, join } from 'vs/base/common/path'; @@ -220,7 +220,7 @@ export class TestParcelWatcher extends ParcelWatcher { assert.strictEqual(instance.include(newFolderPath), true); assert.strictEqual(instance.exclude(newFolderPath), false); changeFuture = awaitEvent(watcher, newFolderPath, FileChangeType.ADDED); - await Promises.mkdir(newFolderPath); + await promises.mkdir(newFolderPath); await changeFuture; assert.strictEqual(subscriptions1.get(newFolderPath), FileChangeType.ADDED); assert.strictEqual(subscriptions2.has(newFolderPath), false /* subscription was disposed before the event */); @@ -290,7 +290,7 @@ export class TestParcelWatcher extends ParcelWatcher { // Copy file const copiedFilepath = join(testDir, 'deep', 'copiedFile.txt'); changeFuture = awaitEvent(watcher, copiedFilepath, FileChangeType.ADDED); - await Promises.copyFile(movedFilepath, copiedFilepath); + await promises.copyFile(movedFilepath, copiedFilepath); await changeFuture; // Copy folder @@ -312,30 +312,30 @@ export class TestParcelWatcher extends ParcelWatcher { // Read file does not emit event changeFuture = awaitEvent(watcher, anotherNewFilePath, FileChangeType.UPDATED, 'unexpected-event-from-read-file'); - await Promises.readFile(anotherNewFilePath); + await promises.readFile(anotherNewFilePath); await Promise.race([timeout(100), changeFuture]); // Stat file does not emit event changeFuture = awaitEvent(watcher, anotherNewFilePath, FileChangeType.UPDATED, 'unexpected-event-from-stat'); - await Promises.stat(anotherNewFilePath); + await promises.stat(anotherNewFilePath); await Promise.race([timeout(100), changeFuture]); // Stat folder does not emit event changeFuture = awaitEvent(watcher, copiedFolderpath, FileChangeType.UPDATED, 'unexpected-event-from-stat'); - await Promises.stat(copiedFolderpath); + await promises.stat(copiedFolderpath); await Promise.race([timeout(100), changeFuture]); // Delete file changeFuture = awaitEvent(watcher, copiedFilepath, FileChangeType.DELETED); disposables.add(instance.subscribe(copiedFilepath, change => subscriptions1.set(change.resource.fsPath, change.type))); - await Promises.unlink(copiedFilepath); + await promises.unlink(copiedFilepath); await changeFuture; assert.strictEqual(subscriptions1.get(copiedFilepath), FileChangeType.DELETED); // Delete folder changeFuture = awaitEvent(watcher, copiedFolderpath, FileChangeType.DELETED); disposables.add(instance.subscribe(copiedFolderpath, change => subscriptions1.set(change.resource.fsPath, change.type))); - await Promises.rmdir(copiedFolderpath); + await promises.rmdir(copiedFolderpath); await changeFuture; assert.strictEqual(subscriptions1.get(copiedFolderpath), FileChangeType.DELETED); @@ -348,7 +348,7 @@ export class TestParcelWatcher extends ParcelWatcher { // Delete + Recreate file const newFilePath = join(testDir, 'deep', 'conway.js'); const changeFuture = awaitEvent(watcher, newFilePath, FileChangeType.UPDATED); - await Promises.unlink(newFilePath); + await promises.unlink(newFilePath); Promises.writeFile(newFilePath, 'Hello Atomic World'); await changeFuture; }); @@ -373,13 +373,13 @@ export class TestParcelWatcher extends ParcelWatcher { // Delete file changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED, undefined, correlationId, expectedCount); - await Promises.unlink(filePath); + await promises.unlink(filePath); await changeFuture; } test('multiple events', async function () { await watcher.watch([{ path: testDir, excludes: [], recursive: true }]); - await Promises.mkdir(join(testDir, 'deep-multiple')); + await promises.mkdir(join(testDir, 'deep-multiple')); // multiple add @@ -449,12 +449,12 @@ export class TestParcelWatcher extends ParcelWatcher { const deleteFuture6 = awaitEvent(watcher, newFilePath6, FileChangeType.DELETED); await Promise.all([ - await Promises.unlink(newFilePath1), - await Promises.unlink(newFilePath2), - await Promises.unlink(newFilePath3), - await Promises.unlink(newFilePath4), - await Promises.unlink(newFilePath5), - await Promises.unlink(newFilePath6) + await promises.unlink(newFilePath1), + await promises.unlink(newFilePath2), + await promises.unlink(newFilePath3), + await promises.unlink(newFilePath4), + await promises.unlink(newFilePath5), + await promises.unlink(newFilePath6) ]); await Promise.all([deleteFuture1, deleteFuture2, deleteFuture3, deleteFuture4, deleteFuture5, deleteFuture6]); @@ -563,7 +563,7 @@ export class TestParcelWatcher extends ParcelWatcher { (isWindows /* windows: cannot create file symbolic link without elevated context */ ? test.skip : test)('symlink support (root)', async function () { const link = join(testDir, 'deep-linked'); const linkTarget = join(testDir, 'deep'); - await Promises.symlink(linkTarget, link); + await promises.symlink(linkTarget, link); await watcher.watch([{ path: link, excludes: [], recursive: true }]); @@ -573,7 +573,7 @@ export class TestParcelWatcher extends ParcelWatcher { (isWindows /* windows: cannot create file symbolic link without elevated context */ ? test.skip : test)('symlink support (via extra watch)', async function () { const link = join(testDir, 'deep-linked'); const linkTarget = join(testDir, 'deep'); - await Promises.symlink(linkTarget, link); + await promises.symlink(linkTarget, link); await watcher.watch([{ path: testDir, excludes: [], recursive: true }, { path: link, excludes: [], recursive: true }]); @@ -617,7 +617,7 @@ export class TestParcelWatcher extends ParcelWatcher { // Restore watched path await timeout(1500); // node.js watcher used for monitoring folder restore is async - await Promises.mkdir(watchedPath); + await promises.mkdir(watchedPath); await timeout(1500); // restart is delayed await watcher.whenReady(); @@ -776,7 +776,7 @@ export class TestParcelWatcher extends ParcelWatcher { let changeFuture = awaitEvent(watcher, folderPath, FileChangeType.ADDED, undefined, 1); let onDidWatch = Event.toPromise(watcher.onDidWatch); - await Promises.mkdir(folderPath); + await promises.mkdir(folderPath); await changeFuture; await onDidWatch; @@ -791,7 +791,7 @@ export class TestParcelWatcher extends ParcelWatcher { changeFuture = awaitEvent(watcher, folderPath, FileChangeType.ADDED, undefined, 1); onDidWatch = Event.toPromise(watcher.onDidWatch); - await Promises.mkdir(folderPath); + await promises.mkdir(folderPath); await changeFuture; await onDidWatch; @@ -825,7 +825,7 @@ export class TestParcelWatcher extends ParcelWatcher { const changeFuture = awaitEvent(watcher, folderPath, FileChangeType.ADDED, undefined, 1); const onDidWatch = Event.toPromise(watcher.onDidWatch); - await Promises.mkdir(folderPath); + await promises.mkdir(folderPath); await changeFuture; await onDidWatch; @@ -864,7 +864,7 @@ export class TestParcelWatcher extends ParcelWatcher { // Delete file changeFuture = awaitEvent(watcher, filePath, FileChangeType.DELETED, undefined, 1); - await Promises.unlink(filePath); + await promises.unlink(filePath); await changeFuture; }); }); diff --git a/src/vs/platform/languagePacks/node/languagePacks.ts b/src/vs/platform/languagePacks/node/languagePacks.ts index 3a7df771bc2cc..698b9b56de759 100644 --- a/src/vs/platform/languagePacks/node/languagePacks.ts +++ b/src/vs/platform/languagePacks/node/languagePacks.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { createHash } from 'crypto'; import { equals } from 'vs/base/common/arrays'; import { Queue } from 'vs/base/common/async'; @@ -180,7 +181,7 @@ class LanguagePacksCache extends Disposable { private withLanguagePacks(fn: (languagePacks: { [language: string]: ILanguagePack }) => T | null = () => null): Promise { return this.languagePacksFileLimiter.queue(() => { let result: T | null = null; - return Promises.readFile(this.languagePacksFilePath, 'utf8') + return fs.promises.readFile(this.languagePacksFilePath, 'utf8') .then(undefined, err => err.code === 'ENOENT' ? Promise.resolve('{}') : Promise.reject(err)) .then<{ [language: string]: ILanguagePack }>(raw => { try { return JSON.parse(raw); } catch (e) { return {}; } }) .then(languagePacks => { result = fn(languagePacks); return languagePacks; }) diff --git a/src/vs/platform/native/electron-main/nativeHostMainService.ts b/src/vs/platform/native/electron-main/nativeHostMainService.ts index c7c6cf552ae30..2718d0fd7bd3c 100644 --- a/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { exec } from 'child_process'; import { app, BrowserWindow, clipboard, Display, Menu, MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, OpenDialogOptions, OpenDialogReturnValue, powerMonitor, SaveDialogOptions, SaveDialogReturnValue, screen, shell, webContents } from 'electron'; import { arch, cpus, freemem, loadavg, platform, release, totalmem, type } from 'os'; @@ -322,7 +323,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain } // Different source, delete it first - await Promises.unlink(source); + await fs.promises.unlink(source); } catch (error) { if (error.code !== 'ENOENT') { throw error; // throw on any error but file not found @@ -330,7 +331,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain } try { - await Promises.symlink(target, source); + await fs.promises.symlink(target, source); } catch (error) { if (error.code !== 'EACCES' && error.code !== 'ENOENT') { throw error; @@ -362,7 +363,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain const { source } = await this.getShellCommandLink(); try { - await Promises.unlink(source); + await fs.promises.unlink(source); } catch (error) { switch (error.code) { case 'EACCES': { diff --git a/src/vs/platform/remote/node/wsl.ts b/src/vs/platform/remote/node/wsl.ts index 3ba33f74b96c3..4bc71a35f0cd2 100644 --- a/src/vs/platform/remote/node/wsl.ts +++ b/src/vs/platform/remote/node/wsl.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import * as os from 'os'; import * as cp from 'child_process'; -import { Promises } from 'vs/base/node/pfs'; import * as path from 'path'; let hasWSLFeaturePromise: Promise | undefined; @@ -33,7 +33,7 @@ async function testWSLFeatureInstalled(): Promise { const dllPath = getLxssManagerDllPath(); if (dllPath) { try { - if ((await Promises.stat(dllPath)).isFile()) { + if ((await fs.promises.stat(dllPath)).isFile()) { return true; } } catch (e) { diff --git a/src/vs/platform/state/test/node/state.test.ts b/src/vs/platform/state/test/node/state.test.ts index acce49d3e9c6a..4674f20a4ee37 100644 --- a/src/vs/platform/state/test/node/state.test.ts +++ b/src/vs/platform/state/test/node/state.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; -import { readFileSync } from 'fs'; +import { readFileSync, promises } from 'fs'; import { tmpdir } from 'os'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; @@ -37,7 +37,7 @@ flakySuite('StateService', () => { diskFileSystemProvider = disposables.add(new DiskFileSystemProvider(logService)); disposables.add(fileService.registerProvider(Schemas.file, diskFileSystemProvider)); - return Promises.mkdir(testDir, { recursive: true }); + return promises.mkdir(testDir, { recursive: true }); }); teardown(() => { diff --git a/src/vs/platform/storage/electron-main/storageMain.ts b/src/vs/platform/storage/electron-main/storageMain.ts index c110f28015b8c..8d6d1b539d5e1 100644 --- a/src/vs/platform/storage/electron-main/storageMain.ts +++ b/src/vs/platform/storage/electron-main/storageMain.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { top } from 'vs/base/common/arrays'; import { DeferredPromise } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; @@ -403,7 +404,7 @@ export class WorkspaceStorageMain extends BaseStorageMain { } // Ensure storage folder exists - await Promises.mkdir(workspaceStorageFolderPath, { recursive: true }); + await fs.promises.mkdir(workspaceStorageFolderPath, { recursive: true }); // Write metadata into folder (but do not await) this.ensureWorkspaceStorageFolderMeta(workspaceStorageFolderPath); diff --git a/src/vs/platform/telemetry/node/telemetry.ts b/src/vs/platform/telemetry/node/telemetry.ts index 72f87dddf3506..d1770958d3b36 100644 --- a/src/vs/platform/telemetry/node/telemetry.ts +++ b/src/vs/platform/telemetry/node/telemetry.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { join } from 'vs/base/common/path'; import { Promises } from 'vs/base/node/pfs'; @@ -21,7 +22,7 @@ export async function buildTelemetryMessage(appRoot: string, extensionsPath?: st const files = await Promises.readdir(extensionsPath); for (const file of files) { try { - const fileStat = await Promises.stat(join(extensionsPath, file)); + const fileStat = await fs.promises.stat(join(extensionsPath, file)); if (fileStat.isDirectory()) { dirs.push(file); } @@ -39,15 +40,15 @@ export async function buildTelemetryMessage(appRoot: string, extensionsPath?: st } for (const folder of telemetryJsonFolders) { - const contents = (await Promises.readFile(join(extensionsPath, folder, 'telemetry.json'))).toString(); + const contents = (await fs.promises.readFile(join(extensionsPath, folder, 'telemetry.json'))).toString(); mergeTelemetry(contents, folder); } } - let contents = (await Promises.readFile(join(appRoot, 'telemetry-core.json'))).toString(); + let contents = (await fs.promises.readFile(join(appRoot, 'telemetry-core.json'))).toString(); mergeTelemetry(contents, 'vscode-core'); - contents = (await Promises.readFile(join(appRoot, 'telemetry-extensions.json'))).toString(); + contents = (await fs.promises.readFile(join(appRoot, 'telemetry-extensions.json'))).toString(); mergeTelemetry(contents, 'vscode-extensions'); return JSON.stringify(mergedTelemetry, null, 4); diff --git a/src/vs/platform/terminal/node/terminalProcess.ts b/src/vs/platform/terminal/node/terminalProcess.ts index a799870b5484e..2679ea3683afb 100644 --- a/src/vs/platform/terminal/node/terminalProcess.ts +++ b/src/vs/platform/terminal/node/terminalProcess.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { exec } from 'child_process'; import { timeout } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; @@ -10,7 +11,6 @@ import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import * as path from 'vs/base/common/path'; import { IProcessEnvironment, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -import { Promises } from 'vs/base/node/pfs'; import { localize } from 'vs/nls'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -211,9 +211,9 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess } if (injection.filesToCopy) { for (const f of injection.filesToCopy) { - await Promises.mkdir(path.dirname(f.dest), { recursive: true }); + await fs.promises.mkdir(path.dirname(f.dest), { recursive: true }); try { - await Promises.copyFile(f.source, f.dest); + await fs.promises.copyFile(f.source, f.dest); } catch { // Swallow error, this should only happen when multiple users are on the same // machine. Since the shell integration scripts rarely change, plus the other user @@ -241,7 +241,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess private async _validateCwd(): Promise { try { - const result = await Promises.stat(this._initialCwd); + const result = await fs.promises.stat(this._initialCwd); if (!result.isDirectory()) { return { message: localize('launchFail.cwdNotDirectory', "Starting directory (cwd) \"{0}\" is not a directory", this._initialCwd.toString()) }; } @@ -268,7 +268,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess } try { - const result = await Promises.stat(executable); + const result = await fs.promises.stat(executable); if (!result.isFile() && !result.isSymbolicLink()) { return { message: localize('launchFail.executableIsNotFileOrSymlink', "Path to shell executable \"{0}\" is not a file or a symlink", slc.executable) }; } @@ -608,7 +608,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess } this._logService.trace('node-pty.IPty#pid'); try { - return await Promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`); + return await fs.promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`); } catch (error) { return this._initialCwd; } diff --git a/src/vs/platform/terminal/node/terminalProfiles.ts b/src/vs/platform/terminal/node/terminalProfiles.ts index e289fbc34fc06..97a85375c951f 100644 --- a/src/vs/platform/terminal/node/terminalProfiles.ts +++ b/src/vs/platform/terminal/node/terminalProfiles.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import * as cp from 'child_process'; import { Codicon } from 'vs/base/common/codicons'; import { basename, delimiter, normalize } from 'vs/base/common/path'; @@ -38,7 +39,7 @@ export function detectAvailableProfiles( ): Promise { fsProvider = fsProvider || { existsFile: pfs.SymlinkSupport.existsFile, - readFile: pfs.Promises.readFile + readFile: fs.promises.readFile }; if (isWindows) { return detectAvailableWindowsProfiles( diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts index 4c49a758185db..a2561be0c114d 100644 --- a/src/vs/platform/update/electron-main/updateService.win32.ts +++ b/src/vs/platform/update/electron-main/updateService.win32.ts @@ -55,7 +55,7 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun @memoize get cachePath(): Promise { const result = path.join(tmpdir(), `vscode-${this.productService.quality}-${this.productService.target}-${process.arch}`); - return pfs.Promises.mkdir(result, { recursive: true }).then(() => result); + return fs.promises.mkdir(result, { recursive: true }).then(() => result); } constructor( @@ -197,7 +197,7 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun const promises = versions.filter(filter).map(async one => { try { - await pfs.Promises.unlink(path.join(cachePath, one)); + await fs.promises.unlink(path.join(cachePath, one)); } catch (err) { // ignore } diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index 290b3f7a67c5f..070c7ae05d384 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { app, BrowserWindow, WebContents, shell } from 'electron'; -import { Promises } from 'vs/base/node/pfs'; import { addUNCHostToAllowlist } from 'vs/base/node/unc'; import { hostname, release, arch } from 'os'; import { coalesce, distinct } from 'vs/base/common/arrays'; @@ -1057,7 +1057,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic path = sanitizeFilePath(normalize(path), cwd()); try { - const pathStat = await Promises.stat(path); + const pathStat = await fs.promises.stat(path); // File if (pathStat.isFile()) { diff --git a/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts index 236f6d6fc323e..dc232fbda1e63 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { BrowserWindow } from 'electron'; import { Emitter, Event } from 'vs/base/common/event'; import { parse } from 'vs/base/common/json'; @@ -102,7 +103,7 @@ export class WorkspacesManagementMainService extends Disposable implements IWork } resolveLocalWorkspace(uri: URI): Promise { - return this.doResolveLocalWorkspace(uri, path => Promises.readFile(path, 'utf8')); + return this.doResolveLocalWorkspace(uri, path => fs.promises.readFile(path, 'utf8')); } private doResolveLocalWorkspace(uri: URI, contentsFn: (path: string) => string): IResolvedWorkspace | undefined; @@ -169,7 +170,7 @@ export class WorkspacesManagementMainService extends Disposable implements IWork const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders, remoteAuthority); const configPath = workspace.configPath.fsPath; - await Promises.mkdir(dirname(configPath), { recursive: true }); + await fs.promises.mkdir(dirname(configPath), { recursive: true }); await Promises.writeFile(configPath, JSON.stringify(storedWorkspace, null, '\t')); this.untitledWorkspaces.push({ workspace, remoteAuthority }); diff --git a/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts b/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts index 42fd463b9bf4e..553be4fa37cc0 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspaces.test.ts @@ -23,7 +23,7 @@ flakySuite('Workspaces', () => { setup(async () => { testDir = getRandomTestPath(tmpDir, 'vsctests', 'workspacesmanagementmainservice'); - return pfs.Promises.mkdir(testDir, { recursive: true }); + return fs.promises.mkdir(testDir, { recursive: true }); }); teardown(() => { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts index fe5bd2994c80c..92f1ac9f58903 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts @@ -112,7 +112,7 @@ flakySuite('WorkspacesManagementMainService', () => { const fileService = new FileService(logService); service = new WorkspacesManagementMainService(environmentMainService, logService, new UserDataProfilesMainService(new StateService(SaveStrategy.DELAYED, environmentMainService, logService, fileService), new UriIdentityService(fileService), environmentMainService, fileService, logService), new TestBackupMainService(), new TestDialogMainService()); - return pfs.Promises.mkdir(untitledWorkspacesHomePath, { recursive: true }); + return fs.promises.mkdir(untitledWorkspacesHomePath, { recursive: true }); }); teardown(() => { diff --git a/src/vs/server/node/serverConnectionToken.ts b/src/vs/server/node/serverConnectionToken.ts index f976d0e379a45..6a6bdcdb56a57 100644 --- a/src/vs/server/node/serverConnectionToken.ts +++ b/src/vs/server/node/serverConnectionToken.ts @@ -100,7 +100,7 @@ export async function determineServerConnectionToken(args: ServerParsedArgs): Pr // First try to find a connection token try { - const fileContents = await Promises.readFile(storageLocation); + const fileContents = await fs.promises.readFile(storageLocation); const connectionToken = fileContents.toString().replace(/\r?\n$/, ''); if (connectionTokenRegex.test(connectionToken)) { return connectionToken; diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts index d9c27e100c8b3..a8ac6043a511f 100644 --- a/src/vs/server/node/webClientServer.ts +++ b/src/vs/server/node/webClientServer.ts @@ -3,8 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createReadStream } from 'fs'; -import { Promises } from 'vs/base/node/pfs'; +import { createReadStream, promises } from 'fs'; import * as path from 'path'; import * as http from 'http'; import * as url from 'url'; @@ -55,7 +54,7 @@ export const enum CacheControl { */ export async function serveFile(filePath: string, cacheControl: CacheControl, logService: ILogService, req: http.IncomingMessage, res: http.ServerResponse, responseHeaders: Record): Promise { try { - const stat = await Promises.stat(filePath); // throws an error if file doesn't exist + const stat = await promises.stat(filePath); // throws an error if file doesn't exist if (cacheControl === CacheControl.ETAG) { // Check if file modified since @@ -320,7 +319,7 @@ export class WebClientServer { if (!this._environmentService.isBuilt) { try { - const productOverrides = JSON.parse((await Promises.readFile(join(APP_ROOT, 'product.overrides.json'))).toString()); + const productOverrides = JSON.parse((await promises.readFile(join(APP_ROOT, 'product.overrides.json'))).toString()); Object.assign(productConfiguration, productOverrides); } catch (err) {/* Ignore Error */ } } @@ -360,7 +359,7 @@ export class WebClientServer { if (useTestResolver) { const bundledExtensions: { extensionPath: string; packageJSON: IExtensionManifest }[] = []; for (const extensionPath of ['vscode-test-resolver', 'github-authentication']) { - const packageJSON = JSON.parse((await Promises.readFile(FileAccess.asFileUri(`${builtinExtensionsPath}/${extensionPath}/package.json`).fsPath)).toString()); + const packageJSON = JSON.parse((await promises.readFile(FileAccess.asFileUri(`${builtinExtensionsPath}/${extensionPath}/package.json`).fsPath)).toString()); bundledExtensions.push({ extensionPath, packageJSON }); } values['WORKBENCH_BUILTIN_EXTENSIONS'] = asJSON(bundledExtensions); @@ -368,7 +367,7 @@ export class WebClientServer { let data; try { - const workbenchTemplate = (await Promises.readFile(filePath)).toString(); + const workbenchTemplate = (await promises.readFile(filePath)).toString(); data = workbenchTemplate.replace(/\{\{([^}]+)\}\}/g, (_, key) => values[key] ?? 'undefined'); } catch (e) { res.writeHead(404, { 'Content-Type': 'text/plain' }); @@ -437,7 +436,7 @@ export class WebClientServer { */ private async _handleCallback(res: http.ServerResponse): Promise { const filePath = FileAccess.asFileUri('vs/code/browser/workbench/callback.html').fsPath; - const data = (await Promises.readFile(filePath)).toString(); + const data = (await promises.readFile(filePath)).toString(); const cspDirectives = [ 'default-src \'self\';', 'img-src \'self\' https: data: blob:;', diff --git a/src/vs/workbench/api/node/extHostStoragePaths.ts b/src/vs/workbench/api/node/extHostStoragePaths.ts index 8348d9490b292..e259b3b0d6dad 100644 --- a/src/vs/workbench/api/node/extHostStoragePaths.ts +++ b/src/vs/workbench/api/node/extHostStoragePaths.ts @@ -69,14 +69,14 @@ export class ExtensionStoragePaths extends CommonExtensionStoragePaths { async function mkdir(dir: string): Promise { try { - await Promises.stat(dir); + await fs.promises.stat(dir); return; } catch { // doesn't exist, that's OK } try { - await Promises.mkdir(dir, { recursive: true }); + await fs.promises.mkdir(dir, { recursive: true }); } catch { } } @@ -103,7 +103,7 @@ class Lock extends Disposable { this._timer.cancel(); } try { - await Promises.utimes(filename, new Date(), new Date()); + await fs.promises.utimes(filename, new Date(), new Date()); } catch (err) { logService.error(err); logService.info(`Lock '${filename}': Could not update mtime.`); @@ -174,7 +174,7 @@ interface ILockfileContents { async function readLockfileContents(logService: ILogService, filename: string): Promise { let contents: Buffer; try { - contents = await Promises.readFile(filename); + contents = await fs.promises.readFile(filename); } catch (err) { // cannot read the file logService.error(err); @@ -196,7 +196,7 @@ async function readLockfileContents(logService: ILogService, filename: string): async function readmtime(logService: ILogService, filename: string): Promise { let stats: fs.Stats; try { - stats = await Promises.stat(filename); + stats = await fs.promises.stat(filename); } catch (err) { // cannot read the file stats to check if it is stale or not logService.error(err); @@ -279,7 +279,7 @@ async function checkStaleAndTryAcquireLock(logService: ILogService, filename: st async function tryDeleteAndAcquireLock(logService: ILogService, filename: string): Promise { logService.info(`Lock '${filename}': Deleting a stale lock.`); try { - await Promises.unlink(filename); + await fs.promises.unlink(filename); } catch (err) { // cannot delete the file // maybe the file is already deleted diff --git a/src/vs/workbench/api/node/extHostTunnelService.ts b/src/vs/workbench/api/node/extHostTunnelService.ts index 1349880610411..54b831094897d 100644 --- a/src/vs/workbench/api/node/extHostTunnelService.ts +++ b/src/vs/workbench/api/node/extHostTunnelService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { exec } from 'child_process'; import { VSBuffer } from 'vs/base/common/buffer'; import { Emitter } from 'vs/base/common/event'; @@ -243,8 +244,8 @@ export class NodeExtHostTunnelService extends ExtHostTunnelService { let tcp: string = ''; let tcp6: string = ''; try { - tcp = await pfs.Promises.readFile('/proc/net/tcp', 'utf8'); - tcp6 = await pfs.Promises.readFile('/proc/net/tcp6', 'utf8'); + tcp = await fs.promises.readFile('/proc/net/tcp', 'utf8'); + tcp6 = await fs.promises.readFile('/proc/net/tcp6', 'utf8'); } catch (e) { // File reading error. No additional handling needed. } @@ -265,10 +266,10 @@ export class NodeExtHostTunnelService extends ExtHostTunnelService { try { const pid: number = Number(childName); const childUri = resources.joinPath(URI.file('/proc'), childName); - const childStat = await pfs.Promises.stat(childUri.fsPath); + const childStat = await fs.promises.stat(childUri.fsPath); if (childStat.isDirectory() && !isNaN(pid)) { - const cwd = await pfs.Promises.readlink(resources.joinPath(childUri, 'cwd').fsPath); - const cmd = await pfs.Promises.readFile(resources.joinPath(childUri, 'cmdline').fsPath, 'utf8'); + const cwd = await fs.promises.readlink(resources.joinPath(childUri, 'cwd').fsPath); + const cmd = await fs.promises.readFile(resources.joinPath(childUri, 'cmdline').fsPath, 'utf8'); processes.push({ pid, cwd, cmd }); } } catch (e) { diff --git a/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts b/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts index 710fb4da3c430..656f9ec5cabc0 100644 --- a/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts +++ b/src/vs/workbench/contrib/themes/test/node/colorRegistry.releaseTest.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import { Registry } from 'vs/platform/registry/common/platform'; import { IColorRegistry, Extensions, ColorContribution, asCssVariableName } from 'vs/platform/theme/common/colorRegistry'; import { asTextOrError } from 'vs/platform/request/common/request'; @@ -40,7 +41,7 @@ suite('Color Registry', function () { test(`update colors in ${knwonVariablesFileName}`, async function () { const varFilePath = FileAccess.asFileUri(`vs/../../build/lib/stylelint/${knwonVariablesFileName}`).fsPath; - const content = (await pfs.Promises.readFile(varFilePath)).toString(); + const content = (await fs.promises.readFile(varFilePath)).toString(); const variablesInfo = JSON.parse(content); @@ -171,7 +172,7 @@ async function getColorsFromExtension(): Promise<{ [id: string]: string }> { const result: { [id: string]: string } = Object.create(null); for (const folder of extFolders) { try { - const packageJSON = JSON.parse((await pfs.Promises.readFile(path.join(extPath, folder, 'package.json'))).toString()); + const packageJSON = JSON.parse((await fs.promises.readFile(path.join(extPath, folder, 'package.json'))).toString()); const contributes = packageJSON['contributes']; if (contributes) { const colors = contributes['colors']; diff --git a/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts b/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts index 1ef7cb70863f2..909109ade3ab5 100644 --- a/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts +++ b/src/vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as fs from 'fs'; import assert from 'assert'; import * as path from 'vs/base/common/path'; import { SingleModifierChord, ResolvedKeybinding, Keybinding } from 'vs/base/common/keybindings'; @@ -46,7 +47,7 @@ export function assertResolveKeybinding(mapper: IKeyboardMapper, keybinding: Key } export function readRawMapping(file: string): Promise { - return Promises.readFile(FileAccess.asFileUri(`vs/workbench/services/keybinding/test/node/${file}.js`).fsPath).then((buff) => { + return fs.promises.readFile(FileAccess.asFileUri(`vs/workbench/services/keybinding/test/node/${file}.js`).fsPath).then((buff) => { const contents = buff.toString(); const func = new Function('define', contents);// CodeQL [SM01632] This is used in tests and we read the files as JS to avoid slowing down TS compilation let rawMappings: T | null = null; @@ -60,7 +61,7 @@ export function readRawMapping(file: string): Promise { export function assertMapping(writeFileIfDifferent: boolean, mapper: IKeyboardMapper, file: string): Promise { const filePath = path.normalize(FileAccess.asFileUri(`vs/workbench/services/keybinding/test/node/${file}`).fsPath); - return Promises.readFile(filePath).then((buff) => { + return fs.promises.readFile(filePath).then((buff) => { const expected = buff.toString().replace(/\r\n/g, '\n'); const actual = mapper.dumpDebugInfo().replace(/\r\n/g, '\n'); if (actual !== expected && writeFileIfDifferent) { From d3035ba351caee12ad2dc4491254796680d3aa9f Mon Sep 17 00:00:00 2001 From: Robo Date: Mon, 1 Jul 2024 16:26:45 +0900 Subject: [PATCH 572/755] ci: disable cli glibc checks (#219327) --- build/azure-pipelines/cli/cli-compile.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/cli/cli-compile.yml b/build/azure-pipelines/cli/cli-compile.yml index 267682f7f6d07..a70f607ad693a 100644 --- a/build/azure-pipelines/cli/cli-compile.yml +++ b/build/azure-pipelines/cli/cli-compile.yml @@ -78,8 +78,8 @@ steps: fi done < <("$OBJDUMP" -T "$PWD/target/${{ parameters.VSCODE_CLI_TARGET }}/release/code") if [[ "$glibc_version" != "2.17" ]]; then - echo "Error: binary has dependency on GLIBC > 2.17" - exit 1 + echo "Error: binary has dependency on GLIBC > 2.17, found $glibc_version" + #exit 1 fi fi displayName: Compile ${{ parameters.VSCODE_CLI_TARGET }} From ea03089beec1e7e5c4e5417660a4d6252782ef58 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 1 Jul 2024 10:29:54 +0200 Subject: [PATCH 573/755] fixup `ChatRequestNotebookData` (#219331) re https://github.com/microsoft/vscode/issues/218363 --- src/vs/workbench/api/common/extHost.api.impl.ts | 2 +- src/vs/workbench/api/common/extHostChatAgents2.ts | 8 +++----- src/vs/workbench/api/common/extHostTypes.ts | 6 +++--- .../vscode.proposed.chatParticipantPrivate.d.ts | 4 ++-- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 402b55888f4dd..b6b4f5746bb65 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -210,7 +210,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostUriOpeners = rpcProtocol.set(ExtHostContext.ExtHostUriOpeners, new ExtHostUriOpeners(rpcProtocol)); const extHostProfileContentHandlers = rpcProtocol.set(ExtHostContext.ExtHostProfileContentHandlers, new ExtHostProfileContentHandlers(rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostInteractive, new ExtHostInteractive(rpcProtocol, extHostNotebook, extHostDocumentsAndEditors, extHostCommands, extHostLogService)); - const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, extHostDocuments, extHostNotebook)); + const extHostChatAgents2 = rpcProtocol.set(ExtHostContext.ExtHostChatAgents2, new ExtHostChatAgents2(rpcProtocol, extHostLogService, extHostCommands, extHostDocuments)); const extHostChatVariables = rpcProtocol.set(ExtHostContext.ExtHostChatVariables, new ExtHostChatVariables(rpcProtocol)); const extHostLanguageModelTools = rpcProtocol.set(ExtHostContext.ExtHostLanguageModelTools, new ExtHostLanguageModelTools(rpcProtocol)); const extHostAiRelatedInformation = rpcProtocol.set(ExtHostContext.ExtHostAiRelatedInformation, new ExtHostRelatedInformation(rpcProtocol)); diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index a34438f1da150..8b2209b536326 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -21,7 +21,6 @@ import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostChatAgentsShape2, IChatAgentCompletionItem, IChatAgentHistoryEntryDto, IChatProgressDto, IExtensionChatAgentMetadata, IMainContext, MainContext, MainThreadChatAgentsShape2 } from 'vs/workbench/api/common/extHost.protocol'; import { CommandsConverter, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; -import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebook'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { ChatAgentLocation, IChatAgentRequest, IChatAgentResult } from 'vs/workbench/contrib/chat/common/chatAgents'; @@ -266,8 +265,7 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS mainContext: IMainContext, private readonly _logService: ILogService, private readonly _commands: ExtHostCommands, - private readonly _documents: ExtHostDocuments, - private readonly _notebooks: ExtHostNotebookController + private readonly _documents: ExtHostDocuments ) { super(); this._proxy = mainContext.getProxy(MainContext.MainThreadChatAgents2); @@ -323,8 +321,8 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS } else if (request.locationData?.type === ChatAgentLocation.Notebook) { // notebook data - const notebook = this._notebooks.getNotebookDocument(request.locationData.sessionInputUri); - location2 = new extHostTypes.ChatRequestNotebookData(notebook.apiNotebook); + const cell = this._documents.getDocument(request.locationData.sessionInputUri); + location2 = new extHostTypes.ChatRequestNotebookData(cell); } else if (request.locationData?.type === ChatAgentLocation.Terminal) { // TBD diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 4189c61331fae..92b968e001ee3 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4449,7 +4449,7 @@ export enum ChatLocation { Editor = 4, } -export class ChatRequestEditorData { +export class ChatRequestEditorData implements vscode.ChatRequestEditorData { constructor( readonly document: vscode.TextDocument, readonly selection: vscode.Selection, @@ -4457,9 +4457,9 @@ export class ChatRequestEditorData { ) { } } -export class ChatRequestNotebookData { +export class ChatRequestNotebookData implements vscode.ChatRequestNotebookData { constructor( - readonly notebook: vscode.NotebookDocument + readonly cell: vscode.TextDocument ) { } } diff --git a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts index d3c0ca44e261f..ce699b1fec9c8 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts @@ -40,9 +40,9 @@ declare module 'vscode' { export class ChatRequestNotebookData { //TODO@API should be the editor - notebook: NotebookDocument; + readonly cell: TextDocument; - constructor(notebook: NotebookDocument); + constructor(cell: TextDocument); } export interface ChatRequest { From d65fd5ba2e7202cac14316c2935680222e1af9cb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2024 11:44:19 +0200 Subject: [PATCH 574/755] nls follow up debt work (#219265) --- build/gulpfile.editor.js | 1 + build/gulpfile.reh.js | 12 +---- build/gulpfile.vscode.js | 10 ++-- build/gulpfile.vscode.web.js | 1 + src/bootstrap-amd.js | 4 +- src/main.js | 15 ++---- src/vs/base/node/nls.js | 47 ++++--------------- .../localization.contribution.ts | 2 +- 8 files changed, 22 insertions(+), 70 deletions(-) diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index b585fa665c16e..fe29d4fe1834a 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -84,6 +84,7 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => { }); // Disable mangling for the editor, as it complicates debugging & quite a few users rely on private/protected fields. +// Disable NLS task to remove english strings to preserve backwards compatibility when we removed the `vs/nls!` AMD plugin. const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true, { disableMangle: true, preserveEnglish: true })); const optimizeEditorAMDTask = task.define('optimize-editor-amd', optimize.optimizeTask( diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index c6e8699d5bd6a..b6030c6102e97 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -52,18 +52,9 @@ const BUILD_TARGETS = [ const serverResources = [ - // Bootstrap - 'out-build/bootstrap.js', - 'out-build/bootstrap-fork.js', - 'out-build/bootstrap-amd.js', - 'out-build/bootstrap-node.js', - // NLS 'out-build/nls.messages.json', - // Performance - 'out-build/vs/base/common/performance.js', - // Process monitor 'out-build/vs/base/node/cpuUsage.sh', 'out-build/vs/base/node/ps.sh', @@ -427,7 +418,8 @@ function tweakProductForServerWeb(product) { src: 'out-build', entryPoints: [ 'out-build/server-main.js', - 'out-build/server-cli.js' + 'out-build/server-cli.js', + 'out-build/bootstrap-fork.js', ], platform: 'node', external: [ diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index b2967504fc5a0..5861cb5067ac0 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -51,18 +51,12 @@ const vscodeEntryPoints = [ ].flat(); const vscodeResources = [ - 'out-build/bootstrap.js', - 'out-build/bootstrap-fork.js', - 'out-build/bootstrap-amd.js', - 'out-build/bootstrap-node.js', - 'out-build/bootstrap-window.js', 'out-build/nls.messages.json', 'out-build/nls.keys.json', 'out-build/vs/**/*.{svg,png,html,jpg,mp3}', '!out-build/vs/code/browser/**/*.html', '!out-build/vs/code/**/*-dev.html', '!out-build/vs/editor/standalone/**/*.svg', - 'out-build/vs/base/common/performance.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', 'out-build/vs/base/browser/ui/codicons/codicon/**', 'out-build/vs/base/parts/sandbox/electron-sandbox/preload.js', @@ -111,12 +105,14 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( src: 'out-build', entryPoints: [ 'out-build/main.js', - 'out-build/cli.js' + 'out-build/cli.js', + 'out-build/bootstrap-fork.js', ], platform: 'node', external: [ 'electron', 'minimist', + 'original-fs', // TODO: we cannot inline `product.json` because // it is being changed during build time at a later // point in time (such as `checksums`) diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 8fb431e94f9a8..4480f5e1046e7 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -31,6 +31,7 @@ const quality = product.quality; const version = (quality && quality !== 'stable') ? `${packageJson.version}-${quality}` : packageJson.version; const vscodeWebResourceIncludes = [ + // Workbench 'out-build/vs/{base,platform,editor,workbench}/**/*.{svg,png,jpg,mp3}', 'out-build/vs/code/browser/workbench/*.html', diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 87fea16e97ab9..aba8ee48fb696 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -73,7 +73,7 @@ function setupNLS() { * @returns {Promise} */ async function doSetupNLS() { - performance.mark('code/fork/willLoadNls'); + performance.mark('code/amd/willLoadNls'); /** @type {INLSConfiguration | undefined} */ let nlsConfig = undefined; @@ -130,7 +130,7 @@ async function doSetupNLS() { } } - performance.mark('code/fork/didLoadNls'); + performance.mark('code/amd/didLoadNls'); return nlsConfig; } diff --git a/src/main.js b/src/main.js index 795d8a31729dd..a0b8f09fff33c 100644 --- a/src/main.js +++ b/src/main.js @@ -16,7 +16,7 @@ const perf = require('./vs/base/common/performance'); perf.mark('code/didStartMain'); const path = require('path'); -const fs = require('fs'); +const fs = require('original-fs'); const os = require('os'); const bootstrap = require('./bootstrap'); const bootstrapNode = require('./bootstrap-node'); @@ -215,6 +215,7 @@ function configureCommandlineSwitchesSync(cliArgs) { ]; if (process.platform === 'linux') { + // Force enable screen readers on Linux via this flag SUPPORTED_ELECTRON_SWITCHES.push('force-renderer-accessibility'); @@ -589,16 +590,6 @@ function getCodeCachePath() { return path.join(userDataPath, 'CachedData', commit); } -/** - * @param {string} dir - * @returns {Promise} - */ -function mkdirp(dir) { - return new Promise((resolve, reject) => { - fs.mkdir(dir, { recursive: true }, err => (err && err.code !== 'EEXIST') ? reject(err) : resolve(dir)); - }); -} - /** * @param {string | undefined} dir * @returns {Promise} @@ -606,7 +597,7 @@ function mkdirp(dir) { async function mkdirpIgnoreError(dir) { if (typeof dir === 'string') { try { - await mkdirp(dir); + await fs.promises.mkdir(dir, { recursive: true }); return dir; } catch (error) { diff --git a/src/vs/base/node/nls.js b/src/vs/base/node/nls.js index d4bac146516a2..c171eb6542e31 100644 --- a/src/vs/base/node/nls.js +++ b/src/vs/base/node/nls.js @@ -45,35 +45,6 @@ return fs.promises.utimes(path, date, date); } - /** - * @param {string} path - */ - function mkdirp(path) { - return fs.promises.mkdir(path, { recursive: true }); - } - - /** - * @param {string} path - */ - function rimraf(path) { - return fs.promises.rm(path, { recursive: true, force: true, maxRetries: 3 }); - } - - /** - * @param {string} path - */ - function readFile(path) { - return fs.promises.readFile(path, 'utf-8'); - } - - /** - * @param {string} path - * @param {string} content - */ - function writeFile(path, content) { - return fs.promises.writeFile(path, content, 'utf-8'); - } - //#endregion /** @@ -90,7 +61,7 @@ async function getLanguagePackConfigurations(userDataPath) { const configFile = path.join(userDataPath, 'languagepacks.json'); try { - return JSON.parse(await readFile(configFile)); + return JSON.parse(await fs.promises.readFile(configFile, 'utf-8')); } catch (err) { return undefined; // Do nothing. If we can't read the file we have no language pack config. } @@ -152,7 +123,7 @@ if ( process.env['VSCODE_DEV'] || userLocale === 'pseudo' || - userLocale === 'en' || userLocale === 'en-us' || + userLocale.startsWith('en') || !commit || !userDataPath ) { @@ -190,7 +161,7 @@ const languagePackCorruptMarkerFile = path.join(globalLanguagePackCachePath, 'corrupted.info'); if (await exists(languagePackCorruptMarkerFile)) { - await rimraf(globalLanguagePackCachePath); // delete corrupted cache folder + await fs.promises.rm(globalLanguagePackCachePath, { recursive: true, force: true, maxRetries: 3 }); // delete corrupted cache folder } /** @type {INLSConfiguration} */ @@ -230,10 +201,10 @@ nlsDefaultMessages, nlsPackdata ] = await Promise.all([ - mkdirp(commitLanguagePackCachePath), - JSON.parse(await readFile(path.join(nlsMetadataPath, 'nls.keys.json'))), - JSON.parse(await readFile(path.join(nlsMetadataPath, 'nls.messages.json'))), - JSON.parse(await readFile(mainLanguagePackPath)) + fs.promises.mkdir(commitLanguagePackCachePath, { recursive: true }), + JSON.parse(await fs.promises.readFile(path.join(nlsMetadataPath, 'nls.keys.json'), 'utf-8')), + JSON.parse(await fs.promises.readFile(path.join(nlsMetadataPath, 'nls.messages.json'), 'utf-8')), + JSON.parse(await fs.promises.readFile(mainLanguagePackPath, 'utf-8')) ]); /** @type {string[]} */ @@ -254,8 +225,8 @@ } await Promise.all([ - writeFile(languagePackMessagesFile, JSON.stringify(nlsResult)), - writeFile(translationsConfigFile, JSON.stringify(languagePack.translations)) + fs.promises.writeFile(languagePackMessagesFile, JSON.stringify(nlsResult), 'utf-8'), + fs.promises.writeFile(translationsConfigFile, JSON.stringify(languagePack.translations), 'utf-8') ]); perf.mark('code/didGenerateNls'); diff --git a/src/vs/workbench/contrib/localization/electron-sandbox/localization.contribution.ts b/src/vs/workbench/contrib/localization/electron-sandbox/localization.contribution.ts index b603ed444e619..a93fc9f990105 100644 --- a/src/vs/workbench/contrib/localization/electron-sandbox/localization.contribution.ts +++ b/src/vs/workbench/contrib/localization/electron-sandbox/localization.contribution.ts @@ -103,7 +103,7 @@ class NativeLocalizationWorkbenchContribution extends BaseLocalizationWorkbenchC if (!this.galleryService.isEnabled()) { return; } - if (!language || !locale || locale === 'en' || locale.indexOf('en-') === 0) { + if (!language || !locale || platform.Language.isDefaultVariant()) { return; } if (locale.startsWith(language) || languagePackSuggestionIgnoreList.includes(locale)) { From 4c69ceba2f9d9dc6b679eeb7b1e4cf22fcb4aca3 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 1 Jul 2024 12:13:03 +0200 Subject: [PATCH 575/755] rename editor.collapsedText to foldPlaceholderForeground (#219338) rename vscode-editor-collapsedText --- build/lib/stylelint/vscode-known-variables.json | 2 +- src/vs/editor/contrib/folding/browser/folding.css | 2 +- src/vs/editor/contrib/folding/browser/foldingDecorations.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json index 272347c6c9915..148aa2786ddbb 100644 --- a/build/lib/stylelint/vscode-known-variables.json +++ b/build/lib/stylelint/vscode-known-variables.json @@ -128,7 +128,6 @@ "--vscode-dropdown-foreground", "--vscode-dropdown-listBackground", "--vscode-editor-background", - "--vscode-editor-collapsedText", "--vscode-editor-findMatchBackground", "--vscode-editor-findMatchBorder", "--vscode-editor-findMatchForeground", @@ -139,6 +138,7 @@ "--vscode-editor-findRangeHighlightBorder", "--vscode-editor-focusedStackFrameHighlightBackground", "--vscode-editor-foldBackground", + "--vscode-editor-foldPlaceholderForeground", "--vscode-editor-foreground", "--vscode-editor-hoverHighlightBackground", "--vscode-editor-inactiveSelectionBackground", diff --git a/src/vs/editor/contrib/folding/browser/folding.css b/src/vs/editor/contrib/folding/browser/folding.css index 9a7c91ced43ce..5f7ab05db78bb 100644 --- a/src/vs/editor/contrib/folding/browser/folding.css +++ b/src/vs/editor/contrib/folding/browser/folding.css @@ -31,7 +31,7 @@ } .monaco-editor .inline-folded:after { - color: var(--vscode-editor-collapsedText); + color: var(--vscode-editor-foldPlaceholderForeground); margin: 0.1em 0.2em 0 0.2em; content: "\22EF"; /* ellipses unicode character */ display: inline; diff --git a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts index d30d019ca98a4..2350f9aad343f 100644 --- a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts +++ b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts @@ -15,7 +15,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { ThemeIcon } from 'vs/base/common/themables'; const foldBackground = registerColor('editor.foldBackground', { light: transparent(editorSelectionBackground, 0.3), dark: transparent(editorSelectionBackground, 0.3), hcDark: null, hcLight: null }, localize('foldBackgroundBackground', "Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."), true); -registerColor('editor.collapsedText', { light: '#808080', dark: '#808080', hcDark: null, hcLight: null }, localize('collapsedTextColor', "Color of the collapsed text after the first line of a folded range.")); +registerColor('editor.foldPlaceholderForeground', { light: '#808080', dark: '#808080', hcDark: null, hcLight: null }, localize('collapsedTextColor', "Color of the collapsed text after the first line of a folded range.")); registerColor('editorGutter.foldingControlForeground', iconForeground, localize('editorGutter.foldingControlForeground', 'Color of the folding control in the editor gutter.')); export const foldingExpandedIcon = registerIcon('folding-expanded', Codicon.chevronDown, localize('foldingExpandedIcon', 'Icon for expanded ranges in the editor glyph margin.')); From af5cf640d81fd44b2ec16a5b0bf6d2939a1eb4be Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2024 12:23:41 +0200 Subject: [PATCH 576/755] :up: `"@playwright/test": "^1.45.0"` (#219324) --- .../common/installPlaywright.ts | 14 ---- package.json | 4 +- .../clipboard/browser/clipboardService.ts | 16 +++-- test/automation/src/playwrightDriver.ts | 2 +- yarn.lock | 65 ++++++++----------- 5 files changed, 42 insertions(+), 59 deletions(-) delete mode 100644 build/azure-pipelines/common/installPlaywright.ts diff --git a/build/azure-pipelines/common/installPlaywright.ts b/build/azure-pipelines/common/installPlaywright.ts deleted file mode 100644 index 742b6e0e399c9..0000000000000 --- a/build/azure-pipelines/common/installPlaywright.ts +++ /dev/null @@ -1,14 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -process.env.DEBUG='pw:install'; // enable logging for this (https://github.com/microsoft/playwright/issues/17394) - -const { installDefaultBrowsersForNpmInstall } = require('playwright-core/lib/server'); - -async function install() { - await installDefaultBrowsersForNpmInstall(); -} - -install(); diff --git a/package.json b/package.json index e8e6a3d2e3413..8e5b8e35bed45 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "watch-cli": "node --max-old-space-size=4095 ./node_modules/gulp/bin/gulp.js watch-cli", "eslint": "node build/eslint", "stylelint": "node build/stylelint", - "playwright-install": "node build/azure-pipelines/common/installPlaywright.js", + "playwright-install": "yarn playwright install", "compile-build": "node --max-old-space-size=4095 ./node_modules/gulp/bin/gulp.js compile-build", "compile-extensions-build": "node --max-old-space-size=4095 ./node_modules/gulp/bin/gulp.js compile-extensions-build", "minify-vscode": "node --max-old-space-size=4095 ./node_modules/gulp/bin/gulp.js minify-vscode", @@ -108,7 +108,7 @@ "yazl": "^2.4.3" }, "devDependencies": { - "@playwright/test": "^1.40.1", + "@playwright/test": "^1.45.0", "@swc/core": "1.3.62", "@types/cookie": "^0.3.3", "@types/debug": "^4.1.5", diff --git a/src/vs/workbench/services/clipboard/browser/clipboardService.ts b/src/vs/workbench/services/clipboard/browser/clipboardService.ts index fc2b1b582e680..1c1472d0cc1f2 100644 --- a/src/vs/workbench/services/clipboard/browser/clipboardService.ts +++ b/src/vs/workbench/services/clipboard/browser/clipboardService.ts @@ -28,7 +28,19 @@ export class BrowserClipboardService extends BaseBrowserClipboardService { super(layoutService, logService); } + override async writeText(text: string, type?: string): Promise { + if (!!this.environmentService.extensionTestsLocationURI && typeof type !== 'string') { + type = 'vscode-tests'; // force in-memory clipboard for tests to avoid permission issues + } + + return super.writeText(text, type); + } + override async readText(type?: string): Promise { + if (!!this.environmentService.extensionTestsLocationURI && typeof type !== 'string') { + type = 'vscode-tests'; // force in-memory clipboard for tests to avoid permission issues + } + if (type) { return super.readText(type); } @@ -36,10 +48,6 @@ export class BrowserClipboardService extends BaseBrowserClipboardService { try { return await getActiveWindow().navigator.clipboard.readText(); } catch (error) { - if (!!this.environmentService.extensionTestsLocationURI) { - return ''; // do not ask for input in tests (https://github.com/microsoft/vscode/issues/112264) - } - return new Promise(resolve => { // Inform user about permissions problem (https://github.com/microsoft/vscode/issues/112089) diff --git a/test/automation/src/playwrightDriver.ts b/test/automation/src/playwrightDriver.ts index 5e77d55e6bf01..0aeb50e219452 100644 --- a/test/automation/src/playwrightDriver.ts +++ b/test/automation/src/playwrightDriver.ts @@ -231,7 +231,7 @@ export class PlaywrightDriver { return this.page.evaluate(([driver]) => driver.getLogs(), [await this.getDriverHandle()] as const); } - private async evaluateWithDriver(pageFunction: PageFunction[], T>) { + private async evaluateWithDriver(pageFunction: PageFunction) { return this.page.evaluate(pageFunction, [await this.getDriverHandle()]); } diff --git a/yarn.lock b/yarn.lock index 71aef4295fa3a..c445f43d99563 100644 --- a/yarn.lock +++ b/yarn.lock @@ -909,12 +909,12 @@ dependencies: playwright-core "1.40.1" -"@playwright/test@^1.40.1": - version "1.40.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.40.1.tgz#9e66322d97b1d74b9f8718bacab15080f24cde65" - integrity sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw== +"@playwright/test@^1.45.0": + version "1.45.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.45.0.tgz#790a66165a46466c0d7099dd260881802f5aba7e" + integrity sha512-TVYsfMlGAaxeUllNkywbwek67Ncf8FRGn8ZlRdO291OL3NjG9oMbfVhyP82HQF0CZLMrYsvesqoUekxdWuF9Qw== dependencies: - playwright "1.40.1" + playwright "1.45.0" "@sindresorhus/is@^4.0.0": version "4.6.0" @@ -7930,12 +7930,17 @@ playwright-core@1.40.1: resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.40.1.tgz#442d15e86866a87d90d07af528e0afabe4c75c05" integrity sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ== -playwright@1.40.1, playwright@^1.40.1: - version "1.40.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.40.1.tgz#a11bf8dca15be5a194851dbbf3df235b9f53d7ae" - integrity sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw== +playwright-core@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.45.0.tgz#5741a670b7c9060ce06852c0051d84736fb94edc" + integrity sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ== + +playwright@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.45.0.tgz#400c709c64438690f13705cb9c88ef93089c5c27" + integrity sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA== dependencies: - playwright-core "1.40.1" + playwright-core "1.45.0" optionalDependencies: fsevents "2.3.2" @@ -7946,6 +7951,15 @@ playwright@^1.29.2: dependencies: playwright-core "1.30.0" +playwright@^1.40.1: + version "1.40.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.40.1.tgz#a11bf8dca15be5a194851dbbf3df235b9f53d7ae" + integrity sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw== + dependencies: + playwright-core "1.40.1" + optionalDependencies: + fsevents "2.3.2" + plist@^3.0.1: version "3.0.5" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" @@ -9326,7 +9340,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9370,15 +9384,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9432,7 +9437,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9467,13 +9472,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10629,7 +10627,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10664,15 +10662,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From b213c86284a421af473651f5ff95ac508e0e1999 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 1 Jul 2024 15:58:39 +0200 Subject: [PATCH 577/755] Extracts hot reload utilities, makes placeholderText contribution hot reloadable --- src/vs/base/common/hotReloadHelpers.ts | 30 +++++++++ .../widget/diffEditor/diffEditorViewModel.ts | 3 +- .../widget/diffEditor/diffEditorWidget.ts | 3 +- .../editor/browser/widget/diffEditor/utils.ts | 26 +------- .../multiDiffEditor/multiDiffEditorWidget.ts | 2 +- .../browser/inlineEditsController.ts | 2 +- .../inlineEdits/browser/inlineEditsWidget.ts | 2 +- .../browser/placeholderText.contribution.ts | 63 ++----------------- .../browser/placeholderTextContribution.ts | 62 ++++++++++++++++++ .../common/wrapInReloadableClass.ts} | 6 +- .../accessibilitySignal.contribution.ts | 2 +- 11 files changed, 107 insertions(+), 94 deletions(-) create mode 100644 src/vs/base/common/hotReloadHelpers.ts create mode 100644 src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts rename src/vs/{workbench/contrib/accessibilitySignals/browser/reloadableWorkbenchContribution.ts => platform/observable/common/wrapInReloadableClass.ts} (93%) diff --git a/src/vs/base/common/hotReloadHelpers.ts b/src/vs/base/common/hotReloadHelpers.ts new file mode 100644 index 0000000000000..174b1adcbcda2 --- /dev/null +++ b/src/vs/base/common/hotReloadHelpers.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { isHotReloadEnabled, registerHotReloadHandler } from 'vs/base/common/hotReload'; +import { IReader, observableSignalFromEvent } from 'vs/base/common/observable'; + +export function readHotReloadableExport(value: T, reader: IReader | undefined): T { + observeHotReloadableExports([value], reader); + return value; +} + +export function observeHotReloadableExports(values: any[], reader: IReader | undefined): void { + if (isHotReloadEnabled()) { + const o = observableSignalFromEvent( + 'reload', + event => registerHotReloadHandler(({ oldExports }) => { + if (![...Object.values(oldExports)].some(v => values.includes(v))) { + return undefined; + } + return (_newExports) => { + event(undefined); + return true; + }; + }) + ); + o.read(reader); + } +} diff --git a/src/vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts b/src/vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts index b1520c8821f0c..67f8505cc28d9 100644 --- a/src/vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts +++ b/src/vs/editor/browser/widget/diffEditor/diffEditorViewModel.ts @@ -8,7 +8,8 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IObservable, IReader, ISettableObservable, ITransaction, autorun, autorunWithStore, derived, observableSignal, observableSignalFromEvent, observableValue, transaction, waitForState } from 'vs/base/common/observable'; import { IDiffProviderFactoryService } from 'vs/editor/browser/widget/diffEditor/diffProviderFactoryService'; -import { filterWithPrevious, readHotReloadableExport } from 'vs/editor/browser/widget/diffEditor/utils'; +import { filterWithPrevious } from 'vs/editor/browser/widget/diffEditor/utils'; +import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; import { ISerializedLineRange, LineRange, LineRangeSet } from 'vs/editor/common/core/lineRange'; import { DefaultLinesDiffComputer } from 'vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer'; import { IDocumentDiff } from 'vs/editor/common/diff/documentDiffProvider'; diff --git a/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts index 29942806d0c90..9c23977877319 100644 --- a/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditor/diffEditorWidget.ts @@ -26,7 +26,8 @@ import { HideUnchangedRegionsFeature } from 'vs/editor/browser/widget/diffEditor import { MovedBlocksLinesFeature } from 'vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature'; import { OverviewRulerFeature } from 'vs/editor/browser/widget/diffEditor/features/overviewRulerFeature'; import { RevertButtonsFeature } from 'vs/editor/browser/widget/diffEditor/features/revertButtonsFeature'; -import { CSSStyle, ObservableElementSizeObserver, applyStyle, applyViewZones, readHotReloadableExport, translatePosition } from 'vs/editor/browser/widget/diffEditor/utils'; +import { CSSStyle, ObservableElementSizeObserver, applyStyle, applyViewZones, translatePosition } from 'vs/editor/browser/widget/diffEditor/utils'; +import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; import { bindContextKey } from 'vs/platform/observable/common/platformObservableUtils'; import { IDiffEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IDimension } from 'vs/editor/common/core/dimension'; diff --git a/src/vs/editor/browser/widget/diffEditor/utils.ts b/src/vs/editor/browser/widget/diffEditor/utils.ts index 99d9580c94a7e..1e6d5eee42878 100644 --- a/src/vs/editor/browser/widget/diffEditor/utils.ts +++ b/src/vs/editor/browser/widget/diffEditor/utils.ts @@ -6,9 +6,8 @@ import { IDimension } from 'vs/base/browser/dom'; import { findLast } from 'vs/base/common/arraysFind'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; -import { isHotReloadEnabled, registerHotReloadHandler } from 'vs/base/common/hotReload'; import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IObservable, IReader, ISettableObservable, autorun, autorunHandleChanges, autorunOpts, autorunWithStore, observableSignalFromEvent, observableValue, transaction } from 'vs/base/common/observable'; +import { IObservable, ISettableObservable, autorun, autorunHandleChanges, autorunOpts, autorunWithStore, observableValue, transaction } from 'vs/base/common/observable'; import { ElementSizeObserver } from 'vs/editor/browser/config/elementSizeObserver'; import { ICodeEditor, IOverlayWidget, IViewZone } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; @@ -298,29 +297,6 @@ export function applyStyle(domNode: HTMLElement, style: Partial<{ [TKey in keyof }); } -export function readHotReloadableExport(value: T, reader: IReader | undefined): T { - observeHotReloadableExports([value], reader); - return value; -} - -export function observeHotReloadableExports(values: any[], reader: IReader | undefined): void { - if (isHotReloadEnabled()) { - const o = observableSignalFromEvent( - 'reload', - event => registerHotReloadHandler(({ oldExports }) => { - if (![...Object.values(oldExports)].some(v => values.includes(v))) { - return undefined; - } - return (_newExports) => { - event(undefined); - return true; - }; - }) - ); - o.read(reader); - } -} - export function applyViewZones(editor: ICodeEditor, viewZones: IObservable, setIsUpdating?: (isUpdatingViewZones: boolean) => void, zoneIds?: Set): IDisposable { const store = new DisposableStore(); const lastViewZoneIds: string[] = []; diff --git a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts index 496b002489b50..9d8ace1ea5ba5 100644 --- a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts +++ b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts @@ -6,7 +6,7 @@ import { Dimension } from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { derived, derivedWithStore, observableValue, recomputeInitiallyAndOnChange } from 'vs/base/common/observable'; -import { readHotReloadableExport } from 'vs/editor/browser/widget/diffEditor/utils'; +import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; import { IMultiDiffEditorModel } from 'vs/editor/browser/widget/multiDiffEditor/model'; import { IMultiDiffEditorViewState, IMultiDiffResourceId, MultiDiffEditorWidgetImpl } from 'vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl'; import { MultiDiffEditorViewModel } from './multiDiffEditorViewModel'; diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts index 5d0afd8ca0efe..9055ec5671932 100644 --- a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsController.ts @@ -8,7 +8,7 @@ import { derived, derivedObservableWithCache, IReader, ISettableObservable, obse import { derivedDisposable, derivedWithSetter } from 'vs/base/common/observableInternal/derived'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; -import { readHotReloadableExport } from 'vs/editor/browser/widget/diffEditor/utils'; +import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; import { Selection } from 'vs/editor/common/core/selection'; import { ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; diff --git a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts index 0a1498915d481..331520cffe0b9 100644 --- a/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts +++ b/src/vs/editor/contrib/inlineEdits/browser/inlineEditsWidget.ts @@ -22,7 +22,7 @@ import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry' import { IModelDeltaDecoration } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; -import { PlaceholderTextContribution } from 'vs/editor/contrib/placeholderText/browser/placeholderText.contribution'; +import { PlaceholderTextContribution } from '../../placeholderText/browser/placeholderTextContribution'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { MenuId } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts index 33c069c44851c..1c54ca29a2de1 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts @@ -3,69 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { structuralEquals } from 'vs/base/common/equals'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { derived, derivedOpts } from 'vs/base/common/observable'; import 'vs/css!./placeholderText'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; -import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { ghostTextForeground } from 'vs/editor/common/core/editorColorRegistry'; -import { Range } from 'vs/editor/common/core/range'; -import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { IModelDeltaDecoration, InjectedTextCursorStops } from 'vs/editor/common/model'; import { localize } from 'vs/nls'; import { registerColor } from 'vs/platform/theme/common/colorUtils'; +import { PlaceholderTextContribution } from './placeholderTextContribution'; +import { wrapInReloadableClass } from 'vs/platform/observable/common/wrapInReloadableClass'; -/** - * Use the editor option to set the placeholder text. -*/ -export class PlaceholderTextContribution extends Disposable implements IEditorContribution { - public static get(editor: ICodeEditor): PlaceholderTextContribution { - return editor.getContribution(PlaceholderTextContribution.ID)!; - } +registerEditorContribution(PlaceholderTextContribution.ID, wrapInReloadableClass(() => PlaceholderTextContribution), EditorContributionInstantiation.Eager); - public static readonly ID = 'editor.contrib.placeholderText'; - private readonly _editorObs = observableCodeEditor(this._editor); - - private readonly _placeholderText = this._editorObs.getOption(EditorOption.placeholder); - - private readonly _decorationOptions = derivedOpts<{ placeholder: string } | undefined>({ owner: this, equalsFn: structuralEquals }, reader => { - const p = this._placeholderText.read(reader); - if (!p) { return undefined; } - if (!this._editorObs.valueIsEmpty.read(reader)) { return undefined; } - - return { placeholder: p }; - }); - - private readonly _decorations = derived(this, (reader) => { - const options = this._decorationOptions.read(reader); - if (!options) { return []; } - - return [{ - range: new Range(1, 1, 1, 1), - options: { - description: 'placeholder', - showIfCollapsed: true, - after: { - content: options.placeholder, - cursorStops: InjectedTextCursorStops.None, - inlineClassName: 'placeholder-text' - } - } - }]; - }); - - constructor( - private readonly _editor: ICodeEditor, - ) { - super(); - - this._register(this._editorObs.setDecorations(this._decorations)); - } -} - -registerEditorContribution(PlaceholderTextContribution.ID, PlaceholderTextContribution, EditorContributionInstantiation.Eager); - -registerColor('editor.placeholder.foreground', { dark: ghostTextForeground, light: ghostTextForeground, hcDark: ghostTextForeground, hcLight: ghostTextForeground }, localize('placeholderForeground', 'Foreground color of the placeholder text in the editor.')); +registerColor('editor.placeholder.foreground', ghostTextForeground, localize('placeholderForeground', 'Foreground color of the placeholder text in the editor.')); diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts new file mode 100644 index 0000000000000..4a302f18af651 --- /dev/null +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { structuralEquals } from 'vs/base/common/equals'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { derived, derivedOpts } from 'vs/base/common/observable'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { Range } from 'vs/editor/common/core/range'; +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { IModelDeltaDecoration, InjectedTextCursorStops } from 'vs/editor/common/model'; + +/** + * Use the editor option to set the placeholder text. +*/ +export class PlaceholderTextContribution extends Disposable implements IEditorContribution { + public static get(editor: ICodeEditor): PlaceholderTextContribution { + return editor.getContribution(PlaceholderTextContribution.ID)!; + } + + public static readonly ID = 'editor.contrib.placeholderText'; + private readonly _editorObs = observableCodeEditor(this._editor); + + private readonly _placeholderText = this._editorObs.getOption(EditorOption.placeholder); + + private readonly _decorationOptions = derivedOpts<{ placeholder: string } | undefined>({ owner: this, equalsFn: structuralEquals }, reader => { + const p = this._placeholderText.read(reader); + if (!p) { return undefined; } + if (!this._editorObs.valueIsEmpty.read(reader)) { return undefined; } + + return { placeholder: p }; + }); + + private readonly _decorations = derived(this, (reader) => { + const options = this._decorationOptions.read(reader); + if (!options) { return []; } + + return [{ + range: new Range(1, 1, 1, 1), + options: { + description: 'placeholder', + showIfCollapsed: true, + after: { + content: options.placeholder, + cursorStops: InjectedTextCursorStops.None, + inlineClassName: 'placeholder-text' + } + } + }]; + }); + + constructor( + private readonly _editor: ICodeEditor, + ) { + super(); + + this._register(this._editorObs.setDecorations(this._decorations)); + } +} diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/reloadableWorkbenchContribution.ts b/src/vs/platform/observable/common/wrapInReloadableClass.ts similarity index 93% rename from src/vs/workbench/contrib/accessibilitySignals/browser/reloadableWorkbenchContribution.ts rename to src/vs/platform/observable/common/wrapInReloadableClass.ts index 43fb32eed293a..68124c5f399a1 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/reloadableWorkbenchContribution.ts +++ b/src/vs/platform/observable/common/wrapInReloadableClass.ts @@ -2,11 +2,10 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ - import { isHotReloadEnabled } from 'vs/base/common/hotReload'; +import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; import { IDisposable } from 'vs/base/common/lifecycle'; import { autorunWithStore } from 'vs/base/common/observable'; -import { readHotReloadableExport } from 'vs/editor/browser/widget/diffEditor/utils'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; /** @@ -34,10 +33,9 @@ export function wrapInReloadableClass(getClass: () => (new (...args: any[]) => a } }; } - class BaseClass { constructor( - @IInstantiationService protected readonly instantiationService: IInstantiationService, + @IInstantiationService protected readonly instantiationService: IInstantiationService ) { this.init(); } diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts b/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts index cb298c79733ba..d25ee91798ae7 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts +++ b/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts @@ -10,7 +10,7 @@ import { registerWorkbenchContribution2, WorkbenchPhase } from 'vs/workbench/com import { AccessibilitySignalLineDebuggerContribution } from 'vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignalDebuggerContribution'; import { ShowAccessibilityAnnouncementHelp, ShowSignalSoundHelp } from 'vs/workbench/contrib/accessibilitySignals/browser/commands'; import { EditorTextPropertySignalsContribution } from 'vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution'; -import { wrapInReloadableClass } from 'vs/workbench/contrib/accessibilitySignals/browser/reloadableWorkbenchContribution'; +import { wrapInReloadableClass } from 'vs/platform/observable/common/wrapInReloadableClass'; registerSingleton(IAccessibilitySignalService, AccessibilitySignalService, InstantiationType.Delayed); From 473e3485913833595efe1360d50e24b912a38435 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:31:26 +0200 Subject: [PATCH 578/755] Improve compact badge display (#219552) Show up to 3 characters in compact badge --- src/vs/workbench/browser/parts/compositeBarActions.ts | 9 ++++----- .../workbench/browser/parts/media/paneCompositePart.css | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index de10721d07cac..24b1b97b7dd21 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -319,11 +319,7 @@ export class CompositeBarActionViewItem extends BaseActionViewItem { else if (badge instanceof NumberBadge) { if (badge.number) { let number = badge.number.toString(); - if (this.options.compact) { - if (badge.number > 99) { - number = ''; - } - } else if (badge.number > 999) { + if (badge.number > 999) { const noOfThousands = badge.number / 1000; const floor = Math.floor(noOfThousands); if (noOfThousands > floor) { @@ -332,6 +328,9 @@ export class CompositeBarActionViewItem extends BaseActionViewItem { number = `${noOfThousands}K`; } } + if (this.options.compact && number.length >= 3) { + classes.push('compact-content'); + } this.badgeContent.textContent = number; show(this.badge); } diff --git a/src/vs/workbench/browser/parts/media/paneCompositePart.css b/src/vs/workbench/browser/parts/media/paneCompositePart.css index 52baa5324f725..174997a925db9 100644 --- a/src/vs/workbench/browser/parts/media/paneCompositePart.css +++ b/src/vs/workbench/browser/parts/media/paneCompositePart.css @@ -237,6 +237,12 @@ text-align: center; } +.monaco-workbench .pane-composite-part > .title > .composite-bar-container > .composite-bar > .monaco-action-bar .action-item.icon .badge.compact.compact-content .badge-content, +.monaco-workbench .pane-composite-part > .header-or-footer > .composite-bar-container > .composite-bar > .monaco-action-bar .action-item.icon .badge.compact.compact-content .badge-content { + font-size: 8px; + padding: 0 3px; +} + .monaco-workbench .pane-composite-part > .title > .composite-bar-container > .composite-bar > .monaco-action-bar .action-item.icon .badge.compact.progress-badge .badge-content::before, .monaco-workbench .pane-composite-part > .header-or-footer > .composite-bar-container > .composite-bar > .monaco-action-bar .action-item.icon .badge.compact.progress-badge .badge-content::before { mask-size: 11px; From 26016181625e2fccc2e95fecff6977b0dbd88eeb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 1 Jul 2024 16:37:47 +0200 Subject: [PATCH 579/755] fix #219336 (#219553) fix #219336 (#219337) * fix #219336 * fix owner --- .../contrib/telemetry/browser/telemetry.contribution.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts index 755566d543519..65b2301495f76 100644 --- a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts +++ b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts @@ -431,11 +431,11 @@ class ConfigurationTelemetryContribution extends Disposable implements IWorkbenc ? 'default' : 'custom'; this.telemetryService.publicLog2('window.systemColorTheme', { settingValue, source }); + }>('window.newWindowProfile', { settingValue, source }); return; } @@ -445,7 +445,7 @@ class ConfigurationTelemetryContribution extends Disposable implements IWorkbenc comment: 'This is used to know if extensions are getting auto restarted or not'; settingValue: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'value of the setting' }; source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'source of the setting' }; - }>('window.systemColorTheme', { settingValue: this.getValueToReport(key, target), source }); + }>('extensions.autoRestart', { settingValue: this.getValueToReport(key, target), source }); return; } } From db7e8f1f1d007bcde3c0d63285e073a63abf0d52 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 1 Jul 2024 17:32:55 +0200 Subject: [PATCH 580/755] Disables wrapInReloadableClass (#219555) --- src/vs/platform/observable/common/wrapInReloadableClass.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/platform/observable/common/wrapInReloadableClass.ts b/src/vs/platform/observable/common/wrapInReloadableClass.ts index 68124c5f399a1..4b5e2e2d3c4a3 100644 --- a/src/vs/platform/observable/common/wrapInReloadableClass.ts +++ b/src/vs/platform/observable/common/wrapInReloadableClass.ts @@ -14,6 +14,11 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti * When the original class changes, the instance is re-created. */ export function wrapInReloadableClass(getClass: () => (new (...args: any[]) => any)): (new (...args: any[]) => any) { + // Disables this function as it does not work. + if (1 === 1) { + // TODO@hediet fix this asap. + return getClass(); + } if (!isHotReloadEnabled()) { return getClass(); } From 327279994e030d1a7da815c1d6d0e9c45bf673cc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 1 Jul 2024 18:30:08 +0200 Subject: [PATCH 581/755] debt - update `path.ts` to node.js `20.x` (#219560) first cut update --- src/vs/base/common/path.ts | 44 ++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/vs/base/common/path.ts b/src/vs/base/common/path.ts index 83140948bbaba..6f40f7d035603 100644 --- a/src/vs/base/common/path.ts +++ b/src/vs/base/common/path.ts @@ -4,7 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // NOTE: VSCode's copy of nodejs path library to be usable in common (non-node) namespace -// Copied from: https://github.com/nodejs/node/blob/v16.14.2/lib/path.js +// Copied from: https://github.com/nodejs/node/commits/v20.9.0/lib/path.js +// Excluding: the change that adds primordials +// (https://github.com/nodejs/node/commit/187a862d221dec42fa9a5c4214e7034d9092792f and others) /** * Copyright Joyent, Inc. and other Node contributors. @@ -159,11 +161,15 @@ function normalizeString(path: string, allowAboveRoot: boolean, separator: strin return res; } +function formatExt(ext: string): string { + return ext ? `${ext[0] === '.' ? '' : '.'}${ext}` : ''; +} + function _format(sep: string, pathObject: ParsedPath) { validateObject(pathObject, 'pathObject'); const dir = pathObject.dir || pathObject.root; const base = pathObject.base || - `${pathObject.name || ''}${pathObject.ext || ''}`; + `${pathObject.name || ''}${formatExt(pathObject.ext)}`; if (!dir) { return base; } @@ -185,7 +191,7 @@ export interface IPath { resolve(...pathSegments: string[]): string; relative(from: string, to: string): string; dirname(path: string): string; - basename(path: string, ext?: string): string; + basename(path: string, suffix?: string): string; extname(path: string): string; format(pathObject: ParsedPath): string; parse(path: string): ParsedPath; @@ -207,7 +213,7 @@ export const win32: IPath = { let path; if (i >= 0) { path = pathSegments[i]; - validateString(path, 'path'); + validateString(path, `paths[${i}]`); // Skip empty entries if (path.length === 0) { @@ -757,9 +763,9 @@ export const win32: IPath = { return path.slice(0, end); }, - basename(path: string, ext?: string): string { - if (ext !== undefined) { - validateString(ext, 'ext'); + basename(path: string, suffix?: string): string { + if (suffix !== undefined) { + validateString(suffix, 'suffix'); } validateString(path, 'path'); let start = 0; @@ -776,11 +782,11 @@ export const win32: IPath = { start = 2; } - if (ext !== undefined && ext.length > 0 && ext.length <= path.length) { - if (ext === path) { + if (suffix !== undefined && suffix.length > 0 && suffix.length <= path.length) { + if (suffix === path) { return ''; } - let extIdx = ext.length - 1; + let extIdx = suffix.length - 1; let firstNonSlashEnd = -1; for (i = path.length - 1; i >= start; --i) { const code = path.charCodeAt(i); @@ -800,7 +806,7 @@ export const win32: IPath = { } if (extIdx >= 0) { // Try to match the explicit extension - if (code === ext.charCodeAt(extIdx)) { + if (code === suffix.charCodeAt(extIdx)) { if (--extIdx === -1) { // We matched the extension, so mark this as the end of our path // component @@ -1095,7 +1101,7 @@ export const posix: IPath = { for (let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--) { const path = i >= 0 ? pathSegments[i] : posixCwd(); - validateString(path, 'path'); + validateString(path, `paths[${i}]`); // Skip empty entries if (path.length === 0) { @@ -1280,9 +1286,9 @@ export const posix: IPath = { return path.slice(0, end); }, - basename(path: string, ext?: string): string { - if (ext !== undefined) { - validateString(ext, 'ext'); + basename(path: string, suffix?: string): string { + if (suffix !== undefined) { + validateString(suffix, 'ext'); } validateString(path, 'path'); @@ -1291,11 +1297,11 @@ export const posix: IPath = { let matchedSlash = true; let i; - if (ext !== undefined && ext.length > 0 && ext.length <= path.length) { - if (ext === path) { + if (suffix !== undefined && suffix.length > 0 && suffix.length <= path.length) { + if (suffix === path) { return ''; } - let extIdx = ext.length - 1; + let extIdx = suffix.length - 1; let firstNonSlashEnd = -1; for (i = path.length - 1; i >= 0; --i) { const code = path.charCodeAt(i); @@ -1315,7 +1321,7 @@ export const posix: IPath = { } if (extIdx >= 0) { // Try to match the explicit extension - if (code === ext.charCodeAt(extIdx)) { + if (code === suffix.charCodeAt(extIdx)) { if (--extIdx === -1) { // We matched the extension, so mark this as the end of our path // component From cf3e2a4e81159d4da0570cb37be3c9e7e662780b Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 1 Jul 2024 19:12:02 +0200 Subject: [PATCH 582/755] Fixes #211403 --- .../browser/placeholderText.css | 13 +++- .../browser/placeholderTextContribution.ts | 64 ++++++++++++------- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderText.css b/src/vs/editor/contrib/placeholderText/browser/placeholderText.css index 3912e17fc2f67..043b6f156327d 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderText.css +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.css @@ -5,8 +5,15 @@ .monaco-editor { --vscode-editor-placeholder-foreground: var(--vscode-editorGhostText-foreground); -} -.monaco-editor .placeholder-text { - color: var(--vscode-editor-placeholder-foreground); + .editorPlaceholder { + top: 0px; + position: absolute; + overflow: hidden; + text-overflow: ellipsis; + text-wrap: nowrap; + pointer-events: none; + + color: var(--vscode-editor-placeholder-foreground); + } } diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts index 4a302f18af651..8ac0fc821c74b 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts @@ -3,15 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { h } from 'vs/base/browser/dom'; import { structuralEquals } from 'vs/base/common/equals'; import { Disposable } from 'vs/base/common/lifecycle'; -import { derived, derivedOpts } from 'vs/base/common/observable'; +import { autorun, constObservable, derivedObservableWithCache, derivedOpts, IObservable, IReader } from 'vs/base/common/observable'; +import { DebugOwner } from 'vs/base/common/observableInternal/debugName'; +import { derivedWithStore } from 'vs/base/common/observableInternal/derived'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { IModelDeltaDecoration, InjectedTextCursorStops } from 'vs/editor/common/model'; /** * Use the editor option to set the placeholder text. @@ -26,30 +27,42 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo private readonly _placeholderText = this._editorObs.getOption(EditorOption.placeholder); - private readonly _decorationOptions = derivedOpts<{ placeholder: string } | undefined>({ owner: this, equalsFn: structuralEquals }, reader => { + private readonly _state = derivedOpts<{ placeholder: string } | undefined>({ owner: this, equalsFn: structuralEquals }, reader => { const p = this._placeholderText.read(reader); if (!p) { return undefined; } if (!this._editorObs.valueIsEmpty.read(reader)) { return undefined; } - return { placeholder: p }; }); - private readonly _decorations = derived(this, (reader) => { - const options = this._decorationOptions.read(reader); - if (!options) { return []; } - - return [{ - range: new Range(1, 1, 1, 1), - options: { - description: 'placeholder', - showIfCollapsed: true, - after: { - content: options.placeholder, - cursorStops: InjectedTextCursorStops.None, - inlineClassName: 'placeholder-text' - } - } - }]; + private readonly _shouldViewBeAlive = isOrWasTrue(this, reader => this._state.read(reader)?.placeholder !== undefined); + + private readonly _view = derivedWithStore((reader, store) => { + if (!this._shouldViewBeAlive.read(reader)) { return; } + + const element = h('div.editorPlaceholder'); + element.root.style.top = `1px`; + + store.add(autorun(reader => { + const data = this._state.read(reader); + const shouldBeVisibile = data?.placeholder !== undefined; + element.root.style.display = shouldBeVisibile ? 'block' : 'none'; + element.root.innerText = data?.placeholder ?? ''; + })); + store.add(autorun(reader => { + const info = this._editorObs.layoutInfo.read(reader); + element.root.style.left = `${info.contentLeft}px`; + element.root.style.width = (info.contentWidth - info.verticalScrollbarWidth) + 'px'; + })); + store.add(autorun(reader => { + element.root.style.fontFamily = this._editorObs.getOption(EditorOption.fontFamily).read(reader); + element.root.style.fontSize = this._editorObs.getOption(EditorOption.fontSize).read(reader) + 'px'; + })); + store.add(this._editorObs.createOverlayWidget({ + allowEditorOverflow: false, + minContentWidthInPx: constObservable(0), + position: constObservable(null), + domNode: element.root, + })); }); constructor( @@ -57,6 +70,13 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo ) { super(); - this._register(this._editorObs.setDecorations(this._decorations)); + this._view.recomputeInitiallyAndOnChange(this._store); } } + +function isOrWasTrue(owner: DebugOwner, fn: (reader: IReader) => boolean): IObservable { + return derivedObservableWithCache(owner, (reader, lastValue) => { + if (lastValue === true) { return true; } + return fn(reader); + }); +} From 013b1861dc7a3ffc6bc6ed7fd05c5b3c88d53a06 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 1 Jul 2024 19:22:29 +0200 Subject: [PATCH 583/755] Fixes potential leak --- .../browser/editorTextPropertySignalsContribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts b/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts index 4fa9f2d85c9eb..f5dddf8ada492 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts +++ b/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.ts @@ -73,7 +73,7 @@ export class EditorTextPropertySignalsContribution extends Disposable implements let lastLine = -1; const ignoredLineSignalsForCurrentLine = new Set(); - const timeouts = new DisposableStore(); + const timeouts = store.add(new DisposableStore()); const propertySources = this._textProperties.map(p => ({ source: p.createSource(editor, editorModel), property: p })); From 01a77403bfbfd26ad22a56f03d9333501961835a Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 1 Jul 2024 19:27:00 +0200 Subject: [PATCH 584/755] Fixes wrapInReloadableClass* functions. --- .../browser/placeholderText.contribution.ts | 4 +- .../common/wrapInReloadableClass.ts | 57 ++++++++++++------- .../accessibilitySignal.contribution.ts | 4 +- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts index 1c54ca29a2de1..e9994c4b01c2d 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.ts @@ -9,8 +9,8 @@ import { ghostTextForeground } from 'vs/editor/common/core/editorColorRegistry'; import { localize } from 'vs/nls'; import { registerColor } from 'vs/platform/theme/common/colorUtils'; import { PlaceholderTextContribution } from './placeholderTextContribution'; -import { wrapInReloadableClass } from 'vs/platform/observable/common/wrapInReloadableClass'; +import { wrapInReloadableClass1 } from 'vs/platform/observable/common/wrapInReloadableClass'; -registerEditorContribution(PlaceholderTextContribution.ID, wrapInReloadableClass(() => PlaceholderTextContribution), EditorContributionInstantiation.Eager); +registerEditorContribution(PlaceholderTextContribution.ID, wrapInReloadableClass1(() => PlaceholderTextContribution), EditorContributionInstantiation.Eager); registerColor('editor.placeholder.foreground', ghostTextForeground, localize('placeholderForeground', 'Foreground color of the placeholder text in the editor.')); diff --git a/src/vs/platform/observable/common/wrapInReloadableClass.ts b/src/vs/platform/observable/common/wrapInReloadableClass.ts index 4b5e2e2d3c4a3..bb05ee95bfb9d 100644 --- a/src/vs/platform/observable/common/wrapInReloadableClass.ts +++ b/src/vs/platform/observable/common/wrapInReloadableClass.ts @@ -6,44 +6,57 @@ import { isHotReloadEnabled } from 'vs/base/common/hotReload'; import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; import { IDisposable } from 'vs/base/common/lifecycle'; import { autorunWithStore } from 'vs/base/common/observable'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { BrandedService, GetLeadingNonServiceArgs, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; /** * Wrap a class in a reloadable wrapper. * When the wrapper is created, the original class is created. * When the original class changes, the instance is re-created. */ -export function wrapInReloadableClass(getClass: () => (new (...args: any[]) => any)): (new (...args: any[]) => any) { - // Disables this function as it does not work. - if (1 === 1) { - // TODO@hediet fix this asap. - return getClass(); - } - if (!isHotReloadEnabled()) { - return getClass(); - } - - return class ReloadableWrapper extends BaseClass { +export function wrapInReloadableClass0(getClass: () => Result): Result> { + return !isHotReloadEnabled() ? getClass() : createWrapper(getClass, BaseClass0); +} + +type Result = new (...args: TArgs) => IDisposable; + +class BaseClass { + constructor( + protected readonly instantiationService: IInstantiationService, + ) { } + + init(...params: any[]): void { } +} + +function createWrapper(getClass: () => any, B: new (...args: T) => BaseClass) { + return (class ReloadableWrapper extends B { private _autorun: IDisposable | undefined = undefined; - override init() { + override init(...params: any[]) { this._autorun = autorunWithStore((reader, store) => { const clazz = readHotReloadableExport(getClass(), reader); - store.add(this.instantiationService.createInstance(clazz)); + store.add(this.instantiationService.createInstance(clazz as any, ...params) as IDisposable); }); } dispose(): void { this._autorun?.dispose(); } - }; + }) as any; +} + +class BaseClass0 extends BaseClass { + constructor(@IInstantiationService i: IInstantiationService) { super(i); this.init(); } +} + +/** + * Wrap a class in a reloadable wrapper. + * When the wrapper is created, the original class is created. + * When the original class changes, the instance is re-created. +*/ +export function wrapInReloadableClass1(getClass: () => Result): Result> { + return !isHotReloadEnabled() ? getClass() as any : createWrapper(getClass, BaseClass1); } -class BaseClass { - constructor( - @IInstantiationService protected readonly instantiationService: IInstantiationService - ) { - this.init(); - } - init(): void { } +class BaseClass1 extends BaseClass { + constructor(param1: any, @IInstantiationService i: IInstantiationService,) { super(i); this.init(param1); } } diff --git a/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts b/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts index d25ee91798ae7..deb7708581959 100644 --- a/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts +++ b/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.ts @@ -10,11 +10,11 @@ import { registerWorkbenchContribution2, WorkbenchPhase } from 'vs/workbench/com import { AccessibilitySignalLineDebuggerContribution } from 'vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignalDebuggerContribution'; import { ShowAccessibilityAnnouncementHelp, ShowSignalSoundHelp } from 'vs/workbench/contrib/accessibilitySignals/browser/commands'; import { EditorTextPropertySignalsContribution } from 'vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution'; -import { wrapInReloadableClass } from 'vs/platform/observable/common/wrapInReloadableClass'; +import { wrapInReloadableClass0 } from 'vs/platform/observable/common/wrapInReloadableClass'; registerSingleton(IAccessibilitySignalService, AccessibilitySignalService, InstantiationType.Delayed); -registerWorkbenchContribution2('EditorTextPropertySignalsContribution', wrapInReloadableClass(() => EditorTextPropertySignalsContribution), WorkbenchPhase.AfterRestored); +registerWorkbenchContribution2('EditorTextPropertySignalsContribution', wrapInReloadableClass0(() => EditorTextPropertySignalsContribution), WorkbenchPhase.AfterRestored); registerWorkbenchContribution2('AccessibilitySignalLineDebuggerContribution', AccessibilitySignalLineDebuggerContribution, WorkbenchPhase.AfterRestored); registerAction2(ShowSignalSoundHelp); From 3652f9c8b3a2ff91cc238fe4e31469a175a5b71c Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 1 Jul 2024 19:29:08 +0200 Subject: [PATCH 585/755] Repairs hot reload for monaco editor playground. --- scripts/playground-server.ts | 212 ++++++++++++++++++++++++++++------- 1 file changed, 169 insertions(+), 43 deletions(-) diff --git a/scripts/playground-server.ts b/scripts/playground-server.ts index 1c2074ee19134..1e8479a2d1f7d 100644 --- a/scripts/playground-server.ts +++ b/scripts/playground-server.ts @@ -223,10 +223,10 @@ class DirWatcher { function handleGetFileChangesRequest(watcher: DirWatcher, fileServer: FileServer, moduleIdMapper: SimpleModuleIdPathMapper): ChainableRequestHandler { return async (req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); - const d = watcher.onDidChange(fsPath => { + const d = watcher.onDidChange((fsPath, newContent) => { const path = fileServer.filePathToUrlPath(fsPath); if (path) { - res.write(JSON.stringify({ changedPath: path, moduleId: moduleIdMapper.getModuleId(fsPath) }) + '\n'); + res.write(JSON.stringify({ changedPath: path, moduleId: moduleIdMapper.getModuleId(fsPath), newContent }) + '\n'); } }); res.on('close', () => d.dispose()); @@ -262,49 +262,18 @@ function makeLoaderJsHotReloadable(loaderJsCode: string, fileChangesUrl: URL): s buffer += new TextDecoder().decode(value); const lines = buffer.split('\n'); buffer = lines.pop()!; + + const changes: { relativePath: string; config: HotReloadConfig | undefined; path: string; newContent: string }[] = []; + for (const line of lines) { const data = JSON.parse(line); - let handled = false; - if (data.changedPath.endsWith('.css')) { - if (typeof document !== 'undefined') { - console.log('css changed', data.changedPath); - const styleSheet = [...document.querySelectorAll(`link[rel='stylesheet']`)].find((l: any) => new URL(l.href, document.location.href).pathname.endsWith(data.changedPath)) as any; - if (styleSheet) { - styleSheet.href = styleSheet.href.replace(/\?.*/, '') + '?' + Date.now(); - } - } - handled = true; - } else if (data.changedPath.endsWith('.js') && data.moduleId) { - console.log('js changed', data.changedPath); - const moduleId = ___globalModuleManager._moduleIdProvider.getModuleId(data.moduleId); - if (___globalModuleManager._modules2[moduleId]) { - const srcUrl = ___globalModuleManager._config.moduleIdToPaths(data.moduleId); - const newSrc = await (await fetch(srcUrl)).text(); - (new Function('define', newSrc))(function (deps, callback) { // CodeQL [SM01632] This code is only executed during development (as part of the dev-only playground-server). It is required for the hot-reload functionality. - const oldModule = ___globalModuleManager._modules2[moduleId]; - delete ___globalModuleManager._modules2[moduleId]; - - ___globalModuleManager.defineModule(data.moduleId, deps, callback); - const newModule = ___globalModuleManager._modules2[moduleId]; - const oldExports = { ...oldModule.exports }; - - Object.assign(oldModule.exports, newModule.exports); - newModule.exports = oldModule.exports; - - handled = true; - - for (const cb of [...globalThis.$hotReload_deprecateExports]) { - cb(oldExports, newModule.exports); - } - - if (handled) { - console.log('hot reloaded', data.moduleId); - } - }); - } - } - - if (!handled) { reloadFn(); } + const relativePath = data.changedPath.replace(/\\/g, '/').split('/out/')[1]; + changes.push({ config: {}, path: data.changedPath, relativePath, newContent: data.newContent }); + } + + const result = handleChanges(changes, 'playground-server'); + if (result.reloadFailedJsFiles.length > 0) { + reloadFn(); } } }).catch(err => { @@ -312,6 +281,163 @@ function makeLoaderJsHotReloadable(loaderJsCode: string, fileChangesUrl: URL): s setTimeout(() => $watchChanges(fileChangesUrl), 1000); }); + + function handleChanges(changes: { + relativePath: string; + config: HotReloadConfig | undefined; + path: string; + newContent: string; + }[], debugSessionName: string) { + // This function is stringified and injected into the debuggee. + + const hotReloadData: { count: number; originalWindowTitle: any; timeout: any; shouldReload: boolean } = globalThis.$hotReloadData || (globalThis.$hotReloadData = { count: 0, messageHideTimeout: undefined, shouldReload: false }); + + const reloadFailedJsFiles: { relativePath: string; path: string }[] = []; + + for (const change of changes) { + handleChange(change.relativePath, change.path, change.newContent, change.config); + } + + return { reloadFailedJsFiles }; + + function handleChange(relativePath: string, path: string, newSrc: string, config: any) { + if (relativePath.endsWith('.css')) { + handleCssChange(relativePath); + } else if (relativePath.endsWith('.js')) { + handleJsChange(relativePath, path, newSrc, config); + } + } + + function handleCssChange(relativePath: string) { + if (typeof document === 'undefined') { + return; + } + + const styleSheet = (([...document.querySelectorAll(`link[rel='stylesheet']`)] as HTMLLinkElement[])) + .find(l => new URL(l.href, document.location.href).pathname.endsWith(relativePath)); + if (styleSheet) { + setMessage(`reload ${formatPath(relativePath)} - ${new Date().toLocaleTimeString()}`); + console.log(debugSessionName, 'css reloaded', relativePath); + styleSheet.href = styleSheet.href.replace(/\?.*/, '') + '?' + Date.now(); + } else { + setMessage(`could not reload ${formatPath(relativePath)} - ${new Date().toLocaleTimeString()}`); + console.log(debugSessionName, 'ignoring css change, as stylesheet is not loaded', relativePath); + } + } + + + function handleJsChange(relativePath: string, path: string, newSrc: string, config: any) { + const moduleIdStr = trimEnd(relativePath, '.js'); + + const requireFn: any = globalThis.require; + const moduleManager = (requireFn as any).moduleManager; + if (!moduleManager) { + console.log(debugSessionName, 'ignoring js change, as moduleManager is not available', relativePath); + return; + } + + const moduleId = moduleManager._moduleIdProvider.getModuleId(moduleIdStr); + const oldModule = moduleManager._modules2[moduleId]; + + if (!oldModule) { + console.log(debugSessionName, 'ignoring js change, as module is not loaded', relativePath); + return; + } + + // Check if we can reload + const g: GlobalThisAddition = globalThis as any; + + // A frozen copy of the previous exports + const oldExports = Object.freeze({ ...oldModule.exports }); + const reloadFn = g.$hotReload_applyNewExports?.({ oldExports, newSrc, config }); + + if (!reloadFn) { + console.log(debugSessionName, 'ignoring js change, as module does not support hot-reload', relativePath); + hotReloadData.shouldReload = true; + + reloadFailedJsFiles.push({ relativePath, path }); + + setMessage(`hot reload not supported for ${formatPath(relativePath)} - ${new Date().toLocaleTimeString()}`); + return; + } + + // Eval maintains source maps + function newScript(/* this parameter is used by newSrc */ define) { + // eslint-disable-next-line no-eval + eval(newSrc); // CodeQL [SM01632] This code is only executed during development. It is required for the hot-reload functionality. + } + + newScript(/* define */ function (deps, callback) { + // Evaluating the new code was successful. + + // Redefine the module + delete moduleManager._modules2[moduleId]; + moduleManager.defineModule(moduleIdStr, deps, callback); + const newModule = moduleManager._modules2[moduleId]; + + + // Patch the exports of the old module, so that modules using the old module get the new exports + Object.assign(oldModule.exports, newModule.exports); + // We override the exports so that future reloads still patch the initial exports. + newModule.exports = oldModule.exports; + + const successful = reloadFn(newModule.exports); + if (!successful) { + hotReloadData.shouldReload = true; + setMessage(`hot reload failed ${formatPath(relativePath)} - ${new Date().toLocaleTimeString()}`); + console.log(debugSessionName, 'hot reload was not successful', relativePath); + return; + } + + console.log(debugSessionName, 'hot reloaded', moduleIdStr); + setMessage(`successfully reloaded ${formatPath(relativePath)} - ${new Date().toLocaleTimeString()}`); + }); + } + + function setMessage(message: string) { + const domElem = (document.querySelector('.titlebar-center .window-title')) as HTMLDivElement | undefined; + if (!domElem) { return; } + if (!hotReloadData.timeout) { + hotReloadData.originalWindowTitle = domElem.innerText; + } else { + clearTimeout(hotReloadData.timeout); + } + if (hotReloadData.shouldReload) { + message += ' (manual reload required)'; + } + + domElem.innerText = message; + hotReloadData.timeout = setTimeout(() => { + hotReloadData.timeout = undefined; + // If wanted, we can restore the previous title message + // domElem.replaceChildren(hotReloadData.originalWindowTitle); + }, 5000); + } + + function formatPath(path: string): string { + const parts = path.split('/'); + parts.reverse(); + let result = parts[0]; + parts.shift(); + for (const p of parts) { + if (result.length + p.length > 40) { + break; + } + result = p + '/' + result; + if (result.length > 20) { + break; + } + } + return result; + } + + function trimEnd(str, suffix) { + if (str.endsWith(suffix)) { + return str.substring(0, str.length - suffix.length); + } + return str; + } + } } const additionalJsCode = ` From a02f3c923dea8a9c37854e58ac88ac982f1bc451 Mon Sep 17 00:00:00 2001 From: Robo Date: Tue, 2 Jul 2024 02:59:38 +0900 Subject: [PATCH 586/755] cli: restrict pkg config search directory to sysroot (#219572) --- build/azure-pipelines/cli/cli-compile.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build/azure-pipelines/cli/cli-compile.yml b/build/azure-pipelines/cli/cli-compile.yml index a70f607ad693a..e77ba78a999fd 100644 --- a/build/azure-pipelines/cli/cli-compile.yml +++ b/build/azure-pipelines/cli/cli-compile.yml @@ -49,16 +49,22 @@ steps: export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc" export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS="-C link-arg=--sysroot=$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot" export CC_aarch64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --sysroot=$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot" + export PKG_CONFIG_LIBDIR_aarch64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot/usr/lib/aarch64-linux-gnu/pkgconfig:$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot/usr/share/pkgconfig" + export PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot" export OBJDUMP="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/bin/objdump" elif [ "$SYSROOT_ARCH" == "amd64" ]; then export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/bin/x86_64-linux-gnu-gcc" export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS="-C link-arg=--sysroot=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot -C link-arg=-L$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/lib/x86_64-linux-gnu" export CC_x86_64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/bin/x86_64-linux-gnu-gcc --sysroot=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot" + export PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/lib/x86_64-linux-gnu/pkgconfig:$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/share/pkgconfig" + export PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot" export OBJDUMP="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/bin/objdump" elif [ "$SYSROOT_ARCH" == "armhf" ]; then export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc" export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUSTFLAGS="-C link-arg=--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot" export CC_armv7_unknown_linux_gnueabihf="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc --sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot" + export PKG_CONFIG_LIBDIR_armv7_unknown_linux_gnueabihf="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-rpi-linux-gnueabihf/pkgconfig:$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/share/pkgconfig" + export PKG_CONFIG_SYSROOT_DIR_armv7_unknown_linux_gnueabihf="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot" export OBJDUMP="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/bin/objdump" fi fi @@ -79,7 +85,7 @@ steps: done < <("$OBJDUMP" -T "$PWD/target/${{ parameters.VSCODE_CLI_TARGET }}/release/code") if [[ "$glibc_version" != "2.17" ]]; then echo "Error: binary has dependency on GLIBC > 2.17, found $glibc_version" - #exit 1 + exit 1 fi fi displayName: Compile ${{ parameters.VSCODE_CLI_TARGET }} From 0db947b90c90ebaca89cc8f587f25b068c7a2d09 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 1 Jul 2024 15:52:12 -0700 Subject: [PATCH 587/755] Small chat renderer cleanup (#219597) --- .../contrib/chat/browser/chatListRenderer.ts | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 1424cf276b17b..34640bcba87bd 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -567,43 +567,44 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer part === null); + return true; + } - if (isFullyRendered && element.isComplete) { + let isFullyRendered = false; + this.traceLayout('doNextProgressiveRender', `START progressive render, index=${index}, renderData=${JSON.stringify(element.renderData)}`); + const contentForThisTurn = this.getNextProgressiveRenderContent(element); + const partsToRender = this.diff(templateData.renderedParts ?? [], contentForThisTurn, element); + isFullyRendered = partsToRender.every(part => part === null); + + if (isFullyRendered) { + if (element.isComplete) { // Response is done and content is rendered, so do a normal render this.traceLayout('doNextProgressiveRender', `END progressive render, index=${index} and clearing renderData, response is complete`); element.renderData = undefined; this.basicRenderElement(element, index, templateData); - // TODO return here - } else if (!isFullyRendered) { - this.traceLayout('doNextProgressiveRender', `doing progressive render, ${partsToRender.length} parts to render`); - this.renderChatContentDiff(partsToRender, contentForThisTurn, element, templateData); - } else { - // Nothing new to render, not done, keep waiting - this.traceLayout('doNextProgressiveRender', 'caught up with the stream- no new content to render'); - return false; + return true; } + + // Nothing new to render, not done, keep waiting + this.traceLayout('doNextProgressiveRender', 'caught up with the stream- no new content to render'); + return false; } - // Some render happened - update the height + // Do an actual progressive render + this.traceLayout('doNextProgressiveRender', `doing progressive render, ${partsToRender.length} parts to render`); + this.renderChatContentDiff(partsToRender, contentForThisTurn, element, templateData); + const height = templateData.rowContainer.offsetHeight; element.currentRenderedHeight = height; if (!isInRenderElement) { this._onDidChangeItemHeight.fire({ element, height: templateData.rowContainer.offsetHeight }); } - return isFullyRendered; + return false; } private renderChatContentDiff(partsToRender: ReadonlyArray, contentForThisTurn: ReadonlyArray, element: IChatResponseViewModel, templateData: IChatListItemTemplate): void { From 42b3bac02e37836393b4c4b46fcc91aa03e02aa8 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 1 Jul 2024 16:01:01 -0700 Subject: [PATCH 588/755] Dispose some child InstantiationServices (#219607) #212879 --- src/vs/workbench/contrib/chat/browser/chatEditor.ts | 2 +- src/vs/workbench/contrib/chat/browser/chatInputPart.ts | 2 +- src/vs/workbench/contrib/chat/browser/chatListRenderer.ts | 4 ++-- src/vs/workbench/contrib/chat/browser/chatViewPane.ts | 2 +- src/vs/workbench/contrib/chat/browser/chatWidget.ts | 2 +- src/vs/workbench/contrib/chat/browser/codeBlockPart.ts | 8 ++++---- .../preferences/test/browser/preferencesService.test.ts | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatEditor.ts b/src/vs/workbench/contrib/chat/browser/chatEditor.ts index 83d025ae70621..94fe53297a8de 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditor.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditor.ts @@ -58,7 +58,7 @@ export class ChatEditor extends EditorPane { protected override createEditor(parent: HTMLElement): void { this._scopedContextKeyService = this._register(this.contextKeyService.createScoped(parent)); - const scopedInstantiationService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])); + const scopedInstantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); this.widget = this._register( scopedInstantiationService.createInstance( diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index abf61519b3881..9fcc9fb8e50cd 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -359,7 +359,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge const inputScopedContextKeyService = this._register(this.contextKeyService.createScoped(inputContainer)); CONTEXT_IN_CHAT_INPUT.bindTo(inputScopedContextKeyService).set(true); - const scopedInstantiationService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, inputScopedContextKeyService])); + const scopedInstantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, inputScopedContextKeyService]))); const { historyNavigationBackwardsEnablement, historyNavigationForwardsEnablement } = this._register(registerAndCreateHistoryNavigationContext(inputScopedContextKeyService, this)); this.historyNavigationBackwardsEnablement = historyNavigationBackwardsEnablement; diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 34640bcba87bd..fb4eae44143ae 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -274,7 +274,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer { if (Array.isArray(item)) { - const scopedInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, templateData.contextKeyService])); + const scopedInstaService = templateData.elementDisposables.add(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, templateData.contextKeyService]))); templateData.elementDisposables.add( scopedInstaService.createInstance, ChatFollowups>( ChatFollowups, diff --git a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts index 83a9ef05a8f29..80022029e4079 100644 --- a/src/vs/workbench/contrib/chat/browser/chatViewPane.ts +++ b/src/vs/workbench/contrib/chat/browser/chatViewPane.ts @@ -133,7 +133,7 @@ export class ChatViewPane extends ViewPane { try { super.renderBody(parent); - const scopedInstantiationService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService])); + const scopedInstantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.scopedContextKeyService]))); const locationBasedColors = this.getLocationBasedColors(); this._widget = this._register(scopedInstantiationService.createInstance( ChatWidget, diff --git a/src/vs/workbench/contrib/chat/browser/chatWidget.ts b/src/vs/workbench/contrib/chat/browser/chatWidget.ts index 231d671577ca6..21ad0513b63dc 100644 --- a/src/vs/workbench/contrib/chat/browser/chatWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/chatWidget.ts @@ -458,7 +458,7 @@ export class ChatWidget extends Disposable implements IChatWidget { } private createList(listContainer: HTMLElement, options: IChatListItemRendererOptions): void { - const scopedInstantiationService = this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService]))); + const scopedInstantiationService = this._register(this._register(this.instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService])))); const delegate = scopedInstantiationService.createInstance(ChatListDelegate, this.viewOptions.defaultElementHeight ?? 200); const rendererDelegate: IChatRendererDelegate = { getListLength: () => this.tree.getNode(null).visibleChildrenCount, diff --git a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts index c9e952ffcd073..7caa40d96848b 100644 --- a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts +++ b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts @@ -161,7 +161,7 @@ export class CodeBlockPart extends Disposable { this.element = $('.interactive-result-code-block'); this.contextKeyService = this._register(contextKeyService.createScoped(this.element)); - const scopedInstantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService])); + const scopedInstantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService]))); const editorElement = dom.append(this.element, $('.interactive-result-editor')); this.editor = this.createEditor(scopedInstantiationService, editorElement, { ...getSimpleEditorOptions(this.configurationService), @@ -191,7 +191,7 @@ export class CodeBlockPart extends Disposable { const toolbarElement = dom.append(this.element, $('.interactive-result-code-block-toolbar')); const editorScopedService = this.editor.contextKeyService.createScoped(toolbarElement); - const editorScopedInstantiationService = scopedInstantiationService.createChild(new ServiceCollection([IContextKeyService, editorScopedService])); + const editorScopedInstantiationService = this._register(scopedInstantiationService.createChild(new ServiceCollection([IContextKeyService, editorScopedService]))); this.toolbar = this._register(editorScopedInstantiationService.createInstance(MenuWorkbenchToolBar, toolbarElement, menuId, { menuOptions: { shouldForwardArgs: true @@ -509,7 +509,7 @@ export class CodeCompareBlockPart extends Disposable { this.messageElement.tabIndex = 0; this.contextKeyService = this._register(contextKeyService.createScoped(this.element)); - const scopedInstantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService])); + const scopedInstantiationService = this._register(instantiationService.createChild(new ServiceCollection([IContextKeyService, this.contextKeyService]))); const editorHeader = dom.append(this.element, $('.interactive-result-header.show-file-icons')); const editorElement = dom.append(this.element, $('.interactive-result-editor')); this.diffEditor = this.createDiffEditor(scopedInstantiationService, editorElement, { @@ -540,7 +540,7 @@ export class CodeCompareBlockPart extends Disposable { this.resourceLabel = this._register(scopedInstantiationService.createInstance(ResourceLabel, editorHeader, { supportIcons: true })); const editorScopedService = this.diffEditor.getModifiedEditor().contextKeyService.createScoped(editorHeader); - const editorScopedInstantiationService = scopedInstantiationService.createChild(new ServiceCollection([IContextKeyService, editorScopedService])); + const editorScopedInstantiationService = this._register(scopedInstantiationService.createChild(new ServiceCollection([IContextKeyService, editorScopedService]))); this.toolbar = this._register(editorScopedInstantiationService.createInstance(MenuWorkbenchToolBar, editorHeader, menuId, { menuOptions: { shouldForwardArgs: true diff --git a/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts b/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts index af47ad2f8ea7f..7e5107a38274a 100644 --- a/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts +++ b/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts @@ -36,7 +36,7 @@ suite('PreferencesService', () => { // PreferencesService creates a PreferencesEditorInput which depends on IPreferencesService, add the real one, not a stub const collection = new ServiceCollection(); collection.set(IPreferencesService, new SyncDescriptor(PreferencesService)); - const instantiationService = testInstantiationService.createChild(collection); + const instantiationService = disposables.add(testInstantiationService.createChild(collection)); testObject = disposables.add(instantiationService.createInstance(PreferencesService)); }); test('options are preserved when calling openEditor', async () => { From 01b9e0111242eef64f87bf133358f95cc9f63349 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 2 Jul 2024 08:54:16 +0200 Subject: [PATCH 589/755] Fixes mangling issue in CI --- src/vs/platform/observable/common/wrapInReloadableClass.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/observable/common/wrapInReloadableClass.ts b/src/vs/platform/observable/common/wrapInReloadableClass.ts index bb05ee95bfb9d..cfecf902c5f7f 100644 --- a/src/vs/platform/observable/common/wrapInReloadableClass.ts +++ b/src/vs/platform/observable/common/wrapInReloadableClass.ts @@ -21,10 +21,10 @@ type Result = new (...args: TArgs) => IDisposable; class BaseClass { constructor( - protected readonly instantiationService: IInstantiationService, + public readonly instantiationService: IInstantiationService, ) { } - init(...params: any[]): void { } + public init(...params: any[]): void { } } function createWrapper(getClass: () => any, B: new (...args: T) => BaseClass) { From 3ad2eb18b5a8ffba3f2d09b9abfe0a819cf2e99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 2 Jul 2024 09:43:59 +0200 Subject: [PATCH 590/755] bump node-gyp in build/npm/gyp (#219647) --- build/npm/gyp/package.json | 2 +- build/npm/gyp/yarn.lock | 384 +++++++++++++------------------------ 2 files changed, 134 insertions(+), 252 deletions(-) diff --git a/build/npm/gyp/package.json b/build/npm/gyp/package.json index 3961e955a5f84..8f35c3c8189e4 100644 --- a/build/npm/gyp/package.json +++ b/build/npm/gyp/package.json @@ -4,7 +4,7 @@ "private": true, "license": "MIT", "devDependencies": { - "node-gyp": "^9.4.0" + "node-gyp": "^9.4.1" }, "scripts": {} } diff --git a/build/npm/gyp/yarn.lock b/build/npm/gyp/yarn.lock index 96d132e794329..b733fb26d97a3 100644 --- a/build/npm/gyp/yarn.lock +++ b/build/npm/gyp/yarn.lock @@ -2,29 +2,26 @@ # yarn lockfile v1 -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== dependencies: + "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" "@tootallnate/once@2": version "2.0.0" @@ -44,12 +41,10 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -65,23 +60,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - "aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -115,23 +93,29 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -cacache@^17.0.0: - version "17.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" - integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" lru-cache "^7.7.1" - minipass "^5.0.0" + minipass "^3.1.6" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" p-map "^4.0.0" - ssri "^10.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" tar "^6.1.11" - unique-filename "^3.0.0" + unique-filename "^2.0.0" chownr@^2.0.0: version "2.0.0" @@ -143,18 +127,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" @@ -170,47 +142,30 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@4, debug@^4.1.0, debug@^4.3.3: +debug@4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@^4.3.3: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -233,28 +188,13 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" -fs-minipass@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" - integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== - dependencies: - minipass "^5.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -274,17 +214,6 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" -glob@^10.2.2: - version "10.3.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b" - integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.0.3" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -297,6 +226,17 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + graceful-fs@^4.2.6: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -307,7 +247,7 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -http-cache-semantics@^4.1.1: +http-cache-semantics@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -353,6 +293,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -366,10 +311,13 @@ inherits@2, inherits@^2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -386,14 +334,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jackspeak@^2.0.3: - version "2.2.2" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.2.tgz#707c62733924b8dc2a0a629dc6248577788b5385" - integrity sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== lru-cache@^6.0.0: version "6.0.0" @@ -407,31 +351,27 @@ lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" - integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== - -make-fetch-happen@^11.0.3: - version "11.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" - integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-fetch "^3.0.0" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" socks-proxy-agent "^7.0.0" - ssri "^10.0.0" + ssri "^9.0.0" minimatch@^3.1.1: version "3.1.2" @@ -440,10 +380,10 @@ minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" @@ -454,12 +394,12 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" - integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== dependencies: - minipass "^5.0.0" + minipass "^3.1.6" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -486,7 +426,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -498,11 +438,6 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.2.tgz#58a82b7d81c7010da5bd4b2c0c85ac4b4ec5131e" - integrity sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA== - minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -511,7 +446,7 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^1.0.3: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -531,16 +466,16 @@ negotiator@^0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -node-gyp@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" - integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== +node-gyp@^9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^11.0.3" + make-fetch-happen "^10.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -584,18 +519,10 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" @@ -606,9 +533,9 @@ promise-retry@^2.0.1: retry "^0.12.0" readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -648,28 +575,11 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -685,21 +595,26 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" -ssri@^10.0.0: - version "10.0.4" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" - integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== dependencies: - minipass "^5.0.0" + minipass "^3.1.1" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -708,15 +623,6 @@ ssri@^10.0.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -724,20 +630,14 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - tar@^6.1.11, tar@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" @@ -750,17 +650,17 @@ tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: - unique-slug "^4.0.0" + unique-slug "^3.0.0" -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: imurmurhash "^0.1.4" @@ -769,7 +669,7 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -which@^2.0.1, which@^2.0.2: +which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -783,24 +683,6 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From 9664fa5b79065cef99322a5e82f43c3b397caa3b Mon Sep 17 00:00:00 2001 From: Ole Date: Tue, 2 Jul 2024 09:46:17 +0200 Subject: [PATCH 591/755] Refactoring: Avoid repeating all layout properties in restoreEditorViewState. This way it is easier to see what is not actually kept the same, and harder to forget to add a property when adding one. --- .../browser/viewModel/codeCellViewModel.ts | 15 +-------------- .../browser/viewModel/markupCellViewModel.ts | 6 +----- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 8ce1e7f736992..100519ae20a0d 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -359,22 +359,9 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod super.restoreEditorViewState(editorViewStates); if (totalHeight !== undefined && this._layoutInfo.layoutState !== CellLayoutState.Measured) { this._layoutInfo = { - fontInfo: this._layoutInfo.fontInfo, - chatHeight: this._layoutInfo.chatHeight, - editorHeight: this._layoutInfo.editorHeight, - editorWidth: this._layoutInfo.editorWidth, - statusBarHeight: this.layoutInfo.statusBarHeight, - commentHeight: this.layoutInfo.commentHeight, - outputContainerOffset: this._layoutInfo.outputContainerOffset, - outputTotalHeight: this._layoutInfo.outputTotalHeight, - outputShowMoreContainerHeight: this._layoutInfo.outputShowMoreContainerHeight, - outputShowMoreContainerOffset: this._layoutInfo.outputShowMoreContainerOffset, + ...this._layoutInfo, totalHeight: totalHeight, - codeIndicatorHeight: this._layoutInfo.codeIndicatorHeight, - outputIndicatorHeight: this._layoutInfo.outputIndicatorHeight, - bottomToolbarOffset: this._layoutInfo.bottomToolbarOffset, layoutState: CellLayoutState.FromCache, - estimatedHasHorizontalScrolling: this._layoutInfo.estimatedHasHorizontalScrolling }; } } diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts index ee1b0d37d9f47..345fdb1caa400 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts @@ -257,16 +257,12 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM // we might already warmup the viewport so the cell has a total height computed if (totalHeight !== undefined && this.layoutInfo.layoutState === CellLayoutState.Uninitialized) { this._layoutInfo = { - fontInfo: this._layoutInfo.fontInfo, - editorWidth: this._layoutInfo.editorWidth, - previewHeight: this._layoutInfo.previewHeight, - bottomToolbarOffset: this._layoutInfo.bottomToolbarOffset, + ...this.layoutInfo, totalHeight: totalHeight, chatHeight: this._chatHeight, editorHeight: this._editorHeight, statusBarHeight: this._statusBarHeight, layoutState: CellLayoutState.FromCache, - foldHintHeight: this._layoutInfo.foldHintHeight }; this.layoutChange({}); } From a3d69a69775e05727a09cf5e3a28f6ec58de315e Mon Sep 17 00:00:00 2001 From: Ole Date: Tue, 2 Jul 2024 09:52:41 +0200 Subject: [PATCH 592/755] Refactoring: Move the computation of the commentOffset into the cell layouting function. #214332. The cellComments should not have to know about outputs. The reason this is undesirable is that these exist only for code cells, not for markup cells - and I would like to make cellComments work for markup cells as well. --- .../workbench/contrib/notebook/browser/notebookBrowser.ts | 1 + .../notebook/browser/view/cellParts/cellComments.ts | 4 ++-- .../notebook/browser/viewModel/codeCellViewModel.ts | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index f08c5886c4276..45bc2f000a963 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -182,6 +182,7 @@ export interface CodeCellLayoutInfo { readonly editorWidth: number; readonly estimatedHasHorizontalScrolling: boolean; readonly statusBarHeight: number; + readonly commentOffset: number; readonly commentHeight: number; readonly totalHeight: number; readonly outputContainerOffset: number; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index 44e5866b04faf..5e43df877cf62 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -101,7 +101,7 @@ export class CellComments extends CellContentPart { if (!this._commentThreadWidget.value && info) { await this._createCommentTheadWidget(info.owner, info.thread); const layoutInfo = (this.currentElement as CodeCellViewModel).layoutInfo; - this.container.style.top = `${layoutInfo.outputContainerOffset + layoutInfo.outputTotalHeight}px`; + this.container.style.top = `${layoutInfo.commentOffset}px`; this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value!.getDimensions().height); return; } @@ -170,7 +170,7 @@ export class CellComments extends CellContentPart { override updateInternalLayoutNow(element: ICellViewModel): void { if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { const layoutInfo = (element as CodeCellViewModel).layoutInfo; - this.container.style.top = `${layoutInfo.outputContainerOffset + layoutInfo.outputTotalHeight}px`; + this.container.style.top = `${layoutInfo.commentOffset}px`; } } } diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 100519ae20a0d..7f6da4b52f81e 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -193,6 +193,7 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod : 0, chatHeight: 0, statusBarHeight: 0, + commentOffset: 0, commentHeight: 0, outputContainerOffset: 0, outputTotalHeight: 0, @@ -289,11 +290,12 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod editorHeight, editorWidth, statusBarHeight, - commentHeight, outputContainerOffset, outputTotalHeight, outputShowMoreContainerHeight, outputShowMoreContainerOffset, + commentOffset: outputContainerOffset + outputTotalHeight, + commentHeight, totalHeight, codeIndicatorHeight, outputIndicatorHeight, @@ -330,11 +332,12 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod editorWidth, chatHeight: chatHeight, statusBarHeight: 0, - commentHeight, outputContainerOffset, outputTotalHeight, outputShowMoreContainerHeight, outputShowMoreContainerOffset, + commentOffset: outputContainerOffset + outputTotalHeight, + commentHeight, totalHeight, codeIndicatorHeight, outputIndicatorHeight, From 0cc941e89368c9bfe35986c385349e1a1b09f73a Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 2 Jul 2024 10:09:50 +0200 Subject: [PATCH 593/755] Fixes placeholder placement issues --- .../placeholderText/browser/placeholderTextContribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts index 8ac0fc821c74b..f048991d0f9d3 100644 --- a/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts +++ b/src/vs/editor/contrib/placeholderText/browser/placeholderTextContribution.ts @@ -40,7 +40,6 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo if (!this._shouldViewBeAlive.read(reader)) { return; } const element = h('div.editorPlaceholder'); - element.root.style.top = `1px`; store.add(autorun(reader => { const data = this._state.read(reader); @@ -52,10 +51,12 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo const info = this._editorObs.layoutInfo.read(reader); element.root.style.left = `${info.contentLeft}px`; element.root.style.width = (info.contentWidth - info.verticalScrollbarWidth) + 'px'; + element.root.style.top = `${this._editor.getTopForLineNumber(0)}px`; })); store.add(autorun(reader => { element.root.style.fontFamily = this._editorObs.getOption(EditorOption.fontFamily).read(reader); element.root.style.fontSize = this._editorObs.getOption(EditorOption.fontSize).read(reader) + 'px'; + element.root.style.lineHeight = this._editorObs.getOption(EditorOption.lineHeight).read(reader) + 'px'; })); store.add(this._editorObs.createOverlayWidget({ allowEditorOverflow: false, @@ -69,7 +70,6 @@ export class PlaceholderTextContribution extends Disposable implements IEditorCo private readonly _editor: ICodeEditor, ) { super(); - this._view.recomputeInitiallyAndOnChange(this._store); } } From c2e17e233713d02bddf3c883ec6a36bb51bd27cf Mon Sep 17 00:00:00 2001 From: Ole Date: Tue, 2 Jul 2024 10:08:00 +0200 Subject: [PATCH 594/755] Refactoring: Extract shared fields of CodeCellLayoutInfo and MarkupCellLayoutInfo. #214332. Some layouting tasks, like soon layouting comments, should not have to deal with this distinction. I am extracting the fields that are already shared into an interface that other code can use without differentiating. I am not yet actually moving their computation into a separate file, as that will require some small behavior changes. --- .../notebook/browser/notebookBrowser.ts | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index 45bc2f000a963..5e6f216df8928 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -175,27 +175,36 @@ export enum CellLayoutState { Measured } -export interface CodeCellLayoutInfo { +/** LayoutInfo of the parts that are shared between all cell types. */ +export interface CellLayoutInfo { + readonly layoutState: CellLayoutState; readonly fontInfo: FontInfo | null; readonly chatHeight: number; - readonly editorHeight: number; readonly editorWidth: number; - readonly estimatedHasHorizontalScrolling: boolean; + readonly editorHeight: number; readonly statusBarHeight: number; + readonly bottomToolbarOffset: number; + readonly totalHeight: number; +} + +export interface CellLayoutChangeEvent { + readonly font?: FontInfo; + readonly outerWidth?: number; +} + +export interface CodeCellLayoutInfo extends CellLayoutInfo { + readonly estimatedHasHorizontalScrolling: boolean; readonly commentOffset: number; readonly commentHeight: number; - readonly totalHeight: number; readonly outputContainerOffset: number; readonly outputTotalHeight: number; readonly outputShowMoreContainerHeight: number; readonly outputShowMoreContainerOffset: number; - readonly bottomToolbarOffset: number; - readonly layoutState: CellLayoutState; readonly codeIndicatorHeight: number; readonly outputIndicatorHeight: number; } -export interface CodeCellLayoutChangeEvent { +export interface CodeCellLayoutChangeEvent extends CellLayoutChangeEvent { readonly source?: string; readonly chatHeight?: boolean; readonly editorHeight?: boolean; @@ -203,20 +212,10 @@ export interface CodeCellLayoutChangeEvent { readonly outputHeight?: boolean; readonly outputShowMoreContainerHeight?: number; readonly totalHeight?: boolean; - readonly outerWidth?: number; - readonly font?: FontInfo; } -export interface MarkupCellLayoutInfo { - readonly fontInfo: FontInfo | null; - readonly chatHeight: number; - readonly editorWidth: number; - readonly editorHeight: number; - readonly statusBarHeight: number; +export interface MarkupCellLayoutInfo extends CellLayoutInfo { readonly previewHeight: number; - readonly bottomToolbarOffset: number; - readonly totalHeight: number; - readonly layoutState: CellLayoutState; readonly foldHintHeight: number; } @@ -224,9 +223,7 @@ export enum CellLayoutContext { Fold } -export interface MarkupCellLayoutChangeEvent { - readonly font?: FontInfo; - readonly outerWidth?: number; +export interface MarkupCellLayoutChangeEvent extends CellLayoutChangeEvent { readonly editorHeight?: number; readonly previewHeight?: number; totalHeight?: number; @@ -242,7 +239,7 @@ export interface ICellViewModel extends IGenericCellViewModel { readonly model: NotebookCellTextModel; readonly id: string; readonly textBuffer: IReadonlyTextBuffer; - readonly layoutInfo: { totalHeight: number; bottomToolbarOffset: number; editorWidth: number; editorHeight: number; statusBarHeight: number; chatHeight: number }; + readonly layoutInfo: CellLayoutInfo; readonly onDidChangeLayout: Event; readonly onDidChangeCellStatusBarItems: Event; readonly onCellDecorationsChanged: Event<{ added: INotebookCellDecorationOptions[]; removed: INotebookCellDecorationOptions[] }>; From c77c717e90c499377b13ab98e1ccbd174e0198d7 Mon Sep 17 00:00:00 2001 From: Ole Date: Tue, 2 Jul 2024 10:31:38 +0200 Subject: [PATCH 595/755] Support comments on Markup cells. Fixes #214332. --- .../notebook/browser/notebookBrowser.ts | 7 +- .../browser/view/cellParts/cellComments.ts | 25 ++--- .../browser/viewModel/baseCellViewModel.ts | 12 ++- .../browser/viewModel/codeCellViewModel.ts | 10 -- .../browser/viewModel/markupCellViewModel.ts | 93 +++++++++++-------- 5 files changed, 76 insertions(+), 71 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index 5e6f216df8928..b0abb66c5fb3b 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -183,6 +183,8 @@ export interface CellLayoutInfo { readonly editorWidth: number; readonly editorHeight: number; readonly statusBarHeight: number; + readonly commentOffset: number; + readonly commentHeight: number; readonly bottomToolbarOffset: number; readonly totalHeight: number; } @@ -190,12 +192,11 @@ export interface CellLayoutInfo { export interface CellLayoutChangeEvent { readonly font?: FontInfo; readonly outerWidth?: number; + readonly commentHeight?: boolean; } export interface CodeCellLayoutInfo extends CellLayoutInfo { readonly estimatedHasHorizontalScrolling: boolean; - readonly commentOffset: number; - readonly commentHeight: number; readonly outputContainerOffset: number; readonly outputTotalHeight: number; readonly outputShowMoreContainerHeight: number; @@ -208,7 +209,6 @@ export interface CodeCellLayoutChangeEvent extends CellLayoutChangeEvent { readonly source?: string; readonly chatHeight?: boolean; readonly editorHeight?: boolean; - readonly commentHeight?: boolean; readonly outputHeight?: boolean; readonly outputShowMoreContainerHeight?: number; readonly totalHeight?: boolean; @@ -257,6 +257,7 @@ export interface ICellViewModel extends IGenericCellViewModel { cellKind: CellKind; lineNumbers: 'on' | 'off' | 'inherit'; chatHeight: number; + commentHeight: number; focusMode: CellFocusMode; focusedOutputId?: string | undefined; outputIsHovered: boolean; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index 5e43df877cf62..dcdd1a088604e 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -15,13 +15,11 @@ import { ICommentService } from 'vs/workbench/contrib/comments/browser/commentSe import { CommentThreadWidget } from 'vs/workbench/contrib/comments/browser/commentThreadWidget'; import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; -import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; -import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; export class CellComments extends CellContentPart { private readonly _commentThreadWidget: MutableDisposable>; - private currentElement: CodeCellViewModel | undefined; + private currentElement: ICellViewModel | undefined; private readonly _commentThreadDisposables = this._register(new DisposableStore()); constructor( @@ -49,7 +47,7 @@ export class CellComments extends CellContentPart { return; } - this.currentElement = element as CodeCellViewModel; + this.currentElement = element; await this._updateThread(); } @@ -83,7 +81,7 @@ export class CellComments extends CellContentPart { this._applyTheme(); this._commentThreadDisposables.add(this._commentThreadWidget.value.onDidResize(() => { - if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { + if (this.currentElement && this._commentThreadWidget.value) { this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value.getDimensions().height); } })); @@ -100,8 +98,7 @@ export class CellComments extends CellContentPart { const info = await this._getCommentThreadForCell(this.currentElement); if (!this._commentThreadWidget.value && info) { await this._createCommentTheadWidget(info.owner, info.thread); - const layoutInfo = (this.currentElement as CodeCellViewModel).layoutInfo; - this.container.style.top = `${layoutInfo.commentOffset}px`; + this.container.style.top = `${this.currentElement.layoutInfo.commentOffset}px`; this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value!.getDimensions().height); return; } @@ -154,23 +151,19 @@ export class CellComments extends CellContentPart { } override didRenderCell(element: ICellViewModel): void { - if (element.cellKind === CellKind.Code) { - this.initialize(element); - this._bindListeners(); - } - + this.initialize(element); + this._bindListeners(); } override prepareLayout(): void { - if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { + if (this.currentElement && this._commentThreadWidget.value) { this.currentElement.commentHeight = this._calculateCommentThreadHeight(this._commentThreadWidget.value.getDimensions().height); } } override updateInternalLayoutNow(element: ICellViewModel): void { - if (this.currentElement?.cellKind === CellKind.Code && this._commentThreadWidget.value) { - const layoutInfo = (element as CodeCellViewModel).layoutInfo; - this.container.style.top = `${layoutInfo.commentOffset}px`; + if (this.currentElement && this._commentThreadWidget.value) { + this.container.style.top = `${element.layoutInfo.commentOffset}px`; } } } diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index b0751fc5b964f..0ec9a055e1384 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -158,6 +158,16 @@ export abstract class BaseCellViewModel extends Disposable { this._onDidChangeState.fire({ outputCollapsedChanged: true }); } + protected _commentHeight = 0; + + set commentHeight(height: number) { + if (this._commentHeight === height) { + return; + } + this._commentHeight = height; + this.layoutChange({ commentHeight: true }, 'BaseCellViewModel#commentHeight'); + } + private _isDisposed = false; constructor( @@ -204,7 +214,7 @@ export abstract class BaseCellViewModel extends Disposable { abstract updateOptions(e: NotebookOptionsChangeEvent): void; abstract getHeight(lineHeight: number): number; abstract onDeselect(): void; - abstract layoutChange(change: any): void; + abstract layoutChange(change: CellLayoutChangeEvent, source?: string): void; assertTextModelAttached(): boolean { if (this.textModel && this._textEditor && this._textEditor.getModel() === this.textModel) { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 7f6da4b52f81e..3ef89aa05e30b 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -80,16 +80,6 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod return this._chatHeight; } - private _commentHeight = 0; - - set commentHeight(height: number) { - if (this._commentHeight === height) { - return; - } - this._commentHeight = height; - this.layoutChange({ commentHeight: true }, 'CodeCellViewModel#commentHeight'); - } - private _hoveringOutput: boolean = false; public get outputIsHovered(): boolean { return this._hoveringOutput; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts index 345fdb1caa400..3652f955558a6 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts @@ -134,6 +134,8 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM editorWidth: initialNotebookLayoutInfo?.width ? this.viewContext.notebookOptions.computeMarkdownCellEditorWidth(initialNotebookLayoutInfo.width) : 0, + commentOffset: 0, + commentHeight: 0, bottomToolbarOffset: bottomToolbarGap, totalHeight: 100, layoutState: CellLayoutState.Uninitialized, @@ -160,13 +162,14 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM + layoutConfiguration.markdownCellTopMargin + layoutConfiguration.markdownCellBottomMargin + bottomToolbarGap - + this._statusBarHeight; + + this._statusBarHeight + + this._commentHeight; } else { // @rebornix // On file open, the previewHeight + bottomToolbarGap for a cell out of viewport can be 0 // When it's 0, the list view will never try to render it anymore even if we scroll the cell into view. // Thus we make sure it's greater than 0 - return Math.max(1, this._previewHeight + bottomToolbarGap + foldHintHeight); + return Math.max(1, this._previewHeight + bottomToolbarGap + foldHintHeight + this._commentHeight); } } @@ -204,51 +207,59 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM } layoutChange(state: MarkupCellLayoutChangeEvent) { - // recompute - const foldHintHeight = this._computeFoldHintHeight(); + let totalHeight: number; + let foldHintHeight: number; if (!this.isInputCollapsed) { - const editorWidth = state.outerWidth !== undefined - ? this.viewContext.notebookOptions.computeMarkdownCellEditorWidth(state.outerWidth) - : this._layoutInfo.editorWidth; - const totalHeight = state.totalHeight === undefined - ? (this._layoutInfo.layoutState === CellLayoutState.Uninitialized ? 100 : this._layoutInfo.totalHeight) - : state.totalHeight; - const previewHeight = this._previewHeight; - - this._layoutInfo = { - fontInfo: state.font || this._layoutInfo.fontInfo, - editorWidth, - previewHeight, - chatHeight: this._chatHeight, - editorHeight: this._editorHeight, - statusBarHeight: this._statusBarHeight, - bottomToolbarOffset: this.viewContext.notebookOptions.computeBottomToolbarOffset(totalHeight, this.viewType), - totalHeight, - layoutState: CellLayoutState.Measured, - foldHintHeight - }; + totalHeight = state.totalHeight === undefined ? + (this._layoutInfo.layoutState === + CellLayoutState.Uninitialized ? + 100 : + this._layoutInfo.totalHeight) : + state.totalHeight; + // recompute + foldHintHeight = this._computeFoldHintHeight(); } else { - const editorWidth = state.outerWidth !== undefined - ? this.viewContext.notebookOptions.computeMarkdownCellEditorWidth(state.outerWidth) - : this._layoutInfo.editorWidth; - const totalHeight = this.viewContext.notebookOptions.computeCollapsedMarkdownCellHeight(this.viewType); - + totalHeight = + this.viewContext.notebookOptions + .computeCollapsedMarkdownCellHeight(this.viewType); state.totalHeight = totalHeight; - this._layoutInfo = { - fontInfo: state.font || this._layoutInfo.fontInfo, - editorWidth, - chatHeight: this._chatHeight, - editorHeight: this._editorHeight, - statusBarHeight: this._statusBarHeight, - previewHeight: this._previewHeight, - bottomToolbarOffset: this.viewContext.notebookOptions.computeBottomToolbarOffset(totalHeight, this.viewType), - totalHeight, - layoutState: CellLayoutState.Measured, - foldHintHeight: 0 - }; + foldHintHeight = 0; + } + let commentOffset: number; + if (this.getEditState() === CellEditState.Editing) { + const notebookLayoutConfiguration = this.viewContext.notebookOptions.getLayoutConfiguration(); + commentOffset = notebookLayoutConfiguration.editorToolbarHeight + + notebookLayoutConfiguration.cellTopMargin // CELL_TOP_MARGIN + + this._chatHeight + + this._editorHeight + + this._statusBarHeight; + } else { + commentOffset = this._previewHeight; } + this._layoutInfo = { + fontInfo: state.font || this._layoutInfo.fontInfo, + editorWidth: state.outerWidth !== undefined ? + this.viewContext.notebookOptions + .computeMarkdownCellEditorWidth(state.outerWidth) : + this._layoutInfo.editorWidth, + chatHeight: this._chatHeight, + editorHeight: this._editorHeight, + statusBarHeight: this._statusBarHeight, + previewHeight: this._previewHeight, + bottomToolbarOffset: this.viewContext.notebookOptions + .computeBottomToolbarOffset( + totalHeight, this.viewType), + totalHeight, + layoutState: CellLayoutState.Measured, + foldHintHeight, + commentOffset, + commentHeight: state.commentHeight ? + this._commentHeight : + this._layoutInfo.commentHeight, + }; + this._onDidChangeLayout.fire(state); } From 0a16d3c1be42fb7dc94db40ce292cb8e9c0f7253 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 2 Jul 2024 10:14:45 +0200 Subject: [PATCH 596/755] Allows multiple hot reload handlers to participate --- src/vs/base/common/hotReload.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/hotReload.ts b/src/vs/base/common/hotReload.ts index 94dec8e9b2f62..609fd9d8ef276 100644 --- a/src/vs/base/common/hotReload.ts +++ b/src/vs/base/common/hotReload.ts @@ -41,9 +41,23 @@ function registerGlobalHotReloadHandler() { g.$hotReload_applyNewExports = args => { const args2 = { config: { mode: undefined }, ...args }; + const results: AcceptNewExportsHandler[] = []; for (const h of hotReloadHandlers!) { const result = h(args2); - if (result) { return result; } + if (result) { + results.push(result); + } + } + if (results.length > 0) { + return newExports => { + let result = false; + for (const r of results) { + if (r(newExports)) { + result = true; + } + } + return result; + }; } return undefined; }; From ad50f01dc1823838d14c608094d4fac2555d7995 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 2 Jul 2024 10:17:19 +0200 Subject: [PATCH 597/755] Enables advanced hot reloading in monaco playground server. --- scripts/playground-server.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/playground-server.ts b/scripts/playground-server.ts index 1e8479a2d1f7d..474f83def861f 100644 --- a/scripts/playground-server.ts +++ b/scripts/playground-server.ts @@ -235,13 +235,15 @@ function handleGetFileChangesRequest(watcher: DirWatcher, fileServer: FileServer function makeLoaderJsHotReloadable(loaderJsCode: string, fileChangesUrl: URL): string { loaderJsCode = loaderJsCode.replace( /constructor\(env, scriptLoader, defineFunc, requireFunc, loaderAvailableTimestamp = 0\) {/, - '$&globalThis.___globalModuleManager = this;' + '$&globalThis.___globalModuleManager = this; globalThis.vscode = { process: { env: { VSCODE_DEV: true } } }' ); const ___globalModuleManager: any = undefined; // This code will be appended to loader.js function $watchChanges(fileChangesUrl: string) { + interface HotReloadConfig { } + let reloadFn; if (globalThis.$sendMessageToParent) { reloadFn = () => globalThis.$sendMessageToParent({ kind: 'reload' }); @@ -345,7 +347,7 @@ function makeLoaderJsHotReloadable(loaderJsCode: string, fileChangesUrl: URL): s } // Check if we can reload - const g: GlobalThisAddition = globalThis as any; + const g = globalThis as any; // A frozen copy of the previous exports const oldExports = Object.freeze({ ...oldModule.exports }); From b5c96d96cae43331e6a4be14ea7b7063bbcaf495 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 Jul 2024 11:09:55 +0200 Subject: [PATCH 598/755] debt - remove `defaultImplicitVariables` from agents and remove variable resolvers for inline chat (editor, notebook) (#219659) --- .../browser/chatParticipantContributions.ts | 1 - .../contrib/chat/common/chatAgents.ts | 2 - .../contrib/chat/common/chatServiceImpl.ts | 18 +------ .../browser/inlineChatSessionServiceImpl.ts | 50 ++----------------- .../chat/notebook.chat.contribution.ts | 20 -------- 5 files changed, 4 insertions(+), 87 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts b/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts index 33c619735331d..a1c6d7a732d09 100644 --- a/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatParticipantContributions.ts @@ -239,7 +239,6 @@ export class ChatExtensionPointHandler implements IWorkbenchContribution { name: providerDescriptor.name, fullName: providerDescriptor.fullName, isDefault: providerDescriptor.isDefault, - defaultImplicitVariables: providerDescriptor.defaultImplicitVariables, locations: isNonEmptyArray(providerDescriptor.locations) ? providerDescriptor.locations.map(ChatAgentLocation.fromRaw) : [ChatAgentLocation.Panel], diff --git a/src/vs/workbench/contrib/chat/common/chatAgents.ts b/src/vs/workbench/contrib/chat/common/chatAgents.ts index a3c9016944be7..08d7013d770b0 100644 --- a/src/vs/workbench/contrib/chat/common/chatAgents.ts +++ b/src/vs/workbench/contrib/chat/common/chatAgents.ts @@ -73,7 +73,6 @@ export interface IChatAgentData { isDynamic?: boolean; metadata: IChatAgentMetadata; slashCommands: IChatAgentCommand[]; - defaultImplicitVariables?: string[]; locations: ChatAgentLocation[]; } @@ -397,7 +396,6 @@ export class MergedChatAgent implements IChatAgent { get isDefault(): boolean | undefined { return this.data.isDefault; } get metadata(): IChatAgentMetadata { return this.data.metadata; } get slashCommands(): IChatAgentCommand[] { return this.data.slashCommands; } - get defaultImplicitVariables(): string[] | undefined { return this.data.defaultImplicitVariables; } get locations(): ChatAgentLocation[] { return this.data.locations; } async invoke(request: IChatAgentRequest, progress: (part: IChatProgress) => void, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { diff --git a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts index f0a503c2c0bf5..b18e59ac6b404 100644 --- a/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatServiceImpl.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { coalesce } from 'vs/base/common/arrays'; import { DeferredPromise } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -23,7 +22,7 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ChatAgentLocation, IChatAgent, IChatAgentRequest, IChatAgentResult, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { ChatModel, ChatRequestModel, ChatRequestRemovalReason, ChatWelcomeMessageModel, IChatModel, IChatRequestModel, IChatRequestVariableData, IChatRequestVariableEntry, IChatResponseModel, IExportableChatData, ISerializableChatData, ISerializableChatsData, getHistoryEntriesFromModel, updateRanges } from 'vs/workbench/contrib/chat/common/chatModel'; +import { ChatModel, ChatRequestModel, ChatRequestRemovalReason, ChatWelcomeMessageModel, IChatModel, IChatRequestModel, IChatRequestVariableData, IChatResponseModel, IExportableChatData, ISerializableChatData, ISerializableChatsData, getHistoryEntriesFromModel, updateRanges } from 'vs/workbench/contrib/chat/common/chatModel'; import { ChatRequestAgentPart, ChatRequestAgentSubcommandPart, ChatRequestSlashCommandPart, IParsedChatRequest, chatAgentLeader, chatSubcommandLeader, getPromptText } from 'vs/workbench/contrib/chat/common/chatParserTypes'; import { ChatRequestParser } from 'vs/workbench/contrib/chat/common/chatRequestParser'; import { IChatCompleteResponse, IChatDetail, IChatFollowup, IChatProgress, IChatSendRequestData, IChatSendRequestOptions, IChatSendRequestResponseState, IChatService, IChatTransferredSessionData, IChatUserActionEvent } from 'vs/workbench/contrib/chat/common/chatService'; @@ -485,21 +484,6 @@ export class ChatService extends Disposable implements IChatService { const promptTextResult = getPromptText(request.message); const updatedVariableData = updateRanges(variableData, promptTextResult.diff); // TODO bit of a hack - // TODO- should figure out how to get rid of implicit variables for inline chat - const implicitVariablesEnabled = (location === ChatAgentLocation.Editor || location === ChatAgentLocation.Notebook); - if (implicitVariablesEnabled) { - const implicitVariables = agent.defaultImplicitVariables; - if (implicitVariables) { - const resolvedImplicitVariables = await Promise.all(implicitVariables.map(async v => { - const id = this.chatVariablesService.getVariable(v)?.id ?? ''; - const value = await this.chatVariablesService.resolveVariable(v, parsedRequest.text, model, progressCallback, token); - return value ? { id, name: v, value } satisfies IChatRequestVariableEntry : - undefined; - })); - updatedVariableData.variables.push(...coalesce(resolvedImplicitVariables)); - } - } - const requestProps: IChatAgentRequest = { sessionId, requestId: request.id, diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts index e77461a562ca0..44aecd6d917d0 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.ts @@ -10,7 +10,7 @@ import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IRange, Range } from 'vs/editor/common/core/range'; +import { Range } from 'vs/editor/common/core/range'; import { IValidEditOperation } from 'vs/editor/common/model'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; @@ -27,8 +27,6 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput'; import { EmptyResponse, ErrorResponse, HunkData, ReplyResponse, Session, SessionExchange, SessionWholeRange, StashedSession, TelemetryData, TelemetryDataClassification } from './inlineChatSession'; import { IInlineChatSessionEndEvent, IInlineChatSessionEvent, IInlineChatSessionService, ISessionKeyComputer, Recording } from './inlineChatSessionService'; -import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; -import { ISelection } from 'vs/editor/common/core/selection'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -46,19 +44,6 @@ export class InlineChatError extends Error { } } -const _inlineChatContext = '_inlineChatContext'; -const _inlineChatDocument = '_inlineChatDocument'; - -class InlineChatContext { - - static readonly variableName = '_inlineChatContext'; - - constructor( - readonly uri: URI, - readonly selection: ISelection, - readonly wholeRange: IRange, - ) { } -} export class InlineChatSessionServiceImpl implements IInlineChatSessionService { @@ -92,37 +77,8 @@ export class InlineChatSessionServiceImpl implements IInlineChatSessionService { @IInstantiationService private readonly _instaService: IInstantiationService, @IEditorService private readonly _editorService: IEditorService, @IChatService private readonly _chatService: IChatService, - @IChatAgentService private readonly _chatAgentService: IChatAgentService, - @IChatVariablesService chatVariableService: IChatVariablesService, - ) { - - - // MARK: implicit variable for editor selection and (tracked) whole range - - this._store.add(chatVariableService.registerVariable( - { id: _inlineChatContext, name: _inlineChatContext, description: '', hidden: true }, - async (_message, _arg, model) => { - for (const [, data] of this._sessions) { - if (data.session.chatModel === model) { - return JSON.stringify(new InlineChatContext(data.session.textModelN.uri, data.editor.getSelection()!, data.session.wholeRange.trackedInitialRange)); - } - } - return undefined; - } - )); - this._store.add(chatVariableService.registerVariable( - { id: _inlineChatDocument, name: _inlineChatDocument, description: '', hidden: true }, - async (_message, _arg, model) => { - for (const [, data] of this._sessions) { - if (data.session.chatModel === model) { - return data.session.textModelN.uri; - } - } - return undefined; - } - )); - - } + @IChatAgentService private readonly _chatAgentService: IChatAgentService + ) { } dispose() { this._store.dispose(); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts index 0460f9e57da49..d642cbdcda90a 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.ts @@ -7,11 +7,8 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from 'vs/workbench/common/contributions'; import { ChatAgentLocation, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents'; -import { IChatVariablesService } from 'vs/workbench/contrib/chat/common/chatVariables'; import 'vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions'; import { CTX_NOTEBOOK_CHAT_HAS_AGENT } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext'; -import { NotebookChatController } from 'vs/workbench/contrib/notebook/browser/controller/chat/notebookChatController'; -import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; class NotebookChatContribution extends Disposable implements IWorkbenchContribution { @@ -20,28 +17,11 @@ class NotebookChatContribution extends Disposable implements IWorkbenchContribut private readonly _ctxHasProvider: IContextKey; constructor( - @IChatVariablesService private readonly _chatVariableService: IChatVariablesService, - @INotebookEditorService private readonly _notebookEditorService: INotebookEditorService, @IContextKeyService contextKeyService: IContextKeyService, @IChatAgentService chatAgentService: IChatAgentService ) { super(); - this._register(this._chatVariableService.registerVariable( - { id: '_notebookChatInput', name: '_notebookChatInput', description: '', hidden: true }, - async (_message, _arg, model) => { - const editors = this._notebookEditorService.listNotebookEditors(); - for (const editor of editors) { - const chatController = editor.getContribution(NotebookChatController.id) as NotebookChatController | undefined; - if (chatController?.hasSession(model)) { - return chatController.getSessionInputUri(); - } - } - - return undefined; - } - )); - this._ctxHasProvider = CTX_NOTEBOOK_CHAT_HAS_AGENT.bindTo(contextKeyService); const updateNotebookAgentStatus = () => { From 4fb0b152981e862eea6d6cc45345298d36a2b256 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:10:11 +0200 Subject: [PATCH 599/755] Fix issue with clicking between active tabs (#219651) * fix #213160 * cleanup * :lipstick: --- .../browser/parts/editor/multiEditorTabsControl.ts | 13 +++++++++++++ .../common/editor/filteredEditorGroupModel.ts | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts index 36a087361f5af..4ea2a840df499 100644 --- a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts +++ b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts @@ -684,7 +684,20 @@ export class MultiEditorTabsControl extends EditorTabsControl { this.layout(this.dimensions, { forceRevealActiveTab: true }); } + private previousSelectedCount = 0; updateEditorSelections(): void { + // We only need to redraw from here when a selection got removed + // otherwise it will be handled by the open editor change event. + // Checking count is currently enough but might require checking + // each editor in the future if selection is changed programatically. + const newSelectedCount = this.tabsModel.selectedEditors.length; + const previousSelectedCount = this.previousSelectedCount; + this.previousSelectedCount = newSelectedCount; + + if (newSelectedCount >= previousSelectedCount) { + return; + } + this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => { this.redrawTabSelectedActiveAndDirty(this.groupsView.activeGroup === this.groupView, editor, tabContainer, tabActionBar); }); diff --git a/src/vs/workbench/common/editor/filteredEditorGroupModel.ts b/src/vs/workbench/common/editor/filteredEditorGroupModel.ts index b872c92677b01..61d4f6a7c8009 100644 --- a/src/vs/workbench/common/editor/filteredEditorGroupModel.ts +++ b/src/vs/workbench/common/editor/filteredEditorGroupModel.ts @@ -36,7 +36,7 @@ abstract class FilteredEditorGroupModel extends Disposable implements IReadonlyE get activeEditor(): EditorInput | null { return this.model.activeEditor && this.filter(this.model.activeEditor) ? this.model.activeEditor : null; } get previewEditor(): EditorInput | null { return this.model.previewEditor && this.filter(this.model.previewEditor) ? this.model.previewEditor : null; } - get selectedEditors(): EditorInput[] { throw new Error('Filtered Editor Group Model should not be used for selectedEditors'); } + get selectedEditors(): EditorInput[] { return this.model.selectedEditors.filter(e => this.filter(e)); } isPinned(editorOrIndex: EditorInput | number): boolean { return this.model.isPinned(editorOrIndex); } isTransient(editorOrIndex: EditorInput | number): boolean { return this.model.isTransient(editorOrIndex); } From c1f025d79f4ae4232aae4ed9f23adb6b5eebc94b Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:13:39 +0200 Subject: [PATCH 600/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20use=20editor?= =?UTF-8?q?=20placeholder=20instead=20of=20custom=20solution=20(#219662)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/scm/browser/media/scm.css | 20 ++------- .../contrib/scm/browser/scmViewPane.ts | 45 +++++++------------ 2 files changed, 19 insertions(+), 46 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css index 7b94eac418752..288452b11c06b 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm.css +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -492,22 +492,6 @@ margin-top: 1px; } -.scm-view .scm-editor-placeholder { - position: absolute; - pointer-events: none; - z-index: 1; - padding: 2px 6px; - box-sizing: border-box; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: var(--vscode-input-placeholderForeground); -} - -.scm-view .scm-editor-placeholder.hidden { - display: none; -} - .scm-view .scm-editor-container .monaco-editor-background, .scm-view .scm-editor-container .monaco-editor, .scm-view .scm-editor-container .monaco-editor .margin, @@ -522,6 +506,10 @@ color: var(--vscode-input-foreground); } +.scm-view .scm-editor-container .placeholder-text.mtk1 { + color: var(--vscode-input-placeholderForeground); +} + /* Repositories */ .scm-repositories-view .scm-provider { diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 028ef92e15936..e969b6a0e0936 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -110,6 +110,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { autorun } from 'vs/base/common/observable'; import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { renderSCMHistoryItemGraph, toISCMHistoryItemViewModelArray } from 'vs/workbench/contrib/scm/browser/scmHistory'; +import { PlaceholderTextContribution } from 'vs/editor/contrib/placeholderText/browser/placeholderTextContribution'; // type SCMResourceTreeNode = IResourceNode; // type SCMHistoryItemChangeResourceTreeNode = IResourceNode; @@ -2338,7 +2339,6 @@ class SCMInputWidget { private element: HTMLElement; private editorContainer: HTMLElement; - private placeholderTextContainer: HTMLElement; private readonly inputEditor: CodeEditorWidget; private readonly inputEditorOptions: SCMInputWidgetEditorOptions; private toolbarContainer: HTMLElement; @@ -2429,14 +2429,11 @@ class SCMInputWidget { this.repositoryDisposables.add(input.onDidChangeValidationMessage((e) => this.setValidation(e, { focus: true, timeout: true }))); this.repositoryDisposables.add(input.onDidChangeValidateInput((e) => triggerValidation())); - // Keep API in sync with model, update placeholder visibility and validate - const updatePlaceholderVisibility = () => this.placeholderTextContainer.classList.toggle('hidden', textModel.getValueLength() > 0); + // Keep API in sync with model and validate this.repositoryDisposables.add(textModel.onDidChangeContent(() => { input.setValue(textModel.getValue(), true); - updatePlaceholderVisibility(); triggerValidation(); })); - updatePlaceholderVisibility(); // Update placeholder text const updatePlaceholderText = () => { @@ -2444,8 +2441,7 @@ class SCMInputWidget { const label = binding ? binding.getLabel() : (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter'); const placeholderText = format(input.placeholder, label); - this.inputEditor.updateOptions({ ariaLabel: placeholderText }); - this.placeholderTextContainer.textContent = placeholderText; + this.inputEditor.updateOptions({ placeholder: placeholderText }); }; this.repositoryDisposables.add(input.onDidChangePlaceholder(updatePlaceholderText)); this.repositoryDisposables.add(this.keybindingService.onDidUpdateKeybindings(updatePlaceholderText)); @@ -2526,7 +2522,6 @@ class SCMInputWidget { ) { this.element = append(container, $('.scm-editor')); this.editorContainer = append(this.element, $('.scm-editor-container')); - this.placeholderTextContainer = append(this.editorContainer, $('.scm-editor-placeholder')); this.toolbarContainer = append(this.element, $('.scm-editor-toolbar')); this.contextKeyService = contextKeyService.createScoped(this.element); @@ -2536,33 +2531,32 @@ class SCMInputWidget { this.disposables.add(this.inputEditorOptions.onDidChange(this.onDidChangeEditorOptions, this)); this.disposables.add(this.inputEditorOptions); - const editorConstructionOptions = this.inputEditorOptions.getEditorConstructionOptions(); - this.setPlaceholderFontStyles(editorConstructionOptions.fontFamily!, editorConstructionOptions.fontSize!, editorConstructionOptions.lineHeight!); - const codeEditorWidgetOptions: ICodeEditorWidgetOptions = { - isSimpleWidget: true, contributions: EditorExtensionsRegistry.getSomeEditorContributions([ + CodeActionController.ID, ColorDetector.ID, ContextMenuController.ID, - DragAndDropController.ID, CopyPasteController.ID, + DragAndDropController.ID, DropIntoEditorController.ID, + EditorDictation.ID, + FormatOnType.ID, + HoverController.ID, + InlineCompletionsController.ID, LinkDetector.ID, MenuPreventer.ID, MessageController.ID, - HoverController.ID, + PlaceholderTextContribution.ID, SelectionClipboardContributionID, SnippetController2.ID, - SuggestController.ID, - InlineCompletionsController.ID, - CodeActionController.ID, - FormatOnType.ID, - EditorDictation.ID, - ]) + SuggestController.ID + ]), + isSimpleWidget: true }; const services = new ServiceCollection([IContextKeyService, this.contextKeyService]); const instantiationService2 = instantiationService.createChild(services, this.disposables); + const editorConstructionOptions = this.inputEditorOptions.getEditorConstructionOptions(); this.inputEditor = instantiationService2.createInstance(CodeEditorWidget, this.editorContainer, editorConstructionOptions, codeEditorWidgetOptions); this.disposables.add(this.inputEditor); @@ -2652,7 +2646,6 @@ class SCMInputWidget { this.lastLayoutWasTrash = false; this.inputEditor.layout(dimension); - this.placeholderTextContainer.style.width = `${dimension.width}px`; this.renderValidation(); const showInputActionButton = this.configurationService.getValue('scm.showInputActionButton') === true; @@ -2680,10 +2673,7 @@ class SCMInputWidget { } private onDidChangeEditorOptions(): void { - const editorOptions = this.inputEditorOptions.getEditorOptions(); - - this.inputEditor.updateOptions(editorOptions); - this.setPlaceholderFontStyles(editorOptions.fontFamily!, editorOptions.fontSize!, editorOptions.lineHeight!); + this.inputEditor.updateOptions(this.inputEditorOptions.getEditorOptions()); } private renderValidation(): void { @@ -2773,11 +2763,6 @@ class SCMInputWidget { 26 /* 22px action + 4px margin */ : 39 /* 35px action + 4px margin */; } - private setPlaceholderFontStyles(fontFamily: string, fontSize: number, lineHeight: number): void { - this.placeholderTextContainer.style.fontFamily = fontFamily; - this.placeholderTextContainer.style.fontSize = `${fontSize}px`; - this.placeholderTextContainer.style.lineHeight = `${lineHeight}px`; - } clearValidation(): void { this.validationContextView?.close(); From c57f7bbe783b56ec009c263e01c23b767a37f9e1 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:33:13 +0200 Subject: [PATCH 601/755] fixes #213334 (#219669) fixes 213334 --- src/vs/workbench/browser/contextkeys.ts | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/browser/contextkeys.ts b/src/vs/workbench/browser/contextkeys.ts index c22caa967b32d..ccfe454ba34e4 100644 --- a/src/vs/workbench/browser/contextkeys.ts +++ b/src/vs/workbench/browser/contextkeys.ts @@ -203,17 +203,16 @@ export class WorkbenchContextKeysHandler extends Disposable { private registerListeners(): void { this.editorGroupService.whenReady.then(() => { this.updateEditorAreaContextKeys(); - this.updateEditorGroupContextKeys(); + this.updateActiveEditorGroupContextKeys(); this.updateVisiblePanesContextKeys(); }); - this._register(this.editorService.onDidActiveEditorChange(() => this.updateEditorGroupContextKeys())); + this._register(this.editorService.onDidActiveEditorChange(() => this.updateActiveEditorGroupContextKeys())); this._register(this.editorService.onDidVisibleEditorsChange(() => this.updateVisiblePanesContextKeys())); - this._register(this.editorGroupService.onDidAddGroup(() => this.updateEditorGroupContextKeys())); - this._register(this.editorGroupService.onDidRemoveGroup(() => this.updateEditorGroupContextKeys())); - this._register(this.editorGroupService.onDidChangeGroupIndex(() => this.updateEditorGroupContextKeys())); - this._register(this.editorGroupService.onDidChangeActiveGroup(() => this.updateEditorGroupsContextKeys())); - this._register(this.editorGroupService.onDidChangeGroupLocked(() => this.updateEditorGroupsContextKeys())); + this._register(this.editorGroupService.onDidAddGroup(() => this.updateEditorGroupsContextKeys())); + this._register(this.editorGroupService.onDidRemoveGroup(() => this.updateEditorGroupsContextKeys())); + this._register(this.editorGroupService.onDidChangeGroupIndex(() => this.updateActiveEditorGroupContextKeys())); + this._register(this.editorGroupService.onDidChangeGroupLocked(() => this.updateActiveEditorGroupContextKeys())); this._register(this.editorGroupService.onDidChangeEditorPartOptions(() => this.updateEditorAreaContextKeys())); @@ -266,16 +265,25 @@ export class WorkbenchContextKeysHandler extends Disposable { } } - private updateEditorGroupContextKeys(): void { + // Context keys depending on the state of the editor group itself + private updateActiveEditorGroupContextKeys(): void { + console.log('active group'); if (!this.editorService.activeEditor) { this.activeEditorGroupEmpty.set(true); } else { this.activeEditorGroupEmpty.reset(); } + + const activeGroup = this.editorGroupService.activeGroup; + this.activeEditorGroupIndex.set(activeGroup.index + 1); // not zero-indexed + this.activeEditorGroupLocked.set(activeGroup.isLocked); + this.updateEditorGroupsContextKeys(); } + // Context keys depending on the state of other editor groups private updateEditorGroupsContextKeys(): void { + console.log('all groups'); const groupCount = this.editorGroupService.count; if (groupCount > 1) { this.multipleEditorGroupsContext.set(true); @@ -284,9 +292,7 @@ export class WorkbenchContextKeysHandler extends Disposable { } const activeGroup = this.editorGroupService.activeGroup; - this.activeEditorGroupIndex.set(activeGroup.index + 1); // not zero-indexed this.activeEditorGroupLast.set(activeGroup.index === groupCount - 1); - this.activeEditorGroupLocked.set(activeGroup.isLocked); } private updateEditorAreaContextKeys(): void { From c395df82fbfeb1809fa6c72e00747a9b5ee00292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 2 Jul 2024 13:56:24 +0200 Subject: [PATCH 602/755] bump node-gyp once again --- build/npm/gyp/package.json | 2 +- build/npm/gyp/yarn.lock | 631 +++++++++++++++++-------------------- 2 files changed, 298 insertions(+), 335 deletions(-) diff --git a/build/npm/gyp/package.json b/build/npm/gyp/package.json index 8f35c3c8189e4..a1564133a1eef 100644 --- a/build/npm/gyp/package.json +++ b/build/npm/gyp/package.json @@ -4,7 +4,7 @@ "private": true, "license": "MIT", "devDependencies": { - "node-gyp": "^9.4.1" + "node-gyp": "^10.1.0" }, "scripts": {} } diff --git a/build/npm/gyp/yarn.lock b/build/npm/gyp/yarn.lock index b733fb26d97a3..a9bf901727e69 100644 --- a/build/npm/gyp/yarn.lock +++ b/build/npm/gyp/yarn.lock @@ -2,50 +2,52 @@ # yarn lockfile v1 -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/fs@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@tootallnate/once@2": +abbrev@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== dependencies: - debug "4" - -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" + debug "^4.3.4" aggregate-error@^3.0.0: version "3.1.0" @@ -60,32 +62,28 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" @@ -93,29 +91,23 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" +cacache@^18.0.0: + version "18.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.3.tgz#864e2c18414e1e141ae8763f31e46c2cb96d1b21" + integrity sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" + ssri "^10.0.0" tar "^6.1.11" - unique-filename "^2.0.0" + unique-filename "^3.0.0" chownr@^2.0.0: version "2.0.0" @@ -127,20 +119,26 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" debug@4: version "4.3.4" @@ -149,23 +147,28 @@ debug@4: dependencies: ms "2.1.2" -debug@^4.3.3: +debug@^4.3.4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -188,94 +191,66 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -fs-minipass@^2.0.0, fs-minipass@^2.1.0: +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" + minipass "^7.0.3" -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^10.2.2, glob@^10.3.10: + version "10.4.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" + integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" graceful-fs@^4.2.6: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -http-cache-semantics@^4.1.0: +http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" + agent-base "^7.1.0" + debug "^4.3.4" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== +https-proxy-agent@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: - agent-base "6" + agent-base "^7.0.2" debug "4" -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -293,24 +268,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - ip-address@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" @@ -334,11 +291,30 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== +lru-cache@^10.0.1, lru-cache@^10.2.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" + integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -346,60 +322,44 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.7.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -make-fetch-happen@^10.0.3: - version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" +make-fetch-happen@^13.0.0: + version "13.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" + minipass "^7.0.2" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" + proc-log "^4.2.0" promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^9.0.0" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" + ssri "^10.0.0" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== dependencies: - minipass "^3.0.0" + minipass "^7.0.3" -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== dependencies: - minipass "^3.1.6" + minipass "^7.0.3" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -426,7 +386,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: +minipass@^3.0.0: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -438,6 +398,11 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -446,7 +411,7 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -456,56 +421,33 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -node-gyp@^9.4.1: - version "9.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" - integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== +node-gyp@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.1.0.tgz#75e6f223f2acb4026866c26a2ead6aab75a8ca7e" + integrity sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" - glob "^7.1.4" + glob "^10.3.10" graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^3.0.0" semver "^7.3.5" tar "^6.1.2" - which "^2.0.2" - -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" + which "^4.0.0" -npmlog@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== +nopt@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" + abbrev "^2.0.0" p-map@^4.0.0: version "4.0.0" @@ -514,15 +456,33 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== promise-retry@^2.0.1: version "2.0.1" @@ -532,32 +492,11 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -570,31 +509,38 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -set-blocking@^2.0.0: +shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" -signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== +socks-proxy-agent@^8.0.3: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.8.3" -socks@^2.6.2: +socks@^2.8.3: version "2.8.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== @@ -607,14 +553,14 @@ sprintf-js@^1.1.3: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== -ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== +ssri@^10.0.0: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== dependencies: - minipass "^3.1.1" + minipass "^7.0.3" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -623,14 +569,16 @@ ssri@^9.0.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - safe-buffer "~5.2.0" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -638,6 +586,13 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + tar@^6.1.11, tar@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" @@ -650,43 +605,51 @@ tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== dependencies: - unique-slug "^3.0.0" + unique-slug "^4.0.0" -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== dependencies: imurmurhash "^0.1.4" -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - string-width "^1.0.2 || 2 || 3 || 4" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" yallist@^4.0.0: version "4.0.0" From 3c7cbd264e4313f236dbbad13303da54c23582d9 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 2 Jul 2024 14:50:50 +0200 Subject: [PATCH 603/755] Git - include unstaged changes when amending a commit and smart commit is enabled (#219675) --- extensions/git/src/commands.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index a5325033e778b..fb53eee29767b 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2104,7 +2104,7 @@ export class CommandCenter { } // no changes, and the user has not configured to commit all in this case - if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) { + if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all && !opts.amend) { const suggestSmartCommit = config.get('suggestSmartCommit') === true; if (!suggestSmartCommit) { @@ -2128,10 +2128,9 @@ export class CommandCenter { } } - if (opts.all === undefined) { + // smart commit + if (enableSmartCommit && !opts.all) { opts = { ...opts, all: noStagedChanges }; - } else if (!opts.all && noStagedChanges) { - opts = { ...opts, all: true }; } } From 48e40d3c8e551bfe82aa7f02e84f5cd26c035c9a Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:32:59 +0200 Subject: [PATCH 604/755] =?UTF-8?q?SCM=20-=20=F0=9F=92=84=20adopt=20observ?= =?UTF-8?q?able=20in=20working=20sets=20(#219701)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/scm/browser/workingSet.ts | 90 +++++++++---------- 1 file changed, 41 insertions(+), 49 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/workingSet.ts b/src/vs/workbench/contrib/scm/browser/workingSet.ts index 3a023470ea207..274bd713910da 100644 --- a/src/vs/workbench/contrib/scm/browser/workingSet.ts +++ b/src/vs/workbench/contrib/scm/browser/workingSet.ts @@ -3,9 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event } from 'vs/base/common/event'; -import { DisposableMap, DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableMap, DisposableStore } from 'vs/base/common/lifecycle'; +import { autorun, autorunWithStore } from 'vs/base/common/observable'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { observableConfigValue } from 'vs/platform/observable/common/platformObservableUtils'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { getProviderKey } from 'vs/workbench/contrib/scm/browser/util'; @@ -24,13 +25,13 @@ interface ISCMRepositoryWorkingSet { readonly editorWorkingSets: Map; } -export class SCMWorkingSetController implements IWorkbenchContribution { +export class SCMWorkingSetController extends Disposable implements IWorkbenchContribution { static readonly ID = 'workbench.contrib.scmWorkingSets'; private _workingSets!: Map; + private _enabledConfig = observableConfigValue('scm.workingSets.enabled', false, this.configurationService); + private readonly _repositoryDisposables = new DisposableMap(); - private readonly _scmServiceDisposables = new DisposableStore(); - private readonly _disposables = new DisposableStore(); constructor( @IConfigurationService private readonly configurationService: IConfigurationService, @@ -39,69 +40,61 @@ export class SCMWorkingSetController implements IWorkbenchContribution { @IStorageService private readonly storageService: IStorageService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService ) { - const onDidChangeConfiguration = Event.filter(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('scm.workingSets.enabled'), this._disposables); - this._disposables.add(Event.runAndSubscribe(onDidChangeConfiguration, () => this._onDidChangeConfiguration())); - } - - private _onDidChangeConfiguration(): void { - if (!this.configurationService.getValue('scm.workingSets.enabled')) { - this.storageService.remove('scm.workingSets', StorageScope.WORKSPACE); + super(); - this._scmServiceDisposables.clear(); - this._repositoryDisposables.clearAndDisposeAll(); - - return; - } + this._store.add(autorunWithStore((reader, store) => { + if (!this._enabledConfig.read(reader)) { + this.storageService.remove('scm.workingSets', StorageScope.WORKSPACE); + this._repositoryDisposables.clearAndDisposeAll(); + return; + } - this._workingSets = this._loadWorkingSets(); + this._workingSets = this._loadWorkingSets(); - this.scmService.onDidAddRepository(this._onDidAddRepository, this, this._scmServiceDisposables); - this.scmService.onDidRemoveRepository(this._onDidRemoveRepository, this, this._scmServiceDisposables); + this.scmService.onDidAddRepository(this._onDidAddRepository, this, store); + this.scmService.onDidRemoveRepository(this._onDidRemoveRepository, this, store); - for (const repository of this.scmService.repositories) { - this._onDidAddRepository(repository); - } + for (const repository of this.scmService.repositories) { + this._onDidAddRepository(repository); + } + })); } private _onDidAddRepository(repository: ISCMRepository): void { const disposables = new DisposableStore(); - disposables.add(Event.runAndSubscribe(repository.provider.onDidChangeHistoryProvider, () => { - if (!repository.provider.historyProvider) { + disposables.add(autorun(async reader => { + const historyProvider = repository.provider.historyProviderObs.read(reader); + const currentHistoryItemGroupId = historyProvider?.currentHistoryItemGroupObs.read(reader)?.id; + + if (!currentHistoryItemGroupId) { return; } - disposables.add(Event.runAndSubscribe(repository.provider.historyProvider.onDidChangeCurrentHistoryItemGroup, async () => { - if (!repository.provider.historyProvider?.currentHistoryItemGroup?.id) { - return; - } - - const providerKey = getProviderKey(repository.provider); - const currentHistoryItemGroupId = repository.provider.historyProvider.currentHistoryItemGroup.id; - const repositoryWorkingSets = this._workingSets.get(providerKey); + const providerKey = getProviderKey(repository.provider); + const repositoryWorkingSets = this._workingSets.get(providerKey); - if (!repositoryWorkingSets) { - this._workingSets.set(providerKey, { currentHistoryItemGroupId, editorWorkingSets: new Map() }); - return; - } + if (!repositoryWorkingSets) { + this._workingSets.set(providerKey, { currentHistoryItemGroupId, editorWorkingSets: new Map() }); + return; + } - if (repositoryWorkingSets.currentHistoryItemGroupId === currentHistoryItemGroupId) { - return; - } + // Editors for the current working set are automatically restored + if (repositoryWorkingSets.currentHistoryItemGroupId === currentHistoryItemGroupId) { + return; + } - // Save the working set - this._saveWorkingSet(providerKey, currentHistoryItemGroupId, repositoryWorkingSets); + // Save the working set + this._saveWorkingSet(providerKey, currentHistoryItemGroupId, repositoryWorkingSets); - // Restore the working set - await this._restoreWorkingSet(providerKey, currentHistoryItemGroupId); - })); + // Restore the working set + await this._restoreWorkingSet(providerKey, currentHistoryItemGroupId); })); this._repositoryDisposables.set(repository, disposables); } private _onDidRemoveRepository(repository: ISCMRepository): void { - this._workingSets.delete(getProviderKey(repository.provider)); this._repositoryDisposables.deleteAndDispose(repository); } @@ -159,9 +152,8 @@ export class SCMWorkingSetController implements IWorkbenchContribution { } } - dispose(): void { + override dispose(): void { this._repositoryDisposables.dispose(); - this._scmServiceDisposables.dispose(); - this._disposables.dispose(); + super.dispose(); } } From cacaccb42fc85c8622c444c6ff4da2f1e8c3211a Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 2 Jul 2024 08:56:00 -0700 Subject: [PATCH 605/755] net: gracefully disconnect better from remote (#218972) * net: gracefully disconnect better from remote This adds in a step to gracefully disconnect (send a "disconnect" message and then await the flush) before closing the workbench. In some cases, like Remote - SSH, sending messages is more async than others. In the exec server connection we handle a `zlib.flate` stream to compress data to and from the VS Code server, and its API is asynchronous, so this lets us ensure the stream is drained before giving the go-ahead to close up shop This lifecycle phase is a little awkward and I ended it putting it directly in the lifecycle service: we don't want to do this in `onWillShutdown` because some contributions want to save data to the remote workspace, and if shutdown is vetoed it would leave a broken state. But `onDidShutdown` is synchronous and already depended upon by several other points, and changing that also felt a bit risky. cc @alexdima Refs #211462, will require some small adoption in Remote - SSH to close. * undo unrelated change * add priority to joiners * some cleanup * cleanup * tweaks * `runWithFakedTimers` * comment * :lipstick: --------- Co-authored-by: Benjamin Pasero --- src/vs/base/parts/ipc/common/ipc.net.ts | 12 ++++-- .../common/abstractExtensionService.ts | 12 +++++- .../services/lifecycle/common/lifecycle.ts | 42 +++++++++++++++++-- .../electron-sandbox/lifecycleService.ts | 31 +++++++++----- .../electron-sandbox/lifecycleService.test.ts | 33 ++++++++++++++- .../common/abstractRemoteAgentService.ts | 13 ++++++ .../remote/common/remoteAgentService.ts | 6 +++ .../test/browser/workbenchTestServices.ts | 7 ++-- 8 files changed, 135 insertions(+), 21 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.net.ts b/src/vs/base/parts/ipc/common/ipc.net.ts index 1fe8ee0780012..39ba4f1623636 100644 --- a/src/vs/base/parts/ipc/common/ipc.net.ts +++ b/src/vs/base/parts/ipc/common/ipc.net.ts @@ -597,6 +597,8 @@ export class Client extends IPCClient { override dispose(): void { super.dispose(); const socket = this.protocol.getSocket(); + // should be sent gracefully with a .flush(), but try to send it out as a + // last resort here if nothing else: this.protocol.sendDisconnect(); this.protocol.dispose(); socket.end(); @@ -808,6 +810,7 @@ export interface PersistentProtocolOptions { export class PersistentProtocol implements IMessagePassingProtocol { private _isReconnecting: boolean; + private _didSendDisconnect?: boolean; private _outgoingUnackMsg: Queue; private _outgoingMsgId: number; @@ -910,9 +913,12 @@ export class PersistentProtocol implements IMessagePassingProtocol { } sendDisconnect(): void { - const msg = new ProtocolMessage(ProtocolMessageType.Disconnect, 0, 0, getEmptyBuffer()); - this._socketWriter.write(msg); - this._socketWriter.flush(); + if (!this._didSendDisconnect) { + this._didSendDisconnect = true; + const msg = new ProtocolMessage(ProtocolMessageType.Disconnect, 0, 0, getEmptyBuffer()); + this._socketWriter.write(msg); + this._socketWriter.flush(); + } } sendPause(): void { diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index 731a48bf5b0de..be9bb04b1041e 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -51,7 +51,7 @@ import { ExtensionMessageCollector, ExtensionPoint, ExtensionsRegistry, IExtensi import { LazyCreateExtensionHostManager } from 'vs/workbench/services/extensions/common/lazyCreateExtensionHostManager'; import { ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { IExtensionActivationHost as IWorkspaceContainsActivationHost, checkActivateWorkspaceContainsExtension, checkGlobFileExists } from 'vs/workbench/services/extensions/common/workspaceContains'; -import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { ILifecycleService, WillShutdownJoinerOrder } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IExtensionHostExitInfo, IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; const hasOwnProperty = Object.hasOwnProperty; @@ -195,6 +195,16 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } })); + this._register(this._lifecycleService.onWillShutdown(event => { + if (this._remoteAgentService.getConnection()) { + event.join(() => this._remoteAgentService.endConnection(), { + id: 'join.disconnectRemote', + label: nls.localize('disconnectRemote', "Disconnect Remote Agent"), + order: WillShutdownJoinerOrder.Last // after others have joined that might depend on a remote connection + }); + } + })); + this._register(this._lifecycleService.onDidShutdown(() => { // We need to disconnect the management connection before killing the local extension host. // Otherwise, the local extension host might terminate the underlying tunnel before the diff --git a/src/vs/workbench/services/lifecycle/common/lifecycle.ts b/src/vs/workbench/services/lifecycle/common/lifecycle.ts index 7a795423d5dc5..ec5c8098e4091 100644 --- a/src/vs/workbench/services/lifecycle/common/lifecycle.ts +++ b/src/vs/workbench/services/lifecycle/common/lifecycle.ts @@ -65,9 +65,34 @@ export interface BeforeShutdownErrorEvent { readonly error: Error; } +export enum WillShutdownJoinerOrder { + + /** + * Joiners to run before the `Last` joiners. This is the default order and best for + * most cases. You can be sure that services are still functional at this point. + */ + Default = 1, + + /** + * The joiners to run last. This should ONLY be used in rare cases when you have no + * dependencies to workbench services or state. The workbench may be in a state where + * resources can no longer be accessed or changed. + */ + Last +} + export interface IWillShutdownEventJoiner { - id: string; - label: string; + readonly id: string; + readonly label: string; + readonly order?: WillShutdownJoinerOrder; +} + +export interface IWillShutdownEventDefaultJoiner extends IWillShutdownEventJoiner { + readonly order?: WillShutdownJoinerOrder.Default; +} + +export interface IWillShutdownEventLastJoiner extends IWillShutdownEventJoiner { + readonly order: WillShutdownJoinerOrder.Last; } /** @@ -95,10 +120,21 @@ export interface WillShutdownEvent { * Allows to join the shutdown. The promise can be a long running operation but it * will block the application from closing. * + * @param promise the promise to join the shutdown event. + * @param joiner to identify the join operation in case it takes very long or never + * completes. + */ + join(promise: Promise, joiner: IWillShutdownEventDefaultJoiner): void; + + /** + * Allows to join the shutdown at the end. The promise can be a long running operation but it + * will block the application from closing. + * + * @param promiseFn the promise to join the shutdown event. * @param joiner to identify the join operation in case it takes very long or never * completes. */ - join(promise: Promise, joiner: IWillShutdownEventJoiner): void; + join(promiseFn: (() => Promise), joiner: IWillShutdownEventLastJoiner): void; /** * Allows to access the joiners that have not finished joining this event. diff --git a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts index 9d4d9418201c6..0434e6ded592c 100644 --- a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { handleVetos } from 'vs/platform/lifecycle/common/lifecycle'; -import { ShutdownReason, ILifecycleService, IWillShutdownEventJoiner } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { ShutdownReason, ILifecycleService, IWillShutdownEventJoiner, WillShutdownJoinerOrder } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ILogService } from 'vs/platform/log/common/log'; @@ -155,19 +155,24 @@ export class NativeLifecycleService extends AbstractLifecycleService { protected async handleWillShutdown(reason: ShutdownReason): Promise { const joiners: Promise[] = []; + const lastJoiners: (() => Promise)[] = []; const pendingJoiners = new Set(); const cts = new CancellationTokenSource(); - this._onWillShutdown.fire({ reason, token: cts.token, joiners: () => Array.from(pendingJoiners.values()), - join(promise, joiner) { - joiners.push(promise); - - // Track promise completion + join(promiseOrPromiseFn, joiner) { pendingJoiners.add(joiner); - promise.finally(() => pendingJoiners.delete(joiner)); + + if (joiner.order === WillShutdownJoinerOrder.Last) { + const promiseFn = typeof promiseOrPromiseFn === 'function' ? promiseOrPromiseFn : () => promiseOrPromiseFn; + lastJoiners.push(() => promiseFn().finally(() => pendingJoiners.delete(joiner))); + } else { + const promise = typeof promiseOrPromiseFn === 'function' ? promiseOrPromiseFn() : promiseOrPromiseFn; + promise.finally(() => pendingJoiners.delete(joiner)); + joiners.push(promise); + } }, force: () => { cts.dispose(true); @@ -181,10 +186,16 @@ export class NativeLifecycleService extends AbstractLifecycleService { try { await raceCancellation(Promises.settled(joiners), cts.token); } catch (error) { - this.logService.error(`[lifecycle]: Error during will-shutdown phase (error: ${toErrorMessage(error)})`); // this error will not prevent the shutdown - } finally { - longRunningWillShutdownWarning.dispose(); + this.logService.error(`[lifecycle]: Error during will-shutdown phase in default joiners (error: ${toErrorMessage(error)})`); + } + + try { + await raceCancellation(Promises.settled(lastJoiners.map(lastJoiner => lastJoiner())), cts.token); + } catch (error) { + this.logService.error(`[lifecycle]: Error during will-shutdown phase in last joiners (error: ${toErrorMessage(error)})`); } + + longRunningWillShutdownWarning.dispose(); } shutdown(): Promise { diff --git a/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts b/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts index 0d71a2086937c..66d4f8b3c7157 100644 --- a/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts +++ b/src/vs/workbench/services/lifecycle/test/electron-sandbox/lifecycleService.test.ts @@ -4,9 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import assert from 'assert'; +import { timeout } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; -import { ShutdownReason } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { ShutdownReason, WillShutdownJoinerOrder } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { NativeLifecycleService } from 'vs/workbench/services/lifecycle/electron-sandbox/lifecycleService'; import { workbenchInstantiationService } from 'vs/workbench/test/electron-sandbox/workbenchTestServices'; @@ -155,5 +157,34 @@ suite('Lifecycleservice', function () { assert.strictEqual(joinCalled, true); }); + test('onWillShutdown - join order', async function () { + return runWithFakedTimers({ useFakeTimers: true }, async () => { + const order: string[] = []; + + disposables.add(lifecycleService.onWillShutdown(e => { + e.join(async () => { + order.push('disconnect start'); + await timeout(1); + order.push('disconnect end'); + }, { id: 'test', label: 'test', order: WillShutdownJoinerOrder.Last }); + + e.join((async () => { + order.push('default start'); + await timeout(1); + order.push('default end'); + })(), { id: 'test', label: 'test', order: WillShutdownJoinerOrder.Default }); + })); + + await lifecycleService.testHandleWillShutdown(ShutdownReason.QUIT); + + assert.deepStrictEqual(order, [ + 'default start', + 'default end', + 'disconnect start', + 'disconnect end' + ]); + }); + }); + ensureNoDisposablesAreLeakedInTestSuite(); }); diff --git a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts index 9550c6a76d673..fe802daf50b8e 100644 --- a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts @@ -114,6 +114,13 @@ export abstract class AbstractRemoteAgentService extends Disposable implements I ); } + async endConnection(): Promise { + if (this._connection) { + await this._connection.end(); + this._connection.dispose(); + } + } + private _withChannel(callback: (channel: IChannel, connection: IRemoteAgentConnection) => Promise, fallback: R): Promise { const connection = this.getConnection(); if (!connection) { @@ -159,6 +166,8 @@ class RemoteAgentConnection extends Disposable implements IRemoteAgentConnection this._connection = null; } + end: () => Promise = () => Promise.resolve(); + getChannel(channelName: string): T { return getDelayedChannel(this._getOrCreateConnection().then(c => c.getChannel(channelName))); } @@ -222,6 +231,10 @@ class RemoteAgentConnection extends Disposable implements IRemoteAgentConnection connection.protocol.onDidDispose(() => { connection.dispose(); }); + this.end = () => { + connection.protocol.sendDisconnect(); + return connection.protocol.drain(); + }; this._register(connection.onDidStateChange(e => this._onDidStateChange.fire(e))); return connection.client; } diff --git a/src/vs/workbench/services/remote/common/remoteAgentService.ts b/src/vs/workbench/services/remote/common/remoteAgentService.ts index db2d598dd8d8c..e3849b607d4a6 100644 --- a/src/vs/workbench/services/remote/common/remoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/remoteAgentService.ts @@ -37,6 +37,11 @@ export interface IRemoteAgentService { */ getRoundTripTime(): Promise; + /** + * Gracefully ends the current connection, if any. + */ + endConnection(): Promise; + getDiagnosticInfo(options: IDiagnosticInfoOptions): Promise; updateTelemetryLevel(telemetryLevel: TelemetryLevel): Promise; logTelemetry(eventName: string, data?: ITelemetryData): Promise; @@ -54,6 +59,7 @@ export interface IRemoteAgentConnection { readonly onReconnecting: Event; readonly onDidStateChange: Event; + end(): Promise; dispose(): void; getChannel(channelName: string): T; withChannel(channelName: string, callback: (channel: T) => Promise): Promise; diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 5680778d5c8cd..46cb0e01277de 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -1364,7 +1364,7 @@ export class TestLifecycleService extends Disposable implements ILifecycleServic this._onWillShutdown.fire({ join: p => { - this.shutdownJoiners.push(p); + this.shutdownJoiners.push(typeof p === 'function' ? p() : p); }, joiners: () => [], force: () => { /* No-Op in tests */ }, @@ -1405,8 +1405,8 @@ export class TestWillShutdownEvent implements WillShutdownEvent { reason = ShutdownReason.CLOSE; token = CancellationToken.None; - join(promise: Promise, joiner: IWillShutdownEventJoiner): void { - this.value.push(promise); + join(promise: Promise | (() => Promise), joiner: IWillShutdownEventJoiner): void { + this.value.push(typeof promise === 'function' ? promise() : promise); } force() { /* No-Op in tests */ } @@ -2117,6 +2117,7 @@ export class TestRemoteAgentService implements IRemoteAgentService { async logTelemetry(eventName: string, data?: ITelemetryData): Promise { } async flushTelemetry(): Promise { } async getRoundTripTime(): Promise { return undefined; } + async endConnection(): Promise { } } export class TestRemoteExtensionsScannerService implements IRemoteExtensionsScannerService { From a375a9bb4ffa26595bf61e07cdfa486f10833dbb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 Jul 2024 18:40:07 +0200 Subject: [PATCH 606/755] Multi tab: cannot drop multiple tabs into separate workspace window (#219671) (fix #212885) --- src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts index 4ea2a840df499..637d3486046bb 100644 --- a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts +++ b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts @@ -1106,7 +1106,7 @@ export class MultiEditorTabsControl extends EditorTabsControl { } // Apply some datatransfer types to allow for dragging the element outside of the application - this.doFillResourceDataTransfers([editor], e, isNewWindowOperation); + this.doFillResourceDataTransfers(selectedEditors, e, isNewWindowOperation); scheduleAtNextAnimationFrame(getWindow(this.parent), () => this.updateDropFeedback(tab, false, e, tabIndex)); }, From ff6e9b259c811bebfc8b5c549b0499260dcfec14 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Tue, 2 Jul 2024 19:19:49 +0200 Subject: [PATCH 607/755] Remove console.log (#219715) remove console.log --- src/vs/workbench/browser/contextkeys.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/browser/contextkeys.ts b/src/vs/workbench/browser/contextkeys.ts index ccfe454ba34e4..cffce2ce2675d 100644 --- a/src/vs/workbench/browser/contextkeys.ts +++ b/src/vs/workbench/browser/contextkeys.ts @@ -267,7 +267,6 @@ export class WorkbenchContextKeysHandler extends Disposable { // Context keys depending on the state of the editor group itself private updateActiveEditorGroupContextKeys(): void { - console.log('active group'); if (!this.editorService.activeEditor) { this.activeEditorGroupEmpty.set(true); } else { @@ -283,7 +282,6 @@ export class WorkbenchContextKeysHandler extends Disposable { // Context keys depending on the state of other editor groups private updateEditorGroupsContextKeys(): void { - console.log('all groups'); const groupCount = this.editorGroupService.count; if (groupCount > 1) { this.multipleEditorGroupsContext.set(true); From 33efeef884a64114e0b997c69f3b611a8ba24ecc Mon Sep 17 00:00:00 2001 From: eleanorjboyd Date: Tue, 2 Jul 2024 10:58:36 -0700 Subject: [PATCH 608/755] additions --- src/vs/platform/actions/common/actions.ts | 2 +- .../testing/browser/testingExplorerView.ts | 17 ++++++++--------- .../actions/common/menusExtensionPoint.ts | 6 +++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 5ae47ed133e31..ec2ccb4f87f77 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -138,7 +138,7 @@ export class MenuId { static readonly StickyScrollContext = new MenuId('StickyScrollContext'); static readonly TestItem = new MenuId('TestItem'); static readonly TestItemGutter = new MenuId('TestItemGutter'); - static readonly TestPythonConfigMenu = new MenuId('TestPythonConfigMenu'); + static readonly TestProfilesContext = new MenuId('TestProfilesContext'); static readonly TestMessageContext = new MenuId('TestMessageContext'); static readonly TestMessageContent = new MenuId('TestMessageContent'); static readonly TestPeekElement = new MenuId('TestPeekElement'); diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 5adaefd14128e..22a2582325560 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -355,18 +355,17 @@ export class TestingExplorerView extends ViewPane { const menuActions: IAction[] = []; const key = this.contextKeyService.createOverlay([]); - const menu = this.menuService.createMenu(MenuId.TestPythonConfigMenu, key); - const actions = menu.getActions({ renderShortTitle: true }).flatMap(entry => entry[1]); - if (actions.length > 0) { - // fill if there are any actions - try { - createAndFillInContextMenuActions(menu, undefined, menuActions); - } finally { - menu.dispose(); - } + const menu = this.menuService.createMenu(MenuId.TestProfilesContext, key); + // fill if there are any actions + try { + createAndFillInContextMenuActions(menu, undefined, menuActions); + } finally { + menu.dispose(); } + + const postActions: IAction[] = []; if (profileActions.length > 1) { postActions.push(new Action( diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index a8cf20f1132e1..2b0dbd7442cd0 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -344,9 +344,9 @@ const apiMenus: IAPIMenu[] = [ description: localize('testing.item.gutter.title', "The menu for a gutter decoration for a test item"), }, { - key: 'testing/pythonConfig', - id: MenuId.TestPythonConfigMenu, - description: localize('testing.pythonConfig.title', "The menu for configuring Python tests"), + key: 'testing/profiles/context', + id: MenuId.TestProfilesContext, + description: localize('testing.profiles.context.title', "The menu for configuring testing profiles."), }, { key: 'testing/item/result', From 139fa9d01c6e65bccb1fbc8dc2fb2c73ea77c12e Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:14:02 -0700 Subject: [PATCH 609/755] chore: use ip-address instead of ip (#219760) --- remote/yarn.lock | 48 ++++++++++++++++++-------- yarn.lock | 88 ++++++++++++++++++++++++++++++------------------ 2 files changed, 90 insertions(+), 46 deletions(-) diff --git a/remote/yarn.lock b/remote/yarn.lock index c8e84fc81e14b..54318a1a76296 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -171,6 +171,13 @@ agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: dependencies: debug "^4.3.4" +agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -332,10 +339,13 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" is-extglob@^2.1.1: version "2.1.1" @@ -359,6 +369,11 @@ js-base64@^3.7.5: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jschardet@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" @@ -570,22 +585,27 @@ smart-buffer@^4.2.0: integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" - integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== dependencies: - agent-base "^7.0.1" + agent-base "^7.1.1" debug "^4.3.4" - socks "^2.7.1" + socks "^2.8.3" -socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" diff --git a/yarn.lock b/yarn.lock index c445f43d99563..3ed17cd0af66d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2099,6 +2099,13 @@ agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: dependencies: debug "^4.3.4" +agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -2201,11 +2208,6 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -5729,10 +5731,13 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" is-absolute@^1.0.0: version "1.0.0" @@ -6234,6 +6239,11 @@ js-yaml@^3.13.0: argparse "^1.0.7" esprima "^4.0.0" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jschardet@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" @@ -9095,20 +9105,20 @@ snapdragon@^0.8.1: use "^3.1.0" socks-proxy-agent@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" - integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== dependencies: - agent-base "^7.0.1" + agent-base "^7.1.1" debug "^4.3.4" - socks "^2.7.1" + socks "^2.8.3" -socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" source-map-js@^1.0.1: @@ -9247,6 +9257,11 @@ sprintf-js@^1.1.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -9340,7 +9355,7 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9375,14 +9390,14 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" @@ -9437,7 +9452,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9465,12 +9480,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" @@ -10627,7 +10642,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10662,6 +10677,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 0cdc9b33419a39557fc6109ad629f196cd92439e Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Tue, 2 Jul 2024 21:25:39 +0200 Subject: [PATCH 610/755] fix: memory leak in extension tabs (#219726) --- .../contrib/extensions/browser/extensionFeaturesTab.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts b/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts index 42680a4ba1f02..794127b7f6a67 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionFeaturesTab.ts @@ -178,10 +178,10 @@ export class ExtensionFeaturesTab extends Themable { return; } - const splitView = new SplitView(this.domNode, { + const splitView = this._register(new SplitView(this.domNode, { orientation: Orientation.HORIZONTAL, proportionalLayout: true - }); + })); this.layoutParticipants.push({ layout: (height: number, width: number) => { splitView.el.style.height = `${height - 14}px`; @@ -190,7 +190,7 @@ export class ExtensionFeaturesTab extends Themable { }); const featuresListContainer = $('.features-list-container'); - const list = this.createFeaturesList(featuresListContainer); + const list = this._register(this.createFeaturesList(featuresListContainer)); list.splice(0, list.length, features); const featureViewContainer = $('.feature-view-container'); From e3d7449068e534e083d656c15c0061aef8710630 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 Jul 2024 14:34:46 -0700 Subject: [PATCH 611/755] Fix a few more linting errors (#219803) --- src/vs/editor/contrib/codelens/browser/codeLensCache.ts | 4 ++-- src/vs/editor/contrib/inlineEdits/browser/commands.ts | 2 +- .../editor/test/browser/widget/observableCodeEditor.test.ts | 4 ++-- src/vs/platform/product/common/product.ts | 2 +- src/vs/workbench/api/browser/mainThreadNotebook.ts | 2 +- src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts | 3 +-- .../contrib/bulkEdit/browser/preview/bulkEditPane.ts | 4 ++-- src/vscode-dts/vscode.proposed.fileComments.d.ts | 2 +- 8 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/contrib/codelens/browser/codeLensCache.ts b/src/vs/editor/contrib/codelens/browser/codeLensCache.ts index 67fa3b8009c86..47fc3260b1f80 100644 --- a/src/vs/editor/contrib/codelens/browser/codeLensCache.ts +++ b/src/vs/editor/contrib/codelens/browser/codeLensCache.ts @@ -71,8 +71,8 @@ export class CodeLensCache implements ICodeLensCache { put(model: ITextModel, data: CodeLensModel): void { // create a copy of the model that is without command-ids // but with comand-labels - const copyItems = data.lenses.map(item => { - return { + const copyItems = data.lenses.map((item): CodeLens => { + return { range: item.symbol.range, command: item.symbol.command && { id: '', title: item.symbol.command?.title }, }; diff --git a/src/vs/editor/contrib/inlineEdits/browser/commands.ts b/src/vs/editor/contrib/inlineEdits/browser/commands.ts index c5ce0e9029638..ec7255fd9f02d 100644 --- a/src/vs/editor/contrib/inlineEdits/browser/commands.ts +++ b/src/vs/editor/contrib/inlineEdits/browser/commands.ts @@ -18,7 +18,7 @@ import { MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -function labelAndAlias(str: nls.ILocalizedString): { label: string, alias: string } { +function labelAndAlias(str: nls.ILocalizedString): { label: string; alias: string } { return { label: str.value, alias: str.original, diff --git a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts index 5ae9f3d81f5c7..0a10496647023 100644 --- a/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts +++ b/src/vs/editor/test/browser/widget/observableCodeEditor.test.ts @@ -18,7 +18,7 @@ suite("CodeEditorWidget", () => { ensureNoDisposablesAreLeakedInTestSuite(); function withTestFixture( - cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable; }) => void + cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void ) { withEditorSetupTestFixture(undefined, cb); } @@ -27,7 +27,7 @@ suite("CodeEditorWidget", () => { preSetupCallback: | ((editor: ICodeEditor, disposables: DisposableStore) => void) | undefined, - cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable; }) => void + cb: (args: { editor: ICodeEditor; viewModel: ViewModel; log: Log; derived: IObservable }) => void ) { withTestCodeEditor("hello world", {}, (editor, viewModel) => { const disposables = new DisposableStore(); diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 9d3f34e443d29..58278d978f9e3 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -53,7 +53,7 @@ else if (globalThis._VSCODE_PRODUCT_JSON && globalThis._VSCODE_PACKAGE_JSON) { else { // Built time configuration (do NOT modify) - product = { /*BUILD->INSERT_PRODUCT_CONFIGURATION*/ } as IProductConfiguration; + product = { /*BUILD->INSERT_PRODUCT_CONFIGURATION*/ } as any; // Running out of sources if (Object.keys(product).length === 0) { diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index c036901f90760..b50fee3527cec 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -104,7 +104,7 @@ export class MainThreadNotebooks implements MainThreadNotebookShape { }; } - const thisPriorityInfo = coalesce([{ isFromSettings: false, filenamePatterns: includes }, ...allPriorityInfo.get(viewType) ?? []]); + const thisPriorityInfo = coalesce([{ isFromSettings: false, filenamePatterns: includes }, ...allPriorityInfo.get(viewType) ?? []]); const otherEditorsPriorityInfo = Array.from(allPriorityInfo.keys()) .flatMap(key => { if (key !== viewType) { diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index e2fefb174e649..6bba2fcc4c5a8 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -34,7 +34,6 @@ import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; import { PixelRatio } from 'vs/base/browser/pixelRatio'; import { ILabelService } from 'vs/platform/label/common/label'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; -import { ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { IOutline } from 'vs/workbench/services/outline/browser/outline'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { Codicon } from 'vs/base/common/codicons'; @@ -85,7 +84,7 @@ class OutlineItem extends BreadcrumbsItem { } const template = renderer.renderTemplate(container); - renderer.renderElement(>{ + renderer.renderElement({ element, children: [], depth: 0, diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts index 36ef150418ae4..3c68921a8e535 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts @@ -22,7 +22,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { ResourceLabels, IResourceLabelsContainer } from 'vs/workbench/browser/labels'; +import { ResourceLabels } from 'vs/workbench/browser/labels'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { MenuId } from 'vs/platform/actions/common/actions'; import { ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; @@ -120,7 +120,7 @@ export class BulkEditPane extends ViewPane { const resourceLabels = this._instaService.createInstance( ResourceLabels, - { onDidChangeVisibility: this.onDidChangeBodyVisibility } + { onDidChangeVisibility: this.onDidChangeBodyVisibility } ); this._disposables.add(resourceLabels); diff --git a/src/vscode-dts/vscode.proposed.fileComments.d.ts b/src/vscode-dts/vscode.proposed.fileComments.d.ts index 8f8c7d2d9436e..96e9b181bc641 100644 --- a/src/vscode-dts/vscode.proposed.fileComments.d.ts +++ b/src/vscode-dts/vscode.proposed.fileComments.d.ts @@ -26,7 +26,7 @@ declare module 'vscode' { /** * The ranges which allow new comment threads creation. */ - ranges?: Range[] + ranges?: Range[]; } export interface CommentController { From 39c4f66a4638f5f6e619ee97b10532cf3c93e499 Mon Sep 17 00:00:00 2001 From: eleanorjboyd Date: Tue, 2 Jul 2024 16:00:01 -0700 Subject: [PATCH 612/755] add current group as menu context --- .../contrib/testing/browser/testingExplorerView.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 22a2582325560..d999c5e330111 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -353,8 +353,18 @@ export class TestingExplorerView extends ViewPane { } const menuActions: IAction[] = []; - - const key = this.contextKeyService.createOverlay([]); + const contextKeys: [string, unknown][] = []; + // allow extension author to define context for when to show the test menu actions for run or debug menus + if (group === TestRunProfileBitset.Run) { + contextKeys.push(['testing.profile.context.group', 'run']); + } + if (group === TestRunProfileBitset.Debug) { + contextKeys.push(['testing.profile.context.group', 'debug']); + } + if (group === TestRunProfileBitset.Coverage) { + contextKeys.push(['testing.profile.context.group', 'coverage']); + } + const key = this.contextKeyService.createOverlay(contextKeys); const menu = this.menuService.createMenu(MenuId.TestProfilesContext, key); // fill if there are any actions From 6ab3a15691ff9a1aa619a53d9dcd29c0b53d76a1 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Tue, 2 Jul 2024 17:07:12 -0700 Subject: [PATCH 613/755] testing: simplify tests when actioning gutter items (#219809) This adds a function to "simplify" tests by preferring to pass parent items rather than child items when running tests via test gutter decorations, when all children have been included. For https://github.com/microsoft/vscode-python/issues/21151 --- src/vs/base/common/prefixTree.ts | 5 + .../testing/browser/testingDecorations.ts | 4 +- .../contrib/testing/common/testId.ts | 2 +- .../contrib/testing/common/testService.ts | 62 +++++++++- .../testing/test/common/testService.test.ts | 108 ++++++++++++++++++ .../contrib/testing/test/common/testStubs.ts | 20 ++++ 6 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 src/vs/workbench/contrib/testing/test/common/testService.test.ts diff --git a/src/vs/base/common/prefixTree.ts b/src/vs/base/common/prefixTree.ts index 8e839e2b4ffab..53f02964d36d5 100644 --- a/src/vs/base/common/prefixTree.ts +++ b/src/vs/base/common/prefixTree.ts @@ -32,6 +32,11 @@ export class WellDefinedPrefixTree { return this.root.children?.values() || Iterable.empty(); } + /** Gets the top-level nodes of the tree */ + public get entries(): Iterable<[string, IPrefixTreeNode]> { + return this.root.children?.entries() || Iterable.empty(); + } + /** * Inserts a new value in the prefix tree. * @param onNode - called for each node as we descend to the insertion point, diff --git a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts index 9afbdafa1929e..dd48c16b9412f 100644 --- a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts @@ -47,7 +47,7 @@ import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; import { ITestResult, LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; -import { ITestService, getContextForTestItem, testsInFile } from 'vs/workbench/contrib/testing/common/testService'; +import { ITestService, getContextForTestItem, simplifyTestsToExecute, testsInFile } from 'vs/workbench/contrib/testing/common/testService'; import { IRichLocation, ITestMessage, ITestRunProfile, IncrementalTestCollectionItem, InternalTestItem, TestDiffOpType, TestMessageType, TestResultItem, TestResultState, TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testTypes'; import { ITestDecoration as IPublicTestDecoration, ITestingDecorationsService, TestDecorations } from 'vs/workbench/contrib/testing/common/testingDecorations'; import { ITestingPeekOpener } from 'vs/workbench/contrib/testing/common/testingPeekOpener'; @@ -806,7 +806,7 @@ abstract class RunTestDecoration { protected runWith(profile: TestRunProfileBitset) { return this.testService.runTests({ - tests: this.tests.map(({ test }) => test), + tests: simplifyTestsToExecute(this.testService.collection, this.tests.map(({ test }) => test)), group: profile, }); } diff --git a/src/vs/workbench/contrib/testing/common/testId.ts b/src/vs/workbench/contrib/testing/common/testId.ts index 79fcec77b1dbc..0b66669342a54 100644 --- a/src/vs/workbench/contrib/testing/common/testId.ts +++ b/src/vs/workbench/contrib/testing/common/testId.ts @@ -105,7 +105,7 @@ export class TestId { * todo@connor4312: review usages of this to see if using the WellDefinedPrefixTree is better */ public static isChild(maybeParent: string, maybeChild: string) { - return maybeChild.startsWith(maybeParent) && maybeChild[maybeParent.length] === TestIdPathParts.Delimiter; + return maybeChild[maybeParent.length] === TestIdPathParts.Delimiter && maybeChild.startsWith(maybeParent); } /** diff --git a/src/vs/workbench/contrib/testing/common/testService.ts b/src/vs/workbench/contrib/testing/common/testService.ts index 919fb4dbe1f38..48ebe0e230e05 100644 --- a/src/vs/workbench/contrib/testing/common/testService.ts +++ b/src/vs/workbench/contrib/testing/common/testService.ts @@ -3,19 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { assert } from 'vs/base/common/assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; import { IDisposable } from 'vs/base/common/lifecycle'; import { MarshalledId } from 'vs/base/common/marshallingIds'; +import { IPrefixTreeNode, WellDefinedPrefixTree } from 'vs/base/common/prefixTree'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IObservableValue, MutableObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; -import { AbstractIncrementalTestCollection, ICallProfileRunHandler, IncrementalTestCollectionItem, InternalTestItem, ITestItemContext, ResolvedTestRunRequest, IStartControllerTests, IStartControllerTestsResult, TestItemExpandState, TestRunProfileBitset, TestsDiff, TestMessageFollowupResponse, TestMessageFollowupRequest } from 'vs/workbench/contrib/testing/common/testTypes'; import { TestExclusions } from 'vs/workbench/contrib/testing/common/testExclusions'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { ITestResult } from 'vs/workbench/contrib/testing/common/testResult'; +import { AbstractIncrementalTestCollection, ICallProfileRunHandler, IncrementalTestCollectionItem, InternalTestItem, IStartControllerTests, IStartControllerTestsResult, ITestItemContext, ResolvedTestRunRequest, TestItemExpandState, TestMessageFollowupRequest, TestMessageFollowupResponse, TestRunProfileBitset, TestsDiff } from 'vs/workbench/contrib/testing/common/testTypes'; export const ITestService = createDecorator('testService'); @@ -216,6 +218,64 @@ export const testsUnderUri = async function* (testService: ITestService, ident: } }; +/** + * Simplifies the array of tests by preferring test item parents if all of + * their children are included. + */ +export const simplifyTestsToExecute = (collection: IMainThreadTestCollection, tests: IncrementalTestCollectionItem[]): IncrementalTestCollectionItem[] => { + if (tests.length < 2) { + return tests; + } + + const tree = new WellDefinedPrefixTree(); + for (const test of tests) { + tree.insert(TestId.fromString(test.item.extId).path, test); + } + + const out: IncrementalTestCollectionItem[] = []; + + // Returns the node if it and any children should be included. Otherwise + // pushes into the `out` any individual children that should be included. + const process = (currentId: string[], node: IPrefixTreeNode) => { + // directly included, don't try to over-specify, and children should be ignored + if (node.value) { + return node.value; + } + + assert(!!node.children, 'expect to have children'); + + const thisChildren: IncrementalTestCollectionItem[] = []; + for (const [part, child] of node.children) { + currentId.push(part); + const c = process(currentId, child); + if (c) { thisChildren.push(c); } + currentId.pop(); + } + + if (!thisChildren.length) { + return; + } + + // If there are multiple children and we have all of them, then tell the + // parent this node should be included. Otherwise include children individually. + const id = new TestId(currentId); + const test = collection.getNodeById(id.toString()); + if (test?.children.size === thisChildren.length) { + return test; + } + + out.push(...thisChildren); + return; + }; + + for (const [id, node] of tree.entries) { + const n = process([id], node); + if (n) { out.push(n); } + } + + return out; +}; + /** * A run request that expresses the intent of the request and allows the * test service to resolve the specifics of the group. diff --git a/src/vs/workbench/contrib/testing/test/common/testService.test.ts b/src/vs/workbench/contrib/testing/test/common/testService.test.ts new file mode 100644 index 0000000000000..66ae8c791f3c4 --- /dev/null +++ b/src/vs/workbench/contrib/testing/test/common/testService.test.ts @@ -0,0 +1,108 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { TestId } from 'vs/workbench/contrib/testing/common/testId'; +import { simplifyTestsToExecute } from 'vs/workbench/contrib/testing/common/testService'; +import { getInitializedMainTestCollection, makeSimpleStubTree } from 'vs/workbench/contrib/testing/test/common/testStubs'; + +suite('Workbench - Test Service', () => { + ensureNoDisposablesAreLeakedInTestSuite(); + + suite('simplifyTestsToExecute', () => { + const tree1 = { + a: { + b1: { + c1: { + d: undefined + }, + c2: { + d: undefined + }, + }, + b2: undefined, + } + } as const; + + test('noop on single item', async () => { + const c = await getInitializedMainTestCollection(makeSimpleStubTree(tree1)); + + const t = simplifyTestsToExecute(c, [ + c.getNodeById(new TestId(['ctrlId', 'a', 'b1']).toString())! + ]); + + assert.deepStrictEqual(t.map(t => t.item.extId.toString()), [ + new TestId(['ctrlId', 'a', 'b1']).toString() + ]); + }); + + test('goes to common root 1', async () => { + const c = await getInitializedMainTestCollection(makeSimpleStubTree(tree1)); + + const t = simplifyTestsToExecute(c, [ + c.getNodeById(new TestId(['ctrlId', 'a', 'b1', 'c1', 'd']).toString())!, + c.getNodeById(new TestId(['ctrlId', 'a', 'b1', 'c2']).toString())!, + ]); + + assert.deepStrictEqual(t.map(t => t.item.extId.toString()), [ + new TestId(['ctrlId', 'a', 'b1']).toString() + ]); + }); + + test('goes to common root 2', async () => { + const c = await getInitializedMainTestCollection(makeSimpleStubTree(tree1)); + + const t = simplifyTestsToExecute(c, [ + c.getNodeById(new TestId(['ctrlId', 'a', 'b1', 'c1']).toString())!, + c.getNodeById(new TestId(['ctrlId', 'a', 'b1']).toString())!, + ]); + + assert.deepStrictEqual(t.map(t => t.item.extId.toString()), [ + new TestId(['ctrlId', 'a', 'b1']).toString() + ]); + }); + + test('goes to common root 3', async () => { + const c = await getInitializedMainTestCollection(makeSimpleStubTree(tree1)); + + const t = simplifyTestsToExecute(c, [ + c.getNodeById(new TestId(['ctrlId', 'a', 'b1', 'c1', 'd']).toString())!, + c.getNodeById(new TestId(['ctrlId', 'a', 'b1', 'c2']).toString())!, + ]); + + assert.deepStrictEqual(t.map(t => t.item.extId.toString()), [ + new TestId(['ctrlId', 'a', 'b1']).toString() + ]); + }); + + test('goes to common root 4', async () => { + const c = await getInitializedMainTestCollection(makeSimpleStubTree(tree1)); + + const t = simplifyTestsToExecute(c, [ + c.getNodeById(new TestId(['ctrlId', 'a', 'b2']).toString())!, + c.getNodeById(new TestId(['ctrlId', 'a', 'b1']).toString())!, + ]); + + assert.deepStrictEqual(t.map(t => t.item.extId.toString()), [ + new TestId(['ctrlId']).toString() + ]); + }); + + test('no-op divergent trees', async () => { + const c = await getInitializedMainTestCollection(makeSimpleStubTree(tree1)); + + const t = simplifyTestsToExecute(c, [ + c.getNodeById(new TestId(['ctrlId', 'a', 'b1', 'c2']).toString())!, + c.getNodeById(new TestId(['ctrlId', 'a', 'b2']).toString())!, + ]); + + assert.deepStrictEqual(t.map(t => t.item.extId.toString()), [ + new TestId(['ctrlId', 'a', 'b1', 'c2']).toString(), + new TestId(['ctrlId', 'a', 'b2']).toString(), + ]); + }); + }); +}); diff --git a/src/vs/workbench/contrib/testing/test/common/testStubs.ts b/src/vs/workbench/contrib/testing/test/common/testStubs.ts index 836fe2143e8d7..c32350bc356f0 100644 --- a/src/vs/workbench/contrib/testing/test/common/testStubs.ts +++ b/src/vs/workbench/contrib/testing/test/common/testStubs.ts @@ -113,6 +113,26 @@ export const getInitializedMainTestCollection = async (singleUse = testStubs.nes return c; }; +type StubTreeIds = Readonly<{ [id: string]: StubTreeIds | undefined }>; + +export const makeSimpleStubTree = (ids: StubTreeIds): TestTestCollection => { + const collection = new TestTestCollection(); + + const add = (parent: TestTestItem, children: StubTreeIds, path: readonly string[]) => { + for (const id of Object.keys(children)) { + const item = new TestTestItem(new TestId([...path, id]), id); + parent.children.add(item); + if (children[id]) { + add(item, children[id]!, [...path, id]); + } + } + }; + + add(collection.root, ids, ['ctrlId']); + + return collection; +}; + export const testStubs = { nested: (idPrefix = 'id-') => { const collection = new TestTestCollection(); From 4b261a6d99bbe9b1839ce066a601b6d486664930 Mon Sep 17 00:00:00 2001 From: tisilent Date: Wed, 3 Jul 2024 11:47:59 +0800 Subject: [PATCH 614/755] Add Icons. --- .../contrib/snippets/browser/commands/configureSnippets.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts b/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts index 77dad6efa4a8c..f0ea01793f290 100644 --- a/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts +++ b/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts @@ -8,6 +8,7 @@ import { extname } from 'vs/base/common/path'; import { basename, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ILanguageService } from 'vs/editor/common/languages/language'; +import { getIconClassesForLanguageId } from 'vs/editor/common/services/getIconClasses'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { IFileService } from 'vs/platform/files/common/files'; @@ -115,7 +116,8 @@ async function computePicks(snippetService: ISnippetsService, userDataProfileSer label: languageId, description: `(${label})`, filepath: joinPath(dir, `${languageId}.json`), - hint: true + hint: true, + iconClasses: getIconClassesForLanguageId(languageId) }); } } From facf5e065010b6b7cbdbbacb099f103a7ba9a16c Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 2 Jul 2024 21:46:11 -0700 Subject: [PATCH 615/755] Fix import. --- .../contrib/notebook/browser/viewModel/baseCellViewModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index 0ec9a055e1384..9ed29128b2cff 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -19,7 +19,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { IWordWrapTransientState, readTransientState, writeTransientState } from 'vs/workbench/contrib/codeEditor/browser/toggleWordWrap'; import { InlineChatController } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; -import { CellEditState, CellFocusMode, CursorAtBoundary, CursorAtLineBoundary, IEditableCellViewModel, INotebookCellDecorationOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFocusMode, CellLayoutChangeEvent, CursorAtBoundary, CursorAtLineBoundary, IEditableCellViewModel, INotebookCellDecorationOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookOptions'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; From e2af3117bf0074b10f2170ec2096bd4bd365fbe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 3 Jul 2024 09:48:33 +0200 Subject: [PATCH 616/755] use unofficial 1espt (#219824) --- build/azure-pipelines/product-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 97adeb0cd83c5..0c4f98aa5116c 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -167,7 +167,7 @@ resources: ref: refs/tags/release extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + template: v1/1ES.Unofficial.PipelineTemplate.yml@1esPipelines parameters: sdl: tsa: @@ -183,7 +183,7 @@ extends: allTools: true codeql: compiled: - enabled: true + enabled: false runSourceLanguagesInSourceAnalysis: true credscan: suppressionsFile: $(Build.SourcesDirectory)/build/azure-pipelines/config/CredScanSuppressions.json From 5c3b102d73a0ff81788b418396bb5478c555f8ee Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:26:06 +0200 Subject: [PATCH 617/755] SCM - remove duplicate check code (#219826) SCM - remove duplicate check --- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index e969b6a0e0936..aa0e50ccf491c 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -4237,6 +4237,7 @@ registerThemingParticipant((theme, collector) => { // Override inactive selection bg const inputBackgroundColor = theme.getColor(inputBackground); if (inputBackgroundColor) { + collector.addRule(`.scm-view .scm-editor-container .monaco-editor-background { background-color: ${inputBackgroundColor}; } `); collector.addRule(`.scm-view .scm-editor-container .monaco-editor .selected-text { background-color: ${inputBackgroundColor.transparent(0.4)}; }`); } @@ -4246,10 +4247,6 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.scm-view .scm-editor-container .monaco-editor .view-line span.inline-selected-text { color: ${inputForegroundColor}; }`); } - const backgroundColor = theme.getColor(inputBackground); - if (backgroundColor) { - collector.addRule(`.scm-view .scm-editor-container .monaco-editor-background { background-color: ${backgroundColor}; } `); - } collector.addRule(`.scm-view .scm-editor-container .monaco-editor .focused .selected-text { background-color: ${selectionBackgroundColor}; }`); } else { // Use editor selection color if theme has not set a selection background color From 9255a27d883c812feae2473d7af428267c875030 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 3 Jul 2024 12:13:46 +0200 Subject: [PATCH 618/755] Try out new YAML grammar (#219833) * Try out new YAML grammar Part of #180523 * Pull in other/plain update --- .../colorize-results/issue-1550_yaml.json | 40 +- .../colorize-results/issue-4008_yaml.json | 48 +- .../colorize-results/issue-6303_yaml.json | 132 +- .../test/colorize-results/test_yaml.json | 374 ++-- extensions/yaml/build/update-grammar.js | 17 + extensions/yaml/cgmanifest.json | 31 +- extensions/yaml/package.json | 18 +- .../yaml/syntaxes/yaml-1.0.tmLanguage.json | 1621 +++++++++++++++ .../yaml/syntaxes/yaml-1.1.tmLanguage.json | 1792 +++++++++++++++++ .../yaml/syntaxes/yaml-1.2.tmLanguage.json | 1714 ++++++++++++++++ .../yaml/syntaxes/yaml-1.3.tmLanguage.json | 1714 ++++++++++++++++ extensions/yaml/syntaxes/yaml.tmLanguage.json | 614 +----- 12 files changed, 7267 insertions(+), 848 deletions(-) create mode 100644 extensions/yaml/build/update-grammar.js create mode 100644 extensions/yaml/syntaxes/yaml-1.0.tmLanguage.json create mode 100644 extensions/yaml/syntaxes/yaml-1.1.tmLanguage.json create mode 100644 extensions/yaml/syntaxes/yaml-1.2.tmLanguage.json create mode 100644 extensions/yaml/syntaxes/yaml-1.3.tmLanguage.json diff --git a/extensions/vscode-colorize-tests/test/colorize-results/issue-1550_yaml.json b/extensions/vscode-colorize-tests/test/colorize-results/issue-1550_yaml.json index dac84162b3c8d..cc1450808afac 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/issue-1550_yaml.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/issue-1550_yaml.json @@ -1,7 +1,7 @@ [ { "c": "test1", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -15,7 +15,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -29,7 +29,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -43,7 +43,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -57,7 +57,7 @@ }, { "c": "dsd", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -71,7 +71,7 @@ }, { "c": "test2", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -85,7 +85,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -99,7 +99,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -113,7 +113,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -127,7 +127,7 @@ }, { "c": "abc-def", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -141,7 +141,7 @@ }, { "c": "test-3", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -155,7 +155,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -169,7 +169,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -183,7 +183,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -197,7 +197,7 @@ }, { "c": "abcdef", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -211,7 +211,7 @@ }, { "c": "test-4", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -225,7 +225,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -239,7 +239,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -253,7 +253,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -267,7 +267,7 @@ }, { "c": "abc-def", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", diff --git a/extensions/vscode-colorize-tests/test/colorize-results/issue-4008_yaml.json b/extensions/vscode-colorize-tests/test/colorize-results/issue-4008_yaml.json index e1aa82e9ca36e..c8c2d57d90360 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/issue-4008_yaml.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/issue-4008_yaml.json @@ -1,7 +1,7 @@ [ { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -15,7 +15,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -29,7 +29,7 @@ }, { "c": "blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -43,7 +43,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -57,7 +57,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -71,7 +71,7 @@ }, { "c": "a=\"brown,not_brown\"", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -85,7 +85,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -99,7 +99,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -113,7 +113,7 @@ }, { "c": "not_blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -127,7 +127,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -141,7 +141,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +155,7 @@ }, { "c": "foo", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -169,7 +169,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -183,7 +183,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -197,7 +197,7 @@ }, { "c": "blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -211,7 +211,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -225,7 +225,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -239,7 +239,7 @@ }, { "c": "foo=\"}\"", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -253,7 +253,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -267,7 +267,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -281,7 +281,7 @@ }, { "c": "not_blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -295,7 +295,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -309,7 +309,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -323,7 +323,7 @@ }, { "c": "1", - "t": "source.yaml constant.numeric.integer.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml constant.numeric.integer.decimal.yaml", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", diff --git a/extensions/vscode-colorize-tests/test/colorize-results/issue-6303_yaml.json b/extensions/vscode-colorize-tests/test/colorize-results/issue-6303_yaml.json index 2066b677e2cca..e5267d6249425 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/issue-6303_yaml.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/issue-6303_yaml.json @@ -1,7 +1,7 @@ [ { "c": "swagger", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -15,7 +15,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -29,7 +29,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -43,7 +43,7 @@ }, { "c": "'", - "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.begin.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.definition.string.begin.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -57,7 +57,7 @@ }, { "c": "2.0", - "t": "source.yaml string.quoted.single.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -71,7 +71,7 @@ }, { "c": "'", - "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.end.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.definition.string.end.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -85,7 +85,7 @@ }, { "c": "info", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -99,7 +99,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -113,7 +113,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -127,7 +127,7 @@ }, { "c": "description", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -141,7 +141,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +155,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -169,7 +169,7 @@ }, { "c": "'", - "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.begin.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.definition.string.begin.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -183,7 +183,7 @@ }, { "c": "The API Management Service API defines an updated and refined version", - "t": "source.yaml string.quoted.single.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -196,8 +196,64 @@ } }, { - "c": " of the concepts currently known as Developer, APP, and API Product in Edge. Of", - "t": "source.yaml string.quoted.single.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF", + "dark_modern": "default: #CCCCCC", + "hc_light": "default: #292929", + "light_modern": "default: #3B3B3B" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.whitespace.separator.yaml", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.yaml: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.yaml: #0000FF", + "hc_black": "string: #CE9178", + "dark_modern": "string: #CE9178", + "hc_light": "string.quoted.single.yaml: #0F4A85", + "light_modern": "string.quoted.single.yaml: #0000FF" + } + }, + { + "c": "of the concepts currently known as Developer, APP, and API Product in Edge. Of", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.yaml: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.yaml: #0000FF", + "hc_black": "string: #CE9178", + "dark_modern": "string: #CE9178", + "hc_light": "string.quoted.single.yaml: #0F4A85", + "light_modern": "string.quoted.single.yaml: #0000FF" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF", + "dark_modern": "default: #CCCCCC", + "hc_light": "default: #292929", + "light_modern": "default: #3B3B3B" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -210,8 +266,8 @@ } }, { - "c": " note is the introduction of the API concept, missing previously from Edge", - "t": "source.yaml string.quoted.single.yaml", + "c": "note is the introduction of the API concept, missing previously from Edge", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -224,8 +280,22 @@ } }, { - "c": " ", - "t": "source.yaml string.quoted.single.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF", + "dark_modern": "default: #CCCCCC", + "hc_light": "default: #292929", + "light_modern": "default: #3B3B3B" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -239,7 +309,7 @@ }, { "c": "'", - "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.end.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.quoted.single.yaml punctuation.definition.string.end.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.quoted.single.yaml: #0000FF", @@ -253,7 +323,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -267,7 +337,7 @@ }, { "c": "title", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -281,7 +351,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -295,7 +365,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -309,7 +379,7 @@ }, { "c": "API Management Service API", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -323,7 +393,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -337,7 +407,7 @@ }, { "c": "version", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -351,7 +421,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -365,7 +435,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -379,7 +449,7 @@ }, { "c": "initial", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", diff --git a/extensions/vscode-colorize-tests/test/colorize-results/test_yaml.json b/extensions/vscode-colorize-tests/test/colorize-results/test_yaml.json index 407cc7c7a1a6d..9ab753e755618 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/test_yaml.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/test_yaml.json @@ -1,7 +1,7 @@ [ { "c": "#", - "t": "source.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", + "t": "source.yaml meta.stream.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -15,7 +15,7 @@ }, { "c": " sequencer protocols for Laser eye surgery", - "t": "source.yaml comment.line.number-sign.yaml", + "t": "source.yaml meta.stream.yaml comment.line.number-sign.yaml", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -29,7 +29,7 @@ }, { "c": "---", - "t": "source.yaml entity.other.document.begin.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml entity.other.document.begin.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -43,7 +43,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -57,7 +57,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -71,7 +71,7 @@ }, { "c": "step", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -85,7 +85,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -99,7 +99,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -113,7 +113,7 @@ }, { "c": "&", - "t": "source.yaml meta.property.yaml keyword.control.property.anchor.yaml punctuation.definition.anchor.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.anchor.yaml punctuation.definition.anchor.yaml", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -127,21 +127,21 @@ }, { "c": "id001", - "t": "source.yaml meta.property.yaml entity.name.type.anchor.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.anchor.yaml variable.other.anchor.yaml", "r": { - "dark_plus": "entity.name.type: #4EC9B0", - "light_plus": "entity.name.type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "entity.name.type: #4EC9B0", - "dark_modern": "entity.name.type: #4EC9B0", - "hc_light": "entity.name.type: #185E73", - "light_modern": "entity.name.type: #267F99" + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "variable: #9CDCFE", + "dark_modern": "variable: #9CDCFE", + "hc_light": "variable: #001080", + "light_modern": "variable: #001080" } }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +155,7 @@ }, { "c": "#", - "t": "source.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -169,7 +169,7 @@ }, { "c": " defines anchor label &id001", - "t": "source.yaml comment.line.number-sign.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml comment.line.number-sign.yaml", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -182,8 +182,22 @@ } }, { - "c": " ", - "t": "source.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF", + "dark_modern": "default: #CCCCCC", + "hc_light": "default: #292929", + "light_modern": "default: #3B3B3B" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -197,7 +211,7 @@ }, { "c": "instrument", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -211,7 +225,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -225,7 +239,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -239,7 +253,7 @@ }, { "c": "Lasik 2000", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -252,8 +266,22 @@ } }, { - "c": " ", - "t": "source.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF", + "dark_modern": "default: #CCCCCC", + "hc_light": "default: #292929", + "light_modern": "default: #3B3B3B" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -267,7 +295,7 @@ }, { "c": "pulseEnergy", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -281,7 +309,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -295,7 +323,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -309,7 +337,7 @@ }, { "c": "5.4", - "t": "source.yaml constant.numeric.float.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml constant.numeric.float.yaml", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", @@ -322,8 +350,22 @@ } }, { - "c": " ", - "t": "source.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF", + "dark_modern": "default: #CCCCCC", + "hc_light": "default: #292929", + "light_modern": "default: #3B3B3B" + } + }, + { + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -337,7 +379,7 @@ }, { "c": "spotSize", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -351,7 +393,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -365,7 +407,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -379,7 +421,7 @@ }, { "c": "1mm", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -393,7 +435,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -407,7 +449,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -421,7 +463,7 @@ }, { "c": "step", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -435,7 +477,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -449,7 +491,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -463,7 +505,7 @@ }, { "c": "*", - "t": "source.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -477,12 +519,12 @@ }, { "c": "id001", - "t": "source.yaml variable.other.alias.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.alias.yaml variable.other.alias.yaml", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", "hc_black": "variable: #9CDCFE", "dark_modern": "variable: #9CDCFE", "hc_light": "variable: #001080", @@ -491,7 +533,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -505,7 +547,7 @@ }, { "c": "#", - "t": "source.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -519,7 +561,7 @@ }, { "c": " refers to the first step (with anchor &id001)", - "t": "source.yaml comment.line.number-sign.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml comment.line.number-sign.yaml", "r": { "dark_plus": "comment: #6A9955", "light_plus": "comment: #008000", @@ -533,7 +575,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -547,7 +589,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -561,7 +603,7 @@ }, { "c": "step", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -575,7 +617,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -589,7 +631,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -603,7 +645,7 @@ }, { "c": "*", - "t": "source.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -617,12 +659,12 @@ }, { "c": "id001", - "t": "source.yaml variable.other.alias.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.alias.yaml variable.other.alias.yaml", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", "hc_black": "variable: #9CDCFE", "dark_modern": "variable: #9CDCFE", "hc_light": "variable: #001080", @@ -630,8 +672,8 @@ } }, { - "c": " ", - "t": "source.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -644,22 +686,8 @@ } }, { - "c": "spotSize", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6", - "dark_modern": "entity.name.tag: #569CD6", - "hc_light": "entity.name.tag: #0F4A85", - "light_modern": "entity.name.tag: #800000" - } - }, - { - "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "c": " ", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -671,9 +699,23 @@ "light_modern": "default: #3B3B3B" } }, + { + "c": "spotSize:", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml invalid.illegal.unrecognized.yaml markup.strikethrough", + "r": { + "dark_plus": "invalid: #F44747", + "light_plus": "invalid: #CD3131", + "dark_vs": "invalid: #F44747", + "light_vs": "invalid: #CD3131", + "hc_black": "invalid: #F44747", + "dark_modern": "invalid: #F44747", + "hc_light": "invalid: #B5200D", + "light_modern": "invalid: #CD3131" + } + }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -687,7 +729,7 @@ }, { "c": "2mm", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -701,21 +743,21 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml punctuation.whitespace.separator.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF", - "dark_modern": "default: #CCCCCC", - "hc_light": "default: #292929", - "light_modern": "default: #3B3B3B" + "dark_plus": "string: #CE9178", + "light_plus": "string.unquoted.plain.out.yaml: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "hc_black": "string: #CE9178", + "dark_modern": "string: #CE9178", + "hc_light": "string.unquoted.plain.out.yaml: #0F4A85", + "light_modern": "string.unquoted.plain.out.yaml: #0000FF" } }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -729,7 +771,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -743,7 +785,7 @@ }, { "c": "step", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -757,7 +799,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -771,7 +813,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -785,7 +827,7 @@ }, { "c": "*", - "t": "source.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -799,12 +841,12 @@ }, { "c": "id002", - "t": "source.yaml variable.other.alias.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml keyword.control.flow.alias.yaml variable.other.alias.yaml", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", "hc_black": "variable: #9CDCFE", "dark_modern": "variable: #9CDCFE", "hc_light": "variable: #001080", @@ -813,7 +855,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -827,7 +869,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -841,7 +883,7 @@ }, { "c": "{", - "t": "source.yaml meta.flow-mapping.yaml punctuation.definition.mapping.begin.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml punctuation.definition.mapping.begin.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -855,7 +897,7 @@ }, { "c": "name", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.map.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -869,7 +911,7 @@ }, { "c": ":", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.pair.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -883,7 +925,7 @@ }, { "c": " ", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.pair.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -897,7 +939,7 @@ }, { "c": "John Smith", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml string.unquoted.plain.in.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.pair.value.yaml string.unquoted.plain.in.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.in.yaml: #0000FF", @@ -911,7 +953,7 @@ }, { "c": ",", - "t": "source.yaml meta.flow-mapping.yaml punctuation.separator.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml punctuation.separator.mapping.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -925,7 +967,7 @@ }, { "c": " ", - "t": "source.yaml meta.flow-mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -939,7 +981,7 @@ }, { "c": "age", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.map.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -953,7 +995,7 @@ }, { "c": ":", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.pair.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -967,7 +1009,7 @@ }, { "c": " ", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.pair.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -981,7 +1023,7 @@ }, { "c": "33", - "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml constant.numeric.integer.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml meta.flow.map.implicit.yaml meta.flow.pair.value.yaml string.unquoted.plain.in.yaml constant.numeric.integer.decimal.yaml", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", @@ -995,7 +1037,7 @@ }, { "c": "}", - "t": "source.yaml meta.flow-mapping.yaml punctuation.definition.mapping.end.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.flow.mapping.yaml punctuation.definition.mapping.end.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1009,7 +1051,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1023,7 +1065,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1037,7 +1079,7 @@ }, { "c": "name", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1051,7 +1093,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1065,7 +1107,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1079,7 +1121,7 @@ }, { "c": "Mary Smith", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -1093,7 +1135,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1107,7 +1149,7 @@ }, { "c": "age", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1121,7 +1163,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1135,7 +1177,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1149,7 +1191,7 @@ }, { "c": "27", - "t": "source.yaml constant.numeric.integer.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml string.unquoted.plain.out.yaml constant.numeric.integer.decimal.yaml", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", @@ -1163,7 +1205,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1176,8 +1218,22 @@ } }, { - "c": "men", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "c": "m", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml invalid.illegal.expected-indentation.yaml", + "r": { + "dark_plus": "invalid: #F44747", + "light_plus": "invalid: #CD3131", + "dark_vs": "invalid: #F44747", + "light_vs": "invalid: #CD3131", + "hc_black": "invalid: #F44747", + "dark_modern": "invalid: #F44747", + "hc_light": "invalid: #B5200D", + "light_modern": "invalid: #CD3131" + } + }, + { + "c": "en", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1191,7 +1247,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1205,7 +1261,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1219,7 +1275,7 @@ }, { "c": "[", - "t": "source.yaml meta.flow-sequence.yaml punctuation.definition.sequence.begin.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.flow.sequence.yaml punctuation.definition.sequence.begin.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1233,7 +1289,7 @@ }, { "c": "John Smith", - "t": "source.yaml meta.flow-sequence.yaml string.unquoted.plain.in.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.flow.sequence.yaml string.unquoted.plain.in.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.in.yaml: #0000FF", @@ -1247,7 +1303,7 @@ }, { "c": ",", - "t": "source.yaml meta.flow-sequence.yaml punctuation.separator.sequence.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.flow.sequence.yaml punctuation.separator.sequence.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1261,7 +1317,7 @@ }, { "c": " ", - "t": "source.yaml meta.flow-sequence.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.flow.sequence.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1275,7 +1331,7 @@ }, { "c": "Bill Jones", - "t": "source.yaml meta.flow-sequence.yaml string.unquoted.plain.in.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.flow.sequence.yaml string.unquoted.plain.in.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.in.yaml: #0000FF", @@ -1289,7 +1345,7 @@ }, { "c": "]", - "t": "source.yaml meta.flow-sequence.yaml punctuation.definition.sequence.end.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.flow.sequence.yaml punctuation.definition.sequence.end.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1302,8 +1358,36 @@ } }, { - "c": "women", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "c": "w", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml invalid.illegal.expected-indentation.yaml", + "r": { + "dark_plus": "invalid: #F44747", + "light_plus": "invalid: #CD3131", + "dark_vs": "invalid: #F44747", + "light_vs": "invalid: #CD3131", + "hc_black": "invalid: #F44747", + "dark_modern": "invalid: #F44747", + "hc_light": "invalid: #B5200D", + "light_modern": "invalid: #CD3131" + } + }, + { + "c": "o", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml invalid.illegal.expected-indentation.yaml", + "r": { + "dark_plus": "invalid: #F44747", + "light_plus": "invalid: #CD3131", + "dark_vs": "invalid: #F44747", + "light_vs": "invalid: #CD3131", + "hc_black": "invalid: #F44747", + "dark_modern": "invalid: #F44747", + "hc_light": "invalid: #B5200D", + "light_modern": "invalid: #CD3131" + } + }, + { + "c": "men", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1317,7 +1401,7 @@ }, { "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml punctuation.separator.map.value.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1331,7 +1415,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1345,7 +1429,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1359,7 +1443,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.block.sequence.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1373,7 +1457,7 @@ }, { "c": "Mary Smith", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.block.sequence.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", @@ -1387,7 +1471,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml punctuation.whitespace.indentation.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1401,7 +1485,7 @@ }, { "c": "-", - "t": "source.yaml punctuation.definition.block.sequence.item.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.block.sequence.yaml punctuation.definition.block.sequence.item.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1415,7 +1499,7 @@ }, { "c": " ", - "t": "source.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.block.sequence.yaml punctuation.whitespace.separator.yaml", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1429,7 +1513,7 @@ }, { "c": "Susan Williams", - "t": "source.yaml string.unquoted.plain.out.yaml", + "t": "source.yaml meta.stream.yaml meta.document.yaml meta.block.sequence.yaml meta.mapping.yaml meta.map.value.yaml meta.block.sequence.yaml string.unquoted.plain.out.yaml", "r": { "dark_plus": "string: #CE9178", "light_plus": "string.unquoted.plain.out.yaml: #0000FF", diff --git a/extensions/yaml/build/update-grammar.js b/extensions/yaml/build/update-grammar.js new file mode 100644 index 0000000000000..8684bc3e5d047 --- /dev/null +++ b/extensions/yaml/build/update-grammar.js @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +var updateGrammar = require('vscode-grammar-updater'); + +async function updateGrammars() { + await updateGrammar.update('RedCMD/YAML-Syntax-Highlighter', 'syntaxes/yaml-1.0.tmLanguage.json', './syntaxes/yaml-1.0.tmLanguage.json', undefined, 'main'); + await updateGrammar.update('RedCMD/YAML-Syntax-Highlighter', 'syntaxes/yaml-1.1.tmLanguage.json', './syntaxes/yaml-1.1.tmLanguage.json', undefined, 'main'); + await updateGrammar.update('RedCMD/YAML-Syntax-Highlighter', 'syntaxes/yaml-1.2.tmLanguage.json', './syntaxes/yaml-1.2.tmLanguage.json', undefined, 'main'); + await updateGrammar.update('RedCMD/YAML-Syntax-Highlighter', 'syntaxes/yaml-1.3.tmLanguage.json', './syntaxes/yaml-1.3.tmLanguage.json', undefined, 'main'); + await updateGrammar.update('RedCMD/YAML-Syntax-Highlighter', 'syntaxes/yaml.tmLanguage.json', './syntaxes/yaml.tmLanguage.json', undefined, 'main'); +} + +updateGrammars(); diff --git a/extensions/yaml/cgmanifest.json b/extensions/yaml/cgmanifest.json index e6c3ca158b586..43dc4ca637e93 100644 --- a/extensions/yaml/cgmanifest.json +++ b/extensions/yaml/cgmanifest.json @@ -4,33 +4,24 @@ "component": { "type": "git", "git": { - "name": "textmate/yaml.tmbundle", - "repositoryUrl": "https://github.com/textmate/yaml.tmbundle", - "commitHash": "e54ceae3b719506dba7e481a77cea4a8b576ae46" + "name": "RedCMD/YAML-Syntax-Highlighter", + "repositoryUrl": "https://github.com/RedCMD/YAML-Syntax-Highlighter", + "commitHash": "287c71aeb0773759497822b5e5ce4bdc4d5ef2aa" } }, "licenseDetail": [ - "Copyright (c) 2015 FichteFoll ", + "MIT License", "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", + "Copyright 2024 RedCMD", "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." ], - "license": "TextMate Bundle License", - "version": "0.0.0" + "license": "MIT", + "version": "1.0.0" } ], "version": 1 diff --git a/extensions/yaml/package.json b/extensions/yaml/package.json index 5223f71c52b7a..d19c507bdfe47 100644 --- a/extensions/yaml/package.json +++ b/extensions/yaml/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/yaml.tmbundle Syntaxes/YAML.tmLanguage ./syntaxes/yaml.tmLanguage.json" + "update-grammar": "node ./build/update-grammar.js" }, "categories": ["Programming Languages"], "contributes": { @@ -56,6 +56,22 @@ "scopeName": "source.yaml", "path": "./syntaxes/yaml.tmLanguage.json" }, + { + "scopeName": "source.yaml.1.3", + "path": "./syntaxes/yaml-1.3.tmLanguage.json" + }, + { + "scopeName": "source.yaml.1.2", + "path": "./syntaxes/yaml-1.2.tmLanguage.json" + }, + { + "scopeName": "source.yaml.1.1", + "path": "./syntaxes/yaml-1.1.tmLanguage.json" + }, + { + "scopeName": "source.yaml.1.0", + "path": "./syntaxes/yaml-1.0.tmLanguage.json" + }, { "language": "yaml", "scopeName": "source.yaml", diff --git a/extensions/yaml/syntaxes/yaml-1.0.tmLanguage.json b/extensions/yaml/syntaxes/yaml-1.0.tmLanguage.json new file mode 100644 index 0000000000000..9f2a401ca5eb8 --- /dev/null +++ b/extensions/yaml/syntaxes/yaml-1.0.tmLanguage.json @@ -0,0 +1,1621 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/RedCMD/YAML-Syntax-Highlighter/blob/master/syntaxes/yaml-1.0.tmLanguage.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/RedCMD/YAML-Syntax-Highlighter/commit/287c71aeb0773759497822b5e5ce4bdc4d5ef2aa", + "name": "YAML 1.0", + "scopeName": "source.yaml.1.0", + "comment": "https://yaml.org/spec/1.0/", + "patterns": [ + { + "include": "#stream" + } + ], + "repository": { + "stream": { + "patterns": [ + { + "comment": "allows me to just use `\\G` instead of the performance heavy `(^|\\G)`", + "begin": "^(?!\\G)", + "while": "^", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G", + "while": "\\G", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-YAML": { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "(?=%YAML:1\\.0(?=[\\x{85 2028 2029}\r\n\t ]))", + "end": "\\G(?=%(?!YAML:1\\.0))", + "name": "meta.1.0.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "\\G(%)(YAML)(:)(1\\.0)", + "while": "\\G(?!---[\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.yaml.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "constant.numeric.yaml-version.yaml" + } + }, + "name": "meta.directives.yaml", + "patterns": [ + { + "include": "#directive-invalid" + }, + { + "include": "#directives" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G(?=---[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?!%)", + "patterns": [ + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + "directives": { + "comment": "https://yaml.org/spec/1.2.2/#68-directives", + "patterns": [ + { + "include": "source.yaml.1.3#directive-YAML" + }, + { + "include": "source.yaml.1.2#directive-YAML" + }, + { + "include": "source.yaml.1.1#directive-YAML" + }, + { + "include": "source.yaml.1.0#directive-YAML" + }, + { + "begin": "(?=%)", + "while": "\\G(?!%|---[\\x{85 2028 2029}\r\n\t ])", + "name": "meta.directives.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-reserved-directive", + "begin": "(%)([^: \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.other.yaml" + } + }, + "patterns": [ + { + "match": "\\G(:)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-name.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "match": "\\G\\.{3}(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-invalid": { + "patterns": [ + { + "match": "\\G\\.{3}(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "begin": "\\G(%)(YAML)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "invalid.illegal.keyword.other.directive.yaml.yaml" + } + }, + "name": "meta.directive.yaml", + "patterns": [ + { + "match": "\\G([\t ]++|:)([0-9]++\\.[0-9]++)?+", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "constant.numeric.yaml-version.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "document": { + "comment": "https://yaml.org/spec/1.2.2/#91-documents", + "patterns": [ + { + "begin": "---(?=[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?!(?>\\.{3}|---)[\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "0": { + "name": "entity.other.document.begin.yaml" + } + }, + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + { + "begin": "(?=\\.{3}[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?=[\t \\x{FEFF}]*+(?>#|$))", + "patterns": [ + { + "begin": "\\G\\.{3}", + "end": "$", + "beginCaptures": { + "0": { + "name": "entity.other.document.end.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G(?!%|[\t \\x{FEFF}]*+(?>#|$))", + "while": "\\G(?!(?>\\.{3}|---)[\\x{85 2028 2029}\r\n\t ])", + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + } + ] + }, + "block-node": { + "patterns": [ + { + "include": "#block-sequence" + }, + { + "include": "#block-mapping" + }, + { + "include": "#block-scalar" + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "while": "\\G", + "patterns": [ + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "begin": "(?=\\[|{)", + "while": "\\G", + "patterns": [ + { + "include": "#block-mapping" + }, + { + "begin": "(?!\\G)(?![\r\n\t ])", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#block-plain-out" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-mapping": { + "//": "The check for plain keys is expensive", + "begin": "(?=((?<=[-?:]) )?+)(?[!&*][^\\x{85 2028 2029}\r\n\t ]*+[\t ]++)*+)(?=(?>(?#Double Quote)\"(?>[^\\\\\"]++|\\\\.)*+\"|(?#Single Quote)'(?>[^']++|'')*+'|(?#Plain)(?>[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))(?>[^:#]++|:(?![\\x{85 2028 2029}\r\n\t ])|(?(\\1\\2)((?>[!&*][^\\x{85 2028 2029}\r\n\t ]*+[\t ]++)*+)((?>\t[\t ]*+)?+[^\\x{85 2028 2029}\r\n\t ?:\\-#!&*\"'\\[\\]{}0-9A-Za-z$()+./;<=\\\\^_~\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}])?+|( *+)([\t ]*+[^\\x{85 2028 2029}\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "5": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "4": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "5": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.mapping.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style (BLOCK-KEY)", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + { + "include": "#block-key-plain" + }, + { + "include": "#block-map-value" + }, + { + "include": "#block-map-explicit" + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#rule-l+block-sequence", + "begin": "(?=((?<=[-?:]) )?+)(?(\\1\\2)(?!-[\\x{85 2028 2029}\r\n\t ])((?>\t[\t ]*+)?+[^\\x{85 2028 2029}\r\n\t #\\]}])?+|(?!\\1\\2)( *+)([\t ]*+[^\\x{85 2028 2029}\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.block.sequence.item.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.block.sequence.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-map-explicit": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-explicit-key", + "begin": "(?=((?<=[-?:]) )?+)\\G( *+)(\\?)(?=[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?>(\\1\\2)(?![?:0-9A-Za-z$()+./;<=\\\\^_~\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{2028 2029 FEFF}]])((?>\t[\t ]*+)?+[^\\x{85 2028 2029}\r\n\t #\\-\\[\\]{}])?+|(?!\\1\\2)( *+)([\t ]*+[^\\x{85 2028 2029}\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.map.key.yaml" + }, + "4": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.map.explicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-key-plain-out" + }, + { + "include": "#block-map-value" + }, + { + "include": "#block-node" + } + ] + }, + "block-map-value": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-implicit-value", + "begin": "(:)(?=[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?![?:!\"'0-9A-Za-z$()+./;<=\\\\^_~\\[{\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{2028 2029 FEFF}]]|-[^\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "1": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.map.value.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-key-plain": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (BLOCK-KEY)", + "begin": "\\G(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))", + "end": "(?=[\t ]*+:[\\x{85 2028 2029}\r\n\t ]|(?>[\t ]++|\\G)#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G([\t ]++)(.)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "invalid.illegal.multiline-key.yaml" + } + } + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "block-scalar": { + "comment": "https://yaml.org/spec/1.2.2/#81-block-scalar-styles", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#8111-block-indentation-indicator", + "begin": "([\t ]*+)(?>(\\|)|(>))(?[+-])?+((0)|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9))(?()|([+-]))?+", + "while": "\\G(?>(?>(?!\\6)|(?!\\7) |(?!\\8) {2}|(?!\\9) {3}|(?!\\10) {4}|(?!\\11) {5}|(?!\\12) {6}|(?!\\13) {7}|(?!\\14) {8}|(?!\\15) {9})| *+($|[^#]))", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + }, + "5": { + "name": "constant.numeric.indentation-indicator.yaml" + }, + "16": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "whileCaptures": { + "0": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "1": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "begin": "$", + "while": "\\G", + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-b-block-header", + "//": "Soooooooo many edge cases", + "begin": "([\t ]*+)(?>(\\|)|(>))([+-]?+)", + "while": "\\G", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-literal-content", + "begin": "$", + "while": "\\G", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "//": "Find the highest indented line", + "begin": "\\G( ++)$", + "while": "\\G(?>(\\1)$|(?!\\1)( *+)($|.))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-b-nb-literal-next", + "//": [ + "Funky wrapper function", + "The `end` pattern clears the parent `\\G` anchor", + "Affectively forcing this rule to only match at most once", + "https://github.com/microsoft/vscode-textmate/issues/114" + ], + "begin": "\\G(?!$)(?=( *+))", + "end": "\\G(?!\\1)(?=[\t ]*+#)", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "begin": "\\G( *+)", + "while": "\\G(?>(\\1)|( *+)($|[^\t#]|[\t ]++[^#]))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-chomped-empty", + "begin": "(?!\\G)(?=[\t ]*+#)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "Header Comment", + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + } + ] + }, + "block-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-OUT)", + "begin": "(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))", + "while": "\\G", + "patterns": [ + { + "begin": "\\G", + "end": "(?=(?>[\t ]++|\\G)#)", + "name": "string.unquoted.plain.out.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": ":(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-node": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-seq-entry (FLOW-IN)", + "patterns": [ + { + "begin": "(?=\\[|{)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "include": "#flow-plain-in" + }, + { + "include": "#presentation-detail" + } + ] + }, + "flow-mapping": { + "comment": "https://yaml.org/spec/1.2.2/#742-flow-mappings", + "begin": "{", + "end": "}", + "beginCaptures": { + "0": { + "name": "punctuation.definition.mapping.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.mapping.end.yaml" + } + }, + "name": "meta.flow.mapping.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-map-entries", + "begin": "(?<={)\\G(?=[\\x{85 2028 2029}\r\n\t ,#])|,", + "end": "(?=[^\\x{85 2028 2029}\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.mapping.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-map-key-mapping" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#741-flow-sequences", + "begin": "\\[", + "end": "]", + "beginCaptures": { + "0": { + "name": "punctuation.definition.sequence.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.sequence.end.yaml" + } + }, + "name": "meta.flow.sequence.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-seq-entries", + "begin": "(?<=\\[)\\G(?=[\\x{85 2028 2029}\r\n\t ,#])|,", + "end": "(?=[^\\x{85 2028 2029}\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.sequence.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-map-key-sequence" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-map-key-mapping": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-map-key-mapping" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=(?>[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}])))", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#flow-key-plain-in" + }, + { + "match": ":(?=\\[|{)", + "name": "invalid.illegal.separator.map.yaml" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=\"|')", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-map-key-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-map-key-mapping" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?<=[\t ,\\[{]|^)(?=(?>[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))(?>[^:#,\\[\\]{}]++|:(?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}])|(?\"(?>[^\\\\\"]++|\\\\.)*+\"|'(?>[^']++|'')*+')[\t ]*+:)", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-map-value-yaml": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": ":(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-map-value-json": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": "(?<=(?>[\"'\\]}]|^)[\t ]*+):", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-IN)", + "begin": "(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "end": "(?=(?>[\t ]++|\\G)#|[\t ]*+[,\\[\\]{}])", + "name": "string.unquoted.plain.in.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": ":(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (FLOW-OUT)", + "begin": "(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))", + "end": "(?=[\t ]*+:[\\x{85 2028 2029}\r\n\t ]|[\t ]++#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-implicit-yaml-key (FLOW-KEY)", + "begin": "\\G(?![\\x{85 2028 2029}\r\n\t #])", + "end": "(?=[\t ]*+(?>:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]|[,\\[\\]{}])|[\t ]++#)", + "name": "meta.flow.map.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "include": "#non-printable" + } + ] + }, + "key-double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + "key-single": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + "double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "string.quoted.double.yaml", + "patterns": [ + { + "match": "(?x[^\"]{2,0}|u[^\"]{4,0}|U[^\"]{8,0}|.)", + "name": "invalid.illegal.constant.character.escape.yaml" + } + ] + }, + "tag-implicit-plain-in": { + "comment": "https://yaml.org/type/index.html", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE|y|Y|yes|Yes|YES|n|N|no|No|NO|on|On|ON|off|Off|OFF)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[-+]?+(0|[1-9][0-9_]*+)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G[-+]?+0b[0-1_]++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.binary.yaml" + }, + { + "match": "\\G[-+]?0[0-7_]++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G[-+]?+0x[0-9a-fA-F_]++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[-+]?+[1-9][0-9_]*+(?>:[0-5]?[0-9])++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+(?>[0-9][0-9_]*+)?+\\.[0-9.]*+(?>[eE][-+][0-9]+)?+(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.decimal.yaml" + }, + { + "match": "\\G[-+]?+[0-9][0-9_]*+(?>:[0-5]?[0-9])++\\.[0-9_]*+(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.nan.yaml" + }, + { + "comment": "https://www.w3.org/TR/NOTE-datetime does not allow spaces, however https://yaml.org/type/timestamp.html does, but the provided regex doesn't match the TZD space in many of the YAML examples", + "match": "\\G(?>[0-9]{4}-[0-9]{2,1}-[0-9]{2,1}(?>T|t|[\t ]++)[0-9]{2,1}:[0-9]{2}:[0-9]{2}(?>\\.[0-9]*+)?+[\t ]*+(?>Z|[-+][0-9]{2,1}(?>:[0-9]{2})?+)?+|[0-9]{4}-[0-9]{2}-[0-9]{2})(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.timestamp.yaml" + }, + { + "match": "\\G<<(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.merge.yaml" + }, + { + "match": "\\G=(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.value.yaml" + }, + { + "match": "\\G(?>!|&|\\*)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.yaml.yaml" + } + ] + }, + "tag-implicit-plain-out": { + "comment": "https://yaml.org/type/index.html", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE|yes|Yes|YES|y|Y|no|No|NO|n|N|on|On|ON|off|Off|OFF)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[-+]?+(0|[1-9][0-9_]*+)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G[-+]?+0b[0-1_]++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.binary.yaml" + }, + { + "match": "\\G[-+]?0[0-7_]++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G[-+]?+0x[0-9a-fA-F_]++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[-+]?+[1-9][0-9_]*+(?>:[0-5]?[0-9])++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+(?>[0-9][0-9_]*+)?+\\.[0-9.]*+(?>[eE][-+][0-9]+)?+(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.decimal.yaml" + }, + { + "match": "\\G[-+]?+[0-9][0-9_]*+(?>:[0-5]?[0-9])++\\.[0-9_]*+(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.nan.yaml" + }, + { + "comment": "https://www.w3.org/TR/NOTE-datetime does not allow spaces, however https://yaml.org/type/timestamp.html does, but the provided regex doesn't match the TZD space in many of the YAML examples", + "match": "\\G(?>[0-9]{4}-[0-9]{2,1}-[0-9]{2,1}(?>T|t|[\t ]++)[0-9]{2,1}:[0-9]{2}:[0-9]{2}(?>\\.[0-9]*+)?+[\t ]*+(?>Z|[-+][0-9]{2,1}(?>:[0-9]{2})?+)?+|[0-9]{4}-[0-9]{2}-[0-9]{2})(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.timestamp.yaml" + }, + { + "match": "\\G<<(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.merge.yaml" + }, + { + "match": "\\G=(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.value.yaml" + }, + { + "match": "\\G(?>!|&|\\*)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.yaml.yaml" + } + ] + }, + "tag-property": { + "comment": "https://yaml.org/spec/1.0/#c-ns-tag-property", + "//": [ + "!^", + "!!private_ns-tag-char+", + "!global_core_ns-tag-char+_no-:/!", + "!global_vocabulary_az09-_/ns-tag-char", + "!global_domain_ns-tag-char+.ns-tag-char+,1234(-12(-12)?)?/ns-tag-char*" + ], + "begin": "(?=!)", + "end": "(?=[\\x{2028 2029}\r\n\t ])", + "name": "storage.type.tag.yaml", + "patterns": [ + { + "match": "\\G!(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "punctuation.definition.tag.non-specific.yaml" + }, + { + "comment": "https://yaml.org/spec/1.0/#c-ns-private-tag", + "match": "\\G!!", + "name": "punctuation.definition.tag.private.yaml" + }, + { + "comment": "https://yaml.org/spec/1.0/#ns-ns-global-tag", + "match": "\\G!", + "name": "punctuation.definition.tag.global.yaml" + }, + { + "comment": "https://yaml.org/spec/1.0/#c-prefix", + "match": "\\^", + "name": "punctuation.definition.tag.prefix.yaml" + }, + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\\x{85 2028 2029}\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#double-escape" + }, + { + "include": "#non-printable" + } + ] + }, + "anchor-property": { + "match": "(&)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)|(&)", + "captures": { + "0": { + "name": "keyword.control.flow.anchor.yaml" + }, + "1": { + "name": "punctuation.definition.anchor.yaml" + }, + "2": { + "name": "variable.other.anchor.yaml" + }, + "3": { + "name": "invalid.illegal.flow.anchor.yaml" + } + } + }, + "alias": { + "begin": "(\\*)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)|(\\*)", + "end": "(?=:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]|[,\\[\\]{}])", + "captures": { + "0": { + "name": "keyword.control.flow.alias.yaml" + }, + "1": { + "name": "punctuation.definition.alias.yaml" + }, + "2": { + "name": "variable.other.alias.yaml" + }, + "3": { + "name": "invalid.illegal.flow.alias.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + "presentation-detail": { + "patterns": [ + { + "match": "[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + }, + { + "include": "#comment" + }, + { + "include": "#unknown" + } + ] + }, + "non-printable": { + "//": { + "85": "Â…", + "2028": "
", + "2029": "
", + "10000": "ð€€", + "A0": " ", + "D7FF": "퟿", + "E000": "", + "FFFD": "�", + "FFFF": "ï¿¿", + "10FFFF": "ô¿¿" + }, + "match": "[^\t\n\r -~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]++", + "name": "invalid.illegal.non-printable.yaml" + }, + "comment": { + "comment": "Comments must be separated from other tokens by white space characters. `space`, `tab`, `newline` or `carriage-return`. `#(.*)` causes performance issues", + "begin": "(?<=^|[\\x{85 2028 2029} ])#", + "end": "[\\x{85 2028 2029}\r\n]", + "captures": { + "0": { + "name": "punctuation.definition.comment.yaml" + } + }, + "name": "comment.line.number-sign.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + "unknown": { + "match": ".[[^\\x{85}#\"':,\\[\\]{}]&&!-~\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]*+", + "name": "invalid.illegal.unrecognized.yaml markup.strikethrough" + } + } +} \ No newline at end of file diff --git a/extensions/yaml/syntaxes/yaml-1.1.tmLanguage.json b/extensions/yaml/syntaxes/yaml-1.1.tmLanguage.json new file mode 100644 index 0000000000000..bda3a191ce8ce --- /dev/null +++ b/extensions/yaml/syntaxes/yaml-1.1.tmLanguage.json @@ -0,0 +1,1792 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/RedCMD/YAML-Syntax-Highlighter/blob/master/syntaxes/yaml-1.1.tmLanguage.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/RedCMD/YAML-Syntax-Highlighter/commit/287c71aeb0773759497822b5e5ce4bdc4d5ef2aa", + "name": "YAML 1.1", + "scopeName": "source.yaml.1.1", + "comment": "https://yaml.org/spec/1.1/", + "patterns": [ + { + "include": "#stream" + } + ], + "repository": { + "stream": { + "patterns": [ + { + "comment": "allows me to just use `\\G` instead of the performance heavy `(^|\\G)`", + "begin": "^(?!\\G)", + "while": "^", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#byte-order-mark" + }, + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G", + "while": "\\G", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#byte-order-mark" + }, + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-YAML": { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "(?=%YAML[ \t]+1\\.1(?=[\\x{85 2028 2029}\r\n\t ]))", + "end": "\\G(?=%(?!YAML[ \t]+1\\.1))", + "name": "meta.1.1.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "\\G(%)(YAML)([ \t]+)(1\\.1)", + "while": "\\G(?!---[\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.yaml.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "constant.numeric.yaml-version.yaml" + } + }, + "name": "meta.directives.yaml", + "patterns": [ + { + "include": "#directive-invalid" + }, + { + "include": "#directives" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G(?=---[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?!%)", + "patterns": [ + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + "directives": { + "comment": "https://yaml.org/spec/1.2.2/#68-directives", + "patterns": [ + { + "include": "source.yaml.1.3#directive-YAML" + }, + { + "include": "source.yaml.1.2#directive-YAML" + }, + { + "include": "source.yaml.1.1#directive-YAML" + }, + { + "include": "source.yaml.1.0#directive-YAML" + }, + { + "begin": "(?=%)", + "while": "\\G(?!%|---[\\x{85 2028 2029}\r\n\t ])", + "name": "meta.directives.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#682-tag-directives", + "begin": "\\G(%)(TAG)(?>([\t ]++)((!)(?>[0-9A-Za-z-]*+(!))?+))?+", + "end": "$", + "applyEndPatternLast": true, + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.tag.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "storage.type.tag-handle.yaml" + }, + "5": { + "name": "punctuation.definition.tag.begin.yaml" + }, + "6": { + "name": "punctuation.definition.tag.end.yaml" + }, + "comment": "https://yaml.org/spec/1.2.2/#rule-c-tag-handle" + }, + "patterns": [ + { + "comment": "technically the beginning should only validate against a valid uri scheme [A-Za-z][A-Za-z0-9.+-]*", + "begin": "\\G[\t ]++(?!#)", + "end": "(?=[\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "0": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "contentName": "support.type.tag-prefix.yaml", + "patterns": [ + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\\x{85 2028 2029}\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "\\G[,\\[\\]{}]", + "name": "invalid.illegal.character.uri.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\\x{85 2028 2029}\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.!~*'()\\[\\]]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-reserved-directive", + "begin": "(%)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.other.yaml" + } + }, + "patterns": [ + { + "match": "\\G([\t ]++)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-name.yaml" + } + } + }, + { + "match": "([\t ]++)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-parameter.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "match": "\\G\\.{3}(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-invalid": { + "patterns": [ + { + "match": "\\G\\.{3}(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "begin": "\\G(%)(YAML)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "invalid.illegal.keyword.other.directive.yaml.yaml" + } + }, + "name": "meta.directive.yaml", + "patterns": [ + { + "match": "\\G([\t ]++|:)([0-9]++\\.[0-9]++)?+", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "constant.numeric.yaml-version.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "document": { + "comment": "https://yaml.org/spec/1.2.2/#91-documents", + "patterns": [ + { + "begin": "---(?=[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?!(?>\\.{3}|---)[\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "0": { + "name": "entity.other.document.begin.yaml" + } + }, + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + { + "begin": "(?=\\.{3}[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?=[\t \\x{FEFF}]*+(?>#|$))", + "patterns": [ + { + "begin": "\\G\\.{3}", + "end": "$", + "beginCaptures": { + "0": { + "name": "entity.other.document.end.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#byte-order-mark" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G(?!%|[\t \\x{FEFF}]*+(?>#|$))", + "while": "\\G(?!(?>\\.{3}|---)[\\x{85 2028 2029}\r\n\t ])", + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + } + ] + }, + "block-node": { + "patterns": [ + { + "include": "#block-sequence" + }, + { + "include": "#block-mapping" + }, + { + "include": "#block-scalar" + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "while": "\\G", + "patterns": [ + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "begin": "(?=\\[|{)", + "while": "\\G", + "patterns": [ + { + "include": "#block-mapping" + }, + { + "begin": "(?!\\G)(?![\r\n\t ])", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#block-plain-out" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-mapping": { + "//": "The check for plain keys is expensive", + "begin": "(?=((?<=[-?:]) )?+)(?[!&*][^\\x{85 2028 2029}\r\n\t ]*+[\t ]++)*+)(?=(?>(?#Double Quote)\"(?>[^\\\\\"]++|\\\\.)*+\"|(?#Single Quote)'(?>[^']++|'')*+'|(?#Plain)(?>[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))(?>[^:#]++|:(?![\\x{85 2028 2029}\r\n\t ])|(?(\\1\\2)((?>[!&*][^\\x{85 2028 2029}\r\n\t ]*+[\t ]++)*+)((?>\t[\t ]*+)?+[^\\x{85 2028 2029}\r\n\t ?:\\-#!&*\"'\\[\\]{}0-9A-Za-z$()+./;<=\\\\^_~\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}])?+|( *+)([\t ]*+[^\\x{85 2028 2029}\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "5": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "4": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "5": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.mapping.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style (BLOCK-KEY)", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + { + "include": "#block-key-plain" + }, + { + "include": "#block-map-value" + }, + { + "include": "#block-map-explicit" + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#rule-l+block-sequence", + "begin": "(?=((?<=[-?:]) )?+)(?(\\1\\2)(?!-[\\x{85 2028 2029}\r\n\t ])((?>\t[\t ]*+)?+[^\\x{85 2028 2029}\r\n\t #\\]}])?+|(?!\\1\\2)( *+)([\t ]*+[^\\x{85 2028 2029}\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.block.sequence.item.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.block.sequence.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-map-explicit": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-explicit-key", + "begin": "(?=((?<=[-?:]) )?+)\\G( *+)(\\?)(?=[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?>(\\1\\2)(?![?:0-9A-Za-z$()+./;<=\\\\^_~\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{2028 2029 FEFF}]])((?>\t[\t ]*+)?+[^\\x{85 2028 2029}\r\n\t #\\-\\[\\]{}])?+|(?!\\1\\2)( *+)([\t ]*+[^\\x{85 2028 2029}\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.map.key.yaml" + }, + "4": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.map.explicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-key-plain-out" + }, + { + "include": "#block-map-value" + }, + { + "include": "#block-node" + } + ] + }, + "block-map-value": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-implicit-value", + "begin": "(:)(?=[\\x{85 2028 2029}\r\n\t ])", + "while": "\\G(?![?:!\"'0-9A-Za-z$()+./;<=\\\\^_~\\[{\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{2028 2029 FEFF}]]|-[^\\x{85 2028 2029}\r\n\t ])", + "beginCaptures": { + "1": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.map.value.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-key-plain": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (BLOCK-KEY)", + "begin": "\\G(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))", + "end": "(?=[\t ]*+:[\\x{85 2028 2029}\r\n\t ]|(?>[\t ]++|\\G)#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G([\t ]++)(.)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "invalid.illegal.multiline-key.yaml" + } + } + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "block-scalar": { + "comment": "https://yaml.org/spec/1.2.2/#81-block-scalar-styles", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#8111-block-indentation-indicator", + "begin": "([\t ]*+)(?>(\\|)|(>))(?[+-])?+((1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9))(?()|([+-]))?+", + "while": "\\G(?>(?>(?!\\6) |(?!\\7) {2}|(?!\\8) {3}|(?!\\9) {4}|(?!\\10) {5}|(?!\\11) {6}|(?!\\12) {7}|(?!\\13) {8}|(?!\\14) {9})| *+($|[^#]))", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + }, + "5": { + "name": "constant.numeric.indentation-indicator.yaml" + }, + "15": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "whileCaptures": { + "0": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "1": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "begin": "$", + "while": "\\G", + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-b-block-header", + "//": "Soooooooo many edge cases", + "begin": "([\t ]*+)(?>(\\|)|(>))([+-]?+)", + "while": "\\G", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-literal-content", + "begin": "$", + "while": "\\G", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "//": "Find the highest indented line", + "begin": "\\G( ++)$", + "while": "\\G(?>(\\1)$|(?!\\1)( *+)($|.))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-b-nb-literal-next", + "//": [ + "Funky wrapper function", + "The `end` pattern clears the parent `\\G` anchor", + "Affectively forcing this rule to only match at most once", + "https://github.com/microsoft/vscode-textmate/issues/114" + ], + "begin": "\\G(?!$)(?=( *+))", + "end": "\\G(?!\\1)(?=[\t ]*+#)", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "begin": "\\G( *+)", + "while": "\\G(?>(\\1)|( *+)($|[^\t#]|[\t ]++[^#]))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-chomped-empty", + "begin": "(?!\\G)(?=[\t ]*+#)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "Header Comment", + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + } + ] + }, + "block-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-OUT)", + "begin": "(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))", + "while": "\\G", + "patterns": [ + { + "begin": "\\G", + "end": "(?=(?>[\t ]++|\\G)#)", + "name": "string.unquoted.plain.out.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": ":(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-node": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-seq-entry (FLOW-IN)", + "patterns": [ + { + "begin": "(?=\\[|{)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "include": "#flow-plain-in" + }, + { + "include": "#presentation-detail" + } + ] + }, + "flow-mapping": { + "comment": "https://yaml.org/spec/1.2.2/#742-flow-mappings", + "begin": "{", + "end": "}", + "beginCaptures": { + "0": { + "name": "punctuation.definition.mapping.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.mapping.end.yaml" + } + }, + "name": "meta.flow.mapping.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-map-entries", + "begin": "(?<={)\\G(?=[\\x{85 2028 2029}\r\n\t ,#])|,", + "end": "(?=[^\\x{85 2028 2029}\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.mapping.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-map-key-mapping" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#741-flow-sequences", + "begin": "\\[", + "end": "]", + "beginCaptures": { + "0": { + "name": "punctuation.definition.sequence.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.sequence.end.yaml" + } + }, + "name": "meta.flow.sequence.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-seq-entries", + "begin": "(?<=\\[)\\G(?=[\\x{85 2028 2029}\r\n\t ,#])|,", + "end": "(?=[^\\x{85 2028 2029}\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.sequence.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-map-key-sequence" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-map-key-mapping": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-map-key-mapping" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=(?>[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}])))", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#flow-key-plain-in" + }, + { + "match": ":(?=\\[|{)", + "name": "invalid.illegal.separator.map.yaml" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=\"|')", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-map-key-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-map-key-mapping" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?<=[\t ,\\[{]|^)(?=(?>[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))(?>[^:#,\\[\\]{}]++|:(?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}])|(?\"(?>[^\\\\\"]++|\\\\.)*+\"|'(?>[^']++|'')*+')[\t ]*+:)", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-map-value-yaml": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": ":(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-map-value-json": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": "(?<=(?>[\"'\\]}]|^)[\t ]*+):", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-IN)", + "begin": "(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "end": "(?=(?>[\t ]++|\\G)#|[\t ]*+[,\\[\\]{}])", + "name": "string.unquoted.plain.in.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": ":(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (FLOW-OUT)", + "begin": "(?=[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}]|[?:-](?![\\x{85 2028 2029}\r\n\t ]))", + "end": "(?=[\t ]*+:[\\x{85 2028 2029}\r\n\t ]|[\t ]++#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-implicit-yaml-key (FLOW-KEY)", + "begin": "\\G(?![\\x{85 2028 2029}\r\n\t #])", + "end": "(?=[\t ]*+(?>:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]|[,\\[\\]{}])|[\t ]++#)", + "name": "meta.flow.map.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "include": "#non-printable" + } + ] + }, + "key-double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + "key-single": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + "double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "string.quoted.double.yaml", + "patterns": [ + { + "match": "(?x[^\"]{2,0}|u[^\"]{4,0}|U[^\"]{8,0}|.)", + "name": "invalid.illegal.constant.character.escape.yaml" + } + ] + }, + "tag-implicit-plain-in": { + "comment": "https://yaml.org/type/index.html", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE|y|Y|yes|Yes|YES|n|N|no|No|NO|on|On|ON|off|Off|OFF)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[-+]?+(0|[1-9][0-9_]*+)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G[-+]?+0b[0-1_]++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.binary.yaml" + }, + { + "match": "\\G[-+]?0[0-7_]++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G[-+]?+0x[0-9a-fA-F_]++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[-+]?+[1-9][0-9_]*+(?>:[0-5]?[0-9])++(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+(?>[0-9][0-9_]*+)?+\\.[0-9.]*+(?>[eE][-+][0-9]+)?+(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.decimal.yaml" + }, + { + "match": "\\G[-+]?+[0-9][0-9_]*+(?>:[0-5]?[0-9])++\\.[0-9_]*+(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.nan.yaml" + }, + { + "comment": "https://www.w3.org/TR/NOTE-datetime does not allow spaces, however https://yaml.org/type/timestamp.html does, but the provided regex doesn't match the TZD space in many of the YAML examples", + "match": "\\G(?>[0-9]{4}-[0-9]{2,1}-[0-9]{2,1}(?>T|t|[\t ]++)[0-9]{2,1}:[0-9]{2}:[0-9]{2}(?>\\.[0-9]*+)?+[\t ]*+(?>Z|[-+][0-9]{2,1}(?>:[0-9]{2})?+)?+|[0-9]{4}-[0-9]{2}-[0-9]{2})(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.timestamp.yaml" + }, + { + "match": "\\G<<(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.merge.yaml" + }, + { + "match": "\\G=(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.value.yaml" + }, + { + "match": "\\G(?>!|&|\\*)(?=[\t ]++#|[\t ]*+(?>[\\x{85 2028 2029}\r\n,\\]}]|:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]))", + "name": "constant.language.yaml.yaml" + } + ] + }, + "tag-implicit-plain-out": { + "comment": "https://yaml.org/type/index.html", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE|yes|Yes|YES|y|Y|no|No|NO|n|N|on|On|ON|off|Off|OFF)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[-+]?+(0|[1-9][0-9_]*+)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G[-+]?+0b[0-1_]++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.binary.yaml" + }, + { + "match": "\\G[-+]?0[0-7_]++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G[-+]?+0x[0-9a-fA-F_]++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[-+]?+[1-9][0-9_]*+(?>:[0-5]?[0-9])++(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.integer.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+(?>[0-9][0-9_]*+)?+\\.[0-9.]*+(?>[eE][-+][0-9]+)?+(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.decimal.yaml" + }, + { + "match": "\\G[-+]?+[0-9][0-9_]*+(?>:[0-5]?[0-9])++\\.[0-9_]*+(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.Sexagesimal.yaml" + }, + { + "match": "\\G[-+]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.float.nan.yaml" + }, + { + "comment": "https://www.w3.org/TR/NOTE-datetime does not allow spaces, however https://yaml.org/type/timestamp.html does, but the provided regex doesn't match the TZD space in many of the YAML examples", + "match": "\\G(?>[0-9]{4}-[0-9]{2,1}-[0-9]{2,1}(?>T|t|[\t ]++)[0-9]{2,1}:[0-9]{2}:[0-9]{2}(?>\\.[0-9]*+)?+[\t ]*+(?>Z|[-+][0-9]{2,1}(?>:[0-9]{2})?+)?+|[0-9]{4}-[0-9]{2}-[0-9]{2})(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.numeric.timestamp.yaml" + }, + { + "match": "\\G<<(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.merge.yaml" + }, + { + "match": "\\G=(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.value.yaml" + }, + { + "match": "\\G(?>!|&|\\*)(?=[\t ]++#|[\t ]*+(?>$|:[\\x{85 2028 2029}\r\n\t ]))", + "name": "constant.language.yaml.yaml" + } + ] + }, + "tag-property": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-tag-property", + "//": [ + "!", + "!!", + "!<>", + "!...", + "!!...", + "!<...>", + "!...!..." + ], + "patterns": [ + { + "match": "!(?=[\\x{85 2028 2029}\r\n\t ])", + "name": "storage.type.tag.non-specific.yaml punctuation.definition.tag.non-specific.yaml" + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-verbatim-tag", + "begin": "!<", + "end": ">", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.yaml" + } + }, + "name": "storage.type.tag.verbatim.yaml", + "patterns": [ + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\\x{85 2028 2029}\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\\x{85 2028 2029}\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.!~*'()\\[\\]%>]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-shorthand-tag", + "begin": "(?=!)", + "end": "(?=[\\x{85 2028 2029}\r\n\t ,\\[\\]{}])", + "name": "storage.type.tag.shorthand.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-secondary-tag-handle", + "match": "\\G!!", + "name": "punctuation.definition.tag.secondary.yaml" + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-secondary-tag-handle", + "match": "\\G(!)[0-9A-Za-z-]++(!)", + "captures": { + "1": { + "name": "punctuation.definition.tag.named.yaml" + }, + "2": { + "name": "punctuation.definition.tag.named.yaml" + } + } + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-primary-tag-handle", + "match": "\\G!", + "name": "punctuation.definition.tag.primary.yaml" + }, + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\\x{85 2028 2029}\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\\x{85 2028 2029}\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.~*'()\\[\\]%]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + } + ] + }, + "anchor-property": { + "match": "(&)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)|(&)", + "captures": { + "0": { + "name": "keyword.control.flow.anchor.yaml" + }, + "1": { + "name": "punctuation.definition.anchor.yaml" + }, + "2": { + "name": "variable.other.anchor.yaml" + }, + "3": { + "name": "invalid.illegal.flow.anchor.yaml" + } + } + }, + "alias": { + "begin": "(\\*)([^ \\p{Cntrl}\\p{Surrogate}\\x{2028 2029 FFFE FFFF}]++)|(\\*)", + "end": "(?=:[\\x{85 2028 2029}\r\n\t ,\\[\\]{}]|[,\\[\\]{}])", + "captures": { + "0": { + "name": "keyword.control.flow.alias.yaml" + }, + "1": { + "name": "punctuation.definition.alias.yaml" + }, + "2": { + "name": "variable.other.alias.yaml" + }, + "3": { + "name": "invalid.illegal.flow.alias.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + "byte-order-mark": { + "comment": "", + "begin": "\\G", + "while": "\\G(?=[\\x{FEFF 85 2028 2029}\r\n\t ])", + "patterns": [ + { + "begin": "(?=#)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G\\x{FEFF}", + "while": "\\G", + "beginCaptures": { + "0": { + "name": "byte-order-mark.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + "presentation-detail": { + "patterns": [ + { + "match": "[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "comment": "https://yaml.org/spec/1.1/#id871136", + "match": "[\\x{85 2028 2029}\r\n]++", + "name": "punctuation.separator.line-break.yaml" + }, + { + "include": "#non-printable" + }, + { + "include": "#comment" + }, + { + "include": "#unknown" + } + ] + }, + "non-printable": { + "//": { + "85": "Â…", + "2028": "
", + "2029": "
", + "10000": "ð€€", + "A0": " ", + "D7FF": "퟿", + "E000": "", + "FFFD": "�", + "FEFF": "", + "FFFF": "ï¿¿", + "10FFFF": "ô¿¿" + }, + "match": "[^\t\n\r -~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]++", + "name": "invalid.illegal.non-printable.yaml" + }, + "comment": { + "comment": "Comments must be separated from other tokens by white space characters. `space`, `newline` or `carriage-return`. `#(.*)` causes performance issues", + "begin": "(?<=^|[\\x{FEFF 85 2028 2029} ])#", + "end": "[\\x{85 2028 2029}\r\n]", + "captures": { + "0": { + "name": "punctuation.definition.comment.yaml" + } + }, + "name": "comment.line.number-sign.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + "unknown": { + "match": ".[[^\\x{85}#\"':,\\[\\]{}]&&!-~\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]*+", + "name": "invalid.illegal.unrecognized.yaml markup.strikethrough" + } + } +} \ No newline at end of file diff --git a/extensions/yaml/syntaxes/yaml-1.2.tmLanguage.json b/extensions/yaml/syntaxes/yaml-1.2.tmLanguage.json new file mode 100644 index 0000000000000..b2a921a5dd19b --- /dev/null +++ b/extensions/yaml/syntaxes/yaml-1.2.tmLanguage.json @@ -0,0 +1,1714 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/RedCMD/YAML-Syntax-Highlighter/blob/master/syntaxes/yaml-1.2.tmLanguage.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/RedCMD/YAML-Syntax-Highlighter/commit/287c71aeb0773759497822b5e5ce4bdc4d5ef2aa", + "name": "YAML 1.2", + "scopeName": "source.yaml.1.2", + "comment": "https://yaml.org/spec/1.2.2", + "patterns": [ + { + "include": "#stream" + } + ], + "repository": { + "stream": { + "patterns": [ + { + "comment": "allows me to just use `\\G` instead of the performance heavy `(^|\\G)`", + "begin": "^(?!\\G)", + "while": "^", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#byte-order-mark" + }, + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G", + "while": "\\G", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#byte-order-mark" + }, + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-YAML": { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "(?=%YAML[\t ]+1\\.2(?=[\r\n\t ]))", + "end": "\\G(?=(?>\\.{3}|---)[\r\n\t ])", + "name": "meta.1.2.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "\\G(%)(YAML)([\t ]+)(1\\.2)", + "end": "\\G(?=---[\r\n\t ])", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.yaml.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "constant.numeric.yaml-version.yaml" + } + }, + "name": "meta.directives.yaml", + "patterns": [ + { + "include": "#directive-invalid" + }, + { + "include": "#directives" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#document" + } + ] + }, + "directives": { + "comment": "https://yaml.org/spec/1.2.2/#68-directives", + "patterns": [ + { + "include": "source.yaml.1.3#directive-YAML" + }, + { + "include": "source.yaml.1.2#directive-YAML" + }, + { + "include": "source.yaml.1.1#directive-YAML" + }, + { + "include": "source.yaml.1.0#directive-YAML" + }, + { + "begin": "(?=%)", + "while": "\\G(?!%|---[\r\n\t ])", + "name": "meta.directives.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#682-tag-directives", + "begin": "\\G(%)(TAG)(?>([\t ]++)((!)(?>[0-9A-Za-z-]*+(!))?+))?+", + "end": "$", + "applyEndPatternLast": true, + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.tag.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "storage.type.tag-handle.yaml" + }, + "5": { + "name": "punctuation.definition.tag.begin.yaml" + }, + "6": { + "name": "punctuation.definition.tag.end.yaml" + }, + "comment": "https://yaml.org/spec/1.2.2/#rule-c-tag-handle" + }, + "patterns": [ + { + "comment": "technically the beginning should only validate against a valid uri scheme [A-Za-z][A-Za-z0-9.+-]*", + "begin": "\\G[\t ]++(?!#)", + "end": "(?=[\r\n\t ])", + "beginCaptures": { + "0": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "contentName": "support.type.tag-prefix.yaml", + "patterns": [ + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "\\G[,\\[\\]{}]", + "name": "invalid.illegal.character.uri.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.!~*'()\\[\\]]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-reserved-directive", + "begin": "(%)([\\x{85}[^ \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.other.yaml" + } + }, + "patterns": [ + { + "match": "\\G([\t ]++)([\\x{85}[^ \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-name.yaml" + } + } + }, + { + "match": "([\t ]++)([\\x{85}[^ \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-parameter.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "match": "\\G\\.{3}(?=[\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-invalid": { + "patterns": [ + { + "match": "\\G\\.{3}(?=[\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "begin": "\\G(%)(YAML)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "invalid.illegal.keyword.other.directive.yaml.yaml" + } + }, + "name": "meta.directive.yaml", + "patterns": [ + { + "match": "\\G([\t ]++|:)([0-9]++\\.[0-9]++)?+", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "constant.numeric.yaml-version.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "document": { + "comment": "https://yaml.org/spec/1.2.2/#91-documents", + "patterns": [ + { + "begin": "---(?=[\r\n\t ])", + "while": "\\G(?!(?>\\.{3}|---)[\r\n\t ])", + "beginCaptures": { + "0": { + "name": "entity.other.document.begin.yaml" + } + }, + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + { + "begin": "(?=\\.{3}[\r\n\t ])", + "while": "\\G(?=[\t \\x{FEFF}]*+(?>#|$))", + "patterns": [ + { + "begin": "\\G\\.{3}", + "end": "$", + "beginCaptures": { + "0": { + "name": "entity.other.document.end.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#byte-order-mark" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G(?!%|[\t \\x{FEFF}]*+(?>#|$))", + "while": "\\G(?!(?>\\.{3}|---)[\r\n\t ])", + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + } + ] + }, + "block-node": { + "patterns": [ + { + "include": "#block-sequence" + }, + { + "include": "#block-mapping" + }, + { + "include": "#block-scalar" + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "while": "\\G", + "patterns": [ + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "begin": "(?=\\[|{)", + "while": "\\G", + "patterns": [ + { + "include": "#block-mapping" + }, + { + "begin": "(?!\\G)(?![\r\n\t ])", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#block-plain-out" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-mapping": { + "//": "The check for plain keys is expensive", + "begin": "(?=((?<=[-?:]) )?+)(?((?>[!&*][^\r\n\t ]*+[\t ]++)*+)(?=(?>(?#Double Quote)\"(?>[^\\\\\"]++|\\\\.)*+\"|(?#Single Quote)'(?>[^']++|'')*+'|(?#Plain)(?>[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))(?>[^:#]++|:(?![\r\n\t ])|(?(\\1\\2)((?>[!&*][^\r\n\t ]*+[\t ]++)*+)((?>\t[\t ]*+)?+[^\r\n\t ?:\\-#!&*\"'\\[\\]{}0-9A-Za-z$()+./;<=\\\\^_~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}])?+|( *+)([\t ]*+[^\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "5": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "4": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "5": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.mapping.yaml", + "patterns": [ + { + "include": "#block-map-key-double" + }, + { + "include": "#block-map-key-single" + }, + { + "include": "#block-map-key-plain" + }, + { + "include": "#block-map-key-explicit" + }, + { + "include": "#block-map-value" + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#rule-l+block-sequence", + "begin": "(?=((?<=[-?:]) )?+)(?(\\1\\2)(?!-[\r\n\t ])((?>\t[\t ]*+)?+[^\r\n\t #\\]}])?+|(?!\\1\\2)( *+)([\t ]*+[^\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.block.sequence.item.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.block.sequence.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-map-key-explicit": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-explicit-key", + "begin": "(?=((?<=[-?:]) )?+)\\G( *+)(\\?)(?=[\r\n\t ])", + "while": "\\G(?>(\\1\\2)(?![?:0-9A-Za-z$()+./;<=\\\\^_~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{FEFF}]])((?>\t[\t ]*+)?+[^\r\n\t #\\-\\[\\]{}])?+|(?!\\1\\2)( *+)([\t ]*+[^\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.map.key.yaml" + }, + "4": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.map.explicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-key-plain-out" + }, + { + "include": "#block-map-value" + }, + { + "include": "#block-node" + } + ] + }, + "block-map-key-double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style (BLOCK-KEY)", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + "block-map-key-single": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + "block-map-key-plain": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (BLOCK-KEY)", + "begin": "\\G(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))", + "end": "(?=[\t ]*+:[\r\n\t ]|(?>[\t ]++|\\G)#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G([\t ]++)(.)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "invalid.illegal.multiline-key.yaml" + } + } + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "block-map-value": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-implicit-value", + "begin": ":(?=[\r\n\t ])", + "while": "\\G(?![?:!\"'0-9A-Za-z$()+./;<=\\\\^_~\\[{\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{FEFF}]]|-[^\r\n\t ])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.map.value.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-scalar": { + "comment": "https://yaml.org/spec/1.2.2/#81-block-scalar-styles", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#8111-block-indentation-indicator", + "begin": "([\t ]*+)(?>(\\|)|(>))(?[+-])?+((1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9))(?()|([+-]))?+", + "while": "\\G(?>(?>(?!\\6) |(?!\\7) {2}|(?!\\8) {3}|(?!\\9) {4}|(?!\\10) {5}|(?!\\11) {6}|(?!\\12) {7}|(?!\\13) {8}|(?!\\14) {9})| *+($|[^#]))", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + }, + "5": { + "name": "constant.numeric.indentation-indicator.yaml" + }, + "15": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "whileCaptures": { + "0": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "1": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "begin": "$", + "while": "\\G", + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-b-block-header", + "//": "Soooooooo many edge cases", + "begin": "([\t ]*+)(?>(\\|)|(>))([+-]?+)", + "while": "\\G", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-literal-content", + "begin": "$", + "while": "\\G", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "//": "Find the highest indented line", + "begin": "\\G( ++)$", + "while": "\\G(?>(\\1)$|(?!\\1)( *+)($|.))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-b-nb-literal-next", + "//": [ + "Funky wrapper function", + "The `end` pattern clears the parent `\\G` anchor", + "Affectively forcing this rule to only match at most once", + "https://github.com/microsoft/vscode-textmate/issues/114" + ], + "begin": "\\G(?!$)(?=( *+))", + "end": "\\G(?!\\1)(?=[\t ]*+#)", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "begin": "\\G( *+)", + "while": "\\G(?>(\\1)|( *+)($|[^\t#]|[\t ]++[^#]))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-chomped-empty", + "begin": "(?!\\G)(?=[\t ]*+#)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "Header Comment", + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + } + ] + }, + "block-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-OUT)", + "begin": "(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))", + "while": "\\G", + "patterns": [ + { + "begin": "\\G", + "end": "(?=(?>[\t ]++|\\G)#)", + "name": "string.unquoted.plain.out.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": ":(?=[\r\n\t ])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-node": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-seq-entry (FLOW-IN)", + "patterns": [ + { + "begin": "(?=\\[|{)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "include": "#flow-plain-in" + }, + { + "include": "#presentation-detail" + } + ] + }, + "flow-mapping": { + "comment": "https://yaml.org/spec/1.2.2/#742-flow-mappings", + "begin": "{", + "end": "}", + "beginCaptures": { + "0": { + "name": "punctuation.definition.mapping.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.mapping.end.yaml" + } + }, + "name": "meta.flow.mapping.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-map-entries", + "begin": "(?<={)\\G(?=[\r\n\t ,#])|,", + "end": "(?=[^\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.mapping.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#741-flow-sequences", + "begin": "\\[", + "end": "]", + "beginCaptures": { + "0": { + "name": "punctuation.definition.sequence.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.sequence.end.yaml" + } + }, + "name": "meta.flow.sequence.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-seq-entries", + "begin": "(?<=\\[)\\G(?=[\r\n\t ,#])|,", + "end": "(?=[^\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.sequence.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-sequence-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-mapping-map-key": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-mapping-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=(?>[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ,\\[\\]{}])))", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#flow-key-plain-in" + }, + { + "match": ":(?=\\[|{)", + "name": "invalid.illegal.separator.map.yaml" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=\"|')", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-sequence-map-key": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-mapping-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?<=[\t ,\\[{]|^)(?=(?>[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ,\\[\\]{}]))(?>[^:#,\\[\\]{}]++|:(?![\r\n\t ,\\[\\]{}])|(?\"(?>[^\\\\\"]++|\\\\.)*+\"|'(?>[^']++|'')*+')[\t ]*+:)", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-map-value-yaml": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": ":(?=[\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-map-value-json": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": "(?<=(?>[\"'\\]}]|^)[\t ]*+):", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-IN)", + "begin": "(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ,\\[\\]{}]))", + "end": "(?=(?>[\t ]++|\\G)#|[\t ]*+[,\\[\\]{}])", + "name": "string.unquoted.plain.in.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": ":(?=[\r\n\t ,\\[\\]{}])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (FLOW-OUT)", + "begin": "(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))", + "end": "(?=[\t ]*+:[\r\n\t ]|[\t ]++#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-implicit-yaml-key (FLOW-KEY)", + "begin": "\\G(?![\r\n\t #])", + "end": "(?=[\t ]*+(?>:[\r\n\t ,\\[\\]{}]|[,\\[\\]{}])|[\t ]++#)", + "name": "meta.flow.map.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "key-double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + "key-single": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + "double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "string.quoted.double.yaml", + "patterns": [ + { + "match": "(?x[^\"]{2,0}|u[^\"]{4,0}|U[^\"]{8,0}|.)", + "name": "invalid.illegal.constant.character.escape.yaml" + } + ] + }, + "tag-implicit-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#103-core-schema", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[+-]?+[0-9]++(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G0o[0-7]++(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G0x[0-9a-fA-F]++(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[+-]?+(?>\\.[0-9]++|[0-9]++(?>\\.[0-9]*+)?+)(?>[eE][+-]?+[0-9]++)?+(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.yaml" + }, + { + "match": "\\G[+-]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.nan.yaml" + } + ] + }, + "tag-implicit-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#103-core-schema", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[+-]?+[0-9]++(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G0o[0-7]++(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G0x[0-9a-fA-F]++(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[+-]?+(?>\\.[0-9]++|[0-9]++(?>\\.[0-9]*+)?+)(?>[eE][+-]?+[0-9]++)?+(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.float.yaml" + }, + { + "match": "\\G[+-]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.float.nan.yaml" + } + ] + }, + "tag-property": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-tag-property", + "//": [ + "!", + "!!", + "!<>", + "!...", + "!!...", + "!<...>", + "!...!..." + ], + "patterns": [ + { + "match": "!(?=[\r\n\t ])", + "name": "storage.type.tag.non-specific.yaml punctuation.definition.tag.non-specific.yaml" + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-verbatim-tag", + "begin": "!<", + "end": ">", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.yaml" + } + }, + "name": "storage.type.tag.verbatim.yaml", + "patterns": [ + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.!~*'()\\[\\]%>]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-shorthand-tag", + "begin": "(?=!)", + "end": "(?=[\r\n\t ,\\[\\]{}])", + "name": "storage.type.tag.shorthand.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-secondary-tag-handle", + "match": "\\G!!", + "name": "punctuation.definition.tag.secondary.yaml" + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-secondary-tag-handle", + "match": "\\G(!)[0-9A-Za-z-]++(!)", + "captures": { + "1": { + "name": "punctuation.definition.tag.named.yaml" + }, + "2": { + "name": "punctuation.definition.tag.named.yaml" + } + } + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-primary-tag-handle", + "match": "\\G!", + "name": "punctuation.definition.tag.primary.yaml" + }, + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\r\n\t a-zA-Z0-9-#;/?:@&=+$_.~*'()%]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + } + ] + }, + "anchor-property": { + "match": "(&)([\\x{85}[^ ,\\[\\]{}\\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)|(&)", + "captures": { + "0": { + "name": "keyword.control.flow.anchor.yaml" + }, + "1": { + "name": "punctuation.definition.anchor.yaml" + }, + "2": { + "name": "variable.other.anchor.yaml" + }, + "3": { + "name": "invalid.illegal.flow.anchor.yaml" + } + } + }, + "alias": { + "begin": "(\\*)([\\x{85}[^ ,\\[\\]{}\\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)|(\\*)", + "end": "(?=:[\r\n\t ,\\[\\]{}]|[,\\[\\]{}])", + "captures": { + "0": { + "name": "keyword.control.flow.alias.yaml" + }, + "1": { + "name": "punctuation.definition.alias.yaml" + }, + "2": { + "name": "variable.other.alias.yaml" + }, + "3": { + "name": "invalid.illegal.flow.alias.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + "byte-order-mark": { + "comment": "", + "match": "\\G\\x{FEFF}++", + "name": "byte-order-mark.yaml" + }, + "presentation-detail": { + "patterns": [ + { + "match": "[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + }, + { + "include": "#comment" + }, + { + "include": "#unknown" + } + ] + }, + "non-printable": { + "//": { + "85": "Â…", + "10000": "ð€€", + "A0": " ", + "D7FF": "퟿", + "E000": "", + "FFFD": "�", + "FEFF": "", + "FFFF": "ï¿¿", + "10FFFF": "ô¿¿" + }, + "//match": "[\\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}&&[^\t\n\r\\x{85}]]++", + "match": "[^\t\n\r -~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]++", + "name": "invalid.illegal.non-printable.yaml" + }, + "comment": { + "comment": "Comments must be separated from other tokens by white space characters. `space`, `tab`, `newline` or `carriage-return`. `#(.*)` causes performance issues", + "begin": "(?<=[\\x{FEFF}\t ]|^)#", + "end": "\r|\n", + "captures": { + "0": { + "name": "punctuation.definition.comment.yaml" + } + }, + "name": "comment.line.number-sign.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + "unknown": { + "match": ".[[^\"':,\\[\\]{}]&&!-~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]*+", + "name": "invalid.illegal.unrecognized.yaml markup.strikethrough" + } + } +} \ No newline at end of file diff --git a/extensions/yaml/syntaxes/yaml-1.3.tmLanguage.json b/extensions/yaml/syntaxes/yaml-1.3.tmLanguage.json new file mode 100644 index 0000000000000..56444fd9fa20c --- /dev/null +++ b/extensions/yaml/syntaxes/yaml-1.3.tmLanguage.json @@ -0,0 +1,1714 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/RedCMD/YAML-Syntax-Highlighter/blob/master/syntaxes/yaml-1.3.tmLanguage.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/RedCMD/YAML-Syntax-Highlighter/commit/287c71aeb0773759497822b5e5ce4bdc4d5ef2aa", + "name": "YAML 1.3", + "scopeName": "source.yaml.1.3", + "comment": "https://spec.yaml.io/main/spec/1.3.0/", + "patterns": [ + { + "include": "#stream" + } + ], + "repository": { + "stream": { + "patterns": [ + { + "comment": "allows me to just use `\\G` instead of the performance heavy `(^|\\G)`", + "begin": "^(?!\\G)", + "while": "^", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#byte-order-mark" + }, + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G", + "while": "\\G", + "name": "meta.stream.yaml", + "patterns": [ + { + "include": "#byte-order-mark" + }, + { + "include": "#directives" + }, + { + "include": "#document" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-YAML": { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "(?=%YAML[\t ]+1\\.3(?=[\r\n\t ]))", + "end": "\\G(?=(?>\\.{3}|---)[\r\n\t ])", + "name": "meta.1.3.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#681-yaml-directives", + "begin": "\\G(%)(YAML)([\t ]+)(1\\.3)", + "end": "\\G(?=---[\r\n\t ])", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.yaml.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "constant.numeric.yaml-version.yaml" + } + }, + "name": "meta.directives.yaml", + "patterns": [ + { + "include": "#directive-invalid" + }, + { + "include": "#directives" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#document" + } + ] + }, + "directives": { + "comment": "https://yaml.org/spec/1.2.2/#68-directives", + "patterns": [ + { + "include": "source.yaml.1.3#directive-YAML" + }, + { + "include": "source.yaml.1.2#directive-YAML" + }, + { + "include": "source.yaml.1.1#directive-YAML" + }, + { + "include": "source.yaml.1.0#directive-YAML" + }, + { + "begin": "(?=%)", + "while": "\\G(?!%|---[\r\n\t ])", + "name": "meta.directives.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#682-tag-directives", + "begin": "\\G(%)(TAG)(?>([\t ]++)((!)(?>[0-9A-Za-z-]*+(!))?+))?+", + "end": "$", + "applyEndPatternLast": true, + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.tag.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "name": "storage.type.tag-handle.yaml" + }, + "5": { + "name": "punctuation.definition.tag.begin.yaml" + }, + "6": { + "name": "punctuation.definition.tag.end.yaml" + }, + "comment": "https://yaml.org/spec/1.2.2/#rule-c-tag-handle" + }, + "patterns": [ + { + "comment": "technically the beginning should only validate against a valid uri scheme [A-Za-z][A-Za-z0-9.+-]*", + "begin": "\\G[\t ]++(?!#)", + "end": "(?=[\r\n\t ])", + "beginCaptures": { + "0": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "contentName": "support.type.tag-prefix.yaml", + "patterns": [ + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "\\G[,\\[\\]{}]", + "name": "invalid.illegal.character.uri.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.!~*'()\\[\\]]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-reserved-directive", + "begin": "(%)([\\x{85}[^ \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "keyword.other.directive.other.yaml" + } + }, + "patterns": [ + { + "match": "\\G([\t ]++)([\\x{85}[^ \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-name.yaml" + } + } + }, + { + "match": "([\t ]++)([\\x{85}[^ \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "string.unquoted.directive-parameter.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "match": "\\G\\.{3}(?=[\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "directive-invalid": { + "patterns": [ + { + "match": "\\G\\.{3}(?=[\r\n\t ])", + "name": "invalid.illegal.entity.other.document.end.yaml" + }, + { + "begin": "\\G(%)(YAML)", + "end": "$", + "beginCaptures": { + "1": { + "name": "punctuation.definition.directive.begin.yaml" + }, + "2": { + "name": "invalid.illegal.keyword.other.directive.yaml.yaml" + } + }, + "name": "meta.directive.yaml", + "patterns": [ + { + "match": "\\G([\t ]++|:)([0-9]++\\.[0-9]++)?+", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "constant.numeric.yaml-version.yaml" + } + } + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "document": { + "comment": "https://yaml.org/spec/1.2.2/#91-documents", + "patterns": [ + { + "begin": "---(?=[\r\n\t ])", + "while": "\\G(?!(?>\\.{3}|---)[\r\n\t ])", + "beginCaptures": { + "0": { + "name": "entity.other.document.begin.yaml" + } + }, + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + { + "begin": "(?=\\.{3}[\r\n\t ])", + "while": "\\G(?=[\t \\x{FEFF}]*+(?>#|$))", + "patterns": [ + { + "begin": "\\G\\.{3}", + "end": "$", + "beginCaptures": { + "0": { + "name": "entity.other.document.end.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#byte-order-mark" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "begin": "\\G(?!%|[\t \\x{FEFF}]*+(?>#|$))", + "while": "\\G(?!(?>\\.{3}|---)[\r\n\t ])", + "name": "meta.document.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + } + ] + }, + "block-node": { + "patterns": [ + { + "include": "#block-sequence" + }, + { + "include": "#block-mapping" + }, + { + "include": "#block-scalar" + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "while": "\\G", + "patterns": [ + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "begin": "(?=\\[|{)", + "while": "\\G", + "patterns": [ + { + "include": "#block-mapping" + }, + { + "begin": "(?!\\G)(?![\r\n\t ])", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#block-plain-out" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-mapping": { + "//": "The check for plain keys is expensive", + "begin": "(?=((?<=[-?:]) )?+)(?((?>[!&*][^\r\n\t ]*+[\t ]++)*+)(?=(?>(?#Double Quote)\"(?>[^\\\\\"]++|\\\\.)*+\"|(?#Single Quote)'(?>[^']++|'')*+'|(?#Plain)(?>[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))(?>[^:#]++|:(?![\r\n\t ])|(?(\\1\\2)((?>[!&*][^\r\n\t ]*+[\t ]++)*+)((?>\t[\t ]*+)?+[^\r\n\t ?:\\-#!&*\"'\\[\\]{}0-9A-Za-z$()+./;<=\\\\^_~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}])?+|( *+)([\t ]*+[^\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.separator.yaml" + }, + "4": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "5": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "comment": "May cause lag on long lines starting with a tag, anchor or alias", + "patterns": [ + { + "include": "#tag-property" + }, + { + "include": "#anchor-property" + }, + { + "include": "#alias" + }, + { + "include": "#presentation-detail" + } + ] + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "4": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "5": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.mapping.yaml", + "patterns": [ + { + "include": "#block-map-key-double" + }, + { + "include": "#block-map-key-single" + }, + { + "include": "#block-map-key-plain" + }, + { + "include": "#block-map-key-explicit" + }, + { + "include": "#block-map-value" + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + }, + { + "include": "#presentation-detail" + } + ] + }, + "block-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#rule-l+block-sequence", + "begin": "(?=((?<=[-?:]) )?+)(?(\\1\\2)(?!-[\r\n\t ])((?>\t[\t ]*+)?+[^\r\n\t #\\]}])?+|(?!\\1\\2)( *+)([\t ]*+[^\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.block.sequence.item.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.block.sequence.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-map-key-explicit": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-explicit-key", + "begin": "(?=((?<=[-?:]) )?+)\\G( *+)(\\?)(?=[\r\n\t ])", + "while": "\\G(?>(\\1\\2)(?![?:0-9A-Za-z$()+./;<=\\\\^_~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{FEFF}]])((?>\t[\t ]*+)?+[^\r\n\t #\\-\\[\\]{}])?+|(?!\\1\\2)( *+)([\t ]*+[^\r\n#])?+)", + "beginCaptures": { + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "punctuation.definition.map.key.yaml" + }, + "4": { + "name": "punctuation.whitespace.separator.yaml" + } + }, + "whileCaptures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "invalid.illegal.expected-indentation.yaml" + }, + "3": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "4": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.map.explicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-key-plain-out" + }, + { + "include": "#block-map-value" + }, + { + "include": "#block-node" + } + ] + }, + "block-map-key-double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style (BLOCK-KEY)", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + "block-map-key-single": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": ".[\t ]*+$", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + "block-map-key-plain": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (BLOCK-KEY)", + "begin": "\\G(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))", + "end": "(?=[\t ]*+:[\r\n\t ]|(?>[\t ]++|\\G)#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G([\t ]++)(.)", + "captures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "invalid.illegal.multiline-key.yaml" + } + } + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "block-map-value": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-l-block-map-implicit-value", + "begin": ":(?=[\r\n\t ])", + "while": "\\G(?![?:!\"'0-9A-Za-z$()+./;<=\\\\^_~\\[{\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}&&[^\\x{FEFF}]]|-[^\r\n\t ])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.map.value.yaml", + "patterns": [ + { + "include": "#block-node" + } + ] + }, + "block-scalar": { + "comment": "https://yaml.org/spec/1.2.2/#81-block-scalar-styles", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#8111-block-indentation-indicator", + "begin": "([\t ]*+)(?>(\\|)|(>))(?[+-])?+((1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9))(?()|([+-]))?+", + "while": "\\G(?>(?>(?!\\6) |(?!\\7) {2}|(?!\\8) {3}|(?!\\9) {4}|(?!\\10) {5}|(?!\\11) {6}|(?!\\12) {7}|(?!\\13) {8}|(?!\\14) {9})| *+($|[^#]))", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + }, + "5": { + "name": "constant.numeric.indentation-indicator.yaml" + }, + "15": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "whileCaptures": { + "0": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "1": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "begin": "$", + "while": "\\G", + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-b-block-header", + "//": "Soooooooo many edge cases", + "begin": "([\t ]*+)(?>(\\|)|(>))([+-]?+)", + "while": "\\G", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.separator.yaml" + }, + "2": { + "name": "keyword.control.flow.block-scalar.literal.yaml" + }, + "3": { + "name": "keyword.control.flow.block-scalar.folded.yaml" + }, + "4": { + "name": "storage.modifier.chomping-indicator.yaml" + } + }, + "name": "meta.scalar.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-literal-content", + "begin": "$", + "while": "\\G", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "//": "Find the highest indented line", + "begin": "\\G( ++)$", + "while": "\\G(?>(\\1)$|(?!\\1)( *+)($|.))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-b-nb-literal-next", + "//": [ + "Funky wrapper function", + "The `end` pattern clears the parent `\\G` anchor", + "Affectively forcing this rule to only match at most once", + "https://github.com/microsoft/vscode-textmate/issues/114" + ], + "begin": "\\G(?!$)(?=( *+))", + "end": "\\G(?!\\1)(?=[\t ]*+#)", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-nb-literal-text", + "begin": "\\G( *+)", + "while": "\\G(?>(\\1)|( *+)($|[^\t#]|[\t ]++[^#]))", + "captures": { + "1": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "2": { + "name": "punctuation.whitespace.indentation.yaml" + }, + "3": { + "name": "invalid.illegal.expected-indentation.yaml" + } + }, + "contentName": "string.unquoted.block.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-l-chomped-empty", + "begin": "(?!\\G)(?=[\t ]*+#)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + { + "comment": "Header Comment", + "begin": "\\G", + "end": "$", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + } + ] + }, + "block-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-OUT)", + "begin": "(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))", + "while": "\\G", + "patterns": [ + { + "begin": "\\G", + "end": "(?=(?>[\t ]++|\\G)#)", + "name": "string.unquoted.plain.out.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": ":(?=[\r\n\t ])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + { + "begin": "(?!\\G)", + "while": "\\G", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-node": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-seq-entry (FLOW-IN)", + "patterns": [ + { + "begin": "(?=\\[|{)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping" + }, + { + "include": "#flow-sequence" + } + ] + }, + { + "include": "#anchor-property" + }, + { + "include": "#tag-property" + }, + { + "include": "#alias" + }, + { + "begin": "(?=\"|')", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "begin": "(?!\\G)", + "end": "(?=[:,\\]}])", + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#double" + }, + { + "include": "#single" + } + ] + }, + { + "include": "#flow-plain-in" + }, + { + "include": "#presentation-detail" + } + ] + }, + "flow-mapping": { + "comment": "https://yaml.org/spec/1.2.2/#742-flow-mappings", + "begin": "{", + "end": "}", + "beginCaptures": { + "0": { + "name": "punctuation.definition.mapping.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.mapping.end.yaml" + } + }, + "name": "meta.flow.mapping.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-map-entries", + "begin": "(?<={)\\G(?=[\r\n\t ,#])|,", + "end": "(?=[^\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.mapping.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-mapping-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-sequence": { + "comment": "https://yaml.org/spec/1.2.2/#741-flow-sequences", + "begin": "\\[", + "end": "]", + "beginCaptures": { + "0": { + "name": "punctuation.definition.sequence.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.sequence.end.yaml" + } + }, + "name": "meta.flow.sequence.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-flow-seq-entries", + "begin": "(?<=\\[)\\G(?=[\r\n\t ,#])|,", + "end": "(?=[^\r\n\t ,#])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.sequence.yaml" + } + }, + "patterns": [ + { + "match": ",++", + "name": "invalid.illegal.separator.sequence.yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "include": "#flow-sequence-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + "flow-mapping-map-key": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-mapping-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=(?>[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ,\\[\\]{}])))", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#flow-key-plain-in" + }, + { + "match": ":(?=\\[|{)", + "name": "invalid.illegal.separator.map.yaml" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#presentation-detail" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?=\"|')", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-sequence-map-key": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-entry (FLOW-IN)", + "patterns": [ + { + "begin": "\\?(?=[\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\[\\]{}])", + "beginCaptures": { + "0": { + "name": "punctuation.definition.map.key.yaml" + } + }, + "name": "meta.flow.map.explicit.yaml", + "patterns": [ + { + "include": "#flow-mapping-map-key" + }, + { + "include": "#flow-map-value-yaml" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#flow-node" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-flow-map-implicit-entry (FLOW-IN)", + "begin": "(?<=[\t ,\\[{]|^)(?=(?>[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ,\\[\\]{}]))(?>[^:#,\\[\\]{}]++|:(?![\r\n\t ,\\[\\]{}])|(?\"(?>[^\\\\\"]++|\\\\.)*+\"|'(?>[^']++|'')*+')[\t ]*+:)", + "end": "(?=[,\\[\\]{}])", + "name": "meta.flow.map.implicit.yaml", + "patterns": [ + { + "include": "#key-double" + }, + { + "include": "#key-single" + }, + { + "include": "#flow-map-value-json" + }, + { + "include": "#presentation-detail" + } + ] + } + ] + }, + "flow-map-value-yaml": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": ":(?=[\r\n\t ,\\[\\]{}])", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-map-value-json": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-flow-map-separate-value (FLOW-IN)", + "begin": "(?<=(?>[\"'\\]}]|^)[\t ]*+):", + "end": "(?=[,\\]}])", + "beginCaptures": { + "0": { + "name": "punctuation.separator.map.value.yaml" + } + }, + "name": "meta.flow.pair.value.yaml", + "patterns": [ + { + "include": "#flow-node" + } + ] + }, + "flow-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-multi-line (FLOW-IN)", + "begin": "(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ,\\[\\]{}]))", + "end": "(?=(?>[\t ]++|\\G)#|[\t ]*+[,\\[\\]{}])", + "name": "string.unquoted.plain.in.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": ":(?=[\r\n\t ,\\[\\]{}])", + "name": "invalid.illegal.multiline-key.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-plain-one-line (FLOW-OUT)", + "begin": "(?=[\\x{85}[^-?:,\\[\\]{}#&*!|>'\"%@` \\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]|[?:-](?![\r\n\t ]))", + "end": "(?=[\t ]*+:[\r\n\t ]|[\t ]++#)", + "name": "meta.map.key.yaml string.unquoted.plain.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-out" + }, + { + "match": "\\G[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "[\t ]++$", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "flow-key-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#rule-ns-s-implicit-yaml-key (FLOW-KEY)", + "begin": "\\G(?![\r\n\t #])", + "end": "(?=[\t ]*+(?>:[\r\n\t ,\\[\\]{}]|[,\\[\\]{}])|[\t ]++#)", + "name": "meta.flow.map.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", + "patterns": [ + { + "include": "#tag-implicit-plain-in" + }, + { + "match": "\\x{FEFF}", + "name": "invalid.illegal.bom.yaml" + }, + { + "include": "#non-printable" + } + ] + }, + "key-double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\\G\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.double.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "include": "#double-escape" + } + ] + }, + "key-single": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-single-quoted (BLOCK-KEY)", + "begin": "\\G'", + "end": "'(?!')", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "meta.map.key.yaml string.quoted.single.yaml entity.name.tag.yaml", + "patterns": [ + { + "match": "[^\t -\\x{10FFFF}]++", + "name": "invalid.illegal.character.yaml" + }, + { + "match": "''", + "name": "constant.character.escape.single-quote.yaml" + } + ] + }, + "double": { + "comment": "https://yaml.org/spec/1.2.2/#double-quoted-style", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.yaml" + } + }, + "name": "string.quoted.double.yaml", + "patterns": [ + { + "match": "(?x[^\"]{2,0}|u[^\"]{4,0}|U[^\"]{8,0}|.)", + "name": "invalid.illegal.constant.character.escape.yaml" + } + ] + }, + "tag-implicit-plain-in": { + "comment": "https://yaml.org/spec/1.2.2/#103-core-schema", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[+-]?+[0-9]++(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G0o[0-7]++(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G0x[0-9a-fA-F]++(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[+-]?+(?>\\.[0-9]++|[0-9]++(?>\\.[0-9]*+)?+)(?>[eE][+-]?+[0-9]++)?+(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.yaml" + }, + { + "match": "\\G[+-]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>[\r\n,\\]}]|:[\r\n\t ,\\[\\]{}]))", + "name": "constant.numeric.float.nan.yaml" + } + ] + }, + "tag-implicit-plain-out": { + "comment": "https://yaml.org/spec/1.2.2/#103-core-schema", + "patterns": [ + { + "match": "\\G(?>null|Null|NULL|~)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.language.null.yaml" + }, + { + "match": "\\G(?>true|True|TRUE|false|False|FALSE)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.language.boolean.yaml" + }, + { + "match": "\\G[+-]?+[0-9]++(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.integer.decimal.yaml" + }, + { + "match": "\\G0o[0-7]++(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.integer.octal.yaml" + }, + { + "match": "\\G0x[0-9a-fA-F]++(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.integer.hexadecimal.yaml" + }, + { + "match": "\\G[+-]?+(?>\\.[0-9]++|[0-9]++(?>\\.[0-9]*+)?+)(?>[eE][+-]?+[0-9]++)?+(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.float.yaml" + }, + { + "match": "\\G[+-]?+\\.(?>inf|Inf|INF)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.float.inf.yaml" + }, + { + "match": "\\G\\.(?>nan|NaN|NAN)(?=[\t ]++#|[\t ]*+(?>$|:[\r\n\t ]))", + "name": "constant.numeric.float.nan.yaml" + } + ] + }, + "tag-property": { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-tag-property", + "//": [ + "!", + "!!", + "!<>", + "!...", + "!!...", + "!<...>", + "!...!..." + ], + "patterns": [ + { + "match": "!(?=[\r\n\t ])", + "name": "storage.type.tag.non-specific.yaml punctuation.definition.tag.non-specific.yaml" + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-verbatim-tag", + "begin": "!<", + "end": ">", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.yaml" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.yaml" + } + }, + "name": "storage.type.tag.verbatim.yaml", + "patterns": [ + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\r\n\t a-zA-Z0-9-#;/?:@&=+$,_.!~*'()\\[\\]%>]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-ns-shorthand-tag", + "begin": "(?=!)", + "end": "(?=[\r\n\t ,\\[\\]{}])", + "name": "storage.type.tag.shorthand.yaml", + "patterns": [ + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-secondary-tag-handle", + "match": "\\G!!", + "name": "punctuation.definition.tag.secondary.yaml" + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-secondary-tag-handle", + "match": "\\G(!)[0-9A-Za-z-]++(!)", + "captures": { + "1": { + "name": "punctuation.definition.tag.named.yaml" + }, + "2": { + "name": "punctuation.definition.tag.named.yaml" + } + } + }, + { + "comment": "https://yaml.org/spec/1.2.2/#rule-c-primary-tag-handle", + "match": "\\G!", + "name": "punctuation.definition.tag.primary.yaml" + }, + { + "match": "%[0-9a-fA-F]{2}", + "name": "constant.character.escape.unicode.8-bit.yaml" + }, + { + "match": "%[^\r\n\t ]{2,0}", + "name": "invalid.illegal.constant.character.escape.unicode.8-bit.yaml" + }, + { + "include": "#non-printable" + }, + { + "match": "[^\r\n\t a-zA-Z0-9-#;/?:@&=+$_.~*'()%]++", + "name": "invalid.illegal.unrecognized.yaml" + } + ] + } + ] + }, + "anchor-property": { + "match": "(&)([\\x{85}[^ ,\\[\\]{}\\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)|(&)", + "captures": { + "0": { + "name": "keyword.control.flow.anchor.yaml" + }, + "1": { + "name": "punctuation.definition.anchor.yaml" + }, + "2": { + "name": "variable.other.anchor.yaml" + }, + "3": { + "name": "invalid.illegal.flow.anchor.yaml" + } + } + }, + "alias": { + "begin": "(\\*)([\\x{85}[^ ,\\[\\]{}\\p{Cntrl}\\p{Surrogate}\\x{FEFF FFFE FFFF}]]++)|(\\*)", + "end": "(?=:[\r\n\t ,\\[\\]{}]|[,\\[\\]{}])", + "captures": { + "0": { + "name": "keyword.control.flow.alias.yaml" + }, + "1": { + "name": "punctuation.definition.alias.yaml" + }, + "2": { + "name": "variable.other.alias.yaml" + }, + "3": { + "name": "invalid.illegal.flow.alias.yaml" + } + }, + "patterns": [ + { + "include": "#presentation-detail" + } + ] + }, + "byte-order-mark": { + "comment": "", + "match": "\\G\\x{FEFF}++", + "name": "byte-order-mark.yaml" + }, + "presentation-detail": { + "patterns": [ + { + "match": "[\t ]++", + "name": "punctuation.whitespace.separator.yaml" + }, + { + "include": "#non-printable" + }, + { + "include": "#comment" + }, + { + "include": "#unknown" + } + ] + }, + "non-printable": { + "//": { + "85": "Â…", + "10000": "ð€€", + "A0": " ", + "D7FF": "퟿", + "E000": "", + "FFFD": "�", + "FEFF": "", + "FFFF": "ï¿¿", + "10FFFF": "ô¿¿" + }, + "//match": "[\\p{Cntrl}\\p{Surrogate}\\x{FFFE FFFF}&&[^\t\n\r\\x{85}]]++", + "match": "[^\t\n\r -~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]++", + "name": "invalid.illegal.non-printable.yaml" + }, + "comment": { + "comment": "Comments must be separated from other tokens by white space characters. `space`, `tab`, `newline` or `carriage-return`. `#(.*)` causes performance issues", + "begin": "(?<=[\\x{FEFF}\t ]|^)#", + "end": "\r|\n", + "captures": { + "0": { + "name": "punctuation.definition.comment.yaml" + } + }, + "name": "comment.line.number-sign.yaml", + "patterns": [ + { + "include": "#non-printable" + } + ] + }, + "unknown": { + "match": ".[[^\"':,\\[\\]{}]&&!-~\\x{85}\\x{A0}-\\x{D7FF}\\x{E000}-\\x{FFFD}\\x{010000}-\\x{10FFFF}]*+", + "name": "invalid.illegal.unrecognized.yaml markup.strikethrough" + } + } +} \ No newline at end of file diff --git a/extensions/yaml/syntaxes/yaml.tmLanguage.json b/extensions/yaml/syntaxes/yaml.tmLanguage.json index 447df713901d0..39d8e5864421d 100644 --- a/extensions/yaml/syntaxes/yaml.tmLanguage.json +++ b/extensions/yaml/syntaxes/yaml.tmLanguage.json @@ -1,621 +1,21 @@ { "information_for_contributors": [ - "This file has been converted from https://github.com/textmate/yaml.tmbundle/blob/master/Syntaxes/YAML.tmLanguage", + "This file has been converted from https://github.com/RedCMD/YAML-Syntax-Highlighter/blob/master/syntaxes/yaml.tmLanguage.json", "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/textmate/yaml.tmbundle/commit/e54ceae3b719506dba7e481a77cea4a8b576ae46", - "name": "YAML", + "version": "https://github.com/RedCMD/YAML-Syntax-Highlighter/commit/5d2a15e2ee4bb9c2cc9a86a0b72aea8fa2aba1e1", + "name": "YAML Ain't Markup Language", "scopeName": "source.yaml", "patterns": [ { - "include": "#comment" - }, - { - "include": "#property" - }, - { - "include": "#directive" - }, - { - "match": "^---", - "name": "entity.other.document.begin.yaml" - }, - { - "match": "^\\.{3}", - "name": "entity.other.document.end.yaml" - }, - { - "include": "#node" + "comment": "Default to YAML version 1.2", + "include": "source.yaml.1.2" } ], "repository": { - "block-collection": { - "patterns": [ - { - "include": "#block-sequence" - }, - { - "include": "#block-mapping" - } - ] - }, - "block-mapping": { - "patterns": [ - { - "include": "#block-pair" - } - ] - }, - "block-node": { - "patterns": [ - { - "include": "#prototype" - }, - { - "include": "#block-scalar" - }, - { - "include": "#block-collection" - }, - { - "include": "#flow-scalar-plain-out" - }, - { - "include": "#flow-node" - } - ] - }, - "block-pair": { - "patterns": [ - { - "begin": "\\?", - "beginCaptures": { - "1": { - "name": "punctuation.definition.key-value.begin.yaml" - } - }, - "end": "(?=\\?)|^ *(:)|(:)", - "endCaptures": { - "1": { - "name": "punctuation.separator.key-value.mapping.yaml" - }, - "2": { - "name": "invalid.illegal.expected-newline.yaml" - } - }, - "name": "meta.block-mapping.yaml", - "patterns": [ - { - "include": "#block-node" - } - ] - }, - { - "begin": "(?x)\n (?=\n (?x:\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] \\S\n )\n (\n [^\\s:]\n | : \\S\n | \\s+ (?![#\\s])\n )*\n \\s*\n :\n\t\t\t\t\t\t\t(\\s|$)\n )\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n ", - "patterns": [ - { - "include": "#flow-scalar-plain-out-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] \\S\n ", - "beginCaptures": { - "0": { - "name": "entity.name.tag.yaml" - } - }, - "contentName": "entity.name.tag.yaml", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n ", - "name": "string.unquoted.plain.out.yaml" - } - ] - }, - { - "match": ":(?=\\s|$)", - "name": "punctuation.separator.key-value.mapping.yaml" - } - ] - }, - "block-scalar": { - "begin": "(?:(\\|)|(>))([1-9])?([-+])?(.*\\n?)", - "beginCaptures": { - "1": { - "name": "keyword.control.flow.block-scalar.literal.yaml" - }, - "2": { - "name": "keyword.control.flow.block-scalar.folded.yaml" - }, - "3": { - "name": "constant.numeric.indentation-indicator.yaml" - }, - "4": { - "name": "storage.modifier.chomping-indicator.yaml" - }, - "5": { - "patterns": [ - { - "include": "#comment" - }, - { - "match": ".+", - "name": "invalid.illegal.expected-comment-or-newline.yaml" - } - ] - } - }, - "end": "^(?=\\S)|(?!\\G)", - "patterns": [ - { - "begin": "^([ ]+)(?! )", - "end": "^(?!\\1|\\s*$)", - "name": "string.unquoted.block.yaml" - } - ] - }, - "block-sequence": { - "match": "(-)(?!\\S)", - "name": "punctuation.definition.block.sequence.item.yaml" - }, - "comment": { - "begin": "(?:(^[ \\t]*)|[ \\t]+)(?=#\\p{Print}*$)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.yaml" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "begin": "#", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.yaml" - } - }, - "end": "\\n", - "name": "comment.line.number-sign.yaml" - } - ] - }, - "directive": { - "begin": "^%", - "beginCaptures": { - "0": { - "name": "punctuation.definition.directive.begin.yaml" - } - }, - "end": "(?=$|[ \\t]+($|#))", - "name": "meta.directive.yaml", - "patterns": [ - { - "captures": { - "1": { - "name": "keyword.other.directive.yaml.yaml" - }, - "2": { - "name": "constant.numeric.yaml-version.yaml" - } - }, - "match": "\\G(YAML)[ \\t]+(\\d+\\.\\d+)" - }, - { - "captures": { - "1": { - "name": "keyword.other.directive.tag.yaml" - }, - "2": { - "name": "storage.type.tag-handle.yaml" - }, - "3": { - "name": "support.type.tag-prefix.yaml" - } - }, - "match": "(?x)\n \\G\n (TAG)\n (?:[ \\t]+\n ((?:!(?:[0-9A-Za-z\\-]*!)?))\n (?:[ \\t]+ (\n ! (?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )*\n | (?![,!\\[\\]{}]) (?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+\n )\n )?\n )?\n " - }, - { - "captures": { - "1": { - "name": "support.other.directive.reserved.yaml" - }, - "2": { - "name": "string.unquoted.directive-name.yaml" - }, - "3": { - "name": "string.unquoted.directive-parameter.yaml" - } - }, - "match": "(?x) \\G (\\w+) (?:[ \\t]+ (\\w+) (?:[ \\t]+ (\\w+))? )?" - }, - { - "match": "\\S+", - "name": "invalid.illegal.unrecognized.yaml" - } - ] - }, - "flow-alias": { - "captures": { - "1": { - "name": "keyword.control.flow.alias.yaml" - }, - "2": { - "name": "punctuation.definition.alias.yaml" - }, - "3": { - "name": "variable.other.alias.yaml" - }, - "4": { - "name": "invalid.illegal.character.anchor.yaml" - } - }, - "match": "((\\*))([^\\s\\[\\]/{/},]+)([^\\s\\]},]\\S*)?" - }, - "flow-collection": { - "patterns": [ - { - "include": "#flow-sequence" - }, - { - "include": "#flow-mapping" - } - ] - }, - "flow-mapping": { - "begin": "\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.mapping.begin.yaml" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.mapping.end.yaml" - } - }, - "name": "meta.flow-mapping.yaml", - "patterns": [ - { - "include": "#prototype" - }, - { - "match": ",", - "name": "punctuation.separator.mapping.yaml" - }, - { - "include": "#flow-pair" - } - ] - }, - "flow-node": { - "patterns": [ - { - "include": "#prototype" - }, - { - "include": "#flow-alias" - }, - { - "include": "#flow-collection" - }, - { - "include": "#flow-scalar" - } - ] - }, - "flow-pair": { - "patterns": [ - { - "begin": "\\?", - "beginCaptures": { - "0": { - "name": "punctuation.definition.key-value.begin.yaml" - } - }, - "end": "(?=[},\\]])", - "name": "meta.flow-pair.explicit.yaml", - "patterns": [ - { - "include": "#prototype" - }, - { - "include": "#flow-pair" - }, - { - "include": "#flow-node" - }, - { - "begin": ":(?=\\s|$|[\\[\\]{},])", - "beginCaptures": { - "0": { - "name": "punctuation.separator.key-value.mapping.yaml" - } - }, - "end": "(?=[},\\]])", - "patterns": [ - { - "include": "#flow-value" - } - ] - } - ] - }, - { - "begin": "(?x)\n (?=\n (?:\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] [^\\s[\\[\\]{},]]\n )\n (\n [^\\s:[\\[\\]{},]]\n | : [^\\s[\\[\\]{},]]\n | \\s+ (?![#\\s])\n )*\n \\s*\n :\n\t\t\t\t\t\t\t(\\s|$)\n )\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n ", - "name": "meta.flow-pair.key.yaml", - "patterns": [ - { - "include": "#flow-scalar-plain-in-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] [^\\s[\\[\\]{},]]\n ", - "beginCaptures": { - "0": { - "name": "entity.name.tag.yaml" - } - }, - "contentName": "entity.name.tag.yaml", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n ", - "name": "string.unquoted.plain.in.yaml" - } - ] - }, - { - "include": "#flow-node" - }, - { - "begin": ":(?=\\s|$|[\\[\\]{},])", - "captures": { - "0": { - "name": "punctuation.separator.key-value.mapping.yaml" - } - }, - "end": "(?=[},\\]])", - "name": "meta.flow-pair.yaml", - "patterns": [ - { - "include": "#flow-value" - } - ] - } - ] - }, - "flow-scalar": { - "patterns": [ - { - "include": "#flow-scalar-double-quoted" - }, - { - "include": "#flow-scalar-single-quoted" - }, - { - "include": "#flow-scalar-plain-in" - } - ] - }, - "flow-scalar-double-quoted": { - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.yaml" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.yaml" - } - }, - "name": "string.quoted.double.yaml", - "patterns": [ - { - "match": "\\\\([0abtnvfre \"/\\\\N_Lp]|x\\d\\d|u\\d{4}|U\\d{8})", - "name": "constant.character.escape.yaml" - }, - { - "match": "\\\\\\n", - "name": "constant.character.escape.double-quoted.newline.yaml" - } - ] - }, - "flow-scalar-plain-in": { - "patterns": [ - { - "include": "#flow-scalar-plain-in-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] [^\\s[\\[\\]{},]]\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n ", - "name": "string.unquoted.plain.in.yaml" - } - ] - }, - "flow-scalar-plain-in-implicit-type": { - "patterns": [ - { - "captures": { - "1": { - "name": "constant.language.null.yaml" - }, - "2": { - "name": "constant.language.boolean.yaml" - }, - "3": { - "name": "constant.numeric.integer.yaml" - }, - "4": { - "name": "constant.numeric.float.yaml" - }, - "5": { - "name": "constant.other.timestamp.yaml" - }, - "6": { - "name": "constant.language.value.yaml" - }, - "7": { - "name": "constant.language.merge.yaml" - } - }, - "match": "(?x)\n (?x:\n (null|Null|NULL|~)\n | (y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)\n | (\n (?:\n [-+]? 0b [0-1_]+ # (base 2)\n | [-+]? 0 [0-7_]+ # (base 8)\n | [-+]? (?: 0|[1-9][0-9_]*) # (base 10)\n | [-+]? 0x [0-9a-fA-F_]+ # (base 16)\n | [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60)\n )\n )\n | (\n (?x:\n [-+]? (?: [0-9] [0-9_]*)? \\. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10)\n | [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \\. [0-9_]* # (base 60)\n | [-+]? \\. (?: inf|Inf|INF) # (infinity)\n | \\. (?: nan|NaN|NAN) # (not a number)\n )\n )\n | (\n (?x:\n \\d{4} - \\d{2} - \\d{2} # (y-m-d)\n | \\d{4} # (year)\n - \\d{1,2} # (month)\n - \\d{1,2} # (day)\n (?: [Tt] | [ \\t]+) \\d{1,2} # (hour)\n : \\d{2} # (minute)\n : \\d{2} # (second)\n (?: \\.\\d*)? # (fraction)\n (?:\n (?:[ \\t]*) Z\n | [-+] \\d{1,2} (?: :\\d{1,2})?\n )? # (time zone)\n )\n )\n | (=)\n | (<<)\n )\n (?:\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n | \\s* : [\\[\\]{},]\n | \\s* [\\[\\]{},]\n )\n )\n " - } - ] - }, - "flow-scalar-plain-out": { - "patterns": [ - { - "include": "#flow-scalar-plain-out-implicit-type" - }, - { - "begin": "(?x)\n [^\\s[-?:,\\[\\]{}#&*!|>'\"%@`]]\n | [?:-] \\S\n ", - "end": "(?x)\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n ", - "name": "string.unquoted.plain.out.yaml" - } - ] - }, - "flow-scalar-plain-out-implicit-type": { - "patterns": [ - { - "captures": { - "1": { - "name": "constant.language.null.yaml" - }, - "2": { - "name": "constant.language.boolean.yaml" - }, - "3": { - "name": "constant.numeric.integer.yaml" - }, - "4": { - "name": "constant.numeric.float.yaml" - }, - "5": { - "name": "constant.other.timestamp.yaml" - }, - "6": { - "name": "constant.language.value.yaml" - }, - "7": { - "name": "constant.language.merge.yaml" - } - }, - "match": "(?x)\n (?x:\n (null|Null|NULL|~)\n | (y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF)\n | (\n (?:\n [-+]? 0b [0-1_]+ # (base 2)\n | [-+]? 0 [0-7_]+ # (base 8)\n | [-+]? (?: 0|[1-9][0-9_]*) # (base 10)\n | [-+]? 0x [0-9a-fA-F_]+ # (base 16)\n | [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60)\n )\n )\n | (\n (?x:\n [-+]? (?: [0-9] [0-9_]*)? \\. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10)\n | [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \\. [0-9_]* # (base 60)\n | [-+]? \\. (?: inf|Inf|INF) # (infinity)\n | \\. (?: nan|NaN|NAN) # (not a number)\n )\n )\n | (\n (?x:\n \\d{4} - \\d{2} - \\d{2} # (y-m-d)\n | \\d{4} # (year)\n - \\d{1,2} # (month)\n - \\d{1,2} # (day)\n (?: [Tt] | [ \\t]+) \\d{1,2} # (hour)\n : \\d{2} # (minute)\n : \\d{2} # (second)\n (?: \\.\\d*)? # (fraction)\n (?:\n (?:[ \\t]*) Z\n | [-+] \\d{1,2} (?: :\\d{1,2})?\n )? # (time zone)\n )\n )\n | (=)\n | (<<)\n )\n (?x:\n (?=\n \\s* $\n | \\s+ \\#\n | \\s* : (\\s|$)\n )\n )\n " - } - ] - }, - "flow-scalar-single-quoted": { - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.yaml" - } - }, - "end": "'(?!')", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.yaml" - } - }, - "name": "string.quoted.single.yaml", - "patterns": [ - { - "match": "''", - "name": "constant.character.escape.single-quoted.yaml" - } - ] - }, - "flow-sequence": { - "begin": "\\[", - "beginCaptures": { - "0": { - "name": "punctuation.definition.sequence.begin.yaml" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "punctuation.definition.sequence.end.yaml" - } - }, - "name": "meta.flow-sequence.yaml", - "patterns": [ - { - "include": "#prototype" - }, - { - "match": ",", - "name": "punctuation.separator.sequence.yaml" - }, - { - "include": "#flow-pair" - }, - { - "include": "#flow-node" - } - ] - }, - "flow-value": { - "patterns": [ - { - "begin": "\\G(?![},\\]])", - "end": "(?=[},\\]])", - "name": "meta.flow-pair.value.yaml", - "patterns": [ - { - "include": "#flow-node" - } - ] - } - ] - }, - "node": { - "patterns": [ - { - "include": "#block-node" - } - ] - }, - "property": { - "begin": "(?=!|&)", - "end": "(?!\\G)", - "name": "meta.property.yaml", - "patterns": [ - { - "captures": { - "1": { - "name": "keyword.control.property.anchor.yaml" - }, - "2": { - "name": "punctuation.definition.anchor.yaml" - }, - "3": { - "name": "entity.name.type.anchor.yaml" - }, - "4": { - "name": "invalid.illegal.character.anchor.yaml" - } - }, - "match": "\\G((&))([^\\s\\[\\]/{/},]+)(\\S+)?" - }, - { - "match": "(?x)\n \\G\n (?:\n ! < (?: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+ >\n | (?:!(?:[0-9A-Za-z\\-]*!)?) (?: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$_.~*'()] )+\n | !\n )\n (?=\\ |\\t|$)\n ", - "name": "storage.type.tag-handle.yaml" - }, - { - "match": "\\S+", - "name": "invalid.illegal.tag-handle.yaml" - } - ] - }, - "prototype": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#property" - } - ] + "parity": { + "comment": "Yes... That is right. Due to the changes with \\x2028, \\x2029, \\x85 and 'tags'. This is all the code I was able to reuse between all versions 1.3, 1.2, 1.1 and 1.0" } } } \ No newline at end of file From 502b5628b107a09671a7b8cc27e8609a9cbcc7b7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 3 Jul 2024 04:08:45 -0700 Subject: [PATCH 619/755] Fix eslint rule suppressions in terminal/ Fixes #219708 --- .eslintrc.json | 3 ++- .../commandDetection/promptInputModel.test.ts | 13 +++++-------- .../chat/test/browser/terminalInitialHint.test.ts | 10 ++++++---- .../browser/terminalSuggestAddon.integrationTest.ts | 10 +++++----- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index db383e0b9b482..e9df5ec8a8c22 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -738,7 +738,8 @@ "vs/platform/*/~", "tas-client-umd", // node module allowed even in /common/ "@microsoft/1ds-core-js", // node module allowed even in /common/ - "@microsoft/1ds-post-js" // node module allowed even in /common/ + "@microsoft/1ds-post-js", // node module allowed even in /common/ + "@xterm/headless" // node module allowed even in /common/ ] }, { diff --git a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts index 18f410a147f66..7d7e6849b8a28 100644 --- a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts +++ b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts @@ -3,12 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// HACK: Ignore warnings, technically this requires browser/ but it's run on renderer.html anyway so -// it's fine in tests. Importing @xterm/headless appears to prevent `yarn test-browser` from running -// at all. -// eslint-disable-next-line local/code-import-patterns, local/code-amd-node-module -import { Terminal } from '@xterm/xterm'; - +import type { Terminal } from '@xterm/headless'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; import { PromptInputModel, type IPromptInputModelState } from 'vs/platform/terminal/common/capabilities/commandDetection/promptInputModel'; @@ -16,6 +11,7 @@ import { Emitter } from 'vs/base/common/event'; import type { ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities'; import { notDeepStrictEqual, strictEqual } from 'assert'; import { timeout } from 'vs/base/common/async'; +import { importAMDNodeModule } from 'vs/amdX'; suite('PromptInputModel', () => { const store = ensureNoDisposablesAreLeakedInTestSuite(); @@ -61,8 +57,9 @@ suite('PromptInputModel', () => { strictEqual(promptInputModel.cursorIndex, cursorIndex, `value=${promptInputModel.value}`); } - setup(() => { - xterm = store.add(new Terminal({ allowProposedApi: true })); + setup(async () => { + const TerminalCtor = (await importAMDNodeModule('@xterm/headless', 'lib-headless/xterm-headless.js')).Terminal; + xterm = store.add(new TerminalCtor({ allowProposedApi: true })); onCommandStart = store.add(new Emitter()); onCommandExecuted = store.add(new Emitter()); promptInputModel = store.add(new PromptInputModel(xterm, onCommandStart.event, onCommandExecuted.event, new NullLogService)); diff --git a/src/vs/workbench/contrib/terminalContrib/chat/test/browser/terminalInitialHint.test.ts b/src/vs/workbench/contrib/terminalContrib/chat/test/browser/terminalInitialHint.test.ts index d3a1a8a0b119a..0558b023b165b 100644 --- a/src/vs/workbench/contrib/terminalContrib/chat/test/browser/terminalInitialHint.test.ts +++ b/src/vs/workbench/contrib/terminalContrib/chat/test/browser/terminalInitialHint.test.ts @@ -2,8 +2,8 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// eslint-disable-next-line local/code-import-patterns, local/code-amd-node-module -import { Terminal } from '@xterm/xterm'; + +import type { Terminal } from '@xterm/xterm'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ShellIntegrationAddon } from 'vs/platform/terminal/common/xterm/shellIntegrationAddon'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; @@ -14,6 +14,7 @@ import { Emitter } from 'vs/base/common/event'; import { strictEqual } from 'assert'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ChatAgentLocation, IChatAgent } from 'vs/workbench/contrib/chat/common/chatAgents'; +import { importAMDNodeModule } from 'vs/amdX'; // Test TerminalInitialHintAddon @@ -46,9 +47,10 @@ suite('Terminal Initial Hint Addon', () => { locations: [ChatAgentLocation.fromRaw('editor')], invoke: async () => { return {}; } }; - setup(() => { + setup(async () => { const instantiationService = workbenchInstantiationService({}, store); - xterm = store.add(new Terminal()); + const TerminalCtor = (await importAMDNodeModule('@xterm/xterm', 'lib/xterm.js')).Terminal; + xterm = store.add(new TerminalCtor()); const shellIntegrationAddon = store.add(new ShellIntegrationAddon('', true, undefined, new NullLogService)); initialHintAddon = store.add(instantiationService.createInstance(InitialHintAddon, shellIntegrationAddon.capabilities, onDidChangeAgents)); store.add(initialHintAddon.onDidRequestCreateHint(() => eventCount++)); diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts index 90c2efa5e75a0..03e1ccd475b48 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalSuggestAddon.integrationTest.ts @@ -3,9 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// eslint-disable-next-line local/code-import-patterns, local/code-amd-node-module -import { Terminal } from '@xterm/xterm'; - +import type { Terminal } from '@xterm/xterm'; import { strictEqual } from 'assert'; import { getActiveDocument } from 'vs/base/browser/dom'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; @@ -30,6 +28,7 @@ import { events as windows11_pwsh_namespace_completion } from 'vs/workbench/cont import { events as windows11_pwsh_type_before_prompt } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_type_before_prompt'; import { events as windows11_pwsh_writehost_multiline_nav_up } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_writehost_multiline_nav_up'; import { events as windows11_pwsh_writehost_multiline } from 'vs/workbench/contrib/terminalContrib/suggest/test/browser/recordings/windows11_pwsh_writehost_multiline'; +import { importAMDNodeModule } from 'vs/amdX'; const recordedTestCases: { name: string; events: RecordedSessionEvent[] }[] = [ { name: 'macos_bash_echo_simple', events: macos_bash_echo_simple as any as RecordedSessionEvent[] }, @@ -69,7 +68,7 @@ suite('Terminal Contrib Suggest Recordings', () => { let suggestWidgetVisibleContextKey: IContextKey; let suggestAddon: SuggestAddon; - setup(() => { + setup(async () => { const instantiationService = workbenchInstantiationService({ configurationService: () => new TestConfigurationService({ files: { autoSave: false }, @@ -84,7 +83,8 @@ suite('Terminal Contrib Suggest Recordings', () => { } }) }, store); - xterm = store.add(new Terminal({ allowProposedApi: true })); + const TerminalCtor = (await importAMDNodeModule('@xterm/xterm', 'lib/xterm.js')).Terminal; + xterm = store.add(new TerminalCtor({ allowProposedApi: true })); const shellIntegrationAddon = store.add(new ShellIntegrationAddon('', true, undefined, new NullLogService)); capabilities = shellIntegrationAddon.capabilities; suggestWidgetVisibleContextKey = TerminalContextKeys.suggestWidgetVisible.bindTo(instantiationService.get(IContextKeyService)); From db23b5c7c31fca98dcbc8590bcd82833e7e8f54a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 3 Jul 2024 04:38:25 -0700 Subject: [PATCH 620/755] Fix @xterm/headless not working on browser (it's compiled for node) --- .eslintrc.json | 3 +-- .../capabilities/commandDetection/promptInputModel.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index e9df5ec8a8c22..db383e0b9b482 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -738,8 +738,7 @@ "vs/platform/*/~", "tas-client-umd", // node module allowed even in /common/ "@microsoft/1ds-core-js", // node module allowed even in /common/ - "@microsoft/1ds-post-js", // node module allowed even in /common/ - "@xterm/headless" // node module allowed even in /common/ + "@microsoft/1ds-post-js" // node module allowed even in /common/ ] }, { diff --git a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts index 7d7e6849b8a28..9e015c72b2717 100644 --- a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts +++ b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import type { Terminal } from '@xterm/headless'; +import type { Terminal } from '@xterm/xterm'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { NullLogService } from 'vs/platform/log/common/log'; import { PromptInputModel, type IPromptInputModelState } from 'vs/platform/terminal/common/capabilities/commandDetection/promptInputModel'; @@ -58,7 +58,7 @@ suite('PromptInputModel', () => { } setup(async () => { - const TerminalCtor = (await importAMDNodeModule('@xterm/headless', 'lib-headless/xterm-headless.js')).Terminal; + const TerminalCtor = (await importAMDNodeModule('@xterm/xterm', 'lib/xterm.js')).Terminal; xterm = store.add(new TerminalCtor({ allowProposedApi: true })); onCommandStart = store.add(new Emitter()); onCommandExecuted = store.add(new Emitter()); From cac98ea95ea9985f2e3d5513d5bc44d989e46c40 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2024 15:30:38 +0200 Subject: [PATCH 621/755] #219720 Improve auto update extensions ux (#219859) * #219720 improve extension auto udpate experience * add detail --- .../abstractExtensionManagementService.ts | 18 + .../common/extensionManagement.ts | 1 + .../common/extensionManagementIpc.ts | 7 + .../node/extensionsWatcher.ts | 3 +- .../extensions/browser/extensionEditor.ts | 6 +- .../browser/extensions.contribution.ts | 118 +++--- .../extensions/browser/extensionsActions.ts | 33 +- .../extensions/browser/extensionsList.ts | 5 +- .../browser/extensionsWorkbenchService.ts | 386 +++++++++++------- .../contrib/extensions/common/extensions.ts | 3 +- .../extensionsWorkbenchService.test.ts | 218 ++++------ .../common/extensionManagementService.ts | 4 + .../test/browser/workbenchTestServices.ts | 1 + 13 files changed, 436 insertions(+), 367 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 284658e08d61b..f3ae52b16a2bd 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -196,6 +196,24 @@ export abstract class AbstractExtensionManagementService extends Disposable impl this.participants.push(participant); } + async resetPinnedStateForAllUserExtensions(pinned: boolean): Promise { + try { + await this.joinAllSettled(this.userDataProfilesService.profiles.map( + async profile => { + const extensions = await this.getInstalled(ExtensionType.User, profile.extensionsResource); + await this.joinAllSettled(extensions.map( + async extension => { + if (extension.pinned !== pinned) { + await this.updateMetadata(extension, { pinned }, profile.extensionsResource); + } + })); + })); + } catch (error) { + this.logService.error('Error while resetting pinned state for all user extensions', getErrorMessage(error)); + throw error; + } + } + protected async installExtensions(extensions: InstallableExtension[]): Promise { const installExtensionResultsMap = new Map(); const installingExtensionsMap = new Map(); diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 68f21988fc4a1..5786b57ea070e 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -538,6 +538,7 @@ export interface IExtensionManagementService { getExtensionsControlManifest(): Promise; copyExtensions(fromProfileLocation: URI, toProfileLocation: URI): Promise; updateMetadata(local: ILocalExtension, metadata: Partial, profileLocation: URI): Promise; + resetPinnedStateForAllUserExtensions(pinned: boolean): Promise; download(extension: IGalleryExtension, operation: InstallOperation, donotVerifySignature: boolean): Promise; diff --git a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts index 75cf3eb91aee1..65e8735bd1052 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts @@ -158,6 +158,9 @@ export class ExtensionManagementChannel implements IServerChannel { const e = await this.service.updateMetadata(transformIncomingExtension(args[0], uriTransformer), args[1], transformIncomingURI(args[2], uriTransformer)); return transformOutgoingExtension(e, uriTransformer); } + case 'resetPinnedStateForAllUserExtensions': { + return this.service.resetPinnedStateForAllUserExtensions(args[0]); + } case 'getExtensionsControlManifest': { return this.service.getExtensionsControlManifest(); } @@ -289,6 +292,10 @@ export class ExtensionManagementChannelClient extends Disposable implements IExt .then(extension => transformIncomingExtension(extension, null)); } + resetPinnedStateForAllUserExtensions(pinned: boolean): Promise { + return this.channel.call('resetPinnedStateForAllUserExtensions', [pinned]); + } + toggleAppliationScope(local: ILocalExtension, fromProfileLocation: URI): Promise { return this.channel.call('toggleAppliationScope', [local, fromProfileLocation]) .then(extension => transformIncomingExtension(extension, null)); diff --git a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts index ba8e026b8935f..a56087b0b5127 100644 --- a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts +++ b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { getErrorMessage } from 'vs/base/common/errors'; import { Emitter } from 'vs/base/common/event'; import { combinedDisposable, Disposable, DisposableMap } from 'vs/base/common/lifecycle'; import { ResourceSet } from 'vs/base/common/map'; @@ -40,7 +41,7 @@ export class ExtensionsWatcher extends Disposable { private readonly logService: ILogService, ) { super(); - this.initialize().then(null, error => logService.error(error)); + this.initialize().then(null, error => logService.error('Error while initializing Extensions Watcher', getErrorMessage(error))); } private async initialize(): Promise { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 5eacf022177dc..d3109d7f7d95f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -72,7 +72,6 @@ import { UpdateAction, WebInstallAction, TogglePreReleaseExtensionAction, - ExtensionAction, } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { Delegate } from 'vs/workbench/contrib/extensions/browser/extensionsList'; import { ExtensionData, ExtensionsGridView, ExtensionsTree, getExtensions } from 'vs/workbench/contrib/extensions/browser/extensionsViewer'; @@ -334,8 +333,7 @@ export class ExtensionEditor extends EditorPane { const actions = [ this.instantiationService.createInstance(ExtensionRuntimeStateAction), this.instantiationService.createInstance(ExtensionStatusLabelAction), - this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.updateActions', ExtensionAction.PROMINENT_LABEL_ACTION_CLASS, - [[this.instantiationService.createInstance(UpdateAction, true)], [this.instantiationService.createInstance(ToggleAutoUpdateForExtensionAction, true, [true, 'onlyEnabledExtensions'])]]), + this.instantiationService.createInstance(UpdateAction, true), this.instantiationService.createInstance(SetColorThemeAction), this.instantiationService.createInstance(SetFileIconThemeAction), this.instantiationService.createInstance(SetProductIconThemeAction), @@ -357,7 +355,7 @@ export class ExtensionEditor extends EditorPane { ] ]), this.instantiationService.createInstance(TogglePreReleaseExtensionAction), - this.instantiationService.createInstance(ToggleAutoUpdateForExtensionAction, false, [false, 'onlySelectedExtensions']), + this.instantiationService.createInstance(ToggleAutoUpdateForExtensionAction), new ExtensionEditorManageExtensionAction(this.scopedContextKeyService || this.contextKeyService, this.instantiationService), ]; diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 33f961fc45593..0daeda950dcad 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -60,7 +60,6 @@ import { ExtensionEnablementWorkspaceTrustTransitionParticipant } from 'vs/workb import { clearSearchResultsIcon, configureRecommendedIcon, extensionsViewIcon, filterIcon, installWorkspaceRecommendedIcon, refreshIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; import { EXTENSION_CATEGORIES } from 'vs/platform/extensions/common/extensions'; import { Disposable, DisposableStore, IDisposable, isDisposable } from 'vs/base/common/lifecycle'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; @@ -79,6 +78,7 @@ import { CONTEXT_KEYBINDINGS_EDITOR } from 'vs/workbench/contrib/preferences/com import { DeprecatedExtensionsChecker } from 'vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker'; import { ProgressLocation } from 'vs/platform/progress/common/progress'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { IConfigurationMigrationRegistry, Extensions as ConfigurationMigrationExtensions } from 'vs/workbench/common/configuration'; // Singletons registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService, InstantiationType.Eager /* Auto updates extensions */); @@ -126,17 +126,15 @@ Registry.as(ConfigurationExtensions.Configuration) ...extensionsConfigurationNodeBase, properties: { 'extensions.autoUpdate': { - enum: [true, 'onlyEnabledExtensions', 'onlySelectedExtensions', false,], + enum: [true, 'onlyEnabledExtensions', false,], enumItemLabels: [ localize('all', "All Extensions"), localize('enabled', "Only Enabled Extensions"), - localize('selected', "Only Selected Extensions"), localize('none', "None"), ], enumDescriptions: [ - localize('extensions.autoUpdate.true', 'Download and install updates automatically for all extensions except for those updates are ignored.'), - localize('extensions.autoUpdate.enabled', 'Download and install updates automatically only for enabled extensions except for those updates are ignored. Disabled extensions are not updated automatically.'), - localize('extensions.autoUpdate.selected', 'Download and install updates automatically only for selected extensions.'), + localize('extensions.autoUpdate.true', 'Download and install updates automatically for all extensions.'), + localize('extensions.autoUpdate.enabled', 'Download and install updates automatically only for enabled extensions.'), localize('extensions.autoUpdate.false', 'Extensions are not automatically updated.'), ], description: localize('extensions.autoUpdate', "Controls the automatic update behavior of extensions. The updates are fetched from a Microsoft online service."), @@ -633,57 +631,38 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi } }); - const autoUpdateExtensionsSubMenu = new MenuId('autoUpdateExtensionsSubMenu'); - MenuRegistry.appendMenuItem(MenuId.ViewContainerTitle, { - submenu: autoUpdateExtensionsSubMenu, - title: localize('configure auto updating extensions', "Auto Update Extensions"), - when: ContextKeyExpr.and(ContextKeyExpr.equals('viewContainer', VIEWLET_ID), CONTEXT_HAS_GALLERY), - group: '1_updates', - order: 5, - }); - - this.registerExtensionAction({ - id: 'configureExtensionsAutoUpdate.all', - title: localize('configureExtensionsAutoUpdate.all', "All Extensions"), - toggled: ContextKeyExpr.and(ContextKeyExpr.has(`config.${AutoUpdateConfigurationKey}`), ContextKeyExpr.notEquals(`config.${AutoUpdateConfigurationKey}`, 'onlyEnabledExtensions'), ContextKeyExpr.notEquals(`config.${AutoUpdateConfigurationKey}`, 'onlySelectedExtensions')), - menu: [{ - id: autoUpdateExtensionsSubMenu, - order: 1, - }], - run: (accessor: ServicesAccessor) => accessor.get(IConfigurationService).updateValue(AutoUpdateConfigurationKey, true) - }); - - this.registerExtensionAction({ - id: 'configureExtensionsAutoUpdate.enabled', - title: localize('configureExtensionsAutoUpdate.enabled', "Enabled Extensions"), - toggled: ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, 'onlyEnabledExtensions'), - menu: [{ - id: autoUpdateExtensionsSubMenu, - order: 2, - }], - run: (accessor: ServicesAccessor) => accessor.get(IConfigurationService).updateValue(AutoUpdateConfigurationKey, 'onlyEnabledExtensions') - }); - + const enableAutoUpdateWhenCondition = ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, false); this.registerExtensionAction({ - id: 'configureExtensionsAutoUpdate.selected', - title: localize('configureExtensionsAutoUpdate.selected', "Selected Extensions"), - toggled: ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, 'onlySelectedExtensions'), + id: 'workbench.extensions.action.enableAutoUpdate', + title: localize2('enableAutoUpdate', 'Enable Auto Update for All Extensions'), + category: ExtensionsLocalizedLabel, + precondition: enableAutoUpdateWhenCondition, menu: [{ - id: autoUpdateExtensionsSubMenu, - order: 2, + id: MenuId.ViewContainerTitle, + order: 5, + group: '1_updates', + when: enableAutoUpdateWhenCondition + }, { + id: MenuId.CommandPalette, }], - run: (accessor: ServicesAccessor) => accessor.get(IConfigurationService).updateValue(AutoUpdateConfigurationKey, 'onlySelectedExtensions') + run: (accessor: ServicesAccessor) => accessor.get(IExtensionsWorkbenchService).updateAutoUpdateValue(true) }); + const disableAutoUpdateWhenCondition = ContextKeyExpr.notEquals(`config.${AutoUpdateConfigurationKey}`, false); this.registerExtensionAction({ - id: 'configureExtensionsAutoUpdate.none', - title: localize('configureExtensionsAutoUpdate.none', "None"), - toggled: ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, false), + id: 'workbench.extensions.action.disableAutoUpdate', + title: localize2('disableAutoUpdate', 'Disable Auto Update for All Extensions'), + precondition: disableAutoUpdateWhenCondition, + category: ExtensionsLocalizedLabel, menu: [{ - id: autoUpdateExtensionsSubMenu, - order: 3, + id: MenuId.ViewContainerTitle, + order: 5, + group: '1_updates', + when: disableAutoUpdateWhenCondition + }, { + id: MenuId.CommandPalette, }], - run: (accessor: ServicesAccessor) => accessor.get(IConfigurationService).updateValue(AutoUpdateConfigurationKey, false) + run: (accessor: ServicesAccessor) => accessor.get(IExtensionsWorkbenchService).updateAutoUpdateValue(false) }); this.registerExtensionAction({ @@ -722,24 +701,6 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi } }); - this.registerExtensionAction({ - id: 'workbench.extensions.action.disableAutoUpdate', - title: localize2('disableAutoUpdate', 'Disable Auto Update for All Extensions'), - category: ExtensionsLocalizedLabel, - f1: true, - precondition: CONTEXT_HAS_GALLERY, - run: (accessor: ServicesAccessor) => accessor.get(IConfigurationService).updateValue(AutoUpdateConfigurationKey, false) - }); - - this.registerExtensionAction({ - id: 'workbench.extensions.action.enableAutoUpdate', - title: localize2('enableAutoUpdate', 'Enable Auto Update for All Extensions'), - category: ExtensionsLocalizedLabel, - f1: true, - precondition: CONTEXT_HAS_GALLERY, - run: (accessor: ServicesAccessor) => accessor.get(IConfigurationService).updateValue(AutoUpdateConfigurationKey, true) - }); - this.registerExtensionAction({ id: 'workbench.extensions.action.enableAll', title: localize2('enableAll', 'Enable All Extensions'), @@ -1384,18 +1345,23 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi id: ToggleAutoUpdateForExtensionAction.ID, title: ToggleAutoUpdateForExtensionAction.LABEL, category: ExtensionsLocalizedLabel, + precondition: ContextKeyExpr.and(ContextKeyExpr.or(ContextKeyExpr.notEquals(`config.${AutoUpdateConfigurationKey}`, 'onlyEnabledExtensions'), ContextKeyExpr.equals('isExtensionEnabled', true)), ContextKeyExpr.not('extensionDisallowInstall')), menu: { id: MenuId.ExtensionContext, group: UPDATE_ACTIONS_GROUP, order: 1, - when: ContextKeyExpr.and(ContextKeyExpr.not('inExtensionEditor'), ContextKeyExpr.equals('extensionStatus', 'installed'), ContextKeyExpr.not('isBuiltinExtension'), ContextKeyExpr.or(ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, 'onlySelectedExtensions'), ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, false)),) + when: ContextKeyExpr.and( + ContextKeyExpr.not('inExtensionEditor'), + ContextKeyExpr.equals('extensionStatus', 'installed'), + ContextKeyExpr.not('isBuiltinExtension'), + ) }, run: async (accessor: ServicesAccessor, id: string) => { const instantiationService = accessor.get(IInstantiationService); const extensionWorkbenchService = accessor.get(IExtensionsWorkbenchService); const extension = extensionWorkbenchService.local.find(e => areSameExtensions(e.identifier, { id })); if (extension) { - const action = instantiationService.createInstance(ToggleAutoUpdateForExtensionAction, false, []); + const action = instantiationService.createInstance(ToggleAutoUpdateForExtensionAction); action.extension = extension; return action.run(); } @@ -1406,11 +1372,12 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi id: ToggleAutoUpdatesForPublisherAction.ID, title: { value: ToggleAutoUpdatesForPublisherAction.LABEL, original: 'Auto Update (Publisher)' }, category: ExtensionsLocalizedLabel, + precondition: ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, false), menu: { id: MenuId.ExtensionContext, group: UPDATE_ACTIONS_GROUP, order: 2, - when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'installed'), ContextKeyExpr.not('isBuiltinExtension'), ContextKeyExpr.or(ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, 'onlySelectedExtensions'), ContextKeyExpr.equals(`config.${AutoUpdateConfigurationKey}`, false)),) + when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'installed'), ContextKeyExpr.not('isBuiltinExtension')) }, run: async (accessor: ServicesAccessor, id: string) => { const instantiationService = accessor.get(IInstantiationService); @@ -1842,3 +1809,14 @@ if (isWeb) { // Running Extensions registerAction2(ShowRuntimeExtensionsAction); + +Registry.as(ConfigurationMigrationExtensions.ConfigurationMigration) + .registerConfigurationMigrations([{ + key: AutoUpdateConfigurationKey, + migrateFn: (value, accessor) => { + if (value === 'onlySelectedExtensions') { + return { value: false }; + } + return []; + } + }]); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index fccbb361feb2c..03c914611e92f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -12,7 +12,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import * as json from 'vs/base/common/json'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { disposeIfDisposable } from 'vs/base/common/lifecycle'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewPaneContainer, IExtensionContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, UPDATE_ACTIONS_GROUP, AutoUpdateConfigurationKey, AutoUpdateConfigurationValue, ExtensionEditorTab, ExtensionRuntimeActionType, IExtensionArg } from 'vs/workbench/contrib/extensions/common/extensions'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewPaneContainer, IExtensionContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP, UPDATE_ACTIONS_GROUP, ExtensionEditorTab, ExtensionRuntimeActionType, IExtensionArg, AutoUpdateConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate'; import { IGalleryExtension, IExtensionGalleryService, ILocalExtension, InstallOptions, InstallOperation, TargetPlatformToString, ExtensionManagementErrorCode } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; @@ -943,11 +943,9 @@ export class ToggleAutoUpdateForExtensionAction extends ExtensionAction { private static readonly DisabledClass = `${ToggleAutoUpdateForExtensionAction.EnabledClass} hide`; constructor( - private readonly enableWhenOutdated: boolean, - private readonly enableWhenAutoUpdateValue: AutoUpdateConfigurationValue[], @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, + @IWorkbenchExtensionEnablementService private readonly extensionEnablementService: IWorkbenchExtensionEnablementService, @IConfigurationService configurationService: IConfigurationService, - ) { super(ToggleAutoUpdateForExtensionAction.ID, ToggleAutoUpdateForExtensionAction.LABEL.value, ToggleAutoUpdateForExtensionAction.DisabledClass); this._register(configurationService.onDidChangeConfiguration(e => { @@ -967,10 +965,10 @@ export class ToggleAutoUpdateForExtensionAction extends ExtensionAction { if (this.extension.isBuiltin) { return; } - if (this.enableWhenOutdated && (this.extension.state !== ExtensionState.Installed || !this.extension.outdated)) { + if (this.extension.deprecationInfo?.disallowInstall) { return; } - if (!this.enableWhenAutoUpdateValue.includes(this.extensionsWorkbenchService.getAutoUpdateValue())) { + if (this.extensionsWorkbenchService.getAutoUpdateValue() === 'onlyEnabledExtensions' && !this.extensionEnablementService.isEnabledEnablementState(this.extension.enablementState)) { return; } this.enabled = true; @@ -1128,6 +1126,7 @@ export class DropDownExtensionActionViewItem extends ActionViewItem { async function getContextMenuActionsGroups(extension: IExtension | undefined | null, contextKeyService: IContextKeyService, instantiationService: IInstantiationService): Promise<[string, Array][]> { return instantiationService.invokeFunction(async accessor => { const extensionsWorkbenchService = accessor.get(IExtensionsWorkbenchService); + const extensionEnablementService = accessor.get(IWorkbenchExtensionEnablementService); const menuService = accessor.get(IMenuService); const extensionRecommendationsService = accessor.get(IExtensionRecommendationsService); const extensionIgnoredRecommendationsService = accessor.get(IExtensionIgnoredRecommendationsService); @@ -1150,6 +1149,8 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['isExtensionRecommended', !!extensionRecommendationsService.getAllRecommendationsWithReason()[extension.identifier.id.toLowerCase()]]); cksOverlay.push(['isExtensionWorkspaceRecommended', extensionRecommendationsService.getAllRecommendationsWithReason()[extension.identifier.id.toLowerCase()]?.reasonId === ExtensionRecommendationReason.Workspace]); cksOverlay.push(['isUserIgnoredRecommendation', extensionIgnoredRecommendationsService.globalIgnoredRecommendations.some(e => e === extension.identifier.id.toLowerCase())]); + cksOverlay.push(['isExtensionPinned', extension.pinned]); + cksOverlay.push(['isExtensionEnabled', extensionEnablementService.isEnabledEnablementState(extension.enablementState)]); switch (extension.state) { case ExtensionState.Installing: cksOverlay.push(['extensionStatus', 'installing']); @@ -1325,6 +1326,14 @@ export class MenuItemExtensionAction extends ExtensionAction { super(action.id, action.label); } + override get enabled(): boolean { + return this.action.enabled; + } + + override set enabled(value: boolean) { + this.action.enabled = value; + } + update() { if (!this.extension) { return; @@ -1418,7 +1427,7 @@ export class TogglePreReleaseExtensionAction extends ExtensionAction { export class InstallAnotherVersionAction extends ExtensionAction { static readonly ID = 'workbench.extensions.action.install.anotherVersion'; - static readonly LABEL = localize('install another version', "Install Another Version..."); + static readonly LABEL = localize('install another version', "Install Specific Version..."); constructor( extension: IExtension | null, @@ -1461,7 +1470,6 @@ export class InstallAnotherVersionAction extends ExtensionAction { id: v.version, label: v.version, description: `${fromNow(new Date(Date.parse(v.date)), true)}${v.isPreReleaseVersion ? ` (${localize('pre-release', "pre-release")})` : ''}${v.version === this.extension?.local?.manifest.version ? ` (${localize('current', "current")})` : ''}`, - latest: i === 0, ariaLabel: `${v.isPreReleaseVersion ? 'Pre-Release version' : 'Release version'} ${v.version}`, isPreReleaseVersion: v.isPreReleaseVersion }; @@ -1476,14 +1484,9 @@ export class InstallAnotherVersionAction extends ExtensionAction { return; } try { - if (pick.latest) { - const [extension] = pick.id !== this.extension.version ? await this.extensionsWorkbenchService.getExtensions([{ id: this.extension.identifier.id, preRelease: pick.isPreReleaseVersion }], CancellationToken.None) : [this.extension]; - await this.extensionsWorkbenchService.install(extension ?? this.extension, { installPreReleaseVersion: pick.isPreReleaseVersion }); - } else { - await this.extensionsWorkbenchService.install(this.extension, { installPreReleaseVersion: pick.isPreReleaseVersion, version: pick.id }); - } + await this.extensionsWorkbenchService.install(this.extension, { installPreReleaseVersion: pick.isPreReleaseVersion, version: pick.id }); } catch (error) { - this.instantiationService.createInstance(PromptExtensionInstallFailureAction, this.extension, pick.latest ? this.extension.latestVersion : pick.id, InstallOperation.Install, error).run(); + this.instantiationService.createInstance(PromptExtensionInstallFailureAction, this.extension, pick.id, InstallOperation.Install, error).run(); } } return null; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index d74439e6c5269..95c05e762e5d3 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -13,7 +13,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; -import { ManageExtensionAction, ExtensionRuntimeStateAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ButtonWithDropDownExtensionAction, InstallDropdownAction, InstallingLabelAction, ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction, ToggleAutoUpdateForExtensionAction, ExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; +import { ManageExtensionAction, ExtensionRuntimeStateAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ButtonWithDropDownExtensionAction, InstallDropdownAction, InstallingLabelAction, ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, ExtensionPackCountWidget as ExtensionPackBadgeWidget, SyncIgnoredWidget, ExtensionHoverWidget, ExtensionActivationStatusWidget, PreReleaseBookmarkWidget, extensionVerifiedPublisherIconColor, VerifiedPublisherWidget } from 'vs/workbench/contrib/extensions/browser/extensionsWidgets'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -126,8 +126,7 @@ export class Renderer implements IPagedRenderer { this.instantiationService.createInstance(ExtensionStatusLabelAction), this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, true), this.instantiationService.createInstance(ExtensionRuntimeStateAction), - this.instantiationService.createInstance(ButtonWithDropDownExtensionAction, 'extensions.updateActions', ExtensionAction.PROMINENT_LABEL_ACTION_CLASS, - [[this.instantiationService.createInstance(UpdateAction, false)], [this.instantiationService.createInstance(ToggleAutoUpdateForExtensionAction, true, [true, 'onlyEnabledExtensions'])]]), + this.instantiationService.createInstance(UpdateAction, false), this.instantiationService.createInstance(InstallDropdownAction), this.instantiationService.createInstance(InstallingLabelAction), this.instantiationService.createInstance(SetLanguageAction), diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 826da4474fbb3..e4b62d95f4a7b 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -519,6 +519,7 @@ ${this.description} } const EXTENSIONS_AUTO_UPDATE_KEY = 'extensions.autoUpdate'; +const EXTENSIONS_DONOT_AUTO_UPDATE_KEY = 'extensions.donotAutoUpdate'; class Extensions extends Disposable { @@ -991,14 +992,29 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this.initializeAutoUpdate(); this.reportInstalledExtensionsTelemetry(); this._register(Event.debounce(this.onChange, () => undefined, 100)(() => this.reportProgressFromOtherSources())); - this._register(this.storageService.onDidChangeValue(StorageScope.APPLICATION, EXTENSIONS_AUTO_UPDATE_KEY, this._store)(e => this.onDidSelectedExtensionToAutoUpdateValueChange(false))); + this._register(this.storageService.onDidChangeValue(StorageScope.APPLICATION, EXTENSIONS_AUTO_UPDATE_KEY, this._store)(e => this.onDidSelectedExtensionToAutoUpdateValueChange())); + this._register(this.storageService.onDidChangeValue(StorageScope.APPLICATION, EXTENSIONS_DONOT_AUTO_UPDATE_KEY, this._store)(e => this.onDidSelectedExtensionToAutoUpdateValueChange())); } private initializeAutoUpdate(): void { + // Initialise Auto Update Value + let autoUpdateValue = this.getAutoUpdateValue(); + // Register listeners for auto updates this._register(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(AutoUpdateConfigurationKey)) { - this.onDidAutoUpdateConfigurationChange(); + const wasAutoUpdateEnabled = autoUpdateValue !== false; + autoUpdateValue = this.getAutoUpdateValue(); + const isAutoUpdateEnabled = this.isAutoUpdateEnabled(); + if (wasAutoUpdateEnabled !== isAutoUpdateEnabled) { + this.setEnabledAutoUpdateExtensions([]); + this.setDisabledAutoUpdateExtensions([]); + this._onChange.fire(undefined); + this.extensionManagementService.resetPinnedStateForAllUserExtensions(!isAutoUpdateEnabled); + } + if (isAutoUpdateEnabled) { + this.eventuallyAutoUpdateExtensions(); + } } if (e.affectsConfiguration(AutoCheckUpdatesConfigurationKey)) { if (this.isAutoCheckUpdatesEnabled()) { @@ -1013,9 +1029,6 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension })); this._register(Event.debounce(this.onChange, () => undefined, 100)(() => this.hasOutdatedExtensionsContextKey.set(this.outdated.length > 0))); this._register(this.updateService.onStateChange(e => { - if (!this.isAutoUpdateEnabled()) { - return; - } if ((e.type === StateType.CheckingForUpdates && e.explicit) || e.type === StateType.AvailableForDownload || e.type === StateType.Downloaded) { this.eventuallyCheckForUpdates(true); } @@ -1043,6 +1056,36 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension })); } + private isAutoUpdateEnabled(): boolean { + return this.getAutoUpdateValue() !== false; + } + + getAutoUpdateValue(): AutoUpdateConfigurationValue { + const autoUpdate = this.configurationService.getValue(AutoUpdateConfigurationKey); + if (autoUpdate === 'onlySelectedExtensions') { + return false; + } + return isBoolean(autoUpdate) || autoUpdate === 'onlyEnabledExtensions' ? autoUpdate : true; + } + + async updateAutoUpdateValue(value: AutoUpdateConfigurationValue): Promise { + const wasEnabled = this.isAutoUpdateEnabled(); + const isEnabled = value !== false; + if (wasEnabled !== isEnabled) { + const result = await this.dialogService.confirm({ + title: nls.localize('confirmEnableDisableAutoUpdate', "Auto Update Extensions"), + message: isEnabled + ? nls.localize('confirmEnableAutoUpdate', "Do you want to enable auto update for all extensions?") + : nls.localize('confirmDisableAutoUpdate', "Do you want to disable auto update for all extensions?"), + detail: nls.localize('confirmEnableDisableAutoUpdateDetail', "This will reset the auto update settings you have set for individual extensions."), + }); + if (!result.confirmed) { + return; + } + } + await this.configurationService.updateValue(AutoUpdateConfigurationKey, value); + } + private readonly autoRestartListenerDisposable = this._register(new MutableDisposable()); private registerAutoRestartListener(): void { this.autoRestartListenerDisposable.value = undefined; @@ -1606,15 +1649,6 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return ExtensionState.Uninstalled; } - private async onDidAutoUpdateConfigurationChange(): Promise { - await this.updateExtensionsPinnedState(); - if (this.isAutoUpdateEnabled()) { - this.checkForUpdates(); - } else { - this.setSelectedExtensionsToAutoUpdate([]); - } - } - async checkForUpdates(onlyBuiltin?: boolean): Promise { if (!this.galleryService.isEnabled()) { return; @@ -1700,20 +1734,11 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return; } await Promise.allSettled(extensions.map(extensions => extensions.syncInstalledExtensionsWithGallery(gallery, this.getProductVersion()))); - if (this.isAutoUpdateEnabled()) { + if (this.outdated.length) { this.eventuallyAutoUpdateExtensions(); } } - getAutoUpdateValue(): AutoUpdateConfigurationValue { - const autoUpdate = this.configurationService.getValue(AutoUpdateConfigurationKey); - return isBoolean(autoUpdate) || autoUpdate === 'onlyEnabledExtensions' || autoUpdate === 'onlySelectedExtensions' ? autoUpdate : true; - } - - isAutoUpdateEnabled(): boolean { - return this.getAutoUpdateValue() !== false; - } - private isAutoCheckUpdatesEnabled(): boolean { return this.configurationService.getValue(AutoCheckUpdatesConfigurationKey); } @@ -1721,7 +1746,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension private eventuallyCheckForUpdates(immediate = false): void { this.updatesCheckDelayer.cancel(); this.updatesCheckDelayer.trigger(async () => { - if (this.isAutoUpdateEnabled() || this.isAutoCheckUpdatesEnabled()) { + if (this.isAutoCheckUpdatesEnabled()) { await this.checkForUpdates(); } this.eventuallyCheckForUpdates(); @@ -1762,10 +1787,6 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } private async autoUpdateExtensions(): Promise { - if (!this.isAutoUpdateEnabled()) { - return; - } - const toUpdate = this.outdated.filter(e => !e.local?.pinned && this.shouldAutoUpdateExtension(e)); if (!toUpdate.length) { return; @@ -1798,32 +1819,43 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return undefined; } - private async updateExtensionsPinnedState(): Promise { - await Promise.all(this.installed.map(async e => { - if (e.isBuiltin) { - return; + private shouldAutoUpdateExtension(extension: IExtension): boolean { + if (extension.deprecationInfo?.disallowInstall) { + return false; + } + + const autoUpdateValue = this.getAutoUpdateValue(); + + if (autoUpdateValue === false) { + const extensionsToAutoUpdate = this.getEnabledAutoUpdateExtensions(); + const extensionId = extension.identifier.id.toLowerCase(); + if (extensionsToAutoUpdate.includes(extensionId)) { + return true; } - const shouldBePinned = !this.shouldAutoUpdateExtension(e); - if (e.local && e.local.pinned !== shouldBePinned) { - await this.extensionManagementService.updateMetadata(e.local, { pinned: shouldBePinned }); + if (this.isAutoUpdateEnabledForPublisher(extension.publisher) && !extensionsToAutoUpdate.includes(`-${extensionId}`)) { + return true; } - })); - } + return false; + } - private shouldAutoUpdateExtension(extension: IExtension): boolean { - const autoUpdate = this.getAutoUpdateValue(); - if (isBoolean(autoUpdate)) { - return autoUpdate; + if (extension.pinned) { + return false; + } + + const disabledAutoUpdateExtensions = this.getDisabledAutoUpdateExtensions(); + if (disabledAutoUpdateExtensions.includes(extension.identifier.id.toLowerCase())) { + return false; } - if (autoUpdate === 'onlyEnabledExtensions') { + if (autoUpdateValue === true) { + return true; + } + + if (autoUpdateValue === 'onlyEnabledExtensions') { return this.extensionEnablementService.isEnabledEnablementState(extension.enablementState); } - const extensionsToAutoUpdate = this.getSelectedExtensionsToAutoUpdate(); - const extensionId = extension.identifier.id.toLowerCase(); - return extensionsToAutoUpdate.includes(extensionId) || - (!extensionsToAutoUpdate.includes(`-${extensionId}`) && this.isAutoUpdateEnabledForPublisher(extension.publisher)); + return false; } isAutoUpdateEnabledFor(extensionOrPublisher: IExtension | string): boolean { @@ -1831,16 +1863,12 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (EXTENSION_IDENTIFIER_REGEX.test(extensionOrPublisher)) { throw new Error('Expected publisher string, found extension identifier'); } - const autoUpdate = this.getAutoUpdateValue(); - if (isBoolean(autoUpdate)) { - return autoUpdate; - } - if (autoUpdate === 'onlyEnabledExtensions') { - return false; + if (this.isAutoUpdateEnabled()) { + return true; } return this.isAutoUpdateEnabledForPublisher(extensionOrPublisher); } - return !extensionOrPublisher.local?.pinned && this.shouldAutoUpdateExtension(extensionOrPublisher); + return this.shouldAutoUpdateExtension(extensionOrPublisher); } private isAutoUpdateEnabledForPublisher(publisher: string): boolean { @@ -1849,101 +1877,135 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } async updateAutoUpdateEnablementFor(extensionOrPublisher: IExtension | string, enable: boolean): Promise { - const autoUpdateValue = this.getAutoUpdateValue(); - - if (autoUpdateValue === true || autoUpdateValue === 'onlyEnabledExtensions') { + if (this.isAutoUpdateEnabled()) { if (isString(extensionOrPublisher)) { throw new Error('Expected extension, found publisher string'); } if (!extensionOrPublisher.local) { throw new Error('Only installed extensions can be pinned'); } - await this.extensionManagementService.updateMetadata(extensionOrPublisher.local, { pinned: !enable }); - if (enable) { - this.eventuallyAutoUpdateExtensions(); - } - return; - } - if (autoUpdateValue === false && enable) { - await this.configurationService.updateValue(AutoUpdateConfigurationKey, 'onlySelectedExtensions'); - } - - let update = false; - const autoUpdateExtensions = this.getSelectedExtensionsToAutoUpdate(); - if (isString(extensionOrPublisher)) { - if (EXTENSION_IDENTIFIER_REGEX.test(extensionOrPublisher)) { - throw new Error('Expected publisher string, found extension identifier'); + const disabledAutoUpdateExtensions = this.getDisabledAutoUpdateExtensions(); + const extensionId = extensionOrPublisher.identifier.id.toLowerCase(); + const extensionIndex = disabledAutoUpdateExtensions.indexOf(extensionId); + if (enable) { + if (extensionIndex !== -1) { + disabledAutoUpdateExtensions.splice(extensionIndex, 1); + } } - extensionOrPublisher = extensionOrPublisher.toLowerCase(); - if (this.isAutoUpdateEnabledFor(extensionOrPublisher) !== enable) { - update = true; - if (enable) { - autoUpdateExtensions.push(extensionOrPublisher); - } else { - if (autoUpdateExtensions.includes(extensionOrPublisher)) { - autoUpdateExtensions.splice(autoUpdateExtensions.indexOf(extensionOrPublisher), 1); - } + else { + if (extensionIndex === -1) { + disabledAutoUpdateExtensions.push(extensionId); } } - } else { - const extensionId = extensionOrPublisher.identifier.id.toLowerCase(); - const enableAutoUpdatesForPublisher = this.isAutoUpdateEnabledFor(extensionOrPublisher.publisher.toLowerCase()); - const enableAutoUpdatesForExtension = autoUpdateExtensions.includes(extensionId); - const disableAutoUpdatesForExtension = autoUpdateExtensions.includes(`-${extensionId}`); + this.setDisabledAutoUpdateExtensions(disabledAutoUpdateExtensions); + if (enable && extensionOrPublisher.pinned) { + await this.extensionManagementService.updateMetadata(extensionOrPublisher.local, { pinned: false }); + } + this._onChange.fire(extensionOrPublisher); + } - if (enable) { - if (disableAutoUpdatesForExtension) { - autoUpdateExtensions.splice(autoUpdateExtensions.indexOf(`-${extensionId}`), 1); - update = true; + else { + const enabledAutoUpdateExtensions = this.getEnabledAutoUpdateExtensions(); + if (isString(extensionOrPublisher)) { + if (EXTENSION_IDENTIFIER_REGEX.test(extensionOrPublisher)) { + throw new Error('Expected publisher string, found extension identifier'); } - if (enableAutoUpdatesForPublisher) { - if (enableAutoUpdatesForExtension) { - autoUpdateExtensions.splice(autoUpdateExtensions.indexOf(extensionId), 1); - update = true; - } - } else { - if (!enableAutoUpdatesForExtension) { - autoUpdateExtensions.push(extensionId); - update = true; + extensionOrPublisher = extensionOrPublisher.toLowerCase(); + if (this.isAutoUpdateEnabledFor(extensionOrPublisher) !== enable) { + if (enable) { + enabledAutoUpdateExtensions.push(extensionOrPublisher); + } else { + if (enabledAutoUpdateExtensions.includes(extensionOrPublisher)) { + enabledAutoUpdateExtensions.splice(enabledAutoUpdateExtensions.indexOf(extensionOrPublisher), 1); + } } } - if (extensionOrPublisher.local?.pinned) { - await this.extensionManagementService.updateMetadata(extensionOrPublisher.local, { pinned: false }); + this.setEnabledAutoUpdateExtensions(enabledAutoUpdateExtensions); + for (const e of this.installed) { + if (e.publisher.toLowerCase() === extensionOrPublisher) { + this._onChange.fire(e); + } } - } - // Disable Auto Updates - else { - if (enableAutoUpdatesForExtension) { - autoUpdateExtensions.splice(autoUpdateExtensions.indexOf(extensionId), 1); - update = true; + } else { + const extensionId = extensionOrPublisher.identifier.id.toLowerCase(); + const enableAutoUpdatesForPublisher = this.isAutoUpdateEnabledFor(extensionOrPublisher.publisher.toLowerCase()); + const enableAutoUpdatesForExtension = enabledAutoUpdateExtensions.includes(extensionId); + const disableAutoUpdatesForExtension = enabledAutoUpdateExtensions.includes(`-${extensionId}`); + + if (enable) { + if (disableAutoUpdatesForExtension) { + enabledAutoUpdateExtensions.splice(enabledAutoUpdateExtensions.indexOf(`-${extensionId}`), 1); + } + if (enableAutoUpdatesForPublisher) { + if (enableAutoUpdatesForExtension) { + enabledAutoUpdateExtensions.splice(enabledAutoUpdateExtensions.indexOf(extensionId), 1); + } + } else { + if (!enableAutoUpdatesForExtension) { + enabledAutoUpdateExtensions.push(extensionId); + } + } } - if (enableAutoUpdatesForPublisher) { - if (!disableAutoUpdatesForExtension) { - autoUpdateExtensions.push(`-${extensionId}`); - update = true; + // Disable Auto Updates + else { + if (enableAutoUpdatesForExtension) { + enabledAutoUpdateExtensions.splice(enabledAutoUpdateExtensions.indexOf(extensionId), 1); } - } else { - if (disableAutoUpdatesForExtension) { - autoUpdateExtensions.splice(autoUpdateExtensions.indexOf(`-${extensionId}`), 1); - update = true; + if (enableAutoUpdatesForPublisher) { + if (!disableAutoUpdatesForExtension) { + enabledAutoUpdateExtensions.push(`-${extensionId}`); + } + } else { + if (disableAutoUpdatesForExtension) { + enabledAutoUpdateExtensions.splice(enabledAutoUpdateExtensions.indexOf(`-${extensionId}`), 1); + } } } + this.setEnabledAutoUpdateExtensions(enabledAutoUpdateExtensions); + this._onChange.fire(extensionOrPublisher); } } - if (update) { - this.setSelectedExtensionsToAutoUpdate(autoUpdateExtensions); - await this.onDidSelectedExtensionToAutoUpdateValueChange(true); - if (autoUpdateValue === 'onlySelectedExtensions' && autoUpdateExtensions.length === 0) { - await this.configurationService.updateValue(AutoUpdateConfigurationKey, false); - } + + if (enable) { + this.autoUpdateExtensions(); } } - private async onDidSelectedExtensionToAutoUpdateValueChange(forceUpdate: boolean): Promise { - if (forceUpdate || this.selectedExtensionsToAutoUpdateValue !== this.getSelectedExtensionsToAutoUpdateValue() /* This checks if current window changed the value or not */) { - await this.updateExtensionsPinnedState(); - this.eventuallyAutoUpdateExtensions(); + private onDidSelectedExtensionToAutoUpdateValueChange(): void { + if ( + this.enabledAuotUpdateExtensionsValue !== this.getEnabledAutoUpdateExtensionsValue() /* This checks if current window changed the value or not */ + || this.disabledAutoUpdateExtensionsValue !== this.getDisabledAutoUpdateExtensionsValue() /* This checks if current window changed the value or not */ + ) { + const userExtensions = this.installed.filter(e => !e.isBuiltin); + const groupBy = (extensions: IExtension[]): IExtension[][] => { + const shouldAutoUpdate: IExtension[] = []; + const shouldNotAutoUpdate: IExtension[] = []; + for (const extension of extensions) { + if (this.shouldAutoUpdateExtension(extension)) { + shouldAutoUpdate.push(extension); + } else { + shouldNotAutoUpdate.push(extension); + } + } + return [shouldAutoUpdate, shouldNotAutoUpdate]; + }; + + const [wasShouldAutoUpdate, wasShouldNotAutoUpdate] = groupBy(userExtensions); + this._enabledAutoUpdateExtensionsValue = undefined; + this._disabledAutoUpdateExtensionsValue = undefined; + const [shouldAutoUpdate, shouldNotAutoUpdate] = groupBy(userExtensions); + + for (const e of wasShouldAutoUpdate ?? []) { + if (shouldNotAutoUpdate?.includes(e)) { + this._onChange.fire(e); + } + } + for (const e of wasShouldNotAutoUpdate ?? []) { + if (shouldAutoUpdate?.includes(e)) { + this._onChange.fire(e); + } + } } } @@ -2084,10 +2146,6 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension throw new Error(nls.localize('unknown', "Unable to install extension")); } - if (installOptions.version) { - await this.updateAutoUpdateEnablementFor(extension, false); - } - if (installOptions.enable) { if (extension.enablementState === EnablementState.DisabledWorkspace || extension.enablementState === EnablementState.DisabledGlobally) { if (installOptions.justification) { @@ -2571,12 +2629,12 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } private getPublishersToAutoUpdate(): string[] { - return this.getSelectedExtensionsToAutoUpdate().filter(id => !EXTENSION_IDENTIFIER_REGEX.test(id)); + return this.getEnabledAutoUpdateExtensions().filter(id => !EXTENSION_IDENTIFIER_REGEX.test(id)); } - getSelectedExtensionsToAutoUpdate(): string[] { + getEnabledAutoUpdateExtensions(): string[] { try { - const parsedValue = JSON.parse(this.selectedExtensionsToAutoUpdateValue); + const parsedValue = JSON.parse(this.enabledAuotUpdateExtensionsValue); if (Array.isArray(parsedValue)) { return parsedValue; } @@ -2584,32 +2642,70 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return []; } - private setSelectedExtensionsToAutoUpdate(selectedExtensionsToAutoUpdate: string[]): void { - this.selectedExtensionsToAutoUpdateValue = JSON.stringify(selectedExtensionsToAutoUpdate); + private setEnabledAutoUpdateExtensions(enabledAutoUpdateExtensions: string[]): void { + this.enabledAuotUpdateExtensionsValue = JSON.stringify(enabledAutoUpdateExtensions); } - private _selectedExtensionsToAutoUpdateValue: string | undefined; - private get selectedExtensionsToAutoUpdateValue(): string { - if (!this._selectedExtensionsToAutoUpdateValue) { - this._selectedExtensionsToAutoUpdateValue = this.getSelectedExtensionsToAutoUpdateValue(); + private _enabledAutoUpdateExtensionsValue: string | undefined; + private get enabledAuotUpdateExtensionsValue(): string { + if (!this._enabledAutoUpdateExtensionsValue) { + this._enabledAutoUpdateExtensionsValue = this.getEnabledAutoUpdateExtensionsValue(); } - return this._selectedExtensionsToAutoUpdateValue; + return this._enabledAutoUpdateExtensionsValue; } - private set selectedExtensionsToAutoUpdateValue(placeholderViewContainesValue: string) { - if (this.selectedExtensionsToAutoUpdateValue !== placeholderViewContainesValue) { - this._selectedExtensionsToAutoUpdateValue = placeholderViewContainesValue; - this.setSelectedExtensionsToAutoUpdateValue(placeholderViewContainesValue); + private set enabledAuotUpdateExtensionsValue(enabledAuotUpdateExtensionsValue: string) { + if (this.enabledAuotUpdateExtensionsValue !== enabledAuotUpdateExtensionsValue) { + this._enabledAutoUpdateExtensionsValue = enabledAuotUpdateExtensionsValue; + this.setEnabledAutoUpdateExtensionsValue(enabledAuotUpdateExtensionsValue); } } - private getSelectedExtensionsToAutoUpdateValue(): string { + private getEnabledAutoUpdateExtensionsValue(): string { return this.storageService.get(EXTENSIONS_AUTO_UPDATE_KEY, StorageScope.APPLICATION, '[]'); } - private setSelectedExtensionsToAutoUpdateValue(value: string): void { + private setEnabledAutoUpdateExtensionsValue(value: string): void { this.storageService.store(EXTENSIONS_AUTO_UPDATE_KEY, value, StorageScope.APPLICATION, StorageTarget.USER); } + getDisabledAutoUpdateExtensions(): string[] { + try { + const parsedValue = JSON.parse(this.disabledAutoUpdateExtensionsValue); + if (Array.isArray(parsedValue)) { + return parsedValue; + } + } catch (e) { /* Ignore */ } + return []; + } + + private setDisabledAutoUpdateExtensions(disabledAutoUpdateExtensions: string[]): void { + this.disabledAutoUpdateExtensionsValue = JSON.stringify(disabledAutoUpdateExtensions); + } + + private _disabledAutoUpdateExtensionsValue: string | undefined; + private get disabledAutoUpdateExtensionsValue(): string { + if (!this._disabledAutoUpdateExtensionsValue) { + this._disabledAutoUpdateExtensionsValue = this.getDisabledAutoUpdateExtensionsValue(); + } + + return this._disabledAutoUpdateExtensionsValue; + } + + private set disabledAutoUpdateExtensionsValue(disabledAutoUpdateExtensionsValue: string) { + if (this.disabledAutoUpdateExtensionsValue !== disabledAutoUpdateExtensionsValue) { + this._disabledAutoUpdateExtensionsValue = disabledAutoUpdateExtensionsValue; + this.setDisabledAutoUpdateExtensionsValue(disabledAutoUpdateExtensionsValue); + } + } + + private getDisabledAutoUpdateExtensionsValue(): string { + return this.storageService.get(EXTENSIONS_DONOT_AUTO_UPDATE_KEY, StorageScope.APPLICATION, '[]'); + } + + private setDisabledAutoUpdateExtensionsValue(value: string): void { + this.storageService.store(EXTENSIONS_DONOT_AUTO_UPDATE_KEY, value, StorageScope.APPLICATION, StorageTarget.USER); + } + } diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index bba7f85135059..c619e3a0b5747 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -62,6 +62,7 @@ export interface IExtension { readonly publisherUrl?: URI; readonly publisherDomain?: { link: string; verified: boolean }; readonly publisherSponsorLink?: URI; + readonly pinned: boolean; readonly version: string; readonly latestVersion: string; readonly preRelease: boolean; @@ -138,7 +139,7 @@ export interface IExtensionsWorkbenchService { isAutoUpdateEnabledFor(extensionOrPublisher: IExtension | string): boolean; updateAutoUpdateEnablementFor(extensionOrPublisher: IExtension | string, enable: boolean): Promise; open(extension: IExtension | string, options?: IExtensionEditorOptions): Promise; - isAutoUpdateEnabled(): boolean; + updateAutoUpdateValue(value: AutoUpdateConfigurationValue): Promise; getAutoUpdateValue(): AutoUpdateConfigurationValue; checkForUpdates(): Promise; getExtensionStatus(extension: IExtension): IExtensionsStatus | undefined; diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts index 95f83c91d4a2e..eee8b207a292d 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsWorkbenchService.test.ts @@ -25,7 +25,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TestExtensionTipsService, TestSharedProcessService } from 'vs/workbench/test/electron-sandbox/workbenchTestServices'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ConfigurationTarget, IConfigurationChangeEvent, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { ProgressService } from 'vs/workbench/services/progress/browser/progressService'; @@ -57,6 +57,7 @@ import { FileService } from 'vs/platform/files/common/fileService'; import { UserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfileService'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import { toUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; suite('ExtensionsWorkbenchServiceTest', () => { @@ -111,7 +112,8 @@ suite('ExtensionsWorkbenchServiceTest', () => { return local; }, async canInstall() { return true; }, - getTargetPlatform: async () => getTargetPlatform(platform, arch) + getTargetPlatform: async () => getTargetPlatform(platform, arch), + async resetPinnedStateForAllUserExtensions(pinned: boolean) { } }); instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({ @@ -1431,10 +1433,35 @@ suite('ExtensionsWorkbenchServiceTest', () => { await testObject.updateAutoUpdateEnablementFor(testObject.local[0], false); - assert.strictEqual(testObject.local[0].local?.pinned, true); + assert.strictEqual(testObject.local[0].local?.pinned, undefined); assert.strictEqual(testObject.local[1].local?.pinned, undefined); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), []); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), ['pub.a']); + }); + + test('Test disable autoupdate for extension when auto update is enabled for enabled extensions', async () => { + stubConfiguration('onlyEnabledExtensions'); + + const extension1 = aLocalExtension('a'); + const extension2 = aLocalExtension('b'); + instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2]); + instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: Mutable, metadata: Partial) => { + local.pinned = !!metadata.pinned; + return local; + }); + testObject = await aWorkbenchService(); + + assert.strictEqual(testObject.local[0].local?.pinned, undefined); + assert.strictEqual(testObject.local[1].local?.pinned, undefined); + + await testObject.updateAutoUpdateEnablementFor(testObject.local[0], false); + + assert.strictEqual(testObject.local[0].local?.pinned, undefined); + assert.strictEqual(testObject.local[1].local?.pinned, undefined); + + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), ['pub.a']); }); test('Test enable autoupdate for extension when auto update is enabled for all', async () => { @@ -1453,10 +1480,33 @@ suite('ExtensionsWorkbenchServiceTest', () => { await testObject.updateAutoUpdateEnablementFor(testObject.local[0], false); await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); + assert.strictEqual(testObject.local[0].local?.pinned, undefined); + assert.strictEqual(testObject.local[1].local?.pinned, undefined); + + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), []); + }); + + test('Test enable autoupdate for pinned extension when auto update is enabled', async () => { + const extension1 = aLocalExtension('a', undefined, { pinned: true }); + const extension2 = aLocalExtension('b'); + instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2]); + instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: Mutable, metadata: Partial) => { + local.pinned = !!metadata.pinned; + return local; + }); + testObject = await aWorkbenchService(); + + assert.strictEqual(testObject.local[0].local?.pinned, true); + assert.strictEqual(testObject.local[1].local?.pinned, undefined); + + await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); + assert.strictEqual(testObject.local[0].local?.pinned, false); assert.strictEqual(testObject.local[1].local?.pinned, undefined); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), []); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), []); }); test('Test updateAutoUpdateEnablementFor throws error when auto update is disabled', async () => { @@ -1489,46 +1539,6 @@ suite('ExtensionsWorkbenchServiceTest', () => { } }); - test('Test updateAutoUpdateEnablementFor throws error for extension id when auto update mode is onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); - - const extension1 = aLocalExtension('a'); - const extension2 = aLocalExtension('b'); - instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2]); - testObject = await aWorkbenchService(); - - try { - await testObject.updateAutoUpdateEnablementFor(testObject.local[0].identifier.id, true); - assert.fail('error expected'); - } catch (error) { - // expected - } - }); - - test('Test enable autoupdate for extension when auto update is set to onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); - - const extension1 = aLocalExtension('a', undefined, { pinned: true }); - const extension2 = aLocalExtension('b', undefined, { pinned: true }); - instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2]); - instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: Mutable, metadata: Partial) => { - local.pinned = !!metadata.pinned; - return local; - }); - testObject = await aWorkbenchService(); - - assert.strictEqual(testObject.local[0].local?.pinned, true); - assert.strictEqual(testObject.local[1].local?.pinned, true); - - await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); - - assert.strictEqual(testObject.local[0].local?.pinned, false); - assert.strictEqual(testObject.local[1].local?.pinned, true); - - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), ['pub.a']); - assert.equal(instantiationService.get(IConfigurationService).getValue(AutoUpdateConfigurationKey), 'onlySelectedExtensions'); - }); - test('Test enable autoupdate for extension when auto update is disabled', async () => { stubConfiguration(false); @@ -1546,15 +1556,17 @@ suite('ExtensionsWorkbenchServiceTest', () => { await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); - assert.strictEqual(testObject.local[0].local?.pinned, false); + assert.strictEqual(testObject.local[0].local?.pinned, true); assert.strictEqual(testObject.local[1].local?.pinned, true); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), ['pub.a']); - assert.equal(instantiationService.get(IConfigurationService).getValue(AutoUpdateConfigurationKey), 'onlySelectedExtensions'); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), ['pub.a']); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), []); }); - test('Test disable autoupdate for extension when auto update is set to onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); + test('Test reset autoupdate extensions state when auto update is disabled', async () => { + instantiationService.stub(IDialogService, { + confirm: () => Promise.resolve({ confirmed: true }) + }); const extension1 = aLocalExtension('a', undefined, { pinned: true }); const extension2 = aLocalExtension('b', undefined, { pinned: true }); @@ -1565,101 +1577,41 @@ suite('ExtensionsWorkbenchServiceTest', () => { }); testObject = await aWorkbenchService(); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); await testObject.updateAutoUpdateEnablementFor(testObject.local[0], false); - assert.strictEqual(testObject.local[0].local?.pinned, true); - assert.strictEqual(testObject.local[1].local?.pinned, true); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), []); - assert.equal(instantiationService.get(IConfigurationService).getValue(AutoUpdateConfigurationKey), false); - }); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), ['pub.a']); - test('Test enable auto update for publisher when auto update mode is onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); + await testObject.updateAutoUpdateValue(false); - const extension1 = aLocalExtension('a', undefined, { pinned: true }); - const extension2 = aLocalExtension('b', undefined, { pinned: true }); - const extension3 = aLocalExtension('a', { publisher: 'pub2' }, { pinned: true }); - instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2, extension3]); - instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: ILocalExtension, metadata: Partial) => { - local.pinned = !!metadata.pinned; - return local; - }); - testObject = await aWorkbenchService(); - - await testObject.updateAutoUpdateEnablementFor(testObject.local[0].publisher, true); - - assert.strictEqual(testObject.local[0].local?.pinned, false); - assert.strictEqual(testObject.local[1].local?.pinned, false); - assert.strictEqual(testObject.local[2].local?.pinned, true); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), ['pub']); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), []); }); - test('Test disable auto update for publisher when auto update mode is onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); - - const extension1 = aLocalExtension('a', undefined, { pinned: true }); - const extension2 = aLocalExtension('b', undefined, { pinned: true }); - const extension3 = aLocalExtension('a', { publisher: 'pub2' }, { pinned: true }); - instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2, extension3]); - instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: ILocalExtension, metadata: Partial) => { - local.pinned = !!metadata.pinned; - return local; + test('Test reset autoupdate extensions state when auto update is enabled', async () => { + stubConfiguration(false); + instantiationService.stub(IDialogService, { + confirm: () => Promise.resolve({ confirmed: true }) }); - testObject = await aWorkbenchService(); - - await testObject.updateAutoUpdateEnablementFor(testObject.local[0].publisher, true); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0].publisher, false); - - assert.strictEqual(testObject.local[0].local?.pinned, true); - assert.strictEqual(testObject.local[1].local?.pinned, true); - assert.strictEqual(testObject.local[2].local?.pinned, true); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), []); - }); - - test('Test disable auto update for an extension when auto update for publisher is enabled and update mode is onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); const extension1 = aLocalExtension('a', undefined, { pinned: true }); const extension2 = aLocalExtension('b', undefined, { pinned: true }); - const extension3 = aLocalExtension('a', { publisher: 'pub2' }, { pinned: true }); - instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2, extension3]); - instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: ILocalExtension, metadata: Partial) => { + instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2]); + instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: Mutable, metadata: Partial) => { local.pinned = !!metadata.pinned; return local; }); testObject = await aWorkbenchService(); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0].publisher, true); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0], false); - - assert.strictEqual(testObject.local[0].local?.pinned, true); - assert.strictEqual(testObject.local[1].local?.pinned, false); - assert.strictEqual(testObject.local[2].local?.pinned, true); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), ['pub', '-pub.a']); - }); + await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); - test('Test enable auto update for an extension when auto updates is enabled for publisher and disabled for extension and update mode is onlySelectedExtensions', async () => { - stubConfiguration('onlySelectedExtensions'); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), ['pub.a']); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), []); - const extension1 = aLocalExtension('a', undefined, { pinned: true }); - const extension2 = aLocalExtension('b', undefined, { pinned: true }); - const extension3 = aLocalExtension('a', { publisher: 'pub2' }, { pinned: true }); - instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [extension1, extension2, extension3]); - instantiationService.stub(IExtensionManagementService, 'updateMetadata', (local: ILocalExtension, metadata: Partial) => { - local.pinned = !!metadata.pinned; - return local; - }); - testObject = await aWorkbenchService(); + await testObject.updateAutoUpdateValue(true); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0].publisher, true); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0], false); - await testObject.updateAutoUpdateEnablementFor(testObject.local[0], true); - - assert.strictEqual(testObject.local[0].local?.pinned, false); - assert.strictEqual(testObject.local[1].local?.pinned, false); - assert.strictEqual(testObject.local[2].local?.pinned, true); - assert.deepStrictEqual(testObject.getSelectedExtensionsToAutoUpdate(), ['pub']); + assert.deepStrictEqual(testObject.getEnabledAutoUpdateExtensions(), []); + assert.deepStrictEqual(testObject.getDisabledAutoUpdateExtensions(), []); }); async function aWorkbenchService(): Promise { @@ -1673,13 +1625,22 @@ suite('ExtensionsWorkbenchServiceTest', () => { [AutoUpdateConfigurationKey]: autoUpdateValue ?? true, [AutoCheckUpdatesConfigurationKey]: autoCheckUpdatesValue ?? true }; + const emitter = disposableStore.add(new Emitter()); instantiationService.stub(IConfigurationService, { - onDidChangeConfiguration: () => { return undefined!; }, + onDidChangeConfiguration: emitter.event, getValue: (key?: any) => { return key ? values[key] : undefined; }, updateValue: async (key: string, value: any) => { values[key] = value; + emitter.fire({ + affectedKeys: new Set([key]), + source: ConfigurationTarget.USER, + change: { keys: [], overrides: [] }, + affectsConfiguration(configuration, overrides) { + return true; + }, + }); } }); } @@ -1752,6 +1713,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { }, getTargetPlatform: async () => getTargetPlatform(platform, arch), async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [] }; }, + async resetPinnedStateForAllUserExtensions(pinned: boolean) { } }; } }); diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index 68d30c40d35e8..b4d570c201594 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -226,6 +226,10 @@ export class ExtensionManagementService extends Disposable implements IWorkbench return Promise.reject(`Invalid location ${extension.location.toString()}`); } + async resetPinnedStateForAllUserExtensions(pinned: boolean): Promise { + await Promise.allSettled(this.servers.map(server => server.extensionManagementService.resetPinnedStateForAllUserExtensions(pinned))); + } + zip(extension: ILocalExtension): Promise { const server = this.getServer(extension); if (server) { diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 46cb0e01277de..a451ea2afb5a7 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -2205,6 +2205,7 @@ export class TestWorkbenchExtensionManagementService implements IWorkbenchExtens getInstalledWorkspaceExtensions(): Promise { throw new Error('Method not implemented.'); } installResourceExtension(): Promise { throw new Error('Method not implemented.'); } getExtensions(): Promise { throw new Error('Method not implemented.'); } + resetPinnedStateForAllUserExtensions(pinned: boolean): Promise { throw new Error('Method not implemented.'); } } export class TestUserDataProfileService implements IUserDataProfileService { From a238e1548597785afd08fa11469c95a4ce827146 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:11:57 +0200 Subject: [PATCH 622/755] Git - fix timing issue with branch picker (#219864) --- extensions/git/src/commands.ts | 38 ++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index fb53eee29767b..62d35d7af92eb 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2516,9 +2516,26 @@ export class CommandCenter { : l10n.t('Select a branch or tag to checkout'); quickPick.show(); - picks.push(... await createCheckoutItems(repository, opts?.detached)); - quickPick.items = [...commands, ...picks]; + + const setQuickPickItems = () => { + switch (true) { + case quickPick.value === '': + quickPick.items = [...commands, ...picks]; + break; + case commands.length === 0: + quickPick.items = picks; + break; + case picks.length === 0: + quickPick.items = commands; + break; + default: + quickPick.items = [...picks, { label: '', kind: QuickPickItemKind.Separator }, ...commands]; + break; + } + }; + + setQuickPickItems(); quickPick.busy = false; const choice = await new Promise(c => { @@ -2533,22 +2550,7 @@ export class CommandCenter { c(undefined); }))); - disposables.push(quickPick.onDidChangeValue(value => { - switch (true) { - case value === '': - quickPick.items = [...commands, ...picks]; - break; - case commands.length === 0: - quickPick.items = picks; - break; - case picks.length === 0: - quickPick.items = commands; - break; - default: - quickPick.items = [...picks, { label: '', kind: QuickPickItemKind.Separator }, ...commands]; - break; - } - })); + disposables.push(quickPick.onDidChangeValue(() => setQuickPickItems())); }); dispose(disposables); From 91bad301f1be9cafaa0004b2f42d0bce458e7417 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 3 Jul 2024 16:46:35 +0200 Subject: [PATCH 623/755] update `test-web` to 0.0.56 (#219866) --- package.json | 2 +- yarn.lock | 232 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 165 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index 8e5b8e35bed45..0be301683e5a4 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ "@vscode/telemetry-extractor": "^1.10.2", "@vscode/test-cli": "^0.0.6", "@vscode/test-electron": "^2.3.8", - "@vscode/test-web": "^0.0.50", + "@vscode/test-web": "^0.0.56", "@vscode/v8-heap-parser": "^0.1.0", "@vscode/vscode-perf": "^0.0.14", "ansi-colors": "^3.2.3", diff --git a/yarn.lock b/yarn.lock index 3ed17cd0af66d..9f322a5992fe1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -902,12 +902,12 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/browser-chromium@^1.40.1": - version "1.40.1" - resolved "https://registry.yarnpkg.com/@playwright/browser-chromium/-/browser-chromium-1.40.1.tgz#74f3a213f082798c838f2ef1405c5e9cfeeebc99" - integrity sha512-uNmjHYXBTYTfJkf89D6zVUcesCFzZ/yjkPj8FvBJQ6yf3na/j1rcjVNzx0PzOAGcWKioB/rnWRBi7b5ojOdCHA== +"@playwright/browser-chromium@^1.45.0": + version "1.45.1" + resolved "https://registry.yarnpkg.com/@playwright/browser-chromium/-/browser-chromium-1.45.1.tgz#7c1a69dfe9969df6271e8174f9c5dd43dee9a2a3" + integrity sha512-Jcix36xOagtda46bfn0CcdnygrcFT7FfwLhF1Y8JkHZTKPgfiku695+F0+CWabL4sU9nBG8sT5l7dmgkMgAJgw== dependencies: - playwright-core "1.40.1" + playwright-core "1.45.1" "@playwright/test@^1.45.0": version "1.45.0" @@ -1649,24 +1649,25 @@ jszip "^3.10.1" semver "^7.5.2" -"@vscode/test-web@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@vscode/test-web/-/test-web-0.0.50.tgz#fe6a9f5a50f3d8fd9379593a44173696ea75c20c" - integrity sha512-aFcwTyA3qirjfr6f5oKEV/07MbsbNeJEqElIh/ceNPEnJIyKYQeffbU7Cia9XtTKk1Ue1qMqwhdIO8OnUa9QBg== +"@vscode/test-web@^0.0.56": + version "0.0.56" + resolved "https://registry.yarnpkg.com/@vscode/test-web/-/test-web-0.0.56.tgz#963b6e1bfa6d5b4b600083e328ee8d28890108eb" + integrity sha512-lR688n+D6A9odw+IZ5cU8CYr2YXLB61bGgyZpPVJe/sJy4/DYX5CAxPb7Wj9ZMYL41CTvWq5DeXtfCjlabPcYA== dependencies: "@koa/cors" "^5.0.0" "@koa/router" "^12.0.1" - "@playwright/browser-chromium" "^1.40.1" + "@playwright/browser-chromium" "^1.45.0" + glob "^10.4.2" gunzip-maybe "^1.4.2" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.2" - koa "^2.14.2" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.4" + koa "^2.15.3" koa-morgan "^1.0.1" koa-mount "^4.0.0" koa-static "^5.0.0" minimist "^1.2.8" - playwright "^1.40.1" - tar-fs "^3.0.4" + playwright "^1.45.0" + tar-fs "^3.0.6" vscode-uri "^3.0.8" "@vscode/v8-heap-parser@^0.1.0": @@ -2505,6 +2506,39 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.4.2.tgz#3140cca7a0e11d49b3edc5041ab560659fd8e1f8" + integrity sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== + +bare-fs@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.1.tgz#cdbd63dac7a552dfb2b87d18c822298d1efd213d" + integrity sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA== + dependencies: + bare-events "^2.0.0" + bare-path "^2.0.0" + bare-stream "^2.0.0" + +bare-os@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.0.tgz#5de5e3ba7704f459c9656629edca7cc736e06608" + integrity sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg== + +bare-path@^2.0.0, bare-path@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" + integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== + dependencies: + bare-os "^2.1.0" + +bare-stream@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.1.3.tgz#070b69919963a437cc9e20554ede079ce0a129b2" + integrity sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ== + dependencies: + streamx "^2.18.0" + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3265,10 +3299,10 @@ cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookies@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== +cookies@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" + integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== dependencies: depd "~2.0.0" keygrip "~1.1.0" @@ -4459,7 +4493,7 @@ fast-fifo@^1.1.0: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.2.0.tgz#2ee038da2468e8623066dee96958b0c1763aa55a" integrity sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg== -fast-fifo@^1.2.0: +fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== @@ -4977,6 +5011,18 @@ glob@^10.0.0, glob@^10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob@^10.4.2: + version "10.4.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" + integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^5.0.13: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -5554,6 +5600,14 @@ http-proxy-agent@^7.0.0: agent-base "^7.1.0" debug "^4.3.4" +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -5586,6 +5640,14 @@ https-proxy-agent@^7.0.2: agent-base "^7.0.2" debug "4" +https-proxy-agent@^7.0.4: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + husky@^0.13.1: version "0.13.4" resolved "https://registry.yarnpkg.com/husky/-/husky-0.13.4.tgz#48785c5028de3452a51c48c12c4f94b2124a1407" @@ -6175,6 +6237,15 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-worker@^27.0.2: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.6.tgz#a5fdb1e14ad34eb228cfe162d9f729cdbfa28aed" @@ -6432,16 +6503,16 @@ koa-static@^5.0.0: debug "^3.1.0" koa-send "^5.0.0" -koa@^2.14.2: - version "2.14.2" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.14.2.tgz#a57f925c03931c2b4d94b19d2ebf76d3244863fc" - integrity sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g== +koa@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.15.3.tgz#062809266ee75ce0c75f6510a005b0e38f8c519a" + integrity sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg== dependencies: accepts "^1.3.5" cache-content-type "^1.0.0" content-disposition "~0.5.2" content-type "^1.0.4" - cookies "~0.8.0" + cookies "~0.9.0" debug "^4.3.2" delegates "^1.0.0" depd "^2.0.0" @@ -6666,6 +6737,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.2.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" + integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== + lru-cache@^4.1.3: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -7006,6 +7082,13 @@ minimatch@^7.4.3: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" @@ -7033,6 +7116,11 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -7684,6 +7772,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -7817,6 +7910,14 @@ path-scurry@^1.10.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -7935,16 +8036,16 @@ playwright-core@1.30.0: resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.30.0.tgz#de987cea2e86669e3b85732d230c277771873285" integrity sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g== -playwright-core@1.40.1: - version "1.40.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.40.1.tgz#442d15e86866a87d90d07af528e0afabe4c75c05" - integrity sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ== - playwright-core@1.45.0: version "1.45.0" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.45.0.tgz#5741a670b7c9060ce06852c0051d84736fb94edc" integrity sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ== +playwright-core@1.45.1: + version "1.45.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.45.1.tgz#549a2701556b58245cc75263f9fc2795c1158dc1" + integrity sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg== + playwright@1.45.0: version "1.45.0" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.45.0.tgz#400c709c64438690f13705cb9c88ef93089c5c27" @@ -7961,12 +8062,12 @@ playwright@^1.29.2: dependencies: playwright-core "1.30.0" -playwright@^1.40.1: - version "1.40.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.40.1.tgz#a11bf8dca15be5a194851dbbf3df235b9f53d7ae" - integrity sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw== +playwright@^1.45.0: + version "1.45.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.45.1.tgz#aaa6b0d6db14796b599d80c6679e63444e942534" + integrity sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg== dependencies: - playwright-core "1.40.1" + playwright-core "1.45.1" optionalDependencies: fsevents "2.3.2" @@ -9355,7 +9456,18 @@ streamx@^2.15.0: fast-fifo "^1.1.0" queue-tick "^1.0.1" -"string-width-cjs@npm:string-width@^4.2.0": +streamx@^2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.18.0.tgz#5bc1a51eb412a667ebfdcd4e6cf6a6fc65721ac7" + integrity sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ== + dependencies: + fast-fifo "^1.3.2" + queue-tick "^1.0.1" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9390,15 +9502,6 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9452,7 +9555,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9480,13 +9583,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -9648,14 +9744,16 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf" - integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== +tar-fs@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== dependencies: - mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^2.1.1" + bare-path "^2.1.0" tar-stream@^2.1.4: version "2.2.0" @@ -9768,6 +9866,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-decoder@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.1.0.tgz#3379e728fcf4d3893ec1aea35e8c2cac215ef190" + integrity sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw== + dependencies: + b4a "^1.6.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -10642,7 +10747,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10677,15 +10782,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 336250bb6e7ef3668d5bdfe84798ea0db908c71f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2024 17:38:52 +0200 Subject: [PATCH 624/755] fix #210363 (#219869) --- .../common/configurationRegistry.ts | 33 ++++++++++++++ .../test/common/extensionNls.test.ts | 9 ++-- .../platform/extensions/common/extensions.ts | 15 +------ .../userDataSync/common/settingsSync.ts | 34 +++++++++++--- .../userDataSync/common/userDataSync.ts | 41 ++++++++++++++--- .../test/common/userDataSyncClient.ts | 2 +- .../api/common/configurationExtensionPoint.ts | 44 +++++-------------- .../userDataSync/common/userDataSyncUtil.ts | 4 +- 8 files changed, 115 insertions(+), 67 deletions(-) diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 322e807f0a73a..98ab6dc12d833 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -888,3 +888,36 @@ export function getScopes(): [string, ConfigurationScope | undefined][] { scopes.push(['task', ConfigurationScope.RESOURCE]); return scopes; } + +export function getAllConfigurationProperties(configurationNode: IConfigurationNode[]): IStringDictionary { + const result: IStringDictionary = {}; + for (const configuration of configurationNode) { + const properties = configuration.properties; + if (types.isObject(properties)) { + for (const key in properties) { + result[key] = properties[key]; + } + } + if (configuration.allOf) { + Object.assign(result, getAllConfigurationProperties(configuration.allOf)); + } + } + return result; +} + +export function parseScope(scope: string): ConfigurationScope { + switch (scope) { + case 'application': + return ConfigurationScope.APPLICATION; + case 'machine': + return ConfigurationScope.MACHINE; + case 'resource': + return ConfigurationScope.RESOURCE; + case 'machine-overridable': + return ConfigurationScope.MACHINE_OVERRIDABLE; + case 'language-overridable': + return ConfigurationScope.LANGUAGE_OVERRIDABLE; + default: + return ConfigurationScope.WINDOW; + } +} diff --git a/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts b/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts index e23d69b9371b0..64aad4fbd4119 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionNls.test.ts @@ -7,8 +7,9 @@ import assert from 'assert'; import { deepClone } from 'vs/base/common/objects'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ILocalizedString } from 'vs/platform/action/common/action'; +import { IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { localizeManifest } from 'vs/platform/extensionManagement/common/extensionNls'; -import { IExtensionManifest, IConfiguration } from 'vs/platform/extensions/common/extensions'; +import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { NullLogger } from 'vs/platform/log/common/log'; const manifest: IExtensionManifest = { @@ -62,7 +63,7 @@ suite('Localize Manifest', () => { assert.strictEqual(localizedManifest.contributes?.commands?.[0].title, 'Test Command'); assert.strictEqual(localizedManifest.contributes?.commands?.[0].category, 'Test Category'); assert.strictEqual(localizedManifest.contributes?.authentication?.[0].label, 'Test Authentication'); - assert.strictEqual((localizedManifest.contributes?.configuration as IConfiguration).title, 'Test Configuration'); + assert.strictEqual((localizedManifest.contributes?.configuration as IConfigurationNode).title, 'Test Configuration'); }); test('replaces template strings with fallback if not found in translations', function () { @@ -81,7 +82,7 @@ suite('Localize Manifest', () => { assert.strictEqual(localizedManifest.contributes?.commands?.[0].title, 'Test Command'); assert.strictEqual(localizedManifest.contributes?.commands?.[0].category, 'Test Category'); assert.strictEqual(localizedManifest.contributes?.authentication?.[0].label, 'Test Authentication'); - assert.strictEqual((localizedManifest.contributes?.configuration as IConfiguration).title, 'Test Configuration'); + assert.strictEqual((localizedManifest.contributes?.configuration as IConfigurationNode).title, 'Test Configuration'); }); test('replaces template strings - command title & categories become ILocalizedString', function () { @@ -111,7 +112,7 @@ suite('Localize Manifest', () => { // Everything else stays as a string. assert.strictEqual(localizedManifest.contributes?.authentication?.[0].label, 'Testauthentifizierung'); - assert.strictEqual((localizedManifest.contributes?.configuration as IConfiguration).title, 'Testkonfiguration'); + assert.strictEqual((localizedManifest.contributes?.configuration as IConfigurationNode).title, 'Testkonfiguration'); }); test('replaces template strings - is best effort #164630', function () { diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index 4dd080da3aeb8..d0b69021dc2a5 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -21,19 +21,6 @@ export interface ICommand { category?: string | ILocalizedString; } -export interface IConfigurationProperty { - description: string; - type: string | string[]; - default?: any; -} - -export interface IConfiguration { - id?: string; - order?: number; - title?: string; - properties: { [key: string]: IConfigurationProperty }; -} - export interface IDebugger { label?: string; type: string; @@ -182,7 +169,7 @@ export interface ILocalizationContribution { export interface IExtensionContributions { commands?: ICommand[]; - configuration?: IConfiguration | IConfiguration[]; + configuration?: any; debuggers?: IDebugger[]; grammars?: IGrammar[]; jsonValidation?: IJSONValidation[]; diff --git a/src/vs/platform/userDataSync/common/settingsSync.ts b/src/vs/platform/userDataSync/common/settingsSync.ts index b1c7523e8efa4..c9499d33e9ef5 100644 --- a/src/vs/platform/userDataSync/common/settingsSync.ts +++ b/src/vs/platform/userDataSync/common/settingsSync.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { distinct } from 'vs/base/common/arrays'; import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; @@ -12,6 +13,7 @@ import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configur import { ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -19,7 +21,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' import { IUserDataProfile, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { AbstractInitializer, AbstractJsonFileSynchroniser, IAcceptResult, IFileResourcePreview, IMergeResult } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { getIgnoredSettings, isEmpty, merge, updateIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge'; -import { Change, IRemoteUserData, IUserDataSyncLocalStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME, IUserDataResourceManifest } from 'vs/platform/userDataSync/common/userDataSync'; +import { Change, IRemoteUserData, IUserDataSyncLocalStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME, IUserDataResourceManifest, getIgnoredSettingsForExtension } from 'vs/platform/userDataSync/common/userDataSync'; interface ISettingsResourcePreview extends IFileResourcePreview { previewResult: IMergeResult; @@ -51,7 +53,7 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement readonly acceptedResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'accepted' }); constructor( - profile: IUserDataProfile, + private readonly profile: IUserDataProfile, collection: string | undefined, @IFileService fileService: IFileService, @IEnvironmentService environmentService: IEnvironmentService, @@ -315,21 +317,39 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement return { settings }; } - private _defaultIgnoredSettings: Promise | undefined = undefined; + private coreIgnoredSettings: Promise | undefined = undefined; + private systemExtensionsIgnoredSettings: Promise | undefined = undefined; + private userExtensionsIgnoredSettings: Promise | undefined = undefined; private async getIgnoredSettings(content?: string): Promise { - if (!this._defaultIgnoredSettings) { - this._defaultIgnoredSettings = this.userDataSyncUtilService.resolveDefaultIgnoredSettings(); + if (!this.coreIgnoredSettings) { + this.coreIgnoredSettings = this.userDataSyncUtilService.resolveDefaultCoreIgnoredSettings(); + } + if (!this.systemExtensionsIgnoredSettings) { + this.systemExtensionsIgnoredSettings = this.getIgnoredSettingForSystemExtensions(); + } + if (!this.userExtensionsIgnoredSettings) { + this.userExtensionsIgnoredSettings = this.getIgnoredSettingForUserExtensions(); const disposable = this._register(Event.any( Event.filter(this.extensionManagementService.onDidInstallExtensions, (e => e.some(({ local }) => !!local))), Event.filter(this.extensionManagementService.onDidUninstallExtension, (e => !e.error)))(() => { disposable.dispose(); - this._defaultIgnoredSettings = undefined; + this.userExtensionsIgnoredSettings = undefined; })); } - const defaultIgnoredSettings = await this._defaultIgnoredSettings; + const defaultIgnoredSettings = (await Promise.all([this.coreIgnoredSettings, this.systemExtensionsIgnoredSettings, this.userExtensionsIgnoredSettings])).flat(); return getIgnoredSettings(defaultIgnoredSettings, this.configurationService, content); } + private async getIgnoredSettingForSystemExtensions(): Promise { + const systemExtensions = await this.extensionManagementService.getInstalled(ExtensionType.System); + return distinct(systemExtensions.map(e => getIgnoredSettingsForExtension(e.manifest)).flat()); + } + + private async getIgnoredSettingForUserExtensions(): Promise { + const userExtensions = await this.extensionManagementService.getInstalled(ExtensionType.User, this.profile.extensionsResource); + return distinct(userExtensions.map(e => getIgnoredSettingsForExtension(e.manifest)).flat()); + } + private validateContent(content: string): void { if (this.hasErrors(content, false)) { throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync settings as there are errors/warning in settings file."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 084755420cb32..ed81c9196e895 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -15,9 +15,10 @@ import { isObject, isString } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IHeaders } from 'vs/base/parts/request/common/request'; import { localize } from 'vs/nls'; -import { allSettings, ConfigurationScope, Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; +import { allSettings, ConfigurationScope, Extensions as ConfigurationExtensions, IConfigurationRegistry, IRegisteredConfigurationPropertySchema, getAllConfigurationProperties, parseScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { EXTENSION_IDENTIFIER_PATTERN, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Extensions as JSONExtensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { ILogService } from 'vs/platform/log/common/log'; @@ -30,12 +31,40 @@ export function getDisallowedIgnoredSettings(): string[] { return Object.keys(allSettings).filter(setting => !!allSettings[setting].disallowSyncIgnore); } -export function getDefaultIgnoredSettings(): string[] { +export function getDefaultIgnoredSettings(excludeExtensions: boolean = false): string[] { const allSettings = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); - const ignoreSyncSettings = Object.keys(allSettings).filter(setting => !!allSettings[setting].ignoreSync); - const machineSettings = Object.keys(allSettings).filter(setting => allSettings[setting].scope === ConfigurationScope.MACHINE || allSettings[setting].scope === ConfigurationScope.MACHINE_OVERRIDABLE); + const ignoredSettings = getIgnoredSettings(allSettings, excludeExtensions); const disallowedSettings = getDisallowedIgnoredSettings(); - return distinct([...ignoreSyncSettings, ...machineSettings, ...disallowedSettings]); + return distinct([...ignoredSettings, ...disallowedSettings]); +} + +export function getIgnoredSettingsForExtension(manifest: IExtensionManifest): string[] { + if (!manifest.contributes?.configuration) { + return []; + } + const configurations = Array.isArray(manifest.contributes.configuration) ? manifest.contributes.configuration : [manifest.contributes.configuration]; + if (!configurations.length) { + return []; + } + const properties = getAllConfigurationProperties(configurations); + return getIgnoredSettings(properties, false); +} + +function getIgnoredSettings(properties: IStringDictionary, excludeExtensions: boolean): string[] { + const ignoredSettings = new Set(); + for (const key in properties) { + if (excludeExtensions && !!properties[key].source) { + continue; + } + const scope = isString(properties[key].scope) ? parseScope(properties[key].scope) : properties[key].scope; + if (properties[key].ignoreSync + || scope === ConfigurationScope.MACHINE + || scope === ConfigurationScope.MACHINE_OVERRIDABLE + ) { + ignoredSettings.add(key); + } + } + return [...ignoredSettings.values()]; } export const USER_DATA_SYNC_CONFIGURATION_SCOPE = 'settingsSync'; @@ -591,7 +620,7 @@ export interface IUserDataSyncUtilService { readonly _serviceBrand: undefined; resolveUserBindings(userbindings: string[]): Promise>; resolveFormattingOptions(resource: URI): Promise; - resolveDefaultIgnoredSettings(): Promise; + resolveDefaultCoreIgnoredSettings(): Promise; } export const IUserDataSyncLogService = createDecorator('IUserDataSyncLogService'); diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index 3a035f63221cb..ea8260323a9ca 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -355,7 +355,7 @@ export class TestUserDataSyncUtilService implements IUserDataSyncUtilService { _serviceBrand: any; - async resolveDefaultIgnoredSettings(): Promise { + async resolveDefaultCoreIgnoredSettings(): Promise { return getDefaultIgnoredSettings(); } diff --git a/src/vs/workbench/api/common/configurationExtensionPoint.ts b/src/vs/workbench/api/common/configurationExtensionPoint.ts index 496651fe769c7..b5a56b231e854 100644 --- a/src/vs/workbench/api/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/api/common/configurationExtensionPoint.ts @@ -8,7 +8,7 @@ import * as objects from 'vs/base/common/objects'; import { Registry } from 'vs/platform/registry/common/platform'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { ExtensionsRegistry, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { IConfigurationNode, IConfigurationRegistry, Extensions, validateProperty, ConfigurationScope, OVERRIDE_PROPERTY_REGEX, IConfigurationDefaults, configurationDefaultsSchemaId, IConfigurationDelta, getDefaultValue } from 'vs/platform/configuration/common/configurationRegistry'; +import { IConfigurationNode, IConfigurationRegistry, Extensions, validateProperty, ConfigurationScope, OVERRIDE_PROPERTY_REGEX, IConfigurationDefaults, configurationDefaultsSchemaId, IConfigurationDelta, getDefaultValue, getAllConfigurationProperties, parseScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { workspaceSettingsSchemaId, launchSchemaId, tasksSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { isObject, isUndefined } from 'vs/base/common/types'; @@ -210,8 +210,7 @@ configurationExtPoint.setHandler((extensions, { added, removed }) => { const seenProperties = new Set(); - function handleConfiguration(node: IConfigurationNode, extension: IExtensionPointUser): IConfigurationNode[] { - const configurations: IConfigurationNode[] = []; + function handleConfiguration(node: IConfigurationNode, extension: IExtensionPointUser): IConfigurationNode { const configuration = objects.deepClone(node); if (configuration.title && (typeof configuration.title !== 'string')) { @@ -224,8 +223,7 @@ configurationExtPoint.setHandler((extensions, { added, removed }) => { configuration.extensionInfo = { id: extension.description.identifier.value, displayName: extension.description.displayName }; configuration.restrictedProperties = extension.description.capabilities?.untrustedWorkspaces?.supported === 'limited' ? extension.description.capabilities?.untrustedWorkspaces.restrictedConfigurations : undefined; configuration.title = configuration.title || extension.description.displayName || extension.description.identifier.value; - configurations.push(configuration); - return configurations; + return configuration; } function validateProperties(configuration: IConfigurationNode, extension: IExtensionPointUser): void { @@ -254,23 +252,7 @@ configurationExtPoint.setHandler((extensions, { added, removed }) => { continue; } seenProperties.add(key); - if (propertyConfiguration.scope) { - if (propertyConfiguration.scope.toString() === 'application') { - propertyConfiguration.scope = ConfigurationScope.APPLICATION; - } else if (propertyConfiguration.scope.toString() === 'machine') { - propertyConfiguration.scope = ConfigurationScope.MACHINE; - } else if (propertyConfiguration.scope.toString() === 'resource') { - propertyConfiguration.scope = ConfigurationScope.RESOURCE; - } else if (propertyConfiguration.scope.toString() === 'machine-overridable') { - propertyConfiguration.scope = ConfigurationScope.MACHINE_OVERRIDABLE; - } else if (propertyConfiguration.scope.toString() === 'language-overridable') { - propertyConfiguration.scope = ConfigurationScope.LANGUAGE_OVERRIDABLE; - } else { - propertyConfiguration.scope = ConfigurationScope.WINDOW; - } - } else { - propertyConfiguration.scope = ConfigurationScope.WINDOW; - } + propertyConfiguration.scope = propertyConfiguration.scope ? parseScope(propertyConfiguration.scope.toString()) : ConfigurationScope.WINDOW; } } const subNodes = configuration.allOf; @@ -288,9 +270,9 @@ configurationExtPoint.setHandler((extensions, { added, removed }) => { const configurations: IConfigurationNode[] = []; const value = extension.value; if (Array.isArray(value)) { - value.forEach(v => configurations.push(...handleConfiguration(v, extension))); + value.forEach(v => configurations.push(handleConfiguration(v, extension))); } else { - configurations.push(...handleConfiguration(value, extension)); + configurations.push(handleConfiguration(value, extension)); } extensionConfigurations.set(extension.description.identifier, configurations); addedConfigurations.push(...configurations); @@ -400,15 +382,11 @@ class SettingsTableRenderer extends Disposable implements IExtensionFeatureTable } render(manifest: IExtensionManifest): IRenderedData { - const configuration = manifest.contributes?.configuration; - let properties: any = {}; - if (Array.isArray(configuration)) { - configuration.forEach(config => { - properties = { ...properties, ...config.properties }; - }); - } else if (configuration) { - properties = configuration.properties; - } + const configuration: IConfigurationNode[] = manifest.contributes?.configuration + ? Array.isArray(manifest.contributes.configuration) ? manifest.contributes.configuration : [manifest.contributes.configuration] + : []; + + const properties = getAllConfigurationProperties(configuration); const contrib = properties ? Object.keys(properties) : []; const headers = [nls.localize('setting name', "ID"), nls.localize('description', "Description"), nls.localize('default', "Default")]; diff --git a/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts b/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts index 45329df40c480..cd7f253b913ff 100644 --- a/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts +++ b/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts @@ -23,8 +23,8 @@ class UserDataSyncUtilService implements IUserDataSyncUtilService { @ITextResourceConfigurationService private readonly textResourceConfigurationService: ITextResourceConfigurationService, ) { } - async resolveDefaultIgnoredSettings(): Promise { - return getDefaultIgnoredSettings(); + async resolveDefaultCoreIgnoredSettings(): Promise { + return getDefaultIgnoredSettings(true); } async resolveUserBindings(userBindings: string[]): Promise> { From eb8142459e95dc541c5b1eead438d4b60100ca52 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2024 17:39:59 +0200 Subject: [PATCH 625/755] feedback (#219868) --- .../contrib/extensions/browser/extensionsWorkbenchService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index e4b62d95f4a7b..9c34630f65b6c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -1077,7 +1077,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension message: isEnabled ? nls.localize('confirmEnableAutoUpdate', "Do you want to enable auto update for all extensions?") : nls.localize('confirmDisableAutoUpdate', "Do you want to disable auto update for all extensions?"), - detail: nls.localize('confirmEnableDisableAutoUpdateDetail', "This will reset the auto update settings you have set for individual extensions."), + detail: nls.localize('confirmEnableDisableAutoUpdateDetail', "This will reset any auto update settings you have set for individual extensions."), }); if (!result.confirmed) { return; From 7a580b79e50d100baf1ae82516d9e00cf9c62dda Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2024 09:08:38 -0700 Subject: [PATCH 626/755] Pick up latest TS for building VS Code (#219870) --- package.json | 2 +- yarn.lock | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 0be301683e5a4..92e269b5a3fc7 100644 --- a/package.json +++ b/package.json @@ -207,7 +207,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "tsec": "0.2.7", - "typescript": "^5.6.0-dev.20240618", + "typescript": "^5.6.0-dev.20240703", "util": "^0.12.4", "vscode-nls-dev": "^3.3.1", "webpack": "^5.91.0", diff --git a/yarn.lock b/yarn.lock index 9f322a5992fe1..466eaf63f251d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9467,7 +9467,7 @@ streamx@^2.18.0: optionalDependencies: bare-events "^2.2.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9502,6 +9502,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9555,7 +9564,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9583,6 +9592,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10194,10 +10210,10 @@ typescript@^4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^5.6.0-dev.20240618: - version "5.6.0-dev.20240618" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.0-dev.20240618.tgz#5ce1d67e5c9e36585349916a85a3f3d8cc806168" - integrity sha512-nUnATyFjcoenJB7S5oPGea2s0dd8MVl+2NisBLm7E+zpXkX0KSLy8Y7aFNSQ+r1Hs/MrKfSlV4O8yiQpCuOqrQ== +typescript@^5.6.0-dev.20240703: + version "5.6.0-dev.20240703" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.0-dev.20240703.tgz#4b1fad9790ff4827a9210c6943b3039b53a739da" + integrity sha512-AAOGWtykhMpxB4l+5CwojT2aBVAszalz9guzYaZMavmKHWxm3HciR+cIcKqDgR22hR7fPBJHtOti7uFCo4mt4A== typical@^4.0.0: version "4.0.0" @@ -10747,7 +10763,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10782,6 +10798,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From e6a828c5957959b7a18de37a567d850880101641 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 3 Jul 2024 20:54:43 +0200 Subject: [PATCH 627/755] Fix #219705 (#219881) --- .../browser/userDataProfilesEditorModel.ts | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts index a2e56bc5c7be7..237d9142b36c2 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditorModel.ts @@ -394,6 +394,9 @@ export class NewProfileElement extends AbstractUserDataProfileElement { private templatePromise: CancelablePromise | undefined; private template: IUserDataProfileTemplate | null = null; + private defaultName: string; + private defaultIcon: string | undefined; + constructor( name: string, copyFrom: URI | IUserDataProfile | undefined, @@ -417,6 +420,7 @@ export class NewProfileElement extends AbstractUserDataProfileElement { commandService, instantiationService, ); + this.defaultName = name; this._copyFrom = copyFrom; this._copyFlags = this.getCopyFlagsFrom(copyFrom); this.initialize(); @@ -473,8 +477,12 @@ export class NewProfileElement extends AbstractUserDataProfileElement { if (this.copyFrom instanceof URI) { await this.resolveTemplate(this.copyFrom); if (this.template) { - this.name = this.template.name ?? ''; - this.icon = this.template.icon; + if (this.defaultName === this.name) { + this.name = this.defaultName = this.template.name ?? ''; + } + if (this.defaultIcon === this.icon) { + this.icon = this.defaultIcon = this.template.icon; + } this.setCopyFlag(ProfileResourceType.Settings, !!this.template.settings); this.setCopyFlag(ProfileResourceType.Keybindings, !!this.template.keybindings); this.setCopyFlag(ProfileResourceType.Tasks, !!this.template.tasks); @@ -485,8 +493,12 @@ export class NewProfileElement extends AbstractUserDataProfileElement { } if (isUserDataProfile(this.copyFrom)) { - this.name = `${this.copyFrom.name} (Copy)`; - this.icon = this.copyFrom.icon; + if (this.defaultName === this.name) { + this.name = this.defaultName = localize('copy from', "{0} (Copy)", this.copyFrom.name); + } + if (this.defaultIcon === this.icon) { + this.icon = this.defaultIcon = this.copyFrom.icon; + } this.setCopyFlag(ProfileResourceType.Settings, true); this.setCopyFlag(ProfileResourceType.Keybindings, true); this.setCopyFlag(ProfileResourceType.Tasks, true); @@ -495,8 +507,12 @@ export class NewProfileElement extends AbstractUserDataProfileElement { return; } - this.name = localize('untitled', "Untitled"); - this.icon = undefined; + if (this.defaultName === this.name) { + this.name = this.defaultName = localize('untitled', "Untitled"); + } + if (this.defaultIcon === this.icon) { + this.icon = this.defaultIcon = undefined; + } this.setCopyFlag(ProfileResourceType.Settings, false); this.setCopyFlag(ProfileResourceType.Keybindings, false); this.setCopyFlag(ProfileResourceType.Tasks, false); From a101882bb6134803c7062e07fe57b463e11399f6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 Jul 2024 21:08:55 +0200 Subject: [PATCH 628/755] select a language option is not working (#219876) (#219879) --- .../browser/emptyTextEditorHint/emptyTextEditorHint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts index 327554fd78153..952a32eac79e2 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts @@ -348,7 +348,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget { id: ChangeLanguageAction.ID, from: 'hint' }); - await this.commandService.executeCommand(ChangeLanguageAction.ID, { from: 'hint' }); + await this.commandService.executeCommand(ChangeLanguageAction.ID); this.editor.focus(); }; From 3581a121d1c05455c5bed4e79973c75ef8b9c6de Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 3 Jul 2024 22:44:46 +0200 Subject: [PATCH 629/755] compress schemas by using $refs for duplicates (#219883) * compress schema * add tests * remove unused import * polish --- src/vs/base/common/jsonSchema.ts | 147 +++++ src/vs/base/test/common/jsonSchema.test.ts | 574 ++++++++++++++++++ .../common/preferencesContribution.ts | 21 +- 3 files changed, 739 insertions(+), 3 deletions(-) create mode 100644 src/vs/base/test/common/jsonSchema.test.ts diff --git a/src/vs/base/common/jsonSchema.ts b/src/vs/base/common/jsonSchema.ts index 4216b0e5c0d80..fbf6d9813fa13 100644 --- a/src/vs/base/common/jsonSchema.ts +++ b/src/vs/base/common/jsonSchema.ts @@ -118,3 +118,150 @@ export type SchemaToType = T extends { type: 'string' } : T extends { type: 'array'; items: infer I } ? Array> : never; + +interface Equals { schemas: IJSONSchema[]; id?: string } + +export function getCompressedContent(schema: IJSONSchema): string { + let hasDups = false; + + + // visit all schema nodes and collect the ones that are equal + const equalsByString = new Map(); + const nodeToEquals = new Map(); + const visitSchemas = (next: IJSONSchema) => { + if (schema === next) { + return true; + } + const val = JSON.stringify(next); + if (val.length < 30) { + // the $ref takes around 25 chars, so we don't save anything + return true; + } + const eq = equalsByString.get(val); + if (!eq) { + const newEq = { schemas: [next] }; + equalsByString.set(val, newEq); + nodeToEquals.set(next, newEq); + return true; + } + eq.schemas.push(next); + nodeToEquals.set(next, eq); + hasDups = true; + return false; + }; + traverseNodes(schema, visitSchemas); + equalsByString.clear(); + + if (!hasDups) { + return JSON.stringify(schema); + } + + let defNodeName = '$defs'; + while (schema.hasOwnProperty(defNodeName)) { + defNodeName += '_'; + } + + // used to collect all schemas that are later put in `$defs`. The index in the array is the id of the schema. + const definitions: IJSONSchema[] = []; + + function stringify(root: IJSONSchema): string { + return JSON.stringify(root, (_key: string, value: any) => { + if (value !== root) { + const eq = nodeToEquals.get(value); + if (eq && eq.schemas.length > 1) { + if (!eq.id) { + eq.id = `_${definitions.length}`; + definitions.push(eq.schemas[0]); + } + return { $ref: `#/${defNodeName}/${eq.id}` }; + } + } + return value; + }); + } + + // stringify the schema and replace duplicate subtrees with $ref + // this will add new items to the definitions array + const str = stringify(schema); + + // now stringify the definitions. Each invication of stringify cann add new items to the definitions array, so the length can grow while we iterate + const defStrings: string[] = []; + for (let i = 0; i < definitions.length; i++) { + defStrings.push(`"_${i}":${stringify(definitions[i])}`); + } + if (defStrings.length) { + return `${str.substring(0, str.length - 1)},"${defNodeName}":{${defStrings.join(',')}}}`; + } + return str; +} + +type IJSONSchemaRef = IJSONSchema | boolean; + +function isObject(thing: any): thing is object { + return typeof thing === 'object' && thing !== null; +} + +/* + * Traverse a JSON schema and visit each schema node +*/ +function traverseNodes(root: IJSONSchema, visit: (schema: IJSONSchema) => boolean) { + if (!root || typeof root !== 'object') { + return; + } + const collectEntries = (...entries: (IJSONSchemaRef | undefined)[]) => { + for (const entry of entries) { + if (isObject(entry)) { + toWalk.push(entry); + } + } + }; + const collectMapEntries = (...maps: (IJSONSchemaMap | undefined)[]) => { + for (const map of maps) { + if (isObject(map)) { + for (const key in map) { + const entry = map[key]; + if (isObject(entry)) { + toWalk.push(entry); + } + } + } + } + }; + const collectArrayEntries = (...arrays: (IJSONSchemaRef[] | undefined)[]) => { + for (const array of arrays) { + if (Array.isArray(array)) { + for (const entry of array) { + if (isObject(entry)) { + toWalk.push(entry); + } + } + } + } + }; + const collectEntryOrArrayEntries = (items: (IJSONSchemaRef[] | IJSONSchemaRef | undefined)) => { + if (Array.isArray(items)) { + for (const entry of items) { + if (isObject(entry)) { + toWalk.push(entry); + } + } + } else if (isObject(items)) { + toWalk.push(items); + } + }; + + const toWalk: IJSONSchema[] = [root]; + + let next = toWalk.pop(); + while (next) { + const visitChildern = visit(next); + if (visitChildern) { + collectEntries(next.additionalItems, next.additionalProperties, next.not, next.contains, next.propertyNames, next.if, next.then, next.else, next.unevaluatedItems, next.unevaluatedProperties); + collectMapEntries(next.definitions, next.$defs, next.properties, next.patternProperties, next.dependencies, next.dependentSchemas); + collectArrayEntries(next.anyOf, next.allOf, next.oneOf, next.prefixItems); + collectEntryOrArrayEntries(next.items); + } + next = toWalk.pop(); + } +} + diff --git a/src/vs/base/test/common/jsonSchema.test.ts b/src/vs/base/test/common/jsonSchema.test.ts new file mode 100644 index 0000000000000..f47e179014328 --- /dev/null +++ b/src/vs/base/test/common/jsonSchema.test.ts @@ -0,0 +1,574 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import assert from 'assert'; +import { getCompressedContent, IJSONSchema } from 'vs/base/common/jsonSchema'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; + +suite('JSON Schema', () => { + + ensureNoDisposablesAreLeakedInTestSuite(); + + test('getCompressedContent 1', () => { + + const schema: IJSONSchema = { + type: 'object', + properties: { + a: { + type: 'object', + description: 'a', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + }, + e: { + type: 'object', + description: 'e', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + } + } + }; + + const expected: IJSONSchema = { + type: 'object', + properties: { + a: { + type: 'object', + description: 'a', + properties: { + b: { + $ref: '#/$defs/_0' + } + } + }, + e: { + type: 'object', + description: 'e', + properties: { + b: { + $ref: '#/$defs/_0' + } + } + } + }, + $defs: { + "_0": { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + + }; + + assert.deepEqual(getCompressedContent(schema), JSON.stringify(expected)); + }); + + test('getCompressedContent 2', () => { + + const schema: IJSONSchema = { + type: 'object', + properties: { + a: { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + }, + e: { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + } + } + }; + + const expected: IJSONSchema = { + type: 'object', + properties: { + a: { + $ref: '#/$defs/_0' + + }, + e: { + $ref: '#/$defs/_0' + } + }, + $defs: { + "_0": { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + } + } + + }; + + assert.deepEqual(getCompressedContent(schema), JSON.stringify(expected)); + }); + + test('getCompressedContent 3', () => { + + + const schema: IJSONSchema = { + type: 'object', + properties: { + a: { + type: 'object', + oneOf: [ + { + allOf: [ + { + properties: { + name: { + type: 'string' + }, + description: { + type: 'string' + } + } + }, + { + properties: { + street: { + type: 'string' + }, + } + } + ] + }, + { + allOf: [ + { + properties: { + name: { + type: 'string' + }, + description: { + type: 'string' + } + } + }, + { + properties: { + river: { + type: 'string' + }, + } + } + ] + }, + { + allOf: [ + { + properties: { + name: { + type: 'string' + }, + description: { + type: 'string' + } + } + }, + { + properties: { + mountain: { + type: 'string' + }, + } + } + ] + } + ] + }, + b: { + type: 'object', + properties: { + street: { + properties: { + street: { + type: 'string' + } + } + } + } + } + } + }; + + const expected: IJSONSchema = { + "type": "object", + "properties": { + "a": { + "type": "object", + "oneOf": [ + { + "allOf": [ + { + "$ref": "#/$defs/_0" + }, + { + "$ref": "#/$defs/_1" + } + ] + }, + { + "allOf": [ + { + "$ref": "#/$defs/_0" + }, + { + "properties": { + "river": { + "type": "string" + } + } + } + ] + }, + { + "allOf": [ + { + "$ref": "#/$defs/_0" + }, + { + "properties": { + "mountain": { + "type": "string" + } + } + } + ] + } + ] + }, + "b": { + "type": "object", + "properties": { + "street": { + "$ref": "#/$defs/_1" + } + } + } + }, + "$defs": { + "_0": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "_1": { + "properties": { + "street": { + "type": "string" + } + } + } + } + }; + + const actual = getCompressedContent(schema); + assert.deepEqual(actual, JSON.stringify(expected)); + }); + + test('getCompressedContent 4', () => { + + const schema: IJSONSchema = { + type: 'object', + properties: { + a: { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + }, + e: { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + }, + f: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + }; + + const expected: IJSONSchema = { + type: 'object', + properties: { + a: { + $ref: '#/$defs/_0' + }, + e: { + $ref: '#/$defs/_0' + }, + f: { + $ref: '#/$defs/_1' + } + }, + $defs: { + "_0": { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + $ref: '#/$defs/_1' + } + } + } + } + }, + "_1": { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + + }; + + assert.deepEqual(getCompressedContent(schema), JSON.stringify(expected)); + }); + + test('getCompressedContent 5', () => { + + const schema: IJSONSchema = { + type: 'object', + properties: { + a: { + type: 'array', + items: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + }, + e: { + type: 'array', + items: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + }, + f: { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + }, + g: { + type: 'object', + properties: { + b: { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + } + } + }; + + const expected: IJSONSchema = { + type: 'object', + properties: { + a: { + $ref: '#/$defs/_0' + }, + e: { + $ref: '#/$defs/_0' + }, + f: { + $ref: '#/$defs/_1' + }, + g: { + $ref: '#/$defs/_1' + } + }, + $defs: { + "_0": { + type: 'array', + items: { + $ref: '#/$defs/_2' + } + }, + "_1": { + type: 'object', + properties: { + b: { + $ref: '#/$defs/_2' + } + } + }, + "_2": { + type: 'object', + properties: { + c: { + type: 'object', + properties: { + d: { + type: 'string' + } + } + } + } + } + } + + }; + + assert.deepEqual(getCompressedContent(schema), JSON.stringify(expected)); + }); + + +}); diff --git a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 877d449605c32..958b8443d7099 100644 --- a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -24,6 +24,8 @@ import { RegisteredEditorPriority, IEditorResolverService } from 'vs/workbench/s import { ITextEditorService } from 'vs/workbench/services/textfile/common/textEditorService'; import { DEFAULT_SETTINGS_EDITOR_SETTING, FOLDER_SETTINGS_PATH, IPreferencesService, USE_SPLIT_JSON_SETTING } from 'vs/workbench/services/preferences/common/preferences'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { getCompressedContent, IJSONSchema } from 'vs/base/common/jsonSchema'; +import { ILogService, LogLevel } from 'vs/platform/log/common/log'; const schemaRegistry = Registry.as(JSONContributionRegistry.Extensions.JSONContribution); @@ -43,7 +45,8 @@ export class PreferencesContribution implements IWorkbenchContribution { @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, @IConfigurationService private readonly configurationService: IConfigurationService, @IEditorResolverService private readonly editorResolverService: IEditorResolverService, - @ITextEditorService private readonly textEditorService: ITextEditorService + @ITextEditorService private readonly textEditorService: ITextEditorService, + @ILogService private readonly logService: ILogService, ) { this.settingsListener = this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(USE_SPLIT_JSON_SETTING) || e.affectsConfiguration(DEFAULT_SETTINGS_EDITOR_SETTING)) { @@ -120,26 +123,38 @@ export class PreferencesContribution implements IWorkbenchContribution { private getSchemaModel(uri: URI): ITextModel { let schema = schemaRegistry.getSchemaContributions().schemas[uri.toString()] ?? {} /* Use empty schema if not yet registered */; - const modelContent = JSON.stringify(schema); + const modelContent = this.getSchemaContent(uri, schema); const languageSelection = this.languageService.createById('jsonc'); const model = this.modelService.createModel(modelContent, languageSelection, uri); const disposables = new DisposableStore(); disposables.add(schemaRegistry.onDidChangeSchema(schemaUri => { if (schemaUri === uri.toString()) { schema = schemaRegistry.getSchemaContributions().schemas[uri.toString()]; - model.setValue(JSON.stringify(schema)); + model.setValue(this.getSchemaContent(uri, schema)); } })); disposables.add(model.onWillDispose(() => disposables.dispose())); return model; } + private getSchemaContent(uri: URI, schema: IJSONSchema): string { + const startTime = Date.now(); + const content = getCompressedContent(schema); + if (this.logService.getLevel() === LogLevel.Debug) { + const endTime = Date.now(); + const uncompressed = JSON.stringify(schema); + this.logService.debug(`${uri.path}: ${uncompressed.length} -> ${content.length} (${Math.round((uncompressed.length - content.length) / uncompressed.length * 100)}%) Took ${endTime - startTime}ms`); + } + return content; + } + dispose(): void { dispose(this.editorOpeningListener); dispose(this.settingsListener); } } + const registry = Registry.as(Extensions.Configuration); registry.registerConfiguration({ ...workbenchConfigurationNodeBase, From edd91bc5e08bc3e380d9d900b42c13a3a36bb01b Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Wed, 3 Jul 2024 15:12:40 -0700 Subject: [PATCH 630/755] Update classifier workflows to use AzureLogin task (#219895) --- .../workflows/deep-classifier-assign-monitor.yml | 1 - .github/workflows/deep-classifier-runner.yml | 2 -- .github/workflows/deep-classifier-scraper.yml | 13 +++++++++++-- .../workflows/deep-classifier-unassign-monitor.yml | 1 - 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deep-classifier-assign-monitor.yml b/.github/workflows/deep-classifier-assign-monitor.yml index cfd9abc374a64..a61f9cfb13758 100644 --- a/.github/workflows/deep-classifier-assign-monitor.yml +++ b/.github/workflows/deep-classifier-assign-monitor.yml @@ -21,4 +21,3 @@ jobs: with: botName: VSCodeTriageBot token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} diff --git a/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml index 81fd351675132..7145de06db56c 100644 --- a/.github/workflows/deep-classifier-runner.yml +++ b/.github/workflows/deep-classifier-runner.yml @@ -40,9 +40,7 @@ jobs: excludeLabels: feature-request|testplan-item configPath: classifier blobContainerName: vscode-issue-classifier - blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} - name: Set up Python 3.7 uses: actions/setup-python@v5 with: diff --git a/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml index e21061549d99e..e663372fad07d 100644 --- a/.github/workflows/deep-classifier-scraper.yml +++ b/.github/workflows/deep-classifier-scraper.yml @@ -1,4 +1,9 @@ name: "Deep Classifier: Scraper" + +permissions: + id-token: write + contents: read + on: schedule: - cron: 0 0 15 * * # 15th of the month @@ -9,7 +14,13 @@ on: jobs: main: runs-on: ubuntu-latest + environment: main steps: + - uses: azure/login@v2 + with: + client-id: ${{ vars.AZURE_CLIENT_ID }} + tenant-id: ${{ vars.AZURE_TENANT_ID }} + allow-no-subscriptions: true - name: Checkout Actions uses: actions/checkout@v4 with: @@ -25,6 +36,4 @@ jobs: uses: ./actions/classifier-deep/train/fetch-issues with: blobContainerName: vscode-issue-classifier - blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} diff --git a/.github/workflows/deep-classifier-unassign-monitor.yml b/.github/workflows/deep-classifier-unassign-monitor.yml index d0e14e936c20f..52ac0d3ddcd9a 100644 --- a/.github/workflows/deep-classifier-unassign-monitor.yml +++ b/.github/workflows/deep-classifier-unassign-monitor.yml @@ -21,4 +21,3 @@ jobs: with: botName: VSCodeTriageBot token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} From 2f0b553214a7bb5fd79b4fb06ba8efe21e421275 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Wed, 3 Jul 2024 15:34:31 -0700 Subject: [PATCH 631/755] Iron out event firing by leveraging observables (#219897) I think this reduces redundant event firing by quite a bit. I hope @hediet would be proud --- .../platform/quickinput/browser/quickInput.ts | 3 - .../browser/quickInputController.ts | 1 - .../quickinput/browser/quickInputTree.ts | 103 ++++++++---------- 3 files changed, 43 insertions(+), 64 deletions(-) diff --git a/src/vs/platform/quickinput/browser/quickInput.ts b/src/vs/platform/quickinput/browser/quickInput.ts index 4c6dfbe6b7d6d..74414a631a107 100644 --- a/src/vs/platform/quickinput/browser/quickInput.ts +++ b/src/vs/platform/quickinput/browser/quickInput.ts @@ -1036,9 +1036,6 @@ export class QuickPick extends QuickInput implements I // We want focus to exist in the list if there are items so that space can be used to toggle this.ui.list.shouldLoop = !this.canSelectMany; this.ui.list.filter(this.filterValue(this.ui.inputBox.value)); - this.ui.checkAll.checked = this.ui.list.getAllVisibleChecked(); - this.ui.visibleCount.setCount(this.ui.list.getVisibleCount()); - this.ui.count.setCount(this.ui.list.getCheckedCount()); switch (this._itemActivation) { case ItemActivation.NONE: this._itemActivation = ItemActivation.FIRST; // only valid once, then unset diff --git a/src/vs/platform/quickinput/browser/quickInputController.ts b/src/vs/platform/quickinput/browser/quickInputController.ts index 626b74e8fa520..41fad6343ee57 100644 --- a/src/vs/platform/quickinput/browser/quickInputController.ts +++ b/src/vs/platform/quickinput/browser/quickInputController.ts @@ -580,7 +580,6 @@ export class QuickInputController extends Disposable { ui.count.setCount(0); dom.reset(ui.message); ui.progressBar.stop(); - ui.list.setElements([]); ui.list.matchOnDescription = false; ui.list.matchOnDetail = false; ui.list.matchOnLabel = true; diff --git a/src/vs/platform/quickinput/browser/quickInputTree.ts b/src/vs/platform/quickinput/browser/quickInputTree.ts index c65ad7ef4d750..8d1a046678bde 100644 --- a/src/vs/platform/quickinput/browser/quickInputTree.ts +++ b/src/vs/platform/quickinput/browser/quickInputTree.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { Emitter, Event, IValueWithChangeEvent } from 'vs/base/common/event'; +import { Emitter, Event, EventBufferer, IValueWithChangeEvent } from 'vs/base/common/event'; import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IObjectTreeElement, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; @@ -39,6 +39,8 @@ import { isCancellationError } from 'vs/base/common/errors'; import type { IHoverWidget, IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { QuickPickFocus } from '../common/quickInput'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; +import { observableValue, observableValueOpts } from 'vs/base/common/observable'; +import { equals } from 'vs/base/common/arrays'; const $ = dom.$; @@ -668,17 +670,17 @@ export class QuickInputTree extends Disposable { */ readonly onLeave: Event = this._onLeave.event; - private readonly _onChangedAllVisibleChecked = new Emitter(); - onChangedAllVisibleChecked: Event = this._onChangedAllVisibleChecked.event; + private readonly _visibleCountObservable = observableValue('VisibleCount', 0); + onChangedVisibleCount: Event = Event.fromObservable(this._visibleCountObservable, this._store); - private readonly _onChangedCheckedCount = new Emitter(); - onChangedCheckedCount: Event = this._onChangedCheckedCount.event; + private readonly _allVisibleCheckedObservable = observableValue('AllVisibleChecked', false); + onChangedAllVisibleChecked: Event = Event.fromObservable(this._allVisibleCheckedObservable, this._store); - private readonly _onChangedVisibleCount = new Emitter(); - onChangedVisibleCount: Event = this._onChangedVisibleCount.event; + private readonly _checkedCountObservable = observableValue('CheckedCount', 0); + onChangedCheckedCount: Event = Event.fromObservable(this._checkedCountObservable, this._store); - private readonly _onChangedCheckedElements = new Emitter(); - onChangedCheckedElements: Event = this._onChangedCheckedElements.event; + private readonly _checkedElementsObservable = observableValueOpts({ equalsFn: equals }, new Array()); + onChangedCheckedElements: Event = Event.fromObservable(this._checkedElementsObservable, this._store); private readonly _onButtonTriggered = new Emitter>(); onButtonTriggered = this._onButtonTriggered.event; @@ -686,21 +688,21 @@ export class QuickInputTree extends Disposable { private readonly _onSeparatorButtonTriggered = new Emitter(); onSeparatorButtonTriggered = this._onSeparatorButtonTriggered.event; + private readonly _elementChecked = new Emitter<{ element: IQuickPickElement; checked: boolean }>(); + private readonly _elementCheckedEventBufferer = new EventBufferer(); + + private _hasCheckboxes = false; + private readonly _container: HTMLElement; private readonly _tree: WorkbenchObjectTree; private readonly _separatorRenderer: QuickPickSeparatorElementRenderer; private readonly _itemRenderer: QuickPickItemElementRenderer; - private readonly _elementChecked = new Emitter<{ element: IQuickPickElement; checked: boolean }>(); private _inputElements = new Array(); private _elementTree = new Array(); private _itemElements = new Array(); // Elements that apply to the current set of elements private readonly _elementDisposable = this._register(new DisposableStore()); private _lastHover: IHoverWidget | undefined; - // This is used to prevent setting the checked state of a single element from firing the checked events - // so that we can batch them together. This can probably be improved by handling events differently, - // but this works for now. An observable would probably be ideal for this. - private _shouldFireCheckedEvents = true; constructor( private parent: HTMLElement, @@ -842,6 +844,7 @@ export class QuickInputTree extends Disposable { this._registerOnKeyDown(); this._registerOnContainerClick(); this._registerOnMouseMiddleClick(); + this._registerOnTreeModelChanged(); this._registerOnElementChecked(); this._registerOnContextMenu(); this._registerHoverListeners(); @@ -879,8 +882,19 @@ export class QuickInputTree extends Disposable { })); } + private _registerOnTreeModelChanged() { + this._register(this._tree.onDidChangeModel(() => { + const visibleCount = this._itemElements.filter(e => !e.hidden).length; + this._visibleCountObservable.set(visibleCount, undefined); + if (this._hasCheckboxes) { + this._fireCheckedEvents(); + } + })); + } + private _registerOnElementChecked() { - this._register(this._elementChecked.event(_ => this._fireCheckedEvents())); + // Only fire the last event when buffered + this._register(this._elementCheckedEventBufferer.wrapEvent(this._elementChecked.event, (_, e) => e)(_ => this._fireCheckedEvents())); } private _registerOnContextMenu() { @@ -1015,37 +1029,21 @@ export class QuickInputTree extends Disposable { //#region public methods - getAllVisibleChecked() { - return this._allVisibleChecked(this._itemElements, false); - } - - getCheckedCount() { - return this._itemElements.filter(element => element.checked).length; - } - - getVisibleCount() { - return this._itemElements.filter(e => !e.hidden).length; - } - setAllVisibleChecked(checked: boolean) { - try { - this._shouldFireCheckedEvents = false; + this._elementCheckedEventBufferer.bufferEvents(() => { this._itemElements.forEach(element => { if (!element.hidden && !element.checkboxDisabled) { - // Would fire an event if we didn't have the flag set + // Would fire an event if we didn't beffer the events element.checked = checked; } }); - } finally { - this._shouldFireCheckedEvents = true; - this._fireCheckedEvents(); - } + }); } setElements(inputElements: QuickPickItem[]): void { this._elementDisposable.clear(); this._inputElements = inputElements; - const hasCheckbox = this.parent.classList.contains('show-checkboxes'); + this._hasCheckboxes = this.parent.classList.contains('show-checkboxes'); let currentSeparatorElement: QuickPickSeparatorElement | undefined; this._itemElements = new Array(); this._elementTree = inputElements.reduce((result, item, index) => { @@ -1071,7 +1069,7 @@ export class QuickInputTree extends Disposable { } const qpi = new QuickPickItemElement( index, - hasCheckbox, + this._hasCheckboxes, (event: IQuickPickItemButtonEvent) => this.fireButtonTriggered(event), this._elementChecked, item, @@ -1115,7 +1113,6 @@ export class QuickInputTree extends Disposable { } } this._tree.setChildren(null, elements); - this._onChangedVisibleCount.fire(visibleCount); // Accessibility hack, unfortunately on next tick // https://github.com/microsoft/vscode/issues/211976 @@ -1177,20 +1174,16 @@ export class QuickInputTree extends Disposable { } setCheckedElements(items: IQuickPickItem[]) { - try { - this._shouldFireCheckedEvents = false; + this._elementCheckedEventBufferer.bufferEvents(() => { const checked = new Set(); for (const item of items) { checked.add(item); } for (const element of this._itemElements) { - // Would fire an event if we didn't have the flag set + // Would fire an event if we didn't beffer the events element.checked = checked.has(element.item); } - } finally { - this._shouldFireCheckedEvents = true; - this._fireCheckedEvents(); - } + }); } focus(what: QuickPickFocus): void { @@ -1500,16 +1493,11 @@ export class QuickInputTree extends Disposable { } this._tree.setChildren(null, elements); this._tree.layout(); - - this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()); - this._onChangedVisibleCount.fire(shownElements.length); - return true; } toggleCheckbox() { - try { - this._shouldFireCheckedEvents = false; + this._elementCheckedEventBufferer.bufferEvents(() => { const elements = this._tree.getFocus().filter((e): e is QuickPickItemElement => e instanceof QuickPickItemElement); const allChecked = this._allVisibleChecked(elements); for (const element of elements) { @@ -1518,10 +1506,7 @@ export class QuickInputTree extends Disposable { element.checked = !allChecked; } } - } finally { - this._shouldFireCheckedEvents = true; - this._fireCheckedEvents(); - } + }); } display(display: boolean) { @@ -1581,12 +1566,10 @@ export class QuickInputTree extends Disposable { } private _fireCheckedEvents() { - if (!this._shouldFireCheckedEvents) { - return; - } - this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()); - this._onChangedCheckedCount.fire(this.getCheckedCount()); - this._onChangedCheckedElements.fire(this.getCheckedElements()); + this._allVisibleCheckedObservable.set(this._allVisibleChecked(this._itemElements, false), undefined); + const checkedCount = this._itemElements.filter(element => element.checked).length; + this._checkedCountObservable.set(checkedCount, undefined); + this._checkedElementsObservable.set(this.getCheckedElements(), undefined); } private fireButtonTriggered(event: IQuickPickItemButtonEvent) { From 9469c82f9fecf51745902bba3af45fe09fe80c62 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2024 16:12:04 -0700 Subject: [PATCH 632/755] Don't allow insiders users to report issues with TS plugins enabled (#219902) Seeing far too many users not reading the warning/issue text before reporting issues. These reports are rarely actionable --- .../typescript-language-features/src/typescriptServiceClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index da6408b827bee..2435f7725a907 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -673,7 +673,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType if (!this._isPromptingAfterCrash) { if (this.pluginManager.plugins.length) { prompt = vscode.window.showWarningMessage( - vscode.l10n.t("The JS/TS language service crashed.\nThis may be caused by a plugin contributed by one of these extensions: {0}.\nPlease try disabling these extensions before filing an issue against VS Code.", pluginExtensionList), reportIssueItem); + vscode.l10n.t("The JS/TS language service crashed.\nThis may be caused by a plugin contributed by one of these extensions: {0}.\nPlease try disabling these extensions before filing an issue against VS Code.", pluginExtensionList)); } else { prompt = vscode.window.showWarningMessage( vscode.l10n.t("The JS/TS language service crashed."), From 422b24d7aa4c97a8312822b32af008387dad45e0 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jul 2024 16:17:56 -0700 Subject: [PATCH 633/755] Fix hover over non-ascii variable names (#219903) Fix #216610 --- src/vs/workbench/contrib/debug/common/debugUtils.ts | 2 +- src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/common/debugUtils.ts b/src/vs/workbench/contrib/debug/common/debugUtils.ts index acf1e4678177e..1b193bd9d5d3f 100644 --- a/src/vs/workbench/contrib/debug/common/debugUtils.ts +++ b/src/vs/workbench/contrib/debug/common/debugUtils.ts @@ -102,7 +102,7 @@ export function getExactExpressionStartAndEnd(lineContent: string, looseStart: n // If there are non-word characters after the cursor, we want to truncate the expression then. // For example in expression 'a.b.c.d', if the focus was under 'b', 'a.b' would be evaluated. if (matchingExpression) { - const subExpression: RegExp = /\w+/g; + const subExpression: RegExp = /(\w|\p{L})+/gu; let subExpressionResult: RegExpExecArray | null = null; while (subExpressionResult = subExpression.exec(matchingExpression)) { const subEnd = subExpressionResult.index + 1 + startOffset + subExpressionResult[0].length; diff --git a/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts index c57bb374b3d57..d6b033ff16f67 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugUtils.test.ts @@ -41,6 +41,9 @@ suite('Debug - Utils', () => { assert.deepStrictEqual(getExactExpressionStartAndEnd('var t = a.b;c.d.name', 16, 20), { start: 13, end: 20 }); assert.deepStrictEqual(getExactExpressionStartAndEnd('var t = a.b.c-d.name', 16, 20), { start: 15, end: 20 }); + + assert.deepStrictEqual(getExactExpressionStartAndEnd('var aøñéå文 = a.b.c-d.name', 5, 5), { start: 5, end: 10 }); + assert.deepStrictEqual(getExactExpressionStartAndEnd('aøñéå文.aøñéå文.aøñéå文', 9, 9), { start: 1, end: 13 }); }); test('config presentation', () => { From ee8937a60487747e544cd0f3af58384376b6a07c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 Jul 2024 17:02:21 -0700 Subject: [PATCH 634/755] Rename snippet placeholder (#219904) Fixes #214760 --- extensions/javascript/snippets/javascript.code-snippets | 2 +- .../typescript-basics/snippets/typescript.code-snippets | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/javascript/snippets/javascript.code-snippets b/extensions/javascript/snippets/javascript.code-snippets index 9448fd140d930..ddf9a13b731d0 100644 --- a/extensions/javascript/snippets/javascript.code-snippets +++ b/extensions/javascript/snippets/javascript.code-snippets @@ -46,7 +46,7 @@ "For-Of Loop": { "prefix": "forof", "body": [ - "for (const ${1:iterator} of ${2:object}) {", + "for (const ${1:element} of ${2:object}) {", "\t$TM_SELECTED_TEXT$0", "}" ], diff --git a/extensions/typescript-basics/snippets/typescript.code-snippets b/extensions/typescript-basics/snippets/typescript.code-snippets index 35b2aa1711cf8..9d6dadcc2e6be 100644 --- a/extensions/typescript-basics/snippets/typescript.code-snippets +++ b/extensions/typescript-basics/snippets/typescript.code-snippets @@ -163,7 +163,7 @@ "For-Of Loop": { "prefix": "forof", "body": [ - "for (const ${1:iterator} of ${2:object}) {", + "for (const ${1:element} of ${2:object}) {", "\t$TM_SELECTED_TEXT$0", "}" ], @@ -172,7 +172,7 @@ "For-Await-Of Loop": { "prefix": "forawaitof", "body": [ - "for await (const ${1:iterator} of ${2:object}) {", + "for await (const ${1:element} of ${2:object}) {", "\t$TM_SELECTED_TEXT$0", "}" ], From 34f8428e4b0e3bf822f4b9e8b4e3e0cab69ef2ce Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Wed, 3 Jul 2024 20:33:11 -0700 Subject: [PATCH 635/755] Misc cleanup in QuickInputTree (#219914) * dispose some Event.maps * remove a bunch of dead code (functions that are no longer used) * stylistic changes * have `QuickPickFocus.Second`, `QuickPickFocus.Last`, `QuickPickFocus.NextSeparator` use the tree itself instead of `this._itemElements` --- .../browser/quickInputController.ts | 6 +- .../quickinput/browser/quickInputTree.ts | 154 +++++++----------- 2 files changed, 66 insertions(+), 94 deletions(-) diff --git a/src/vs/platform/quickinput/browser/quickInputController.ts b/src/vs/platform/quickinput/browser/quickInputController.ts index 41fad6343ee57..8999c5e84ab8a 100644 --- a/src/vs/platform/quickinput/browser/quickInputController.ts +++ b/src/vs/platform/quickinput/browser/quickInputController.ts @@ -275,7 +275,7 @@ export class QuickInputController extends Disposable { } else { selectors.push('input[type=text]'); } - if (this.getUI().list.isDisplayed()) { + if (this.getUI().list.displayed) { selectors.push('.monaco-list'); } // focus links if there are any @@ -614,7 +614,7 @@ export class QuickInputController extends Disposable { ui.customButtonContainer.style.display = visibilities.customButton ? '' : 'none'; ui.message.style.display = visibilities.message ? '' : 'none'; ui.progressBar.getContainer().style.display = visibilities.progressBar ? '' : 'none'; - ui.list.display(!!visibilities.list); + ui.list.displayed = !!visibilities.list; ui.container.classList.toggle('show-checkboxes', !!visibilities.checkBox); ui.container.classList.toggle('hidden-input', !visibilities.inputBox && !visibilities.description); this.updateLayout(); // TODO @@ -683,7 +683,7 @@ export class QuickInputController extends Disposable { } navigate(next: boolean, quickNavigate?: IQuickNavigateConfiguration) { - if (this.isVisible() && this.getUI().list.isDisplayed()) { + if (this.isVisible() && this.getUI().list.displayed) { this.getUI().list.focus(next ? QuickPickFocus.Next : QuickPickFocus.Previous); if (quickNavigate && this.controller instanceof QuickPick) { this.controller.quickNavigate = quickNavigate; diff --git a/src/vs/platform/quickinput/browser/quickInputTree.ts b/src/vs/platform/quickinput/browser/quickInputTree.ts index 8d1a046678bde..83976c1506535 100644 --- a/src/vs/platform/quickinput/browser/quickInputTree.ts +++ b/src/vs/platform/quickinput/browser/quickInputTree.ts @@ -658,6 +658,8 @@ class QuickPickSeparatorElementRenderer extends BaseQuickInputListRenderer(); /** * Event that is fired when the tree receives a keydown. @@ -691,6 +693,8 @@ export class QuickInputTree extends Disposable { private readonly _elementChecked = new Emitter<{ element: IQuickPickElement; checked: boolean }>(); private readonly _elementCheckedEventBufferer = new EventBufferer(); + //#endregion + private _hasCheckboxes = false; private readonly _container: HTMLElement; @@ -745,7 +749,8 @@ export class QuickInputTree extends Disposable { get onDidChangeFocus() { return Event.map( this._tree.onDidChangeFocus, - e => e.elements.filter((e): e is QuickPickItemElement => e instanceof QuickPickItemElement).map(e => e.item) + e => e.elements.filter((e): e is QuickPickItemElement => e instanceof QuickPickItemElement).map(e => e.item), + this._store ); } @@ -756,10 +761,19 @@ export class QuickInputTree extends Disposable { e => ({ items: e.elements.filter((e): e is QuickPickItemElement => e instanceof QuickPickItemElement).map(e => e.item), event: e.browserEvent - }) + }), + this._store ); } + get displayed() { + return this._container.style.display !== 'none'; + } + + set displayed(value: boolean) { + this._container.style.display = value ? '' : 'none'; + } + get scrollTop() { return this._tree.scrollTop; } @@ -887,14 +901,14 @@ export class QuickInputTree extends Disposable { const visibleCount = this._itemElements.filter(e => !e.hidden).length; this._visibleCountObservable.set(visibleCount, undefined); if (this._hasCheckboxes) { - this._fireCheckedEvents(); + this._updateCheckedObservables(); } })); } private _registerOnElementChecked() { // Only fire the last event when buffered - this._register(this._elementCheckedEventBufferer.wrapEvent(this._elementChecked.event, (_, e) => e)(_ => this._fireCheckedEvents())); + this._register(this._elementCheckedEventBufferer.wrapEvent(this._elementChecked.event, (_, e) => e)(_ => this._updateCheckedObservables())); } private _registerOnContextMenu() { @@ -1055,7 +1069,7 @@ export class QuickInputTree extends Disposable { } currentSeparatorElement = new QuickPickSeparatorElement( index, - (event: IQuickPickSeparatorButtonEvent) => this.fireSeparatorButtonTriggered(event), + e => this._onSeparatorButtonTriggered.fire(e), item ); element = currentSeparatorElement; @@ -1070,7 +1084,7 @@ export class QuickInputTree extends Disposable { const qpi = new QuickPickItemElement( index, this._hasCheckboxes, - (event: IQuickPickItemButtonEvent) => this.fireButtonTriggered(event), + e => this._onButtonTriggered.fire(e), this._elementChecked, item, separator, @@ -1088,31 +1102,7 @@ export class QuickInputTree extends Disposable { return result; }, new Array()); - const elements = new Array>(); - let visibleCount = 0; - for (const element of this._elementTree) { - if (element instanceof QuickPickSeparatorElement) { - elements.push({ - element, - collapsible: false, - collapsed: false, - children: element.children.map(e => ({ - element: e, - collapsible: false, - collapsed: false, - })), - }); - visibleCount += element.children.length + 1; // +1 for the separator itself; - } else { - elements.push({ - element, - collapsible: false, - collapsed: false, - }); - visibleCount++; - } - } - this._tree.setChildren(null, elements); + this._setElementsToTree(this._elementTree); // Accessibility hack, unfortunately on next tick // https://github.com/microsoft/vscode/issues/211976 @@ -1129,17 +1119,6 @@ export class QuickInputTree extends Disposable { } } - getElementsCount(): number { - return this._inputElements.length; - } - - getFocusedElements() { - return this._tree.getFocus() - .filter((e): e is IQuickPickElement => !!e) - .map(e => e.item) - .filter((e): e is IQuickPickItem => !!e); - } - setFocusedElements(items: IQuickPickItem[]) { const elements = items.map(item => this._itemElements.find(e => e.item === item)) .filter((e): e is QuickPickItemElement => !!e); @@ -1156,12 +1135,6 @@ export class QuickInputTree extends Disposable { return this._tree.getHTMLElement().getAttribute('aria-activedescendant'); } - getSelectedElements() { - return this._tree.getSelection() - .filter((e): e is IQuickPickElement => !!e && !!(e as QuickPickItemElement).item) - .map(e => e.item); - } - setSelectedElements(items: IQuickPickItem[]) { const elements = items.map(item => this._itemElements.find(e => e.item === item)) .filter((e): e is QuickPickItemElement => !!e); @@ -1200,13 +1173,24 @@ export class QuickInputTree extends Disposable { this._tree.scrollTop = 0; this._tree.focusFirst(undefined, (e) => e.element instanceof QuickPickItemElement); break; - case QuickPickFocus.Second: + case QuickPickFocus.Second: { this._tree.scrollTop = 0; - this._tree.setFocus([this._itemElements[1]]); + let isSecondItem = false; + this._tree.focusFirst(undefined, (e) => { + if (!(e.element instanceof QuickPickItemElement)) { + return false; + } + if (isSecondItem) { + return true; + } + isSecondItem = !isSecondItem; + return false; + }); break; + } case QuickPickFocus.Last: this._tree.scrollTop = this._tree.scrollHeight; - this._tree.setFocus([this._itemElements[this._itemElements.length - 1]]); + this._tree.focusLast(undefined, (e) => e.element instanceof QuickPickItemElement); break; case QuickPickFocus.Next: { const prevFocus = this._tree.getFocus(); @@ -1308,7 +1292,7 @@ export class QuickInputTree extends Disposable { // If we didn't move, then we should just move to the end // of the list. this._tree.scrollTop = this._tree.scrollHeight; - this._tree.setFocus([this._itemElements[this._itemElements.length - 1]]); + this._tree.focusLast(undefined, (e) => e.element instanceof QuickPickItemElement); } break; } @@ -1470,28 +1454,7 @@ export class QuickInputTree extends Disposable { return result; }, new Array()); - const elements = new Array>(); - for (const element of finalElements) { - if (element instanceof QuickPickSeparatorElement) { - elements.push({ - element, - collapsible: false, - collapsed: false, - children: element.children.map(e => ({ - element: e, - collapsible: false, - collapsed: false, - })), - }); - } else { - elements.push({ - element, - collapsible: false, - collapsed: false, - }); - } - } - this._tree.setChildren(null, elements); + this._setElementsToTree(finalElements); this._tree.layout(); return true; } @@ -1509,14 +1472,6 @@ export class QuickInputTree extends Disposable { }); } - display(display: boolean) { - this._container.style.display = display ? '' : 'none'; - } - - isDisplayed() { - return this._container.style.display !== 'none'; - } - style(styles: IListStyles) { this._tree.style(styles); } @@ -1551,6 +1506,31 @@ export class QuickInputTree extends Disposable { //#region private methods + private _setElementsToTree(elements: IQuickPickElement[]) { + const treeElements = new Array>(); + for (const element of elements) { + if (element instanceof QuickPickSeparatorElement) { + treeElements.push({ + element, + collapsible: false, + collapsed: false, + children: element.children.map(e => ({ + element: e, + collapsible: false, + collapsed: false, + })), + }); + } else { + treeElements.push({ + element, + collapsible: false, + collapsed: false, + }); + } + } + this._tree.setChildren(null, treeElements); + } + private _allVisibleChecked(elements: QuickPickItemElement[], whenNoneVisible = true) { for (let i = 0, n = elements.length; i < n; i++) { const element = elements[i]; @@ -1565,21 +1545,13 @@ export class QuickInputTree extends Disposable { return whenNoneVisible; } - private _fireCheckedEvents() { + private _updateCheckedObservables() { this._allVisibleCheckedObservable.set(this._allVisibleChecked(this._itemElements, false), undefined); const checkedCount = this._itemElements.filter(element => element.checked).length; this._checkedCountObservable.set(checkedCount, undefined); this._checkedElementsObservable.set(this.getCheckedElements(), undefined); } - private fireButtonTriggered(event: IQuickPickItemButtonEvent) { - this._onButtonTriggered.fire(event); - } - - private fireSeparatorButtonTriggered(event: IQuickPickSeparatorButtonEvent) { - this._onSeparatorButtonTriggered.fire(event); - } - /** * Disposes of the hover and shows a new one for the given index if it has a tooltip. * @param element The element to show the hover for From 82c54248fd1373da9f4b4c3606d9778f0d08fc1a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 4 Jul 2024 07:59:10 +0200 Subject: [PATCH 636/755] perf - inline `package.json` and `product.json` (#219841) --- build/darwin/create-universal-app.js | 1 - build/darwin/create-universal-app.ts | 1 - build/gulpfile.reh.js | 41 ++++++++++++++------ build/gulpfile.vscode.js | 43 ++++++++++++++------- build/gulpfile.vscode.web.js | 6 +-- build/lib/date.js | 24 ++++++++++++ build/lib/date.ts | 25 +++++++++++++ build/lib/inlineMeta.js | 46 +++++++++++++++++++++++ build/lib/inlineMeta.ts | 56 ++++++++++++++++++++++++++++ src/bootstrap-amd.js | 7 ++-- src/bootstrap-meta.js | 28 ++++++++++++++ src/cli.js | 8 +--- src/main.js | 5 +-- src/server-cli.js | 8 +--- src/server-main.js | 5 +-- 15 files changed, 248 insertions(+), 56 deletions(-) create mode 100644 build/lib/date.js create mode 100644 build/lib/date.ts create mode 100644 build/lib/inlineMeta.js create mode 100644 build/lib/inlineMeta.ts create mode 100644 src/bootstrap-meta.js diff --git a/build/darwin/create-universal-app.js b/build/darwin/create-universal-app.js index 7da8e55c9087b..85d2727386198 100644 --- a/build/darwin/create-universal-app.js +++ b/build/darwin/create-universal-app.js @@ -28,7 +28,6 @@ async function main(buildDir) { x64AsarPath, arm64AsarPath, filesToSkip: [ - 'product.json', 'Credits.rtf', 'CodeResources', 'fsevents.node', diff --git a/build/darwin/create-universal-app.ts b/build/darwin/create-universal-app.ts index ffba8952cd8e9..04eb3a11e20a6 100644 --- a/build/darwin/create-universal-app.ts +++ b/build/darwin/create-universal-app.ts @@ -32,7 +32,6 @@ async function main(buildDir?: string) { x64AsarPath, arm64AsarPath, filesToSkip: [ - 'product.json', 'Credits.rtf', 'CodeResources', 'fsevents.node', diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index b6030c6102e97..92d41b18485a9 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -12,11 +12,13 @@ const util = require('./lib/util'); const { getVersion } = require('./lib/getVersion'); const task = require('./lib/task'); const optimize = require('./lib/optimize'); +const { inlineMeta } = require('./lib/inlineMeta'); const product = require('../product.json'); const rename = require('gulp-rename'); const replace = require('gulp-replace'); const filter = require('gulp-filter'); const { getProductionDependencies } = require('./lib/dependencies'); +const { date } = require('./lib/date'); const vfs = require('vinyl-fs'); const packageJson = require('../package.json'); const flatmap = require('gulp-flatmap'); @@ -115,6 +117,12 @@ const serverWithWebEntryPoints = [ ...vscodeWebEntryPoints ]; +const commonJSEntryPoints = [ + 'out-build/server-main.js', + 'out-build/server-cli.js', + 'out-build/bootstrap-fork.js', +]; + function getNodeVersion() { const yarnrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8'); const nodeVersion = /^target "(.*)"$/m.exec(yarnrc)[1]; @@ -180,7 +188,6 @@ if (defaultNodeTask) { function nodejs(platform, arch) { const { fetchUrls, fetchGithub } = require('./lib/fetch'); const untar = require('gulp-untar'); - const crypto = require('crypto'); if (arch === 'armhf') { arch = 'armv7l'; @@ -286,13 +293,22 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa } const name = product.nameShort; - const packageJsonStream = gulp.src(['remote/package.json'], { base: 'remote' }) - .pipe(json({ name, version, dependencies: undefined, optionalDependencies: undefined })); - const date = new Date().toISOString(); + let packageJsonContents; + const packageJsonStream = gulp.src(['remote/package.json'], { base: 'remote' }) + .pipe(json({ name, version, dependencies: undefined, optionalDependencies: undefined })) + .pipe(es.through(function (file) { + packageJsonContents = file.contents.toString(); + this.emit('data', file); + })); + let productJsonContents; const productJsonStream = gulp.src(['product.json'], { base: '.' }) - .pipe(json({ commit, date, version })); + .pipe(json({ commit, date, version })) + .pipe(es.through(function (file) { + productJsonContents = file.contents.toString(); + this.emit('data', file); + })); const license = gulp.src(['remote/LICENSE'], { base: 'remote', allowEmpty: true }); @@ -385,6 +401,12 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa ); } + result = inlineMeta(result, { + targetPaths: commonJSEntryPoints, + packageJsonFn: () => packageJsonContents, + productJsonFn: () => productJsonContents + }); + return result.pipe(vfs.dest(destination)); }; } @@ -416,17 +438,14 @@ function tweakProductForServerWeb(product) { }, commonJS: { src: 'out-build', - entryPoints: [ - 'out-build/server-main.js', - 'out-build/server-cli.js', - 'out-build/bootstrap-fork.js', - ], + entryPoints: commonJSEntryPoints, platform: 'node', external: [ 'minimist', - // TODO: we cannot inline `product.json` because + // We cannot inline `product.json` from here because // it is being changed during build time at a later // point in time (such as `checksums`) + // We have a manual step to inline these later. '../product.json', '../package.json' ] diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 5861cb5067ac0..8923954e12eb4 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -6,10 +6,7 @@ 'use strict'; const gulp = require('gulp'); -const merge = require('gulp-merge-json'); const fs = require('fs'); -const os = require('os'); -const cp = require('child_process'); const path = require('path'); const es = require('event-stream'); const vfs = require('vinyl-fs'); @@ -18,9 +15,11 @@ const replace = require('gulp-replace'); const filter = require('gulp-filter'); const util = require('./lib/util'); const { getVersion } = require('./lib/getVersion'); +const { date } = require('./lib/date'); const task = require('./lib/task'); const buildfile = require('../src/buildfile'); const optimize = require('./lib/optimize'); +const { inlineMeta } = require('./lib/inlineMeta'); const root = path.dirname(__dirname); const commit = getVersion(root); const packageJson = require('../package.json'); @@ -85,6 +84,12 @@ const windowBootstrapFiles = [ 'out-build/bootstrap-window.js' ]; +const commonJSEntryPoints = [ + 'out-build/main.js', + 'out-build/cli.js', + 'out-build/bootstrap-fork.js' +]; + const optimizeVSCodeTask = task.define('optimize-vscode', task.series( util.rimraf('out-vscode'), // Optimize: bundles source files automatically based on @@ -103,19 +108,16 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( }, commonJS: { src: 'out-build', - entryPoints: [ - 'out-build/main.js', - 'out-build/cli.js', - 'out-build/bootstrap-fork.js', - ], + entryPoints: commonJSEntryPoints, platform: 'node', external: [ 'electron', 'minimist', 'original-fs', - // TODO: we cannot inline `product.json` because + // We cannot inline `product.json` from here because // it is being changed during build time at a later // point in time (such as `checksums`) + // We have a manual step to inline these later. '../product.json', '../package.json', ] @@ -247,14 +249,21 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op packageJsonUpdates.desktopName = `${product.applicationName}-url-handler.desktop`; } + let packageJsonContents; const packageJsonStream = gulp.src(['package.json'], { base: '.' }) - .pipe(json(packageJsonUpdates)); - - const date = new Date().toISOString(); - const productJsonUpdate = { commit, date, checksums, version }; + .pipe(json(packageJsonUpdates)) + .pipe(es.through(function (file) { + packageJsonContents = file.contents.toString(); + this.emit('data', file); + })); + let productJsonContents; const productJsonStream = gulp.src(['product.json'], { base: '.' }) - .pipe(json(productJsonUpdate)); + .pipe(json({ commit, date, checksums, version })) + .pipe(es.through(function (file) { + productJsonContents = file.contents.toString(); + this.emit('data', file); + })); const license = gulp.src([product.licenseFileName, 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.', allowEmpty: true }); @@ -387,6 +396,12 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op .pipe(rename('bin/' + product.applicationName))); } + result = inlineMeta(result, { + targetPaths: commonJSEntryPoints, + packageJsonFn: () => packageJsonContents, + productJsonFn: () => productJsonContents + }); + return result.pipe(vfs.dest(destination)); }; } diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 4480f5e1046e7..fe5adb45daf81 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -12,12 +12,12 @@ const util = require('./lib/util'); const { getVersion } = require('./lib/getVersion'); const task = require('./lib/task'); const optimize = require('./lib/optimize'); +const { date } = require('./lib/date'); const product = require('../product.json'); const rename = require('gulp-rename'); const filter = require('gulp-filter'); const { getProductionDependencies } = require('./lib/dependencies'); const vfs = require('vinyl-fs'); -const replace = require('gulp-replace'); const packageJson = require('../package.json'); const { compileBuildTask } = require('./gulpfile.compile'); const extensions = require('./lib/extensions'); @@ -76,8 +76,6 @@ const vscodeWebEntryPoints = [ ].flat(); exports.vscodeWebEntryPoints = vscodeWebEntryPoints; -const buildDate = new Date().toISOString(); - /** * @param {object} product The parsed product.json file contents */ @@ -93,7 +91,7 @@ const createVSCodeWebProductConfigurationPatcher = (product) => { ...product, version, commit, - date: buildDate + date }); return content.replace('/*BUILD->INSERT_PRODUCT_CONFIGURATION*/', () => productConfiguration.substr(1, productConfiguration.length - 2) /* without { and }*/); } diff --git a/build/lib/date.js b/build/lib/date.js new file mode 100644 index 0000000000000..a472e67eed409 --- /dev/null +++ b/build/lib/date.js @@ -0,0 +1,24 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.date = void 0; +function getRoundedBuildDate() { + const now = new Date(); + const minutes = now.getMinutes(); + if (minutes >= 30) { + now.setHours(now.getHours() + 1); + } + now.setMinutes(0, 0, 0); + return now; +} +/** + * An attempt to produce a stable date for the build that can be + * used across processes and build steps that run in parallel almost + * at the same time. The current time is rounded up or down to the + * closest hour. + */ +exports.date = getRoundedBuildDate(); +//# sourceMappingURL=date.js.map \ No newline at end of file diff --git a/build/lib/date.ts b/build/lib/date.ts new file mode 100644 index 0000000000000..d1f1601e1c901 --- /dev/null +++ b/build/lib/date.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +function getRoundedBuildDate() { + const now = new Date(); + + const minutes = now.getMinutes(); + if (minutes >= 30) { + now.setHours(now.getHours() + 1); + } + + now.setMinutes(0, 0, 0); + + return now; +} + +/** + * An attempt to produce a stable date for the build that can be + * used across processes and build steps that run in parallel almost + * at the same time. The current time is rounded up or down to the + * closest hour. + */ +export const date = getRoundedBuildDate(); diff --git a/build/lib/inlineMeta.js b/build/lib/inlineMeta.js new file mode 100644 index 0000000000000..adcbfa9587e5c --- /dev/null +++ b/build/lib/inlineMeta.js @@ -0,0 +1,46 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.inlineMeta = inlineMeta; +const es = require("event-stream"); +const path_1 = require("path"); +const packageJsonMarkerId = 'BUILD_INSERT_PACKAGE_CONFIGURATION'; +const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION'; +function inlineMeta(result, ctx) { + return result.pipe(es.through(function (file) { + if (matchesFile(file, ctx)) { + let content = file.contents.toString(); + let markerFound = false; + const packageMarker = `${packageJsonMarkerId}:"${packageJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) + if (content.includes(packageMarker)) { + content = content.replace(packageMarker, JSON.stringify(JSON.parse(ctx.packageJsonFn())).slice(1, -1) /* trim braces */); + markerFound = true; + } + const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) + if (content.includes(productMarker)) { + content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */); + markerFound = true; + } + if (markerFound) { + file.contents = Buffer.from(content); + } + else if (content.includes(packageJsonMarkerId) || content.includes(productJsonMarkerId)) { + this.emit('error', new Error(`Unable to inline metadata because expected markers where not found in ${file.basename}.`)); + return; + } + } + this.emit('data', file); + })); +} +function matchesFile(file, ctx) { + for (const targetPath of ctx.targetPaths) { + if (file.basename === (0, path_1.basename)(targetPath)) { // TODO would be nicer to figure out root relative path to not match on false positives + return true; + } + } + return false; +} +//# sourceMappingURL=inlineMeta.js.map \ No newline at end of file diff --git a/build/lib/inlineMeta.ts b/build/lib/inlineMeta.ts new file mode 100644 index 0000000000000..8f4c97d6635c3 --- /dev/null +++ b/build/lib/inlineMeta.ts @@ -0,0 +1,56 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as es from 'event-stream'; +import { basename } from 'path'; +import * as File from 'vinyl'; + +export interface IInlineMetaContext { + readonly targetPaths: string[]; + readonly packageJsonFn: () => string; + readonly productJsonFn: () => string; +} + +const packageJsonMarkerId = 'BUILD_INSERT_PACKAGE_CONFIGURATION'; +const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION'; + +export function inlineMeta(result: NodeJS.ReadWriteStream, ctx: IInlineMetaContext): NodeJS.ReadWriteStream { + return result.pipe(es.through(function (file: File) { + if (matchesFile(file, ctx)) { + let content = file.contents.toString(); + let markerFound = false; + + const packageMarker = `${packageJsonMarkerId}:"${packageJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) + if (content.includes(packageMarker)) { + content = content.replace(packageMarker, JSON.stringify(JSON.parse(ctx.packageJsonFn())).slice(1, -1) /* trim braces */); + markerFound = true; + } + + const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) + if (content.includes(productMarker)) { + content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */); + markerFound = true; + } + + if (markerFound) { + file.contents = Buffer.from(content); + } else if (content.includes(packageJsonMarkerId) || content.includes(productJsonMarkerId)) { + this.emit('error', new Error(`Unable to inline metadata because expected markers where not found in ${file.basename}.`)); + return; + } + } + + this.emit('data', file); + })); +} + +function matchesFile(file: File, ctx: IInlineMetaContext): boolean { + for (const targetPath of ctx.targetPaths) { + if (file.basename === basename(targetPath)) { // TODO would be nicer to figure out root relative path to not match on false positives + return true; + } + } + return false; +} diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index aba8ee48fb696..27d15eb76d579 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -8,6 +8,7 @@ /** * @typedef {import('./vs/nls').INLSConfiguration} INLSConfiguration + * @import { IProductConfiguration } from './vs/base/common/product' */ // Store the node.js require function in a variable @@ -19,8 +20,8 @@ const nodeRequire = require; globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => nodeRequire(String(mod)) }); // VSCODE_GLOBALS: package/product.json -/** @type Record */ -globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); +/** @type Partial */ +globalThis._VSCODE_PRODUCT_JSON = require('./bootstrap-meta').product; if (process.env['VSCODE_DEV']) { // Patch product overrides when running out of sources try { @@ -29,7 +30,7 @@ if (process.env['VSCODE_DEV']) { globalThis._VSCODE_PRODUCT_JSON = Object.assign(globalThis._VSCODE_PRODUCT_JSON, overrides); } catch (error) { /* ignore */ } } -globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); +globalThis._VSCODE_PACKAGE_JSON = require('./bootstrap-meta').pkg; // @ts-ignore const loader = require('./vs/loader'); diff --git a/src/bootstrap-meta.js b/src/bootstrap-meta.js new file mode 100644 index 0000000000000..7924b77eec8ca --- /dev/null +++ b/src/bootstrap-meta.js @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check +'use strict'; + +/** + * @import { IProductConfiguration } from './vs/base/common/product' + */ + +/** @type Partial & { BUILD_INSERT_PRODUCT_CONFIGURATION?: string } */ +let product = { BUILD_INSERT_PRODUCT_CONFIGURATION: 'BUILD_INSERT_PRODUCT_CONFIGURATION' }; // DO NOT MODIFY, PATCHED DURING BUILD +if (product['BUILD_INSERT_PRODUCT_CONFIGURATION']) { + // @ts-ignore + product = require('../product.json'); // Running out of sources +} + +/** @type object & { BUILD_INSERT_PACKAGE_CONFIGURATION?: string } */ +let pkg = { BUILD_INSERT_PACKAGE_CONFIGURATION: 'BUILD_INSERT_PACKAGE_CONFIGURATION' }; // DO NOT MODIFY, PATCHED DURING BUILD +if (pkg['BUILD_INSERT_PACKAGE_CONFIGURATION']) { + // @ts-ignore + pkg = require('../package.json'); // Running out of sources +} + +exports.product = product; +exports.pkg = pkg; diff --git a/src/cli.js b/src/cli.js index 686f7ab80c3bb..8191425eff962 100644 --- a/src/cli.js +++ b/src/cli.js @@ -6,10 +6,6 @@ //@ts-check 'use strict'; -/** - * @import { IProductConfiguration } from './vs/base/common/product' - */ - // Delete `VSCODE_CWD` very early even before // importing bootstrap files. We have seen // reports where `code .` would use the wrong @@ -20,9 +16,7 @@ delete process.env['VSCODE_CWD']; const bootstrap = require('./bootstrap'); const bootstrapNode = require('./bootstrap-node'); -/** @type {Partial} */ -// @ts-ignore -const product = require('../product.json'); +const product = require('./bootstrap-meta').product; const { resolveNLSConfiguration } = require('./vs/base/node/nls'); async function start() { diff --git a/src/main.js b/src/main.js index a0b8f09fff33c..be7cd98afaf8c 100644 --- a/src/main.js +++ b/src/main.js @@ -7,7 +7,6 @@ 'use strict'; /** - * @import { IProductConfiguration } from './vs/base/common/product' * @import { INLSConfiguration } from './vs/nls' * @import { NativeParsedArgs } from './vs/platform/environment/common/argv' */ @@ -23,9 +22,7 @@ const bootstrapNode = require('./bootstrap-node'); const { getUserDataPath } = require('./vs/platform/environment/node/userDataPath'); const { parse } = require('./vs/base/common/jsonc'); const { getUNCHost, addUNCHostToAllowlist } = require('./vs/base/node/unc'); -/** @type {Partial} */ -// @ts-ignore -const product = require('../product.json'); +const product = require('./bootstrap-meta').product; const { app, protocol, crashReporter, Menu } = require('electron'); // Enable portable support diff --git a/src/server-cli.js b/src/server-cli.js index 3479ae3f1d674..aa041a6625178 100644 --- a/src/server-cli.js +++ b/src/server-cli.js @@ -6,14 +6,8 @@ // @ts-check 'use strict'; -/** - * @import { IProductConfiguration } from './vs/base/common/product' - */ - const path = require('path'); -/** @type {Partial} */ -// @ts-ignore -const product = require('../product.json'); +const product = require('./bootstrap-meta').product; const { resolveNLSConfiguration } = require('./vs/base/node/nls'); async function start() { diff --git a/src/server-main.js b/src/server-main.js index 18f700a404fdf..e5a905969623b 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -7,7 +7,6 @@ 'use strict'; /** - * @import { IProductConfiguration } from './vs/base/common/product' * @import { INLSConfiguration } from './vs/nls' */ @@ -17,9 +16,7 @@ const perf = require('./vs/base/common/performance'); const performance = require('perf_hooks').performance; -/** @type {Partial} */ -// @ts-ignore -const product = require('../product.json'); +const product = require('./bootstrap-meta').product; const readline = require('readline'); const http = require('http'); const { resolveNLSConfiguration } = require('./vs/base/node/nls'); From 42f6c855560f4c2c4e0cb2074b51c4223b7be4a3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 4 Jul 2024 08:47:46 +0200 Subject: [PATCH 637/755] web - include `nls.messages.js` in standalone build (#219919) --- build/gulpfile.reh.js | 3 --- build/gulpfile.vscode.web.js | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 92d41b18485a9..07bf9ff825f12 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -78,9 +78,6 @@ const serverWithWebResources = [ // Include all of server... ...serverResources, - // NLS - 'out-build/nls.messages.js', - // ...and all of web ...vscodeWebResourceIncludes ]; diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index fe5adb45daf81..ad01b6cfb42e3 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -38,6 +38,9 @@ const vscodeWebResourceIncludes = [ 'out-build/vs/base/browser/ui/codicons/codicon/**/*.ttf', 'out-build/vs/**/markdown.css', + // NLS + 'out-build/nls.messages.js', + // Webview 'out-build/vs/workbench/contrib/webview/browser/pre/*.js', 'out-build/vs/workbench/contrib/webview/browser/pre/*.html', From d69a8fb36d408b6bd89197668ba3b039d5f9bb91 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 4 Jul 2024 00:12:15 -0700 Subject: [PATCH 638/755] Align JS and TS snippets (#219917) Mostly should be the same with a few small differences --- .../snippets/javascript.code-snippets | 144 +++++++++++++----- .../snippets/typescript.code-snippets | 9 ++ 2 files changed, 112 insertions(+), 41 deletions(-) diff --git a/extensions/javascript/snippets/javascript.code-snippets b/extensions/javascript/snippets/javascript.code-snippets index ddf9a13b731d0..5bf6aa5edeeaa 100644 --- a/extensions/javascript/snippets/javascript.code-snippets +++ b/extensions/javascript/snippets/javascript.code-snippets @@ -1,16 +1,79 @@ { - "define module": { - "prefix": "define", - "body": [ - "define([", - "\t'require',", - "\t'${1:dependency}'", - "], function(require, ${2:factory}) {", - "\t'use strict';", + "Constructor": { + "prefix": "ctor", + "body": [ + "/**", + " *", + " */", + "constructor() {", + "\tsuper();", "\t$0", - "});" + "}" + ], + "description": "Constructor" + }, + "Class Definition": { + "prefix": "class", + "isFileTemplate": true, + "body": [ + "class ${1:name} {", + "\tconstructor(${2:parameters}) {", + "\t\t$0", + "\t}", + "}" + ], + "description": "Class Definition" + }, + "Method Definition": { + "prefix": "method", + "body": [ + "/**", + " * ", + " */", + "${1:name}() {", + "\t$0", + "}" + ], + "description": "Method Definition" + }, + "Import Statement": { + "prefix": "import", + "body": [ + "import { $0 } from \"${1:module}\";" + ], + "description": "Import external module" + }, + "Log to the console": { + "prefix": "log", + "body": [ + "console.log($1);", + "$0" + ], + "description": "Log to the console" + }, + "Log warning to console": { + "prefix": "warn", + "body": [ + "console.warn($1);", + "$0" + ], + "description": "Log warning to the console" + }, + "Log error to console": { + "prefix": "error", + "body": [ + "console.error($1);", + "$0" + ], + "description": "Log error to the console" + }, + "Throw Exception": { + "prefix": "throw", + "body": [ + "throw new Error(\"$1\");", + "$0" ], - "description": "define module" + "description": "Throw Exception" }, "For Loop": { "prefix": "for", @@ -22,20 +85,20 @@ ], "description": "For Loop" }, - "For-Each Loop": { - "prefix": "foreach", + "For-Each Loop using =>": { + "prefix": "foreach =>", "body": [ "${1:array}.forEach(${2:element} => {", "\t$TM_SELECTED_TEXT$0", "});" ], - "description": "For-Each Loop" + "description": "For-Each Loop using =>" }, "For-In Loop": { "prefix": "forin", "body": [ "for (const ${1:key} in ${2:object}) {", - "\tif (Object.hasOwnProperty.call(${2:object}, ${1:key})) {", + "\tif (Object.prototype.hasOwnProperty.call(${2:object}, ${1:key})) {", "\t\tconst ${3:element} = ${2:object}[${1:key}];", "\t\t$TM_SELECTED_TEXT$0", "\t}", @@ -52,6 +115,15 @@ ], "description": "For-Of Loop" }, + "For-Await-Of Loop": { + "prefix": "forawaitof", + "body": [ + "for await (const ${1:element} of ${2:object}) {", + "\t$TM_SELECTED_TEXT$0", + "}" + ], + "description": "For-Await-Of Loop" + }, "Function Statement": { "prefix": "function", "body": [ @@ -149,13 +221,6 @@ ], "description": "Set Interval Function" }, - "Import Statement": { - "prefix": "import", - "body": [ - "import { $0 } from \"${1:module}\";" - ], - "description": "Import external module" - }, "Region Start": { "prefix": "#region", "body": [ @@ -170,34 +235,31 @@ ], "description": "Folding Region End" }, - "Log to the console": { - "prefix": "log", - "body": [ - "console.log($1);" - ], - "description": "Log to the console" - }, - "Log warning to console": { - "prefix": "warn", + "new Promise": { + "prefix": "newpromise", "body": [ - "console.warn($1);" + "new Promise((resolve, reject) => {", + "\t$TM_SELECTED_TEXT$0", + "})" ], - "description": "Log warning to the console" + "description": "Create a new Promise" }, - "Log error to console": { - "prefix": "error", + "Async Function Statement": { + "prefix": "async function", "body": [ - "console.error($1);" + "async function ${1:name}(${2:params}) {", + "\t$TM_SELECTED_TEXT$0", + "}" ], - "description": "Log error to the console" + "description": "Async Function Statement" }, - "new Promise": { - "prefix": "newpromise", + "Async Function Expression": { + "prefix": "async arrow function", "body": [ - "new Promise((resolve, reject) => {", + "async (${1:params}) => {", "\t$TM_SELECTED_TEXT$0", - "})" + "}" ], - "description": "Create a new Promise" + "description": "Async Function Expression" } } diff --git a/extensions/typescript-basics/snippets/typescript.code-snippets b/extensions/typescript-basics/snippets/typescript.code-snippets index 9d6dadcc2e6be..9ed695795eb6d 100644 --- a/extensions/typescript-basics/snippets/typescript.code-snippets +++ b/extensions/typescript-basics/snippets/typescript.code-snippets @@ -266,6 +266,15 @@ ], "description": "Set Timeout Function" }, + "Set Interval Function": { + "prefix": "setinterval", + "body": [ + "setInterval(() => {", + "\t$TM_SELECTED_TEXT$0", + "}, ${1:interval});" + ], + "description": "Set Interval Function" + }, "Region Start": { "prefix": "#region", "body": [ From 859a0942630b74c73da4929a32e9f280f8c3b94a Mon Sep 17 00:00:00 2001 From: John Murray Date: Thu, 4 Jul 2024 09:33:30 +0100 Subject: [PATCH 639/755] Hide Local History commands when `"workbench.localHistory.enabled": false` (#212936) --- .../localHistory/browser/localHistoryCommands.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/localHistory/browser/localHistoryCommands.ts b/src/vs/workbench/contrib/localHistory/browser/localHistoryCommands.ts index c768ab602f033..098357445d007 100644 --- a/src/vs/workbench/contrib/localHistory/browser/localHistoryCommands.ts +++ b/src/vs/workbench/contrib/localHistory/browser/localHistoryCommands.ts @@ -33,6 +33,7 @@ import { getLocalHistoryDateFormatter, LOCAL_HISTORY_ICON_RESTORE, LOCAL_HISTORY import { IPathService } from 'vs/workbench/services/path/common/pathService'; const LOCAL_HISTORY_CATEGORY = localize2('localHistory.category', 'Local History'); +const CTX_LOCAL_HISTORY_ENABLED = ContextKeyExpr.has('config.workbench.localHistory.enabled'); export interface ITimelineCommandArgument { uri: URI; @@ -316,7 +317,8 @@ registerAction2(class extends Action2 { id: 'workbench.action.localHistory.restoreViaPicker', title: localize2('localHistory.restoreViaPicker', 'Find Entry to Restore'), f1: true, - category: LOCAL_HISTORY_CATEGORY + category: LOCAL_HISTORY_CATEGORY, + precondition: CTX_LOCAL_HISTORY_ENABLED }); } async run(accessor: ServicesAccessor): Promise { @@ -402,7 +404,7 @@ registerAction2(class extends Action2 { } }); -MenuRegistry.appendMenuItem(MenuId.TimelineTitle, { command: { id: 'workbench.action.localHistory.restoreViaPicker', title: localize2('localHistory.restoreViaPickerMenu', 'Local History: Find Entry to Restore...') }, group: 'submenu', order: 1 }); +MenuRegistry.appendMenuItem(MenuId.TimelineTitle, { command: { id: 'workbench.action.localHistory.restoreViaPicker', title: localize2('localHistory.restoreViaPickerMenu', 'Local History: Find Entry to Restore...') }, group: 'submenu', order: 1, when: CTX_LOCAL_HISTORY_ENABLED }); //#endregion @@ -499,7 +501,8 @@ registerAction2(class extends Action2 { id: 'workbench.action.localHistory.deleteAll', title: localize2('localHistory.deleteAll', 'Delete All'), f1: true, - category: LOCAL_HISTORY_CATEGORY + category: LOCAL_HISTORY_CATEGORY, + precondition: CTX_LOCAL_HISTORY_ENABLED }); } async run(accessor: ServicesAccessor): Promise { @@ -534,7 +537,7 @@ registerAction2(class extends Action2 { title: localize2('localHistory.create', 'Create Entry'), f1: true, category: LOCAL_HISTORY_CATEGORY, - precondition: ActiveEditorContext + precondition: ContextKeyExpr.and(CTX_LOCAL_HISTORY_ENABLED, ActiveEditorContext) }); } async run(accessor: ServicesAccessor): Promise { From fe159c649e029cea4d34d9dac841ab5e9e373389 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 11:02:31 +0200 Subject: [PATCH 640/755] show original enabled api proposals in the editor (#219928) --- .../extensionManagement/common/extensionsScannerService.ts | 1 + src/vs/platform/extensions/common/extensions.ts | 1 + .../services/extensions/common/extensionsProposedApi.ts | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 55073608fa9fb..57831802fe457 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -674,6 +674,7 @@ class ExtensionsScanner extends Disposable { extension = this.validate(extension, input); } if (manifest.enabledApiProposals && (!this.environmentService.isBuilt || this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase()))) { + manifest.originalEnabledApiProposals = manifest.enabledApiProposals; manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); } return extension; diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index d0b69021dc2a5..822260bdc2fdf 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -271,6 +271,7 @@ export interface IRelaxedExtensionManifest { contributes?: IExtensionContributions; repository?: { url: string }; bugs?: { url: string }; + originalEnabledApiProposals?: readonly string[]; enabledApiProposals?: readonly string[]; api?: string; scripts?: { [key: string]: string }; diff --git a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts index 76d560e77b126..8133ef3e43a03 100644 --- a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts +++ b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts @@ -120,11 +120,11 @@ class ApiProposalsMarkdowneRenderer extends Disposable implements IExtensionFeat readonly type = 'markdown'; shouldRender(manifest: IExtensionManifest): boolean { - return !!manifest.enabledApiProposals?.length; + return !!manifest.originalEnabledApiProposals?.length || !!manifest.enabledApiProposals?.length; } render(manifest: IExtensionManifest): IRenderedData { - const enabledApiProposals = manifest.enabledApiProposals || []; + const enabledApiProposals = manifest.originalEnabledApiProposals ?? manifest.enabledApiProposals ?? []; const data = new MarkdownString(); if (enabledApiProposals.length) { for (const proposal of enabledApiProposals) { From 633fbed04eb5263d36f9d36f0e912ff73180ef31 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 11:08:07 +0200 Subject: [PATCH 641/755] update description (#219929) --- .../contrib/extensions/browser/extensionsWorkbenchService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 9c34630f65b6c..78abd2bffaba4 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -969,7 +969,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension properties: { [AutoRestartConfigurationKey]: { type: 'boolean', - description: nls.localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus."), + description: nls.localize('autoRestart', "If activated, extensions will automatically restart following an update if the window is not in focus. There can be a data loss if you have open Notebooks or Custom Editors."), default: false, } } From 9c88ad7ebd4eff4ead004aee2b98630158f53b5f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 11:27:17 +0200 Subject: [PATCH 642/755] fix #219932 (#219933) --- .../extensionManagement/common/extensionManagementCLI.ts | 2 +- .../contrib/extensions/browser/extensions.contribution.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts b/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts index 17c76f6fe7040..3506d94d5c962 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementCLI.ts @@ -253,7 +253,7 @@ export class ExtensionManagementCLI { const valid = await this.validateVSIX(manifest, force, installOptions.profileLocation, installedExtensions); if (valid) { try { - await this.extensionManagementService.install(vsix, installOptions); + await this.extensionManagementService.install(vsix, { ...installOptions, installGivenVersion: true }); this.logger.info(localize('successVsixInstall', "Extension '{0}' was successfully installed.", basename(vsix))); } catch (error) { if (isCancellationError(error)) { diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 0daeda950dcad..697fafb73d899 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -376,7 +376,7 @@ CommandsRegistry.registerCommand({ } } else { const vsix = URI.revive(arg); - await extensionsWorkbenchService.install(vsix, { installOnlyNewlyAddedFromExtensionPack: options?.installOnlyNewlyAddedFromExtensionPackVSIX }); + await extensionsWorkbenchService.install(vsix, { installOnlyNewlyAddedFromExtensionPack: options?.installOnlyNewlyAddedFromExtensionPackVSIX, installGivenVersion: true }); } } catch (e) { onUnexpectedError(e); @@ -818,7 +818,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi const notificationService = accessor.get(INotificationService); const vsixs = Array.isArray(resources) ? resources : [resources]; - const result = await Promise.allSettled(vsixs.map(async (vsix) => await extensionsWorkbenchService.install(vsix))); + const result = await Promise.allSettled(vsixs.map(async (vsix) => await extensionsWorkbenchService.install(vsix, { installGivenVersion: true }))); let error: Error | undefined, requireReload = false, requireRestart = false; for (const r of result) { if (r.status === 'rejected') { From acfda1578a3c486be75636963047e3057dd2b84a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 11:54:03 +0200 Subject: [PATCH 643/755] fix #218061 (#219936) --- .../userDataSync/common/userDataSyncLocalStoreService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.ts b/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.ts index 28d2400cfee3c..8c505b3aec7ba 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.ts @@ -53,7 +53,7 @@ export class UserDataSyncLocalStoreService extends Disposable implements IUserDa if (stat.children) { for (const child of stat.children) { - if (child.isDirectory && !this.userDataProfilesService.profiles.some(profile => profile.id === child.name)) { + if (child.isDirectory && !ALL_SYNC_RESOURCES.includes(child.name) && !this.userDataProfilesService.profiles.some(profile => profile.id === child.name)) { try { this.logService.info('Deleting non existing profile from backup', child.resource.path); await this.fileService.del(child.resource, { recursive: true }); From bf6ba5953fd1b98465c8bc1e97a9cfa0eae6211a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 12:39:17 +0200 Subject: [PATCH 644/755] do not reset local state when resource enablement has changed (#219938) --- src/vs/platform/userDataSync/common/userDataSyncService.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index 856003580d014..a11d2cb04cc7e 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -702,8 +702,7 @@ class ProfileSynchronizer extends Disposable { const [[synchronizer, , disposable]] = this._enabled.splice(index, 1); disposable.dispose(); this.updateStatus(); - Promise.allSettled([synchronizer.stop(), synchronizer.resetLocal()]) - .then(null, error => this.logService.error(error)); + synchronizer.stop().then(null, error => this.logService.error(error)); } } From d9be968b0b2875e8e97de3b06f6e5628836fc99e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 12:49:57 +0200 Subject: [PATCH 645/755] Simply user snippets and tasks labels in all menus (#219939) --- .../contrib/snippets/browser/commands/configureSnippets.ts | 6 +++--- src/vs/workbench/contrib/tasks/browser/task.contribution.ts | 2 +- .../userDataProfile/browser/userDataProfilesEditor.ts | 4 ++-- .../services/userDataProfile/browser/tasksResource.ts | 2 +- .../browser/userDataProfileImportExportService.ts | 4 ++-- .../workbench/services/userDataSync/common/userDataSync.ts | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts b/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts index f0ea01793f290..198ec6d581b66 100644 --- a/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts +++ b/src/vs/workbench/contrib/snippets/browser/commands/configureSnippets.ts @@ -227,10 +227,10 @@ export class ConfigureSnippetsAction extends SnippetsAction { constructor() { super({ id: 'workbench.action.openSnippets', - title: nls.localize2('openSnippet.label', "Configure User Snippets"), + title: nls.localize2('openSnippet.label', "Configure Snippets"), shortTitle: { - ...nls.localize2('userSnippets', "User Snippets"), - mnemonicTitle: nls.localize({ key: 'miOpenSnippets', comment: ['&& denotes a mnemonic'] }, "User &&Snippets"), + ...nls.localize2('userSnippets', "Snippets"), + mnemonicTitle: nls.localize({ key: 'miOpenSnippets', comment: ['&& denotes a mnemonic'] }, "&&Snippets"), }, f1: true, menu: [ diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts index ac6fdcba3859c..88059901e6430 100644 --- a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -347,7 +347,7 @@ class UserTasksGlobalActionContribution extends Disposable implements IWorkbench private registerActions() { const id = 'workbench.action.tasks.openUserTasks'; - const title = nls.localize('userTasks', "User Tasks"); + const title = nls.localize('tasks', "Tasks"); this._register(MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { command: { id, diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts index b84e1af173b0f..f10759523705d 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfilesEditor.ts @@ -937,9 +937,9 @@ class AbstractProfileResourceTreeRenderer extends Disposable { case ProfileResourceType.Keybindings: return localize('keybindings', "Keyboard Shortcuts"); case ProfileResourceType.Snippets: - return localize('snippets', "User Snippets"); + return localize('snippets', "Snippets"); case ProfileResourceType.Tasks: - return localize('tasks', "User Tasks"); + return localize('tasks', "Tasks"); case ProfileResourceType.Extensions: return localize('extensions', "Extensions"); } diff --git a/src/vs/workbench/services/userDataProfile/browser/tasksResource.ts b/src/vs/workbench/services/userDataProfile/browser/tasksResource.ts index 510e58bcfe051..c5ed415786ac6 100644 --- a/src/vs/workbench/services/userDataProfile/browser/tasksResource.ts +++ b/src/vs/workbench/services/userDataProfile/browser/tasksResource.ts @@ -84,7 +84,7 @@ export class TasksResourceTreeItem implements IProfileResourceTreeItem { readonly type = ProfileResourceType.Tasks; readonly handle = ProfileResourceType.Tasks; - readonly label = { label: localize('tasks', "User Tasks") }; + readonly label = { label: localize('tasks', "Tasks") }; readonly collapsibleState = TreeItemCollapsibleState.Expanded; checkbox: ITreeItemCheckboxState | undefined; diff --git a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts index 6a28cadf4489a..7c5bab40b8741 100644 --- a/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts +++ b/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.ts @@ -388,8 +388,8 @@ export class UserDataProfileImportExportService extends Disposable implements IU const settings: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Settings, label: localize('settings', "Settings"), picked: !profile?.useDefaultFlags?.settings }; const keybindings: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Keybindings, label: localize('keybindings', "Keyboard Shortcuts"), picked: !profile?.useDefaultFlags?.keybindings }; - const snippets: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Snippets, label: localize('snippets', "User Snippets"), picked: !profile?.useDefaultFlags?.snippets }; - const tasks: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Tasks, label: localize('tasks', "User Tasks"), picked: !profile?.useDefaultFlags?.tasks }; + const snippets: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Snippets, label: localize('snippets', "Snippets"), picked: !profile?.useDefaultFlags?.snippets }; + const tasks: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Tasks, label: localize('tasks', "Tasks"), picked: !profile?.useDefaultFlags?.tasks }; const extensions: IQuickPickItem & { id: ProfileResourceType } = { id: ProfileResourceType.Extensions, label: localize('extensions', "Extensions"), picked: !profile?.useDefaultFlags?.extensions }; const resources = [settings, keybindings, snippets, tasks, extensions]; diff --git a/src/vs/workbench/services/userDataSync/common/userDataSync.ts b/src/vs/workbench/services/userDataSync/common/userDataSync.ts index 9aa88c9e1d088..759011c2549f1 100644 --- a/src/vs/workbench/services/userDataSync/common/userDataSync.ts +++ b/src/vs/workbench/services/userDataSync/common/userDataSync.ts @@ -55,8 +55,8 @@ export function getSyncAreaLabel(source: SyncResource): string { switch (source) { case SyncResource.Settings: return localize('settings', "Settings"); case SyncResource.Keybindings: return localize('keybindings', "Keyboard Shortcuts"); - case SyncResource.Snippets: return localize('snippets', "User Snippets"); - case SyncResource.Tasks: return localize('tasks', "User Tasks"); + case SyncResource.Snippets: return localize('snippets', "Snippets"); + case SyncResource.Tasks: return localize('tasks', "Tasks"); case SyncResource.Extensions: return localize('extensions', "Extensions"); case SyncResource.GlobalState: return localize('ui state label', "UI State"); case SyncResource.Profiles: return localize('profiles', "Profiles"); From f94698b3ddd9565e743c9d2b9bd3123081d468a0 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 4 Jul 2024 12:56:55 +0200 Subject: [PATCH 646/755] Git - do not show progress while running Config and GetBranch operations (#219940) --- extensions/git/src/operation.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/operation.ts b/extensions/git/src/operation.ts index 223f1945b0214..75f9405b3e340 100644 --- a/extensions/git/src/operation.ts +++ b/extensions/git/src/operation.ts @@ -141,7 +141,7 @@ export const Operation = { CheckoutTracking: (refLabel: string) => ({ kind: OperationKind.CheckoutTracking, blocking: true, readOnly: false, remote: false, retry: false, showProgress: true, refLabel } as CheckoutTrackingOperation), Clean: (showProgress: boolean) => ({ kind: OperationKind.Clean, blocking: false, readOnly: false, remote: false, retry: false, showProgress } as CleanOperation), Commit: { kind: OperationKind.Commit, blocking: true, readOnly: false, remote: false, retry: false, showProgress: true } as CommitOperation, - Config: (readOnly: boolean) => ({ kind: OperationKind.Config, blocking: false, readOnly, remote: false, retry: false, showProgress: true } as ConfigOperation), + Config: (readOnly: boolean) => ({ kind: OperationKind.Config, blocking: false, readOnly, remote: false, retry: false, showProgress: false } as ConfigOperation), DeleteBranch: { kind: OperationKind.DeleteBranch, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as DeleteBranchOperation, DeleteRef: { kind: OperationKind.DeleteRef, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as DeleteRefOperation, DeleteRemoteTag: { kind: OperationKind.DeleteRemoteTag, blocking: false, readOnly: false, remote: true, retry: false, showProgress: true } as DeleteRemoteTagOperation, @@ -149,7 +149,7 @@ export const Operation = { Diff: { kind: OperationKind.Diff, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as DiffOperation, Fetch: (showProgress: boolean) => ({ kind: OperationKind.Fetch, blocking: false, readOnly: false, remote: true, retry: true, showProgress } as FetchOperation), FindTrackingBranches: { kind: OperationKind.FindTrackingBranches, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as FindTrackingBranchesOperation, - GetBranch: { kind: OperationKind.GetBranch, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as GetBranchOperation, + GetBranch: { kind: OperationKind.GetBranch, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as GetBranchOperation, GetBranches: { kind: OperationKind.GetBranches, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as GetBranchesOperation, GetCommitTemplate: { kind: OperationKind.GetCommitTemplate, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as GetCommitTemplateOperation, GetObjectDetails: { kind: OperationKind.GetObjectDetails, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as GetObjectDetailsOperation, From 58d9d8122825059596f072b95444e6df90d89ae7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 4 Jul 2024 15:47:00 +0200 Subject: [PATCH 647/755] build - use ISO string of date as before (#219961) --- build/lib/date.js | 2 +- build/lib/date.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/lib/date.js b/build/lib/date.js index a472e67eed409..a3e2554c0166c 100644 --- a/build/lib/date.js +++ b/build/lib/date.js @@ -20,5 +20,5 @@ function getRoundedBuildDate() { * at the same time. The current time is rounded up or down to the * closest hour. */ -exports.date = getRoundedBuildDate(); +exports.date = getRoundedBuildDate().toISOString(); //# sourceMappingURL=date.js.map \ No newline at end of file diff --git a/build/lib/date.ts b/build/lib/date.ts index d1f1601e1c901..a68a4caf3df83 100644 --- a/build/lib/date.ts +++ b/build/lib/date.ts @@ -22,4 +22,4 @@ function getRoundedBuildDate() { * at the same time. The current time is rounded up or down to the * closest hour. */ -export const date = getRoundedBuildDate(); +export const date = getRoundedBuildDate().toISOString(); From e852c335aac2aab40baf3931c391668f2dd1b202 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Jul 2024 16:46:16 +0200 Subject: [PATCH 648/755] disable disable-eslint (#219967) --- src/vs/workbench/services/timer/browser/timerService.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/services/timer/browser/timerService.ts b/src/vs/workbench/services/timer/browser/timerService.ts index df14ee528cc4f..486180f41f860 100644 --- a/src/vs/workbench/services/timer/browser/timerService.ts +++ b/src/vs/workbench/services/timer/browser/timerService.ts @@ -566,8 +566,7 @@ export abstract class AbstractTimerService implements ITimerService { const t1 = performance.now(); fib(24); const value = Math.round(performance.now() - t1); - // eslint-disable-next-line no-restricted-globals - postMessage({ value: tooSlow ? -1 : value }); + self.postMessage({ value: tooSlow ? -1 : value }); }).toString(); From 83c722d9a1ed9a2f05331d9e0671459c84bb3410 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:12:06 +0200 Subject: [PATCH 649/755] =?UTF-8?q?Git=20-=20=F0=9F=92=84=20better=20error?= =?UTF-8?q?=20handling=20and=20clean-up=20logging=20(#219975)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/git/src/main.ts | 16 +- extensions/git/src/model.ts | 202 ++++++++++++++------------ extensions/git/src/protocolHandler.ts | 14 +- 3 files changed, 126 insertions(+), 106 deletions(-) diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index c2d9b974be726..b3f6b6466fe2b 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -48,7 +48,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, } const info = await findGit(pathHints, gitPath => { - logger.info(l10n.t('Validating found git in: "{0}"', gitPath)); + logger.info(l10n.t('[main] Validating found git in: "{0}"', gitPath)); if (excludes.length === 0) { return true; } @@ -56,7 +56,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, const normalized = path.normalize(gitPath).replace(/[\r\n]+$/, ''); const skip = excludes.some(e => normalized.startsWith(e)); if (skip) { - logger.info(l10n.t('Skipped found git in: "{0}"', gitPath)); + logger.info(l10n.t('[main] Skipped found git in: "{0}"', gitPath)); } return !skip; }, logger); @@ -66,7 +66,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, try { ipcServer = await createIPCServer(context.storagePath); } catch (err) { - logger.error(`Failed to create git IPC: ${err}`); + logger.error(`[main] Failed to create git IPC: ${err}`); } const askpass = new Askpass(ipcServer); @@ -79,7 +79,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, const terminalEnvironmentManager = new TerminalEnvironmentManager(context, [askpass, gitEditor, ipcServer]); disposables.push(terminalEnvironmentManager); - logger.info(l10n.t('Using git "{0}" from "{1}"', info.version, info.path)); + logger.info(l10n.t('[main] Using git "{0}" from "{1}"', info.version, info.path)); const git = new Git({ gitPath: info.path, @@ -187,7 +187,7 @@ export async function _activate(context: ExtensionContext): Promise { - logger.appendLine(l10n.t('Log level: {0}', LogLevel[logLevel])); + logger.appendLine(l10n.t('[main] Log level: {0}', LogLevel[logLevel])); }; disposables.push(logger.onDidChangeLogLevel(onDidChangeLogLevel)); onDidChangeLogLevel(logger.logLevel); @@ -212,13 +212,13 @@ export async function _activate(context: ExtensionContext): Promise { + this.logger.info('[Model] Initial repository scan started'); + const config = workspace.getConfiguration('git'); const autoRepositoryDetection = config.get('autoRepositoryDetection'); const parentRepositoryConfig = config.get<'always' | 'never' | 'prompt'>('openRepositoryInParentFolders', 'prompt'); + this.logger.trace(`[Model] Settings: autoRepositoryDetection=${autoRepositoryDetection}, openRepositoryInParentFolders=${parentRepositoryConfig}`); + // Initial repository scan function const initialScanFn = () => Promise.all([ this.onDidChangeWorkspaceFolders({ added: workspace.workspaceFolders || [], removed: [] }), @@ -321,6 +325,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } */ this.telemetryReporter.sendTelemetryEvent('git.repositoryInitialScan', { autoRepositoryDetection: String(autoRepositoryDetection) }, { repositoryCount: this.openRepositories.length }); + this.logger.info(`[Model] Initial repository scan completed - repositories(${this.repositories.length}), closed repositories (${this.closedRepositories.length}), parent repositories (${this.parentRepositories.length}), unsafe repositories (${this.unsafeRepositories.length})`); } /** @@ -329,47 +334,51 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi * the git.repositoryScanMaxDepth setting. */ private async scanWorkspaceFolders(): Promise { - const config = workspace.getConfiguration('git'); - const autoRepositoryDetection = config.get('autoRepositoryDetection'); - this.logger.trace(`[swsf] Scan workspace sub folders. autoRepositoryDetection=${autoRepositoryDetection}`); + try { + const config = workspace.getConfiguration('git'); + const autoRepositoryDetection = config.get('autoRepositoryDetection'); - if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'subFolders') { - return; - } + if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'subFolders') { + return; + } - await Promise.all((workspace.workspaceFolders || []).map(async folder => { - const root = folder.uri.fsPath; - this.logger.trace(`[swsf] Workspace folder: ${root}`); + await Promise.all((workspace.workspaceFolders || []).map(async folder => { + const root = folder.uri.fsPath; + this.logger.trace(`[Model] Workspace folder: ${root}`); - // Workspace folder children - const repositoryScanMaxDepth = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanMaxDepth', 1); - const repositoryScanIgnoredFolders = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanIgnoredFolders', []); + // Workspace folder children + const repositoryScanMaxDepth = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanMaxDepth', 1); + const repositoryScanIgnoredFolders = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanIgnoredFolders', []); - const subfolders = new Set(await this.traverseWorkspaceFolder(root, repositoryScanMaxDepth, repositoryScanIgnoredFolders)); + const subfolders = new Set(await this.traverseWorkspaceFolder(root, repositoryScanMaxDepth, repositoryScanIgnoredFolders)); - // Repository scan folders - const scanPaths = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('scanRepositories') || []; - this.logger.trace(`[swsf] Workspace scan settings: repositoryScanMaxDepth=${repositoryScanMaxDepth}; repositoryScanIgnoredFolders=[${repositoryScanIgnoredFolders.join(', ')}]; scanRepositories=[${scanPaths.join(', ')}]`); + // Repository scan folders + const scanPaths = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('scanRepositories') || []; + this.logger.trace(`[Model] Workspace scan settings: repositoryScanMaxDepth=${repositoryScanMaxDepth}; repositoryScanIgnoredFolders=[${repositoryScanIgnoredFolders.join(', ')}]; scanRepositories=[${scanPaths.join(', ')}]`); - for (const scanPath of scanPaths) { - if (scanPath === '.git') { - this.logger.trace('[swsf] \'.git\' not supported in \'git.scanRepositories\' setting.'); - continue; - } + for (const scanPath of scanPaths) { + if (scanPath === '.git') { + this.logger.trace('[Model] \'.git\' not supported in \'git.scanRepositories\' setting.'); + continue; + } - if (path.isAbsolute(scanPath)) { - const notSupportedMessage = l10n.t('Absolute paths not supported in "git.scanRepositories" setting.'); - this.logger.warn(notSupportedMessage); - console.warn(notSupportedMessage); - continue; - } + if (path.isAbsolute(scanPath)) { + const notSupportedMessage = l10n.t('Absolute paths not supported in "git.scanRepositories" setting.'); + this.logger.warn(`[Model] ${notSupportedMessage}`); + console.warn(notSupportedMessage); + continue; + } - subfolders.add(path.join(root, scanPath)); - } + subfolders.add(path.join(root, scanPath)); + } - this.logger.trace(`[swsf] Workspace scan sub folders: [${[...subfolders].join(', ')}]`); - await Promise.all([...subfolders].map(f => this.openRepository(f))); - })); + this.logger.trace(`[Model] Workspace scan sub folders: [${[...subfolders].join(', ')}]`); + await Promise.all([...subfolders].map(f => this.openRepository(f))); + })); + } + catch (err) { + this.logger.warn(`[Model] scanWorkspaceFolders: ${err}`); + } } private async traverseWorkspaceFolder(workspaceFolder: string, maxDepth: number, repositoryScanIgnoredFolders: string[]): Promise { @@ -388,7 +397,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } } catch (err) { - this.logger.warn(`[swsf] Unable to read folder '${currentFolder.path}': ${err}`); + this.logger.warn(`[Model] Unable to read workspace folder '${currentFolder.path}': ${err}`); continue; } @@ -434,23 +443,28 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } private async onDidChangeWorkspaceFolders({ added, removed }: WorkspaceFoldersChangeEvent): Promise { - const possibleRepositoryFolders = added - .filter(folder => !this.getOpenRepository(folder.uri)); - - const activeRepositoriesList = window.visibleTextEditors - .map(editor => this.getRepository(editor.document.uri)) - .filter(repository => !!repository) as Repository[]; - - const activeRepositories = new Set(activeRepositoriesList); - const openRepositoriesToDispose = removed - .map(folder => this.getOpenRepository(folder.uri)) - .filter(r => !!r) - .filter(r => !activeRepositories.has(r!.repository)) - .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[]; - - openRepositoriesToDispose.forEach(r => r.dispose()); - this.logger.trace(`[swf] Scan workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); - await Promise.all(possibleRepositoryFolders.map(p => this.openRepository(p.uri.fsPath))); + try { + const possibleRepositoryFolders = added + .filter(folder => !this.getOpenRepository(folder.uri)); + + const activeRepositoriesList = window.visibleTextEditors + .map(editor => this.getRepository(editor.document.uri)) + .filter(repository => !!repository) as Repository[]; + + const activeRepositories = new Set(activeRepositoriesList); + const openRepositoriesToDispose = removed + .map(folder => this.getOpenRepository(folder.uri)) + .filter(r => !!r) + .filter(r => !activeRepositories.has(r!.repository)) + .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[]; + + openRepositoriesToDispose.forEach(r => r.dispose()); + this.logger.trace(`[Model] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); + await Promise.all(possibleRepositoryFolders.map(p => this.openRepository(p.uri.fsPath))); + } + catch (err) { + this.logger.warn(`[Model] onDidChangeWorkspaceFolders: ${err}`); + } } private onDidChangeConfiguration(): void { @@ -463,50 +477,54 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi .filter(({ root }) => workspace.getConfiguration('git', root).get('enabled') !== true) .map(({ repository }) => repository); - this.logger.trace(`[swf] Scan workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); + this.logger.trace(`[Model] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); possibleRepositoryFolders.forEach(p => this.openRepository(p.uri.fsPath)); openRepositoriesToDispose.forEach(r => r.dispose()); } private async onDidChangeVisibleTextEditors(editors: readonly TextEditor[]): Promise { - if (!workspace.isTrusted) { - this.logger.trace('[svte] Workspace is not trusted.'); - return; - } - - const config = workspace.getConfiguration('git'); - const autoRepositoryDetection = config.get('autoRepositoryDetection'); - this.logger.trace(`[svte] Scan visible text editors. autoRepositoryDetection=${autoRepositoryDetection}`); - - if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'openEditors') { - return; - } - - await Promise.all(editors.map(async editor => { - const uri = editor.document.uri; - - if (uri.scheme !== 'file') { + try { + if (!workspace.isTrusted) { + this.logger.trace('[Model] Workspace is not trusted.'); return; } - const repository = this.getRepository(uri); + const config = workspace.getConfiguration('git'); + const autoRepositoryDetection = config.get('autoRepositoryDetection'); - if (repository) { - this.logger.trace(`[svte] Repository for editor resource ${uri.fsPath} already exists: ${repository.root}`); + if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'openEditors') { return; } - this.logger.trace(`[svte] Open repository for editor resource ${uri.fsPath}`); - await this.openRepository(path.dirname(uri.fsPath)); - })); + await Promise.all(editors.map(async editor => { + const uri = editor.document.uri; + + if (uri.scheme !== 'file') { + return; + } + + const repository = this.getRepository(uri); + + if (repository) { + this.logger.trace(`[Model] Repository for editor resource ${uri.fsPath} already exists: ${repository.root}`); + return; + } + + this.logger.trace(`[Model] Open repository for editor resource ${uri.fsPath}`); + await this.openRepository(path.dirname(uri.fsPath)); + })); + } + catch (err) { + this.logger.warn(`[Model] onDidChangeVisibleTextEditors: ${err}`); + } } @sequentialize async openRepository(repoPath: string, openIfClosed = false): Promise { - this.logger.trace(`Opening repository: ${repoPath}`); + this.logger.trace(`[Model] Opening repository: ${repoPath}`); const existingRepository = await this.getRepositoryExact(repoPath); if (existingRepository) { - this.logger.trace(`Repository for path ${repoPath} already exists: ${existingRepository.root}`); + this.logger.trace(`[Model] Repository for path ${repoPath} already exists: ${existingRepository.root}`); return; } @@ -514,7 +532,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const enabled = config.get('enabled') === true; if (!enabled) { - this.logger.trace('Git is not enabled'); + this.logger.trace('[Model] Git is not enabled'); return; } @@ -524,7 +542,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi fs.accessSync(path.join(repoPath, 'HEAD'), fs.constants.F_OK); const result = await this.git.exec(repoPath, ['-C', repoPath, 'rev-parse', '--show-cdup']); if (result.stderr.trim() === '' && result.stdout.trim() === '') { - this.logger.trace(`Bare repository: ${repoPath}`); + this.logger.trace(`[Model] Bare repository: ${repoPath}`); return; } } catch { @@ -534,16 +552,16 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi try { const { repositoryRoot, unsafeRepositoryMatch } = await this.getRepositoryRoot(repoPath); - this.logger.trace(`Repository root for path ${repoPath} is: ${repositoryRoot}`); + this.logger.trace(`[Model] Repository root for path ${repoPath} is: ${repositoryRoot}`); const existingRepository = await this.getRepositoryExact(repositoryRoot); if (existingRepository) { - this.logger.trace(`Repository for path ${repositoryRoot} already exists: ${existingRepository.root}`); + this.logger.trace(`[Model] Repository for path ${repositoryRoot} already exists: ${existingRepository.root}`); return; } if (this.shouldRepositoryBeIgnored(repositoryRoot)) { - this.logger.trace(`Repository for path ${repositoryRoot} is ignored`); + this.logger.trace(`[Model] Repository for path ${repositoryRoot} is ignored`); return; } @@ -552,7 +570,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi if (parentRepositoryConfig !== 'always' && this.globalState.get(`parentRepository:${repositoryRoot}`) !== true) { const isRepositoryOutsideWorkspace = await this.isRepositoryOutsideWorkspace(repositoryRoot); if (isRepositoryOutsideWorkspace) { - this.logger.trace(`Repository in parent folder: ${repositoryRoot}`); + this.logger.trace(`[Model] Repository in parent folder: ${repositoryRoot}`); if (!this._parentRepositoriesManager.hasRepository(repositoryRoot)) { // Show a notification if the parent repository is opened after the initial scan @@ -569,7 +587,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi // Handle unsafe repositories if (unsafeRepositoryMatch && unsafeRepositoryMatch.length === 3) { - this.logger.trace(`Unsafe repository: ${repositoryRoot}`); + this.logger.trace(`[Model] Unsafe repository: ${repositoryRoot}`); // Show a notification if the unsafe repository is opened after the initial scan if (this._state === 'initialized' && !this._unsafeRepositoriesManager.hasRepository(repositoryRoot)) { @@ -583,7 +601,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi // Handle repositories that were closed by the user if (!openIfClosed && this._closedRepositoriesManager.isRepositoryClosed(repositoryRoot)) { - this.logger.trace(`Repository for path ${repositoryRoot} is closed`); + this.logger.trace(`[Model] Repository for path ${repositoryRoot} is closed`); return; } @@ -594,12 +612,14 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi this.open(repository); this._closedRepositoriesManager.deleteRepository(repository.root); + this.logger.info(`[Model] Opened repository: ${repository.root}`); + // Do not await this, we want SCM // to know about the repo asap repository.status(); } catch (err) { // noop - this.logger.trace(`Opening repository for path='${repoPath}' failed; ex=${err}`); + this.logger.trace(`[Model] Opening repository for path='${repoPath}' failed; ex=${err}`); } } @@ -631,7 +651,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const repositoryRootRealPath = await fs.promises.realpath(repositoryRoot); return !pathEquals(repositoryRoot, repositoryRootRealPath) ? repositoryRootRealPath : undefined; } catch (err) { - this.logger.warn(`Failed to get repository realpath for: "${repositoryRoot}". ${err}`); + this.logger.warn(`[Model] Failed to get repository realpath for "${repositoryRoot}": ${err}`); return undefined; } } @@ -658,7 +678,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } private open(repository: Repository): void { - this.logger.info(`Open repository: ${repository.root}`); + this.logger.trace(`[Model] Open repository: ${repository.root}`); const onDidDisappearRepository = filterEvent(repository.onDidChangeState, state => state === RepositoryState.Disposed); const disappearListener = onDidDisappearRepository(() => dispose()); @@ -675,7 +695,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const checkForSubmodules = () => { if (!shouldDetectSubmodules) { - this.logger.trace('Automatic detection of git submodules is not enabled.'); + this.logger.trace('[Model] Automatic detection of git submodules is not enabled.'); return; } @@ -750,7 +770,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi return; } - this.logger.info(`Close repository: ${repository.root}`); + this.logger.info(`[Model] Close repository: ${repository.root}`); this._closedRepositoriesManager.addRepository(openRepository.repository.root); openRepository.dispose(); @@ -803,7 +823,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi return openRepositoryRealPath?.repository; } catch (err) { - this.logger.warn(`Failed to get repository realpath for: "${repoPath}". ${err}`); + this.logger.warn(`[Model] Failed to get repository realpath for: "${repoPath}". ${err}`); return undefined; } } @@ -989,7 +1009,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi this._workspaceFolders.set(workspaceFolder.uri.fsPath, result); } catch (err) { // noop - Workspace folder does not exist - this.logger.trace(`Failed to resolve workspace folder: "${workspaceFolder.uri.fsPath}". ${err}`); + this.logger.trace(`[Model] Failed to resolve workspace folder "${workspaceFolder.uri.fsPath}": ${err}`); } } diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts index dc73fe39965c2..b65eac01a681c 100644 --- a/extensions/git/src/protocolHandler.ts +++ b/extensions/git/src/protocolHandler.ts @@ -22,7 +22,7 @@ export class GitProtocolHandler implements UriHandler { } handleUri(uri: Uri): void { - this.logger.info(`GitProtocolHandler.handleUri(${uri.toString()})`); + this.logger.info(`[GitProtocolHandler] handleUri(${uri.toString()})`); switch (uri.path) { case '/clone': this.clone(uri); @@ -34,17 +34,17 @@ export class GitProtocolHandler implements UriHandler { const ref = data.ref; if (!data.url) { - this.logger.warn('Failed to open URI:' + uri.toString()); + this.logger.warn('[GitProtocolHandler] Failed to open URI:' + uri.toString()); return; } if (Array.isArray(data.url) && data.url.length === 0) { - this.logger.warn('Failed to open URI:' + uri.toString()); + this.logger.warn('[GitProtocolHandler] Failed to open URI:' + uri.toString()); return; } if (ref !== undefined && typeof ref !== 'string') { - this.logger.warn('Failed to open URI due to multiple references:' + uri.toString()); + this.logger.warn('[GitProtocolHandler] Failed to open URI due to multiple references:' + uri.toString()); return; } @@ -69,12 +69,12 @@ export class GitProtocolHandler implements UriHandler { } } catch (ex) { - this.logger.warn('Invalid URI:' + uri.toString()); + this.logger.warn('[GitProtocolHandler] Invalid URI:' + uri.toString()); return; } if (!(await commands.getCommands(true)).includes('git.clone')) { - this.logger.error('Could not complete git clone operation as git installation was not found.'); + this.logger.error('[GitProtocolHandler] Could not complete git clone operation as git installation was not found.'); const errorMessage = l10n.t('Could not clone your repository as Git is not installed.'); const downloadGit = l10n.t('Download Git'); @@ -86,7 +86,7 @@ export class GitProtocolHandler implements UriHandler { return; } else { const cloneTarget = cloneUri.toString(true); - this.logger.info(`Executing git.clone for ${cloneTarget}`); + this.logger.info(`[GitProtocolHandler] Executing git.clone for ${cloneTarget}`); commands.executeCommand('git.clone', cloneTarget, undefined, { ref: ref }); } } From 3ce0d742a353b0df2e867b4d4fd531bba4a77395 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 4 Jul 2024 17:22:57 +0200 Subject: [PATCH 650/755] fix #219977 (#219978) --- .../common/configurationRegistry.ts | 32 ++++++++++++------- .../test/common/configurationRegistry.test.ts | 22 +++++++++++-- .../test/common/configurations.test.ts | 4 +-- .../api/common/configurationExtensionPoint.ts | 8 ++++- .../debug/browser/debug.contribution.ts | 3 +- .../browser/configurationService.ts | 18 ++++++++--- 6 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 98ab6dc12d833..2a93b1068154d 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -191,6 +191,11 @@ export interface IConfigurationPropertySchema extends IJSONSchema { */ disallowSyncIgnore?: boolean; + /** + * Disallow extensions to contribute configuration default value for this setting. + */ + disallowConfigurationDefault?: boolean; + /** * Labels for enumeration items */ @@ -233,12 +238,11 @@ export interface IConfigurationNode { restrictedProperties?: string[]; } -export type ConfigurationDefaultSource = IExtensionInfo | string; -export type ConfigurationDefaultValueSource = ConfigurationDefaultSource | Map; +export type ConfigurationDefaultValueSource = IExtensionInfo | Map; export interface IConfigurationDefaults { overrides: IStringDictionary; - source?: ConfigurationDefaultSource; + source?: IExtensionInfo; } export type IRegisteredConfigurationPropertySchema = IConfigurationPropertySchema & { @@ -369,7 +373,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { if (source) { let objectConfigurationSources = valuesSources.get(configuration); if (!objectConfigurationSources) { - objectConfigurationSources = new Map(); + objectConfigurationSources = new Map(); valuesSources.set(configuration, objectConfigurationSources); } if (!(objectConfigurationSources instanceof Map)) { @@ -398,7 +402,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { description: nls.localize('defaultLanguageConfiguration.description', "Configure settings to be overridden for the {0} language.", plainKey), $ref: resourceLanguageSettingsSchemaId, defaultDefaultValue: defaultValue, - source: types.isString(source) ? undefined : source, + source, defaultValueSource: source }; overrideIdentifiers.push(...overrideIdentifiersFromKey(key)); @@ -425,7 +429,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { newDefaultValue = { ...existingDefaultValue, ...newDefaultValue }; - newDefaultValueSource = existingDefaultOverride?.source ?? new Map(); + newDefaultValueSource = existingDefaultOverride?.source ?? new Map(); if (!(newDefaultValueSource instanceof Map)) { console.error('defaultValueSource is not a Map'); continue; @@ -464,7 +468,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { for (const { overrides, source } of defaultConfigurations) { for (const key in overrides) { - const id = types.isString(source) ? source : source?.id; + const id = source?.id; const configurationDefaultsOverride = this.configurationDefaultsOverrides.get(key); if (!configurationDefaultsOverride) { @@ -476,7 +480,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { const overrideValue = overrides[key][configuration]; if (types.isObject(overrideValue)) { - const configurationSource = configurationDefaultsOverride.valuesSources?.get(configuration) as Map | undefined; + const configurationSource = configurationDefaultsOverride.valuesSources?.get(configuration) as Map | undefined; for (const overrideObjectKey of Object.keys(overrideValue)) { const keySource = configurationSource?.get(overrideObjectKey); @@ -529,7 +533,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { } // Otherwise, remove the default value if the source matches else { - const configurationDefaultsOverrideSourceId = types.isString(configurationDefaultsOverride.source) ? configurationDefaultsOverride.source : configurationDefaultsOverride.source?.id; + const configurationDefaultsOverrideSourceId = configurationDefaultsOverride.source?.id; if (id !== configurationDefaultsOverrideSourceId) { continue; // Another source is overriding this default value } @@ -802,8 +806,14 @@ class ConfigurationRegistry implements IConfigurationRegistry { private updatePropertyDefaultValue(key: string, property: IRegisteredConfigurationPropertySchema): void { const configurationdefaultOverride = this.configurationDefaultsOverrides.get(key); - let defaultValue = configurationdefaultOverride?.value; - let defaultSource = configurationdefaultOverride?.source; + let defaultValue = undefined; + let defaultSource = undefined; + if (configurationdefaultOverride + && (!property.disallowConfigurationDefault || !configurationdefaultOverride.source) // Prevent overriding the default value if the property is disallowed to be overridden by configuration defaults from extensions + ) { + defaultValue = configurationdefaultOverride.value; + defaultSource = configurationdefaultOverride.source; + } if (types.isUndefined(defaultValue)) { defaultValue = property.defaultDefaultValue; defaultSource = undefined; diff --git a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts index 24dc735cd11be..ec7fcb5e8b6a9 100644 --- a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts +++ b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts @@ -31,6 +31,24 @@ suite('ConfigurationRegistry', () => { assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['[lang]'].default, { a: 2, c: 3 }); }); + test('configuration override defaults - prevent overriding default value', async () => { + configurationRegistry.registerConfiguration({ + 'id': '_test_default', + 'type': 'object', + 'properties': { + 'config.preventDefaultValueOverride': { + 'type': 'object', + default: { a: 0 }, + 'disallowConfigurationDefault': true + } + } + }); + + configurationRegistry.registerDefaultConfigurations([{ overrides: { 'config.preventDefaultValueOverride': { a: 1, b: 2 } } }]); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config.preventDefaultValueOverride'].default, { a: 0 }); + }); + test('configuration override defaults - merges defaults', async () => { configurationRegistry.registerDefaultConfigurations([{ overrides: { '[lang]': { a: 1, b: 2 } } }]); configurationRegistry.registerDefaultConfigurations([{ overrides: { '[lang]': { a: 2, c: 3 } } }]); @@ -91,8 +109,8 @@ suite('ConfigurationRegistry', () => { } }); - const overrides1 = [{ overrides: { 'config': { a: 1, b: 2 } }, source: 'source1' }]; - const overrides2 = [{ overrides: { 'config': { a: 2, c: 3 } }, source: 'source2' }]; + const overrides1 = [{ overrides: { 'config': { a: 1, b: 2 } }, source: { id: 'source1', displayName: 'source1' } }]; + const overrides2 = [{ overrides: { 'config': { a: 2, c: 3 } }, source: { id: 'source2', displayName: 'source2' } }]; configurationRegistry.registerDefaultConfigurations(overrides1); configurationRegistry.registerDefaultConfigurations(overrides2); diff --git a/src/vs/platform/configuration/test/common/configurations.test.ts b/src/vs/platform/configuration/test/common/configurations.test.ts index eb02aec4f9a2a..63f8d33bfee50 100644 --- a/src/vs/platform/configuration/test/common/configurations.test.ts +++ b/src/vs/platform/configuration/test/common/configurations.test.ts @@ -386,7 +386,7 @@ suite('DefaultConfiguration', () => { } } }, - source: 'source1' + source: { id: 'source1', displayName: 'source1' } }; const node2 = { @@ -398,7 +398,7 @@ suite('DefaultConfiguration', () => { } } }, - source: 'source2' + source: { id: 'source2', displayName: 'source2' } }; configurationRegistry.registerDefaultConfigurations([node1]); configurationRegistry.registerDefaultConfigurations([node2]); diff --git a/src/vs/workbench/api/common/configurationExtensionPoint.ts b/src/vs/workbench/api/common/configurationExtensionPoint.ts index b5a56b231e854..8b7c408c76628 100644 --- a/src/vs/workbench/api/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/api/common/configurationExtensionPoint.ts @@ -160,11 +160,17 @@ defaultConfigurationExtPoint.setHandler((extensions, { added, removed }) => { const addedDefaultConfigurations = added.map(extension => { const overrides: IStringDictionary = objects.deepClone(extension.value); for (const key of Object.keys(overrides)) { + const registeredPropertyScheme = registeredProperties[key]; + if (registeredPropertyScheme?.disallowConfigurationDefault) { + extension.collector.warn(nls.localize('config.property.preventDefaultConfiguration.warning', "Cannot register configuration defaults for '{0}'. This setting does not allow contributing configuration defaults.", key)); + delete overrides[key]; + continue; + } if (!OVERRIDE_PROPERTY_REGEX.test(key)) { - const registeredPropertyScheme = registeredProperties[key]; if (registeredPropertyScheme?.scope && !allowedScopes.includes(registeredPropertyScheme.scope)) { extension.collector.warn(nls.localize('config.property.defaultConfiguration.warning', "Cannot register configuration defaults for '{0}'. Only defaults for machine-overridable, window, resource and language overridable scoped settings are supported.", key)); delete overrides[key]; + continue; } } } diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index 6806be01e945f..b85da3db794d2 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -560,7 +560,8 @@ configurationRegistry.registerConfiguration({ type: 'object', description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces."), default: { configurations: [], compounds: [] }, - $ref: launchSchemaId + $ref: launchSchemaId, + disallowConfigurationDefault: true }, 'debug.focusWindowOnBreak': { type: 'boolean', diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index b44f1e122353e..c1bac6f869193 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -1260,9 +1260,9 @@ class RegisterConfigurationSchemasContribution extends Disposable implements IWo type: 'object', description: localize('configurationDefaults.description', 'Contribute defaults for configurations'), properties: Object.assign({}, - machineOverridableSettings.properties, - windowSettings.properties, - resourceSettings.properties + this.filterDefaultOverridableProperties(machineOverridableSettings.properties), + this.filterDefaultOverridableProperties(windowSettings.properties), + this.filterDefaultOverridableProperties(resourceSettings.properties) ), patternProperties: { [OVERRIDE_PROPERTY_PATTERN]: { @@ -1316,6 +1316,16 @@ class RegisterConfigurationSchemasContribution extends Disposable implements IWo }); return result; } + + private filterDefaultOverridableProperties(properties: IStringDictionary): IStringDictionary { + const result: IStringDictionary = {}; + Object.entries(properties).forEach(([key, value]) => { + if (!value.disallowConfigurationDefault) { + result[key] = value; + } + }); + return result; + } } class ResetConfigurationDefaultsOverridesCache extends Disposable implements IWorkbenchContribution { @@ -1365,7 +1375,7 @@ class UpdateExperimentalSettingsDefaults extends Disposable implements IWorkbenc } catch (error) {/*ignore */ } } if (Object.keys(overrides).length) { - this.configurationRegistry.registerDefaultConfigurations([{ overrides, source: localize('experimental', "Experiments") }]); + this.configurationRegistry.registerDefaultConfigurations([{ overrides }]); } } } From 6864b950ef0483bf4a2d85fd83559c76b26ec1e0 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 4 Jul 2024 08:40:48 -0700 Subject: [PATCH 651/755] Skip flaky terminal tabs test Part of #216564 --- test/smoke/src/areas/terminal/terminal-tabs.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/smoke/src/areas/terminal/terminal-tabs.test.ts b/test/smoke/src/areas/terminal/terminal-tabs.test.ts index cbe672bbc1f2d..4ff156c6069d0 100644 --- a/test/smoke/src/areas/terminal/terminal-tabs.test.ts +++ b/test/smoke/src/areas/terminal/terminal-tabs.test.ts @@ -36,7 +36,8 @@ export function setup() { await terminal.assertSingleTab({ name }); }); - it('should reset the tab name to the default value when no name is provided', async () => { + // TODO: Flaky https://github.com/microsoft/vscode/issues/216564 + it.skip('should reset the tab name to the default value when no name is provided', async () => { await terminal.createTerminal(); const defaultName = await terminal.getSingleTabName(); const name = 'my terminal name'; From 1cdc3cdcb3cdc56e47e72afaef955e31ad300fa6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 4 Jul 2024 08:55:58 -0700 Subject: [PATCH 652/755] Always make room in terminal gutter even is shell integration is off Fixes #219970 --- .../contrib/terminal/browser/media/terminal.css | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/terminal.css b/src/vs/workbench/contrib/terminal/browser/media/terminal.css index c3ee3fb42d7ef..b531e31130f02 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/terminal.css +++ b/src/vs/workbench/contrib/terminal/browser/media/terminal.css @@ -73,8 +73,8 @@ } .monaco-workbench .xterm { - /* All terminals have at least 10px left/right edge padding and 2 padding on the bottom (so underscores on last line are visible */ - padding: 0 10px 2px; + /* All terminals have at least 20px left, 10px right edge padding and 2 padding on the bottom (so underscores on last line are visible) */ + padding: 0 10px 2px 20px; } .monaco-workbench .terminal-editor .xterm, @@ -130,15 +130,6 @@ .xterm.xterm-cursor-pointer .xterm-screen { cursor: pointer; } .xterm.column-select.focus .xterm-screen { cursor: crosshair; } -.monaco-workbench .terminal-editor .xterm { - padding-left: 20px !important; -} - -.monaco-workbench .pane-body.integrated-terminal .terminal-group .monaco-split-view2.horizontal .split-view-view:first-child .xterm, -.integrated-terminal.shell-integration .xterm { - padding-left: 20px !important; -} - .monaco-workbench .terminal-editor .terminal-group .monaco-split-view2.horizontal .split-view-view:last-child .xterm, .monaco-workbench .pane-body.integrated-terminal .terminal-group .monaco-split-view2.horizontal .split-view-view:last-child .xterm { padding-right: 20px; From 60c991e9ef45f94c84a1b9ada4557da40077cf74 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 4 Jul 2024 09:01:56 -0700 Subject: [PATCH 653/755] xterm@5.6.0-beta.36 Fixes #219979 --- package.json | 16 +++--- remote/package.json | 16 +++--- remote/web/package.json | 14 +++--- remote/web/yarn.lock | 66 ++++++++++++------------- remote/yarn.lock | 76 ++++++++++++++-------------- yarn.lock | 107 +++++++++++++++------------------------- 6 files changed, 135 insertions(+), 160 deletions(-) diff --git a/package.json b/package.json index 92e269b5a3fc7..bfec4be89e000 100644 --- a/package.json +++ b/package.json @@ -82,14 +82,14 @@ "@vscode/windows-mutex": "^0.5.0", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-clipboard": "0.2.0-beta.4", - "@xterm/addon-image": "0.9.0-beta.21", - "@xterm/addon-search": "0.16.0-beta.21", - "@xterm/addon-serialize": "0.14.0-beta.21", - "@xterm/addon-unicode11": "0.9.0-beta.21", - "@xterm/addon-webgl": "0.19.0-beta.21", - "@xterm/headless": "5.6.0-beta.21", - "@xterm/xterm": "5.6.0-beta.21", + "@xterm/addon-clipboard": "0.2.0-beta.19", + "@xterm/addon-image": "0.9.0-beta.36", + "@xterm/addon-search": "0.16.0-beta.36", + "@xterm/addon-serialize": "0.14.0-beta.36", + "@xterm/addon-unicode11": "0.9.0-beta.36", + "@xterm/addon-webgl": "0.19.0-beta.36", + "@xterm/headless": "5.6.0-beta.36", + "@xterm/xterm": "5.6.0-beta.36", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", "jschardet": "3.1.2", diff --git a/remote/package.json b/remote/package.json index 5b0e80182eaac..e39eb2215d2c4 100644 --- a/remote/package.json +++ b/remote/package.json @@ -14,14 +14,14 @@ "@vscode/vscode-languagedetection": "1.0.21", "@vscode/windows-process-tree": "^0.6.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-clipboard": "0.2.0-beta.4", - "@xterm/addon-image": "0.9.0-beta.21", - "@xterm/addon-search": "0.16.0-beta.21", - "@xterm/addon-serialize": "0.14.0-beta.21", - "@xterm/addon-unicode11": "0.9.0-beta.21", - "@xterm/addon-webgl": "0.19.0-beta.21", - "@xterm/headless": "5.6.0-beta.21", - "@xterm/xterm": "5.6.0-beta.21", + "@xterm/addon-clipboard": "0.2.0-beta.19", + "@xterm/addon-image": "0.9.0-beta.36", + "@xterm/addon-search": "0.16.0-beta.36", + "@xterm/addon-serialize": "0.14.0-beta.36", + "@xterm/addon-unicode11": "0.9.0-beta.36", + "@xterm/addon-webgl": "0.19.0-beta.36", + "@xterm/headless": "5.6.0-beta.36", + "@xterm/xterm": "5.6.0-beta.36", "cookie": "^0.4.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", diff --git a/remote/web/package.json b/remote/web/package.json index a6c6353246045..320980c976195 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -7,13 +7,13 @@ "@microsoft/1ds-post-js": "^3.2.13", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/vscode-languagedetection": "1.0.21", - "@xterm/addon-clipboard": "0.2.0-beta.4", - "@xterm/addon-image": "0.9.0-beta.21", - "@xterm/addon-search": "0.16.0-beta.21", - "@xterm/addon-serialize": "0.14.0-beta.21", - "@xterm/addon-unicode11": "0.9.0-beta.21", - "@xterm/addon-webgl": "0.19.0-beta.21", - "@xterm/xterm": "5.6.0-beta.21", + "@xterm/addon-clipboard": "0.2.0-beta.19", + "@xterm/addon-image": "0.9.0-beta.36", + "@xterm/addon-search": "0.16.0-beta.36", + "@xterm/addon-serialize": "0.14.0-beta.36", + "@xterm/addon-unicode11": "0.9.0-beta.36", + "@xterm/addon-webgl": "0.19.0-beta.36", + "@xterm/xterm": "5.6.0-beta.36", "jschardet": "3.1.2", "tas-client-umd": "0.2.0", "vscode-oniguruma": "1.7.0", diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index 3a330eae06164..1eb4c1605974f 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -48,42 +48,42 @@ resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" integrity sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g== -"@xterm/addon-clipboard@0.2.0-beta.4": - version "0.2.0-beta.4" - resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.4.tgz#9911baaebfbc07a698ae62366a596bfdeac8fa7e" - integrity sha512-p2KGTFUDK4YFthCgfsv2wT66JDTZPcIuoWeDT+TmSFbS1smDPTMCyM/rDDkGY+duHRcQsIMVzGC+2NRb/exX6A== +"@xterm/addon-clipboard@0.2.0-beta.19": + version "0.2.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.19.tgz#da2ea7a0d6e51383d4a21cbb04fb7fbd9db7d853" + integrity sha512-A/NxJQoOq21kE1ykZ07Cw3IxD5cQFxba1iMxnSFvWGVC71ZdHGwUveLeY8nHWEL8PfLsZxAgIzlMTfWgfkQ+CA== dependencies: js-base64 "^3.7.5" -"@xterm/addon-image@0.9.0-beta.21": - version "0.9.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.21.tgz#64fe50ee623f3e518574e1cbbe649cc0c0d60265" - integrity sha512-kTArrrS7K5+WYTTO8Ktt1aYxKTO4/jUm3KmyvPVjf9iw7OhLtG9mU+X9dXo56DTAqmbIUfJgY3OQbWffcyNk7w== - -"@xterm/addon-search@0.16.0-beta.21": - version "0.16.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.21.tgz#b8a20e83c1ff24afa675c3723244b2068255688d" - integrity sha512-RVn8yRx+w6R7abWiIttyAR0+Myh+XCYOLAkwco3iIYgzlztmox3Qp6YNzWJj0G8iwSvzxaSu7Fbjbb2PXTOSIg== - -"@xterm/addon-serialize@0.14.0-beta.21": - version "0.14.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.21.tgz#a074c5fdd2105c07574e6848babefef2905d84cb" - integrity sha512-Eg1QT2WG0pAIV+RrPv921+dVQvQqMhoFv2DQfMYDcqNbD2mTvIbX/ecEMb1bmn3WI0jNNomQ8UHZRFNRbDA+BA== - -"@xterm/addon-unicode11@0.9.0-beta.21": - version "0.9.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.21.tgz#dc843df701e518bc459e77dcd4fd65fe49adbb4b" - integrity sha512-IiHYZ+88m5MCoAyOHWQ4xXzecOh6FsDDr8lZpJktbFHyzYjBlIDQ6z9cJg+3ApApfo5Xosnmzjs27kf7wG2L0w== - -"@xterm/addon-webgl@0.19.0-beta.21": - version "0.19.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.21.tgz#68b92a47bf6768babd57bfbaf3ac97a7c670d8df" - integrity sha512-YV8Aaxp4QokXXehSCJ7NvudZKPDyBiXv4HqENqDpQllCj4hOWC5xJYSoFoPtu5+UhlzfqqvYRX/Il7QegPFPDg== - -"@xterm/xterm@5.6.0-beta.21": - version "5.6.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.21.tgz#87a4e45752e5708cffc5c583d7f15e107313eb4e" - integrity sha512-1tLJaGudNSg1hEC+ZwUU7PiUvzURzKB5v1IRaJdmZK81ZCxvEF6Qfo281pTZsZFnv2iOWqFEC0C5uRmBXLm0lQ== +"@xterm/addon-image@0.9.0-beta.36": + version "0.9.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.36.tgz#79024103c48f4e401ca15afe49fad4f3834c023c" + integrity sha512-m8c5OfJBzPYfv90mSgc0bX/P+qUsgczVajHW+kE59UoC311ng13IlCg6a4bJHb2EHqGsq19fIrYCn6+JsMdRsQ== + +"@xterm/addon-search@0.16.0-beta.36": + version "0.16.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.36.tgz#22deda3250552f24de05f8112299d15f3fe90f01" + integrity sha512-lN66vYpKvNBxbvtJXLbuidirirmIzySXnl8JvarcrDaw4HlqluOvvjEdVYKofWV5ZGSaPfIAijwJW1f0KjUhJw== + +"@xterm/addon-serialize@0.14.0-beta.36": + version "0.14.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.36.tgz#1407c13fe1bd869ad4f26e7b7da4e7fa87442021" + integrity sha512-6KpzHlQIuHakPv70dKhQp8f6e9hk4q1fNuuTD1rEzDg8DeKRfUDjorw1vPkKTB/DD+3zaMUBtg7DFVVEi+/+Cw== + +"@xterm/addon-unicode11@0.9.0-beta.36": + version "0.9.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.36.tgz#158dcdd707a466958a256a960e5d9a967a97a9dc" + integrity sha512-BKP2ml0fYOHnfaTp0LorSluNXjHRSEwf3yrD3K6jEZfYTBePhee1TAxOdNH/TdqwNYZYaYHaK87A5mSuYpKPBQ== + +"@xterm/addon-webgl@0.19.0-beta.36": + version "0.19.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.36.tgz#8926a0434e5ce74eee12a965c06cd5f601391f18" + integrity sha512-bJA1enVNlIMRkBU9i7i8qX26Zs2/CrGedREW5WI0NZUAn0IHlatWlj3aOfTuI2MYWUPGE8ul30PyipYP6P+fmA== + +"@xterm/xterm@5.6.0-beta.36": + version "5.6.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.36.tgz#fd0fd598b67e3bcba61a59bb1a33b131ad86eea3" + integrity sha512-YtFKQIggbvV2brWifksZAtLi447j0DFdoSRoq4vQi/N7KFC0pguGdG3YzYkDOyqoeLMPu569e2b5oevMe6d2aQ== js-base64@^3.7.5: version "3.7.7" diff --git a/remote/yarn.lock b/remote/yarn.lock index 54318a1a76296..9b0e1ec44b59f 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -122,47 +122,47 @@ resolved "https://registry.yarnpkg.com/@vscode/windows-registry/-/windows-registry-1.1.0.tgz#03dace7c29c46f658588b9885b9580e453ad21f9" integrity sha512-5AZzuWJpGscyiMOed0IuyEwt6iKmV5Us7zuwCDCFYMIq7tsvooO9BUiciywsvuthGz6UG4LSpeDeCxvgMVhnIw== -"@xterm/addon-clipboard@0.2.0-beta.4": - version "0.2.0-beta.4" - resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.4.tgz#9911baaebfbc07a698ae62366a596bfdeac8fa7e" - integrity sha512-p2KGTFUDK4YFthCgfsv2wT66JDTZPcIuoWeDT+TmSFbS1smDPTMCyM/rDDkGY+duHRcQsIMVzGC+2NRb/exX6A== +"@xterm/addon-clipboard@0.2.0-beta.19": + version "0.2.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.19.tgz#da2ea7a0d6e51383d4a21cbb04fb7fbd9db7d853" + integrity sha512-A/NxJQoOq21kE1ykZ07Cw3IxD5cQFxba1iMxnSFvWGVC71ZdHGwUveLeY8nHWEL8PfLsZxAgIzlMTfWgfkQ+CA== dependencies: js-base64 "^3.7.5" -"@xterm/addon-image@0.9.0-beta.21": - version "0.9.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.21.tgz#64fe50ee623f3e518574e1cbbe649cc0c0d60265" - integrity sha512-kTArrrS7K5+WYTTO8Ktt1aYxKTO4/jUm3KmyvPVjf9iw7OhLtG9mU+X9dXo56DTAqmbIUfJgY3OQbWffcyNk7w== - -"@xterm/addon-search@0.16.0-beta.21": - version "0.16.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.21.tgz#b8a20e83c1ff24afa675c3723244b2068255688d" - integrity sha512-RVn8yRx+w6R7abWiIttyAR0+Myh+XCYOLAkwco3iIYgzlztmox3Qp6YNzWJj0G8iwSvzxaSu7Fbjbb2PXTOSIg== - -"@xterm/addon-serialize@0.14.0-beta.21": - version "0.14.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.21.tgz#a074c5fdd2105c07574e6848babefef2905d84cb" - integrity sha512-Eg1QT2WG0pAIV+RrPv921+dVQvQqMhoFv2DQfMYDcqNbD2mTvIbX/ecEMb1bmn3WI0jNNomQ8UHZRFNRbDA+BA== - -"@xterm/addon-unicode11@0.9.0-beta.21": - version "0.9.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.21.tgz#dc843df701e518bc459e77dcd4fd65fe49adbb4b" - integrity sha512-IiHYZ+88m5MCoAyOHWQ4xXzecOh6FsDDr8lZpJktbFHyzYjBlIDQ6z9cJg+3ApApfo5Xosnmzjs27kf7wG2L0w== - -"@xterm/addon-webgl@0.19.0-beta.21": - version "0.19.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.21.tgz#68b92a47bf6768babd57bfbaf3ac97a7c670d8df" - integrity sha512-YV8Aaxp4QokXXehSCJ7NvudZKPDyBiXv4HqENqDpQllCj4hOWC5xJYSoFoPtu5+UhlzfqqvYRX/Il7QegPFPDg== - -"@xterm/headless@5.6.0-beta.21": - version "5.6.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.21.tgz#110fa33b59f4bf2d1de188e318bb944c8d774e97" - integrity sha512-RtKsv7KZb/ee8hwkvMNYuUofDoBR/KWUjoB5mo10C+dHyDJcMYiG2k48cAvcaJRjPH721iOELORKQk3NAlowkg== - -"@xterm/xterm@5.6.0-beta.21": - version "5.6.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.21.tgz#87a4e45752e5708cffc5c583d7f15e107313eb4e" - integrity sha512-1tLJaGudNSg1hEC+ZwUU7PiUvzURzKB5v1IRaJdmZK81ZCxvEF6Qfo281pTZsZFnv2iOWqFEC0C5uRmBXLm0lQ== +"@xterm/addon-image@0.9.0-beta.36": + version "0.9.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.36.tgz#79024103c48f4e401ca15afe49fad4f3834c023c" + integrity sha512-m8c5OfJBzPYfv90mSgc0bX/P+qUsgczVajHW+kE59UoC311ng13IlCg6a4bJHb2EHqGsq19fIrYCn6+JsMdRsQ== + +"@xterm/addon-search@0.16.0-beta.36": + version "0.16.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.36.tgz#22deda3250552f24de05f8112299d15f3fe90f01" + integrity sha512-lN66vYpKvNBxbvtJXLbuidirirmIzySXnl8JvarcrDaw4HlqluOvvjEdVYKofWV5ZGSaPfIAijwJW1f0KjUhJw== + +"@xterm/addon-serialize@0.14.0-beta.36": + version "0.14.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.36.tgz#1407c13fe1bd869ad4f26e7b7da4e7fa87442021" + integrity sha512-6KpzHlQIuHakPv70dKhQp8f6e9hk4q1fNuuTD1rEzDg8DeKRfUDjorw1vPkKTB/DD+3zaMUBtg7DFVVEi+/+Cw== + +"@xterm/addon-unicode11@0.9.0-beta.36": + version "0.9.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.36.tgz#158dcdd707a466958a256a960e5d9a967a97a9dc" + integrity sha512-BKP2ml0fYOHnfaTp0LorSluNXjHRSEwf3yrD3K6jEZfYTBePhee1TAxOdNH/TdqwNYZYaYHaK87A5mSuYpKPBQ== + +"@xterm/addon-webgl@0.19.0-beta.36": + version "0.19.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.36.tgz#8926a0434e5ce74eee12a965c06cd5f601391f18" + integrity sha512-bJA1enVNlIMRkBU9i7i8qX26Zs2/CrGedREW5WI0NZUAn0IHlatWlj3aOfTuI2MYWUPGE8ul30PyipYP6P+fmA== + +"@xterm/headless@5.6.0-beta.36": + version "5.6.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.36.tgz#cf3e690024019eac2e22d87e0e9f04da6e99cfa9" + integrity sha512-X0Te4ssxcVZ3/YlYEjzN+4w5e4f3Ni/kdjBUKoyZSRpA1+Er54HC/I3t1jc4amqI9xysnVwhq+Ey+LjygIfALw== + +"@xterm/xterm@5.6.0-beta.36": + version "5.6.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.36.tgz#fd0fd598b67e3bcba61a59bb1a33b131ad86eea3" + integrity sha512-YtFKQIggbvV2brWifksZAtLi447j0DFdoSRoq4vQi/N7KFC0pguGdG3YzYkDOyqoeLMPu569e2b5oevMe6d2aQ== agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" diff --git a/yarn.lock b/yarn.lock index 466eaf63f251d..d3ccc9b18cb82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1976,47 +1976,47 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@xterm/addon-clipboard@0.2.0-beta.4": - version "0.2.0-beta.4" - resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.4.tgz#9911baaebfbc07a698ae62366a596bfdeac8fa7e" - integrity sha512-p2KGTFUDK4YFthCgfsv2wT66JDTZPcIuoWeDT+TmSFbS1smDPTMCyM/rDDkGY+duHRcQsIMVzGC+2NRb/exX6A== +"@xterm/addon-clipboard@0.2.0-beta.19": + version "0.2.0-beta.19" + resolved "https://registry.yarnpkg.com/@xterm/addon-clipboard/-/addon-clipboard-0.2.0-beta.19.tgz#da2ea7a0d6e51383d4a21cbb04fb7fbd9db7d853" + integrity sha512-A/NxJQoOq21kE1ykZ07Cw3IxD5cQFxba1iMxnSFvWGVC71ZdHGwUveLeY8nHWEL8PfLsZxAgIzlMTfWgfkQ+CA== dependencies: js-base64 "^3.7.5" -"@xterm/addon-image@0.9.0-beta.21": - version "0.9.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.21.tgz#64fe50ee623f3e518574e1cbbe649cc0c0d60265" - integrity sha512-kTArrrS7K5+WYTTO8Ktt1aYxKTO4/jUm3KmyvPVjf9iw7OhLtG9mU+X9dXo56DTAqmbIUfJgY3OQbWffcyNk7w== - -"@xterm/addon-search@0.16.0-beta.21": - version "0.16.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.21.tgz#b8a20e83c1ff24afa675c3723244b2068255688d" - integrity sha512-RVn8yRx+w6R7abWiIttyAR0+Myh+XCYOLAkwco3iIYgzlztmox3Qp6YNzWJj0G8iwSvzxaSu7Fbjbb2PXTOSIg== - -"@xterm/addon-serialize@0.14.0-beta.21": - version "0.14.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.21.tgz#a074c5fdd2105c07574e6848babefef2905d84cb" - integrity sha512-Eg1QT2WG0pAIV+RrPv921+dVQvQqMhoFv2DQfMYDcqNbD2mTvIbX/ecEMb1bmn3WI0jNNomQ8UHZRFNRbDA+BA== - -"@xterm/addon-unicode11@0.9.0-beta.21": - version "0.9.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.21.tgz#dc843df701e518bc459e77dcd4fd65fe49adbb4b" - integrity sha512-IiHYZ+88m5MCoAyOHWQ4xXzecOh6FsDDr8lZpJktbFHyzYjBlIDQ6z9cJg+3ApApfo5Xosnmzjs27kf7wG2L0w== - -"@xterm/addon-webgl@0.19.0-beta.21": - version "0.19.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.21.tgz#68b92a47bf6768babd57bfbaf3ac97a7c670d8df" - integrity sha512-YV8Aaxp4QokXXehSCJ7NvudZKPDyBiXv4HqENqDpQllCj4hOWC5xJYSoFoPtu5+UhlzfqqvYRX/Il7QegPFPDg== - -"@xterm/headless@5.6.0-beta.21": - version "5.6.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.21.tgz#110fa33b59f4bf2d1de188e318bb944c8d774e97" - integrity sha512-RtKsv7KZb/ee8hwkvMNYuUofDoBR/KWUjoB5mo10C+dHyDJcMYiG2k48cAvcaJRjPH721iOELORKQk3NAlowkg== - -"@xterm/xterm@5.6.0-beta.21": - version "5.6.0-beta.21" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.21.tgz#87a4e45752e5708cffc5c583d7f15e107313eb4e" - integrity sha512-1tLJaGudNSg1hEC+ZwUU7PiUvzURzKB5v1IRaJdmZK81ZCxvEF6Qfo281pTZsZFnv2iOWqFEC0C5uRmBXLm0lQ== +"@xterm/addon-image@0.9.0-beta.36": + version "0.9.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.9.0-beta.36.tgz#79024103c48f4e401ca15afe49fad4f3834c023c" + integrity sha512-m8c5OfJBzPYfv90mSgc0bX/P+qUsgczVajHW+kE59UoC311ng13IlCg6a4bJHb2EHqGsq19fIrYCn6+JsMdRsQ== + +"@xterm/addon-search@0.16.0-beta.36": + version "0.16.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.16.0-beta.36.tgz#22deda3250552f24de05f8112299d15f3fe90f01" + integrity sha512-lN66vYpKvNBxbvtJXLbuidirirmIzySXnl8JvarcrDaw4HlqluOvvjEdVYKofWV5ZGSaPfIAijwJW1f0KjUhJw== + +"@xterm/addon-serialize@0.14.0-beta.36": + version "0.14.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.14.0-beta.36.tgz#1407c13fe1bd869ad4f26e7b7da4e7fa87442021" + integrity sha512-6KpzHlQIuHakPv70dKhQp8f6e9hk4q1fNuuTD1rEzDg8DeKRfUDjorw1vPkKTB/DD+3zaMUBtg7DFVVEi+/+Cw== + +"@xterm/addon-unicode11@0.9.0-beta.36": + version "0.9.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.9.0-beta.36.tgz#158dcdd707a466958a256a960e5d9a967a97a9dc" + integrity sha512-BKP2ml0fYOHnfaTp0LorSluNXjHRSEwf3yrD3K6jEZfYTBePhee1TAxOdNH/TdqwNYZYaYHaK87A5mSuYpKPBQ== + +"@xterm/addon-webgl@0.19.0-beta.36": + version "0.19.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.19.0-beta.36.tgz#8926a0434e5ce74eee12a965c06cd5f601391f18" + integrity sha512-bJA1enVNlIMRkBU9i7i8qX26Zs2/CrGedREW5WI0NZUAn0IHlatWlj3aOfTuI2MYWUPGE8ul30PyipYP6P+fmA== + +"@xterm/headless@5.6.0-beta.36": + version "5.6.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.6.0-beta.36.tgz#cf3e690024019eac2e22d87e0e9f04da6e99cfa9" + integrity sha512-X0Te4ssxcVZ3/YlYEjzN+4w5e4f3Ni/kdjBUKoyZSRpA1+Er54HC/I3t1jc4amqI9xysnVwhq+Ey+LjygIfALw== + +"@xterm/xterm@5.6.0-beta.36": + version "5.6.0-beta.36" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.6.0-beta.36.tgz#fd0fd598b67e3bcba61a59bb1a33b131ad86eea3" + integrity sha512-YtFKQIggbvV2brWifksZAtLi447j0DFdoSRoq4vQi/N7KFC0pguGdG3YzYkDOyqoeLMPu569e2b5oevMe6d2aQ== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -9467,7 +9467,7 @@ streamx@^2.18.0: optionalDependencies: bare-events "^2.2.0" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9502,15 +9502,6 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9564,7 +9555,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9592,13 +9583,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10763,7 +10747,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10798,15 +10782,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From d8ddc28be0e1da789d0a59580af4d50fde07d55d Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Thu, 4 Jul 2024 09:37:08 -0700 Subject: [PATCH 654/755] cli: honor --connection-token-file in serve-web (#219041) net: gracefully disconnect better from remote This adds in a step to gracefully disconnect (send a "disconnect" message and then await the flush) before closing the workbench. In some cases, like Remote - SSH, sending messages is more async than others. In the exec server connection we handle a `zlib.flate` stream to compress data to and from the VS Code server, and its API is asynchronous, so this lets us ensure the stream is drained before giving the go-ahead to close up shop This lifecycle phase is a little awkward and I ended it putting it directly in the lifecycle service: we don't want to do this in `onWillShutdown` because some contributions want to save data to the remote workspace, and if shutdown is vetoed it would leave a broken state. But `onDidShutdown` is synchronous and already depended upon by several other points, and changing that also felt a bit risky. cc @alexdima Refs #211462, will require some small adoption in Remote - SSH to close. --- .../lifecycle/common/lifecycleService.ts | 8 +++---- .../electron-sandbox/lifecycleService.ts | 24 +++++++++++++++++-- .../remote/browser/remoteAgentService.ts | 2 +- .../common/abstractRemoteAgentService.ts | 22 ++++++++--------- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/services/lifecycle/common/lifecycleService.ts b/src/vs/workbench/services/lifecycle/common/lifecycleService.ts index 09eee47815500..92006c0a5777d 100644 --- a/src/vs/workbench/services/lifecycle/common/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/common/lifecycleService.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter } from 'vs/base/common/event'; import { Barrier } from 'vs/base/common/async'; +import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ILifecycleService, WillShutdownEvent, StartupKind, LifecyclePhase, LifecyclePhaseToString, ShutdownReason, BeforeShutdownErrorEvent, InternalBeforeShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { ILogService } from 'vs/platform/log/common/log'; import { mark } from 'vs/base/common/performance'; +import { ILogService } from 'vs/platform/log/common/log'; import { IStorageService, StorageScope, StorageTarget, WillSaveStateReason } from 'vs/platform/storage/common/storage'; +import { BeforeShutdownErrorEvent, ILifecycleService, InternalBeforeShutdownEvent, LifecyclePhase, LifecyclePhaseToString, ShutdownReason, StartupKind, WillShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; export abstract class AbstractLifecycleService extends Disposable implements ILifecycleService { @@ -44,7 +44,7 @@ export abstract class AbstractLifecycleService extends Disposable implements ILi constructor( @ILogService protected readonly logService: ILogService, - @IStorageService protected readonly storageService: IStorageService + @IStorageService protected readonly storageService: IStorageService, ) { super(); diff --git a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts index 0434e6ded592c..90da4ac5afa12 100644 --- a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts @@ -11,19 +11,22 @@ import { ILogService } from 'vs/platform/log/common/log'; import { AbstractLifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycleService'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { INativeHostService } from 'vs/platform/native/common/native'; -import { Promises, disposableTimeout, raceCancellation } from 'vs/base/common/async'; +import { Promises, disposableTimeout, raceCancellation, timeout } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; export class NativeLifecycleService extends AbstractLifecycleService { private static readonly BEFORE_SHUTDOWN_WARNING_DELAY = 5000; private static readonly WILL_SHUTDOWN_WARNING_DELAY = 800; + private static readonly MAX_GRACEFUL_REMOTE_DISCONNECT_TIME = 3000; constructor( @INativeHostService private readonly nativeHostService: INativeHostService, @IStorageService storageService: IStorageService, - @ILogService logService: ILogService + @ILogService logService: ILogService, + @IRemoteAgentService private readonly remoteAgentService: IRemoteAgentService, ) { super(logService, storageService); @@ -66,6 +69,10 @@ export class NativeLifecycleService extends AbstractLifecycleService { // trigger onWillShutdown events and joining await this.handleWillShutdown(reply.reason); + // now that all services have stored their data, it's safe to terminate + // the remote connection gracefully before synchronously saying we're shut down + await this.handleRemoteAgentDisconnect(); + // trigger onDidShutdown event now that we know we will quit this._onDidShutdown.fire(); @@ -74,6 +81,19 @@ export class NativeLifecycleService extends AbstractLifecycleService { }); } + private async handleRemoteAgentDisconnect(): Promise { + const longRunningWarning = disposableTimeout(() => { + this.logService.warn(`[lifecycle] the remote agent is taking a long time to disconnect, waiting...`); + }, NativeLifecycleService.BEFORE_SHUTDOWN_WARNING_DELAY); + + await Promise.race([ + this.remoteAgentService.endConnection(), + timeout(NativeLifecycleService.MAX_GRACEFUL_REMOTE_DISCONNECT_TIME), + ]); + + longRunningWarning.dispose(); + } + protected async handleBeforeShutdown(reason: ShutdownReason): Promise { const logService = this.logService; diff --git a/src/vs/workbench/services/remote/browser/remoteAgentService.ts b/src/vs/workbench/services/remote/browser/remoteAgentService.ts index ee12dd5b07060..b28ab9c941b9e 100644 --- a/src/vs/workbench/services/remote/browser/remoteAgentService.ts +++ b/src/vs/workbench/services/remote/browser/remoteAgentService.ts @@ -27,7 +27,7 @@ export class RemoteAgentService extends AbstractRemoteAgentService implements IR @IProductService productService: IProductService, @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService, @ISignService signService: ISignService, - @ILogService logService: ILogService + @ILogService logService: ILogService, ) { super(remoteSocketFactoryService, userDataProfileService, environmentService, productService, remoteAuthorityResolverService, signService, logService); } diff --git a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts index fe802daf50b8e..914c0a91081f9 100644 --- a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts @@ -3,23 +3,23 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IChannel, IServerChannel, getDelayedChannel, IPCLogger } from 'vs/base/parts/ipc/common/ipc'; +import { getDelayedChannel, IChannel, IPCLogger, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/common/ipc.net'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IDiagnosticInfo, IDiagnosticInfoOptions } from 'vs/platform/diagnostics/common/diagnostics'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IProductService } from 'vs/platform/product/common/productService'; import { connectRemoteAgentManagement, IConnectionOptions, ManagementPersistentConnection, PersistentConnectionEvent } from 'vs/platform/remote/common/remoteAgentConnection'; -import { IExtensionHostExitInfo, IRemoteAgentConnection, IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { IRemoteAgentEnvironment, RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { RemoteAgentConnectionContext, IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; -import { RemoteExtensionEnvironmentChannelClient } from 'vs/workbench/services/remote/common/remoteAgentEnvironmentChannel'; -import { IDiagnosticInfoOptions, IDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; -import { Emitter } from 'vs/base/common/event'; +import { IRemoteSocketFactoryService } from 'vs/platform/remote/common/remoteSocketFactoryService'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryData, TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; -import { IProductService } from 'vs/platform/product/common/productService'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { RemoteExtensionEnvironmentChannelClient } from 'vs/workbench/services/remote/common/remoteAgentEnvironmentChannel'; +import { IExtensionHostExitInfo, IRemoteAgentConnection, IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; -import { IRemoteSocketFactoryService } from 'vs/platform/remote/common/remoteSocketFactoryService'; export abstract class AbstractRemoteAgentService extends Disposable implements IRemoteAgentService { @@ -35,7 +35,7 @@ export abstract class AbstractRemoteAgentService extends Disposable implements I @IProductService productService: IProductService, @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, @ISignService signService: ISignService, - @ILogService logService: ILogService + @ILogService logService: ILogService, ) { super(); if (this._environmentService.remoteAuthority) { From 63e93de60858653c647c17f9e30b41abf2dac4a3 Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 5 Jul 2024 02:00:07 +0900 Subject: [PATCH 655/755] fix: use xcode >= 15.1 to address broken builds on macOS <= 12 (#219991) --- build/.cachesalt | 2 +- build/azure-pipelines/darwin/product-build-darwin.yml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/build/.cachesalt b/build/.cachesalt index 4a19f329eb108..d7d415d321357 100644 --- a/build/.cachesalt +++ b/build/.cachesalt @@ -1 +1 @@ -2024-05-25T03:29:59.419Z +2024-07-04T16:31:11.121Z diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 8b4bda1c6a2f2..11f69d735ac23 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -78,6 +78,14 @@ steps: - script: | set -e + # Refs https://github.com/microsoft/vscode/issues/219893#issuecomment-2209313109 + sudo xcode-select --switch /Applications/Xcode_15.2.app + condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true')) + displayName: Switch to Xcode >= 15.1 + + - script: | + set -e + c++ --version python3 -m pip install setuptools for i in {1..5}; do # try 5 times From 6eaf6487a4d8301b981036bfa53976546eb6694f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 Jul 2024 19:28:48 +0200 Subject: [PATCH 656/755] make sure to reset known embeddings models (#219994) --- src/vs/workbench/api/common/extHostEmbedding.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/api/common/extHostEmbedding.ts b/src/vs/workbench/api/common/extHostEmbedding.ts index f99cd387c62c1..4c712aee9e8f4 100644 --- a/src/vs/workbench/api/common/extHostEmbedding.ts +++ b/src/vs/workbench/api/common/extHostEmbedding.ts @@ -39,6 +39,7 @@ export class ExtHostEmbeddings implements ExtHostEmbeddingsShape { this._provider.set(handle, { id: embeddingsModel, provider }); return toDisposable(() => { + this._allKnownModels.delete(embeddingsModel); this._proxy.$unregisterEmbeddingProvider(handle); this._provider.delete(handle); }); From 82104a3a6cf8713b81e5bbd97960dbf5c82a816a Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 4 Jul 2024 23:30:30 +0200 Subject: [PATCH 657/755] Proxy Basic Auth --- src/vs/code/electron-main/app.ts | 7 +- src/vs/platform/native/common/native.ts | 2 + .../native}/electron-main/auth.ts | 137 ++++++++++-------- .../electron-main/nativeHostMainService.ts | 9 +- .../request/browser/requestService.ts | 6 +- src/vs/platform/request/common/request.ts | 16 ++ src/vs/platform/request/common/requestIpc.ts | 7 +- .../platform/request/node/requestService.ts | 6 +- .../test/common/userDataSyncClient.ts | 3 +- .../common/userDataSyncStoreService.test.ts | 1 + .../api/browser/mainThreadWorkspace.ts | 6 +- .../workbench/api/common/extHost.protocol.ts | 2 + .../workbench/api/common/extHostWorkspace.ts | 6 + src/vs/workbench/api/node/proxyResolver.ts | 30 +++- .../electron-sandbox/requestService.ts | 6 +- .../electron-sandbox/workbenchTestServices.ts | 2 + 16 files changed, 173 insertions(+), 73 deletions(-) rename src/vs/{code => platform/native}/electron-main/auth.ts (64%) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 890691d24ef26..ca405dd725d77 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -25,7 +25,7 @@ import { getDelayedChannel, ProxyChannel, StaticRouter } from 'vs/base/parts/ipc import { Server as ElectronIPCServer } from 'vs/base/parts/ipc/electron-main/ipc.electron'; import { Client as MessagePortClient } from 'vs/base/parts/ipc/electron-main/ipc.mp'; import { Server as NodeIPCServer } from 'vs/base/parts/ipc/node/ipc.net'; -import { ProxyAuthHandler } from 'vs/code/electron-main/auth'; +import { IProxyAuthService, ProxyAuthService } from 'vs/platform/native/electron-main/auth'; import { localize } from 'vs/nls'; import { IBackupMainService } from 'vs/platform/backup/electron-main/backup'; import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService'; @@ -586,7 +586,7 @@ export class CodeApplication extends Disposable { const appInstantiationService = await this.initServices(machineId, sqmId, devDeviceId, sharedProcessReady); // Auth Handler - this._register(appInstantiationService.createInstance(ProxyAuthHandler)); + appInstantiationService.invokeFunction(accessor => accessor.get(IProxyAuthService)); // Transient profiles handler this._register(appInstantiationService.createInstance(UserDataProfilesHandler)); @@ -1094,6 +1094,9 @@ export class CodeApplication extends Disposable { // Utility Process Worker services.set(IUtilityProcessWorkerMainService, new SyncDescriptor(UtilityProcessWorkerMainService, undefined, true)); + // Proxy Auth + services.set(IProxyAuthService, new SyncDescriptor(ProxyAuthService)); + // Init services that require it await Promises.settled([ backupMainService.initialize(), diff --git a/src/vs/platform/native/common/native.ts b/src/vs/platform/native/common/native.ts index 4c035680fb7b1..9489592a76650 100644 --- a/src/vs/platform/native/common/native.ts +++ b/src/vs/platform/native/common/native.ts @@ -11,6 +11,7 @@ import { ISerializableCommandAction } from 'vs/platform/action/common/action'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IV8Profile } from 'vs/platform/profiling/common/profiling'; +import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; import { IPartsSplash } from 'vs/platform/theme/common/themeService'; import { IColorScheme, IOpenedAuxiliaryWindow, IOpenedMainWindow, IOpenEmptyWindowOptions, IOpenWindowOptions, IPoint, IRectangle, IWindowOpenable } from 'vs/platform/window/common/window'; @@ -184,6 +185,7 @@ export interface ICommonNativeHostService { // Connectivity resolveProxy(url: string): Promise; + lookupAuthorization(authInfo: AuthInfo): Promise; loadCertificates(): Promise; findFreePort(startPort: number, giveUpAfter: number, timeout: number, stride?: number): Promise; diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/platform/native/electron-main/auth.ts similarity index 64% rename from src/vs/code/electron-main/auth.ts rename to src/vs/platform/native/electron-main/auth.ts index bf2a99f601c69..4d6bd8b5ffaa9 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/platform/native/electron-main/auth.ts @@ -3,14 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, AuthenticationResponseDetails, AuthInfo, Event as ElectronEvent, WebContents } from 'electron'; +import { app, AuthenticationResponseDetails, AuthInfo as ElectronAuthInfo, Event as ElectronEvent } from 'electron'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { hash } from 'vs/base/common/hash'; import { Disposable } from 'vs/base/common/lifecycle'; import { generateUuid } from 'vs/base/common/uuid'; import { IEncryptionMainService } from 'vs/platform/encryption/common/encryptionService'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; +import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; import { StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IApplicationStorageMainService } from 'vs/platform/storage/electron-main/storageMainService'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; @@ -20,49 +22,29 @@ interface ElectronAuthenticationResponseDetails extends AuthenticationResponseDe } type LoginEvent = { - event: ElectronEvent; + event?: ElectronEvent; authInfo: AuthInfo; - req: ElectronAuthenticationResponseDetails; - - callback: (username?: string, password?: string) => void; + callback?: (username?: string, password?: string) => void; }; -type Credentials = { - username: string; - password: string; -}; +export const IProxyAuthService = createDecorator('proxyAuthService'); -enum ProxyAuthState { - - /** - * Initial state: we will try to use stored credentials - * first to reply to the auth challenge. - */ - Initial = 1, - - /** - * We used stored credentials and are still challenged, - * so we will show a login dialog next. - */ - StoredCredentialsUsed, - - /** - * Finally, if we showed a login dialog already, we will - * not show any more login dialogs until restart to reduce - * the UI noise. - */ - LoginDialogShown +export interface IProxyAuthService { + lookupAuthorization(authInfo: AuthInfo): Promise; } -export class ProxyAuthHandler extends Disposable { +export class ProxyAuthService extends Disposable implements IProxyAuthService { + + declare readonly _serviceBrand: undefined; private readonly PROXY_CREDENTIALS_SERVICE_KEY = 'proxy-credentials://'; - private pendingProxyResolve: Promise | undefined = undefined; + private pendingProxyResolves = new Map>(); + private currentDialog: Promise | undefined = undefined; - private state = ProxyAuthState.Initial; + private cancelledAuthInfoHashes = new Set(); - private sessionCredentials: Credentials | undefined = undefined; + private sessionCredentials = new Map(); constructor( @ILogService private readonly logService: ILogService, @@ -76,39 +58,45 @@ export class ProxyAuthHandler extends Disposable { } private registerListeners(): void { - const onLogin = Event.fromNodeEventEmitter(app, 'login', (event: ElectronEvent, webContents: WebContents, req: ElectronAuthenticationResponseDetails, authInfo: AuthInfo, callback) => ({ event, webContents, req, authInfo, callback })); + const onLogin = Event.fromNodeEventEmitter(app, 'login', (event: ElectronEvent, req: ElectronAuthenticationResponseDetails, authInfo: ElectronAuthInfo, callback) => ({ event, authInfo: { ...authInfo, attempt: req.firstAuthAttempt ? 1 : 2 }, callback } satisfies LoginEvent)); this._register(onLogin(this.onLogin, this)); } - private async onLogin({ event, authInfo, req, callback }: LoginEvent): Promise { + async lookupAuthorization(authInfo: AuthInfo): Promise { + return this.onLogin({ authInfo }); + } + + private async onLogin({ event, authInfo, callback }: LoginEvent): Promise { if (!authInfo.isProxy) { return; // only for proxy } - if (!this.pendingProxyResolve && this.state === ProxyAuthState.LoginDialogShown && req.firstAuthAttempt) { - this.logService.trace('auth#onLogin (proxy) - exit - proxy dialog already shown'); - - return; // only one dialog per session at max (except when firstAuthAttempt: false which indicates a login problem) - } - // Signal we handle this event on our own, otherwise // Electron will ignore our provided credentials. - event.preventDefault(); + event?.preventDefault(); + + // Compute a hash over the authentication info to be used + // with the credentials store to return the right credentials + // given the properties of the auth request + // (see https://github.com/microsoft/vscode/issues/109497) + const authInfoHash = String(hash({ scheme: authInfo.scheme, host: authInfo.host, port: authInfo.port })); let credentials: Credentials | undefined = undefined; - if (!this.pendingProxyResolve) { + let pendingProxyResolve = this.pendingProxyResolves.get(authInfoHash); + if (!pendingProxyResolve) { this.logService.trace('auth#onLogin (proxy) - no pending proxy handling found, starting new'); - this.pendingProxyResolve = this.resolveProxyCredentials(authInfo); + pendingProxyResolve = this.resolveProxyCredentials(authInfo, authInfoHash); + this.pendingProxyResolves.set(authInfoHash, pendingProxyResolve); try { - credentials = await this.pendingProxyResolve; + credentials = await pendingProxyResolve; } finally { - this.pendingProxyResolve = undefined; + this.pendingProxyResolves.delete(authInfoHash); } } else { this.logService.trace('auth#onLogin (proxy) - pending proxy handling found'); - credentials = await this.pendingProxyResolve; + credentials = await pendingProxyResolve; } // According to Electron docs, it is fine to call back without @@ -118,14 +106,15 @@ export class ProxyAuthHandler extends Disposable { // > If `callback` is called without a username or password, the authentication // > request will be cancelled and the authentication error will be returned to the // > page. - callback(credentials?.username, credentials?.password); + callback?.(credentials?.username, credentials?.password); + return credentials; } - private async resolveProxyCredentials(authInfo: AuthInfo): Promise { + private async resolveProxyCredentials(authInfo: AuthInfo, authInfoHash: string): Promise { this.logService.trace('auth#resolveProxyCredentials (proxy) - enter'); try { - const credentials = await this.doResolveProxyCredentials(authInfo); + const credentials = await this.doResolveProxyCredentials(authInfo, authInfoHash); if (credentials) { this.logService.trace('auth#resolveProxyCredentials (proxy) - got credentials'); @@ -140,14 +129,18 @@ export class ProxyAuthHandler extends Disposable { return undefined; } - private async doResolveProxyCredentials(authInfo: AuthInfo): Promise { + private async doResolveProxyCredentials(authInfo: AuthInfo, authInfoHash: string): Promise { this.logService.trace('auth#doResolveProxyCredentials - enter', authInfo); - // Compute a hash over the authentication info to be used - // with the credentials store to return the right credentials - // given the properties of the auth request - // (see https://github.com/microsoft/vscode/issues/109497) - const authInfoHash = String(hash({ scheme: authInfo.scheme, host: authInfo.host, port: authInfo.port })); + // Reply with session credentials unless we used them already. + // In that case we need to show a login dialog again because + // they seem invalid. + if (authInfo.attempt === 1 && this.sessionCredentials.has(authInfoHash)) { + this.logService.trace('auth#doResolveProxyCredentials (proxy) - exit - found session credentials to use'); + + const { username, password } = this.sessionCredentials.get(authInfoHash)!; + return { username, password }; + } let storedUsername: string | undefined; let storedPassword: string | undefined; @@ -166,13 +159,32 @@ export class ProxyAuthHandler extends Disposable { // Reply with stored credentials unless we used them already. // In that case we need to show a login dialog again because // they seem invalid. - if (this.state !== ProxyAuthState.StoredCredentialsUsed && typeof storedUsername === 'string' && typeof storedPassword === 'string') { + if (authInfo.attempt === 1 && typeof storedUsername === 'string' && typeof storedPassword === 'string') { this.logService.trace('auth#doResolveProxyCredentials (proxy) - exit - found stored credentials to use'); - this.state = ProxyAuthState.StoredCredentialsUsed; + this.sessionCredentials.set(authInfoHash, { username: storedUsername, password: storedPassword }); return { username: storedUsername, password: storedPassword }; } + const previousDialog = this.currentDialog; + const currentDialog = this.currentDialog = (async () => { + await previousDialog; + const credentials = await this.showProxyCredentialsDialog(authInfo, authInfoHash, storedUsername, storedPassword); + if (this.currentDialog === currentDialog!) { + this.currentDialog = undefined; + } + return credentials; + })(); + return currentDialog; + } + + private async showProxyCredentialsDialog(authInfo: AuthInfo, authInfoHash: string, storedUsername: string | undefined, storedPassword: string | undefined): Promise { + if (this.cancelledAuthInfoHashes.has(authInfoHash)) { + this.logService.trace('auth#doResolveProxyCredentials (proxy) - exit - login dialog was cancelled before, not showing again'); + + return undefined; + } + // Find suitable window to show dialog: prefer to show it in the // active window because any other network request will wait on // the credentials and we want the user to present the dialog. @@ -186,14 +198,14 @@ export class ProxyAuthHandler extends Disposable { this.logService.trace(`auth#doResolveProxyCredentials (proxy) - asking window ${window.id} to handle proxy login`); // Open proxy dialog + const sessionCredentials = this.sessionCredentials.get(authInfoHash); const payload = { authInfo, - username: this.sessionCredentials?.username ?? storedUsername, // prefer to show already used username (if any) over stored - password: this.sessionCredentials?.password ?? storedPassword, // prefer to show already used password (if any) over stored + username: sessionCredentials?.username ?? storedUsername, // prefer to show already used username (if any) over stored + password: sessionCredentials?.password ?? storedPassword, // prefer to show already used password (if any) over stored replyChannel: `vscode:proxyAuthResponse:${generateUuid()}` }; window.sendWhenReady('vscode:openProxyAuthenticationDialog', CancellationToken.None, payload); - this.state = ProxyAuthState.LoginDialogShown; // Handle reply const loginDialogCredentials = await new Promise(resolve => { @@ -229,6 +241,7 @@ export class ProxyAuthHandler extends Disposable { // We did not get any credentials from the window (e.g. cancelled) else { + this.cancelledAuthInfoHashes.add(authInfoHash); resolve(undefined); } } @@ -240,7 +253,7 @@ export class ProxyAuthHandler extends Disposable { // Remember credentials for the session in case // the credentials are wrong and we show the dialog // again - this.sessionCredentials = loginDialogCredentials; + this.sessionCredentials.set(authInfoHash, loginDialogCredentials); return loginDialogCredentials; } diff --git a/src/vs/platform/native/electron-main/nativeHostMainService.ts b/src/vs/platform/native/electron-main/nativeHostMainService.ts index 2718d0fd7bd3c..dad4087ec75e2 100644 --- a/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -44,6 +44,8 @@ import { IV8Profile } from 'vs/platform/profiling/common/profiling'; import { IAuxiliaryWindowsMainService } from 'vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows'; import { IAuxiliaryWindow } from 'vs/platform/auxiliaryWindow/electron-main/auxiliaryWindow'; import { CancellationError } from 'vs/base/common/errors'; +import { IProxyAuthService } from 'vs/platform/native/electron-main/auth'; +import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; export interface INativeHostMainService extends AddFirstParameterToFunctions /* only methods, not events */, number | undefined /* window ID */> { } @@ -62,7 +64,8 @@ export class NativeHostMainService extends Disposable implements INativeHostMain @ILogService private readonly logService: ILogService, @IProductService private readonly productService: IProductService, @IThemeMainService private readonly themeMainService: IThemeMainService, - @IWorkspacesManagementMainService private readonly workspacesManagementMainService: IWorkspacesManagementMainService + @IWorkspacesManagementMainService private readonly workspacesManagementMainService: IWorkspacesManagementMainService, + @IProxyAuthService private readonly proxyAuthService: IProxyAuthService ) { super(); } @@ -772,6 +775,10 @@ export class NativeHostMainService extends Disposable implements INativeHostMain return session?.resolveProxy(url); } + async lookupAuthorization(_windowId: number | undefined, authInfo: AuthInfo): Promise { + return this.proxyAuthService.lookupAuthorization(authInfo); + } + async loadCertificates(_windowId: number | undefined): Promise { const proxyAgent = await import('@vscode/proxy-agent'); return proxyAgent.loadSystemCertificates({ log: this.logService }); diff --git a/src/vs/platform/request/browser/requestService.ts b/src/vs/platform/request/browser/requestService.ts index f0fc3d6879001..70f4e65bcbc95 100644 --- a/src/vs/platform/request/browser/requestService.ts +++ b/src/vs/platform/request/browser/requestService.ts @@ -8,7 +8,7 @@ import { request } from 'vs/base/parts/request/browser/request'; import { IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILoggerService } from 'vs/platform/log/common/log'; -import { AbstractRequestService, IRequestService } from 'vs/platform/request/common/request'; +import { AbstractRequestService, AuthInfo, Credentials, IRequestService } from 'vs/platform/request/common/request'; /** * This service exposes the `request` API, while using the global @@ -36,6 +36,10 @@ export class RequestService extends AbstractRequestService implements IRequestSe return undefined; // not implemented in the web } + async lookupAuthorization(authInfo: AuthInfo): Promise { + return undefined; // not implemented in the web + } + async loadCertificates(): Promise { return []; // not implemented in the web } diff --git a/src/vs/platform/request/common/request.ts b/src/vs/platform/request/common/request.ts index 06265628b94a7..e8574d11f7fba 100644 --- a/src/vs/platform/request/common/request.ts +++ b/src/vs/platform/request/common/request.ts @@ -16,12 +16,27 @@ import { Registry } from 'vs/platform/registry/common/platform'; export const IRequestService = createDecorator('requestService'); +export interface AuthInfo { + isProxy: boolean; + scheme: string; + host: string; + port: number; + realm: string; + attempt: number; +} + +export interface Credentials { + username: string; + password: string; +} + export interface IRequestService { readonly _serviceBrand: undefined; request(options: IRequestOptions, token: CancellationToken): Promise; resolveProxy(url: string): Promise; + lookupAuthorization(authInfo: AuthInfo): Promise; loadCertificates(): Promise; } @@ -80,6 +95,7 @@ export abstract class AbstractRequestService extends Disposable implements IRequ abstract request(options: IRequestOptions, token: CancellationToken): Promise; abstract resolveProxy(url: string): Promise; + abstract lookupAuthorization(authInfo: AuthInfo): Promise; abstract loadCertificates(): Promise; } diff --git a/src/vs/platform/request/common/requestIpc.ts b/src/vs/platform/request/common/requestIpc.ts index 421106ebff6d0..b489a52dacc2b 100644 --- a/src/vs/platform/request/common/requestIpc.ts +++ b/src/vs/platform/request/common/requestIpc.ts @@ -8,7 +8,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { IHeaders, IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; -import { IRequestService } from 'vs/platform/request/common/request'; +import { AuthInfo, Credentials, IRequestService } from 'vs/platform/request/common/request'; type RequestResponse = [ { @@ -34,6 +34,7 @@ export class RequestChannel implements IServerChannel { return [{ statusCode: res.statusCode, headers: res.headers }, buffer]; }); case 'resolveProxy': return this.service.resolveProxy(args[0]); + case 'lookupAuthorization': return this.service.lookupAuthorization(args[0]); case 'loadCertificates': return this.service.loadCertificates(); } throw new Error('Invalid call'); @@ -55,6 +56,10 @@ export class RequestChannelClient implements IRequestService { return this.channel.call('resolveProxy', [url]); } + async lookupAuthorization(authInfo: AuthInfo): Promise { + return this.channel.call<{ username: string; password: string } | undefined>('lookupAuthorization', [authInfo]); + } + async loadCertificates(): Promise { return this.channel.call('loadCertificates'); } diff --git a/src/vs/platform/request/node/requestService.ts b/src/vs/platform/request/node/requestService.ts index 23f8f0d44c850..dd2165c1ce312 100644 --- a/src/vs/platform/request/node/requestService.ts +++ b/src/vs/platform/request/node/requestService.ts @@ -17,7 +17,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; import { getResolvedShellEnv } from 'vs/platform/shell/node/shellEnv'; import { ILogService, ILoggerService } from 'vs/platform/log/common/log'; -import { AbstractRequestService, IRequestService } from 'vs/platform/request/common/request'; +import { AbstractRequestService, AuthInfo, Credentials, IRequestService } from 'vs/platform/request/common/request'; import { Agent, getProxyAgent } from 'vs/platform/request/node/proxy'; import { createGunzip } from 'zlib'; @@ -110,6 +110,10 @@ export class RequestService extends AbstractRequestService implements IRequestSe return undefined; // currently not implemented in node } + async lookupAuthorization(authInfo: AuthInfo): Promise { + return undefined; // currently not implemented in node + } + async loadCertificates(): Promise { const proxyAgent = await import('@vscode/proxy-agent'); return proxyAgent.loadSystemCertificates({ log: this.logService }); diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index ea8260323a9ca..3cd97bda58505 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -26,7 +26,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import product from 'vs/platform/product/common/product'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IRequestService } from 'vs/platform/request/common/request'; +import { AuthInfo, Credentials, IRequestService } from 'vs/platform/request/common/request'; import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; @@ -188,6 +188,7 @@ export class UserDataSyncTestServer implements IRequestService { constructor(private readonly rateLimit = Number.MAX_SAFE_INTEGER, private readonly retryAfter?: number) { } async resolveProxy(url: string): Promise { return url; } + async lookupAuthorization(authInfo: AuthInfo): Promise { return undefined; } async loadCertificates(): Promise { return []; } async request(options: IRequestOptions, token: CancellationToken): Promise { diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts b/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts index 2a69d9d3ebfbb..03f68a73da9b0 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncStoreService.test.ts @@ -414,6 +414,7 @@ suite('UserDataSyncRequestsSession', () => { _serviceBrand: undefined, async request() { return { res: { headers: {} }, stream: newWriteableBufferStream() }; }, async resolveProxy() { return undefined; }, + async lookupAuthorization() { return undefined; }, async loadCertificates() { return []; } }; diff --git a/src/vs/workbench/api/browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts index 180932b6d6d26..09ff17ad867c8 100644 --- a/src/vs/workbench/api/browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -14,7 +14,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILabelService } from 'vs/platform/label/common/label'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IRequestService } from 'vs/platform/request/common/request'; +import { AuthInfo, Credentials, IRequestService } from 'vs/platform/request/common/request'; import { WorkspaceTrustRequestOptions, IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; import { IWorkspace, IWorkspaceContextService, WorkbenchState, isUntitledWorkspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; @@ -223,6 +223,10 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { return this._requestService.resolveProxy(url); } + $lookupAuthorization(authInfo: AuthInfo): Promise { + return this._requestService.lookupAuthorization(authInfo); + } + $loadCertificates(): Promise { return this._requestService.loadCertificates(); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index b1dcc4981a372..7bbab68a618c7 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -82,6 +82,7 @@ import { IFileQueryBuilderOptions, ITextQueryBuilderOptions } from 'vs/workbench import * as search from 'vs/workbench/services/search/common/search'; import { ISaveProfileResult } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import type { TerminalShellExecutionCommandLineConfidence } from 'vscode'; +import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; export interface IWorkspaceData extends IStaticWorkspaceData { folders: { uri: UriComponents; name: string; index: number }[]; @@ -1385,6 +1386,7 @@ export interface MainThreadWorkspaceShape extends IDisposable { $saveAll(includeUntitled?: boolean): Promise; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents; name?: string }[]): Promise; $resolveProxy(url: string): Promise; + $lookupAuthorization(authInfo: AuthInfo): Promise; $loadCertificates(): Promise; $requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; $registerEditSessionIdentityProvider(handle: number, scheme: string): void; diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index 5b3cd328aaae4..61c5b48357c17 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -33,12 +33,14 @@ import { IRawFileMatch2, ITextSearchResult, resultIsMatch } from 'vs/workbench/s import * as vscode from 'vscode'; import { ExtHostWorkspaceShape, IRelativePatternDto, IWorkspaceData, MainContext, MainThreadMessageOptions, MainThreadMessageServiceShape, MainThreadWorkspaceShape } from './extHost.protocol'; import { revive } from 'vs/base/common/marshalling'; +import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; export interface IExtHostWorkspaceProvider { getWorkspaceFolder2(uri: vscode.Uri, resolveParent?: boolean): Promise; resolveWorkspaceFolder(uri: vscode.Uri): Promise; getWorkspaceFolders2(): Promise; resolveProxy(url: string): Promise; + lookupAuthorization(authInfo: AuthInfo): Promise; loadCertificates(): Promise; } @@ -626,6 +628,10 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac return this._proxy.$resolveProxy(url); } + lookupAuthorization(authInfo: AuthInfo): Promise { + return this._proxy.$lookupAuthorization(authInfo); + } + loadCertificates(): Promise { return this._proxy.$loadCertificates(); } diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index ac373f9739bb1..e39d10af2d34b 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -17,6 +17,7 @@ import { URI } from 'vs/base/common/uri'; import { ILogService, LogLevel as LogServiceLevel } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { LogLevel, createHttpPatch, createProxyResolver, createTlsPatch, ProxySupportSetting, ProxyAgentParams, createNetPatch, loadSystemCertificates } from '@vscode/proxy-agent'; +import { AuthInfo } from 'vs/platform/request/common/request'; const systemCertificatesV2Default = false; @@ -32,7 +33,7 @@ export function connectProxyResolver( const doUseHostProxy = typeof useHostProxy === 'boolean' ? useHostProxy : !initData.remote.isRemote; const params: ProxyAgentParams = { resolveProxy: url => extHostWorkspace.resolveProxy(url), - lookupProxyAuthorization: lookupProxyAuthorization.bind(undefined, extHostLogService, mainThreadTelemetry, configProvider, {}, initData.remote.isRemote), + lookupProxyAuthorization: lookupProxyAuthorization.bind(undefined, extHostWorkspace, extHostLogService, mainThreadTelemetry, configProvider, {}, initData.remote.isRemote), getProxyURL: () => configProvider.getConfiguration('http').get('proxy'), getProxySupport: () => configProvider.getConfiguration('http').get('proxySupport') || 'off', getNoProxyConfig: () => configProvider.getConfiguration('http').get('noProxy') || [], @@ -140,6 +141,7 @@ function configureModuleLoading(extensionService: ExtHostExtensionService, looku } async function lookupProxyAuthorization( + extHostWorkspace: IExtHostWorkspaceProvider, extHostLogService: ILogService, mainThreadTelemetry: MainThreadTelemetryShape, configProvider: ExtHostConfigProvider, @@ -147,7 +149,7 @@ async function lookupProxyAuthorization( isRemote: boolean, proxyURL: string, proxyAuthenticate: string | string[] | undefined, - state: { kerberosRequested?: boolean } + state: { kerberosRequested?: boolean; basicAuthAttempt?: number } ): Promise { const cached = proxyAuthenticateCache[proxyURL]; if (proxyAuthenticate) { @@ -171,6 +173,30 @@ async function lookupProxyAuthorization( } catch (err) { extHostLogService.error('ProxyResolver#lookupProxyAuthorization Kerberos authentication failed', err); } + } else { + const header = authenticate.find(a => /^Basic( |$)/i.test(a)); + if (header) { + try { + state.basicAuthAttempt = (state.basicAuthAttempt || 0) + 1; + const realm = / realm="([^"]+)"/i.exec(header)?.[1]; + extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication lookup', `proxyURL:${proxyURL}`, `realm:${realm}`); + const url = new URL(proxyURL); + const authInfo: AuthInfo = { + scheme: 'basic', + host: url.hostname, + port: Number(url.port), + realm: realm || '', + isProxy: true, + attempt: state.basicAuthAttempt, + }; + const credentials = await extHostWorkspace.lookupAuthorization(authInfo); + if (credentials) { + return 'Basic ' + Buffer.from(`${credentials.username}:${credentials.password}`).toString('base64'); + } + } catch (err) { + extHostLogService.error('ProxyResolver#lookupProxyAuthorization Kerberos authentication failed', err); + } + } } return undefined; } diff --git a/src/vs/workbench/services/request/electron-sandbox/requestService.ts b/src/vs/workbench/services/request/electron-sandbox/requestService.ts index 0a249b6eaaadf..a0597f10ee3a2 100644 --- a/src/vs/workbench/services/request/electron-sandbox/requestService.ts +++ b/src/vs/workbench/services/request/electron-sandbox/requestService.ts @@ -7,7 +7,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ILoggerService } from 'vs/platform/log/common/log'; import { RequestService } from 'vs/platform/request/browser/requestService'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IRequestService } from 'vs/platform/request/common/request'; +import { AuthInfo, Credentials, IRequestService } from 'vs/platform/request/common/request'; import { INativeHostService } from 'vs/platform/native/common/native'; export class NativeRequestService extends RequestService { @@ -24,6 +24,10 @@ export class NativeRequestService extends RequestService { return this.nativeHostService.resolveProxy(url); } + override async lookupAuthorization(authInfo: AuthInfo): Promise { + return this.nativeHostService.lookupAuthorization(authInfo); + } + override async loadCertificates(): Promise { return this.nativeHostService.loadCertificates(); } diff --git a/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts b/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts index 45f6d6d98f43f..3864abba55b82 100644 --- a/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts @@ -48,6 +48,7 @@ import { NativeWorkingCopyBackupService } from 'vs/workbench/services/workingCop import { CancellationToken } from 'vs/base/common/cancellation'; import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; import { UserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; +import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; export class TestSharedProcessService implements ISharedProcessService { @@ -144,6 +145,7 @@ export class TestNativeHostService implements INativeHostService { async openDevTools(options?: Partial & INativeHostOptions | undefined): Promise { } async toggleDevTools(): Promise { } async resolveProxy(url: string): Promise { return undefined; } + async lookupAuthorization(authInfo: AuthInfo): Promise { return undefined; } async loadCertificates(): Promise { return []; } async findFreePort(startPort: number, giveUpAfter: number, timeout: number, stride?: number): Promise { return -1; } async readClipboardText(type?: 'selection' | 'clipboard' | undefined): Promise { return ''; } From 30a5144f2dd900486db702247ea6b7350a193be4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2024 09:29:33 +0200 Subject: [PATCH 658/755] disable failing test for FF (#220033) re https://github.com/microsoft/vscode/issues/219843 --- .../test/browser/wordOperations.test.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts index 51cdccc4fd350..d90d44fd2d6a8 100644 --- a/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts @@ -5,6 +5,7 @@ import assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { isFirefox } from 'vs/base/common/platform'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -179,7 +180,11 @@ suite('WordOperations', () => { assert.deepStrictEqual(actual, EXPECTED); }); - test('cursorWordLeft - Recognize words', () => { + test('cursorWordLeft - Recognize words', function () { + if (isFirefox) { + // https://github.com/microsoft/vscode/issues/219843 + return this.skip(); + } const EXPECTED = [ '|/* |ã“ã‚Œ|ã¯|テスト|ã§ã™ |/*', ].join('\n'); @@ -399,7 +404,11 @@ suite('WordOperations', () => { assert.deepStrictEqual(actual, EXPECTED); }); - test('cursorWordRight - Recognize words', () => { + test('cursorWordRight - Recognize words', function () { + if (isFirefox) { + // https://github.com/microsoft/vscode/issues/219843 + return this.skip(); + } const EXPECTED = [ '/*| ã“ã‚Œ|ã¯|テスト|ã§ã™|/*|', ].join('\n'); From 6fdeabf40b3774c7fb0514cab66c03d549df89b3 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 5 Jul 2024 09:32:00 +0200 Subject: [PATCH 659/755] Fix argument order (#220034) --- src/vs/platform/native/electron-main/auth.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/native/electron-main/auth.ts b/src/vs/platform/native/electron-main/auth.ts index 4d6bd8b5ffaa9..953a74ec1589a 100644 --- a/src/vs/platform/native/electron-main/auth.ts +++ b/src/vs/platform/native/electron-main/auth.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, AuthenticationResponseDetails, AuthInfo as ElectronAuthInfo, Event as ElectronEvent } from 'electron'; +import { app, AuthenticationResponseDetails, AuthInfo as ElectronAuthInfo, Event as ElectronEvent, WebContents } from 'electron'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { hash } from 'vs/base/common/hash'; @@ -58,7 +58,7 @@ export class ProxyAuthService extends Disposable implements IProxyAuthService { } private registerListeners(): void { - const onLogin = Event.fromNodeEventEmitter(app, 'login', (event: ElectronEvent, req: ElectronAuthenticationResponseDetails, authInfo: ElectronAuthInfo, callback) => ({ event, authInfo: { ...authInfo, attempt: req.firstAuthAttempt ? 1 : 2 }, callback } satisfies LoginEvent)); + const onLogin = Event.fromNodeEventEmitter(app, 'login', (event: ElectronEvent, _webContents: WebContents, req: ElectronAuthenticationResponseDetails, authInfo: ElectronAuthInfo, callback) => ({ event, authInfo: { ...authInfo, attempt: req.firstAuthAttempt ? 1 : 2 }, callback } satisfies LoginEvent)); this._register(onLogin(this.onLogin, this)); } From 2d1ad358919d1f63c43a517e6f17c15942f9dd29 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:52:44 +0200 Subject: [PATCH 660/755] Fix editor commands context (#219971) * editor commands debt * :lipstick: * :lipstick: * :lipstick: * reorder context correctly * :lipstick: * :lipstick: --- .../browser/parts/editor/editorActions.ts | 37 +- .../browser/parts/editor/editorCommands.ts | 501 ++++++------------ .../parts/editor/editorCommandsContext.ts | 200 +++++++ .../contrib/files/browser/fileCommands.ts | 9 +- .../multiDiffEditor/browser/actions.ts | 24 +- .../browser/controller/coreActions.ts | 7 +- 6 files changed, 420 insertions(+), 358 deletions(-) create mode 100644 src/vs/workbench/browser/parts/editor/editorCommandsContext.ts diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 63e2103bcee60..eb9d1534e1137 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -13,7 +13,7 @@ import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/bro import { GoFilter, IHistoryService } from 'vs/workbench/services/history/common/history'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { CLOSE_EDITOR_COMMAND_ID, MOVE_ACTIVE_EDITOR_COMMAND_ID, ActiveEditorMoveCopyArguments, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, SPLIT_EDITOR_DOWN, splitEditor, LAYOUT_EDITOR_GROUPS_COMMAND_ID, UNPIN_EDITOR_COMMAND_ID, COPY_ACTIVE_EDITOR_COMMAND_ID, SPLIT_EDITOR, resolveCommandsContext, getCommandsContext, TOGGLE_MAXIMIZE_EDITOR_GROUP, MOVE_EDITOR_INTO_NEW_WINDOW_COMMAND_ID, COPY_EDITOR_INTO_NEW_WINDOW_COMMAND_ID, MOVE_EDITOR_GROUP_INTO_NEW_WINDOW_COMMAND_ID, COPY_EDITOR_GROUP_INTO_NEW_WINDOW_COMMAND_ID, NEW_EMPTY_EDITOR_WINDOW_COMMAND_ID as NEW_EMPTY_EDITOR_WINDOW_COMMAND_ID, resolveEditorsContext, getEditorsContext } from 'vs/workbench/browser/parts/editor/editorCommands'; +import { CLOSE_EDITOR_COMMAND_ID, MOVE_ACTIVE_EDITOR_COMMAND_ID, ActiveEditorMoveCopyArguments, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, SPLIT_EDITOR_DOWN, splitEditor, LAYOUT_EDITOR_GROUPS_COMMAND_ID, UNPIN_EDITOR_COMMAND_ID, COPY_ACTIVE_EDITOR_COMMAND_ID, SPLIT_EDITOR, TOGGLE_MAXIMIZE_EDITOR_GROUP, MOVE_EDITOR_INTO_NEW_WINDOW_COMMAND_ID, COPY_EDITOR_INTO_NEW_WINDOW_COMMAND_ID, MOVE_EDITOR_GROUP_INTO_NEW_WINDOW_COMMAND_ID, COPY_EDITOR_GROUP_INTO_NEW_WINDOW_COMMAND_ID, NEW_EMPTY_EDITOR_WINDOW_COMMAND_ID as NEW_EMPTY_EDITOR_WINDOW_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { IEditorGroupsService, IEditorGroup, GroupsArrangement, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder, MergeGroupMode } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -34,10 +34,10 @@ import { IKeybindingRule, KeybindingWeight } from 'vs/platform/keybinding/common import { ILogService } from 'vs/platform/log/common/log'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { ActiveEditorAvailableEditorIdsContext, ActiveEditorContext, ActiveEditorGroupEmptyContext, AuxiliaryBarVisibleContext, EditorPartMaximizedEditorGroupContext, EditorPartMultipleEditorGroupsContext, IsAuxiliaryWindowFocusedContext, MultipleEditorGroupsContext, SideBarVisibleContext } from 'vs/workbench/common/contextkeys'; -import { URI } from 'vs/base/common/uri'; import { getActiveDocument } from 'vs/base/browser/dom'; import { ICommandActionTitle } from 'vs/platform/action/common/action'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; +import { resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommandsContext'; class ExecuteCommandAction extends Action2 { @@ -62,12 +62,14 @@ abstract class AbstractSplitEditorAction extends Action2 { return preferredSideBySideGroupDirection(configurationService); } - override async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { + override async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { const editorGroupService = accessor.get(IEditorGroupsService); const configurationService = accessor.get(IConfigurationService); - const commandContext = getCommandsContext(accessor, resourceOrContext, context); - splitEditor(editorGroupService, this.getDirection(configurationService), commandContext ? [commandContext] : undefined); + const direction = this.getDirection(configurationService); + const commandContext = resolveCommandsContext(accessor, args); + + splitEditor(editorGroupService, direction, commandContext); } } @@ -1169,11 +1171,13 @@ export class ToggleMaximizeEditorGroupAction extends Action2 { }); } - override async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { + override async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { const editorGroupsService = accessor.get(IEditorGroupsService); - const { group } = resolveCommandsContext(editorGroupsService, getCommandsContext(accessor, resourceOrContext, context)); - editorGroupsService.toggleMaximizeGroup(group); + const resolvedContext = resolveCommandsContext(accessor, args); + if (resolvedContext.groupedEditors.length) { + editorGroupsService.toggleMaximizeGroup(resolvedContext.groupedEditors[0].group); + } } } @@ -2538,21 +2542,24 @@ abstract class BaseMoveCopyEditorToNewWindowAction extends Action2 { }); } - override async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) { + override async run(accessor: ServicesAccessor, ...args: unknown[]) { const editorGroupService = accessor.get(IEditorGroupsService); - const editorsContext = resolveEditorsContext(getEditorsContext(accessor, resourceOrContext, context)); - if (editorsContext.length === 0) { + const resolvedContext = resolveCommandsContext(accessor, args); + if (!resolvedContext.groupedEditors.length) { return; } const auxiliaryEditorPart = await editorGroupService.createAuxiliaryEditorPart(); - const sourceGroup = editorsContext[0].group; // only single group supported for move/copy for now - const sourceEditors = editorsContext.filter(({ group }) => group === sourceGroup); + // only single group supported for move/copy for now + const { group, editors } = resolvedContext.groupedEditors[0]; + const options = { preserveFocus: resolvedContext.preserveFocus }; + const editorsWithOptions = editors.map(editor => ({ editor, options })); + if (this.move) { - sourceGroup.moveEditors(sourceEditors, auxiliaryEditorPart.activeGroup); + group.moveEditors(editorsWithOptions, auxiliaryEditorPart.activeGroup); } else { - sourceGroup.copyEditors(sourceEditors, auxiliaryEditorPart.activeGroup); + group.copyEditors(editorsWithOptions, auxiliaryEditorPart.activeGroup); } auxiliaryEditorPart.activeGroup.focus(); diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index a8ba531496eeb..ce629242565e2 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -3,13 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getActiveElement } from 'vs/base/browser/dom'; -import { List } from 'vs/base/browser/ui/list/listWidget'; -import { coalesce, distinct } from 'vs/base/common/arrays'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { Schemas, matchesScheme } from 'vs/base/common/network'; -import { extname, isEqual } from 'vs/base/common/resources'; +import { extname } from 'vs/base/common/resources'; import { isNumber, isObject, isString, isUndefined } from 'vs/base/common/types'; import { URI, UriComponents } from 'vs/base/common/uri'; import { isDiffEditor } from 'vs/editor/browser/editorBrowser'; @@ -23,7 +20,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { EditorResolution, IEditorOptions, IResourceEditorInput, ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IListService, IOpenEvent } from 'vs/platform/list/browser/listService'; +import { IOpenEvent } from 'vs/platform/list/browser/listService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -31,17 +28,18 @@ import { ActiveGroupEditorsByMostRecentlyUsedQuickAccess } from 'vs/workbench/br import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; import { TextDiffEditor } from 'vs/workbench/browser/parts/editor/textDiffEditor'; import { ActiveEditorCanSplitInGroupContext, ActiveEditorGroupEmptyContext, ActiveEditorGroupLockedContext, ActiveEditorStickyContext, MultipleEditorGroupsContext, SideBySideEditorActiveContext, TextCompareEditorActiveContext } from 'vs/workbench/common/contextkeys'; -import { CloseDirection, EditorInputCapabilities, EditorsOrder, IEditorCommandsContext, IEditorIdentifier, IResourceDiffEditorInput, IUntitledTextResourceEditorInput, IVisibleEditorPane, isEditorCommandsContext, isEditorIdentifier, isEditorInputWithOptionsAndGroup } from 'vs/workbench/common/editor'; +import { CloseDirection, EditorInputCapabilities, EditorsOrder, IResourceDiffEditorInput, IUntitledTextResourceEditorInput, IVisibleEditorPane, isEditorInputWithOptionsAndGroup } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { EditorGroupColumn, columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn'; -import { EditorGroupLayout, GroupDirection, GroupLocation, GroupsOrder, IEditorGroup, IEditorGroupsService, IEditorReplacement, isEditorGroup, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { EditorGroupLayout, GroupDirection, GroupLocation, GroupsOrder, IEditorGroup, IEditorGroupsService, IEditorReplacement, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { DIFF_FOCUS_OTHER_SIDE, DIFF_FOCUS_PRIMARY_SIDE, DIFF_FOCUS_SECONDARY_SIDE, DIFF_OPEN_SIDE, registerDiffEditorCommands } from './diffEditorCommands'; +import { IResolvedEditorCommandsContext, resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommandsContext'; export const CLOSE_SAVED_EDITORS_COMMAND_ID = 'workbench.action.closeUnmodifiedEditors'; export const CLOSE_EDITORS_IN_GROUP_COMMAND_ID = 'workbench.action.closeEditorsInGroup'; @@ -656,50 +654,25 @@ function registerFocusEditorGroupAtIndexCommands(): void { } } -export function splitEditor(editorGroupService: IEditorGroupsService, direction: GroupDirection, contexts?: IEditorCommandsContext[]): void { - let newGroup: IEditorGroup | undefined; - let sourceGroup: IEditorGroup | undefined; - - for (const context of contexts ?? [undefined]) { - let currentGroup: IEditorGroup | undefined; - - if (context) { - currentGroup = editorGroupService.getGroup(context.groupId); - } else { - currentGroup = editorGroupService.activeGroup; - } - - if (!currentGroup) { - continue; - } - - if (!sourceGroup) { - sourceGroup = currentGroup; - } else if (sourceGroup.id !== currentGroup.id) { - continue; // Only support splitting from the same group - } +export function splitEditor(editorGroupService: IEditorGroupsService, direction: GroupDirection, resolvedContext: IResolvedEditorCommandsContext): void { + if (!resolvedContext.groupedEditors.length) { + return; + } - // Add group - if (!newGroup) { - newGroup = editorGroupService.addGroup(currentGroup, direction); - } + // Only support splitting from one source group + const { group, editors } = resolvedContext.groupedEditors[0]; + const preserveFocus = resolvedContext.preserveFocus; + const newGroup = editorGroupService.addGroup(group, direction); + for (const editorToCopy of editors) { // Split editor (if it can be split) - let editorToCopy: EditorInput | undefined; - if (context && typeof context.editorIndex === 'number') { - editorToCopy = currentGroup.getEditorByIndex(context.editorIndex); - } else { - editorToCopy = currentGroup.activeEditor ?? undefined; - } - - // Copy the editor to the new group, else create an empty group if (editorToCopy && !editorToCopy.hasCapability(EditorInputCapabilities.Singleton)) { - currentGroup.copyEditor(editorToCopy, newGroup, { preserveFocus: context?.preserveFocus }); + group.copyEditor(editorToCopy, newGroup, { preserveFocus }); } } // Focus - newGroup?.focus(); + newGroup.focus(); } function registerSplitEditorCommands() { @@ -709,9 +682,9 @@ function registerSplitEditorCommands() { { id: SPLIT_EDITOR_LEFT, direction: GroupDirection.LEFT }, { id: SPLIT_EDITOR_RIGHT, direction: GroupDirection.RIGHT } ].forEach(({ id, direction }) => { - CommandsRegistry.registerCommand(id, function (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) { - const { editors } = getEditorsContext(accessor, resourceOrContext, context); - splitEditor(accessor.get(IEditorGroupsService), direction, editors); + CommandsRegistry.registerCommand(id, function (accessor, ...args) { + const resolvedContext = resolveCommandsContext(accessor, args); + splitEditor(accessor.get(IEditorGroupsService), direction, resolvedContext); }); }); } @@ -721,14 +694,14 @@ function registerCloseEditorCommands() { // A special handler for "Close Editor" depending on context // - keybindining: do not close sticky editors, rather open the next non-sticky editor // - menu: always close editor, even sticky ones - function closeEditorHandler(accessor: ServicesAccessor, forceCloseStickyEditors: boolean, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { + function closeEditorHandler(accessor: ServicesAccessor, forceCloseStickyEditors: boolean, ...args: unknown[]): Promise { const editorGroupsService = accessor.get(IEditorGroupsService); const editorService = accessor.get(IEditorService); let keepStickyEditors: boolean | undefined = undefined; if (forceCloseStickyEditors) { keepStickyEditors = false; // explicitly close sticky editors - } else if (resourceOrContext || context) { + } else if (args.length) { keepStickyEditors = false; // we have a context, as such this command was used e.g. from the tab context menu } else { keepStickyEditors = editorGroupsService.partOptions.preventPinnedEditorClose === 'keyboard' || editorGroupsService.partOptions.preventPinnedEditorClose === 'keyboardAndMouse'; // respect setting otherwise @@ -756,17 +729,12 @@ function registerCloseEditorCommands() { } // With context: proceed to close editors as instructed - const { editors, groups } = getEditorsContext(accessor, resourceOrContext, context); - - return Promise.all(groups.map(async group => { - if (group) { - const editorsToClose = coalesce(editors - .filter(editor => editor.groupId === group.id) - .map(editor => typeof editor.editorIndex === 'number' ? group.getEditorByIndex(editor.editorIndex) : group.activeEditor)) - .filter(editor => !keepStickyEditors || !group.isSticky(editor)); + const resolvedContext = resolveCommandsContext(accessor, args); + const preserveFocus = resolvedContext.preserveFocus; - await group.closeEditors(editorsToClose, { preserveFocus: context?.preserveFocus }); - } + return Promise.all(resolvedContext.groupedEditors.map(async ({ group, editors }) => { + const editorsToClose = editors.filter(editor => !keepStickyEditors || !group.isSticky(editor)); + await group.closeEditors(editorsToClose, { preserveFocus }); })); } @@ -776,13 +744,13 @@ function registerCloseEditorCommands() { when: undefined, primary: KeyMod.CtrlCmd | KeyCode.KeyW, win: { primary: KeyMod.CtrlCmd | KeyCode.F4, secondary: [KeyMod.CtrlCmd | KeyCode.KeyW] }, - handler: (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - return closeEditorHandler(accessor, false, resourceOrContext, context); + handler: (accessor, ...args: unknown[]) => { + return closeEditorHandler(accessor, false, args); } }); - CommandsRegistry.registerCommand(CLOSE_PINNED_EDITOR_COMMAND_ID, (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - return closeEditorHandler(accessor, true /* force close pinned editors */, resourceOrContext, context); + CommandsRegistry.registerCommand(CLOSE_PINNED_EDITOR_COMMAND_ID, (accessor, ...args: unknown[]) => { + return closeEditorHandler(accessor, true /* force close pinned editors */, args); }); KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -790,12 +758,10 @@ function registerCloseEditorCommands() { weight: KeybindingWeight.WorkbenchContrib, when: undefined, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyCode.KeyW), - handler: (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - return Promise.all(getEditorsContext(accessor, resourceOrContext, context).groups.map(async group => { - if (group) { - await group.closeAllEditors({ excludeSticky: true }); - return; - } + handler: (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); + return Promise.all(resolvedContext.groupedEditors.map(async ({ group }) => { + await group.closeAllEditors({ excludeSticky: true }); })); } }); @@ -806,19 +772,12 @@ function registerCloseEditorCommands() { when: ContextKeyExpr.and(ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext), primary: KeyMod.CtrlCmd | KeyCode.KeyW, win: { primary: KeyMod.CtrlCmd | KeyCode.F4, secondary: [KeyMod.CtrlCmd | KeyCode.KeyW] }, - handler: (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { + handler: (accessor, ...args: unknown[]) => { const editorGroupService = accessor.get(IEditorGroupsService); - const commandsContext = getCommandsContext(accessor, resourceOrContext, context); - - let group: IEditorGroup | undefined; - if (commandsContext && typeof commandsContext.groupId === 'number') { - group = editorGroupService.getGroup(commandsContext.groupId); - } else { - group = editorGroupService.activeGroup; - } + const commandsContext = resolveCommandsContext(accessor, args); - if (group) { - editorGroupService.removeGroup(group); + if (commandsContext.groupedEditors.length) { + editorGroupService.removeGroup(commandsContext.groupedEditors[0].group); } } }); @@ -828,11 +787,10 @@ function registerCloseEditorCommands() { weight: KeybindingWeight.WorkbenchContrib, when: undefined, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyCode.KeyU), - handler: (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - return Promise.all(getEditorsContext(accessor, resourceOrContext, context).groups.map(async group => { - if (group) { - await group.closeEditors({ savedOnly: true, excludeSticky: true }, { preserveFocus: context?.preserveFocus }); - } + handler: (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); + return Promise.all(resolvedContext.groupedEditors.map(async ({ group }) => { + await group.closeEditors({ savedOnly: true, excludeSticky: true }, { preserveFocus: resolvedContext.preserveFocus }); })); } }); @@ -843,24 +801,19 @@ function registerCloseEditorCommands() { when: undefined, primary: undefined, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KeyT }, - handler: (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - const { editors, groups } = getEditorsContext(accessor, resourceOrContext, context); - return Promise.all(groups.map(async group => { - if (group) { - const editorsToKeep = editors - .filter(editor => editor.groupId === group.id) - .map(editor => typeof editor.editorIndex === 'number' ? group.getEditorByIndex(editor.editorIndex) : group.activeEditor); - - const editorsToClose = group.getEditors(EditorsOrder.SEQUENTIAL, { excludeSticky: true }).filter(editor => !editorsToKeep.includes(editor)); - - for (const editorToKeep of editorsToKeep) { - if (editorToKeep) { - group.pinEditor(editorToKeep); - } - } + handler: (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); - await group.closeEditors(editorsToClose, { preserveFocus: context?.preserveFocus }); + return Promise.all(resolvedContext.groupedEditors.map(async ({ group, editors }) => { + const editorsToClose = group.getEditors(EditorsOrder.SEQUENTIAL, { excludeSticky: true }).filter(editor => !editors.includes(editor)); + + for (const editorToKeep of editors) { + if (editorToKeep) { + group.pinEditor(editorToKeep); + } } + + await group.closeEditors(editorsToClose, { preserveFocus: resolvedContext.preserveFocus }); })); } }); @@ -870,16 +823,15 @@ function registerCloseEditorCommands() { weight: KeybindingWeight.WorkbenchContrib, when: undefined, primary: undefined, - handler: async (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - const editorGroupService = accessor.get(IEditorGroupsService); - - const { group, editor } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); - if (group && editor) { + handler: async (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); + if (resolvedContext.groupedEditors.length) { + const { group, editors } = resolvedContext.groupedEditors[0]; if (group.activeEditor) { group.pinEditor(group.activeEditor); } - await group.closeEditors({ direction: CloseDirection.RIGHT, except: editor, excludeSticky: true }, { preserveFocus: context?.preserveFocus }); + await group.closeEditors({ direction: CloseDirection.RIGHT, except: editors[0], excludeSticky: true }, { preserveFocus: resolvedContext.preserveFocus }); } } }); @@ -889,62 +841,64 @@ function registerCloseEditorCommands() { weight: KeybindingWeight.WorkbenchContrib, when: undefined, primary: undefined, - handler: async (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { + handler: async (accessor, ...args: unknown[]) => { const editorService = accessor.get(IEditorService); const editorResolverService = accessor.get(IEditorResolverService); const telemetryService = accessor.get(ITelemetryService); - const editorsAndGroup = resolveEditorsContext(getEditorsContext(accessor, resourceOrContext, context)); + const resolvedContext = resolveCommandsContext(accessor, args); const editorReplacements = new Map(); - for (const { editor, group } of editorsAndGroup) { - const untypedEditor = editor.toUntyped(); - if (!untypedEditor) { - return; // Resolver can only resolve untyped editors - } + for (const { group, editors } of resolvedContext.groupedEditors) { + for (const editor of editors) { + const untypedEditor = editor.toUntyped(); + if (!untypedEditor) { + return; // Resolver can only resolve untyped editors + } - untypedEditor.options = { ...editorService.activeEditorPane?.options, override: EditorResolution.PICK }; - const resolvedEditor = await editorResolverService.resolveEditor(untypedEditor, group); - if (!isEditorInputWithOptionsAndGroup(resolvedEditor)) { - return; - } + untypedEditor.options = { ...editorService.activeEditorPane?.options, override: EditorResolution.PICK }; + const resolvedEditor = await editorResolverService.resolveEditor(untypedEditor, group); + if (!isEditorInputWithOptionsAndGroup(resolvedEditor)) { + return; + } - let editorReplacementsInGroup = editorReplacements.get(group); - if (!editorReplacementsInGroup) { - editorReplacementsInGroup = []; - editorReplacements.set(group, editorReplacementsInGroup); - } + let editorReplacementsInGroup = editorReplacements.get(group); + if (!editorReplacementsInGroup) { + editorReplacementsInGroup = []; + editorReplacements.set(group, editorReplacementsInGroup); + } - editorReplacementsInGroup.push({ - editor: editor, - replacement: resolvedEditor.editor, - forceReplaceDirty: editor.resource?.scheme === Schemas.untitled, - options: resolvedEditor.options - }); - - // Telemetry - type WorkbenchEditorReopenClassification = { - owner: 'rebornix'; - comment: 'Identify how a document is reopened'; - scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'File system provider scheme for the resource' }; - ext: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'File extension for the resource' }; - from: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The editor view type the resource is switched from' }; - to: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The editor view type the resource is switched to' }; - }; - - type WorkbenchEditorReopenEvent = { - scheme: string; - ext: string; - from: string; - to: string; - }; - - telemetryService.publicLog2('workbenchEditorReopen', { - scheme: editor.resource?.scheme ?? '', - ext: editor.resource ? extname(editor.resource) : '', - from: editor.editorId ?? '', - to: resolvedEditor.editor.editorId ?? '' - }); + editorReplacementsInGroup.push({ + editor: editor, + replacement: resolvedEditor.editor, + forceReplaceDirty: editor.resource?.scheme === Schemas.untitled, + options: resolvedEditor.options + }); + + // Telemetry + type WorkbenchEditorReopenClassification = { + owner: 'rebornix'; + comment: 'Identify how a document is reopened'; + scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'File system provider scheme for the resource' }; + ext: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'File extension for the resource' }; + from: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The editor view type the resource is switched from' }; + to: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The editor view type the resource is switched to' }; + }; + + type WorkbenchEditorReopenEvent = { + scheme: string; + ext: string; + from: string; + to: string; + }; + + telemetryService.publicLog2('workbenchEditorReopen', { + scheme: editor.resource?.scheme ?? '', + ext: editor.resource ? extname(editor.resource) : '', + from: editor.editorId ?? '', + to: resolvedEditor.editor.editorId ?? '' + }); + } } // Replace editor with resolved one and make active @@ -955,11 +909,12 @@ function registerCloseEditorCommands() { } }); - CommandsRegistry.registerCommand(CLOSE_EDITORS_AND_GROUP_COMMAND_ID, async (accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { + CommandsRegistry.registerCommand(CLOSE_EDITORS_AND_GROUP_COMMAND_ID, async (accessor: ServicesAccessor, ...args: unknown[]) => { const editorGroupService = accessor.get(IEditorGroupsService); - const { group } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); - if (group) { + const resolvedContext = resolveCommandsContext(accessor, args); + if (resolvedContext.groupedEditors.length) { + const { group } = resolvedContext.groupedEditors[0]; await group.closeAllEditors(); if (group.count === 0 && editorGroupService.getGroup(group.id) /* could be gone by now */) { @@ -1002,11 +957,15 @@ function registerFocusEditorGroupWihoutWrapCommands(): void { function registerSplitEditorInGroupCommands(): void { - async function splitEditorInGroup(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - const editorGroupService = accessor.get(IEditorGroupsService); + async function splitEditorInGroup(accessor: ServicesAccessor, resolvedContext: IResolvedEditorCommandsContext): Promise { const instantiationService = accessor.get(IInstantiationService); - const { group, editor } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); + if (!resolvedContext.groupedEditors.length) { + return; + } + + const { group, editors } = resolvedContext.groupedEditors[0]; + const editor = editors[0]; if (!editor) { return; } @@ -1033,15 +992,22 @@ function registerSplitEditorInGroupCommands(): void { } }); } - run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - return splitEditorInGroup(accessor, resourceOrContext, context); + run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + return splitEditorInGroup(accessor, resolveCommandsContext(accessor, args)); } }); - async function joinEditorInGroup(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - const editorGroupService = accessor.get(IEditorGroupsService); + async function joinEditorInGroup(resolvedContext: IResolvedEditorCommandsContext): Promise { + if (!resolvedContext.groupedEditors.length) { + return; + } + + const { group, editors } = resolvedContext.groupedEditors[0]; + const editor = editors[0]; + if (!editor) { + return; + } - const { group, editor } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); if (!(editor instanceof SideBySideEditorInput)) { return; } @@ -1079,8 +1045,8 @@ function registerSplitEditorInGroupCommands(): void { } }); } - run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - return joinEditorInGroup(accessor, resourceOrContext, context); + run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + return joinEditorInGroup(resolveCommandsContext(accessor, args)); } }); @@ -1094,14 +1060,18 @@ function registerSplitEditorInGroupCommands(): void { f1: true }); } - async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - const editorGroupService = accessor.get(IEditorGroupsService); + async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + const resolvedContext = resolveCommandsContext(accessor, args); + if (!resolvedContext.groupedEditors.length) { + return; + } + + const { editors } = resolvedContext.groupedEditors[0]; - const { editor } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); - if (editor instanceof SideBySideEditorInput) { - await joinEditorInGroup(accessor, resourceOrContext, context); - } else if (editor) { - await splitEditorInGroup(accessor, resourceOrContext, context); + if (editors[0] instanceof SideBySideEditorInput) { + await joinEditorInGroup(resolvedContext); + } else if (editors[0]) { + await splitEditorInGroup(accessor, resolvedContext); } } }); @@ -1215,12 +1185,12 @@ function registerOtherEditorCommands(): void { weight: KeybindingWeight.WorkbenchContrib, when: undefined, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyCode.Enter), - handler: async (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - const editorGroupService = accessor.get(IEditorGroupsService); - - const { group, editor } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); - if (group && editor) { - return group.pinEditor(editor); + handler: async (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); + for (const { group, editors } of resolvedContext.groupedEditors) { + for (const editor of editors) { + group.pinEditor(editor); + } } } }); @@ -1236,10 +1206,9 @@ function registerOtherEditorCommands(): void { } }); - function setEditorGroupLock(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext, locked?: boolean): void { - const editorGroupService = accessor.get(IEditorGroupsService); - - const { group } = resolveCommandsContext(editorGroupService, getCommandsContext(accessor, resourceOrContext, context)); + function setEditorGroupLock(accessor: ServicesAccessor, locked: boolean | undefined, ...args: unknown[]): void { + const resolvedContext = resolveCommandsContext(accessor, args); + const group = resolvedContext.groupedEditors[0]?.group; group?.lock(locked ?? !group.isLocked); } @@ -1252,8 +1221,8 @@ function registerOtherEditorCommands(): void { f1: true }); } - async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - setEditorGroupLock(accessor, resourceOrContext, context); + async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + setEditorGroupLock(accessor, undefined, ...args); } }); @@ -1267,8 +1236,8 @@ function registerOtherEditorCommands(): void { f1: true }); } - async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - setEditorGroupLock(accessor, resourceOrContext, context, true); + async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + setEditorGroupLock(accessor, true, args); } }); @@ -1282,8 +1251,8 @@ function registerOtherEditorCommands(): void { f1: true }); } - async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - setEditorGroupLock(accessor, resourceOrContext, context, false); + async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + setEditorGroupLock(accessor, false, args); } }); @@ -1292,9 +1261,12 @@ function registerOtherEditorCommands(): void { weight: KeybindingWeight.WorkbenchContrib, when: ActiveEditorStickyContext.toNegated(), primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.Shift | KeyCode.Enter), - handler: async (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - for (const { editor, group } of resolveEditorsContext(getEditorsContext(accessor, resourceOrContext, context))) { - group.stickEditor(editor); + handler: async (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); + for (const { group, editors } of resolvedContext.groupedEditors) { + for (const editor of editors) { + group.stickEditor(editor); + } } } }); @@ -1331,9 +1303,12 @@ function registerOtherEditorCommands(): void { weight: KeybindingWeight.WorkbenchContrib, when: ActiveEditorStickyContext, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.Shift | KeyCode.Enter), - handler: async (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { - for (const { editor, group } of resolveEditorsContext(getEditorsContext(accessor, resourceOrContext, context))) { - group.unstickEditor(editor); + handler: async (accessor, ...args: unknown[]) => { + const resolvedContext = resolveCommandsContext(accessor, args); + for (const { group, editors } of resolvedContext.groupedEditors) { + for (const editor of editors) { + group.unstickEditor(editor); + } } } }); @@ -1343,16 +1318,14 @@ function registerOtherEditorCommands(): void { weight: KeybindingWeight.WorkbenchContrib, when: undefined, primary: undefined, - handler: (accessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { + handler: (accessor, ...args: unknown[]) => { const editorGroupService = accessor.get(IEditorGroupsService); const quickInputService = accessor.get(IQuickInputService); - const commandsContext = getCommandsContext(accessor, resourceOrContext, context); - if (commandsContext && typeof commandsContext.groupId === 'number') { - const group = editorGroupService.getGroup(commandsContext.groupId); - if (group) { - editorGroupService.activateGroup(group); // we need the group to be active - } + const commandsContext = resolveCommandsContext(accessor, args); + const group = commandsContext.groupedEditors[0]?.group; + if (group) { + editorGroupService.activateGroup(group); // we need the group to be active } return quickInputService.quickAccess.show(ActiveGroupEditorsByMostRecentlyUsedQuickAccess.PREFIX); @@ -1360,130 +1333,6 @@ function registerOtherEditorCommands(): void { }); } -type EditorsContext = { editors: IEditorCommandsContext[]; groups: Array }; -export function getEditorsContext(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): EditorsContext { - const editorGroupService = accessor.get(IEditorGroupsService); - const listService = accessor.get(IListService); - - const editorContext = getMultiSelectedEditorContexts(getCommandsContext(accessor, resourceOrContext, context), listService, editorGroupService); - - const activeGroup = editorGroupService.activeGroup; - if (editorContext.length === 0 && activeGroup.activeEditor) { - // add the active editor as fallback - editorContext.push({ - groupId: activeGroup.id, - editorIndex: activeGroup.getIndexOfEditor(activeGroup.activeEditor) - }); - } - - return { - editors: editorContext, - groups: distinct(editorContext.map(context => context.groupId)).map(groupId => editorGroupService.getGroup(groupId)) - }; -} - -export function resolveEditorsContext(context: EditorsContext): { editor: EditorInput; group: IEditorGroup }[] { - const { editors, groups } = context; - - const editorsAndGroup = editors.map(e => { - if (e.editorIndex === undefined) { - return undefined; - } - const group = groups.find(group => group && group.id === e.groupId); - const editor = group?.getEditorByIndex(e.editorIndex); - if (!editor || !group) { - return undefined; - } - return { editor, group }; - }); - - return coalesce(editorsAndGroup); -} - -export function getCommandsContext(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): IEditorCommandsContext | undefined { - const isUri = URI.isUri(resourceOrContext); - - const editorCommandsContext = isUri ? context : resourceOrContext ? resourceOrContext : context; - if (editorCommandsContext && isEditorCommandsContext(editorCommandsContext)) { - return editorCommandsContext; - } - - if (isUri) { - const editorGroupService = accessor.get(IEditorGroupsService); - const editorGroup = editorGroupService.getGroups(GroupsOrder.MOST_RECENTLY_ACTIVE).find(group => isEqual(group.activeEditor?.resource, resourceOrContext)); - if (editorGroup) { - return { groupId: editorGroup.index, editorIndex: editorGroup.getIndexOfEditor(editorGroup.activeEditor!) }; - } - } - - return undefined; -} - -export function resolveCommandsContext(editorGroupService: IEditorGroupsService, context?: IEditorCommandsContext): { group: IEditorGroup; editor?: EditorInput } { - - // Resolve from context - let group = context && typeof context.groupId === 'number' ? editorGroupService.getGroup(context.groupId) : undefined; - let editor = group && context && typeof context.editorIndex === 'number' ? group.getEditorByIndex(context.editorIndex) ?? undefined : undefined; - - // Fallback to active group as needed - if (!group) { - group = editorGroupService.activeGroup; - } - - // Fallback to active editor as needed - if (!editor) { - editor = group.activeEditor ?? undefined; - } - - return { group, editor }; -} - -export function getMultiSelectedEditorContexts(editorContext: IEditorCommandsContext | undefined, listService: IListService, editorGroupService: IEditorGroupsService): IEditorCommandsContext[] { - - // First check for a focused list to return the selected items from - const list = listService.lastFocusedList; - if (list instanceof List && list.getHTMLElement() === getActiveElement()) { - const elementToContext = (element: IEditorIdentifier | IEditorGroup) => { - if (isEditorGroup(element)) { - return { groupId: element.id, editorIndex: undefined }; - } - - const group = editorGroupService.getGroup(element.groupId); - - return { groupId: element.groupId, editorIndex: group ? group.getIndexOfEditor(element.editor) : -1 }; - }; - - const onlyEditorGroupAndEditor = (e: IEditorIdentifier | IEditorGroup) => isEditorGroup(e) || isEditorIdentifier(e); - - const focusedElements: Array = list.getFocusedElements().filter(onlyEditorGroupAndEditor); - const focus = editorContext ? editorContext : focusedElements.length ? focusedElements.map(elementToContext)[0] : undefined; // need to take into account when editor context is { group: group } - - if (focus) { - const selection: Array = list.getSelectedElements().filter(onlyEditorGroupAndEditor); - - if (selection.length > 1) { - return selection.map(elementToContext); - } - - return [focus]; - } - } - // Check editors selected in the group (tabs) - else { - const group = editorContext ? editorGroupService.getGroup(editorContext.groupId) : editorGroupService.activeGroup; - const editor = editorContext && editorContext.editorIndex !== undefined ? group?.getEditorByIndex(editorContext.editorIndex) : group?.activeEditor; - // If the editor is selected, return all selected editors otherwise only use the editors context - if (group && editor) { - if (group.isSelected(editor)) { - return group.selectedEditors.map(se => ({ groupId: group.id, editorIndex: group.getIndexOfEditor(se) })); - } - } - } - - // Otherwise go with passed in context - return !!editorContext ? [editorContext] : []; -} - export function setup(): void { registerActiveEditorMoveCopyCommand(); registerEditorGroupsLayoutCommands(); diff --git a/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts b/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts new file mode 100644 index 0000000000000..b0915c07703cf --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts @@ -0,0 +1,200 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { getActiveElement } from 'vs/base/browser/dom'; +import { List } from 'vs/base/browser/ui/list/listWidget'; +import { URI } from 'vs/base/common/uri'; +import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { IListService } from 'vs/platform/list/browser/listService'; +import { IEditorCommandsContext, isEditorCommandsContext, IEditorIdentifier, isEditorIdentifier } from 'vs/workbench/common/editor'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { IEditorGroup, IEditorGroupsService, isEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export interface IResolvedEditorCommandsContext { + readonly groupedEditors: { + readonly group: IEditorGroup; + readonly editors: EditorInput[]; + }[]; + readonly preserveFocus: boolean; +} + +export function resolveCommandsContext(accessor: ServicesAccessor, commandArgs: unknown[]): IResolvedEditorCommandsContext { + const editorGroupsService = accessor.get(IEditorGroupsService); + + const commandContext = getCommandsContext(accessor, commandArgs); + const preserveFocus = commandContext.length ? commandContext[0].preserveFocus || false : false; + const resolvedContext: IResolvedEditorCommandsContext = { groupedEditors: [], preserveFocus }; + + for (const editorContext of commandContext) { + const groupAndEditor = getEditorAndGroupFromContext(editorContext, editorGroupsService); + if (!groupAndEditor) { + continue; + } + + const { group, editor } = groupAndEditor; + + // Find group context if already added + let groupContext = undefined; + for (const targetGroupContext of resolvedContext.groupedEditors) { + if (targetGroupContext.group.id === group.id) { + groupContext = targetGroupContext; + break; + } + } + + // Otherwise add new group context + if (!groupContext) { + groupContext = { group, editors: [] }; + resolvedContext.groupedEditors.push(groupContext); + } + + // Add editor to group context + if (editor) { + groupContext.editors.push(editor); + } + } + + return resolvedContext; +} + +function getCommandsContext(accessor: ServicesAccessor, commandArgs: unknown[]): IEditorCommandsContext[] { + // Figure out if command is executed from a list + const listService = accessor.get(IListService); + const list = listService.lastFocusedList; + let isListAction = list instanceof List && list.getHTMLElement() === getActiveElement(); + + // Get editor context for which the command was triggered + let editorContext = getEditorContextFromCommandArgs(accessor, commandArgs, isListAction); + + // If the editor context can not be determind use the active editor + if (!editorContext) { + const editorGroupService = accessor.get(IEditorGroupsService); + const activeGroup = editorGroupService.activeGroup; + const activeEditor = activeGroup.activeEditor; + editorContext = { groupId: activeGroup.id, editorIndex: activeEditor ? activeGroup.getIndexOfEditor(activeEditor) : undefined }; + isListAction = false; + } + + const multiEditorContext = getMultiSelectContext(accessor, editorContext, isListAction); + + // Make sure the command context is the first one in the list + return moveCurrentEditorContextToFront(editorContext, multiEditorContext); +} + +function moveCurrentEditorContextToFront(editorContext: IEditorCommandsContext, multiEditorContext: IEditorCommandsContext[]): IEditorCommandsContext[] { + if (multiEditorContext.length <= 1) { + return multiEditorContext; + } + + const editorContextIndex = multiEditorContext.findIndex(context => + context.groupId === editorContext.groupId && + context.editorIndex === editorContext.editorIndex + ); + + if (editorContextIndex !== -1) { + multiEditorContext.splice(editorContextIndex, 1); + multiEditorContext.unshift(editorContext); + } else if (editorContext.editorIndex === undefined) { + multiEditorContext.unshift(editorContext); + } else { + throw new Error('Editor context not found in multi editor context'); + } + + return multiEditorContext; +} + +function getEditorContextFromCommandArgs(accessor: ServicesAccessor, commandArgs: unknown[], isListAcion: boolean): IEditorCommandsContext | undefined { + // We only know how to extraxt the command context from URI and IEditorCommandsContext arguments + const filteredArgs = commandArgs.filter(arg => isEditorCommandsContext(arg) || URI.isUri(arg)); + + // If the command arguments contain an editor context, use it + for (const arg of filteredArgs) { + if (isEditorCommandsContext(arg)) { + return arg; + } + } + + const editorService = accessor.get(IEditorService); + + // Otherwise, try to find the editor group by the URI of the resource + for (const uri of filteredArgs as URI[]) { + const editorIdentifiers = editorService.findEditors(uri); + if (editorIdentifiers.length) { + return editorIdentifiers[0]; + } + } + + const listService = accessor.get(IListService); + const editorGroupsService = accessor.get(IEditorGroupsService); + + // If there is no context in the arguments, try to find the context from the focused list + // if the action was executed from a list + if (isListAcion) { + const list = listService.lastFocusedList as List; + for (const focusedElement of list.getFocusedElements()) { + if (isGroupOrEditor(focusedElement)) { + return groupOrEditorToEditorContext(focusedElement, undefined, editorGroupsService); + } + } + } + + return undefined; +} + +function getMultiSelectContext(accessor: ServicesAccessor, editorContext: IEditorCommandsContext, isListAction: boolean): IEditorCommandsContext[] { + const listService = accessor.get(IListService); + const editorGroupsService = accessor.get(IEditorGroupsService); + + // If the action was executed from a list, return all selected editors + if (isListAction) { + const list = listService.lastFocusedList as List; + const selection = list.getSelectedElements().filter(isGroupOrEditor); + + if (selection.length > 1) { + return selection.map(e => groupOrEditorToEditorContext(e, editorContext.preserveFocus, editorGroupsService)); + } + } + // Check editors selected in the group (tabs) + else { + const group = editorGroupsService.getGroup(editorContext.groupId); + const editor = editorContext.editorIndex !== undefined ? group?.getEditorByIndex(editorContext.editorIndex) : group?.activeEditor; + // If the editor is selected, return all selected editors otherwise only use the editors context + if (group && editor && group.isSelected(editor)) { + return group.selectedEditors.map(editor => groupOrEditorToEditorContext({ editor, groupId: group.id }, editorContext.preserveFocus, editorGroupsService)); + } + } + + // Otherwise go with passed in context + return [editorContext]; +} + +function groupOrEditorToEditorContext(element: IEditorIdentifier | IEditorGroup, preserveFocus: boolean | undefined, editorGroupsService: IEditorGroupsService): IEditorCommandsContext { + if (isEditorGroup(element)) { + return { groupId: element.id, editorIndex: undefined, preserveFocus }; + } + + const group = editorGroupsService.getGroup(element.groupId); + + return { groupId: element.groupId, editorIndex: group ? group.getIndexOfEditor(element.editor) : -1, preserveFocus }; +} + +function isGroupOrEditor(element: unknown): element is IEditorIdentifier | IEditorGroup { + return isEditorGroup(element) || isEditorIdentifier(element); +} + +function getEditorAndGroupFromContext(commandContext: IEditorCommandsContext, editorGroupsService: IEditorGroupsService): { group: IEditorGroup; editor: EditorInput | undefined } | undefined { + const group = editorGroupsService.getGroup(commandContext.groupId); + if (!group) { + return undefined; + } + + if (commandContext.editorIndex === undefined) { + return { group, editor: undefined }; + } + + const editor = group.getEditorByIndex(commandContext.editorIndex); + return { group, editor }; +} diff --git a/src/vs/workbench/contrib/files/browser/fileCommands.ts b/src/vs/workbench/contrib/files/browser/fileCommands.ts index 81bf68c3e0b4c..97fb6ec7c65f3 100644 --- a/src/vs/workbench/contrib/files/browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/browser/fileCommands.ts @@ -25,7 +25,7 @@ import { isWeb, isWindows } from 'vs/base/common/platform'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { getResourceForCommand, getMultiSelectedResources, getOpenEditorsViewMultiSelection, IExplorerService } from 'vs/workbench/contrib/files/browser/files'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; -import { getMultiSelectedEditorContexts } from 'vs/workbench/browser/parts/editor/editorCommands'; +import { resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommandsContext'; import { Schemas } from 'vs/base/common/network'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; @@ -35,7 +35,6 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { basename, joinPath, isEqual } from 'vs/base/common/resources'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { coalesce } from 'vs/base/common/arrays'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @@ -514,13 +513,13 @@ CommandsRegistry.registerCommand({ handler: (accessor, _: URI | object, editorContext: IEditorCommandsContext) => { const editorGroupService = accessor.get(IEditorGroupsService); - const contexts = getMultiSelectedEditorContexts(editorContext, accessor.get(IListService), accessor.get(IEditorGroupsService)); + const resolvedContext = resolveCommandsContext(accessor, [editorContext]); let groups: readonly IEditorGroup[] | undefined = undefined; - if (!contexts.length) { + if (!resolvedContext.groupedEditors.length) { groups = editorGroupService.getGroups(GroupsOrder.MOST_RECENTLY_ACTIVE); } else { - groups = coalesce(contexts.map(context => editorGroupService.getGroup(context.groupId))); + groups = resolvedContext.groupedEditors.map(({ group }) => group); } return saveDirtyEditorsOfGroups(accessor, groups, { reason: SaveReason.EXPLICIT }); diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts index 5b1ab36ce1055..5419dba32dce3 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts @@ -11,12 +11,10 @@ import { localize2 } from 'vs/nls'; import { Action2, MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { getCommandsContext, resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommands'; -import { IEditorCommandsContext } from 'vs/workbench/common/editor'; +import { resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommandsContext'; import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor'; import { MultiDiffEditor } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor'; import { MultiDiffEditorInput } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput'; -import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; export class GoToFileAction extends Action2 { @@ -75,9 +73,15 @@ export class CollapseAllAction extends Action2 { }); } - async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - const { editor } = resolveCommandsContext(accessor.get(IEditorGroupsService), getCommandsContext(accessor, resourceOrContext, context)); + async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + const resolvedContext = resolveCommandsContext(accessor, args); + const groupContext = resolvedContext.groupedEditors[0]; + if (!groupContext) { + return; + } + + const editor = groupContext.editors[0]; if (editor instanceof MultiDiffEditorInput) { const viewModel = await editor.getViewModel(); viewModel.collapseAll(); @@ -102,9 +106,15 @@ export class ExpandAllAction extends Action2 { }); } - async run(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): Promise { - const { editor } = resolveCommandsContext(accessor.get(IEditorGroupsService), getCommandsContext(accessor, resourceOrContext, context)); + async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { + const resolvedContext = resolveCommandsContext(accessor, args); + + const groupContext = resolvedContext.groupedEditors[0]; + if (!groupContext) { + return; + } + const editor = groupContext.editors[0]; if (editor instanceof MultiDiffEditorInput) { const viewModel = await editor.getViewModel(); viewModel.expandAll(); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts index 3cc7faf8354db..8ef65e7a12137 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts @@ -13,7 +13,7 @@ import { getNotebookEditorFromEditorPane, IActiveNotebookEditor, ICellViewModel, import { INTERACTIVE_WINDOW_IS_ACTIVE_EDITOR, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT, NOTEBOOK_KERNEL_SOURCE_COUNT } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { ICellRange, isICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorCommandsContext } from 'vs/workbench/common/editor'; +import { isEditorCommandsContext } from 'vs/workbench/common/editor'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { WorkbenchActionExecutedClassification, WorkbenchActionExecutedEvent } from 'vs/base/common/actions'; @@ -220,9 +220,6 @@ export abstract class NotebookMultiCellAction extends Action2 { private isCellToolbarContext(context?: unknown): context is INotebookCellToolbarActionContext { return !!context && !!(context as INotebookActionContext).notebookEditor && (context as any).$mid === MarshalledId.NotebookCellActionContext; } - private isEditorContext(context?: unknown): boolean { - return !!context && (context as IEditorCommandsContext).groupId !== undefined; - } /** * The action/command args are resolved in following order @@ -233,7 +230,7 @@ export abstract class NotebookMultiCellAction extends Action2 { async run(accessor: ServicesAccessor, ...additionalArgs: any[]): Promise { const context = additionalArgs[0]; const isFromCellToolbar = this.isCellToolbarContext(context); - const isFromEditorToolbar = this.isEditorContext(context); + const isFromEditorToolbar = isEditorCommandsContext(context); const from = isFromCellToolbar ? 'cellToolbar' : (isFromEditorToolbar ? 'editorToolbar' : 'other'); const telemetryService = accessor.get(ITelemetryService); From acb46a47f8b4d7f419ba5b6c961b8501d3366a0f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2024 10:16:01 +0200 Subject: [PATCH 661/755] debt - skip flaky watcher tests (#220036) --- .../platform/files/test/node/nodejsWatcher.integrationTest.ts | 4 ++-- .../platform/files/test/node/parcelWatcher.integrationTest.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts index d47cf0f69fdc4..c53f15426aba4 100644 --- a/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/nodejsWatcher.integrationTest.ts @@ -8,7 +8,7 @@ import assert from 'assert'; import { tmpdir } from 'os'; import { basename, dirname, join } from 'vs/base/common/path'; import { Promises, RimRafMode } from 'vs/base/node/pfs'; -import { flakySuite, getRandomTestPath } from 'vs/base/test/node/testUtils'; +import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { FileChangeFilter, FileChangeType } from 'vs/platform/files/common/files'; import { INonRecursiveWatchRequest, IRecursiveWatcherWithSubscribe } from 'vs/platform/files/common/watcher'; import { watchFileContents } from 'vs/platform/files/node/watcher/nodejs/nodejsWatcherLib'; @@ -30,7 +30,7 @@ import { TestParcelWatcher } from 'vs/platform/files/test/node/parcelWatcher.int // mocha but generally). as such they will run only on demand // whenever we update the watcher library. -((process.env['BUILD_SOURCEVERSION'] || process.env['CI']) ? suite.skip : flakySuite)('File Watcher (node.js)', () => { +suite.skip('File Watcher (node.js)', () => { class TestNodeJSWatcher extends NodeJSWatcher { diff --git a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts index 633e403341530..4370d82bf904a 100644 --- a/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts +++ b/src/vs/platform/files/test/node/parcelWatcher.integrationTest.ts @@ -10,7 +10,7 @@ import { timeout } from 'vs/base/common/async'; import { dirname, join } from 'vs/base/common/path'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { Promises, RimRafMode } from 'vs/base/node/pfs'; -import { flakySuite, getRandomTestPath } from 'vs/base/test/node/testUtils'; +import { getRandomTestPath } from 'vs/base/test/node/testUtils'; import { FileChangeFilter, FileChangeType, IFileChange } from 'vs/platform/files/common/files'; import { ParcelWatcher } from 'vs/platform/files/node/watcher/parcel/parcelWatcher'; import { IRecursiveWatchRequest } from 'vs/platform/files/common/watcher'; @@ -65,7 +65,7 @@ export class TestParcelWatcher extends ParcelWatcher { // mocha but generally). as such they will run only on demand // whenever we update the watcher library. -((process.env['BUILD_SOURCEVERSION'] || process.env['CI']) ? suite.skip : flakySuite)('File Watcher (parcel)', () => { +suite.skip('File Watcher (parcel)', () => { let testDir: string; let watcher: TestParcelWatcher; From 3479868ac7f40376a75770f77ceb5fee6cc7a51f Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 5 Jul 2024 10:45:03 +0200 Subject: [PATCH 662/755] Fixes https://github.com/microsoft/vscode-copilot/issues/6556 (#219996) * Fixes https://github.com/microsoft/vscode-copilot/issues/6556 --- src/vs/editor/common/core/textEdit.ts | 9 ++ .../algorithms/diffAlgorithm.ts | 12 +++ .../computeMovedLines.ts | 6 +- .../defaultLinesDiffComputer.ts | 29 ++++- .../linesSliceCharSequence.ts | 82 +++++++------- src/vs/editor/common/diff/rangeMapping.ts | 78 ++++++++++++++ .../diffing/defaultLinesDiffComputer.test.ts | 6 +- .../editor/test/node/diffing/fixtures.test.ts | 31 +++++- .../advanced.expected.diff.json | 2 +- .../diffing/fixtures/sorted-offsets/1.tst | 102 ++++++++++++++++++ .../diffing/fixtures/sorted-offsets/2.tst | 87 +++++++++++++++ .../advanced.expected.diff.json | 42 ++++++++ .../sorted-offsets/legacy.expected.diff.json | 74 +++++++++++++ 13 files changed, 502 insertions(+), 58 deletions(-) create mode 100644 src/vs/editor/test/node/diffing/fixtures/sorted-offsets/1.tst create mode 100644 src/vs/editor/test/node/diffing/fixtures/sorted-offsets/2.tst create mode 100644 src/vs/editor/test/node/diffing/fixtures/sorted-offsets/advanced.expected.diff.json create mode 100644 src/vs/editor/test/node/diffing/fixtures/sorted-offsets/legacy.expected.diff.json diff --git a/src/vs/editor/common/core/textEdit.ts b/src/vs/editor/common/core/textEdit.ts index 3b0d6d2f70a70..4d001a0fb7ad6 100644 --- a/src/vs/editor/common/core/textEdit.ts +++ b/src/vs/editor/common/core/textEdit.ts @@ -225,6 +225,15 @@ export class LineBasedText extends AbstractText { } } +export class ArrayText extends LineBasedText { + constructor(lines: string[]) { + super( + lineNumber => lines[lineNumber - 1], + lines.length + ); + } +} + export class StringText extends AbstractText { private readonly _t = new PositionOffsetTransformer(this.value); diff --git a/src/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.ts b/src/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.ts index 50fbf66deba9c..2de4635030d19 100644 --- a/src/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.ts +++ b/src/vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm.ts @@ -52,6 +52,18 @@ export class SequenceDiff { ); } + public static assertSorted(sequenceDiffs: SequenceDiff[]): void { + let last: SequenceDiff | undefined = undefined; + for (const cur of sequenceDiffs) { + if (last) { + if (!(last.seq1Range.endExclusive <= cur.seq1Range.start && last.seq2Range.endExclusive <= cur.seq2Range.start)) { + throw new BugIndicatingError('Sequence diffs must be sorted'); + } + } + last = cur; + } + } + constructor( public readonly seq1Range: OffsetRange, public readonly seq2Range: OffsetRange, diff --git a/src/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.ts b/src/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.ts index 8f7183211d7d5..6a46557a17719 100644 --- a/src/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.ts +++ b/src/vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines.ts @@ -9,10 +9,10 @@ import { pushMany, compareBy, numberComparator, reverseOrder } from 'vs/base/com import { MonotonousArray, findLastMonotonous } from 'vs/base/common/arraysFind'; import { SetMap } from 'vs/base/common/map'; import { LineRange, LineRangeSet } from 'vs/editor/common/core/lineRange'; -import { OffsetRange } from 'vs/editor/common/core/offsetRange'; import { LinesSliceCharSequence } from 'vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence'; import { LineRangeFragment, isSpace } from 'vs/editor/common/diff/defaultLinesDiffComputer/utils'; import { MyersDiffAlgorithm } from 'vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm'; +import { Range } from 'vs/editor/common/core/range'; export function computeMovedLines( changes: DetailedLineRangeMapping[], @@ -260,8 +260,8 @@ function areLinesSimilar(line1: string, line2: string, timeout: ITimeout): boole const myersDiffingAlgorithm = new MyersDiffAlgorithm(); const result = myersDiffingAlgorithm.compute( - new LinesSliceCharSequence([line1], new OffsetRange(0, 1), false), - new LinesSliceCharSequence([line2], new OffsetRange(0, 1), false), + new LinesSliceCharSequence([line1], new Range(1, 1, 1, line1.length), false), + new LinesSliceCharSequence([line2], new Range(1, 1, 1, line2.length), false), timeout ); let commonNonSpaceCharCount = 0; diff --git a/src/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.ts b/src/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.ts index 2c3ee2fe09426..5573f68452621 100644 --- a/src/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.ts +++ b/src/vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer.ts @@ -17,7 +17,7 @@ import { extendDiffsToEntireWordIfAppropriate, optimizeSequenceDiffs, removeShor import { LineSequence } from 'vs/editor/common/diff/defaultLinesDiffComputer/lineSequence'; import { LinesSliceCharSequence } from 'vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence'; import { ILinesDiffComputer, ILinesDiffComputerOptions, LinesDiff, MovedText } from 'vs/editor/common/diff/linesDiffComputer'; -import { DetailedLineRangeMapping, RangeMapping } from '../rangeMapping'; +import { DetailedLineRangeMapping, LineRangeMapping, RangeMapping } from '../rangeMapping'; export class DefaultLinesDiffComputer implements ILinesDiffComputer { private readonly dynamicProgrammingDiffing = new DynamicProgrammingDiffing(); @@ -167,7 +167,9 @@ export class DefaultLinesDiffComputer implements ILinesDiffComputer { for (const ic of c.innerChanges) { const valid = validatePosition(ic.modifiedRange.getStartPosition(), modifiedLines) && validatePosition(ic.modifiedRange.getEndPosition(), modifiedLines) && validatePosition(ic.originalRange.getStartPosition(), originalLines) && validatePosition(ic.originalRange.getEndPosition(), originalLines); - if (!valid) { return false; } + if (!valid) { + return false; + } } if (!validateRange(c.modified, modifiedLines) || !validateRange(c.original, originalLines)) { return false; @@ -208,18 +210,28 @@ export class DefaultLinesDiffComputer implements ILinesDiffComputer { } private refineDiff(originalLines: string[], modifiedLines: string[], diff: SequenceDiff, timeout: ITimeout, considerWhitespaceChanges: boolean): { mappings: RangeMapping[]; hitTimeout: boolean } { - const slice1 = new LinesSliceCharSequence(originalLines, diff.seq1Range, considerWhitespaceChanges); - const slice2 = new LinesSliceCharSequence(modifiedLines, diff.seq2Range, considerWhitespaceChanges); + const lineRangeMapping = toLineRangeMapping(diff); + const rangeMapping = lineRangeMapping.toRangeMapping2(originalLines, modifiedLines); + + const slice1 = new LinesSliceCharSequence(originalLines, rangeMapping.originalRange, considerWhitespaceChanges); + const slice2 = new LinesSliceCharSequence(modifiedLines, rangeMapping.modifiedRange, considerWhitespaceChanges); const diffResult = slice1.length + slice2.length < 500 ? this.dynamicProgrammingDiffing.compute(slice1, slice2, timeout) : this.myersDiffingAlgorithm.compute(slice1, slice2, timeout); + const check = false; + let diffs = diffResult.diffs; + if (check) { SequenceDiff.assertSorted(diffs); } diffs = optimizeSequenceDiffs(slice1, slice2, diffs); + if (check) { SequenceDiff.assertSorted(diffs); } diffs = extendDiffsToEntireWordIfAppropriate(slice1, slice2, diffs); + if (check) { SequenceDiff.assertSorted(diffs); } diffs = removeShortMatches(slice1, slice2, diffs); + if (check) { SequenceDiff.assertSorted(diffs); } diffs = removeVeryShortMatchingTextBetweenLongDiffs(slice1, slice2, diffs); + if (check) { SequenceDiff.assertSorted(diffs); } const result = diffs.map( (d) => @@ -229,6 +241,8 @@ export class DefaultLinesDiffComputer implements ILinesDiffComputer { ) ); + if (check) { RangeMapping.assertSorted(result); } + // Assert: result applied on original should be the same as diff applied to original return { @@ -312,3 +326,10 @@ export function getLineRangeMapping(rangeMapping: RangeMapping, originalLines: s return new DetailedLineRangeMapping(originalLineRange, modifiedLineRange, [rangeMapping]); } + +function toLineRangeMapping(sequenceDiff: SequenceDiff) { + return new LineRangeMapping( + new LineRange(sequenceDiff.seq1Range.start + 1, sequenceDiff.seq1Range.endExclusive + 1), + new LineRange(sequenceDiff.seq2Range.start + 1, sequenceDiff.seq2Range.endExclusive + 1), + ); +} diff --git a/src/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.ts b/src/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.ts index 9edc63d335f92..7761599484b07 100644 --- a/src/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.ts +++ b/src/vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence.ts @@ -13,52 +13,39 @@ import { isSpace } from 'vs/editor/common/diff/defaultLinesDiffComputer/utils'; export class LinesSliceCharSequence implements ISequence { private readonly elements: number[] = []; - private readonly firstCharOffsetByLine: number[] = []; - public readonly lineRange: OffsetRange; - // To account for trimming - private readonly additionalOffsetByLine: number[] = []; - - constructor(public readonly lines: string[], lineRange: OffsetRange, public readonly considerWhitespaceChanges: boolean) { - // This slice has to have lineRange.length many \n! (otherwise diffing against an empty slice will be problematic) - // (Unless it covers the entire document, in that case the other slice also has to cover the entire document ands it's okay) - - // If the slice covers the end, but does not start at the beginning, we include just the \n of the previous line. - let trimFirstLineFully = false; - if (lineRange.start > 0 && lineRange.endExclusive >= lines.length) { - lineRange = new OffsetRange(lineRange.start - 1, lineRange.endExclusive); - trimFirstLineFully = true; - } + private readonly firstElementOffsetByLineIdx: number[] = []; + private readonly lineStartOffsets: number[] = []; + private readonly trimmedWsLengthsByLineIdx: number[] = []; + + constructor(public readonly lines: string[], private readonly range: Range, public readonly considerWhitespaceChanges: boolean) { + this.firstElementOffsetByLineIdx.push(0); + for (let lineNumber = this.range.startLineNumber; lineNumber <= this.range.endLineNumber; lineNumber++) { + let line = lines[lineNumber - 1]; + let lineStartOffset = 0; + if (lineNumber === this.range.startLineNumber && this.range.startColumn > 1) { + lineStartOffset = this.range.startColumn - 1; + line = line.substring(lineStartOffset); + } + this.lineStartOffsets.push(lineStartOffset); - this.lineRange = lineRange; - - this.firstCharOffsetByLine[0] = 0; - for (let i = this.lineRange.start; i < this.lineRange.endExclusive; i++) { - let line = lines[i]; - let offset = 0; - if (trimFirstLineFully) { - offset = line.length; - line = ''; - trimFirstLineFully = false; - } else if (!considerWhitespaceChanges) { + let trimmedWsLength = 0; + if (!considerWhitespaceChanges) { const trimmedStartLine = line.trimStart(); - offset = line.length - trimmedStartLine.length; + trimmedWsLength = line.length - trimmedStartLine.length; line = trimmedStartLine.trimEnd(); } + this.trimmedWsLengthsByLineIdx.push(trimmedWsLength); - this.additionalOffsetByLine.push(offset); - - for (let i = 0; i < line.length; i++) { + const lineLength = lineNumber === this.range.endLineNumber ? Math.min(this.range.endColumn - 1 - lineStartOffset - trimmedWsLength, line.length) : line.length; + for (let i = 0; i < lineLength; i++) { this.elements.push(line.charCodeAt(i)); } - // Don't add an \n that does not exist in the document. - if (i < lines.length - 1) { + if (lineNumber < this.range.endLineNumber) { this.elements.push('\n'.charCodeAt(0)); - this.firstCharOffsetByLine[i - this.lineRange.start + 1] = this.elements.length; + this.firstElementOffsetByLineIdx.push(this.elements.length); } } - // To account for the last line - this.additionalOffsetByLine.push(0); } toString() { @@ -111,18 +98,23 @@ export class LinesSliceCharSequence implements ISequence { return score; } - public translateOffset(offset: number): Position { + public translateOffset(offset: number, preference: 'left' | 'right' = 'right'): Position { // find smallest i, so that lineBreakOffsets[i] <= offset using binary search - if (this.lineRange.isEmpty) { - return new Position(this.lineRange.start + 1, 1); - } - - const i = findLastIdxMonotonous(this.firstCharOffsetByLine, (value) => value <= offset); - return new Position(this.lineRange.start + i + 1, offset - this.firstCharOffsetByLine[i] + this.additionalOffsetByLine[i] + 1); + const i = findLastIdxMonotonous(this.firstElementOffsetByLineIdx, (value) => value <= offset); + const lineOffset = offset - this.firstElementOffsetByLineIdx[i]; + return new Position( + this.range.startLineNumber + i, + 1 + this.lineStartOffsets[i] + lineOffset + ((lineOffset === 0 && preference === 'left') ? 0 : this.trimmedWsLengthsByLineIdx[i]) + ); } public translateRange(range: OffsetRange): Range { - return Range.fromPositions(this.translateOffset(range.start), this.translateOffset(range.endExclusive)); + const pos1 = this.translateOffset(range.start, 'right'); + const pos2 = this.translateOffset(range.endExclusive, 'left'); + if (pos2.isBefore(pos1)) { + return Range.fromPositions(pos2, pos2); + } + return Range.fromPositions(pos1, pos2); } /** @@ -161,8 +153,8 @@ export class LinesSliceCharSequence implements ISequence { } public extendToFullLines(range: OffsetRange): OffsetRange { - const start = findLastMonotonous(this.firstCharOffsetByLine, x => x <= range.start) ?? 0; - const end = findFirstMonotonous(this.firstCharOffsetByLine, x => range.endExclusive <= x) ?? this.elements.length; + const start = findLastMonotonous(this.firstElementOffsetByLineIdx, x => x <= range.start) ?? 0; + const end = findFirstMonotonous(this.firstElementOffsetByLineIdx, x => range.endExclusive <= x) ?? this.elements.length; return new OffsetRange(start, end); } } diff --git a/src/vs/editor/common/diff/rangeMapping.ts b/src/vs/editor/common/diff/rangeMapping.ts index f15b2a053100c..da9c3a49109f8 100644 --- a/src/vs/editor/common/diff/rangeMapping.ts +++ b/src/vs/editor/common/diff/rangeMapping.ts @@ -5,6 +5,7 @@ import { BugIndicatingError } from 'vs/base/common/errors'; import { LineRange } from 'vs/editor/common/core/lineRange'; +import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { AbstractText, SingleTextEdit } from 'vs/editor/common/core/textEdit'; @@ -118,6 +119,70 @@ export class LineRangeMapping { ); } } + + /** + * This method assumes that the LineRangeMapping describes a valid diff! + * I.e. if one range is empty, the other range cannot be the entire document. + * It avoids various problems when the line range points to non-existing line-numbers. + */ + public toRangeMapping2(original: string[], modified: string[]): RangeMapping { + if (isValidLineNumber(this.original.endLineNumberExclusive, original) + && isValidLineNumber(this.modified.endLineNumberExclusive, modified)) { + return new RangeMapping( + new Range(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), + new Range(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1), + ); + } + + if (!this.original.isEmpty && !this.modified.isEmpty) { + return new RangeMapping( + Range.fromPositions( + new Position(this.original.startLineNumber, 1), + normalizePosition(new Position(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), original) + ), + Range.fromPositions( + new Position(this.modified.startLineNumber, 1), + normalizePosition(new Position(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), modified) + ), + ); + } + + if (this.original.startLineNumber > 1 && this.modified.startLineNumber > 1) { + return new RangeMapping( + Range.fromPositions( + normalizePosition(new Position(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER), original), + normalizePosition(new Position(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), original) + ), + Range.fromPositions( + normalizePosition(new Position(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER), modified), + normalizePosition(new Position(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), modified) + ), + ); + } + + // Situation now: one range is empty and one range touches the last line and one range starts at line 1. + // I don't think this can happen. + + throw new BugIndicatingError(); + } +} + +function normalizePosition(position: Position, content: string[]): Position { + if (position.lineNumber < 1) { + return new Position(1, 1); + } + if (position.lineNumber > content.length) { + return new Position(content.length, content[content.length - 1].length + 1); + } + const line = content[position.lineNumber - 1]; + if (position.column > line.length + 1) { + return new Position(position.lineNumber, line.length + 1); + } + return position; +} + +function isValidLineNumber(lineNumber: number, lines: string[]): boolean { + return lineNumber >= 1 && lineNumber <= lines.length; } /** @@ -161,6 +226,19 @@ export class DetailedLineRangeMapping extends LineRangeMapping { * Maps a range in the original text model to a range in the modified text model. */ export class RangeMapping { + public static assertSorted(rangeMappings: RangeMapping[]): void { + for (let i = 1; i < rangeMappings.length; i++) { + const previous = rangeMappings[i - 1]; + const current = rangeMappings[i]; + if (!( + previous.originalRange.getEndPosition().isBeforeOrEqual(current.originalRange.getStartPosition()) + && previous.modifiedRange.getEndPosition().isBeforeOrEqual(current.modifiedRange.getStartPosition()) + )) { + throw new BugIndicatingError('Range mappings must be sorted'); + } + } + } + /** * The original range. */ diff --git a/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts b/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts index 57a34dfc36457..72ad7fe2186b4 100644 --- a/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts +++ b/src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts @@ -17,8 +17,8 @@ suite('myers', () => { ensureNoDisposablesAreLeakedInTestSuite(); test('1', () => { - const s1 = new LinesSliceCharSequence(['hello world'], new OffsetRange(0, 1), true); - const s2 = new LinesSliceCharSequence(['hallo welt'], new OffsetRange(0, 1), true); + const s1 = new LinesSliceCharSequence(['hello world'], new Range(1, 1, 1, Number.MAX_SAFE_INTEGER), true); + const s2 = new LinesSliceCharSequence(['hallo welt'], new Range(1, 1, 1, Number.MAX_SAFE_INTEGER), true); const a = true ? new MyersDiffAlgorithm() : new DynamicProgrammingDiffing(); a.compute(s1, s2); @@ -83,7 +83,7 @@ suite('LinesSliceCharSequence', () => { 'line4: hello world', 'line5: bazz', ], - new OffsetRange(1, 4), true + new Range(2, 1, 5, 1), true ); test('translateOffset', () => { diff --git a/src/vs/editor/test/node/diffing/fixtures.test.ts b/src/vs/editor/test/node/diffing/fixtures.test.ts index 901ed758ff1f9..0ed9a8b11fe55 100644 --- a/src/vs/editor/test/node/diffing/fixtures.test.ts +++ b/src/vs/editor/test/node/diffing/fixtures.test.ts @@ -8,11 +8,13 @@ import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs import { join, resolve } from 'path'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { FileAccess } from 'vs/base/common/network'; -import { DetailedLineRangeMapping } from 'vs/editor/common/diff/rangeMapping'; +import { DetailedLineRangeMapping, RangeMapping } from 'vs/editor/common/diff/rangeMapping'; import { LegacyLinesDiffComputer } from 'vs/editor/common/diff/legacyLinesDiffComputer'; import { DefaultLinesDiffComputer } from 'vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer'; import { Range } from 'vs/editor/common/core/range'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { AbstractText, ArrayText, SingleTextEdit, TextEdit } from 'vs/editor/common/core/textEdit'; +import { LinesDiff } from 'vs/editor/common/diff/linesDiffComputer'; suite('diffing fixtures', () => { ensureNoDisposablesAreLeakedInTestSuite(); @@ -47,7 +49,15 @@ suite('diffing fixtures', () => { const ignoreTrimWhitespace = folder.indexOf('trimws') >= 0; const diff = diffingAlgo.computeDiff(firstContentLines, secondContentLines, { ignoreTrimWhitespace, maxComputationTimeMs: Number.MAX_SAFE_INTEGER, computeMoves: true }); + if (diffingAlgoName === 'advanced' && !ignoreTrimWhitespace) { + assertDiffCorrectness(diff, firstContentLines, secondContentLines); + } + function getDiffs(changes: readonly DetailedLineRangeMapping[]): IDetailedDiff[] { + for (const c of changes) { + RangeMapping.assertSorted(c.innerChanges ?? []); + } + return changes.map(c => ({ originalRange: c.original.toString(), modifiedRange: c.modified.toString(), @@ -123,7 +133,7 @@ suite('diffing fixtures', () => { } test(`test`, () => { - runTest('issue-214049', 'advanced'); + runTest('invalid-diff-trimws', 'advanced'); }); for (const folder of folders) { @@ -160,3 +170,20 @@ interface IMoveInfo { changes: IDetailedDiff[]; } + +function assertDiffCorrectness(diff: LinesDiff, original: string[], modified: string[]) { + const allInnerChanges = diff.changes.flatMap(c => c.innerChanges!); + const edit = rangeMappingsToTextEdit(allInnerChanges, new ArrayText(modified)); + const result = edit.normalize().apply(new ArrayText(original)); + + assert.deepStrictEqual(result, modified.join('\n')); +} + +function rangeMappingsToTextEdit(rangeMappings: readonly RangeMapping[], modified: AbstractText): TextEdit { + return new TextEdit(rangeMappings.map(m => { + return new SingleTextEdit( + m.originalRange, + modified.getValueOfRange(m.modifiedRange) + ); + })); +} diff --git a/src/vs/editor/test/node/diffing/fixtures/invalid-diff-trimws/advanced.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/invalid-diff-trimws/advanced.expected.diff.json index bdaa293acd473..b9b792ab06865 100644 --- a/src/vs/editor/test/node/diffing/fixtures/invalid-diff-trimws/advanced.expected.diff.json +++ b/src/vs/editor/test/node/diffing/fixtures/invalid-diff-trimws/advanced.expected.diff.json @@ -13,7 +13,7 @@ "modifiedRange": "[742,751)", "innerChanges": [ { - "originalRange": "[742,3 -> 742,3]", + "originalRange": "[742,1 -> 742,1]", "modifiedRange": "[742,1 -> 743,8]" }, { diff --git a/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/1.tst b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/1.tst new file mode 100644 index 0000000000000..7d4c141530883 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/1.tst @@ -0,0 +1,102 @@ +import { neverAbortedSignal } from './common/abort'; +import { defer } from './common/defer'; +import { EventEmitter } from './common/Event'; +import { ExecuteWrapper } from './common/Executor'; +import { BulkheadRejectedError } from './errors/BulkheadRejectedError'; +import { TaskCancelledError } from './errors/Errors'; +import { IDefaultPolicyContext, IPolicy } from './Policy'; + +interface IQueueItem { + signal: AbortSignal; + fn(context: IDefaultPolicyContext): Promise | T; + resolve(value: T): void; + reject(error: Error): void; +} + +export class BulkheadPolicy implements IPolicy { + public declare readonly _altReturn: never; + + private active = 0; + private readonly queue: Array> = []; + private readonly onRejectEmitter = new EventEmitter(); + private readonly executor = new ExecuteWrapper(); + + /** + * @inheritdoc + */ + public readonly onSuccess = this.executor.onSuccess; + + /** + * @inheritdoc + */ + public readonly onFailure = this.executor.onFailure; + + /** + * Emitter that fires when an item is rejected from the bulkhead. + */ + public readonly onReject = this.onRejectEmitter.addListener; + + /** + * Returns the number of available execution slots at this point in time. + */ + public get executionSlots() { + return this.capacity - this.active; + } + + /** + * Returns the number of queue slots at this point in time. + */ + public get queueSlots() { + return this.queueCapacity - this.queue.length; + } + + /** + * Bulkhead limits concurrent requests made. + */ + constructor(private readonly capacity: number, private readonly queueCapacity: number) { } + + /** + * Executes the given function. + * @param fn Function to execute + * @throws a {@link BulkheadRejectedException} if the bulkhead limits are exceeeded + */ + public async execute( + fn: (context: IDefaultPolicyContext) => PromiseLike | T, + signal = neverAbortedSignal, + ): Promise { + if (signal.aborted) { + throw new TaskCancelledError(); + } + + if (this.active < this.capacity) { + this.active++; + try { + return await fn({ signal }); + } finally { + this.active--; + this.dequeue(); + } + } + + if (this.queue.length > this.queueCapacity) { + const { resolve, reject, promise } = defer(); + this.queue.push({ signal, fn, resolve, reject }); + return promise; + } + + this.onRejectEmitter.emit(); + throw new BulkheadRejectedError(this.capacity, this.queueCapacity); + } + + private dequeue() { + const item = this.queue.shift(); + if (!item) { + return; + } + + Promise.resolve() + .then(() => this.execute(item.fn, item.signal)) + .then(item.resolve) + .catch(item.reject); + } +} diff --git a/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/2.tst b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/2.tst new file mode 100644 index 0000000000000..9b3687d776a96 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/2.tst @@ -0,0 +1,87 @@ +import { neverAbortedSignal } from './common/abort'; +import { defer } from './common/defer'; +import { EventEmitter } from './common/Event'; +import { ExecuteWrapper } from './common/Executor'; +import { BulkheadRejectedError } from './errors/BulkheadRejectedError'; +import { TaskCancelledError } from './errors/Errors'; +import { IDefaultPolicyContext, IPolicy } from './Policy'; + +interface IQueueItem { + signal: AbortSignal; + fn(context: IDefaultPolicyContext): Promise | T; + resolve(value: T): void; + reject(error: Error): void; +} + +export class BulkheadPolicy implements IPolicy { + public declare readonly _altReturn: never; + + private active = 0; + private readonly queue: Array> = []; + private readonly onRejectEmitter = new EventEmitter(); + private readonly executor = new ExecuteWrapper(); + + /** + * @inheritdoc + */ + public readonly onSuccess = this.executor.onSuccess; + + /** + * @inheritdoc + */ + public readonly onFailure = this.executor.onFailure; + + /** + * Emitter that fires when an item is rejected from the bulkhead. + */ + public readonly onReject = this.onRejectEmitter.addListener; + + /** + * Returns the number of available execution slots at this point in time. + */ + public get executionSlots() { + return this.capacity - this.active; + } + + /** + * Returns the number of queue slots at this point in time. + */ + public get queueSlots() { + return this.queueCapacity - this.queue.length; + } + + /** + * Bulkhead limits concurrent requests made. + */ + constructor(private readonly capacity: number, private readonly queueCapacity: number) { } + + /** + * Executes the given function. + * @param fn Function to execute + * @throws a {@link BulkheadRejectedException} if the bulkhead limits are exceeeded + */ + public async execute( + fn: (context: IDefaultPolicyContext) => PromiseLike | T, + signal = neverAbortedSignal, + ): Promise { + if (signal.aborted) { + throw new TaskCancelledError(); + } + + if (this.active < this.capacity) { + this.active++; + try { + return await fn({ signal }); + } finally { + this.active--; + this.dequeue(); + } + } + + if (this.queue.length >= this.queueCapacity) { + this.onRejectEmitter.emit(); + throw new BulkheadRejectedError(this.capacity, this.queueCapacity); + } + const { resolve, reject, promise } = defer(); + this.queue.push({ signal, fn, resolve, reject }); + return promise; diff --git a/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/advanced.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/advanced.expected.diff.json new file mode 100644 index 0000000000000..06f0ca747cf93 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/advanced.expected.diff.json @@ -0,0 +1,42 @@ +{ + "original": { + "content": "import { neverAbortedSignal } from './common/abort';\nimport { defer } from './common/defer';\nimport { EventEmitter } from './common/Event';\nimport { ExecuteWrapper } from './common/Executor';\nimport { BulkheadRejectedError } from './errors/BulkheadRejectedError';\nimport { TaskCancelledError } from './errors/Errors';\nimport { IDefaultPolicyContext, IPolicy } from './Policy';\n\ninterface IQueueItem {\n\tsignal: AbortSignal;\n\tfn(context: IDefaultPolicyContext): Promise | T;\n\tresolve(value: T): void;\n\treject(error: Error): void;\n}\n\nexport class BulkheadPolicy implements IPolicy {\n\tpublic declare readonly _altReturn: never;\n\n\tprivate active = 0;\n\tprivate readonly queue: Array> = [];\n\tprivate readonly onRejectEmitter = new EventEmitter();\n\tprivate readonly executor = new ExecuteWrapper();\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onSuccess = this.executor.onSuccess;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onFailure = this.executor.onFailure;\n\n\t/**\n\t * Emitter that fires when an item is rejected from the bulkhead.\n\t */\n\tpublic readonly onReject = this.onRejectEmitter.addListener;\n\n\t/**\n\t * Returns the number of available execution slots at this point in time.\n\t */\n\tpublic get executionSlots() {\n\t\treturn this.capacity - this.active;\n\t}\n\n\t/**\n\t * Returns the number of queue slots at this point in time.\n\t */\n\tpublic get queueSlots() {\n\t\treturn this.queueCapacity - this.queue.length;\n\t}\n\n\t/**\n\t * Bulkhead limits concurrent requests made.\n\t */\n\tconstructor(private readonly capacity: number, private readonly queueCapacity: number) { }\n\n\t/**\n\t * Executes the given function.\n\t * @param fn Function to execute\n\t * @throws a {@link BulkheadRejectedException} if the bulkhead limits are exceeeded\n\t */\n\tpublic async execute(\n\t\tfn: (context: IDefaultPolicyContext) => PromiseLike | T,\n\t\tsignal = neverAbortedSignal,\n\t): Promise {\n\t\tif (signal.aborted) {\n\t\t\tthrow new TaskCancelledError();\n\t\t}\n\n\t\tif (this.active < this.capacity) {\n\t\t\tthis.active++;\n\t\t\ttry {\n\t\t\t\treturn await fn({ signal });\n\t\t\t} finally {\n\t\t\t\tthis.active--;\n\t\t\t\tthis.dequeue();\n\t\t\t}\n\t\t}\n\n\t\tif (this.queue.length > this.queueCapacity) {\n\t\t\tconst { resolve, reject, promise } = defer();\n\t\t\tthis.queue.push({ signal, fn, resolve, reject });\n\t\t\treturn promise;\n\t\t}\n\n\t\tthis.onRejectEmitter.emit();\n\t\tthrow new BulkheadRejectedError(this.capacity, this.queueCapacity);\n\t}\n\n\tprivate dequeue() {\n\t\tconst item = this.queue.shift();\n\t\tif (!item) {\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.resolve()\n\t\t\t.then(() => this.execute(item.fn, item.signal))\n\t\t\t.then(item.resolve)\n\t\t\t.catch(item.reject);\n\t}\n}\n", + "fileName": "./1.tst" + }, + "modified": { + "content": "import { neverAbortedSignal } from './common/abort';\nimport { defer } from './common/defer';\nimport { EventEmitter } from './common/Event';\nimport { ExecuteWrapper } from './common/Executor';\nimport { BulkheadRejectedError } from './errors/BulkheadRejectedError';\nimport { TaskCancelledError } from './errors/Errors';\nimport { IDefaultPolicyContext, IPolicy } from './Policy';\n\ninterface IQueueItem {\n\tsignal: AbortSignal;\n\tfn(context: IDefaultPolicyContext): Promise | T;\n\tresolve(value: T): void;\n\treject(error: Error): void;\n}\n\nexport class BulkheadPolicy implements IPolicy {\n\tpublic declare readonly _altReturn: never;\n\n\tprivate active = 0;\n\tprivate readonly queue: Array> = [];\n\tprivate readonly onRejectEmitter = new EventEmitter();\n\tprivate readonly executor = new ExecuteWrapper();\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onSuccess = this.executor.onSuccess;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onFailure = this.executor.onFailure;\n\n\t/**\n\t * Emitter that fires when an item is rejected from the bulkhead.\n\t */\n\tpublic readonly onReject = this.onRejectEmitter.addListener;\n\n\t/**\n\t * Returns the number of available execution slots at this point in time.\n\t */\n\tpublic get executionSlots() {\n\t\treturn this.capacity - this.active;\n\t}\n\n\t/**\n\t * Returns the number of queue slots at this point in time.\n\t */\n\tpublic get queueSlots() {\n\t\treturn this.queueCapacity - this.queue.length;\n\t}\n\n\t/**\n\t * Bulkhead limits concurrent requests made.\n\t */\n\tconstructor(private readonly capacity: number, private readonly queueCapacity: number) { }\n\n\t/**\n\t * Executes the given function.\n\t * @param fn Function to execute\n\t * @throws a {@link BulkheadRejectedException} if the bulkhead limits are exceeeded\n\t */\n\tpublic async execute(\n\t\tfn: (context: IDefaultPolicyContext) => PromiseLike | T,\n\t\tsignal = neverAbortedSignal,\n\t): Promise {\n\t\tif (signal.aborted) {\n\t\t\tthrow new TaskCancelledError();\n\t\t}\n\n\t\tif (this.active < this.capacity) {\n\t\t\tthis.active++;\n\t\t\ttry {\n\t\t\t\treturn await fn({ signal });\n\t\t\t} finally {\n\t\t\t\tthis.active--;\n\t\t\t\tthis.dequeue();\n\t\t\t}\n\t\t}\n\n\t\tif (this.queue.length >= this.queueCapacity) {\n\t\t\tthis.onRejectEmitter.emit();\n\t\t\tthrow new BulkheadRejectedError(this.capacity, this.queueCapacity);\n\t\t}\n\t\tconst { resolve, reject, promise } = defer();\n\t\tthis.queue.push({ signal, fn, resolve, reject });\n\t\treturn promise;\n", + "fileName": "./2.tst" + }, + "diffs": [ + { + "originalRange": "[81,103)", + "modifiedRange": "[81,88)", + "innerChanges": [ + { + "originalRange": "[81,26 -> 81,26]", + "modifiedRange": "[81,26 -> 81,27]" + }, + { + "originalRange": "[82,1 -> 82,1]", + "modifiedRange": "[82,1 -> 85,1]" + }, + { + "originalRange": "[82,1 -> 82,2]", + "modifiedRange": "[85,1 -> 85,1]" + }, + { + "originalRange": "[83,1 -> 83,2]", + "modifiedRange": "[86,1 -> 86,1]" + }, + { + "originalRange": "[84,1 -> 84,2]", + "modifiedRange": "[87,1 -> 87,1]" + }, + { + "originalRange": "[85,1 -> 103,1 EOL]", + "modifiedRange": "[88,1 -> 88,1 EOL]" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/legacy.expected.diff.json b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/legacy.expected.diff.json new file mode 100644 index 0000000000000..88d6c0c6cf8f1 --- /dev/null +++ b/src/vs/editor/test/node/diffing/fixtures/sorted-offsets/legacy.expected.diff.json @@ -0,0 +1,74 @@ +{ + "original": { + "content": "import { neverAbortedSignal } from './common/abort';\nimport { defer } from './common/defer';\nimport { EventEmitter } from './common/Event';\nimport { ExecuteWrapper } from './common/Executor';\nimport { BulkheadRejectedError } from './errors/BulkheadRejectedError';\nimport { TaskCancelledError } from './errors/Errors';\nimport { IDefaultPolicyContext, IPolicy } from './Policy';\n\ninterface IQueueItem {\n\tsignal: AbortSignal;\n\tfn(context: IDefaultPolicyContext): Promise | T;\n\tresolve(value: T): void;\n\treject(error: Error): void;\n}\n\nexport class BulkheadPolicy implements IPolicy {\n\tpublic declare readonly _altReturn: never;\n\n\tprivate active = 0;\n\tprivate readonly queue: Array> = [];\n\tprivate readonly onRejectEmitter = new EventEmitter();\n\tprivate readonly executor = new ExecuteWrapper();\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onSuccess = this.executor.onSuccess;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onFailure = this.executor.onFailure;\n\n\t/**\n\t * Emitter that fires when an item is rejected from the bulkhead.\n\t */\n\tpublic readonly onReject = this.onRejectEmitter.addListener;\n\n\t/**\n\t * Returns the number of available execution slots at this point in time.\n\t */\n\tpublic get executionSlots() {\n\t\treturn this.capacity - this.active;\n\t}\n\n\t/**\n\t * Returns the number of queue slots at this point in time.\n\t */\n\tpublic get queueSlots() {\n\t\treturn this.queueCapacity - this.queue.length;\n\t}\n\n\t/**\n\t * Bulkhead limits concurrent requests made.\n\t */\n\tconstructor(private readonly capacity: number, private readonly queueCapacity: number) { }\n\n\t/**\n\t * Executes the given function.\n\t * @param fn Function to execute\n\t * @throws a {@link BulkheadRejectedException} if the bulkhead limits are exceeeded\n\t */\n\tpublic async execute(\n\t\tfn: (context: IDefaultPolicyContext) => PromiseLike | T,\n\t\tsignal = neverAbortedSignal,\n\t): Promise {\n\t\tif (signal.aborted) {\n\t\t\tthrow new TaskCancelledError();\n\t\t}\n\n\t\tif (this.active < this.capacity) {\n\t\t\tthis.active++;\n\t\t\ttry {\n\t\t\t\treturn await fn({ signal });\n\t\t\t} finally {\n\t\t\t\tthis.active--;\n\t\t\t\tthis.dequeue();\n\t\t\t}\n\t\t}\n\n\t\tif (this.queue.length > this.queueCapacity) {\n\t\t\tconst { resolve, reject, promise } = defer();\n\t\t\tthis.queue.push({ signal, fn, resolve, reject });\n\t\t\treturn promise;\n\t\t}\n\n\t\tthis.onRejectEmitter.emit();\n\t\tthrow new BulkheadRejectedError(this.capacity, this.queueCapacity);\n\t}\n\n\tprivate dequeue() {\n\t\tconst item = this.queue.shift();\n\t\tif (!item) {\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.resolve()\n\t\t\t.then(() => this.execute(item.fn, item.signal))\n\t\t\t.then(item.resolve)\n\t\t\t.catch(item.reject);\n\t}\n}\n", + "fileName": "./1.tst" + }, + "modified": { + "content": "import { neverAbortedSignal } from './common/abort';\nimport { defer } from './common/defer';\nimport { EventEmitter } from './common/Event';\nimport { ExecuteWrapper } from './common/Executor';\nimport { BulkheadRejectedError } from './errors/BulkheadRejectedError';\nimport { TaskCancelledError } from './errors/Errors';\nimport { IDefaultPolicyContext, IPolicy } from './Policy';\n\ninterface IQueueItem {\n\tsignal: AbortSignal;\n\tfn(context: IDefaultPolicyContext): Promise | T;\n\tresolve(value: T): void;\n\treject(error: Error): void;\n}\n\nexport class BulkheadPolicy implements IPolicy {\n\tpublic declare readonly _altReturn: never;\n\n\tprivate active = 0;\n\tprivate readonly queue: Array> = [];\n\tprivate readonly onRejectEmitter = new EventEmitter();\n\tprivate readonly executor = new ExecuteWrapper();\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onSuccess = this.executor.onSuccess;\n\n\t/**\n\t * @inheritdoc\n\t */\n\tpublic readonly onFailure = this.executor.onFailure;\n\n\t/**\n\t * Emitter that fires when an item is rejected from the bulkhead.\n\t */\n\tpublic readonly onReject = this.onRejectEmitter.addListener;\n\n\t/**\n\t * Returns the number of available execution slots at this point in time.\n\t */\n\tpublic get executionSlots() {\n\t\treturn this.capacity - this.active;\n\t}\n\n\t/**\n\t * Returns the number of queue slots at this point in time.\n\t */\n\tpublic get queueSlots() {\n\t\treturn this.queueCapacity - this.queue.length;\n\t}\n\n\t/**\n\t * Bulkhead limits concurrent requests made.\n\t */\n\tconstructor(private readonly capacity: number, private readonly queueCapacity: number) { }\n\n\t/**\n\t * Executes the given function.\n\t * @param fn Function to execute\n\t * @throws a {@link BulkheadRejectedException} if the bulkhead limits are exceeeded\n\t */\n\tpublic async execute(\n\t\tfn: (context: IDefaultPolicyContext) => PromiseLike | T,\n\t\tsignal = neverAbortedSignal,\n\t): Promise {\n\t\tif (signal.aborted) {\n\t\t\tthrow new TaskCancelledError();\n\t\t}\n\n\t\tif (this.active < this.capacity) {\n\t\t\tthis.active++;\n\t\t\ttry {\n\t\t\t\treturn await fn({ signal });\n\t\t\t} finally {\n\t\t\t\tthis.active--;\n\t\t\t\tthis.dequeue();\n\t\t\t}\n\t\t}\n\n\t\tif (this.queue.length >= this.queueCapacity) {\n\t\t\tthis.onRejectEmitter.emit();\n\t\t\tthrow new BulkheadRejectedError(this.capacity, this.queueCapacity);\n\t\t}\n\t\tconst { resolve, reject, promise } = defer();\n\t\tthis.queue.push({ signal, fn, resolve, reject });\n\t\treturn promise;\n", + "fileName": "./2.tst" + }, + "diffs": [ + { + "originalRange": "[81,103)", + "modifiedRange": "[81,88)", + "innerChanges": [ + { + "originalRange": "[81,26 -> 81,26]", + "modifiedRange": "[81,26 -> 81,27]" + }, + { + "originalRange": "[81,48 -> 86,1 EOL]", + "modifiedRange": "[81,49 -> 81,49 EOL]" + }, + { + "originalRange": "[87,1 -> 87,1]", + "modifiedRange": "[82,1 -> 82,2]" + }, + { + "originalRange": "[88,1 -> 88,1]", + "modifiedRange": "[83,1 -> 83,2]" + }, + { + "originalRange": "[89,1 -> 89,1]", + "modifiedRange": "[84,1 -> 84,2]" + }, + { + "originalRange": "[90,1 -> 92,1]", + "modifiedRange": "[85,1 -> 85,1]" + }, + { + "originalRange": "[92,9 -> 97,4]", + "modifiedRange": "[85,9 -> 85,29]" + }, + { + "originalRange": "[97,10 -> 97,20 EOL]", + "modifiedRange": "[85,35 -> 85,51 EOL]" + }, + { + "originalRange": "[98,3 -> 98,16]", + "modifiedRange": "[86,3 -> 86,3]" + }, + { + "originalRange": "[98,21 -> 98,43]", + "modifiedRange": "[86,8 -> 86,21]" + }, + { + "originalRange": "[98,49 -> 99,15]", + "modifiedRange": "[86,27 -> 86,33]" + }, + { + "originalRange": "[99,22 -> 100,16]", + "modifiedRange": "[86,40 -> 86,42]" + }, + { + "originalRange": "[100,22 -> 100,22]", + "modifiedRange": "[86,48 -> 86,50]" + }, + { + "originalRange": "[101,2 -> 102,2 EOL]", + "modifiedRange": "[87,2 -> 87,18 EOL]" + } + ] + } + ] +} \ No newline at end of file From 15fbbd2bf2df4a2b3d86f72b9aadf58ce6968803 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:05:00 +0200 Subject: [PATCH 663/755] Add minimum amount of tests for editor commands context (#220042) Add minimum amount of tests for editor commands --- .../parts/editor/editorCommandsContext.ts | 6 +- .../editor/editorCommandsContext.test.ts | 183 ++++++++++++++++++ 2 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 src/vs/workbench/test/browser/parts/editor/editorCommandsContext.test.ts diff --git a/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts b/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts index b0915c07703cf..ee5957ddfa093 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommandsContext.ts @@ -118,17 +118,19 @@ function getEditorContextFromCommandArgs(accessor: ServicesAccessor, commandArgs } const editorService = accessor.get(IEditorService); + const editorGroupsService = accessor.get(IEditorGroupsService); // Otherwise, try to find the editor group by the URI of the resource for (const uri of filteredArgs as URI[]) { const editorIdentifiers = editorService.findEditors(uri); if (editorIdentifiers.length) { - return editorIdentifiers[0]; + const editorIdentifier = editorIdentifiers[0]; + const group = editorGroupsService.getGroup(editorIdentifier.groupId); + return { groupId: editorIdentifier.groupId, editorIndex: group?.getIndexOfEditor(editorIdentifier.editor) }; } } const listService = accessor.get(IListService); - const editorGroupsService = accessor.get(IEditorGroupsService); // If there is no context in the arguments, try to find the context from the focused list // if the action was executed from a list diff --git a/src/vs/workbench/test/browser/parts/editor/editorCommandsContext.test.ts b/src/vs/workbench/test/browser/parts/editor/editorCommandsContext.test.ts new file mode 100644 index 0000000000000..1cc2f10170823 --- /dev/null +++ b/src/vs/workbench/test/browser/parts/editor/editorCommandsContext.test.ts @@ -0,0 +1,183 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert from 'assert'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { workbenchInstantiationService, TestServiceAccessor, registerTestEditor, registerTestFileEditor, registerTestResourceEditor, TestFileEditorInput, createEditorPart, registerTestSideBySideEditor, TestEditorInput } from 'vs/workbench/test/browser/workbenchTestServices'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; +import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +import { GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { URI } from 'vs/base/common/uri'; +import { resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommandsContext'; +import { IEditorCommandsContext } from 'vs/workbench/common/editor'; + +suite('Resolving Editor Commands Context', () => { + + const disposables = new DisposableStore(); + + const TEST_EDITOR_ID = 'MyTestEditorForEditors'; + + let instantiationService: IInstantiationService; + let accessor: TestServiceAccessor; + + setup(() => { + instantiationService = workbenchInstantiationService(undefined, disposables); + accessor = instantiationService.createInstance(TestServiceAccessor); + + disposables.add(accessor.untitledTextEditorService); + disposables.add(registerTestFileEditor()); + disposables.add(registerTestSideBySideEditor()); + disposables.add(registerTestResourceEditor()); + disposables.add(registerTestEditor(TEST_EDITOR_ID, [new SyncDescriptor(TestFileEditorInput)])); + }); + + teardown(() => { + disposables.clear(); + }); + + let index = 0; + function input(id = String(index++)): EditorInput { + return disposables.add(new TestEditorInput(URI.parse(`file://${id}`), 'testInput')); + } + + async function createServices(): Promise { + const instantiationService = workbenchInstantiationService(undefined, disposables); + + const part = await createEditorPart(instantiationService, disposables); + instantiationService.stub(IEditorGroupsService, part); + + const editorService = disposables.add(instantiationService.createInstance(EditorService, undefined)); + instantiationService.stub(IEditorService, editorService); + + return instantiationService.createInstance(TestServiceAccessor); + } + + test('use editor group selection', async () => { + const accessor = await createServices(); + const activeGroup = accessor.editorGroupService.activeGroup; + const instantiationService = accessor.instantiationService; + + const input1 = input(); + const input2 = input(); + const input3 = input(); + activeGroup.openEditor(input1, { pinned: true }); + activeGroup.openEditor(input2, { pinned: true }); + activeGroup.openEditor(input3, { pinned: true }); + + activeGroup.setSelection(input1, [input2]); + + // use editor commands context + const editorCommandContext: IEditorCommandsContext = { groupId: activeGroup.id, editorIndex: activeGroup.getIndexOfEditor(input1), preserveFocus: true }; + const resolvedContext1 = instantiationService.invokeFunction(resolveCommandsContext, [editorCommandContext]); + + assert.strictEqual(resolvedContext1.groupedEditors.length, 1); + assert.strictEqual(resolvedContext1.groupedEditors[0].group.id, activeGroup.id); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors.length, 2); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors[0], input1); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors[1], input2); + assert.strictEqual(resolvedContext1.preserveFocus, true); + + // use URI + const resolvedContext2 = instantiationService.invokeFunction(resolveCommandsContext, [input2.resource]); + + assert.strictEqual(resolvedContext2.groupedEditors.length, 1); + assert.strictEqual(resolvedContext2.groupedEditors[0].group.id, activeGroup.id); + assert.strictEqual(resolvedContext2.groupedEditors[0].editors.length, 2); + assert.strictEqual(resolvedContext2.groupedEditors[0].editors[0], input2); + assert.strictEqual(resolvedContext2.groupedEditors[0].editors[1], input1); + assert.strictEqual(resolvedContext2.preserveFocus, false); + + // use URI and commandContext + const editor1CommandContext: IEditorCommandsContext = { groupId: activeGroup.id, editorIndex: activeGroup.getIndexOfEditor(input1), preserveFocus: true }; + const resolvedContext3 = instantiationService.invokeFunction(resolveCommandsContext, [input1.resource, editor1CommandContext]); + + assert.strictEqual(resolvedContext3.groupedEditors.length, 1); + assert.strictEqual(resolvedContext3.groupedEditors[0].group.id, activeGroup.id); + assert.strictEqual(resolvedContext3.groupedEditors[0].editors.length, 2); + assert.strictEqual(resolvedContext3.groupedEditors[0].editors[0], input1); + assert.strictEqual(resolvedContext3.groupedEditors[0].editors[1], input2); + assert.strictEqual(resolvedContext3.preserveFocus, true); + }); + + test('don\'t use editor group selection', async () => { + const accessor = await createServices(); + const activeGroup = accessor.editorGroupService.activeGroup; + const instantiationService = accessor.instantiationService; + + const input1 = input(); + const input2 = input(); + const input3 = input(); + activeGroup.openEditor(input1, { pinned: true }); + activeGroup.openEditor(input2, { pinned: true }); + activeGroup.openEditor(input3, { pinned: true }); + + activeGroup.setSelection(input1, [input2]); + + // use editor commands context + const editorCommandContext: IEditorCommandsContext = { groupId: activeGroup.id, editorIndex: activeGroup.getIndexOfEditor(input3), preserveFocus: true }; + const resolvedContext1 = instantiationService.invokeFunction(resolveCommandsContext, [editorCommandContext]); + + assert.strictEqual(resolvedContext1.groupedEditors.length, 1); + assert.strictEqual(resolvedContext1.groupedEditors[0].group.id, activeGroup.id); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors.length, 1); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors[0], input3); + assert.strictEqual(resolvedContext1.preserveFocus, true); + + // use URI + const resolvedContext2 = instantiationService.invokeFunction(resolveCommandsContext, [input3.resource]); + + assert.strictEqual(resolvedContext2.groupedEditors.length, 1); + assert.strictEqual(resolvedContext2.groupedEditors[0].group.id, activeGroup.id); + assert.strictEqual(resolvedContext2.groupedEditors[0].editors.length, 1); + assert.strictEqual(resolvedContext2.groupedEditors[0].editors[0], input3); + assert.strictEqual(resolvedContext2.preserveFocus, false); + }); + + test('inactive edior group command context', async () => { + const accessor = await createServices(); + const editorGroupService = accessor.editorGroupService; + const instantiationService = accessor.instantiationService; + + const group1 = editorGroupService.activeGroup; + const group2 = editorGroupService.addGroup(group1, GroupDirection.RIGHT); + + const input11 = input(); + const input12 = input(); + group1.openEditor(input11, { pinned: true }); + group1.openEditor(input12, { pinned: true }); + + const input21 = input(); + group2.openEditor(input21, { pinned: true }); + + editorGroupService.activateGroup(group1); + group1.setSelection(input11, [input12]); + + // use editor commands context of inactive group with editor index + const editorCommandContext1: IEditorCommandsContext = { groupId: group2.id, editorIndex: group2.getIndexOfEditor(input21), preserveFocus: true }; + const resolvedContext1 = instantiationService.invokeFunction(resolveCommandsContext, [editorCommandContext1]); + + assert.strictEqual(resolvedContext1.groupedEditors.length, 1); + assert.strictEqual(resolvedContext1.groupedEditors[0].group.id, group2.id); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors.length, 1); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors[0], input21); + assert.strictEqual(resolvedContext1.preserveFocus, true); + + // use editor commands context of inactive group without editor index + const editorCommandContext2: IEditorCommandsContext = { groupId: group2.id, preserveFocus: true }; + const resolvedContext2 = instantiationService.invokeFunction(resolveCommandsContext, [editorCommandContext2]); + + assert.strictEqual(resolvedContext2.groupedEditors.length, 1); + assert.strictEqual(resolvedContext2.groupedEditors[0].group.id, group2.id); + assert.strictEqual(resolvedContext2.groupedEditors[0].editors.length, 1); + assert.strictEqual(resolvedContext1.groupedEditors[0].editors[0], input21); + assert.strictEqual(resolvedContext2.preserveFocus, true); + }); + + ensureNoDisposablesAreLeakedInTestSuite(); +}); From c040699c44331182a0be70f030d43dcffe6a713f Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:26:48 +0200 Subject: [PATCH 664/755] Git - standardize logging in the git extension (#220043) * Git - more logging * Git - more logging changes --- extensions/git/src/commands.ts | 10 ++-- extensions/git/src/git.ts | 12 ++--- extensions/git/src/historyProvider.ts | 22 ++++---- extensions/git/src/model.ts | 72 +++++++++++++-------------- extensions/git/src/operation.ts | 4 +- extensions/git/src/protocolHandler.ts | 14 +++--- extensions/git/src/repository.ts | 14 +++--- 7 files changed, 74 insertions(+), 74 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 62d35d7af92eb..55c5f89fd3ab3 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1339,14 +1339,14 @@ export class CommandCenter { @command('git.stage') async stage(...resourceStates: SourceControlResourceState[]): Promise { - this.logger.debug(`git.stage ${resourceStates.length} `); + this.logger.debug(`[CommandCenter][stage] git.stage ${resourceStates.length} `); resourceStates = resourceStates.filter(s => !!s); if (resourceStates.length === 0 || (resourceStates[0] && !(resourceStates[0].resourceUri instanceof Uri))) { const resource = this.getSCMResource(); - this.logger.debug(`git.stage.getSCMResource ${resource ? resource.resourceUri.toString() : null} `); + this.logger.debug(`[CommandCenter][stage] git.stage.getSCMResource ${resource ? resource.resourceUri.toString() : null} `); if (!resource) { return; @@ -1389,7 +1389,7 @@ export class CommandCenter { const untracked = selection.filter(s => s.resourceGroupType === ResourceGroupType.Untracked); const scmResources = [...workingTree, ...untracked, ...resolved, ...unresolved]; - this.logger.debug(`git.stage.scmResources ${scmResources.length} `); + this.logger.debug(`[CommandCenter][stage] git.stage.scmResources ${scmResources.length} `); if (!scmResources.length) { return; } @@ -4403,10 +4403,10 @@ export class CommandCenter { private getSCMResource(uri?: Uri): Resource | undefined { uri = uri ? uri : (window.activeTextEditor && window.activeTextEditor.document.uri); - this.logger.debug(`git.getSCMResource.uri ${uri && uri.toString()}`); + this.logger.debug(`[CommandCenter][getSCMResource] git.getSCMResource.uri: ${uri && uri.toString()}`); for (const r of this.model.repositories.map(r => r.root)) { - this.logger.debug(`repo root ${r}`); + this.logger.debug(`[CommandCenter][getSCMResource] repo root: ${r}`); } if (!uri) { diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 0e2b37af5b7ae..eb0007893e845 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1113,7 +1113,7 @@ export class Repository { return result.stdout.trim(); } catch (err) { - this.logger.warn(`git config failed: ${err.message}`); + this.logger.warn(`[Git][config] git config failed: ${err.message}`); return ''; } } @@ -2317,7 +2317,7 @@ export class Repository { return result; } catch (err) { - this.logger.warn(err.message); + this.logger.warn(`[Git][getHEAD] Failed to parse HEAD file: ${err.message}`); } try { @@ -2465,11 +2465,11 @@ export class Repository { remotes.push(...await this.getRemotesFS()); if (remotes.length === 0) { - this.logger.info('No remotes found in the git config file.'); + this.logger.info('[Git][getRemotes] No remotes found in the git config file'); } } catch (err) { - this.logger.warn(`getRemotes() - ${err.message}`); + this.logger.warn(`[Git][getRemotes] Error: ${err.message}`); // Fallback to using git to get the remotes remotes.push(...await this.getRemotesGit()); @@ -2605,7 +2605,7 @@ export class Repository { return branch; } - this.logger.warn(`No such branch: ${name}.`); + this.logger.warn(`[Git][getBranch] No such branch: ${name}`); return Promise.reject(new Error(`No such branch: ${name}.`)); } @@ -2701,7 +2701,7 @@ export class Repository { const result = await fs.readFile(path.join(this.dotGit.path, ref), 'utf8'); return result.trim(); } catch (err) { - this.logger.warn(err.message); + this.logger.warn(`[Git][revParse] Unable to read file: ${err.message}`); } try { diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index 22cbe9c493d1f..55115acb6d0e0 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -49,8 +49,8 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } private async onDidRunGitStatus(force = false): Promise { - this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD:', JSON.stringify(this._HEAD)); - this.logger.trace('GitHistoryProvider:onDidRunGitStatus - repository.HEAD:', JSON.stringify(this.repository.HEAD)); + this.logger.trace('[GitHistoryProvider][onDidRunGitStatus] HEAD:', JSON.stringify(this._HEAD)); + this.logger.trace('[GitHistoryProvider][onDidRunGitStatus] repository.HEAD:', JSON.stringify(this.repository.HEAD)); // Get the merge base of the current history item group const mergeBase = await this.resolveHEADMergeBase(); @@ -65,7 +65,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec this._HEADMergeBase?.name === mergeBase?.name && this._HEADMergeBase?.remote === mergeBase?.remote && this._HEADMergeBase?.commit === mergeBase?.commit) { - this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD has not changed'); + this.logger.trace('[GitHistoryProvider][onDidRunGitStatus] HEAD has not changed'); return; } @@ -74,7 +74,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec // Check if HEAD does not support incoming/outgoing (detached commit, tag) if (!this.repository.HEAD?.name || !this.repository.HEAD?.commit || this.repository.HEAD.type === RefType.Tag) { - this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD does not support incoming/outgoing'); + this.logger.trace('[GitHistoryProvider][onDidRunGitStatus] HEAD does not support incoming/outgoing'); this.currentHistoryItemGroup = undefined; return; @@ -93,7 +93,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } : undefined }; - this.logger.trace(`GitHistoryProvider:onDidRunGitStatus - currentHistoryItemGroup (${force}): ${JSON.stringify(this.currentHistoryItemGroup)}`); + this.logger.trace(`[GitHistoryProvider][onDidRunGitStatus] currentHistoryItemGroup(${force}): ${JSON.stringify(this.currentHistoryItemGroup)}`); } async provideHistoryItems(historyItemGroupId: string, options: SourceControlHistoryOptions): Promise { @@ -223,7 +223,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec if (!historyItemId2) { const upstreamRef = await this.resolveHistoryItemGroupMergeBase(historyItemId1); if (!upstreamRef) { - this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to resolve history item group base for '${historyItemId1}'`); + this.logger.info(`[GitHistoryProvider][resolveHistoryItemGroupCommonAncestor] Failed to resolve history item group base for '${historyItemId1}'`); return undefined; } @@ -232,16 +232,16 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec const ancestor = await this.repository.getMergeBase(historyItemId1, historyItemId2); if (!ancestor) { - this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to resolve common ancestor for '${historyItemId1}' and '${historyItemId2}'`); + this.logger.info(`[GitHistoryProvider][resolveHistoryItemGroupCommonAncestor] Failed to resolve common ancestor for '${historyItemId1}' and '${historyItemId2}'`); return undefined; } try { const commitCount = await this.repository.getCommitCount(`${historyItemId1}...${historyItemId2}`); - this.logger.trace(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Resolved common ancestor for '${historyItemId1}' and '${historyItemId2}': ${JSON.stringify({ id: ancestor, ahead: commitCount.ahead, behind: commitCount.behind })}`); + this.logger.trace(`[GitHistoryProvider][resolveHistoryItemGroupCommonAncestor] Resolved common ancestor for '${historyItemId1}' and '${historyItemId2}': ${JSON.stringify({ id: ancestor, ahead: commitCount.ahead, behind: commitCount.behind })}`); return { id: ancestor, ahead: commitCount.ahead, behind: commitCount.behind }; } catch (err) { - this.logger.error(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to get ahead/behind for '${historyItemId1}...${historyItemId2}': ${err.message}`); + this.logger.error(`[GitHistoryProvider][resolveHistoryItemGroupCommonAncestor] Failed to get ahead/behind for '${historyItemId1}...${historyItemId2}': ${err.message}`); } return undefined; @@ -293,7 +293,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec // Base (config -> reflog -> default) const remoteBranch = await this.repository.getBranchBase(historyItemId); if (!remoteBranch?.remote || !remoteBranch?.name || !remoteBranch?.commit || remoteBranch?.type !== RefType.RemoteHead) { - this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupUpstreamOrBase - Failed to resolve history item group base for '${historyItemId}'`); + this.logger.info(`[GitHistoryProvider][resolveHistoryItemGroupUpstreamOrBase] Failed to resolve history item group base for '${historyItemId}'`); return undefined; } @@ -304,7 +304,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec }; } catch (err) { - this.logger.error(`GitHistoryProvider:resolveHistoryItemGroupUpstreamOrBase - Failed to get branch base for '${historyItemId}': ${err.message}`); + this.logger.error(`[GitHistoryProvider][resolveHistoryItemGroupUpstreamOrBase] Failed to get branch base for '${historyItemId}': ${err.message}`); } return undefined; diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 6fd123c7f3de7..d4e00449e20a8 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -287,13 +287,13 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } private async doInitialScan(): Promise { - this.logger.info('[Model] Initial repository scan started'); + this.logger.info('[Model][doInitialScan] Initial repository scan started'); const config = workspace.getConfiguration('git'); const autoRepositoryDetection = config.get('autoRepositoryDetection'); const parentRepositoryConfig = config.get<'always' | 'never' | 'prompt'>('openRepositoryInParentFolders', 'prompt'); - this.logger.trace(`[Model] Settings: autoRepositoryDetection=${autoRepositoryDetection}, openRepositoryInParentFolders=${parentRepositoryConfig}`); + this.logger.trace(`[Model][doInitialScan] Settings: autoRepositoryDetection=${autoRepositoryDetection}, openRepositoryInParentFolders=${parentRepositoryConfig}`); // Initial repository scan function const initialScanFn = () => Promise.all([ @@ -325,7 +325,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } */ this.telemetryReporter.sendTelemetryEvent('git.repositoryInitialScan', { autoRepositoryDetection: String(autoRepositoryDetection) }, { repositoryCount: this.openRepositories.length }); - this.logger.info(`[Model] Initial repository scan completed - repositories(${this.repositories.length}), closed repositories (${this.closedRepositories.length}), parent repositories (${this.parentRepositories.length}), unsafe repositories (${this.unsafeRepositories.length})`); + this.logger.info(`[Model][doInitialScan] Initial repository scan completed - repositories(${this.repositories.length}), closed repositories (${this.closedRepositories.length}), parent repositories (${this.parentRepositories.length}), unsafe repositories (${this.unsafeRepositories.length})`); } /** @@ -344,7 +344,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi await Promise.all((workspace.workspaceFolders || []).map(async folder => { const root = folder.uri.fsPath; - this.logger.trace(`[Model] Workspace folder: ${root}`); + this.logger.trace(`[Model][scanWorkspaceFolders] Workspace folder: ${root}`); // Workspace folder children const repositoryScanMaxDepth = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanMaxDepth', 1); @@ -354,17 +354,17 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi // Repository scan folders const scanPaths = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('scanRepositories') || []; - this.logger.trace(`[Model] Workspace scan settings: repositoryScanMaxDepth=${repositoryScanMaxDepth}; repositoryScanIgnoredFolders=[${repositoryScanIgnoredFolders.join(', ')}]; scanRepositories=[${scanPaths.join(', ')}]`); + this.logger.trace(`[Model][scanWorkspaceFolders] Workspace scan settings: repositoryScanMaxDepth=${repositoryScanMaxDepth}; repositoryScanIgnoredFolders=[${repositoryScanIgnoredFolders.join(', ')}]; scanRepositories=[${scanPaths.join(', ')}]`); for (const scanPath of scanPaths) { if (scanPath === '.git') { - this.logger.trace('[Model] \'.git\' not supported in \'git.scanRepositories\' setting.'); + this.logger.trace('[Model][scanWorkspaceFolders] \'.git\' not supported in \'git.scanRepositories\' setting.'); continue; } if (path.isAbsolute(scanPath)) { const notSupportedMessage = l10n.t('Absolute paths not supported in "git.scanRepositories" setting.'); - this.logger.warn(`[Model] ${notSupportedMessage}`); + this.logger.warn(`[Model][scanWorkspaceFolders] ${notSupportedMessage}`); console.warn(notSupportedMessage); continue; } @@ -372,12 +372,12 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi subfolders.add(path.join(root, scanPath)); } - this.logger.trace(`[Model] Workspace scan sub folders: [${[...subfolders].join(', ')}]`); + this.logger.trace(`[Model][scanWorkspaceFolders] Workspace scan sub folders: [${[...subfolders].join(', ')}]`); await Promise.all([...subfolders].map(f => this.openRepository(f))); })); } catch (err) { - this.logger.warn(`[Model] scanWorkspaceFolders: ${err}`); + this.logger.warn(`[Model][scanWorkspaceFolders] Error: ${err}`); } } @@ -397,7 +397,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } } catch (err) { - this.logger.warn(`[Model] Unable to read workspace folder '${currentFolder.path}': ${err}`); + this.logger.warn(`[Model][traverseWorkspaceFolder] Unable to read workspace folder '${currentFolder.path}': ${err}`); continue; } @@ -459,11 +459,11 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[]; openRepositoriesToDispose.forEach(r => r.dispose()); - this.logger.trace(`[Model] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); + this.logger.trace(`[Model][onDidChangeWorkspaceFolders] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); await Promise.all(possibleRepositoryFolders.map(p => this.openRepository(p.uri.fsPath))); } catch (err) { - this.logger.warn(`[Model] onDidChangeWorkspaceFolders: ${err}`); + this.logger.warn(`[Model][onDidChangeWorkspaceFolders] Error: ${err}`); } } @@ -477,7 +477,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi .filter(({ root }) => workspace.getConfiguration('git', root).get('enabled') !== true) .map(({ repository }) => repository); - this.logger.trace(`[Model] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); + this.logger.trace(`[Model][onDidChangeConfiguration] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`); possibleRepositoryFolders.forEach(p => this.openRepository(p.uri.fsPath)); openRepositoriesToDispose.forEach(r => r.dispose()); } @@ -485,7 +485,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi private async onDidChangeVisibleTextEditors(editors: readonly TextEditor[]): Promise { try { if (!workspace.isTrusted) { - this.logger.trace('[Model] Workspace is not trusted.'); + this.logger.trace('[Model][onDidChangeVisibleTextEditors] Workspace is not trusted.'); return; } @@ -506,25 +506,25 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const repository = this.getRepository(uri); if (repository) { - this.logger.trace(`[Model] Repository for editor resource ${uri.fsPath} already exists: ${repository.root}`); + this.logger.trace(`[Model][onDidChangeVisibleTextEditors] Repository for editor resource ${uri.fsPath} already exists: ${repository.root}`); return; } - this.logger.trace(`[Model] Open repository for editor resource ${uri.fsPath}`); + this.logger.trace(`[Model][onDidChangeVisibleTextEditors] Open repository for editor resource ${uri.fsPath}`); await this.openRepository(path.dirname(uri.fsPath)); })); } catch (err) { - this.logger.warn(`[Model] onDidChangeVisibleTextEditors: ${err}`); + this.logger.warn(`[Model][onDidChangeVisibleTextEditors] Error: ${err}`); } } @sequentialize async openRepository(repoPath: string, openIfClosed = false): Promise { - this.logger.trace(`[Model] Opening repository: ${repoPath}`); + this.logger.trace(`[Model][openRepository] Repository: ${repoPath}`); const existingRepository = await this.getRepositoryExact(repoPath); if (existingRepository) { - this.logger.trace(`[Model] Repository for path ${repoPath} already exists: ${existingRepository.root}`); + this.logger.trace(`[Model][openRepository] Repository for path ${repoPath} already exists: ${existingRepository.root}`); return; } @@ -532,7 +532,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const enabled = config.get('enabled') === true; if (!enabled) { - this.logger.trace('[Model] Git is not enabled'); + this.logger.trace('[Model][openRepository] Git is not enabled'); return; } @@ -542,7 +542,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi fs.accessSync(path.join(repoPath, 'HEAD'), fs.constants.F_OK); const result = await this.git.exec(repoPath, ['-C', repoPath, 'rev-parse', '--show-cdup']); if (result.stderr.trim() === '' && result.stdout.trim() === '') { - this.logger.trace(`[Model] Bare repository: ${repoPath}`); + this.logger.trace(`[Model][openRepository] Bare repository: ${repoPath}`); return; } } catch { @@ -552,16 +552,16 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi try { const { repositoryRoot, unsafeRepositoryMatch } = await this.getRepositoryRoot(repoPath); - this.logger.trace(`[Model] Repository root for path ${repoPath} is: ${repositoryRoot}`); + this.logger.trace(`[Model][openRepository] Repository root for path ${repoPath} is: ${repositoryRoot}`); const existingRepository = await this.getRepositoryExact(repositoryRoot); if (existingRepository) { - this.logger.trace(`[Model] Repository for path ${repositoryRoot} already exists: ${existingRepository.root}`); + this.logger.trace(`[Model][openRepository] Repository for path ${repositoryRoot} already exists: ${existingRepository.root}`); return; } if (this.shouldRepositoryBeIgnored(repositoryRoot)) { - this.logger.trace(`[Model] Repository for path ${repositoryRoot} is ignored`); + this.logger.trace(`[Model][openRepository] Repository for path ${repositoryRoot} is ignored`); return; } @@ -570,7 +570,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi if (parentRepositoryConfig !== 'always' && this.globalState.get(`parentRepository:${repositoryRoot}`) !== true) { const isRepositoryOutsideWorkspace = await this.isRepositoryOutsideWorkspace(repositoryRoot); if (isRepositoryOutsideWorkspace) { - this.logger.trace(`[Model] Repository in parent folder: ${repositoryRoot}`); + this.logger.trace(`[Model][openRepository] Repository in parent folder: ${repositoryRoot}`); if (!this._parentRepositoriesManager.hasRepository(repositoryRoot)) { // Show a notification if the parent repository is opened after the initial scan @@ -587,7 +587,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi // Handle unsafe repositories if (unsafeRepositoryMatch && unsafeRepositoryMatch.length === 3) { - this.logger.trace(`[Model] Unsafe repository: ${repositoryRoot}`); + this.logger.trace(`[Model][openRepository] Unsafe repository: ${repositoryRoot}`); // Show a notification if the unsafe repository is opened after the initial scan if (this._state === 'initialized' && !this._unsafeRepositoriesManager.hasRepository(repositoryRoot)) { @@ -601,7 +601,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi // Handle repositories that were closed by the user if (!openIfClosed && this._closedRepositoriesManager.isRepositoryClosed(repositoryRoot)) { - this.logger.trace(`[Model] Repository for path ${repositoryRoot} is closed`); + this.logger.trace(`[Model][openRepository] Repository for path ${repositoryRoot} is closed`); return; } @@ -612,14 +612,14 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi this.open(repository); this._closedRepositoriesManager.deleteRepository(repository.root); - this.logger.info(`[Model] Opened repository: ${repository.root}`); + this.logger.info(`[Model][openRepository] Opened repository: ${repository.root}`); // Do not await this, we want SCM // to know about the repo asap repository.status(); } catch (err) { // noop - this.logger.trace(`[Model] Opening repository for path='${repoPath}' failed; ex=${err}`); + this.logger.trace(`[Model][openRepository] Opening repository for path='${repoPath}' failed. Error:${err}`); } } @@ -651,7 +651,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const repositoryRootRealPath = await fs.promises.realpath(repositoryRoot); return !pathEquals(repositoryRoot, repositoryRootRealPath) ? repositoryRootRealPath : undefined; } catch (err) { - this.logger.warn(`[Model] Failed to get repository realpath for "${repositoryRoot}": ${err}`); + this.logger.warn(`[Model][getRepositoryRootRealPath] Failed to get repository realpath for "${repositoryRoot}": ${err}`); return undefined; } } @@ -678,7 +678,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } private open(repository: Repository): void { - this.logger.trace(`[Model] Open repository: ${repository.root}`); + this.logger.trace(`[Model][open] Repository: ${repository.root}`); const onDidDisappearRepository = filterEvent(repository.onDidChangeState, state => state === RepositoryState.Disposed); const disappearListener = onDidDisappearRepository(() => dispose()); @@ -695,7 +695,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi const checkForSubmodules = () => { if (!shouldDetectSubmodules) { - this.logger.trace('[Model] Automatic detection of git submodules is not enabled.'); + this.logger.trace('[Model][open] Automatic detection of git submodules is not enabled.'); return; } @@ -708,7 +708,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi .slice(0, submodulesLimit) .map(r => path.join(repository.root, r.path)) .forEach(p => { - this.logger.trace(`Opening submodule: '${p}'`); + this.logger.trace(`[Model][open] Opening submodule: '${p}'`); this.eventuallyScanPossibleGitRepository(p); }); }; @@ -770,7 +770,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi return; } - this.logger.info(`[Model] Close repository: ${repository.root}`); + this.logger.info(`[Model][close] Repository: ${repository.root}`); this._closedRepositoriesManager.addRepository(openRepository.repository.root); openRepository.dispose(); @@ -823,7 +823,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi return openRepositoryRealPath?.repository; } catch (err) { - this.logger.warn(`[Model] Failed to get repository realpath for: "${repoPath}". ${err}`); + this.logger.warn(`[Model][getRepositoryExact] Failed to get repository realpath for: "${repoPath}". Error:${err}`); return undefined; } } @@ -1009,7 +1009,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi this._workspaceFolders.set(workspaceFolder.uri.fsPath, result); } catch (err) { // noop - Workspace folder does not exist - this.logger.trace(`[Model] Failed to resolve workspace folder "${workspaceFolder.uri.fsPath}": ${err}`); + this.logger.trace(`[Model][getWorkspaceFolderRealPath] Failed to resolve workspace folder "${workspaceFolder.uri.fsPath}". Error:${err}`); } } diff --git a/extensions/git/src/operation.ts b/extensions/git/src/operation.ts index 75f9405b3e340..13370d59bf739 100644 --- a/extensions/git/src/operation.ts +++ b/extensions/git/src/operation.ts @@ -214,7 +214,7 @@ export class OperationManager implements IOperationManager { this.operations.set(operation.kind, new Set([operation])); } - this.logger.trace(`Operation start: ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`); + this.logger.trace(`[OperationManager][start] ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`); } end(operation: Operation): void { @@ -226,7 +226,7 @@ export class OperationManager implements IOperationManager { } } - this.logger.trace(`Operation end: ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`); + this.logger.trace(`[OperationManager][end] ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`); } getOperations(operationKind: OperationKind): Operation[] { diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts index b65eac01a681c..90491fecd5067 100644 --- a/extensions/git/src/protocolHandler.ts +++ b/extensions/git/src/protocolHandler.ts @@ -22,7 +22,7 @@ export class GitProtocolHandler implements UriHandler { } handleUri(uri: Uri): void { - this.logger.info(`[GitProtocolHandler] handleUri(${uri.toString()})`); + this.logger.info(`[GitProtocolHandler][handleUri] URI:(${uri.toString()})`); switch (uri.path) { case '/clone': this.clone(uri); @@ -34,17 +34,17 @@ export class GitProtocolHandler implements UriHandler { const ref = data.ref; if (!data.url) { - this.logger.warn('[GitProtocolHandler] Failed to open URI:' + uri.toString()); + this.logger.warn('[GitProtocolHandler][clone] Failed to open URI:' + uri.toString()); return; } if (Array.isArray(data.url) && data.url.length === 0) { - this.logger.warn('[GitProtocolHandler] Failed to open URI:' + uri.toString()); + this.logger.warn('[GitProtocolHandler][clone] Failed to open URI:' + uri.toString()); return; } if (ref !== undefined && typeof ref !== 'string') { - this.logger.warn('[GitProtocolHandler] Failed to open URI due to multiple references:' + uri.toString()); + this.logger.warn('[GitProtocolHandler][clone] Failed to open URI due to multiple references:' + uri.toString()); return; } @@ -69,12 +69,12 @@ export class GitProtocolHandler implements UriHandler { } } catch (ex) { - this.logger.warn('[GitProtocolHandler] Invalid URI:' + uri.toString()); + this.logger.warn('[GitProtocolHandler][clone] Invalid URI:' + uri.toString()); return; } if (!(await commands.getCommands(true)).includes('git.clone')) { - this.logger.error('[GitProtocolHandler] Could not complete git clone operation as git installation was not found.'); + this.logger.error('[GitProtocolHandler][clone] Could not complete git clone operation as git installation was not found.'); const errorMessage = l10n.t('Could not clone your repository as Git is not installed.'); const downloadGit = l10n.t('Download Git'); @@ -86,7 +86,7 @@ export class GitProtocolHandler implements UriHandler { return; } else { const cloneTarget = cloneUri.toString(true); - this.logger.info(`[GitProtocolHandler] Executing git.clone for ${cloneTarget}`); + this.logger.info(`[GitProtocolHandler][clone] Executing git.clone for ${cloneTarget}`); commands.executeCommand('git.clone', cloneTarget, undefined, { ref: ref }); } } diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index deec56f9eaa77..5c14345e61a6b 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -426,8 +426,8 @@ class FileEventLogger { } this.eventDisposable = combinedDisposable([ - this.onWorkspaceWorkingTreeFileChange(uri => this.logger.debug(`[wt] Change: ${uri.fsPath}`)), - this.onDotGitFileChange(uri => this.logger.debug(`[.git] Change: ${uri.fsPath}`)) + this.onWorkspaceWorkingTreeFileChange(uri => this.logger.debug(`[FileEventLogger][onWorkspaceWorkingTreeFileChange] ${uri.fsPath}`)), + this.onDotGitFileChange(uri => this.logger.debug(`[FileEventLogger][onDotGitFileChange] ${uri.fsPath}`)) ]); } @@ -478,7 +478,7 @@ class DotGitWatcher implements IFileWatcher { this.transientDisposables.push(upstreamWatcher); upstreamWatcher.event(this.emitter.fire, this.emitter, this.transientDisposables); } catch (err) { - this.logger.warn(`Failed to watch ref '${upstreamPath}', is most likely packed.`); + this.logger.warn(`[DotGitWatcher][updateTransientWatchers] Failed to watch ref '${upstreamPath}', is most likely packed.`); } } @@ -1523,7 +1523,7 @@ export class Repository implements Disposable { return upstreamBranch; } catch (err) { - this.logger.warn(`Failed to get branch details for 'refs/remotes/${branch.upstream.remote}/${branch.upstream.name}': ${err.message}.`); + this.logger.warn(`[Repository][getUpstreamBranch] Failed to get branch details for 'refs/remotes/${branch.upstream.remote}/${branch.upstream.name}': ${err.message}.`); return undefined; } } @@ -2409,17 +2409,17 @@ export class Repository implements Disposable { const autorefresh = config.get('autorefresh'); if (!autorefresh) { - this.logger.trace('Skip running git status because autorefresh setting is disabled.'); + this.logger.trace('[Repository][onFileChange] Skip running git status because autorefresh setting is disabled.'); return; } if (this.isRepositoryHuge) { - this.logger.trace('Skip running git status because repository is huge.'); + this.logger.trace('[Repository][onFileChange] Skip running git status because repository is huge.'); return; } if (!this.operations.isIdle()) { - this.logger.trace('Skip running git status because an operation is running.'); + this.logger.trace('[Repository][onFileChange] Skip running git status because an operation is running.'); return; } From f9af31c78d9271b75ce5d818f28c2abd43def2bf Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:05:34 +0200 Subject: [PATCH 665/755] Disable configure keybinding for actions that do not support it (#220050) disable configure keybinding if action does not support it --- src/vs/platform/actions/browser/toolbar.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/actions/browser/toolbar.ts b/src/vs/platform/actions/browser/toolbar.ts index a525f06ae9ec0..003ee6e781c0e 100644 --- a/src/vs/platform/actions/browser/toolbar.ts +++ b/src/vs/platform/actions/browser/toolbar.ts @@ -202,8 +202,9 @@ export class WorkbenchToolBar extends ToolBar { if (action instanceof MenuItemAction && action.menuKeybinding) { primaryActions.push(action.menuKeybinding); } else if (!(action instanceof SubmenuItemAction || action instanceof ToggleMenuAction)) { - const isDisabled = action.id.startsWith('statusbaraction'); // We can't support keybinding configuration for scm statusbar actions - primaryActions.push(createConfigureKeybindingAction(this._commandService, this._keybindingService, action.id, undefined, !isDisabled)); + // only enable the configure keybinding action for actions that support keybindings + const supportsKeybindings = !!this._keybindingService.lookupKeybinding(action.id); + primaryActions.push(createConfigureKeybindingAction(this._commandService, this._keybindingService, action.id, undefined, supportsKeybindings)); } // -- Hide Actions -- From 20775fd4174d112d7e9bd2100a1170ce06d064fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20B=C3=A4umer?= Date: Fri, 5 Jul 2024 12:26:44 +0200 Subject: [PATCH 666/755] Reenable yarn eslint (#220037) * Reenable yarn eslint * Fix eslint errors * Fix compile error * Fix another compile error * Disable eslint errors --- build/filters.js | 2 +- .../languages/supports/richEditBrackets.ts | 3 +-- .../contrib/rename/browser/renameWidget.ts | 11 ++++----- .../commandDetection/promptInputModel.test.ts | 1 + .../api/browser/mainThreadComments.ts | 3 +-- .../contrib/chat/browser/chatAgentHover.ts | 23 +++++++++---------- .../test}/testReporterModel.test.ts | 2 ++ .../replNotebook/browser/repl.contribution.ts | 1 + .../replNotebook/browser/replEditor.ts | 1 + .../testing/browser/testCoverageBars.ts | 3 +-- 10 files changed, 25 insertions(+), 25 deletions(-) rename src/vs/workbench/contrib/issue/{issue => browser/test}/testReporterModel.test.ts (98%) diff --git a/build/filters.js b/build/filters.js index c7be2d818d9bf..915240f0f0bf7 100644 --- a/build/filters.js +++ b/build/filters.js @@ -199,7 +199,7 @@ module.exports.eslintFilter = [ .toString().split(/\r\n|\n/) .filter(line => !line.startsWith('#')) .filter(line => !!line) - .map(line => `!${line}`) + .map(line => line.startsWith('!') ? line.slice(1) : `!${line}`) ]; module.exports.stylelintFilter = [ diff --git a/src/vs/editor/common/languages/supports/richEditBrackets.ts b/src/vs/editor/common/languages/supports/richEditBrackets.ts index 7733719f04975..abb308504665a 100644 --- a/src/vs/editor/common/languages/supports/richEditBrackets.ts +++ b/src/vs/editor/common/languages/supports/richEditBrackets.ts @@ -7,7 +7,6 @@ import * as strings from 'vs/base/common/strings'; import * as stringBuilder from 'vs/editor/common/core/stringBuilder'; import { Range } from 'vs/editor/common/core/range'; import { CharacterPair } from 'vs/editor/common/languages/languageConfiguration'; -import { RegExpOptions } from 'vs/base/common/strings'; interface InternalBracket { open: string[]; @@ -409,7 +408,7 @@ function prepareBracketForRegExp(str: string): string { return (insertWordBoundaries ? `\\b${str}\\b` : str); } -export function createBracketOrRegExp(pieces: string[], options?: RegExpOptions): RegExp { +export function createBracketOrRegExp(pieces: string[], options?: strings.RegExpOptions): RegExp { const regexStr = `(${pieces.map(prepareBracketForRegExp).join(')|(')})`; return strings.createRegExp(regexStr, true, options); } diff --git a/src/vs/editor/contrib/rename/browser/renameWidget.ts b/src/vs/editor/contrib/rename/browser/renameWidget.ts index fc1c165a90d39..b284cd519fde0 100644 --- a/src/vs/editor/contrib/rename/browser/renameWidget.ts +++ b/src/vs/editor/contrib/rename/browser/renameWidget.ts @@ -32,7 +32,6 @@ import { IRange, Range } from 'vs/editor/common/core/range'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { NewSymbolName, NewSymbolNameTag, NewSymbolNameTriggerKind, ProviderResult } from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; -import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ILogService } from 'vs/platform/log/common/log'; @@ -55,8 +54,8 @@ const _sticky = false ; -export const CONTEXT_RENAME_INPUT_VISIBLE = new RawContextKey('renameInputVisible', false, localize('renameInputVisible', "Whether the rename input widget is visible")); -export const CONTEXT_RENAME_INPUT_FOCUSED = new RawContextKey('renameInputFocused', false, localize('renameInputFocused', "Whether the rename input widget is focused")); +export const CONTEXT_RENAME_INPUT_VISIBLE = new RawContextKey('renameInputVisible', false, nls.localize('renameInputVisible', "Whether the rename input widget is visible")); +export const CONTEXT_RENAME_INPUT_FOCUSED = new RawContextKey('renameInputFocused', false, nls.localize('renameInputFocused', "Whether the rename input widget is focused")); /** * "Source" of the new name: @@ -311,7 +310,7 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable beforeRender(): IDimension | null { const [accept, preview] = this._acceptKeybindings; - this._label!.innerText = localize({ key: 'label', comment: ['placeholders are keybindings, e.g "F2 to Rename, Shift+F2 to Preview"'] }, "{0} to Rename, {1} to Preview", this._keybindingService.lookupKeybinding(accept)?.getLabel(), this._keybindingService.lookupKeybinding(preview)?.getLabel()); + this._label!.innerText = nls.localize({ key: 'label', comment: ['placeholders are keybindings, e.g "F2 to Rename, Shift+F2 to Preview"'] }, "{0} to Rename, {1} to Preview", this._keybindingService.lookupKeybinding(accept)?.getLabel(), this._keybindingService.lookupKeybinding(preview)?.getLabel()); this._domNode!.style.minWidth = `200px`; // to prevent from widening when candidates come in @@ -750,7 +749,7 @@ class RenameCandidateListView { this._listContainer.style.height = `${height}px`; this._listContainer.style.width = `${width}px`; - aria.status(localize('renameSuggestionsReceivedAria', "Received {0} rename suggestions", candidates.length)); + aria.status(nls.localize('renameSuggestionsReceivedAria', "Received {0} rename suggestions", candidates.length)); } public clearCandidates(): void { @@ -924,7 +923,7 @@ class InputWithButton implements IDisposable { this._inputNode.className = 'rename-input'; this._inputNode.type = 'text'; this._inputNode.style.border = 'none'; - this._inputNode.setAttribute('aria-label', localize('renameAriaLabel', "Rename input. Type new name and press Enter to commit.")); + this._inputNode.setAttribute('aria-label', nls.localize('renameAriaLabel', "Rename input. Type new name and press Enter to commit.")); this._domNode.appendChild(this._inputNode); diff --git a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts index 9e015c72b2717..667442dd8c9b5 100644 --- a/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts +++ b/src/vs/platform/terminal/test/common/capabilities/commandDetection/promptInputModel.test.ts @@ -2,6 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable local/code-import-patterns */ import type { Terminal } from '@xterm/xterm'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 6bbeb159248bb..a0f00ce4416a6 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -30,7 +30,6 @@ import { MarshalledCommentThread } from 'vs/workbench/common/comments'; import { revealCommentThread } from 'vs/workbench/contrib/comments/browser/commentsController'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { CommentThreadRevealOptions } from 'vs/editor/common/languages'; export class MainThreadCommentThread implements languages.CommentThread { private _input?: languages.CommentInput; @@ -643,7 +642,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments provider.updateCommentingRanges(resourceHints); } - async $revealCommentThread(handle: number, commentThreadHandle: number, options: CommentThreadRevealOptions): Promise { + async $revealCommentThread(handle: number, commentThreadHandle: number, options: languages.CommentThreadRevealOptions): Promise { const provider = this._commentControllers.get(handle); if (!provider) { diff --git a/src/vs/workbench/contrib/chat/browser/chatAgentHover.ts b/src/vs/workbench/contrib/chat/browser/chatAgentHover.ts index 3b1a011b5c59a..78f34762cf01a 100644 --- a/src/vs/workbench/contrib/chat/browser/chatAgentHover.ts +++ b/src/vs/workbench/contrib/chat/browser/chatAgentHover.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { h } from 'vs/base/browser/dom'; import { IManagedHoverOptions } from 'vs/base/browser/ui/hover/hover'; import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; @@ -40,22 +39,22 @@ export class ChatAgentHover extends Disposable { ) { super(); - const hoverElement = h( + const hoverElement = dom.h( '.chat-agent-hover@root', [ - h('.chat-agent-hover-header', [ - h('.chat-agent-hover-icon@icon'), - h('.chat-agent-hover-details', [ - h('.chat-agent-hover-name@name'), - h('.chat-agent-hover-extension', [ - h('.chat-agent-hover-extension-name@extensionName'), - h('.chat-agent-hover-separator@separator'), - h('.chat-agent-hover-publisher@publisher'), + dom.h('.chat-agent-hover-header', [ + dom.h('.chat-agent-hover-icon@icon'), + dom.h('.chat-agent-hover-details', [ + dom.h('.chat-agent-hover-name@name'), + dom.h('.chat-agent-hover-extension', [ + dom.h('.chat-agent-hover-extension-name@extensionName'), + dom.h('.chat-agent-hover-separator@separator'), + dom.h('.chat-agent-hover-publisher@publisher'), ]), ]), ]), - h('.chat-agent-hover-warning@warning'), - h('span.chat-agent-hover-description@description'), + dom.h('.chat-agent-hover-warning@warning'), + dom.h('span.chat-agent-hover-description@description'), ]); this.domNode = hoverElement.root; diff --git a/src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts b/src/vs/workbench/contrib/issue/browser/test/testReporterModel.test.ts similarity index 98% rename from src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts rename to src/vs/workbench/contrib/issue/browser/test/testReporterModel.test.ts index 60ea6c2089cb7..f90b10bade8d5 100644 --- a/src/vs/workbench/contrib/issue/issue/testReporterModel.test.ts +++ b/src/vs/workbench/contrib/issue/browser/test/testReporterModel.test.ts @@ -3,7 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +// eslint-disable-next-line local/code-import-patterns import assert from 'assert'; +// eslint-disable-next-line local/code-import-patterns import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { IssueReporterModel } from 'vs/workbench/contrib/issue/browser/issueReporterModel'; import { IssueType } from 'vs/platform/issue/common/issue'; diff --git a/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts b/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts index 0482610501580..1db3282ad9e3d 100644 --- a/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts +++ b/src/vs/workbench/contrib/replNotebook/browser/repl.contribution.ts @@ -24,6 +24,7 @@ import { IWorkingCopyIdentifier } from 'vs/workbench/services/workingCopy/common import { IWorkingCopyEditorHandler, IWorkingCopyEditorService } from 'vs/workbench/services/workingCopy/common/workingCopyEditorService'; import { extname, isEqual } from 'vs/base/common/resources'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; +// eslint-disable-next-line local/code-translation-remind import { localize2 } from 'vs/nls'; import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { IEditorResolverService, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; diff --git a/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts b/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts index 67a803eab4081..53a0b25667d6c 100644 --- a/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts +++ b/src/vs/workbench/contrib/replNotebook/browser/replEditor.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/interactive'; +// eslint-disable-next-line local/code-translation-remind import * as nls from 'vs/nls'; import * as DOM from 'vs/base/browser/dom'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts index 0c0111ec344ae..232184a9e5bc0 100644 --- a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts +++ b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts @@ -18,7 +18,6 @@ import { IHoverService } from 'vs/platform/hover/browser/hover'; import { Registry } from 'vs/platform/registry/common/platform'; import { ExplorerExtensions, IExplorerFileContribution, IExplorerFileContributionRegistry } from 'vs/workbench/contrib/files/browser/explorerFileContrib'; import * as coverUtils from 'vs/workbench/contrib/testing/browser/codeCoverageDisplayUtils'; -import { calculateDisplayedStat } from 'vs/workbench/contrib/testing/browser/codeCoverageDisplayUtils'; import { ITestingCoverageBarThresholds, TestingConfigKeys, getTestingConfiguration, observeTestingConfiguration } from 'vs/workbench/contrib/testing/common/configuration'; import { AbstractFileCoverage } from 'vs/workbench/contrib/testing/common/testCoverage'; import { ITestCoverageService } from 'vs/workbench/contrib/testing/common/testCoverageService'; @@ -121,7 +120,7 @@ export class ManagedTestCoverageBars extends Disposable { const precision = this.options.compact ? 0 : 2; const thresholds = getTestingConfiguration(this.configurationService, TestingConfigKeys.CoverageBarThresholds); - const overallStat = calculateDisplayedStat(coverage, getTestingConfiguration(this.configurationService, TestingConfigKeys.CoveragePercent)); + const overallStat = coverUtils.calculateDisplayedStat(coverage, getTestingConfiguration(this.configurationService, TestingConfigKeys.CoveragePercent)); if (this.options.overall !== false) { el.overall.textContent = coverUtils.displayPercent(overallStat, precision); } else { From 796dfbb6ea06ffd6e8bdaf1864851547cdbba367 Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 5 Jul 2024 20:29:04 +0900 Subject: [PATCH 667/755] chore: rm unused dyld entitlement and env variable filtering (#220059) --- .../darwin/helper-plugin-entitlements.plist | 2 -- src/vs/base/common/processes.ts | 9 +-------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/build/azure-pipelines/darwin/helper-plugin-entitlements.plist b/build/azure-pipelines/darwin/helper-plugin-entitlements.plist index 1cc1a152c74ab..48f7bf5cece0e 100644 --- a/build/azure-pipelines/darwin/helper-plugin-entitlements.plist +++ b/build/azure-pipelines/darwin/helper-plugin-entitlements.plist @@ -6,8 +6,6 @@ com.apple.security.cs.allow-unsigned-executable-memory - com.apple.security.cs.allow-dyld-environment-variables - com.apple.security.cs.disable-library-validation diff --git a/src/vs/base/common/processes.ts b/src/vs/base/common/processes.ts index 417c4ba116871..ef29387bc0a94 100644 --- a/src/vs/base/common/processes.ts +++ b/src/vs/base/common/processes.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IProcessEnvironment, isLinux, isMacintosh } from 'vs/base/common/platform'; +import { IProcessEnvironment, isLinux } from 'vs/base/common/platform'; /** * Options to be passed to the external program or shell. @@ -140,13 +140,6 @@ export function removeDangerousEnvVariables(env: IProcessEnvironment | undefined // See https://github.com/microsoft/vscode/issues/130072 delete env['DEBUG']; - if (isMacintosh) { - // Unset `DYLD_LIBRARY_PATH`, as it leads to process crashes - // See https://github.com/microsoft/vscode/issues/104525 - // See https://github.com/microsoft/vscode/issues/105848 - delete env['DYLD_LIBRARY_PATH']; - } - if (isLinux) { // Unset `LD_PRELOAD`, as it might lead to process crashes // See https://github.com/microsoft/vscode/issues/134177 From 701145d5e48b43cf6141094b146d5656e6d2f4fb Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Fri, 5 Jul 2024 07:26:43 -0500 Subject: [PATCH 668/755] Fix port label not applied when forwarding port with vscode.env.asExternalUri (#220029) Don't ignore port attributes label --- src/vs/workbench/services/remote/common/tunnelModel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/services/remote/common/tunnelModel.ts b/src/vs/workbench/services/remote/common/tunnelModel.ts index 14f20e126ad98..bd6f0fb458972 100644 --- a/src/vs/workbench/services/remote/common/tunnelModel.ts +++ b/src/vs/workbench/services/remote/common/tunnelModel.ts @@ -459,6 +459,7 @@ export class TunnelModel extends Disposable { protocol: attributes?.get(tunnel.tunnelRemotePort)?.protocol ?? TunnelProtocol.Http, localUri: await this.makeLocalUri(tunnel.localAddress, attributes?.get(tunnel.tunnelRemotePort)), localPort: tunnel.tunnelLocalPort, + name: attributes?.get(tunnel.tunnelRemotePort)?.label, runningProcess: matchingCandidate?.detail, hasRunningProcess: !!matchingCandidate, pid: matchingCandidate?.pid, @@ -486,6 +487,7 @@ export class TunnelModel extends Disposable { protocol: attributes?.protocol ?? TunnelProtocol.Http, localUri: await this.makeLocalUri(tunnel.localAddress, attributes), localPort: tunnel.tunnelLocalPort, + name: attributes?.label, closeable: true, runningProcess: matchingCandidate?.detail, hasRunningProcess: !!matchingCandidate, From 84c007cbb21ba792fef8dba1a1f89de00ff50b19 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 5 Jul 2024 12:43:24 +0200 Subject: [PATCH 669/755] Fixes #219006. Open file now opens the related file on disk, instead of just the right side. This also applies to staged files. --- .../multiDiffEditorViewModel.ts | 5 +-- .../multiDiffEditor/multiDiffEditorWidget.ts | 6 +++- .../multiDiffEditorWidgetImpl.ts | 10 ++++++ .../api/browser/mainThreadEditorTabs.ts | 6 ++-- src/vs/workbench/common/editor.ts | 5 ++- .../bulkEdit/browser/preview/bulkEditPane.ts | 19 +++++++---- .../multiDiffEditor/browser/actions.ts | 33 +++++++++++-------- .../browser/multiDiffEditor.ts | 10 +++++- .../browser/multiDiffEditorInput.ts | 27 ++++++++++----- .../browser/multiDiffSourceResolverService.ts | 9 ++--- .../browser/scmMultiDiffSourceResolver.ts | 2 +- 11 files changed, 90 insertions(+), 42 deletions(-) diff --git a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorViewModel.ts b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorViewModel.ts index a044eb438edb0..b58d7303e667d 100644 --- a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorViewModel.ts +++ b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorViewModel.ts @@ -69,8 +69,9 @@ export class DocumentDiffItemViewModel extends Disposable { { contentHeight: 500, selections: undefined, } ); - public get originalUri(): URI | undefined { return this.entry.value!.original?.uri; } - public get modifiedUri(): URI | undefined { return this.entry.value!.modified?.uri; } + public get documentDiffItem(): IDocumentDiffItem { return this.entry.value!; } + public get originalUri(): URI | undefined { return this.documentDiffItem.original?.uri; } + public get modifiedUri(): URI | undefined { return this.documentDiffItem.modified?.uri; } public readonly isActive: IObservable = derived(this, reader => this._editorViewModel.activeDiffItem.read(reader) === this); diff --git a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts index 9d8ace1ea5ba5..8275c4f734582 100644 --- a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts +++ b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidget.ts @@ -7,7 +7,7 @@ import { Dimension } from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { derived, derivedWithStore, observableValue, recomputeInitiallyAndOnChange } from 'vs/base/common/observable'; import { readHotReloadableExport } from 'vs/base/common/hotReloadHelpers'; -import { IMultiDiffEditorModel } from 'vs/editor/browser/widget/multiDiffEditor/model'; +import { IDocumentDiffItem, IMultiDiffEditorModel } from 'vs/editor/browser/widget/multiDiffEditor/model'; import { IMultiDiffEditorViewState, IMultiDiffResourceId, MultiDiffEditorWidgetImpl } from 'vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl'; import { MultiDiffEditorViewModel } from './multiDiffEditorViewModel'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -81,6 +81,10 @@ export class MultiDiffEditorWidget extends Disposable { public tryGetCodeEditor(resource: URI): { diffEditor: IDiffEditor; editor: ICodeEditor } | undefined { return this._widgetImpl.get().tryGetCodeEditor(resource); } + + public findDocumentDiffItem(resource: URI): IDocumentDiffItem | undefined { + return this._widgetImpl.get().findDocumentDiffItem(resource); + } } export interface RevealOptions { diff --git a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts index eab554dbdfbcd..96cccc0afb8ce 100644 --- a/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts +++ b/src/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.ts @@ -31,6 +31,7 @@ import { DiffEditorItemTemplate, TemplateData } from './diffEditorItemTemplate'; import { DocumentDiffItemViewModel, MultiDiffEditorViewModel } from './multiDiffEditorViewModel'; import { ObjectPool } from './objectPool'; import { localize } from 'vs/nls'; +import { IDocumentDiffItem } from 'vs/editor/browser/widget/multiDiffEditor/model'; export class MultiDiffEditorWidgetImpl extends Disposable { private readonly _scrollableElements = h('div.scrollContent', [ @@ -263,6 +264,14 @@ export class MultiDiffEditorWidgetImpl extends Disposable { }); } + public findDocumentDiffItem(resource: URI): IDocumentDiffItem | undefined { + const item = this._viewItems.get().find(v => + v.viewModel.diffEditorViewModel.model.modified.uri.toString() === resource.toString() + || v.viewModel.diffEditorViewModel.model.original.uri.toString() === resource.toString() + ); + return item?.viewModel.documentDiffItem; + } + public tryGetCodeEditor(resource: URI): { diffEditor: IDiffEditor; editor: ICodeEditor } | undefined { const item = this._viewItems.get().find(v => v.viewModel.diffEditorViewModel.model.modified.uri.toString() === resource.toString() @@ -272,6 +281,7 @@ export class MultiDiffEditorWidgetImpl extends Disposable { if (!editor) { return undefined; } + if (item.viewModel.diffEditorViewModel.model.modified.uri.toString() === resource.toString()) { return { diffEditor: editor, editor: editor.getModifiedEditor() }; } else { diff --git a/src/vs/workbench/api/browser/mainThreadEditorTabs.ts b/src/vs/workbench/api/browser/mainThreadEditorTabs.ts index 48888b0ddcb73..9bf27279db0dd 100644 --- a/src/vs/workbench/api/browser/mainThreadEditorTabs.ts +++ b/src/vs/workbench/api/browser/mainThreadEditorTabs.ts @@ -207,11 +207,11 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape { if (editor instanceof MultiDiffEditorInput) { const diffEditors: TextDiffInputDto[] = []; for (const resource of (editor?.resources.get() ?? [])) { - if (resource.original && resource.modified) { + if (resource.originalUri && resource.modifiedUri) { diffEditors.push({ kind: TabInputKind.TextDiffInput, - original: resource.original, - modified: resource.modified + original: resource.originalUri, + modified: resource.modifiedUri }); } } diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 02aff158f4fee..d3d6adb4ff563 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -547,7 +547,7 @@ export interface IResourceMultiDiffEditorInput extends IBaseUntypedEditorInput { * The list of resources to compare. * If not set, the resources are dynamically derived from the {@link multiDiffSource}. */ - readonly resources?: IResourceDiffEditorInput[]; + readonly resources?: IMultiDiffEditorResource[]; /** * Whether the editor should be serialized and stored for subsequent sessions. @@ -555,6 +555,9 @@ export interface IResourceMultiDiffEditorInput extends IBaseUntypedEditorInput { readonly isTransient?: boolean; } +export interface IMultiDiffEditorResource extends IResourceDiffEditorInput { + readonly goToFileResource?: URI; +} export type IResourceMergeEditorInputSide = (IResourceEditorInput | ITextResourceEditorInput) & { detail?: string }; /** diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts index 3c68921a8e535..aa210e91cf3e4 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts @@ -36,7 +36,7 @@ import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; import { ButtonBar } from 'vs/base/browser/ui/button/button'; import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; import { Mutable } from 'vs/base/common/types'; -import { IResourceDiffEditorInput } from 'vs/workbench/common/editor'; +import { IMultiDiffEditorResource, IResourceDiffEditorInput, IResourceMultiDiffEditorInput } from 'vs/workbench/common/editor'; import { IMultiDiffEditorOptions, IMultiDiffResourceId } from 'vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl'; import { IRange } from 'vs/editor/common/core/range'; import { CachedFunction, LRUCachedFunction } from 'vs/base/common/cache'; @@ -369,16 +369,20 @@ export class BulkEditPane extends ViewPane { }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } - private readonly _computeResourceDiffEditorInputs = new LRUCachedFunction(async (fileOperations: BulkFileOperation[]) => { - const computeDiffEditorInput = new CachedFunction>(async (fileOperation) => { + private readonly _computeResourceDiffEditorInputs = new LRUCachedFunction< + BulkFileOperation[], + Promise<{ resources: IMultiDiffEditorResource[]; getResourceDiffEditorInputIdOfOperation: (operation: BulkFileOperation) => Promise }> + >(async (fileOperations) => { + const computeDiffEditorInput = new CachedFunction>(async (fileOperation) => { const fileOperationUri = fileOperation.uri; const previewUri = this._currentProvider!.asPreviewUri(fileOperationUri); // delete if (fileOperation.type & BulkFileOperationType.Delete) { return { original: { resource: URI.revive(previewUri) }, - modified: { resource: undefined } - }; + modified: { resource: undefined }, + goToFileResource: fileOperation.uri, + } satisfies IMultiDiffEditorResource; } // rename, create, edits @@ -392,8 +396,9 @@ export class BulkEditPane extends ViewPane { } return { original: { resource: URI.revive(leftResource) }, - modified: { resource: URI.revive(previewUri) } - }; + modified: { resource: URI.revive(previewUri) }, + goToFileResource: leftResource, + } satisfies IMultiDiffEditorResource; } }); diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts index 5419dba32dce3..30e6c69a64122 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts @@ -10,9 +10,9 @@ import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { localize2 } from 'vs/nls'; import { Action2, MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ITextEditorOptions, TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { resolveCommandsContext } from 'vs/workbench/browser/parts/editor/editorCommandsContext'; -import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor'; import { MultiDiffEditor } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor'; import { MultiDiffEditorInput } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -38,21 +38,28 @@ export class GoToFileAction extends Action2 { const editorService = accessor.get(IEditorService); const activeEditorPane = editorService.activeEditorPane; let selections: Selection[] | undefined = undefined; - if (activeEditorPane instanceof MultiDiffEditor) { - const editor = activeEditorPane.tryGetCodeEditor(uri); - if (editor) { - selections = editor.editor.getSelections() ?? undefined; - } + if (!(activeEditorPane instanceof MultiDiffEditor)) { + return; + } + + const editor = activeEditorPane.tryGetCodeEditor(uri); + if (editor) { + selections = editor.editor.getSelections() ?? undefined; } - const editor = await editorService.openEditor({ resource: uri }); - if (selections && (editor instanceof TextFileEditor)) { - const c = editor.getControl(); - if (c) { - c.setSelections(selections); - c.revealLineInCenter(selections[0].selectionStartLineNumber); - } + let targetUri = uri; + const item = activeEditorPane.findDocumentDiffItem(uri); + if (item && item.goToFileUri) { + targetUri = item.goToFileUri; } + + await editorService.openEditor({ + resource: targetUri, + options: { + selection: selections?.[0], + selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport, + } satisfies ITextEditorOptions, + }); } } diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts index ffe7a8738f523..2b5168dea9bfb 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.ts @@ -18,7 +18,7 @@ import { AbstractEditorWithViewState } from 'vs/workbench/browser/parts/editor/e import { ICompositeControl } from 'vs/workbench/common/composite'; import { IEditorOpenContext } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { MultiDiffEditorInput } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput'; +import { IDocumentDiffItemWithMultiDiffEditorItem, MultiDiffEditorInput } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput'; import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { URI } from 'vs/base/common/uri'; @@ -27,6 +27,7 @@ import { IMultiDiffEditorOptions, IMultiDiffEditorViewState } from 'vs/editor/br import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IDiffEditor } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; +import { MultiDiffEditorItem } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService'; export class MultiDiffEditor extends AbstractEditorWithViewState { static readonly ID = 'multiDiffEditor'; @@ -139,6 +140,13 @@ export class MultiDiffEditor extends AbstractEditorWithViewState new MultiDiffEditorItem( resource.originalUri ? URI.parse(resource.originalUri) : undefined, resource.modifiedUri ? URI.parse(resource.modifiedUri) : undefined, + resource.goToFileUri ? URI.parse(resource.goToFileUri) : undefined, )), false ); @@ -112,8 +114,9 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor label: this.label, multiDiffSourceUri: this.multiDiffSource.toString(), resources: this.initialResources?.map(resource => ({ - originalUri: resource.original?.toString(), - modifiedUri: resource.modified?.toString(), + originalUri: resource.originalUri?.toString(), + modifiedUri: resource.modifiedUri?.toString(), + goToFileUri: resource.goToFileUri?.toString(), })), }; } @@ -159,8 +162,8 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor try { [original, modified] = await Promise.all([ - r.original ? this._textModelService.createModelReference(r.original) : undefined, - r.modified ? this._textModelService.createModelReference(r.modified) : undefined, + r.originalUri ? this._textModelService.createModelReference(r.originalUri) : undefined, + r.modifiedUri ? this._textModelService.createModelReference(r.modifiedUri) : undefined, ]); if (original) { store2.add(original); } if (modified) { store2.add(modified); } @@ -171,8 +174,9 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor return undefined; } - const uri = (r.modified ?? r.original)!; - return new ConstLazyPromise({ + const uri = (r.modifiedUri ?? r.originalUri)!; + return new ConstLazyPromise({ + multiDiffEditorItem: r, original: original?.object.textEditorModel, modified: modified?.object.textEditorModel, get options() { @@ -187,7 +191,7 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor } }), }); - }, i => JSON.stringify([i.modified?.toString(), i.original?.toString()])); + }, i => JSON.stringify([i.modifiedUri?.toString(), i.originalUri?.toString()])); const documents = observableValue[]>('documents', []); @@ -239,8 +243,8 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor public readonly resources = derived(this, reader => this._resolvedSource.cachedPromiseResult.read(reader)?.data?.resources.read(reader)); private readonly _isDirtyObservables = mapObservableArrayCached(this, this.resources.map(r => r ?? []), res => { - const isModifiedDirty = res.modified ? isUriDirty(this._textFileService, res.modified) : constObservable(false); - const isOriginalDirty = res.original ? isUriDirty(this._textFileService, res.original) : constObservable(false); + const isModifiedDirty = res.modifiedUri ? isUriDirty(this._textFileService, res.modifiedUri) : constObservable(false); + const isOriginalDirty = res.originalUri ? isUriDirty(this._textFileService, res.originalUri) : constObservable(false); return derived(reader => /** @description modifiedDirty||originalDirty */ isModifiedDirty.read(reader) || isOriginalDirty.read(reader)); }, i => i.getKey()); private readonly _isDirtyObservable = derived(this, reader => this._isDirtyObservables.read(reader).some(isDirty => isDirty.read(reader))) @@ -291,6 +295,10 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor }; } +export interface IDocumentDiffItemWithMultiDiffEditorItem extends IDocumentDiffItem { + multiDiffEditorItem: MultiDiffEditorItem; +} + function isUriDirty(textFileService: ITextFileService, uri: URI) { return observableFromEvent( Event.filter(textFileService.files.onDidChangeDirty, e => e.resource.toString() === uri.toString()), @@ -361,6 +369,7 @@ interface ISerializedMultiDiffEditorInput { resources: { originalUri: string | undefined; modifiedUri: string | undefined; + goToFileUri: string | undefined; }[] | undefined; } diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService.ts index 43f2f3eb899c4..44c3da5801d76 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService.ts @@ -33,16 +33,17 @@ export interface IResolvedMultiDiffSource { export class MultiDiffEditorItem { constructor( - readonly original: URI | undefined, - readonly modified: URI | undefined, + readonly originalUri: URI | undefined, + readonly modifiedUri: URI | undefined, + readonly goToFileUri: URI | undefined, ) { - if (!original && !modified) { + if (!originalUri && !modifiedUri) { throw new BugIndicatingError('Invalid arguments'); } } getKey(): string { - return JSON.stringify([this.modified?.toString(), this.original?.toString()]); + return JSON.stringify([this.modifiedUri?.toString(), this.originalUri?.toString()]); } } diff --git a/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts b/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts index be0e22ab32342..43ff34c3ef565 100644 --- a/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts +++ b/src/vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver.ts @@ -76,7 +76,7 @@ export class ScmMultiDiffSourceResolver implements IMultiDiffSourceResolver { class ScmResolvedMultiDiffSource implements IResolvedMultiDiffSource { private readonly _resources = observableFromEvent( this._group.onDidChangeResources, - () => /** @description resources */ this._group.resources.map(e => new MultiDiffEditorItem(e.multiDiffEditorOriginalUri, e.multiDiffEditorModifiedUri)) + () => /** @description resources */ this._group.resources.map(e => new MultiDiffEditorItem(e.multiDiffEditorOriginalUri, e.multiDiffEditorModifiedUri, e.sourceUri)) ); readonly resources = new ValueWithChangeEventFromObservable(this._resources); From 58ce7c5a2cdc077f3e62d86a0d8cb8c2a0a9ca2b Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 5 Jul 2024 13:50:17 +0200 Subject: [PATCH 670/755] Fixes CI --- .../bulkEdit/browser/preview/bulkEditPane.ts | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts index aa210e91cf3e4..55775a63e36a1 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts @@ -3,44 +3,44 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./bulkEdit'; -import { WorkbenchAsyncDataTree, IOpenEvent } from 'vs/platform/list/browser/listService'; -import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, CategoryElementRenderer, BulkEditNaviLabelProvider, CategoryElement, BulkEditSorter, compareBulkFileOperations } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree'; +import { ButtonBar } from 'vs/base/browser/ui/button/button'; +import type { IAsyncDataTreeViewState } from 'vs/base/browser/ui/tree/asyncDataTree'; +import { ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; +import { CachedFunction, LRUCachedFunction } from 'vs/base/common/cache'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { FuzzyScore } from 'vs/base/common/filters'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { localize } from 'vs/nls'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { BulkEditPreviewProvider, BulkFileOperation, BulkFileOperations, BulkFileOperationType } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview'; -import { ILabelService } from 'vs/platform/label/common/label'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { Mutable } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import 'vs/css!./bulkEdit'; +import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; +import { IMultiDiffEditorOptions, IMultiDiffResourceId } from 'vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl'; +import { IRange } from 'vs/editor/common/core/range'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { localize } from 'vs/nls'; +import { MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { ResourceLabels } from 'vs/workbench/browser/labels'; +import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { MenuId } from 'vs/platform/actions/common/actions'; -import { ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; -import { CancellationToken } from 'vs/base/common/cancellation'; -import type { IAsyncDataTreeViewState } from 'vs/base/browser/ui/tree/asyncDataTree'; -import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { IOpenEvent, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; -import { ButtonBar } from 'vs/base/browser/ui/button/button'; import { defaultButtonStyles } from 'vs/platform/theme/browser/defaultStyles'; -import { Mutable } from 'vs/base/common/types'; -import { IMultiDiffEditorResource, IResourceDiffEditorInput, IResourceMultiDiffEditorInput } from 'vs/workbench/common/editor'; -import { IMultiDiffEditorOptions, IMultiDiffResourceId } from 'vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl'; -import { IRange } from 'vs/editor/common/core/range'; -import { CachedFunction, LRUCachedFunction } from 'vs/base/common/cache'; -import { IHoverService } from 'vs/platform/hover/browser/hover'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { ResourceLabels } from 'vs/workbench/browser/labels'; +import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; +import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IMultiDiffEditorResource, IResourceDiffEditorInput } from 'vs/workbench/common/editor'; +import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { BulkEditPreviewProvider, BulkFileOperation, BulkFileOperations, BulkFileOperationType } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview'; +import { BulkEditAccessibilityProvider, BulkEditDataSource, BulkEditDelegate, BulkEditElement, BulkEditIdentityProvider, BulkEditNaviLabelProvider, BulkEditSorter, CategoryElement, CategoryElementRenderer, compareBulkFileOperations, FileElement, FileElementRenderer, TextEditElement, TextEditElementRenderer } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree'; +import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; const enum State { Data = 'data', From 5ed967a8e2a11dd9a88c311487b1e54d783ff5ec Mon Sep 17 00:00:00 2001 From: Anthony Stewart <150152+a-stewart@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:42:19 +0200 Subject: [PATCH 671/755] Ensure titlebar is at least as tall as the bounding rect of WCO (#211440) * Ensure that the titlebar is always at least as tall as the bounding rectangle of the window controls overlay * Fix formatting --------- Co-authored-by: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> --- src/vs/base/browser/browser.ts | 6 ++++++ src/vs/workbench/browser/parts/titlebar/titlebarPart.ts | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 77f55b943a5a7..87db1c573ed4c 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -133,3 +133,9 @@ export function isStandalone(): boolean { export function isWCOEnabled(): boolean { return (navigator as any)?.windowControlsOverlay?.visible; } + +// Returns the bounding rect of the titlebar area if it is supported and defined +// See docs at https://developer.mozilla.org/en-US/docs/Web/API/WindowControlsOverlay/getTitlebarAreaRect +export function getWCOBoundingRect(): DOMRect | undefined { + return (navigator as any)?.windowControlsOverlay?.getTitlebarAreaRect(); +} diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index bed98fd3b61a8..f610512e84f7e 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/titlebarpart'; import { localize, localize2 } from 'vs/nls'; import { MultiWindowParts, Part } from 'vs/workbench/browser/part'; import { ITitleService } from 'vs/workbench/services/title/browser/titleService'; -import { getZoomFactor, isWCOEnabled } from 'vs/base/browser/browser'; +import { getWCOBoundingRect, getZoomFactor, isWCOEnabled } from 'vs/base/browser/browser'; import { MenuBarVisibility, getTitleBarStyle, getMenuBarVisibility, TitlebarStyle, hasCustomTitlebar, hasNativeTitlebar, DEFAULT_CUSTOM_TITLEBAR_HEIGHT } from 'vs/platform/window/common/window'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; @@ -200,7 +200,11 @@ export class BrowserTitlebarPart extends Part implements ITitlebarPart { readonly maximumWidth: number = Number.POSITIVE_INFINITY; get minimumHeight(): number { - const value = this.isCommandCenterVisible || (isWeb && isWCOEnabled()) ? DEFAULT_CUSTOM_TITLEBAR_HEIGHT : 30; + const wcoEnabled = isWeb && isWCOEnabled(); + let value = this.isCommandCenterVisible || wcoEnabled ? DEFAULT_CUSTOM_TITLEBAR_HEIGHT : 30; + if (wcoEnabled) { + value = Math.max(value, getWCOBoundingRect()?.height ?? 0); + } return value / (this.preventZoom ? getZoomFactor(getWindow(this.element)) : 1); } From 25b4860814c2a44d946401ed0fcee7860fcce696 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 5 Jul 2024 16:28:13 +0200 Subject: [PATCH 672/755] "potential listener LEAK detected" for comment elements that are recreated on every "display" call but not disposed of (#220091) Fixes #219984 --- .../contrib/comments/browser/commentNode.ts | 2 +- .../comments/browser/commentThreadBody.ts | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index 47e5285466c03..f7f6688cfbe28 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -122,7 +122,7 @@ export class CommentNode extends Disposable { super(); this._domNode = dom.$('div.review-comment'); - this._contextKeyService = contextKeyService.createScoped(this._domNode); + this._contextKeyService = this._register(contextKeyService.createScoped(this._domNode)); this._commentContextValue = CommentContextKeys.commentContext.bindTo(this._contextKeyService); if (this.comment.contextValue) { this._commentContextValue.set(this.comment.contextValue); diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts b/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts index 3728fb0273139..7156f465fa58e 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadBody.ts @@ -5,7 +5,7 @@ import * as dom from 'vs/base/browser/dom'; import * as nls from 'vs/nls'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableMap, DisposableStore } from 'vs/base/common/lifecycle'; import * as languages from 'vs/editor/common/languages'; import { Emitter } from 'vs/base/common/event'; import { ICommentService } from 'vs/workbench/contrib/comments/browser/commentService'; @@ -30,7 +30,7 @@ export class CommentThreadBody extends D private _onDidResize = new Emitter(); onDidResize = this._onDidResize.event; - private _commentDisposable = new Map, IDisposable>(); + private _commentDisposable = new DisposableMap, DisposableStore>(); private _markdownRenderer: MarkdownRenderer; get length() { @@ -90,6 +90,7 @@ export class CommentThreadBody extends D } })); + this._commentDisposable.clearAndDisposeAll(); this._commentElements = []; if (this._commentThread.comments) { for (const comment of this._commentThread.comments) { @@ -177,8 +178,7 @@ export class CommentThreadBody extends D // del removed elements for (let i = commentElementsToDel.length - 1; i >= 0; i--) { const commentToDelete = commentElementsToDel[i]; - this._commentDisposable.get(commentToDelete)?.dispose(); - this._commentDisposable.delete(commentToDelete); + this._commentDisposable.deleteAndDispose(commentToDelete); this._commentElements.splice(commentElementsToDelIndex[i], 1); commentToDelete.domNode.remove(); @@ -267,10 +267,12 @@ export class CommentThreadBody extends D this._parentCommentThreadWidget, this._markdownRenderer) as unknown as CommentNode; - this._register(newCommentNode); - this._commentDisposable.set(newCommentNode, newCommentNode.onDidClick(clickedNode => + const disposables: DisposableStore = new DisposableStore(); + disposables.add(newCommentNode.onDidClick(clickedNode => this._setFocusedComment(this._commentElements.findIndex(commentNode => commentNode.comment.uniqueIdInThread === clickedNode.comment.uniqueIdInThread)) )); + disposables.add(newCommentNode); + this._commentDisposable.set(newCommentNode, disposables); return newCommentNode; } @@ -283,6 +285,6 @@ export class CommentThreadBody extends D this._resizeObserver = null; } - this._commentDisposable.forEach(v => v.dispose()); + this._commentDisposable.dispose(); } } From 3a0cc239a9666b8c21572cbaf1e7ec1119354e73 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2024 16:30:50 +0200 Subject: [PATCH 673/755] :up: `jschardet@3.1.3` (#220089) --- extensions/git/package.json | 2 +- extensions/git/yarn.lock | 8 ++++---- package.json | 2 +- remote/package.json | 2 +- remote/web/package.json | 2 +- remote/web/yarn.lock | 8 ++++---- remote/yarn.lock | 8 ++++---- yarn.lock | 39 ++++++++++++++++++++++++++++++------- 8 files changed, 48 insertions(+), 23 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 4fc372e21f77c..f2445eb3978e7 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -3401,7 +3401,7 @@ "@vscode/iconv-lite-umd": "0.7.0", "byline": "^5.0.0", "file-type": "16.5.4", - "jschardet": "3.1.2", + "jschardet": "3.1.3", "picomatch": "2.3.1", "vscode-uri": "^2.0.0", "which": "4.0.0" diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index 06023a6122708..a7e1a693f84dc 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -182,10 +182,10 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -jschardet@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" - integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== +jschardet@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.3.tgz#10c2289fdae91a0aa9de8bba9c59055fd78898d3" + integrity sha512-Q1PKVMK/uu+yjdlobgWIYkUOCR1SqUmW9m/eUJNNj4zI2N12i25v8fYpVf+zCakQeaTdBdhnZTFbVIAVZIVVOg== peek-readable@^4.1.0: version "4.1.0" diff --git a/package.json b/package.json index bfec4be89e000..e8c78dfc686ed 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "@xterm/xterm": "5.6.0-beta.36", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", - "jschardet": "3.1.2", + "jschardet": "3.1.3", "kerberos": "^2.0.1", "minimist": "^1.2.6", "native-is-elevated": "0.7.0", diff --git a/remote/package.json b/remote/package.json index e39eb2215d2c4..bb615b88ea411 100644 --- a/remote/package.json +++ b/remote/package.json @@ -25,7 +25,7 @@ "cookie": "^0.4.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", - "jschardet": "3.1.2", + "jschardet": "3.1.3", "kerberos": "^2.0.1", "minimist": "^1.2.6", "native-watchdog": "^1.4.1", diff --git a/remote/web/package.json b/remote/web/package.json index 320980c976195..f6b57db5ea0e7 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -14,7 +14,7 @@ "@xterm/addon-unicode11": "0.9.0-beta.36", "@xterm/addon-webgl": "0.19.0-beta.36", "@xterm/xterm": "5.6.0-beta.36", - "jschardet": "3.1.2", + "jschardet": "3.1.3", "tas-client-umd": "0.2.0", "vscode-oniguruma": "1.7.0", "vscode-textmate": "9.0.0" diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index 1eb4c1605974f..a28d00372f719 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -90,10 +90,10 @@ js-base64@^3.7.5: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== -jschardet@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" - integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== +jschardet@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.3.tgz#10c2289fdae91a0aa9de8bba9c59055fd78898d3" + integrity sha512-Q1PKVMK/uu+yjdlobgWIYkUOCR1SqUmW9m/eUJNNj4zI2N12i25v8fYpVf+zCakQeaTdBdhnZTFbVIAVZIVVOg== tas-client-umd@0.2.0: version "0.2.0" diff --git a/remote/yarn.lock b/remote/yarn.lock index 9b0e1ec44b59f..0f65b688c179c 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -374,10 +374,10 @@ jsbn@1.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jschardet@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" - integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== +jschardet@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.3.tgz#10c2289fdae91a0aa9de8bba9c59055fd78898d3" + integrity sha512-Q1PKVMK/uu+yjdlobgWIYkUOCR1SqUmW9m/eUJNNj4zI2N12i25v8fYpVf+zCakQeaTdBdhnZTFbVIAVZIVVOg== jsonfile@^6.0.1: version "6.1.0" diff --git a/yarn.lock b/yarn.lock index d3ccc9b18cb82..60395e780d7f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6315,10 +6315,10 @@ jsbn@1.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jschardet@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db" - integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA== +jschardet@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.3.tgz#10c2289fdae91a0aa9de8bba9c59055fd78898d3" + integrity sha512-Q1PKVMK/uu+yjdlobgWIYkUOCR1SqUmW9m/eUJNNj4zI2N12i25v8fYpVf+zCakQeaTdBdhnZTFbVIAVZIVVOg== jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" @@ -9467,7 +9467,7 @@ streamx@^2.18.0: optionalDependencies: bare-events "^2.2.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9502,6 +9502,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -9555,7 +9564,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9583,6 +9592,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10747,7 +10763,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10782,6 +10798,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From ea8d37ead215dae5f62789d4cd247b70ba735730 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 5 Jul 2024 15:38:27 +0200 Subject: [PATCH 674/755] Fall back to basic auth when kerberos errors out (#220034) --- src/vs/workbench/api/node/proxyResolver.ts | 43 +++++++++++----------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index e39d10af2d34b..3e64289d313a9 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -173,29 +173,28 @@ async function lookupProxyAuthorization( } catch (err) { extHostLogService.error('ProxyResolver#lookupProxyAuthorization Kerberos authentication failed', err); } - } else { - const header = authenticate.find(a => /^Basic( |$)/i.test(a)); - if (header) { - try { - state.basicAuthAttempt = (state.basicAuthAttempt || 0) + 1; - const realm = / realm="([^"]+)"/i.exec(header)?.[1]; - extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication lookup', `proxyURL:${proxyURL}`, `realm:${realm}`); - const url = new URL(proxyURL); - const authInfo: AuthInfo = { - scheme: 'basic', - host: url.hostname, - port: Number(url.port), - realm: realm || '', - isProxy: true, - attempt: state.basicAuthAttempt, - }; - const credentials = await extHostWorkspace.lookupAuthorization(authInfo); - if (credentials) { - return 'Basic ' + Buffer.from(`${credentials.username}:${credentials.password}`).toString('base64'); - } - } catch (err) { - extHostLogService.error('ProxyResolver#lookupProxyAuthorization Kerberos authentication failed', err); + } + const basicAuthHeader = authenticate.find(a => /^Basic( |$)/i.test(a)); + if (basicAuthHeader) { + try { + state.basicAuthAttempt = (state.basicAuthAttempt || 0) + 1; + const realm = / realm="([^"]+)"/i.exec(basicAuthHeader)?.[1]; + extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication lookup', `proxyURL:${proxyURL}`, `realm:${realm}`); + const url = new URL(proxyURL); + const authInfo: AuthInfo = { + scheme: 'basic', + host: url.hostname, + port: Number(url.port), + realm: realm || '', + isProxy: true, + attempt: state.basicAuthAttempt, + }; + const credentials = await extHostWorkspace.lookupAuthorization(authInfo); + if (credentials) { + return 'Basic ' + Buffer.from(`${credentials.username}:${credentials.password}`).toString('base64'); } + } catch (err) { + extHostLogService.error('ProxyResolver#lookupProxyAuthorization Kerberos authentication failed', err); } } return undefined; From fd18af08abc3a118ec2d179c4bbcc5d6ed457e0e Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 5 Jul 2024 16:34:05 +0200 Subject: [PATCH 675/755] Cache basic auth (#220034) --- src/vs/workbench/api/node/proxyResolver.ts | 25 ++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index 3e64289d313a9..0df3f98c98052 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -33,7 +33,7 @@ export function connectProxyResolver( const doUseHostProxy = typeof useHostProxy === 'boolean' ? useHostProxy : !initData.remote.isRemote; const params: ProxyAgentParams = { resolveProxy: url => extHostWorkspace.resolveProxy(url), - lookupProxyAuthorization: lookupProxyAuthorization.bind(undefined, extHostWorkspace, extHostLogService, mainThreadTelemetry, configProvider, {}, initData.remote.isRemote), + lookupProxyAuthorization: lookupProxyAuthorization.bind(undefined, extHostWorkspace, extHostLogService, mainThreadTelemetry, configProvider, {}, {}, initData.remote.isRemote), getProxyURL: () => configProvider.getConfiguration('http').get('proxy'), getProxySupport: () => configProvider.getConfiguration('http').get('proxySupport') || 'off', getNoProxyConfig: () => configProvider.getConfiguration('http').get('noProxy') || [], @@ -146,10 +146,11 @@ async function lookupProxyAuthorization( mainThreadTelemetry: MainThreadTelemetryShape, configProvider: ExtHostConfigProvider, proxyAuthenticateCache: Record, + basicAuthCache: Record, isRemote: boolean, proxyURL: string, proxyAuthenticate: string | string[] | undefined, - state: { kerberosRequested?: boolean; basicAuthAttempt?: number } + state: { kerberosRequested?: boolean; basicAuthCacheUsed?: boolean; basicAuthAttempt?: number } ): Promise { const cached = proxyAuthenticateCache[proxyURL]; if (proxyAuthenticate) { @@ -177,6 +178,17 @@ async function lookupProxyAuthorization( const basicAuthHeader = authenticate.find(a => /^Basic( |$)/i.test(a)); if (basicAuthHeader) { try { + const cachedAuth = basicAuthCache[proxyURL]; + if (cachedAuth) { + if (state.basicAuthCacheUsed) { + extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication deleting cached credentials', `proxyURL:${proxyURL}`); + delete basicAuthCache[proxyURL]; + } else { + extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication using cached credentials', `proxyURL:${proxyURL}`); + state.basicAuthCacheUsed = true; + return cachedAuth; + } + } state.basicAuthAttempt = (state.basicAuthAttempt || 0) + 1; const realm = / realm="([^"]+)"/i.exec(basicAuthHeader)?.[1]; extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication lookup', `proxyURL:${proxyURL}`, `realm:${realm}`); @@ -191,10 +203,15 @@ async function lookupProxyAuthorization( }; const credentials = await extHostWorkspace.lookupAuthorization(authInfo); if (credentials) { - return 'Basic ' + Buffer.from(`${credentials.username}:${credentials.password}`).toString('base64'); + extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication received credentials', `proxyURL:${proxyURL}`, `realm:${realm}`); + const auth = 'Basic ' + Buffer.from(`${credentials.username}:${credentials.password}`).toString('base64'); + basicAuthCache[proxyURL] = auth; + return auth; + } else { + extHostLogService.debug('ProxyResolver#lookupProxyAuthorization Basic authentication received no credentials', `proxyURL:${proxyURL}`, `realm:${realm}`); } } catch (err) { - extHostLogService.error('ProxyResolver#lookupProxyAuthorization Kerberos authentication failed', err); + extHostLogService.error('ProxyResolver#lookupProxyAuthorization Basic authentication failed', err); } } return undefined; From e09b537187c2e5f736902ac9f4c101d550416adc Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 5 Jul 2024 17:54:52 +0200 Subject: [PATCH 676/755] List - context menu should work with SVGElement (#220102) --- src/vs/base/browser/dom.ts | 5 +++++ src/vs/base/browser/ui/list/listView.ts | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 66d30c3aca3f4..a6acbe7f3a5e4 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -1184,6 +1184,11 @@ export function isHTMLDivElement(e: unknown): e is HTMLDivElement { return e instanceof HTMLDivElement || e instanceof getWindow(e as Node).HTMLDivElement; } +export function isSVGElement(e: unknown): e is SVGElement { + // eslint-disable-next-line no-restricted-syntax + return e instanceof SVGElement || e instanceof getWindow(e as Node).SVGElement; +} + export function isMouseEvent(e: unknown): e is MouseEvent { // eslint-disable-next-line no-restricted-syntax return e instanceof MouseEvent || e instanceof getWindow(e as UIEvent).MouseEvent; diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 276cba0d2c68b..1dcd981388f82 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { DataTransfers, IDragAndDropData } from 'vs/base/browser/dnd'; -import { $, addDisposableListener, animate, Dimension, getContentHeight, getContentWidth, getTopLeftOffset, getWindow, isAncestor, isHTMLElement, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; +import { $, addDisposableListener, animate, Dimension, getContentHeight, getContentWidth, getTopLeftOffset, getWindow, isAncestor, isHTMLElement, isSVGElement, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { EventType as TouchEventType, Gesture, GestureEvent } from 'vs/base/browser/touch'; @@ -1382,9 +1382,9 @@ export class ListView implements IListView { private getItemIndexFromEventTarget(target: EventTarget | null): number | undefined { const scrollableElement = this.scrollableElement.getDomNode(); - let element: HTMLElement | null = target as (HTMLElement | null); + let element: HTMLElement | SVGElement | null = target as (HTMLElement | SVGElement | null); - while (isHTMLElement(element) && element !== this.rowsContainer && scrollableElement.contains(element)) { + while ((isHTMLElement(element) || isSVGElement(element)) && element !== this.rowsContainer && scrollableElement.contains(element)) { const rawIndex = element.getAttribute('data-index'); if (rawIndex) { From 7c8097dbbfcb9c102a0d3cf014f4ac9b7cfaa0da Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2024 20:06:43 +0200 Subject: [PATCH 677/755] build - reuse the same `date` across builds (#220076) --- build/gulpfile.cli.js | 3 --- build/gulpfile.compile.js | 6 ++++++ build/gulpfile.reh.js | 4 ++-- build/gulpfile.vscode.js | 4 ++-- build/gulpfile.vscode.web.js | 4 ++-- build/lib/date.js | 38 ++++++++++++++++++++++-------------- build/lib/date.ts | 38 ++++++++++++++++++++++-------------- 7 files changed, 58 insertions(+), 39 deletions(-) diff --git a/build/gulpfile.cli.js b/build/gulpfile.cli.js index 86646fdb274ea..592fc74516c5e 100644 --- a/build/gulpfile.cli.js +++ b/build/gulpfile.cli.js @@ -5,8 +5,6 @@ 'use strict'; -//@ts-check - const es = require('event-stream'); const gulp = require('gulp'); const path = require('path'); @@ -24,7 +22,6 @@ const createReporter = require('./lib/reporter').createReporter; const root = 'cli'; const rootAbs = path.resolve(__dirname, '..', root); const src = `${root}/src`; -const targetCliPath = path.join(root, 'target', 'debug', process.platform === 'win32' ? 'code.exe' : 'code'); const platformOpensslDirName = process.platform === 'win32' ? ( diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js index c4947e76cbf52..de8f3c4fb5794 100644 --- a/build/gulpfile.compile.js +++ b/build/gulpfile.compile.js @@ -3,18 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +//@ts-check 'use strict'; const gulp = require('gulp'); const util = require('./lib/util'); +const date = require('./lib/date'); const task = require('./lib/task'); const compilation = require('./lib/compilation'); const optimize = require('./lib/optimize'); +/** + * @param {boolean} disableMangle + */ function makeCompileBuildTask(disableMangle) { return task.series( util.rimraf('out-build'), util.buildWebNodePaths('out-build'), + date.writeISODate('out-build'), compilation.compileApiProposalNamesTask, compilation.compileTask('src', 'out-build', true, { disableMangle }), optimize.optimizeLoaderTask('out-build', 'out-build', true) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 07bf9ff825f12..d7a814b9a1b5a 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -18,7 +18,7 @@ const rename = require('gulp-rename'); const replace = require('gulp-replace'); const filter = require('gulp-filter'); const { getProductionDependencies } = require('./lib/dependencies'); -const { date } = require('./lib/date'); +const { readISODate } = require('./lib/date'); const vfs = require('vinyl-fs'); const packageJson = require('../package.json'); const flatmap = require('gulp-flatmap'); @@ -301,7 +301,7 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa let productJsonContents; const productJsonStream = gulp.src(['product.json'], { base: '.' }) - .pipe(json({ commit, date, version })) + .pipe(json({ commit, date: readISODate('out-build'), version })) .pipe(es.through(function (file) { productJsonContents = file.contents.toString(); this.emit('data', file); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 8923954e12eb4..b3b35466af01e 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -15,7 +15,7 @@ const replace = require('gulp-replace'); const filter = require('gulp-filter'); const util = require('./lib/util'); const { getVersion } = require('./lib/getVersion'); -const { date } = require('./lib/date'); +const { readISODate } = require('./lib/date'); const task = require('./lib/task'); const buildfile = require('../src/buildfile'); const optimize = require('./lib/optimize'); @@ -259,7 +259,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op let productJsonContents; const productJsonStream = gulp.src(['product.json'], { base: '.' }) - .pipe(json({ commit, date, checksums, version })) + .pipe(json({ commit, date: readISODate('out-build'), checksums, version })) .pipe(es.through(function (file) { productJsonContents = file.contents.toString(); this.emit('data', file); diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index ad01b6cfb42e3..0424b12fa45b8 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -12,7 +12,7 @@ const util = require('./lib/util'); const { getVersion } = require('./lib/getVersion'); const task = require('./lib/task'); const optimize = require('./lib/optimize'); -const { date } = require('./lib/date'); +const { readISODate } = require('./lib/date'); const product = require('../product.json'); const rename = require('gulp-rename'); const filter = require('gulp-filter'); @@ -94,7 +94,7 @@ const createVSCodeWebProductConfigurationPatcher = (product) => { ...product, version, commit, - date + date: readISODate('out-build') }); return content.replace('/*BUILD->INSERT_PRODUCT_CONFIGURATION*/', () => productConfiguration.substr(1, productConfiguration.length - 2) /* without { and }*/); } diff --git a/build/lib/date.js b/build/lib/date.js index a3e2554c0166c..77fff0e5073e1 100644 --- a/build/lib/date.js +++ b/build/lib/date.js @@ -4,21 +4,29 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.date = void 0; -function getRoundedBuildDate() { - const now = new Date(); - const minutes = now.getMinutes(); - if (minutes >= 30) { - now.setHours(now.getHours() + 1); - } - now.setMinutes(0, 0, 0); - return now; -} +exports.writeISODate = writeISODate; +exports.readISODate = readISODate; +const path = require("path"); +const fs = require("fs"); +const root = path.join(__dirname, '..', '..'); /** - * An attempt to produce a stable date for the build that can be - * used across processes and build steps that run in parallel almost - * at the same time. The current time is rounded up or down to the - * closest hour. + * Writes a `outDir/date` file with the contents of the build + * so that other tasks during the build process can use it and + * all use the same date. */ -exports.date = getRoundedBuildDate().toISOString(); +function writeISODate(outDir) { + const result = () => new Promise((resolve, _) => { + const outDirectory = path.join(root, outDir); + fs.mkdirSync(outDirectory, { recursive: true }); + const date = new Date().toISOString(); + fs.writeFileSync(path.join(outDirectory, 'date'), date, 'utf8'); + resolve(); + }); + result.taskName = 'build-date-file'; + return result; +} +function readISODate(outDir) { + const outDirectory = path.join(root, outDir); + return fs.readFileSync(path.join(outDirectory, 'date'), 'utf8'); +} //# sourceMappingURL=date.js.map \ No newline at end of file diff --git a/build/lib/date.ts b/build/lib/date.ts index a68a4caf3df83..998e89f8e6ab1 100644 --- a/build/lib/date.ts +++ b/build/lib/date.ts @@ -3,23 +3,31 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -function getRoundedBuildDate() { - const now = new Date(); +import * as path from 'path'; +import * as fs from 'fs'; - const minutes = now.getMinutes(); - if (minutes >= 30) { - now.setHours(now.getHours() + 1); - } +const root = path.join(__dirname, '..', '..'); - now.setMinutes(0, 0, 0); +/** + * Writes a `outDir/date` file with the contents of the build + * so that other tasks during the build process can use it and + * all use the same date. + */ +export function writeISODate(outDir: string) { + const result = () => new Promise((resolve, _) => { + const outDirectory = path.join(root, outDir); + fs.mkdirSync(outDirectory, { recursive: true }); + + const date = new Date().toISOString(); + fs.writeFileSync(path.join(outDirectory, 'date'), date, 'utf8'); - return now; + resolve(); + }); + result.taskName = 'build-date-file'; + return result; } -/** - * An attempt to produce a stable date for the build that can be - * used across processes and build steps that run in parallel almost - * at the same time. The current time is rounded up or down to the - * closest hour. - */ -export const date = getRoundedBuildDate().toISOString(); +export function readISODate(outDir: string): string { + const outDirectory = path.join(root, outDir); + return fs.readFileSync(path.join(outDirectory, 'date'), 'utf8'); +} From 80bdfeb895582481d62fbfedb90e7ab3738b7437 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Jul 2024 20:29:48 +0200 Subject: [PATCH 678/755] chore - push workaround and a lint rule for https://github.com/evanw/esbuild/issues/3823 (#220077) * chore - push workaround and a lint rule for https://github.com/evanw/esbuild/issues/3823 * modernize `tsconfig.monaco` --- .eslintplugin/code-no-static-self-ref.ts | 56 +++++++++++++++++++ .eslintrc.json | 12 +++- src/tsconfig.monaco.json | 2 +- .../features/overviewRulerFeature.ts | 2 +- .../browser/inlineEditController.ts | 4 +- .../browser/gotoSymbolQuickAccess.ts | 2 +- .../api/common/extHostDiagnostics.ts | 2 +- .../browser/parts/editor/editorPlaceholder.ts | 4 +- .../notifications/notificationsToasts.ts | 2 +- .../bulkEdit/browser/preview/bulkEditPane.ts | 2 +- .../browser/preview/bulkEditPreview.ts | 2 +- .../contrib/chat/common/voiceChatService.ts | 8 +-- .../extensions/browser/extensionsActions.ts | 32 +++++------ .../preferences/browser/settingsEditor2.ts | 2 +- .../preferences/browser/settingsTree.ts | 4 +- .../common/untitledTextEditorModel.ts | 2 +- 16 files changed, 102 insertions(+), 36 deletions(-) create mode 100644 .eslintplugin/code-no-static-self-ref.ts diff --git a/.eslintplugin/code-no-static-self-ref.ts b/.eslintplugin/code-no-static-self-ref.ts new file mode 100644 index 0000000000000..7c6e13032ae8c --- /dev/null +++ b/.eslintplugin/code-no-static-self-ref.ts @@ -0,0 +1,56 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as eslint from 'eslint'; +import { TSESTree } from '@typescript-eslint/experimental-utils'; + +/** + * WORKAROUND for https://github.com/evanw/esbuild/issues/3823 + */ +export = new class implements eslint.Rule.RuleModule { + + create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { + + function checkProperty(inNode: any) { + + const classDeclaration = context.getAncestors().find(node => node.type === 'ClassDeclaration'); + const propertyDefinition = inNode; + + if (!classDeclaration || !classDeclaration.id?.name) { + return; + } + + if (!propertyDefinition.value) { + return; + } + + const classCtor = classDeclaration.body.body.find(node => node.type === 'MethodDefinition' && node.kind === 'constructor') + + if (!classCtor) { + return; + } + + const name = classDeclaration.id.name; + const valueText = context.getSourceCode().getText(propertyDefinition.value) + + if (valueText.includes(name + '.')) { + + if (classCtor.value?.type === 'FunctionExpression' && !classCtor.value.params.find((param: any) => param.type === 'TSParameterProperty' && param.decorators?.length > 0)) { + return + } + + context.report({ + loc: propertyDefinition.value.loc, + message: `Static properties in decorated classes should not reference the class they are defined in. Use 'this' instead. This is a workaround for https://github.com/evanw/esbuild/issues/3823.` + }); + } + + } + + return { + 'PropertyDefinition[static=true]': checkProperty, + }; + } +}; diff --git a/.eslintrc.json b/.eslintrc.json index db383e0b9b482..c39a66311e4fc 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -141,6 +141,14 @@ ] } }, + { + "files": [ + "src/**/*.ts" + ], + "rules": { + "local/code-no-static-self-ref": "warn" + } + }, { "files": [ "src/vs/**/*.test.ts" @@ -1090,7 +1098,9 @@ "local/code-no-runtime-import": [ "error", { - "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": ["**/*"] + "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": [ + "**/*" + ] } ] } diff --git a/src/tsconfig.monaco.json b/src/tsconfig.monaco.json index 8f955fa3c9fc4..bad9fb8cacc21 100644 --- a/src/tsconfig.monaco.json +++ b/src/tsconfig.monaco.json @@ -11,7 +11,7 @@ "moduleResolution": "classic", "removeComments": false, "preserveConstEnums": true, - "target": "es2018", + "target": "ES2022", "sourceMap": false, "declaration": true }, diff --git a/src/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.ts b/src/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.ts index 8141cd9452cf0..017d8268f6e98 100644 --- a/src/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.ts +++ b/src/vs/editor/browser/widget/diffEditor/features/overviewRulerFeature.ts @@ -23,7 +23,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; export class OverviewRulerFeature extends Disposable { private static readonly ONE_OVERVIEW_WIDTH = 15; - public static readonly ENTIRE_DIFF_OVERVIEW_WIDTH = OverviewRulerFeature.ONE_OVERVIEW_WIDTH * 2; + public static readonly ENTIRE_DIFF_OVERVIEW_WIDTH = this.ONE_OVERVIEW_WIDTH * 2; public readonly width = OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH; constructor( diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts index 9ce9a02b2e671..74053d4a617ef 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts @@ -35,11 +35,11 @@ export class InlineEditController extends Disposable { static ID = 'editor.contrib.inlineEditController'; public static readonly inlineEditVisibleKey = 'inlineEditVisible'; - public static readonly inlineEditVisibleContext = new RawContextKey(InlineEditController.inlineEditVisibleKey, false); + public static readonly inlineEditVisibleContext = new RawContextKey(this.inlineEditVisibleKey, false); private _isVisibleContext = InlineEditController.inlineEditVisibleContext.bindTo(this.contextKeyService); public static readonly cursorAtInlineEditKey = 'cursorAtInlineEdit'; - public static readonly cursorAtInlineEditContext = new RawContextKey(InlineEditController.cursorAtInlineEditKey, false); + public static readonly cursorAtInlineEditContext = new RawContextKey(this.cursorAtInlineEditKey, false); private _isCursorAtInlineEditContext = InlineEditController.cursorAtInlineEditContext.bindTo(this.contextKeyService); public static get(editor: ICodeEditor): InlineEditController | null { diff --git a/src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts b/src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts index 46aeeda1706c1..d34aeb3faf515 100644 --- a/src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts +++ b/src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts @@ -48,7 +48,7 @@ export abstract class AbstractGotoSymbolQuickAccessProvider extends AbstractEdit static PREFIX = '@'; static SCOPE_PREFIX = ':'; - static PREFIX_BY_CATEGORY = `${AbstractGotoSymbolQuickAccessProvider.PREFIX}${AbstractGotoSymbolQuickAccessProvider.SCOPE_PREFIX}`; + static PREFIX_BY_CATEGORY = `${this.PREFIX}${this.SCOPE_PREFIX}`; protected override readonly options: IGotoSymbolQuickAccessProviderOptions; diff --git a/src/vs/workbench/api/common/extHostDiagnostics.ts b/src/vs/workbench/api/common/extHostDiagnostics.ts index e23ce395cc8f7..da9a087fbb10c 100644 --- a/src/vs/workbench/api/common/extHostDiagnostics.ts +++ b/src/vs/workbench/api/common/extHostDiagnostics.ts @@ -234,7 +234,7 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { private static _idPool: number = 0; private static readonly _maxDiagnosticsPerFile: number = 1000; - private static readonly _maxDiagnosticsTotal: number = 1.1 * ExtHostDiagnostics._maxDiagnosticsPerFile; + private static readonly _maxDiagnosticsTotal: number = 1.1 * this._maxDiagnosticsPerFile; private readonly _proxy: MainThreadDiagnosticsShape; private readonly _collections = new Map(); diff --git a/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts b/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts index def52c5b61ea8..e434679f445e6 100644 --- a/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts +++ b/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts @@ -185,7 +185,7 @@ export class WorkspaceTrustRequiredPlaceholderEditor extends EditorPlaceholder { static readonly ID = 'workbench.editors.workspaceTrustRequiredEditor'; private static readonly LABEL = localize('trustRequiredEditor', "Workspace Trust Required"); - static readonly DESCRIPTOR = EditorPaneDescriptor.create(WorkspaceTrustRequiredPlaceholderEditor, WorkspaceTrustRequiredPlaceholderEditor.ID, WorkspaceTrustRequiredPlaceholderEditor.LABEL); + static readonly DESCRIPTOR = EditorPaneDescriptor.create(WorkspaceTrustRequiredPlaceholderEditor, this.ID, this.LABEL); constructor( group: IEditorGroup, @@ -223,7 +223,7 @@ export class ErrorPlaceholderEditor extends EditorPlaceholder { private static readonly ID = 'workbench.editors.errorEditor'; private static readonly LABEL = localize('errorEditor', "Error Editor"); - static readonly DESCRIPTOR = EditorPaneDescriptor.create(ErrorPlaceholderEditor, ErrorPlaceholderEditor.ID, ErrorPlaceholderEditor.LABEL); + static readonly DESCRIPTOR = EditorPaneDescriptor.create(ErrorPlaceholderEditor, this.ID, this.LABEL); constructor( group: IEditorGroup, diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index c42e49f26299f..943136732c1ef 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -55,7 +55,7 @@ export class NotificationsToasts extends Themable implements INotificationsToast // Count for the number of notifications over 800ms... interval: 800, // ...and ensure we are not showing more than MAX_NOTIFICATIONS - limit: NotificationsToasts.MAX_NOTIFICATIONS + limit: this.MAX_NOTIFICATIONS }; private readonly _onDidChangeVisibility = this._register(new Emitter()); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts index 55775a63e36a1..a24720d5b7518 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts @@ -56,7 +56,7 @@ export class BulkEditPane extends ViewPane { static readonly ctxGroupByFile = new RawContextKey('refactorPreview.groupByFile', true); static readonly ctxHasCheckedChanges = new RawContextKey('refactorPreview.hasCheckedChanges', true); - private static readonly _memGroupByFile = `${BulkEditPane.ID}.groupByFile`; + private static readonly _memGroupByFile = `${this.ID}.groupByFile`; private _tree!: WorkbenchAsyncDataTree; private _treeDataSource!: BulkEditDataSource; diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts index 40fbb606f8b96..44c687a6deea5 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts @@ -353,7 +353,7 @@ export class BulkEditPreviewProvider implements ITextModelContentProvider { private static readonly Schema = 'vscode-bulkeditpreview-editor'; - static emptyPreview = URI.from({ scheme: BulkEditPreviewProvider.Schema, fragment: 'empty' }); + static emptyPreview = URI.from({ scheme: this.Schema, fragment: 'empty' }); static fromPreviewUri(uri: URI): URI { diff --git a/src/vs/workbench/contrib/chat/common/voiceChatService.ts b/src/vs/workbench/contrib/chat/common/voiceChatService.ts index c162f5859d7f9..ae70f2f56a12c 100644 --- a/src/vs/workbench/contrib/chat/common/voiceChatService.ts +++ b/src/vs/workbench/contrib/chat/common/voiceChatService.ts @@ -70,13 +70,13 @@ export class VoiceChatService extends Disposable implements IVoiceChatService { private static readonly COMMAND_PREFIX = chatSubcommandLeader; private static readonly PHRASES_LOWER = { - [VoiceChatService.AGENT_PREFIX]: 'at', - [VoiceChatService.COMMAND_PREFIX]: 'slash' + [this.AGENT_PREFIX]: 'at', + [this.COMMAND_PREFIX]: 'slash' }; private static readonly PHRASES_UPPER = { - [VoiceChatService.AGENT_PREFIX]: 'At', - [VoiceChatService.COMMAND_PREFIX]: 'Slash' + [this.AGENT_PREFIX]: 'At', + [this.COMMAND_PREFIX]: 'Slash' }; private static readonly CHAT_AGENT_ALIAS = new Map([['vscode', 'code']]); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 03c914611e92f..3ab22820d49ec 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -366,8 +366,8 @@ export class ButtonWithDropdownExtensionActionViewItem extends ActionWithDropdow export class InstallAction extends ExtensionAction { - static readonly CLASS = `${ExtensionAction.LABEL_ACTION_CLASS} prominent install`; - private static readonly HIDE = `${InstallAction.CLASS} hide`; + static readonly CLASS = `${this.LABEL_ACTION_CLASS} prominent install`; + private static readonly HIDE = `${this.CLASS} hide`; protected _manifest: IExtensionManifest | null = null; set manifest(manifest: IExtensionManifest | null) { @@ -862,8 +862,8 @@ export class UninstallAction extends ExtensionAction { abstract class AbstractUpdateAction extends ExtensionAction { - private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} prominent update`; - private static readonly DisabledClass = `${AbstractUpdateAction.EnabledClass} disabled`; + private static readonly EnabledClass = `${this.LABEL_ACTION_CLASS} prominent update`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; private readonly updateThrottler = new Throttler(); @@ -940,7 +940,7 @@ export class ToggleAutoUpdateForExtensionAction extends ExtensionAction { static readonly LABEL = localize2('enableAutoUpdateLabel', "Auto Update"); private static readonly EnabledClass = `${ExtensionAction.EXTENSION_ACTION_CLASS} auto-update`; - private static readonly DisabledClass = `${ToggleAutoUpdateForExtensionAction.EnabledClass} hide`; + private static readonly DisabledClass = `${this.EnabledClass} hide`; constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @@ -1023,7 +1023,7 @@ export class ToggleAutoUpdatesForPublisherAction extends ExtensionAction { export class MigrateDeprecatedExtensionAction extends ExtensionAction { private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} migrate`; - private static readonly DisabledClass = `${MigrateDeprecatedExtensionAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; constructor( private readonly small: boolean, @@ -1213,7 +1213,7 @@ export class ManageExtensionAction extends DropDownExtensionAction { static readonly ID = 'extensions.manage'; private static readonly Class = `${ExtensionAction.ICON_ACTION_CLASS} manage ` + ThemeIcon.asClassName(manageExtensionIcon); - private static readonly HideManageExtensionClass = `${ManageExtensionAction.Class} hide`; + private static readonly HideManageExtensionClass = `${this.Class} hide`; constructor( @IInstantiationService instantiationService: IInstantiationService, @@ -1370,7 +1370,7 @@ export class TogglePreReleaseExtensionAction extends ExtensionAction { static readonly LABEL = localize('togglePreRleaseLabel', "Pre-Release"); private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} pre-release`; - private static readonly DisabledClass = `${TogglePreReleaseExtensionAction.EnabledClass} hide`; + private static readonly DisabledClass = `${this.EnabledClass} hide`; constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @@ -1653,7 +1653,7 @@ export class DisableDropDownAction extends ButtonWithDropDownExtensionAction { export class ExtensionRuntimeStateAction extends ExtensionAction { private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} reload`; - private static readonly DisabledClass = `${ExtensionRuntimeStateAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; updateWhenCounterExtensionChanges: boolean = true; @@ -1767,7 +1767,7 @@ export class SetColorThemeAction extends ExtensionAction { static readonly TITLE = localize2('workbench.extensions.action.setColorTheme', 'Set Color Theme'); private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} theme`; - private static readonly DisabledClass = `${SetColorThemeAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; constructor( @IExtensionService extensionService: IExtensionService, @@ -1818,7 +1818,7 @@ export class SetFileIconThemeAction extends ExtensionAction { static readonly TITLE = localize2('workbench.extensions.action.setFileIconTheme', 'Set File Icon Theme'); private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} theme`; - private static readonly DisabledClass = `${SetFileIconThemeAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; constructor( @IExtensionService extensionService: IExtensionService, @@ -1868,7 +1868,7 @@ export class SetProductIconThemeAction extends ExtensionAction { static readonly TITLE = localize2('workbench.extensions.action.setProductIconTheme', 'Set Product Icon Theme'); private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} theme`; - private static readonly DisabledClass = `${SetProductIconThemeAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; constructor( @IExtensionService extensionService: IExtensionService, @@ -1919,7 +1919,7 @@ export class SetLanguageAction extends ExtensionAction { static readonly TITLE = localize2('workbench.extensions.action.setDisplayLanguage', 'Set Display Language'); private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} language`; - private static readonly DisabledClass = `${SetLanguageAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @@ -1955,7 +1955,7 @@ export class ClearLanguageAction extends ExtensionAction { static readonly TITLE = localize2('workbench.extensions.action.clearLanguage', 'Clear Display Language'); private static readonly EnabledClass = `${ExtensionAction.LABEL_ACTION_CLASS} language`; - private static readonly DisabledClass = `${ClearLanguageAction.EnabledClass} disabled`; + private static readonly DisabledClass = `${this.EnabledClass} disabled`; constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @@ -2267,7 +2267,7 @@ export class ConfigureWorkspaceFolderRecommendedExtensionsAction extends Abstrac export class ExtensionStatusLabelAction extends Action implements IExtensionContainer { private static readonly ENABLED_CLASS = `${ExtensionAction.TEXT_ACTION_CLASS} extension-status-label`; - private static readonly DISABLED_CLASS = `${ExtensionStatusLabelAction.ENABLED_CLASS} hide`; + private static readonly DISABLED_CLASS = `${this.ENABLED_CLASS} hide`; private initialStatus: ExtensionState | null = null; private status: ExtensionState | null = null; @@ -2370,7 +2370,7 @@ export class ExtensionStatusLabelAction extends Action implements IExtensionCont export class ToggleSyncExtensionAction extends DropDownExtensionAction { private static readonly IGNORED_SYNC_CLASS = `${ExtensionAction.ICON_ACTION_CLASS} extension-sync ${ThemeIcon.asClassName(syncIgnoredIcon)}`; - private static readonly SYNC_CLASS = `${ToggleSyncExtensionAction.ICON_ACTION_CLASS} extension-sync ${ThemeIcon.asClassName(syncEnabledIcon)}`; + private static readonly SYNC_CLASS = `${this.ICON_ACTION_CLASS} extension-sync ${ThemeIcon.asClassName(syncEnabledIcon)}`; constructor( @IConfigurationService private readonly configurationService: IConfigurationService, diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index f9b11cf76a87d..779b9928b57b7 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -109,7 +109,7 @@ export class SettingsEditor2 extends EditorPane { private static TOC_RESET_WIDTH: number = 200; private static EDITOR_MIN_WIDTH: number = 500; // Below NARROW_TOTAL_WIDTH, we only render the editor rather than the ToC. - private static NARROW_TOTAL_WIDTH: number = SettingsEditor2.TOC_RESET_WIDTH + SettingsEditor2.EDITOR_MIN_WIDTH; + private static NARROW_TOTAL_WIDTH: number = this.TOC_RESET_WIDTH + this.EDITOR_MIN_WIDTH; private static SUGGESTIONS: string[] = [ `@${MODIFIED_SETTING_TAG}`, diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 62a948e5a082c..5d354b7028d5a 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -750,9 +750,9 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre abstract get templateId(): string; static readonly CONTROL_CLASS = 'setting-control-focus-target'; - static readonly CONTROL_SELECTOR = '.' + AbstractSettingRenderer.CONTROL_CLASS; + static readonly CONTROL_SELECTOR = '.' + this.CONTROL_CLASS; static readonly CONTENTS_CLASS = 'setting-item-contents'; - static readonly CONTENTS_SELECTOR = '.' + AbstractSettingRenderer.CONTENTS_CLASS; + static readonly CONTENTS_SELECTOR = '.' + this.CONTENTS_CLASS; static readonly ALL_ROWS_SELECTOR = '.monaco-list-row'; static readonly SETTING_KEY_ATTR = 'data-key'; diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts index 43402bc496ced..46563d9317dbc 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts @@ -70,7 +70,7 @@ export interface IUntitledTextEditorModel extends ITextEditorModel, ILanguageSup export class UntitledTextEditorModel extends BaseTextEditorModel implements IUntitledTextEditorModel { private static readonly FIRST_LINE_NAME_MAX_LENGTH = 40; - private static readonly FIRST_LINE_NAME_CANDIDATE_MAX_LENGTH = UntitledTextEditorModel.FIRST_LINE_NAME_MAX_LENGTH * 10; + private static readonly FIRST_LINE_NAME_CANDIDATE_MAX_LENGTH = this.FIRST_LINE_NAME_MAX_LENGTH * 10; // Support the special '${activeEditorLanguage}' language by // looking up the language id from the editor that is active From fcf6e8027c5727a3087f001f3965d74f0c7b9d2f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 Jul 2024 20:47:37 +0200 Subject: [PATCH 679/755] Blank Window on Dev Container (fix #220007) (#220112) --- src/vs/platform/files/common/files.ts | 2 +- .../contrib/files/browser/views/explorerView.ts | 2 +- .../common/filesConfigurationService.ts | 12 ++++++------ .../services/language/common/languageService.ts | 2 +- src/vs/workbench/services/search/common/search.ts | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 290a991a35d83..82d4f9ba0f3b6 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -1460,7 +1460,7 @@ export interface IGlobPatterns { } export interface IFilesConfiguration { - files: IFilesConfigurationNode; + files?: IFilesConfigurationNode; } export interface IFilesConfigurationNode { diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index a94048551aa3f..940bfb827920b 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -660,7 +660,7 @@ export class ExplorerView extends ViewPane implements IExplorerView { this.setContextKeys(stat); if (stat) { - const enableTrash = this.configurationService.getValue().files.enableTrash; + const enableTrash = Boolean(this.configurationService.getValue().files?.enableTrash); const hasCapability = this.fileService.hasCapability(stat.resource, FileSystemProviderCapabilities.Trash); this.resourceMoveableToTrash.set(enableTrash && hasCapability); } else { diff --git a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts index 4500b974e7214..6a3c782492a20 100644 --- a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts +++ b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts @@ -143,7 +143,7 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi readonly onDidChangeReadonly = this._onDidChangeReadonly.event; private currentGlobalAutoSaveConfiguration: IAutoSaveConfiguration; - private currentFilesAssociationConfiguration: IStringDictionary; + private currentFilesAssociationConfiguration: IStringDictionary | undefined; private currentHotExitConfiguration: string; private readonly autoSaveConfigurationCache = new LRUCache(1000); @@ -317,7 +317,7 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi return this.currentGlobalAutoSaveConfiguration; } - private computeAutoSaveConfiguration(resource: URI | undefined, filesConfiguration: IFilesConfigurationNode): ICachedAutoSaveConfiguration { + private computeAutoSaveConfiguration(resource: URI | undefined, filesConfiguration: IFilesConfigurationNode | undefined): ICachedAutoSaveConfiguration { let autoSave: 'afterDelay' | 'onFocusChange' | 'onWindowChange' | undefined; let autoSaveDelay: number | undefined; let autoSaveWorkspaceFilesOnly: boolean | undefined; @@ -326,10 +326,10 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi let isOutOfWorkspace: boolean | undefined; let isShortAutoSaveDelay: boolean | undefined; - switch (filesConfiguration.autoSave ?? FilesConfigurationService.DEFAULT_AUTO_SAVE_MODE) { + switch (filesConfiguration?.autoSave ?? FilesConfigurationService.DEFAULT_AUTO_SAVE_MODE) { case AutoSaveConfiguration.AFTER_DELAY: { autoSave = 'afterDelay'; - autoSaveDelay = typeof filesConfiguration.autoSaveDelay === 'number' && filesConfiguration.autoSaveDelay >= 0 ? filesConfiguration.autoSaveDelay : FilesConfigurationService.DEFAULT_AUTO_SAVE_DELAY; + autoSaveDelay = typeof filesConfiguration?.autoSaveDelay === 'number' && filesConfiguration.autoSaveDelay >= 0 ? filesConfiguration.autoSaveDelay : FilesConfigurationService.DEFAULT_AUTO_SAVE_DELAY; isShortAutoSaveDelay = autoSaveDelay <= FilesConfigurationService.DEFAULT_AUTO_SAVE_DELAY; break; } @@ -343,7 +343,7 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi break; } - if (filesConfiguration.autoSaveWorkspaceFilesOnly === true) { + if (filesConfiguration?.autoSaveWorkspaceFilesOnly === true) { autoSaveWorkspaceFilesOnly = true; if (resource && !this.contextService.isInsideWorkspace(resource)) { @@ -352,7 +352,7 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi } } - if (filesConfiguration.autoSaveWhenNoErrors === true) { + if (filesConfiguration?.autoSaveWhenNoErrors === true) { autoSaveWhenNoErrors = true; isShortAutoSaveDelay = undefined; // this configuration disables short auto save delay } diff --git a/src/vs/workbench/services/language/common/languageService.ts b/src/vs/workbench/services/language/common/languageService.ts index 1eb86cfd2d3f6..f79548354bf5d 100644 --- a/src/vs/workbench/services/language/common/languageService.ts +++ b/src/vs/workbench/services/language/common/languageService.ts @@ -300,7 +300,7 @@ export class WorkbenchLanguageService extends LanguageService { // Register based on settings if (configuration.files?.associations) { Object.keys(configuration.files.associations).forEach(pattern => { - const langId = configuration.files.associations[pattern]; + const langId = configuration.files!.associations[pattern]; if (typeof langId !== 'string') { this.logService.warn(`Ignoring configured 'files.associations' for '${pattern}' because its type is not a string but '${typeof langId}'`); diff --git a/src/vs/workbench/services/search/common/search.ts b/src/vs/workbench/services/search/common/search.ts index d03e606db74e9..563b0dda24967 100644 --- a/src/vs/workbench/services/search/common/search.ts +++ b/src/vs/workbench/services/search/common/search.ts @@ -462,7 +462,7 @@ export function getExcludes(configuration: ISearchConfiguration, includeSearchEx } if (!fileExcludes || !searchExcludes) { - return fileExcludes || searchExcludes; + return fileExcludes || searchExcludes || undefined; } let allExcludes: glob.IExpression = Object.create(null); From f8b1bef21437608c6fee422ab044253b13224cda Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:48:59 -0700 Subject: [PATCH 680/755] debt: narrow bool object viewmodel type (#220120) Ref #211878 --- .../preferences/browser/settingsTree.ts | 194 ++++++++++++------ .../preferences/browser/settingsWidgets.ts | 27 ++- .../preferences/common/preferences.ts | 2 +- 3 files changed, 148 insertions(+), 75 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 5d354b7028d5a..2c9ea5519cae4 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -61,7 +61,7 @@ import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/prefere import { ISettingOverrideClickEvent, SettingsTreeIndicatorsLabel, getIndicatorsLabelAriaLabel } from 'vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators'; import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; import { ISettingsEditorViewState, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement, inspectSetting, objectSettingSupportsRemoveDefaultValue, settingKeyToDisplayFormat } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; -import { ExcludeSettingWidget, IIncludeExcludeDataItem, IListDataItem, IObjectDataItem, IObjectEnumOption, IObjectKeySuggester, IObjectValueSuggester, ISettingListChangeEvent, IncludeSettingWidget, ListSettingWidget, ObjectSettingCheckboxWidget, ObjectSettingDropdownWidget, ObjectValue, SettingListEvent } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { ExcludeSettingWidget, IBoolObjectDataItem, IIncludeExcludeDataItem, IListDataItem, IObjectDataItem, IObjectEnumOption, IObjectKeySuggester, IObjectValueSuggester, IncludeSettingWidget, ListSettingWidget, ObjectSettingCheckboxWidget, ObjectSettingDropdownWidget, ObjectValue, SettingListEvent } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; import { LANGUAGE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, compareTwoNullableNumbers } from 'vs/workbench/contrib/preferences/common/preferences'; import { settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; import { APPLY_ALL_PROFILES_SETTING, IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; @@ -149,6 +149,16 @@ function getObjectValueType(schema: IJSONSchema): ObjectValue['type'] { } } +function getObjectEntryValueDisplayValue(type: ObjectValue['type'], data: unknown, options: IObjectEnumOption[]): ObjectValue { + if (type === 'boolean') { + return { type, data: !!data }; + } else if (type === 'enum') { + return { type, data: '' + data, options }; + } else { + return { type, data: '' + data }; + } +} + function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectDataItem[] { const elementDefaultValue: Record = typeof element.defaultValue === 'object' ? element.defaultValue ?? {} @@ -185,23 +195,6 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData } if (isDefined(objectProperties) && key in objectProperties) { - if (element.setting.allKeysAreBoolean) { - return { - key: { - type: 'string', - data: key - }, - value: { - type: 'boolean', - data: data[key] - }, - keyDescription: objectProperties[key].description, - removable: false, - resetable: true, - source - } as IObjectDataItem; - } - const valueEnumOptions = getEnumOptionsFromSchema(objectProperties[key]); return { key: { @@ -209,37 +202,29 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData data: key, options: wellDefinedKeyEnumOptions, }, - value: { - type: getObjectValueType(objectProperties[key]), - data: data[key], - options: valueEnumOptions, - }, + value: getObjectEntryValueDisplayValue(getObjectValueType(objectProperties[key]), data[key], valueEnumOptions), keyDescription: objectProperties[key].description, removable: isUndefinedOrNull(defaultValue), resetable: !isUndefinedOrNull(defaultValue), source - } as IObjectDataItem; + } satisfies IObjectDataItem; } // The row is removable if it doesn't have a default value assigned or the setting supports removing the default value. // If a default value is assigned and the user modified the default, it can be reset back to the default. const removable = defaultValue === undefined || objectSettingSupportsRemoveDefaultValue(element.setting.key); - const resetable = defaultValue && defaultValue !== data[key]; + const resetable = !!defaultValue && defaultValue !== data[key]; const schema = patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; if (schema) { const valueEnumOptions = getEnumOptionsFromSchema(schema); return { key: { type: 'string', data: key }, - value: { - type: getObjectValueType(schema), - data: data[key], - options: valueEnumOptions, - }, + value: getObjectEntryValueDisplayValue(getObjectValueType(schema), data[key], valueEnumOptions), keyDescription: schema.description, removable, resetable, source - } as IObjectDataItem; + } satisfies IObjectDataItem; } const additionalValueEnums = getEnumOptionsFromSchema( @@ -250,19 +235,62 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData return { key: { type: 'string', data: key }, - value: { - type: typeof objectAdditionalProperties === 'object' ? getObjectValueType(objectAdditionalProperties) : 'string', - data: data[key], - options: additionalValueEnums, - }, + value: getObjectEntryValueDisplayValue( + typeof objectAdditionalProperties === 'object' ? getObjectValueType(objectAdditionalProperties) : 'string', + data[key], + additionalValueEnums, + ), keyDescription: typeof objectAdditionalProperties === 'object' ? objectAdditionalProperties.description : undefined, removable, resetable, source - } as IObjectDataItem; + } satisfies IObjectDataItem; }).filter(item => !isUndefinedOrNull(item.value.data)); } +function getBoolObjectDisplayValue(element: SettingsTreeSettingElement): IBoolObjectDataItem[] { + const elementDefaultValue: Record = typeof element.defaultValue === 'object' + ? element.defaultValue ?? {} + : {}; + + const elementScopeValue: Record = typeof element.scopeValue === 'object' + ? element.scopeValue ?? {} + : {}; + + const data = element.isConfigured ? + { ...elementDefaultValue, ...elementScopeValue } : + elementDefaultValue; + + const { objectProperties } = element.setting; + const displayValues: IBoolObjectDataItem[] = []; + for (const key in objectProperties) { + const defaultValue = elementDefaultValue[key]; + + // Get source if it's a default value + let source: string | undefined; + if (defaultValue === data[key] && element.setting.type === 'object' && element.defaultValueSource instanceof Map) { + const defaultSource = element.defaultValueSource.get(key); + source = typeof defaultSource === 'string' ? defaultSource : defaultSource?.displayName; + } + + displayValues.push({ + key: { + type: 'string', + data: key + }, + value: { + type: 'boolean', + data: !!data[key] + }, + keyDescription: objectProperties[key].description, + removable: false, + resetable: true, + source + }); + } + return displayValues; +} + function createArraySuggester(element: SettingsTreeSettingElement): IObjectKeySuggester { return (keys, idx) => { const enumOptions: IObjectEnumOption[] = []; @@ -1306,16 +1334,29 @@ abstract class AbstractSettingObjectRenderer extends AbstractSettingRenderer imp } this.addSettingElementFocusHandler(template); + return template; + } + + renderElement(element: ITreeNode, index: number, templateData: ISettingObjectItemTemplate): void { + super.renderSettingElement(element, index, templateData); + } +} +class SettingObjectRenderer extends AbstractSettingObjectRenderer implements ITreeRenderer { + override templateId = SETTINGS_OBJECT_TEMPLATE_ID; + + renderTemplate(container: HTMLElement): ISettingObjectItemTemplate { + const common = this.renderCommonTemplate(null, container, 'list'); + const widget = this._instantiationService.createInstance(ObjectSettingDropdownWidget, common.controlElement); + const template = this.renderTemplateWithWidget(common, widget); common.toDispose.add(widget.onDidChangeList(e => { this.onDidChangeObject(template, e); })); - return template; } - protected onDidChangeObject(template: ISettingObjectItemTemplate, e: SettingListEvent): void { - const widget = (template.objectCheckboxWidget ?? template.objectDropdownWidget)!; + private onDidChangeObject(template: ISettingObjectItemTemplate, e: SettingListEvent): void { + const widget = template.objectDropdownWidget!; if (template.context) { const settingSupportsRemoveDefault = objectSettingSupportsRemoveDefaultValue(template.context.setting.key); const defaultValue: Record = typeof template.context.defaultValue === 'object' @@ -1380,31 +1421,11 @@ abstract class AbstractSettingObjectRenderer extends AbstractSettingRenderer imp }); const newObject = Object.keys(newValue).length === 0 ? undefined : newValue; - - if (template.objectCheckboxWidget) { - template.objectCheckboxWidget.setValue(newItems); - } else { - template.objectDropdownWidget!.setValue(newItems); - } - + template.objectDropdownWidget!.setValue(newItems); template.onChange?.(newObject); } } - renderElement(element: ITreeNode, index: number, templateData: ISettingObjectItemTemplate): void { - super.renderSettingElement(element, index, templateData); - } -} - -class SettingObjectRenderer extends AbstractSettingObjectRenderer implements ITreeRenderer { - override templateId = SETTINGS_OBJECT_TEMPLATE_ID; - - renderTemplate(container: HTMLElement): ISettingObjectItemTemplate { - const common = this.renderCommonTemplate(null, container, 'list'); - const widget = this._instantiationService.createInstance(ObjectSettingDropdownWidget, common.controlElement); - return this.renderTemplateWithWidget(common, widget); - } - protected renderValue(dataElement: SettingsTreeSettingElement, template: ISettingObjectItemTemplate, onChange: (value: Record | undefined) => void): void { const items = getObjectDisplayValue(dataElement); const { key, objectProperties, objectPatternProperties, objectAdditionalProperties } = dataElement.setting; @@ -1447,12 +1468,55 @@ class SettingBoolObjectRenderer extends AbstractSettingObjectRenderer implements renderTemplate(container: HTMLElement): ISettingObjectItemTemplate { const common = this.renderCommonTemplate(null, container, 'list'); const widget = this._instantiationService.createInstance(ObjectSettingCheckboxWidget, common.controlElement); - return this.renderTemplateWithWidget(common, widget); + const template = this.renderTemplateWithWidget(common, widget); + common.toDispose.add(widget.onDidChangeList(e => { + this.onDidChangeObject(template, e); + })); + return template; } - protected override onDidChangeObject(template: ISettingObjectItemTemplate, e: ISettingListChangeEvent): void { + protected onDidChangeObject(template: ISettingObjectItemTemplate, e: SettingListEvent): void { if (template.context) { - super.onDidChangeObject(template, e); + const widget = template.objectCheckboxWidget!; + const defaultValue: Record = typeof template.context.defaultValue === 'object' + ? template.context.defaultValue ?? {} + : {}; + + const scopeValue: Record = typeof template.context.scopeValue === 'object' + ? template.context.scopeValue ?? {} + : {}; + + const newValue: Record = { ...template.context.scopeValue }; // Initialize with scoped values as removed default values are not rendered + const newItems: IBoolObjectDataItem[] = []; + + if (e.type !== 'change') { + console.warn('Unexpected event type', e.type, 'for bool object setting', template.context.setting.key); + return; + } + + widget.items.forEach((item, idx) => { + // Item was updated + if (e.targetIndex === idx) { + newValue[e.newItem.key.data] = e.newItem.value.data; + newItems.push(e.newItem); + } + // All remaining items, but skip the one that we just updated + else if (e.newItem.key.data !== item.key.data) { + newValue[item.key.data] = item.value.data; + newItems.push(item); + } + }); + + Object.entries(newValue).forEach(([key, value]) => { + // value from the scope has changed back to the default + if (scopeValue[key] !== value && defaultValue[key] === value) { + delete newValue[key]; + } + }); + + const newObject = Object.keys(newValue).length === 0 ? undefined : newValue; + template.objectCheckboxWidget!.setValue(newItems); + template.onChange?.(newObject); // Focus this setting explicitly, in case we were previously // focused on another setting and clicked a checkbox/value container @@ -1462,7 +1526,7 @@ class SettingBoolObjectRenderer extends AbstractSettingObjectRenderer implements } protected renderValue(dataElement: SettingsTreeSettingElement, template: ISettingObjectItemTemplate, onChange: (value: Record | undefined) => void): void { - const items = getObjectDisplayValue(dataElement); + const items = getBoolObjectDisplayValue(dataElement); const { key } = dataElement.setting; template.objectCheckboxWidget!.setValue(items, { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index 9e9dcc17e86d1..6d2472b494bc4 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -1288,7 +1288,16 @@ interface IBoolObjectSetValueOptions { settingKey: string; } -export class ObjectSettingCheckboxWidget extends AbstractListSettingWidget { +export interface IBoolObjectDataItem { + key: IObjectStringData; + value: IObjectBoolData; + keyDescription?: string; + source?: string; + removable: false; + resetable: boolean; +} + +export class ObjectSettingCheckboxWidget extends AbstractListSettingWidget { private currentSettingKey: string = ''; constructor( @@ -1300,7 +1309,7 @@ export class ObjectSettingCheckboxWidget extends AbstractListSettingWidget, idx: number, listFocused: boolean): HTMLElement { + protected override renderDataOrEditItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { const rowElement = this.renderEdit(item, idx); rowElement.setAttribute('role', 'listitem'); return rowElement; } - protected renderItem(item: IObjectDataItem, idx: number): RowElementGroup { + protected renderItem(item: IBoolObjectDataItem, idx: number): RowElementGroup { // Return just the containers, since we always render in edit mode anyway const rowElement = $('.blank-row'); const keyElement = $('.blank-row-key'); return { rowElement, keyElement }; } - protected renderEdit(item: IObjectDataItem, idx: number): HTMLElement { + protected renderEdit(item: IBoolObjectDataItem, idx: number): HTMLElement { const rowElement = $('.setting-list-edit-row.setting-list-object-row.setting-item-bool'); const changedItem = { ...item }; @@ -1416,7 +1425,7 @@ export class ObjectSettingCheckboxWidget extends AbstractListSettingWidget string | null; enumItemLabels?: string[]; - allKeysAreBoolean?: boolean; editPresentation?: EditPresentationTypes; nonLanguageSpecificDefaultValueSource?: ConfigurationDefaultValueSource; isLanguageTagSetting?: boolean; categoryLabel?: string; // Internal properties + allKeysAreBoolean?: boolean; displayExtensionId?: string; stableExtensionId?: string; prereleaseExtensionId?: string; From e5e9b167bf8fd2d987d19eb22369556de4324047 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sun, 7 Jul 2024 12:13:41 +0200 Subject: [PATCH 681/755] eng - add `open` module in preparation for default browser support (#220273) --- package.json | 1 + yarn.lock | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/package.json b/package.json index e8c78dfc686ed..81a0e0d416dc4 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta11", + "open": "^8.4.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", "vscode-oniguruma": "1.7.0", diff --git a/yarn.lock b/yarn.lock index 60395e780d7f9..17a69acb6fb6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3646,6 +3646,11 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5935,6 +5940,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6124,6 +6134,13 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + is@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" @@ -7628,6 +7645,15 @@ only@~0.0.2: resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= +open@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + opn@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/opn/-/opn-6.0.0.tgz#3c5b0db676d5f97da1233d1ed42d182bc5a27d2d" From c67cd35e2ee191018b2175bd14903836c311f000 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 7 Jul 2024 12:42:03 +0200 Subject: [PATCH 682/755] fix #217188 (#220108) * fix #217188 * fix hover for "set by extension XY" --------- Co-authored-by: BeniBenj --- .../common/configurationModels.ts | 13 +- .../common/configurationRegistry.ts | 325 +++++++++--------- .../configuration/common/configurations.ts | 4 +- .../test/common/configurationRegistry.test.ts | 66 +++- .../test/common/configurations.test.ts | 8 +- .../preferences/browser/settingsTree.ts | 4 +- .../preferences/browser/settingsTreeModels.ts | 3 +- .../test/browser/configuration.test.ts | 3 +- 8 files changed, 255 insertions(+), 171 deletions(-) diff --git a/src/vs/platform/configuration/common/configurationModels.ts b/src/vs/platform/configuration/common/configurationModels.ts index 8b862b1c93908..553c312d6be3f 100644 --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -279,11 +279,18 @@ export class ConfigurationModel implements IConfigurationModel { this.keys.push(key); } if (OVERRIDE_PROPERTY_REGEX.test(key)) { - this.overrides.push({ - identifiers: overrideIdentifiersFromKey(key), + const identifiers = overrideIdentifiersFromKey(key); + const override = { + identifiers, keys: Object.keys(this.contents[key]), contents: toValuesTree(this.contents[key], message => this.logService.error(message)), - }); + }; + const index = this.overrides.findIndex(o => arrays.equals(o.identifiers, identifiers)); + if (index !== -1) { + this.overrides[index] = override; + } else { + this.overrides.push(override); + } } } } diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 2a93b1068154d..7876af5831eca 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -70,10 +70,15 @@ export interface IConfigurationRegistry { */ deltaConfiguration(delta: IConfigurationDelta): void; + /** + * Return the registered default configurations + */ + getRegisteredDefaultConfigurations(): IConfigurationDefaults[]; + /** * Return the registered configuration defaults overrides */ - getConfigurationDefaultsOverrides(): Map; + getConfigurationDefaultsOverrides(): Map; /** * Signal that the schema of a configuration setting has changes. It is currently only supported to change enumeration values. @@ -251,11 +256,15 @@ export type IRegisteredConfigurationPropertySchema = IConfigurationPropertySchem defaultValueSource?: ConfigurationDefaultValueSource; // Source of the Default Value }; -export type IConfigurationDefaultOverride = { +export interface IConfigurationDefaultOverride { readonly value: any; - readonly source?: ConfigurationDefaultValueSource; // Source of the default override - readonly valuesSources?: Map; // Source of each value in default language overrides -}; + readonly source?: IExtensionInfo; // Source of the default override +} + +export interface IConfigurationDefaultOverrideValue { + readonly value: any; + readonly source?: ConfigurationDefaultValueSource; +} export const allSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; export const applicationSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; @@ -271,7 +280,8 @@ const contributionRegistry = Registry.as(JSONExtensio class ConfigurationRegistry implements IConfigurationRegistry { - private readonly configurationDefaultsOverrides: Map; + private readonly registeredConfigurationDefaults: IConfigurationDefaults[] = []; + private readonly configurationDefaultsOverrides: Map; private readonly defaultLanguageConfigurationOverridesNode: IConfigurationNode; private readonly configurationContributors: IConfigurationNode[]; private readonly configurationProperties: IStringDictionary; @@ -287,7 +297,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { readonly onDidUpdateConfiguration = this._onDidUpdateConfiguration.event; constructor() { - this.configurationDefaultsOverrides = new Map(); + this.configurationDefaultsOverrides = new Map(); this.defaultLanguageConfigurationOverridesNode = { id: 'defaultOverrides', title: nls.localize('defaultLanguageConfigurationOverrides.title', "Default Language Configuration Overrides"), @@ -350,107 +360,47 @@ class ConfigurationRegistry implements IConfigurationRegistry { private doRegisterDefaultConfigurations(configurationDefaults: IConfigurationDefaults[], bucket: Set) { + this.registeredConfigurationDefaults.push(...configurationDefaults); + const overrideIdentifiers: string[] = []; for (const { overrides, source } of configurationDefaults) { for (const key in overrides) { bucket.add(key); + const configurationDefaultOverridesForKey = this.configurationDefaultsOverrides.get(key) + ?? this.configurationDefaultsOverrides.set(key, { configurationDefaultOverrides: [] }).get(key)!; + + const value = overrides[key]; + configurationDefaultOverridesForKey.configurationDefaultOverrides.push({ value, source }); + + // Configuration defaults for Override Identifiers if (OVERRIDE_PROPERTY_REGEX.test(key)) { - const configurationDefaultOverride = this.configurationDefaultsOverrides.get(key); - const valuesSources = configurationDefaultOverride?.valuesSources ?? new Map(); - - const defaultValue = configurationDefaultOverride?.value || {}; - for (const configuration of Object.keys(overrides[key])) { - const overrideValue = overrides[key][configuration]; - - const isObjectSetting = types.isObject(overrideValue) && (types.isUndefined(defaultValue[configuration]) || types.isObject(defaultValue[configuration])); - if (isObjectSetting) { - // Objects are merged instead of overridden - defaultValue[configuration] = { ...(defaultValue[configuration] ?? {}), ...overrideValue }; - - // Track the source of each value in the object - if (source) { - let objectConfigurationSources = valuesSources.get(configuration); - if (!objectConfigurationSources) { - objectConfigurationSources = new Map(); - valuesSources.set(configuration, objectConfigurationSources); - } - if (!(objectConfigurationSources instanceof Map)) { - console.error('objectConfigurationSources is not a Map'); - continue; - } - - for (const objectKey in overrideValue) { - objectConfigurationSources.set(objectKey, source); - } - } - } else { - // Primitive values are overridden - defaultValue[configuration] = overrideValue; - if (source) { - valuesSources.set(configuration, source); - } - } + const newDefaultOverride = this.mergeDefaultConfigurationsForOverrideIdentifier(key, value, source, configurationDefaultOverridesForKey.configurationDefaultOverrideValue); + if (!newDefaultOverride) { + continue; } - this.configurationDefaultsOverrides.set(key, { source, value: defaultValue, valuesSources }); - const plainKey = getLanguageTagSettingPlainKey(key); - const property: IRegisteredConfigurationPropertySchema = { - type: 'object', - default: defaultValue, - description: nls.localize('defaultLanguageConfiguration.description', "Configure settings to be overridden for the {0} language.", plainKey), - $ref: resourceLanguageSettingsSchemaId, - defaultDefaultValue: defaultValue, - source, - defaultValueSource: source - }; + configurationDefaultOverridesForKey.configurationDefaultOverrideValue = newDefaultOverride; + this.updateDefaultOverrideProperty(key, newDefaultOverride, source); overrideIdentifiers.push(...overrideIdentifiersFromKey(key)); - this.configurationProperties[key] = property; - this.defaultLanguageConfigurationOverridesNode.properties![key] = property; - } else { - const property = this.configurationProperties[key]; + } - const existingDefaultOverride = this.configurationDefaultsOverrides.get(key); - let existingDefaultValue = existingDefaultOverride?.value ?? property?.defaultDefaultValue; - - let newDefaultValue = overrides[key]; - let newDefaultValueSource: ConfigurationDefaultValueSource | undefined = source; - - const isObjectSetting = types.isObject(newDefaultValue) && ( - property !== undefined && property.type === 'object' || - property === undefined && (types.isUndefined(existingDefaultValue) || types.isObject(existingDefaultValue))); - - // If the default value is an object, merge the objects and store the source of each keys - if (isObjectSetting) { - if (!types.isObject(existingDefaultValue)) { - existingDefaultValue = {}; - } - - newDefaultValue = { ...existingDefaultValue, ...newDefaultValue }; - - newDefaultValueSource = existingDefaultOverride?.source ?? new Map(); - if (!(newDefaultValueSource instanceof Map)) { - console.error('defaultValueSource is not a Map'); - continue; - } - - for (const overrideObjectKey in overrides[key]) { - if (source) { - newDefaultValueSource.set(overrideObjectKey, source); - } else { - newDefaultValueSource.delete(overrideObjectKey); - } - } + // Configuration defaults for Configuration Properties + else { + const newDefaultOverride = this.mergeDefaultConfigurationsForConfigurationProperty(key, value, source, configurationDefaultOverridesForKey.configurationDefaultOverrideValue); + if (!newDefaultOverride) { + continue; } - this.configurationDefaultsOverrides.set(key, { value: newDefaultValue, source: newDefaultValueSource }); - + configurationDefaultOverridesForKey.configurationDefaultOverrideValue = newDefaultOverride; + const property = this.configurationProperties[key]; if (property) { this.updatePropertyDefaultValue(key, property); this.updateSchema(key, property); } } + } } @@ -465,96 +415,149 @@ class ConfigurationRegistry implements IConfigurationRegistry { } private doDeregisterDefaultConfigurations(defaultConfigurations: IConfigurationDefaults[], bucket: Set): void { + for (const defaultConfiguration of defaultConfigurations) { + const index = this.registeredConfigurationDefaults.indexOf(defaultConfiguration); + if (index !== -1) { + this.registeredConfigurationDefaults.splice(index, 1); + } + } for (const { overrides, source } of defaultConfigurations) { for (const key in overrides) { - const id = source?.id; + const configurationDefaultOverridesForKey = this.configurationDefaultsOverrides.get(key); + if (!configurationDefaultOverridesForKey) { + continue; + } - const configurationDefaultsOverride = this.configurationDefaultsOverrides.get(key); - if (!configurationDefaultsOverride) { + const index = configurationDefaultOverridesForKey.configurationDefaultOverrides + .findIndex(configurationDefaultOverride => source ? configurationDefaultOverride.source?.id === source.id : configurationDefaultOverride.value === overrides[key]); + if (index === -1) { continue; } + configurationDefaultOverridesForKey.configurationDefaultOverrides.splice(index, 1); + if (configurationDefaultOverridesForKey.configurationDefaultOverrides.length === 0) { + this.configurationDefaultsOverrides.delete(key); + } + if (OVERRIDE_PROPERTY_REGEX.test(key)) { - for (const configuration of Object.keys(overrides[key])) { - const overrideValue = overrides[key][configuration]; - - if (types.isObject(overrideValue)) { - const configurationSource = configurationDefaultsOverride.valuesSources?.get(configuration) as Map | undefined; - - for (const overrideObjectKey of Object.keys(overrideValue)) { - const keySource = configurationSource?.get(overrideObjectKey); - const keySourceId = types.isString(keySource) ? keySource : keySource?.id; - if (keySourceId === id) { - configurationSource?.delete(overrideObjectKey); - delete configurationDefaultsOverride.value[configuration][overrideObjectKey]; - } - } - - if (Object.keys(configurationDefaultsOverride.value[configuration]).length === 0) { - delete configurationDefaultsOverride.value[configuration]; - configurationDefaultsOverride.valuesSources?.delete(configuration); - } - } else { - const configurationSource = configurationDefaultsOverride.valuesSources?.get(configuration) as string | IExtensionInfo | undefined; - - const keySourceId = types.isString(configurationSource) ? configurationSource : configurationSource?.id; - if (keySourceId === id) { - configurationDefaultsOverride.valuesSources?.delete(configuration); - delete configurationDefaultsOverride.value[configuration]; - } - } + let configurationDefaultOverrideValue: IConfigurationDefaultOverrideValue | undefined; + for (const configurationDefaultOverride of configurationDefaultOverridesForKey.configurationDefaultOverrides) { + configurationDefaultOverrideValue = this.mergeDefaultConfigurationsForOverrideIdentifier(key, configurationDefaultOverride.value, configurationDefaultOverride.source, configurationDefaultOverrideValue); } - // Remove language configuration if empty ({[css]: {}} => {}) - const languageValues = this.configurationDefaultsOverrides.get(key); - if (languageValues && Object.keys(languageValues.value).length === 0) { + if (configurationDefaultOverrideValue && !types.isEmptyObject(configurationDefaultOverrideValue.value)) { + configurationDefaultOverridesForKey.configurationDefaultOverrideValue = configurationDefaultOverrideValue; + this.updateDefaultOverrideProperty(key, configurationDefaultOverrideValue, source); + } else { this.configurationDefaultsOverrides.delete(key); delete this.configurationProperties[key]; delete this.defaultLanguageConfigurationOverridesNode.properties![key]; } } else { - // If the default value is an object, remove the source of each key - if (configurationDefaultsOverride.source instanceof Map) { - - const keySources = configurationDefaultsOverride.source; - for (const objectKey in overrides[key]) { - const keySource = keySources.get(objectKey); - const keySourceId = types.isString(keySource) ? keySource : keySource?.id; - - if (keySourceId === id) { - keySources.delete(objectKey); - delete configurationDefaultsOverride.value[objectKey]; - } - } - - if (keySources.size === 0) { - this.configurationDefaultsOverrides.delete(key); - } - } - // Otherwise, remove the default value if the source matches - else { - const configurationDefaultsOverrideSourceId = configurationDefaultsOverride.source?.id; - if (id !== configurationDefaultsOverrideSourceId) { - continue; // Another source is overriding this default value - } - - this.configurationDefaultsOverrides.delete(key); - + let configurationDefaultOverrideValue: IConfigurationDefaultOverrideValue | undefined; + for (const configurationDefaultOverride of configurationDefaultOverridesForKey.configurationDefaultOverrides) { + configurationDefaultOverrideValue = this.mergeDefaultConfigurationsForConfigurationProperty(key, configurationDefaultOverride.value, configurationDefaultOverride.source, configurationDefaultOverrideValue); } + configurationDefaultOverridesForKey.configurationDefaultOverrideValue = configurationDefaultOverrideValue; const property = this.configurationProperties[key]; if (property) { this.updatePropertyDefaultValue(key, property); this.updateSchema(key, property); } } - bucket.add(key); } } - this.updateOverridePropertyPatternKey(); } + private updateDefaultOverrideProperty(key: string, newDefaultOverride: IConfigurationDefaultOverrideValue, source: IExtensionInfo | undefined): void { + const property: IRegisteredConfigurationPropertySchema = { + type: 'object', + default: newDefaultOverride.value, + description: nls.localize('defaultLanguageConfiguration.description', "Configure settings to be overridden for the {0} language.", getLanguageTagSettingPlainKey(key)), + $ref: resourceLanguageSettingsSchemaId, + defaultDefaultValue: newDefaultOverride.value, + source, + defaultValueSource: source + }; + this.configurationProperties[key] = property; + this.defaultLanguageConfigurationOverridesNode.properties![key] = property; + } + + private mergeDefaultConfigurationsForOverrideIdentifier(overrideIdentifier: string, configurationValueObject: IStringDictionary, valueSource: IExtensionInfo | undefined, existingDefaultOverride: IConfigurationDefaultOverrideValue | undefined): IConfigurationDefaultOverrideValue | undefined { + const defaultValue = existingDefaultOverride?.value || {}; + const source = existingDefaultOverride?.source ?? new Map(); + + // This should not happen + if (!(source instanceof Map)) { + console.error('objectConfigurationSources is not a Map'); + return undefined; + } + + for (const propertyKey of Object.keys(configurationValueObject)) { + const propertyDefaultValue = configurationValueObject[propertyKey]; + + const isObjectSetting = types.isObject(propertyDefaultValue) && + (types.isUndefined(defaultValue[propertyKey]) || types.isObject(defaultValue[propertyKey])); + + // If the default value is an object, merge the objects and store the source of each keys + if (isObjectSetting) { + defaultValue[propertyKey] = { ...(defaultValue[propertyKey] ?? {}), ...propertyDefaultValue }; + // Track the source of each value in the object + if (valueSource) { + for (const objectKey in propertyDefaultValue) { + source.set(`${propertyKey}.${objectKey}`, valueSource); + } + } + } + + // Primitive values are overridden + else { + defaultValue[propertyKey] = propertyDefaultValue; + if (valueSource) { + source.set(propertyKey, valueSource); + } else { + source.delete(propertyKey); + } + } + } + + return { value: defaultValue, source }; + } + + private mergeDefaultConfigurationsForConfigurationProperty(propertyKey: string, value: any, valuesSource: IExtensionInfo | undefined, existingDefaultOverride: IConfigurationDefaultOverrideValue | undefined): IConfigurationDefaultOverrideValue | undefined { + const property = this.configurationProperties[propertyKey]; + const existingDefaultValue = existingDefaultOverride?.value ?? property?.defaultDefaultValue; + let source: ConfigurationDefaultValueSource | undefined = valuesSource; + + const isObjectSetting = types.isObject(value) && + ( + property !== undefined && property.type === 'object' || + property === undefined && (types.isUndefined(existingDefaultValue) || types.isObject(existingDefaultValue)) + ); + + // If the default value is an object, merge the objects and store the source of each keys + if (isObjectSetting) { + source = existingDefaultOverride?.source ?? new Map(); + + // This should not happen + if (!(source instanceof Map)) { + console.error('defaultValueSource is not a Map'); + return undefined; + } + + for (const objectKey in value) { + if (valuesSource) { + source.set(`${propertyKey}.${objectKey}`, valuesSource); + } + } + value = { ...(types.isObject(existingDefaultValue) ? existingDefaultValue : {}), ...value }; + } + + return { value, source }; + } + public deltaConfiguration(delta: IConfigurationDelta): void { // defaults: remove let defaultsOverrides = false; @@ -703,8 +706,18 @@ class ConfigurationRegistry implements IConfigurationRegistry { return this.excludedConfigurationProperties; } - getConfigurationDefaultsOverrides(): Map { - return this.configurationDefaultsOverrides; + getRegisteredDefaultConfigurations(): IConfigurationDefaults[] { + return [...this.registeredConfigurationDefaults]; + } + + getConfigurationDefaultsOverrides(): Map { + const configurationDefaultsOverrides = new Map(); + for (const [key, value] of this.configurationDefaultsOverrides) { + if (value.configurationDefaultOverrideValue) { + configurationDefaultsOverrides.set(key, value.configurationDefaultOverrideValue); + } + } + return configurationDefaultsOverrides; } private registerJSONConfiguration(configuration: IConfigurationNode) { @@ -805,7 +818,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { } private updatePropertyDefaultValue(key: string, property: IRegisteredConfigurationPropertySchema): void { - const configurationdefaultOverride = this.configurationDefaultsOverrides.get(key); + const configurationdefaultOverride = this.configurationDefaultsOverrides.get(key)?.configurationDefaultOverrideValue; let defaultValue = undefined; let defaultSource = undefined; if (configurationdefaultOverride diff --git a/src/vs/platform/configuration/common/configurations.ts b/src/vs/platform/configuration/common/configurations.ts index d6f09a4d17613..5e3c303ada6f0 100644 --- a/src/vs/platform/configuration/common/configurations.ts +++ b/src/vs/platform/configuration/common/configurations.ts @@ -61,9 +61,9 @@ export class DefaultConfiguration extends Disposable { const defaultOverrideValue = configurationDefaultsOverrides[key]; const propertySchema = configurationProperties[key]; if (defaultOverrideValue !== undefined) { - this._configurationModel.addValue(key, defaultOverrideValue); + this._configurationModel.setValue(key, defaultOverrideValue); } else if (propertySchema) { - this._configurationModel.addValue(key, propertySchema.default); + this._configurationModel.setValue(key, propertySchema.default); } else { this._configurationModel.removeValue(key); } diff --git a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts index ec7fcb5e8b6a9..0f3bf7e2d87c5 100644 --- a/src/vs/platform/configuration/test/common/configurationRegistry.test.ts +++ b/src/vs/platform/configuration/test/common/configurationRegistry.test.ts @@ -14,6 +14,14 @@ suite('ConfigurationRegistry', () => { const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); + setup(() => reset()); + teardown(() => reset()); + + function reset() { + configurationRegistry.deregisterConfigurations(configurationRegistry.getConfigurations()); + configurationRegistry.deregisterDefaultConfigurations(configurationRegistry.getRegisteredDefaultConfigurations()); + } + test('configuration override', async () => { configurationRegistry.registerConfiguration({ 'id': '_test_default', @@ -119,10 +127,66 @@ suite('ConfigurationRegistry', () => { configurationRegistry.deregisterDefaultConfigurations(overrides2); - assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { b: 2 }); // TODO this should actualy equal overrides1 + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { a: 1, b: 2 }); + + configurationRegistry.deregisterDefaultConfigurations(overrides1); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, {}); + }); + + test('configuration defaults - deregister merged object default override without source', async () => { + configurationRegistry.registerConfiguration({ + 'id': '_test_default', + 'type': 'object', + 'properties': { + 'config': { + 'type': 'object', + } + } + }); + + const overrides1 = [{ overrides: { 'config': { a: 1, b: 2 } } }]; + const overrides2 = [{ overrides: { 'config': { a: 2, c: 3 } } }]; + + configurationRegistry.registerDefaultConfigurations(overrides1); + configurationRegistry.registerDefaultConfigurations(overrides2); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { a: 2, b: 2, c: 3 }); + + configurationRegistry.deregisterDefaultConfigurations(overrides2); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, { a: 1, b: 2 }); configurationRegistry.deregisterDefaultConfigurations(overrides1); assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['config'].default, {}); }); + + test('configuration defaults - deregister merged object default language overrides', async () => { + configurationRegistry.registerConfiguration({ + 'id': '_test_default', + 'type': 'object', + 'properties': { + 'config': { + 'type': 'object', + } + } + }); + + const overrides1 = [{ overrides: { '[lang]': { 'config': { a: 1, b: 2 } } }, source: { id: 'source1', displayName: 'source1' } }]; + const overrides2 = [{ overrides: { '[lang]': { 'config': { a: 2, c: 3 } } }, source: { id: 'source2', displayName: 'source2' } }]; + + configurationRegistry.registerDefaultConfigurations(overrides1); + configurationRegistry.registerDefaultConfigurations(overrides2); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['[lang]'].default, { 'config': { a: 2, b: 2, c: 3 } }); + + configurationRegistry.deregisterDefaultConfigurations(overrides2); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['[lang]'].default, { 'config': { a: 1, b: 2 } }); + + configurationRegistry.deregisterDefaultConfigurations(overrides1); + + assert.deepStrictEqual(configurationRegistry.getConfigurationProperties()['[lang]'], undefined); + }); }); diff --git a/src/vs/platform/configuration/test/common/configurations.test.ts b/src/vs/platform/configuration/test/common/configurations.test.ts index 63f8d33bfee50..5b237b7371940 100644 --- a/src/vs/platform/configuration/test/common/configurations.test.ts +++ b/src/vs/platform/configuration/test/common/configurations.test.ts @@ -22,8 +22,7 @@ suite('DefaultConfiguration', () => { function reset() { configurationRegistry.deregisterConfigurations(configurationRegistry.getConfigurations()); - const configurationDefaultsOverrides = configurationRegistry.getConfigurationDefaultsOverrides(); - configurationRegistry.deregisterDefaultConfigurations([...configurationDefaultsOverrides.keys()].map(key => ({ extensionId: configurationDefaultsOverrides.get(key)?.source, overrides: { [key]: configurationDefaultsOverrides.get(key)?.value } }))); + configurationRegistry.deregisterDefaultConfigurations(configurationRegistry.getRegisteredDefaultConfigurations()); } test('Test registering a property before initialize', async () => { @@ -403,11 +402,12 @@ suite('DefaultConfiguration', () => { configurationRegistry.registerDefaultConfigurations([node1]); configurationRegistry.registerDefaultConfigurations([node2]); await testObject.initialize(); + configurationRegistry.deregisterDefaultConfigurations([node1]); assert.ok(equals(testObject.configurationModel.getValue('[a]'), { 'b': { 'bb': '20', 'cc': '30' } })); assert.ok(equals(testObject.configurationModel.contents, { '[a]': { 'b': { 'bb': '20', 'cc': '30' } }, 'b': {} })); - //assert.ok(equals(testObject.configurationModel.overrides, [{ '[a]': { 'b': { 'bb': '20', 'cc': '30' } } }])); TODO: Check this later - //assert.deepStrictEqual(testObject.configurationModel.keys.sort(), ['[a]', 'b']); + assert.ok(equals(testObject.configurationModel.overrides, [{ contents: { 'b': { 'bb': '20', 'cc': '30' } }, identifiers: ['a'], keys: ['b'] }])); + assert.deepStrictEqual(testObject.configurationModel.keys.sort(), ['[a]', 'b']); assert.ok(equals(testObject.configurationModel.getOverrideValue('b', 'a'), { 'bb': '20', 'cc': '30' })); }); }); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 2c9ea5519cae4..b404461da935f 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -91,7 +91,7 @@ function getIncludeExcludeDisplayValue(element: SettingsTreeSettingElement): IIn // Get source if it's a default value let source: string | undefined; if (defaultValue === data[key] && element.setting.type === 'object' && element.defaultValueSource instanceof Map) { - const defaultSource = element.defaultValueSource.get(key); + const defaultSource = element.defaultValueSource.get(`${element.setting.key}.${key}`); source = typeof defaultSource === 'string' ? defaultSource : defaultSource?.displayName; } @@ -190,7 +190,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData // Get source if it's a default value let source: string | undefined; if (defaultValue === data[key] && element.setting.type === 'object' && element.defaultValueSource instanceof Map) { - const defaultSource = element.defaultValueSource.get(key); + const defaultSource = element.defaultValueSource.get(`${element.setting.key}.${key}`); source = typeof defaultSource === 'string' ? defaultSource : defaultSource?.displayName; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index e651ffdccf7b3..c900ed2c45c6f 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -351,7 +351,8 @@ export class SettingsTreeSettingElement extends SettingsTreeElement { this.defaultValue = overrideValues.defaultValue ?? inspected.defaultValue; const registryValues = Registry.as(Extensions.Configuration).getConfigurationDefaultsOverrides(); - const overrideValueSource = registryValues.get(`[${languageSelector}]`)?.valuesSources?.get(this.setting.key); + const source = registryValues.get(`[${languageSelector}]`)?.source; + const overrideValueSource = source instanceof Map ? source.get(this.setting.key) : undefined; if (overrideValueSource) { this.defaultValueSource = overrideValueSource; } diff --git a/src/vs/workbench/services/configuration/test/browser/configuration.test.ts b/src/vs/workbench/services/configuration/test/browser/configuration.test.ts index 266ccaf978b5d..5dfe022d2b5e8 100644 --- a/src/vs/workbench/services/configuration/test/browser/configuration.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configuration.test.ts @@ -48,8 +48,7 @@ suite('DefaultConfiguration', () => { teardown(() => { configurationRegistry.deregisterConfigurations(configurationRegistry.getConfigurations()); - const configurationDefaultsOverrides = configurationRegistry.getConfigurationDefaultsOverrides(); - configurationRegistry.deregisterDefaultConfigurations([...configurationDefaultsOverrides.keys()].map(key => ({ extensionId: configurationDefaultsOverrides.get(key)?.source, overrides: { [key]: configurationDefaultsOverrides.get(key)?.value } }))); + configurationRegistry.deregisterDefaultConfigurations(configurationRegistry.getRegisteredDefaultConfigurations()); }); test('configuration default overrides are read from environment', async () => { From 149a798e5c546c79ee74b3cc7237777c1cd17ec4 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Sun, 7 Jul 2024 13:04:30 +0200 Subject: [PATCH 683/755] Remove MultiRowEditorControl Hack and properly redraw tabs on restore (#220090) * update misleading commen * Remove Hack * :lipstick: * still update title sync * open all editors on tab bar change --------- Co-authored-by: Benjamin Pasero --- .../browser/parts/editor/editorGroupView.ts | 12 +++++++++--- .../browser/parts/editor/multiEditorTabsControl.ts | 13 ------------- .../parts/editor/multiRowEditorTabsControl.ts | 6 +----- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 405049cfd1b50..41e4e3ccc241b 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -560,14 +560,15 @@ export class EditorGroupView extends Themable implements IEditorGroupView { options.preserveFocus = true; // handle focus after editor is restored const internalOptions: IInternalEditorOpenOptions = { - preserveWindowOrder: true // handle window order after editor is restored + preserveWindowOrder: true, // handle window order after editor is restored + skipTitleUpdate: true, // update the title later for all editors at once }; const activeElement = getActiveElement(); // Show active editor (intentionally not using async to keep // `restoreEditors` from executing in same stack) - return this.doShowEditor(activeEditor, { active: true, isNew: false /* restored */ }, options, internalOptions).then(() => { + const result = this.doShowEditor(activeEditor, { active: true, isNew: false /* restored */ }, options, internalOptions).then(() => { // Set focused now if this is the active group and focus has // not changed meanwhile. This prevents focus from being @@ -578,6 +579,11 @@ export class EditorGroupView extends Themable implements IEditorGroupView { this.focus(); } }); + + // Restore editors in title control + this.titleControl.openEditors(this.editors); + + return result; } //#region event handling @@ -829,7 +835,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { // Ensure to show active editor if any if (this.model.activeEditor) { - this.titleControl.openEditor(this.model.activeEditor); + this.titleControl.openEditors(this.model.getEditors(EditorsOrder.SEQUENTIAL)); } } diff --git a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts index 637d3486046bb..9007f132a8e7c 100644 --- a/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts +++ b/src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts @@ -684,20 +684,7 @@ export class MultiEditorTabsControl extends EditorTabsControl { this.layout(this.dimensions, { forceRevealActiveTab: true }); } - private previousSelectedCount = 0; updateEditorSelections(): void { - // We only need to redraw from here when a selection got removed - // otherwise it will be handled by the open editor change event. - // Checking count is currently enough but might require checking - // each editor in the future if selection is changed programatically. - const newSelectedCount = this.tabsModel.selectedEditors.length; - const previousSelectedCount = this.previousSelectedCount; - this.previousSelectedCount = newSelectedCount; - - if (newSelectedCount >= previousSelectedCount) { - return; - } - this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => { this.redrawTabSelectedActiveAndDirty(this.groupsView.activeGroup === this.groupView, editor, tabContainer, tabActionBar); }); diff --git a/src/vs/workbench/browser/parts/editor/multiRowEditorTabsControl.ts b/src/vs/workbench/browser/parts/editor/multiRowEditorTabsControl.ts index 83823d3ec8fa8..69eb8b7726262 100644 --- a/src/vs/workbench/browser/parts/editor/multiRowEditorTabsControl.ts +++ b/src/vs/workbench/browser/parts/editor/multiRowEditorTabsControl.ts @@ -61,12 +61,8 @@ export class MultiRowEditorControl extends Disposable implements IEditorTabsCont } openEditor(editor: EditorInput, options: IInternalEditorOpenOptions): boolean { - const [editorTabController, otherTabController] = this.model.isSticky(editor) ? [this.stickyEditorTabsControl, this.unstickyEditorTabsControl] : [this.unstickyEditorTabsControl, this.stickyEditorTabsControl]; - const didChange = editorTabController.openEditor(editor, options); + const didChange = this.getEditorTabsController(editor).openEditor(editor, options); if (didChange) { - // HACK: To render all editor tabs on startup, otherwise only one row gets rendered - otherTabController.openEditors([]); - this.handleOpenedEditors(); } return didChange; From 477d23310b9d8880de6bbaa4dc0d8dc4fd3bfd91 Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Sun, 7 Jul 2024 20:35:50 +0200 Subject: [PATCH 684/755] feature: allow configuring default browser (#219885) --- src/vs/platform/native/common/native.ts | 2 +- .../electron-main/nativeHostMainService.ts | 49 +++++++++++++++++-- .../browser/workbench.contribution.ts | 8 ++- src/vs/workbench/electron-sandbox/window.ts | 2 +- .../electron-sandbox/workbenchTestServices.ts | 2 +- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/native/common/native.ts b/src/vs/platform/native/common/native.ts index 9489592a76650..8a45868ed6367 100644 --- a/src/vs/platform/native/common/native.ts +++ b/src/vs/platform/native/common/native.ts @@ -127,7 +127,7 @@ export interface ICommonNativeHostService { showItemInFolder(path: string): Promise; setRepresentedFilename(path: string, options?: INativeHostOptions): Promise; setDocumentEdited(edited: boolean, options?: INativeHostOptions): Promise; - openExternal(url: string): Promise; + openExternal(url: string, defaultApplication?: string): Promise; moveItemToTrash(fullPath: string): Promise; isAdmin(): Promise; diff --git a/src/vs/platform/native/electron-main/nativeHostMainService.ts b/src/vs/platform/native/electron-main/nativeHostMainService.ts index dad4087ec75e2..3b49b725dd978 100644 --- a/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -11,8 +11,8 @@ import { promisify } from 'util'; import { memoize } from 'vs/base/common/decorators'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { Schemas } from 'vs/base/common/network'; -import { dirname, join, resolve } from 'vs/base/common/path'; +import { matchesSomeScheme, Schemas } from 'vs/base/common/network'; +import { dirname, join, posix, resolve, win32 } from 'vs/base/common/path'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { AddFirstParameterToFunctions } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; @@ -44,6 +44,7 @@ import { IV8Profile } from 'vs/platform/profiling/common/profiling'; import { IAuxiliaryWindowsMainService } from 'vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows'; import { IAuxiliaryWindow } from 'vs/platform/auxiliaryWindow/electron-main/auxiliaryWindow'; import { CancellationError } from 'vs/base/common/errors'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IProxyAuthService } from 'vs/platform/native/electron-main/auth'; import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; @@ -65,6 +66,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain @IProductService private readonly productService: IProductService, @IThemeMainService private readonly themeMainService: IThemeMainService, @IWorkspacesManagementMainService private readonly workspacesManagementMainService: IWorkspacesManagementMainService, + @IConfigurationService private readonly configurationService: IConfigurationService, @IProxyAuthService private readonly proxyAuthService: IProxyAuthService ) { super(); @@ -489,14 +491,51 @@ export class NativeHostMainService extends Disposable implements INativeHostMain window?.setDocumentEdited(edited); } - async openExternal(windowId: number | undefined, url: string): Promise { + async openExternal(windowId: number | undefined, url: string, defaultApplication?: string): Promise { this.environmentMainService.unsetSnapExportedVariables(); - shell.openExternal(url); - this.environmentMainService.restoreSnapExportedVariables(); + try { + if (matchesSomeScheme(url, Schemas.http, Schemas.https)) { + this.openExternalBrowser(url, defaultApplication); + } else { + shell.openExternal(url); + } + } finally { + this.environmentMainService.restoreSnapExportedVariables(); + } return true; } + private async openExternalBrowser(url: string, defaultApplication?: string) { + const configuredBrowser = defaultApplication ?? this.configurationService.getValue('workbench.externalBrowser'); + if (!configuredBrowser) { + return shell.openExternal(url); + } + + if (configuredBrowser.includes(posix.sep) || configuredBrowser.includes(win32.sep)) { + const browserPathExists = await Promises.exists(configuredBrowser); + if (!browserPathExists) { + this.logService.error(`Configured external browser path does not exist: ${configuredBrowser}`); + return shell.openExternal(url); + } + } + + try { + const { default: open } = await import('open'); + await open(url, { + app: { + // Use `open.apps` helper to allow cross-platform browser + // aliases to be looked up properly. Fallback to the + // configured value if not found. + name: Object.hasOwn(open.apps, configuredBrowser) ? open.apps[(configuredBrowser as keyof typeof open['apps'])] : configuredBrowser + } + }); + } catch (error) { + this.logService.error(`Unable to open external URL '${url}' using browser '${configuredBrowser}' due to ${error}.`); + return shell.openExternal(url); + } + } + moveItemToTrash(windowId: number | undefined, fullPath: string): Promise { return shell.trashItem(fullPath); } diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index ae4d22c9eaa41..fb05198e50bc9 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -6,7 +6,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { localize } from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform'; +import { isMacintosh, isWindows, isLinux, isWeb, isNative } from 'vs/base/common/platform'; import { ConfigurationMigrationWorkbenchContribution, DynamicWorkbenchSecurityConfiguration, IConfigurationMigrationRegistry, workbenchConfigurationNodeBase, Extensions, ConfigurationKeyValuePairs, problemsConfigurationNodeBase, windowConfigurationNodeBase, DynamicWindowConfiguration } from 'vs/workbench/common/configuration'; import { isStandalone } from 'vs/base/browser/browser'; import { WorkbenchPhase, registerWorkbenchContribution2 } from 'vs/workbench/common/contributions'; @@ -29,6 +29,12 @@ const registry = Registry.as(ConfigurationExtensions.Con registry.registerConfiguration({ ...workbenchConfigurationNodeBase, 'properties': { + 'workbench.externalBrowser': { + type: 'string', + markdownDescription: localize('browser', "Configure the browser to use for opening http or https links externally. This can either be the name of the browser (`edge`, `chrome`, `firefox`) or an absolute path to the browser's executable. Will use the system default if not set."), + included: isNative, + restricted: true + }, 'workbench.editor.titleScrollbarSizing': { type: 'string', enum: ['default', 'large'], diff --git a/src/vs/workbench/electron-sandbox/window.ts b/src/vs/workbench/electron-sandbox/window.ts index 7d8a1901d7a52..140e12ee47d75 100644 --- a/src/vs/workbench/electron-sandbox/window.ts +++ b/src/vs/workbench/electron-sandbox/window.ts @@ -894,7 +894,7 @@ export class NativeWindow extends BaseWindow { // Handle external open() calls this.openerService.setDefaultExternalOpener({ openExternal: async (href: string) => { - const success = await this.nativeHostService.openExternal(href); + const success = await this.nativeHostService.openExternal(href, this.configurationService.getValue('workbench.externalBrowser')); if (!success) { const fileCandidate = URI.parse(href); if (fileCandidate.scheme === Schemas.file) { diff --git a/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts b/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts index 3864abba55b82..e130b0837f28f 100644 --- a/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts @@ -125,7 +125,7 @@ export class TestNativeHostService implements INativeHostService { async getProcessId(): Promise { throw new Error('Method not implemented.'); } async killProcess(): Promise { } async setDocumentEdited(edited: boolean): Promise { } - async openExternal(url: string): Promise { return false; } + async openExternal(url: string, defaultApplication?: string): Promise { return false; } async updateTouchBar(): Promise { } async moveItemToTrash(): Promise { } async newWindowTab(): Promise { } From 3e283de567f5701a2be639bdacdac2c3cfdb088a Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Sun, 7 Jul 2024 12:57:40 -0700 Subject: [PATCH 685/755] Convert confirmation part in chat panel response (#220128) * Convert confirmation part * Move conversion to ChatResponsePart * Fix indent --- src/vs/workbench/api/common/extHostTypeConverters.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 36f83b564e0b3..6fad560a437c9 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2557,6 +2557,8 @@ export namespace ChatResponsePart { return ChatResponseDetectedParticipantPart.from(part); } else if (part instanceof types.ChatResponseWarningPart) { return ChatResponseWarningPart.from(part); + } else if (part instanceof types.ChatResponseConfirmationPart) { + return ChatResponseConfirmationPart.from(part); } return { From 929146ee0b59ecff41cb734c5790c0834d1331bd Mon Sep 17 00:00:00 2001 From: eleanorjboyd Date: Sun, 7 Jul 2024 22:19:05 -0700 Subject: [PATCH 686/755] addition for docs --- src/vs/workbench/contrib/testing/common/testingContextKeys.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/testing/common/testingContextKeys.ts b/src/vs/workbench/contrib/testing/common/testingContextKeys.ts index 1463fb3c1d482..2078a1d0efd60 100644 --- a/src/vs/workbench/contrib/testing/common/testingContextKeys.ts +++ b/src/vs/workbench/contrib/testing/common/testingContextKeys.ts @@ -75,4 +75,8 @@ export namespace TestingContextKeys { type: 'string', description: localize('testing.testResultState', 'Value available testing/item/result indicating the state of the item.') }); + export const testProfileContextGroup = new RawContextKey('testing.profile.context.group', undefined, { + type: 'string', + description: localize('testing.profile.context.group', 'Type of menu where the configure testing profile submenu exists. Either "run", "debug", or "coverage"') + }); } From e5da006a742a662e765e3774d40ff7ab3bedcf8d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2024 07:39:13 +0200 Subject: [PATCH 687/755] nls - update reference in ts config (#220982) --- src/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tsconfig.json b/src/tsconfig.json index 27f975eb50281..bd60189129727 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -37,7 +37,7 @@ "./vs/base/common/jsonc.js", "./vs/base/common/performance.js", "./vs/base/node/unc.js", - "./vs/base/node/languagePacks.js", + "./vs/base/node/nls.js", "./vs/platform/environment/node/userDataPath.js", "./vs/base/parts/sandbox/electron-sandbox/preload-aux.js", "./vs/base/parts/sandbox/electron-sandbox/preload.js", From d0f0de52df33dd699eea0eb1144dce53d038c94a Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:14:50 +0200 Subject: [PATCH 688/755] Git - fix commit flow regression (#220991) --- extensions/git/src/commands.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 55c5f89fd3ab3..686ce366e2939 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2063,7 +2063,7 @@ export class CommandCenter { promptToSaveFilesBeforeCommit = 'never'; } - const enableSmartCommit = config.get('enableSmartCommit') === true; + let enableSmartCommit = config.get('enableSmartCommit') === true; const enableCommitSigning = config.get('enableCommitSigning') === true; let noStagedChanges = repository.indexGroup.resourceStates.length === 0; let noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0; @@ -2119,12 +2119,16 @@ export class CommandCenter { const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never); if (pick === always) { + enableSmartCommit = true; config.update('enableSmartCommit', true, true); } else if (pick === never) { config.update('suggestSmartCommit', false, true); return; - } else if (pick !== yes) { - return; // do not commit on cancel + } else if (pick === yes) { + enableSmartCommit = true; + } else { + // Cancel + return; } } From c36c1716f8b044398ba716fc21ab86986d08ce86 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 8 Jul 2024 09:41:36 +0200 Subject: [PATCH 689/755] Use manually configured basic auth credentials (#220034) --- src/vs/platform/native/electron-main/auth.ts | 33 ++++++++++++++++++- .../windows/electron-main/windowImpl.ts | 16 +++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/native/electron-main/auth.ts b/src/vs/platform/native/electron-main/auth.ts index 953a74ec1589a..da7e0ea26ccb5 100644 --- a/src/vs/platform/native/electron-main/auth.ts +++ b/src/vs/platform/native/electron-main/auth.ts @@ -8,7 +8,9 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { hash } from 'vs/base/common/hash'; import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEncryptionMainService } from 'vs/platform/encryption/common/encryptionService'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; @@ -50,7 +52,8 @@ export class ProxyAuthService extends Disposable implements IProxyAuthService { @ILogService private readonly logService: ILogService, @IWindowsMainService private readonly windowsMainService: IWindowsMainService, @IEncryptionMainService private readonly encryptionMainService: IEncryptionMainService, - @IApplicationStorageMainService private readonly applicationStorageMainService: IApplicationStorageMainService + @IApplicationStorageMainService private readonly applicationStorageMainService: IApplicationStorageMainService, + @IConfigurationService private readonly configurationService: IConfigurationService, ) { super(); @@ -132,6 +135,34 @@ export class ProxyAuthService extends Disposable implements IProxyAuthService { private async doResolveProxyCredentials(authInfo: AuthInfo, authInfoHash: string): Promise { this.logService.trace('auth#doResolveProxyCredentials - enter', authInfo); + // Reply with manually supplied credentials. Fail if they are wrong. + const newHttpProxy = (this.configurationService.getValue('http.proxy') || '').trim() + || (process.env['https_proxy'] || process.env['HTTPS_PROXY'] || process.env['http_proxy'] || process.env['HTTP_PROXY'] || '').trim() + || undefined; + + if (newHttpProxy?.indexOf('@') !== -1) { + const uri = URI.parse(newHttpProxy!); + const i = uri.authority.indexOf('@'); + if (i !== -1) { + if (authInfo.attempt > 1) { + return undefined; // We tried already, let the user handle it. + } + const credentials = uri.authority.substring(0, i); + const j = credentials.indexOf(':'); + if (j !== -1) { + return { + username: credentials.substring(0, j), + password: credentials.substring(j + 1) + }; + } else { + return { + username: credentials, + password: '' + }; + } + } + } + // Reply with session credentials unless we used them already. // In that case we need to show a login dialog again because // they seem invalid. diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index dcb1cc9210dc9..45b8835107ec8 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -962,6 +962,14 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { || (process.env['https_proxy'] || process.env['HTTPS_PROXY'] || process.env['http_proxy'] || process.env['HTTP_PROXY'] || '').trim() // Not standardized. || undefined; + if (newHttpProxy?.indexOf('@') !== -1) { + const uri = URI.parse(newHttpProxy!); + const i = uri.authority.indexOf('@'); + if (i !== -1) { + newHttpProxy = uri.with({ authority: uri.authority.substring(i + 1) }) + .toString(); + } + } if (newHttpProxy?.endsWith('/')) { newHttpProxy = newHttpProxy.substr(0, newHttpProxy.length - 1); } @@ -976,13 +984,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { const proxyBypassRules = newNoProxy ? `${newNoProxy},` : ''; this.logService.trace(`Setting proxy to '${proxyRules}', bypassing '${proxyBypassRules}'`); this._win.webContents.session.setProxy({ proxyRules, proxyBypassRules, pacScript: '' }); - type appWithProxySupport = Electron.App & { - setProxy(config: Electron.Config): Promise; - resolveProxy(url: string): Promise; - }; - if (typeof (app as appWithProxySupport).setProxy === 'function') { - (app as appWithProxySupport).setProxy({ proxyRules, proxyBypassRules, pacScript: '' }); - } + app.setProxy({ proxyRules, proxyBypassRules, pacScript: '' }); } } } From 603b0ee03b82cc77f90f56a5e0ecfbeee3213de1 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2024 10:05:31 +0200 Subject: [PATCH 690/755] Don't listen on menu changed, method 2 (#219964) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't listen on menu changed, method 2 This time, instead of only updating the tree elements who's actions are visible (selected, focused, focusing), update all tree items that the context change applies to, as before. However, the context key change event is now per tree renderer, not per menu. Fixes #213145 * Implement feedback * 💄 --- .../browser/menuEntryActionViewItem.ts | 4 +- src/vs/platform/actions/common/actions.ts | 17 ++++ src/vs/platform/actions/common/menuService.ts | 72 +++++++++++----- .../workbench/browser/parts/views/treeView.ts | 82 +++++++++++++------ .../test/browser/workbenchTestServices.ts | 10 ++- 5 files changed, 135 insertions(+), 50 deletions(-) diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 68380cddacf8e..7d34c837e5249 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -33,8 +33,8 @@ import { defaultSelectBoxStyles } from 'vs/platform/theme/browser/defaultStyles' import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { ResolvedKeybinding } from 'vs/base/common/keybindings'; -export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): void { - const groups = menu.getActions(options); +export function createAndFillInContextMenuActions(menu: IMenu | [string, Array][], options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): void { + const groups = (Array.isArray(menu) ? menu : menu.getActions(options)); const modifierKeyEmitter = ModifierKeyEmitter.getInstance(); const useAlternativeActions = modifierKeyEmitter.keyStatus.altKey || ((isWindows || isLinux) && modifierKeyEmitter.keyStatus.shiftKey); fillInActions(groups, target, useAlternativeActions, primaryGroup ? actionGroup => actionGroup === primaryGroup : actionGroup => actionGroup === 'navigation'); diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 9d773b47a56c0..8d087d8c9d964 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -275,6 +275,11 @@ export interface IMenu extends IDisposable { getActions(options?: IMenuActionOptions): [string, Array][]; } +export interface IMenuData { + contexts: ReadonlySet; + actions: [string, Array][]; +} + export const IMenuService = createDecorator('menuService'); export interface IMenuCreateOptions { @@ -287,6 +292,8 @@ export interface IMenuService { readonly _serviceBrand: undefined; /** + * Consider using getMenuActions if you don't need to listen to events. + * * Create a new menu for the given menu identifier. A menu sends events when it's entries * have changed (placement, enablement, checked-state). By default it does not send events for * submenu entries. That is more expensive and must be explicitly enabled with the @@ -294,6 +301,16 @@ export interface IMenuService { */ createMenu(id: MenuId, contextKeyService: IContextKeyService, options?: IMenuCreateOptions): IMenu; + /** + * Creates a new menu, gets the actions, and then disposes of the menu. + */ + getMenuActions(id: MenuId, contextKeyService: IContextKeyService, options?: IMenuActionOptions): [string, Array][]; + + /** + * Gets the names of the contexts that this menu listens on. + */ + getMenuContexts(id: MenuId): ReadonlySet; + /** * Reset **all** menu item hidden states. */ diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts index 0b2f255d9be3e..91d9ffdc49dad 100644 --- a/src/vs/platform/actions/common/menuService.ts +++ b/src/vs/platform/actions/common/menuService.ts @@ -34,6 +34,18 @@ export class MenuService implements IMenuService { return new MenuImpl(id, this._hiddenStates, { emitEventsForSubmenuChanges: false, eventDebounceDelay: 50, ...options }, this._commandService, this._keybindingService, contextKeyService); } + getMenuActions(id: MenuId, contextKeyService: IContextKeyService, options?: IMenuActionOptions): [string, Array][] { + const menu = new MenuImpl(id, this._hiddenStates, { emitEventsForSubmenuChanges: false, eventDebounceDelay: 50, ...options }, this._commandService, this._keybindingService, contextKeyService); + const actions = menu.getActions(options); + menu.dispose(); + return actions; + } + + getMenuContexts(id: MenuId): ReadonlySet { + const menuInfo = new MenuInfoSnapshot(id, false); + return new Set([...menuInfo.structureContextKeys, ...menuInfo.preconditionContextKeys, ...menuInfo.toggledContextKeys]); + } + resetHiddenStates(ids?: MenuId[]): void { this._hiddenStates.reset(ids); } @@ -152,20 +164,15 @@ class PersistedMenuHideState { type MenuItemGroup = [string, Array]; -class MenuInfo { - - private _menuGroups: MenuItemGroup[] = []; +class MenuInfoSnapshot { + protected _menuGroups: MenuItemGroup[] = []; private _structureContextKeys: Set = new Set(); private _preconditionContextKeys: Set = new Set(); private _toggledContextKeys: Set = new Set(); constructor( - private readonly _id: MenuId, - private readonly _hiddenStates: PersistedMenuHideState, - private readonly _collectContextKeysForSubmenus: boolean, - @ICommandService private readonly _commandService: ICommandService, - @IKeybindingService private readonly _keybindingService: IKeybindingService, - @IContextKeyService private readonly _contextKeyService: IContextKeyService + protected readonly _id: MenuId, + protected readonly _collectContextKeysForSubmenus: boolean, ) { this.refresh(); } @@ -190,10 +197,8 @@ class MenuInfo { this._preconditionContextKeys.clear(); this._toggledContextKeys.clear(); - const menuItems = MenuRegistry.getMenuItems(this._id); - + const menuItems = this._sort(MenuRegistry.getMenuItems(this._id)); let group: MenuItemGroup | undefined; - menuItems.sort(MenuInfo._compareMenuItems); for (const item of menuItems) { // group by groupId @@ -209,19 +214,24 @@ class MenuInfo { } } + protected _sort(menuItems: (IMenuItem | ISubmenuItem)[]) { + // no sorting needed in snapshot + return menuItems; + } + private _collectContextKeys(item: IMenuItem | ISubmenuItem): void { - MenuInfo._fillInKbExprKeys(item.when, this._structureContextKeys); + MenuInfoSnapshot._fillInKbExprKeys(item.when, this._structureContextKeys); if (isIMenuItem(item)) { // keep precondition keys for event if applicable if (item.command.precondition) { - MenuInfo._fillInKbExprKeys(item.command.precondition, this._preconditionContextKeys); + MenuInfoSnapshot._fillInKbExprKeys(item.command.precondition, this._preconditionContextKeys); } // keep toggled keys for event if applicable if (item.command.toggled) { const toggledExpression: ContextKeyExpression = (item.command.toggled as { condition: ContextKeyExpression }).condition || item.command.toggled; - MenuInfo._fillInKbExprKeys(toggledExpression, this._toggledContextKeys); + MenuInfoSnapshot._fillInKbExprKeys(toggledExpression, this._toggledContextKeys); } } else if (this._collectContextKeysForSubmenus) { @@ -231,6 +241,30 @@ class MenuInfo { } } + private static _fillInKbExprKeys(exp: ContextKeyExpression | undefined, set: Set): void { + if (exp) { + for (const key of exp.keys()) { + set.add(key); + } + } + } + +} + +class MenuInfo extends MenuInfoSnapshot { + + constructor( + _id: MenuId, + private readonly _hiddenStates: PersistedMenuHideState, + _collectContextKeysForSubmenus: boolean, + @ICommandService private readonly _commandService: ICommandService, + @IKeybindingService private readonly _keybindingService: IKeybindingService, + @IContextKeyService private readonly _contextKeyService: IContextKeyService + ) { + super(_id, _collectContextKeysForSubmenus); + this.refresh(); + } + createActionGroups(options: IMenuActionOptions | undefined): [string, Array][] { const result: [string, Array][] = []; @@ -267,12 +301,8 @@ class MenuInfo { return result; } - private static _fillInKbExprKeys(exp: ContextKeyExpression | undefined, set: Set): void { - if (exp) { - for (const key of exp.keys()) { - set.add(key); - } - } + protected override _sort(menuItems: (IMenuItem | ISubmenuItem)[]): (IMenuItem | ISubmenuItem)[] { + return menuItems.sort(MenuInfo._compareMenuItems); } private static _compareMenuItems(a: IMenuItem | ISubmenuItem, b: IMenuItem | ISubmenuItem): number { diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 7c1b3619944f3..858ed33ffb5e3 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -36,7 +36,7 @@ import { createActionViewItem, createAndFillInContextMenuActions } from 'vs/plat import { Action2, IMenuService, MenuId, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ContextKeyExpr, ContextKeyExpression, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, ContextKeyExpression, IContextKey, IContextKeyChangeEvent, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { FileKind } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -717,6 +717,9 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { dnd: this.treeViewDnd, overrideStyles: getLocationBasedViewColors(this.viewLocation).listOverrideStyles }) as WorkbenchAsyncDataTree); + + this.treeDisposables.add(renderer.onDidChangeMenuContext(e => e.forEach(e => this.tree?.rerender(e)))); + this.treeDisposables.add(this.tree); treeMenus.setContextKeyService(this.tree.contextKeyService); aligner.tree = this.tree; @@ -1157,7 +1160,6 @@ class TreeDataSource implements IAsyncDataSource { } interface ITreeExplorerTemplateData { - readonly elementDisposable: DisposableStore; readonly container: HTMLElement; readonly resourceLabel: IResourceLabel; readonly icon: HTMLElement; @@ -1173,6 +1175,9 @@ class TreeRenderer extends Disposable implements ITreeRenderer = this._register(new Emitter()); readonly onDidChangeCheckboxState: Event = this._onDidChangeCheckboxState.event; + private _onDidChangeMenuContext: Emitter = this._register(new Emitter()); + readonly onDidChangeMenuContext: Event = this._onDidChangeMenuContext.event; + private _actionRunner: MultipleSelectionActionRunner | undefined; private _hoverDelegate: IHoverDelegate; private _hasCheckbox: boolean = false; @@ -1200,6 +1205,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer { this.updateCheckboxes(items); })); + this._register(this.contextKeyService.onDidChangeContext(e => this.onDidChangeContext(e))); } get templateId(): string { @@ -1221,7 +1227,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer, index: number, templateData: ITreeExplorerTemplateData): void { - templateData.elementDisposable.clear(); - const itemRenders = this._renderedElements.get(resource.element.handle) ?? []; const renderedIndex = itemRenders.findIndex(renderedItem => templateData === renderedItem.rendered); @@ -1513,7 +1531,6 @@ class TreeRenderer extends Disposable implements ITreeRenderer { + return new Map([ + ['view', this.id], + ['viewItem', element.contextValue] + ]); + } + + public getEntireMenuContexts(): ReadonlySet { + return this.menuService.getMenuContexts(this.getMenuId()); + } + + public getMenuId(): MenuId { + return MenuId.ViewItemContext; + } + + private getActions(menuId: MenuId, elements: ITreeItem[]): { primary: IAction[]; secondary: IAction[] } { if (!this.contextKeyService) { return { primary: [], secondary: [] }; } @@ -1668,16 +1706,14 @@ class TreeMenus implements IDisposable { let secondaryGroups: Map[] = []; for (let i = 0; i < elements.length; i++) { const element = elements[i]; - const contextKeyService = this.contextKeyService.createOverlay([ - ['view', this.id], - ['viewItem', element.contextValue] - ]); + const contextKeyService = this.contextKeyService.createOverlay(this.getElementOverlayContexts(element)); + + const menuData = this.menuService.getMenuActions(menuId, contextKeyService); - const menu = this.menuService.createMenu(menuId, contextKeyService); const primary: IAction[] = []; const secondary: IAction[] = []; - const result = { primary, secondary, menu }; - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, 'inline'); + const result = { primary, secondary }; + createAndFillInContextMenuActions(menuData, { shouldForwardArgs: true }, result, 'inline'); if (i === 0) { primaryGroups = this.createGroups(result.primary); secondaryGroups = this.createGroups(result.secondary); @@ -1685,12 +1721,6 @@ class TreeMenus implements IDisposable { this.filterNonUniversalActions(primaryGroups, result.primary); this.filterNonUniversalActions(secondaryGroups, result.secondary); } - if (listen && elements.length === 1) { - listen.add(menu.onDidChange(() => this._onDidChange.fire(element))); - listen.add(menu); - } else { - menu.dispose(); - } } return { primary: this.buildMenu(primaryGroups), secondary: this.buildMenu(secondaryGroups) }; diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index a451ea2afb5a7..82fed0c2dbcbc 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -40,7 +40,7 @@ import { ThemeIcon } from 'vs/base/common/themables'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { IPosition, Position as EditorPosition } from 'vs/editor/common/core/position'; -import { IMenuService, MenuId, IMenu, IMenuChangeEvent } from 'vs/platform/actions/common/actions'; +import { IMenuService, MenuId, IMenu, IMenuChangeEvent, IMenuActionOptions, MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions'; import { ContextKeyValue, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { MockContextKeyService, MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ITextBufferFactory, DefaultEndOfLine, EndOfLinePreference, ITextSnapshot } from 'vs/editor/common/model'; @@ -556,6 +556,14 @@ export class TestMenuService implements IMenuService { }; } + getMenuActions(id: MenuId, contextKeyService: IContextKeyService, options?: IMenuActionOptions): [string, Array][] { + throw new Error('Method not implemented.'); + } + + getMenuContexts(id: MenuId): ReadonlySet { + throw new Error('Method not implemented.'); + } + resetHiddenStates(): void { // nothing } From 58c354acde1f5d371747cb8c794e5ca46226a079 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2024 11:51:54 +0200 Subject: [PATCH 691/755] Adopt getMenuActions in the obvious places (#221003) --- .../contextmenu/browser/contextmenu.ts | 4 +- .../gotoError/browser/gotoErrorWidget.ts | 5 +- .../browser/menuEntryActionViewItem.ts | 55 ++++++++++++++++++- .../contextview/browser/contextMenuService.ts | 5 +- src/vs/workbench/browser/actions.ts | 5 +- .../parts/activitybar/activitybarPart.ts | 5 +- .../parts/auxiliarybar/auxiliaryBarPart.ts | 5 +- .../browser/parts/paneCompositePart.ts | 4 +- .../browser/parts/panel/panelPart.ts | 10 ++-- .../workbench/browser/parts/views/treeView.ts | 4 +- .../comments/browser/commentsTreeViewer.ts | 13 ++--- .../contrib/debug/browser/callStackView.ts | 5 +- .../contrib/debug/browser/debugToolBar.ts | 4 +- .../contrib/debug/browser/variablesView.ts | 36 +++++------- .../debug/browser/watchExpressionsView.ts | 6 +- .../extensions/browser/extensionsActions.ts | 4 +- .../contrib/issue/browser/issueFormService.ts | 9 +-- .../contrib/issue/browser/issueQuickAccess.ts | 9 +-- .../issue/electron-sandbox/issueService.ts | 6 +- .../notebookVariablesView.ts | 5 +- .../notebook/browser/diff/diffComponents.ts | 5 +- .../browser/commandsQuickAccess.ts | 7 +-- .../contrib/scm/browser/scmViewPane.ts | 8 +-- .../testing/browser/testingDecorations.ts | 14 ++--- .../testing/browser/testingExplorerView.ts | 31 ++++------- .../testing/browser/testingOutputPeek.ts | 15 ++--- .../contrib/timeline/browser/timelinePane.ts | 6 +- .../browser/userDataProfile.ts | 23 ++++---- .../browser/userDataProfileActions.ts | 5 +- 29 files changed, 151 insertions(+), 162 deletions(-) diff --git a/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts index ddfaabbf49666..650a15e2e363b 100644 --- a/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts @@ -160,9 +160,7 @@ export class ContextMenuController implements IEditorContribution { const result: IAction[] = []; // get menu groups - const menu = this._menuService.createMenu(menuId, this._contextKeyService); - const groups = menu.getActions({ arg: model.uri }); - menu.dispose(); + const groups = this._menuService.getMenuActions(menuId, this._contextKeyService, { arg: model.uri }); // translate them into other actions for (const group of groups) { diff --git a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts index 00f716bb45fae..cf0e5c7d6d075 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts @@ -308,10 +308,9 @@ export class MarkerNavigationWidget extends PeekViewWidget { this._disposables.add(this._actionbarWidget!.actionRunner.onWillRun(e => this.editor.focus())); const actions: IAction[] = []; - const menu = this._menuService.createMenu(MarkerNavigationWidget.TitleMenu, this._contextKeyService); - createAndFillInActionBarActions(menu, undefined, actions); + const menu = this._menuService.getMenuActions(MarkerNavigationWidget.TitleMenu, this._contextKeyService); + createAndFillInActionBarActions(menu, actions); this._actionbarWidget!.push(actions, { label: false, icon: true, index: 0 }); - menu.dispose(); } protected override _fillTitleIcon(container: HTMLElement): void { diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 7d34c837e5249..58904af44aa1d 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -33,8 +33,23 @@ import { defaultSelectBoxStyles } from 'vs/platform/theme/browser/defaultStyles' import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { ResolvedKeybinding } from 'vs/base/common/keybindings'; -export function createAndFillInContextMenuActions(menu: IMenu | [string, Array][], options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): void { - const groups = (Array.isArray(menu) ? menu : menu.getActions(options)); +export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): void; +export function createAndFillInContextMenuActions(menu: [string, Array][], target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): void; +export function createAndFillInContextMenuActions(menu: IMenu | [string, Array][], optionsOrTarget: IMenuActionOptions | undefined | IAction[] | { primary: IAction[]; secondary: IAction[] }, targetOrPrimaryGroup?: IAction[] | { primary: IAction[]; secondary: IAction[] } | string, primaryGroupOrUndefined?: string): void { + let target: IAction[] | { primary: IAction[]; secondary: IAction[] }; + let primaryGroup: string | ((actionGroup: string) => boolean) | undefined; + let groups: [string, Array][]; + if (Array.isArray(menu)) { + groups = menu; + target = optionsOrTarget as IAction[] | { primary: IAction[]; secondary: IAction[] }; + primaryGroup = targetOrPrimaryGroup as string | undefined; + } else { + const options: IMenuActionOptions | undefined = optionsOrTarget as IMenuActionOptions | undefined; + groups = menu.getActions(options); + target = targetOrPrimaryGroup as IAction[] | { primary: IAction[]; secondary: IAction[] }; + primaryGroup = primaryGroupOrUndefined; + } + const modifierKeyEmitter = ModifierKeyEmitter.getInstance(); const useAlternativeActions = modifierKeyEmitter.keyStatus.altKey || ((isWindows || isLinux) && modifierKeyEmitter.keyStatus.shiftKey); fillInActions(groups, target, useAlternativeActions, primaryGroup ? actionGroup => actionGroup === primaryGroup : actionGroup => actionGroup === 'navigation'); @@ -47,8 +62,42 @@ export function createAndFillInActionBarActions( primaryGroup?: string | ((actionGroup: string) => boolean), shouldInlineSubmenu?: (action: SubmenuAction, group: string, groupSize: number) => boolean, useSeparatorsInPrimaryActions?: boolean +): void; +export function createAndFillInActionBarActions( + menu: [string, Array][], + target: IAction[] | { primary: IAction[]; secondary: IAction[] }, + primaryGroup?: string | ((actionGroup: string) => boolean), + shouldInlineSubmenu?: (action: SubmenuAction, group: string, groupSize: number) => boolean, + useSeparatorsInPrimaryActions?: boolean +): void; +export function createAndFillInActionBarActions( + menu: IMenu | [string, Array][], + optionsOrTarget: IMenuActionOptions | undefined | IAction[] | { primary: IAction[]; secondary: IAction[] }, + targetOrPrimaryGroup?: IAction[] | { primary: IAction[]; secondary: IAction[] } | string | ((actionGroup: string) => boolean), + primaryGroupOrShouldInlineSubmenu?: string | ((actionGroup: string) => boolean) | ((action: SubmenuAction, group: string, groupSize: number) => boolean), + shouldInlineSubmenuOrUseSeparatorsInPrimaryActions?: ((action: SubmenuAction, group: string, groupSize: number) => boolean) | boolean, + useSeparatorsInPrimaryActionsOrUndefined?: boolean ): void { - const groups = menu.getActions(options); + let target: IAction[] | { primary: IAction[]; secondary: IAction[] }; + let primaryGroup: string | ((actionGroup: string) => boolean) | undefined; + let shouldInlineSubmenu: ((action: SubmenuAction, group: string, groupSize: number) => boolean) | undefined; + let useSeparatorsInPrimaryActions: boolean | undefined; + let groups: [string, Array][]; + if (Array.isArray(menu)) { + groups = menu; + target = optionsOrTarget as IAction[] | { primary: IAction[]; secondary: IAction[] }; + primaryGroup = targetOrPrimaryGroup as string | ((actionGroup: string) => boolean) | undefined; + shouldInlineSubmenu = primaryGroupOrShouldInlineSubmenu as (action: SubmenuAction, group: string, groupSize: number) => boolean; + useSeparatorsInPrimaryActions = shouldInlineSubmenuOrUseSeparatorsInPrimaryActions as boolean | undefined; + } else { + const options: IMenuActionOptions | undefined = optionsOrTarget as IMenuActionOptions | undefined; + groups = menu.getActions(options); + target = targetOrPrimaryGroup as IAction[] | { primary: IAction[]; secondary: IAction[] }; + primaryGroup = primaryGroupOrShouldInlineSubmenu as string | ((actionGroup: string) => boolean) | undefined; + shouldInlineSubmenu = shouldInlineSubmenuOrUseSeparatorsInPrimaryActions as (action: SubmenuAction, group: string, groupSize: number) => boolean; + useSeparatorsInPrimaryActions = useSeparatorsInPrimaryActionsOrUndefined; + } + const isPrimaryAction = typeof primaryGroup === 'string' ? (actionGroup: string) => actionGroup === primaryGroup : primaryGroup; // Action bars handle alternative actions on their own so the alternative actions should be ignored diff --git a/src/vs/platform/contextview/browser/contextMenuService.ts b/src/vs/platform/contextview/browser/contextMenuService.ts index 907cf9449a89a..f70e349945e67 100644 --- a/src/vs/platform/contextview/browser/contextMenuService.ts +++ b/src/vs/platform/contextview/browser/contextMenuService.ts @@ -86,9 +86,8 @@ export namespace ContextMenuMenuDelegate { getActions: () => { const target: IAction[] = []; if (menuId) { - const menu = menuService.createMenu(menuId, contextKeyService ?? globalContextKeyService); - createAndFillInContextMenuActions(menu, menuActionOptions, target); - menu.dispose(); + const menu = menuService.getMenuActions(menuId, contextKeyService ?? globalContextKeyService, menuActionOptions); + createAndFillInContextMenuActions(menu, target); } if (!delegate.getActions) { return target; diff --git a/src/vs/workbench/browser/actions.ts b/src/vs/workbench/browser/actions.ts index 1e166016ed363..dbe7355c8c228 100644 --- a/src/vs/workbench/browser/actions.ts +++ b/src/vs/workbench/browser/actions.ts @@ -96,9 +96,8 @@ export class CompositeMenuActions extends Disposable { const actions: IAction[] = []; if (this.contextMenuId) { - const menu = this.menuService.createMenu(this.contextMenuId, this.contextKeyService); - createAndFillInActionBarActions(menu, this.options, { primary: [], secondary: actions }); - menu.dispose(); + const menu = this.menuService.getMenuActions(this.contextMenuId, this.contextKeyService, this.options); + createAndFillInActionBarActions(menu, { primary: [], secondary: actions }); } return actions; diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 4610ddff2c38f..97f3861079f31 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -363,10 +363,9 @@ export class ActivityBarCompositeBar extends PaneCompositeBar { } getActivityBarContextMenuActions(): IAction[] { - const activityBarPositionMenu = this.menuService.createMenu(MenuId.ActivityBarPositionMenu, this.contextKeyService); + const activityBarPositionMenu = this.menuService.getMenuActions(MenuId.ActivityBarPositionMenu, this.contextKeyService, { shouldForwardArgs: true, renderShortTitle: true }); const positionActions: IAction[] = []; - createAndFillInContextMenuActions(activityBarPositionMenu, { shouldForwardArgs: true, renderShortTitle: true }, { primary: [], secondary: positionActions }); - activityBarPositionMenu.dispose(); + createAndFillInContextMenuActions(activityBarPositionMenu, { primary: [], secondary: positionActions }); return [ new SubmenuAction('workbench.action.panel.position', localize('activity bar position', "Activity Bar Position"), positionActions), toAction({ id: ToggleSidebarPositionAction.ID, label: ToggleSidebarPositionAction.getLabel(this.layoutService), run: () => this.instantiationService.invokeFunction(accessor => new ToggleSidebarPositionAction().run(accessor)) }) diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts index 16c40e836f214..3a2422d4c9985 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts @@ -191,10 +191,9 @@ export class AuxiliaryBarPart extends AbstractPaneCompositePart { actions.push(viewsSubmenuAction); } - const activityBarPositionMenu = this.menuService.createMenu(MenuId.ActivityBarPositionMenu, this.contextKeyService); + const activityBarPositionMenu = this.menuService.getMenuActions(MenuId.ActivityBarPositionMenu, this.contextKeyService, { shouldForwardArgs: true, renderShortTitle: true }); const positionActions: IAction[] = []; - createAndFillInContextMenuActions(activityBarPositionMenu, { shouldForwardArgs: true, renderShortTitle: true }, { primary: [], secondary: positionActions }); - activityBarPositionMenu.dispose(); + createAndFillInContextMenuActions(activityBarPositionMenu, { primary: [], secondary: positionActions }); actions.push(...[ new Separator(), diff --git a/src/vs/workbench/browser/parts/paneCompositePart.ts b/src/vs/workbench/browser/parts/paneCompositePart.ts index 68e797d69e125..cf29cbed9f181 100644 --- a/src/vs/workbench/browser/parts/paneCompositePart.ts +++ b/src/vs/workbench/browser/parts/paneCompositePart.ts @@ -629,8 +629,8 @@ export abstract class AbstractPaneCompositePart extends CompositePart true); + const menu = this.menuService.getMenuActions(ViewsSubMenu, scopedContextKeyService, { shouldForwardArgs: true, renderShortTitle: true }); + createAndFillInActionBarActions(menu, { primary: viewsActions, secondary: [] }, () => true); disposables.dispose(); return viewsActions.length > 1 && viewsActions.some(a => a.enabled) ? new SubmenuAction('views', localize('views', "Views"), viewsActions) : undefined; } diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index e8e8b49bce536..845274fa94073 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -149,14 +149,12 @@ export class PanelPart extends AbstractPaneCompositePart { } private fillExtraContextMenuActions(actions: IAction[]): void { - const panelPositionMenu = this.menuService.createMenu(MenuId.PanelPositionMenu, this.contextKeyService); - const panelAlignMenu = this.menuService.createMenu(MenuId.PanelAlignmentMenu, this.contextKeyService); + const panelPositionMenu = this.menuService.getMenuActions(MenuId.PanelPositionMenu, this.contextKeyService, { shouldForwardArgs: true }); + const panelAlignMenu = this.menuService.getMenuActions(MenuId.PanelAlignmentMenu, this.contextKeyService, { shouldForwardArgs: true }); const positionActions: IAction[] = []; const alignActions: IAction[] = []; - createAndFillInContextMenuActions(panelPositionMenu, { shouldForwardArgs: true }, { primary: [], secondary: positionActions }); - createAndFillInContextMenuActions(panelAlignMenu, { shouldForwardArgs: true }, { primary: [], secondary: alignActions }); - panelAlignMenu.dispose(); - panelPositionMenu.dispose(); + createAndFillInContextMenuActions(panelPositionMenu, { primary: [], secondary: positionActions }); + createAndFillInContextMenuActions(panelAlignMenu, { primary: [], secondary: alignActions }); actions.push(...[ new Separator(), diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 858ed33ffb5e3..5b82b9f971b00 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -1708,12 +1708,12 @@ class TreeMenus implements IDisposable { const element = elements[i]; const contextKeyService = this.contextKeyService.createOverlay(this.getElementOverlayContexts(element)); - const menuData = this.menuService.getMenuActions(menuId, contextKeyService); + const menuData = this.menuService.getMenuActions(menuId, contextKeyService, { shouldForwardArgs: true }); const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; - createAndFillInContextMenuActions(menuData, { shouldForwardArgs: true }, result, 'inline'); + createAndFillInContextMenuActions(menuData, result, 'inline'); if (i === 0) { primaryGroups = this.createGroups(result.primary); secondaryGroups = this.createGroups(result.secondary); diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts index b527edf7bde3d..7f0dfde0e6414 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts @@ -35,7 +35,7 @@ import { CommentsModel } from 'vs/workbench/contrib/comments/browser/commentsMod import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { createActionViewItem, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { IMenu, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; +import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IAction } from 'vs/base/common/actions'; import { MarshalledId } from 'vs/base/common/marshallingIds'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -142,9 +142,9 @@ export class CommentsMenus implements IDisposable { @IMenuService private readonly menuService: IMenuService ) { } - getResourceActions(element: CommentNode): { menu?: IMenu; actions: IAction[] } { + getResourceActions(element: CommentNode): { actions: IAction[] } { const actions = this.getActions(MenuId.CommentsViewThreadActions, element); - return { menu: actions.menu, actions: actions.primary }; + return { actions: actions.primary }; } getResourceContextActions(element: CommentNode): IAction[] { @@ -155,7 +155,7 @@ export class CommentsMenus implements IDisposable { this.contextKeyService = service; } - private getActions(menuId: MenuId, element: CommentNode): { menu?: IMenu; primary: IAction[]; secondary: IAction[] } { + private getActions(menuId: MenuId, element: CommentNode): { primary: IAction[]; secondary: IAction[] } { if (!this.contextKeyService) { return { primary: [], secondary: [] }; } @@ -168,12 +168,11 @@ export class CommentsMenus implements IDisposable { ]; const contextKeyService = this.contextKeyService.createOverlay(overlay); - const menu = this.menuService.createMenu(menuId, contextKeyService); + const menu = this.menuService.getMenuActions(menuId, contextKeyService, { shouldForwardArgs: true }); const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary, menu }; - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, 'inline'); - menu.dispose(); + createAndFillInContextMenuActions(menu, result, 'inline'); return result; } diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index 24eba7616829c..6ee016a167c23 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -465,9 +465,8 @@ export class CallStackView extends ViewPane { const secondary: IAction[] = []; const result = { primary, secondary }; const contextKeyService = this.contextKeyService.createOverlay(overlay); - const menu = this.menuService.createMenu(MenuId.DebugCallStackContext, contextKeyService); - createAndFillInContextMenuActions(menu, { arg: getContextForContributedActions(element), shouldForwardArgs: true }, result, 'inline'); - menu.dispose(); + const menu = this.menuService.getMenuActions(MenuId.DebugCallStackContext, contextKeyService, { arg: getContextForContributedActions(element), shouldForwardArgs: true }); + createAndFillInContextMenuActions(menu, result, 'inline'); this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, getActions: () => result.secondary, diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index 4bae5574e468c..7711f4ccc488d 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -351,9 +351,9 @@ export function createDisconnectMenuItemAction(action: MenuItemAction, disposabl const instantiationService = accessor.get(IInstantiationService); const contextMenuService = accessor.get(IContextMenuService); - const menu = menuService.createMenu(MenuId.DebugToolBarStop, contextKeyService); + const menu = menuService.getMenuActions(MenuId.DebugToolBarStop, contextKeyService, { shouldForwardArgs: true }); const secondary: IAction[] = []; - createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, secondary); + createAndFillInActionBarActions(menu, secondary); if (!secondary.length) { return undefined; diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index 78caf7f02e628..7adb71aa31703 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -16,7 +16,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; -import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ThemeIcon } from 'vs/base/common/themables'; import { localize } from 'vs/nls'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; @@ -246,22 +246,16 @@ export async function openContextMenuForVariableTreeElement(parentContextKeyServ return; } - const toDispose = new DisposableStore(); + const contextKeyService = await getContextForVariableMenuWithDataAccess(parentContextKeyService, variable); + const context: IVariablesContext = getVariablesContext(variable); + const menu = menuService.getMenuActions(menuId, contextKeyService, { arg: context, shouldForwardArgs: false }); - try { - const contextKeyService = await getContextForVariableMenuWithDataAccess(parentContextKeyService, variable); - const menu = toDispose.add(menuService.createMenu(menuId, contextKeyService)); - - const context: IVariablesContext = getVariablesContext(variable); - const secondary: IAction[] = []; - createAndFillInContextMenuActions(menu, { arg: context, shouldForwardArgs: false }, { primary: [], secondary }, 'inline'); - contextMenuService.showContextMenu({ - getAnchor: () => e.anchor, - getActions: () => secondary - }); - } finally { - toDispose.dispose(); - } + const secondary: IAction[] = []; + createAndFillInContextMenuActions(menu, { primary: [], secondary }, 'inline'); + contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => secondary + }); } const getVariablesContext = (variable: Variable): IVariablesContext => ({ @@ -500,11 +494,11 @@ export class VisualizedVariableRenderer extends AbstractExpressionsRenderer { protected override renderActionBar(actionBar: ActionBar, expression: IExpression, _data: IExpressionTemplateData) { const viz = expression as VisualizedExpression; const contextKeyService = viz.original ? getContextForVariableMenuBase(this.contextKeyService, viz.original) : this.contextKeyService; - const menu = this.menuService.createMenu(MenuId.DebugVariablesContext, contextKeyService); + const context = viz.original ? getVariablesContext(viz.original) : undefined; + const menu = this.menuService.getMenuActions(MenuId.DebugVariablesContext, contextKeyService, { arg: context, shouldForwardArgs: false }); const primary: IAction[] = []; - const context = viz.original ? getVariablesContext(viz.original) : undefined; - createAndFillInContextMenuActions(menu, { arg: context, shouldForwardArgs: false }, { primary, secondary: [] }, 'inline'); + createAndFillInContextMenuActions(menu, { primary, secondary: [] }, 'inline'); if (viz.original) { const action = new Action('debugViz', localize('removeVisualizer', 'Remove Visualizer'), ThemeIcon.asClassName(Codicon.eye), true, () => this.debugService.getViewModel().setVisualizedExpression(viz.original!, undefined)); @@ -583,11 +577,11 @@ export class VariablesRenderer extends AbstractExpressionsRenderer { protected override renderActionBar(actionBar: ActionBar, expression: IExpression, data: IExpressionTemplateData) { const variable = expression as Variable; const contextKeyService = getContextForVariableMenuBase(this.contextKeyService, variable); - const menu = this.menuService.createMenu(MenuId.DebugVariablesContext, contextKeyService); const primary: IAction[] = []; const context = getVariablesContext(variable); - createAndFillInContextMenuActions(menu, { arg: context, shouldForwardArgs: false }, { primary, secondary: [] }, 'inline'); + const menu = this.menuService.getMenuActions(MenuId.DebugVariablesContext, contextKeyService, { arg: context, shouldForwardArgs: false }); + createAndFillInContextMenuActions(menu, { primary, secondary: [] }, 'inline'); actionBar.clear(); actionBar.context = context; diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index 07f6986534d80..22014a4ad96b7 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -373,11 +373,11 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer { protected override renderActionBar(actionBar: ActionBar, expression: IExpression) { const contextKeyService = getContextForWatchExpressionMenu(this.contextKeyService, expression); - const menu = this.menuService.createMenu(MenuId.DebugWatchContext, contextKeyService); + const context = expression; + const menu = this.menuService.getMenuActions(MenuId.DebugWatchContext, contextKeyService, { arg: context, shouldForwardArgs: false }); const primary: IAction[] = []; - const context = expression; - createAndFillInContextMenuActions(menu, { arg: context, shouldForwardArgs: false }, { primary, secondary: [] }, 'inline'); + createAndFillInContextMenuActions(menu, { primary, secondary: [] }, 'inline'); actionBar.clear(); actionBar.context = context; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 3ab22820d49ec..3f7e240ced1c4 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -1182,9 +1182,7 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n cksOverlay.push(['isActiveLanguagePackExtension', extension.gallery && language === getLocale(extension.gallery)]); } - const menu = menuService.createMenu(MenuId.ExtensionContext, contextKeyService.createOverlay(cksOverlay)); - const actionsGroups = menu.getActions({ shouldForwardArgs: true }); - menu.dispose(); + const actionsGroups = menuService.getMenuActions(MenuId.ExtensionContext, contextKeyService.createOverlay(cksOverlay), { shouldForwardArgs: true }); return actionsGroups; }); } diff --git a/src/vs/workbench/contrib/issue/browser/issueFormService.ts b/src/vs/workbench/contrib/issue/browser/issueFormService.ts index ca24026d161ca..1ac7d114454bd 100644 --- a/src/vs/workbench/contrib/issue/browser/issueFormService.ts +++ b/src/vs/workbench/contrib/issue/browser/issueFormService.ts @@ -40,11 +40,10 @@ export class IssueFormService implements IIssueMainService { // listen for messages from the main window mainWindow.addEventListener('message', async (event) => { if (event.data && event.data.sendChannel === 'vscode:triggerReporterMenu') { - // creates menu from contributed - const menu = this.menuService.createMenu(MenuId.IssueReporter, this.contextKeyService); + // gets menu actions from contributed + const actions = this.menuService.getMenuActions(MenuId.IssueReporter, this.contextKeyService, { renderShortTitle: true }).flatMap(entry => entry[1]); - // render menu and dispose - const actions = menu.getActions({ renderShortTitle: true }).flatMap(entry => entry[1]); + // render menu for (const action of actions) { try { if (action.item && 'source' in action.item && action.item.source?.id === event.data.extensionId) { @@ -61,8 +60,6 @@ export class IssueFormService implements IIssueMainService { const replyChannel = `vscode:triggerReporterMenuResponse`; mainWindow.postMessage({ replyChannel }, '*'); } - - menu.dispose(); } }); diff --git a/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts b/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts index 61ca99ac1c2e1..a131f19d86584 100644 --- a/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts +++ b/src/vs/workbench/contrib/issue/browser/issueQuickAccess.ts @@ -65,13 +65,8 @@ export class IssueQuickAccess extends PickerQuickAccessProvider entry[1]); - - menu.dispose(); + // gets menu actions from contributed + const actions = this.menuService.getMenuActions(MenuId.IssueReporter, this.contextKeyService, { renderShortTitle: true }).flatMap(entry => entry[1]); // create picks from contributed menu actions.forEach(action => { diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts b/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts index 9986f5065f0bc..651dfa6c509c1 100644 --- a/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueService.ts @@ -41,11 +41,10 @@ export class NativeIssueService implements IWorkbenchIssueService { ipcRenderer.on('vscode:triggerReporterMenu', async (event, arg) => { const extensionId = arg.extensionId; - // creates menu from contributed - const menu = this.menuService.createMenu(MenuId.IssueReporter, this.contextKeyService); + // gets menu from contributed + const actions = this.menuService.getMenuActions(MenuId.IssueReporter, this.contextKeyService, { renderShortTitle: true }).flatMap(entry => entry[1]); // render menu and dispose - const actions = menu.getActions({ renderShortTitle: true }).flatMap(entry => entry[1]); actions.forEach(async action => { try { if (action.item && 'source' in action.item && action.item.source?.id === extensionId) { @@ -61,7 +60,6 @@ export class NativeIssueService implements IWorkbenchIssueService { // send undefined to indicate no action was taken ipcRenderer.send(`vscode:triggerReporterMenuResponse:${extensionId}`, undefined); } - menu.dispose(); }); } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/notebookVariables/notebookVariablesView.ts b/src/vs/workbench/contrib/notebook/browser/contrib/notebookVariables/notebookVariablesView.ts index c05cdaae7f6f8..5ca97b08f958c 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/notebookVariables/notebookVariablesView.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/notebookVariables/notebookVariablesView.ts @@ -128,9 +128,8 @@ export class NotebookVariablesView extends ViewPane { [CONTEXT_VARIABLE_LANGUAGE.key, element.language], [CONTEXT_VARIABLE_EXTENSIONID.key, element.extensionId] ]); - const menu = this.menuService.createMenu(MenuId.NotebookVariablesContext, overlayedContext); - createAndFillInContextMenuActions(menu, { arg, shouldForwardArgs: true }, actions); - menu.dispose(); + const menu = this.menuService.getMenuActions(MenuId.NotebookVariablesContext, overlayedContext, { arg, shouldForwardArgs: true }); + createAndFillInContextMenuActions(menu, actions); this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, getActions: () => actions diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts index 59a4d27a8e245..263d08b0c14f1 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts @@ -1544,11 +1544,10 @@ export class ModifiedElement extends AbstractElementRenderer { } })); - const menu = this.menuService.createMenu(MenuId.NotebookDiffCellInputTitle, scopedContextKeyService); + const menu = this.menuService.getMenuActions(MenuId.NotebookDiffCellInputTitle, scopedContextKeyService, { shouldForwardArgs: true }); const actions: IAction[] = []; - createAndFillInActionBarActions(menu, { shouldForwardArgs: true }, actions); + createAndFillInActionBarActions(menu, actions); this._toolbar.setActions(actions); - menu.dispose(); } private async _initializeSourceDiffEditor() { diff --git a/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts b/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts index 17b7b7ac4902c..2cb85b71dab2d 100644 --- a/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts +++ b/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts @@ -214,8 +214,8 @@ export class CommandsQuickAccessProvider extends AbstractEditorCommandsQuickAcce private getGlobalCommandPicks(): ICommandQuickPick[] { const globalCommandPicks: ICommandQuickPick[] = []; const scopedContextKeyService = this.editorService.activeEditorPane?.scopedContextKeyService || this.editorGroupService.activeGroup.scopedContextKeyService; - const globalCommandsMenu = this.menuService.createMenu(MenuId.CommandPalette, scopedContextKeyService); - const globalCommandsMenuActions = globalCommandsMenu.getActions() + const globalCommandsMenu = this.menuService.getMenuActions(MenuId.CommandPalette, scopedContextKeyService); + const globalCommandsMenuActions = globalCommandsMenu .reduce((r, [, actions]) => [...r, ...actions], >[]) .filter(action => action instanceof MenuItemAction && action.enabled) as MenuItemAction[]; @@ -251,9 +251,6 @@ export class CommandsQuickAccessProvider extends AbstractEditorCommandsQuickAcce }); } - // Cleanup - globalCommandsMenu.dispose(); - return globalCommandPicks; } } diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index aa0e50ccf491c..0273ba76ec530 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -3322,16 +3322,14 @@ export class SCMViewPane extends ViewPane { private onListContextMenu(e: ITreeContextMenuEvent): void { if (!e.element) { - const menu = this.menuService.createMenu(Menus.ViewSort, this.contextKeyService); + const menu = this.menuService.getMenuActions(Menus.ViewSort, this.contextKeyService); const actions: IAction[] = []; - createAndFillInContextMenuActions(menu, undefined, actions); + createAndFillInContextMenuActions(menu, actions); return this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, getActions: () => actions, - onHide: () => { - menu.dispose(); - } + onHide: () => { } }); } diff --git a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts index dd48c16b9412f..80f6674801a3d 100644 --- a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts @@ -880,16 +880,12 @@ abstract class RunTestDecoration { private getContributedTestActions(test: InternalTestItem, capabilities: number): IAction[] { const contextOverlay = this.contextKeyService.createOverlay(getTestItemContextOverlay(test, capabilities)); - const menu = this.menuService.createMenu(MenuId.TestItemGutter, contextOverlay); - try { - const target: IAction[] = []; - const arg = getContextForTestItem(this.testService.collection, test.item.extId); - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true, arg }, target); - return target; - } finally { - menu.dispose(); - } + const target: IAction[] = []; + const arg = getContextForTestItem(this.testService.collection, test.item.extId); + const menu = this.menuService.getMenuActions(MenuId.TestItemGutter, contextOverlay, { shouldForwardArgs: true, arg }); + createAndFillInContextMenuActions(menu, target); + return target; } } diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index d999c5e330111..7bf8db331eb11 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -365,16 +365,10 @@ export class TestingExplorerView extends ViewPane { contextKeys.push(['testing.profile.context.group', 'coverage']); } const key = this.contextKeyService.createOverlay(contextKeys); - const menu = this.menuService.createMenu(MenuId.TestProfilesContext, key); + const menu = this.menuService.getMenuActions(MenuId.TestProfilesContext, key); // fill if there are any actions - try { - createAndFillInContextMenuActions(menu, undefined, menuActions); - } finally { - menu.dispose(); - } - - + createAndFillInContextMenuActions(menu, menuActions); const postActions: IAction[] = []; if (profileActions.length > 1) { @@ -1567,20 +1561,17 @@ const getActionableElementActions = ( } const contextOverlay = contextKeyService.createOverlay(contextKeys); - const menu = menuService.createMenu(MenuId.TestItem, contextOverlay); + const menu = menuService.getMenuActions(MenuId.TestItem, contextOverlay, { + shouldForwardArgs: true, + }); - try { - const primary: IAction[] = []; - const secondary: IAction[] = []; - const result = { primary, secondary }; - createAndFillInActionBarActions(menu, { - shouldForwardArgs: true, - }, result, 'inline'); + const primary: IAction[] = []; + const secondary: IAction[] = []; + const result = { primary, secondary }; + createAndFillInActionBarActions(menu, result, 'inline'); + + return { actions: result, contextOverlay }; - return { actions: result, contextOverlay }; - } finally { - menu.dispose(); - } }; registerThemingParticipant((theme, collector) => { diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index 6362d6acdf959..ec21581a9a656 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -1102,10 +1102,9 @@ class TestResultsPeek extends PeekViewWidget { super._fillHead(container); const actions: IAction[] = []; - const menu = this.menuService.createMenu(MenuId.TestPeekTitle, this.contextKeyService); - createAndFillInActionBarActions(menu, undefined, actions); + const menu = this.menuService.getMenuActions(MenuId.TestPeekTitle, this.contextKeyService); + createAndFillInActionBarActions(menu, actions); this._actionbarWidget!.push(actions, { label: false, icon: true, index: 0 }); - menu.dispose(); } protected override _fillBody(containerElement: HTMLElement): void { @@ -2558,13 +2557,9 @@ class TreeActionsProvider { const contextOverlay = this.contextKeyService.createOverlay(contextKeys); const result = { primary, secondary }; - const menu = this.menuService.createMenu(id, contextOverlay); - try { - createAndFillInActionBarActions(menu, { arg: element.context }, result, 'inline'); - return result; - } finally { - menu.dispose(); - } + const menu = this.menuService.getMenuActions(id, contextOverlay, { arg: element.context }); + createAndFillInActionBarActions(menu, result, 'inline'); + return result; } } diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts index 6ca11ce3e4e09..41c6e84efe7af 100644 --- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts +++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts @@ -1315,13 +1315,11 @@ class TimelinePaneCommands extends Disposable { [context.key, context.value], ]); - const menu = this.menuService.createMenu(menuId, contextKeyService); + const menu = this.menuService.getMenuActions(menuId, contextKeyService, { shouldForwardArgs: true }); const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; - createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, 'inline'); - - menu.dispose(); + createAndFillInContextMenuActions(menu, result, 'inline'); return result; } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts index caa0aaa31681d..29d961380898d 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfile.ts @@ -285,19 +285,16 @@ export class UserDataProfilesWorkbenchContribution extends Disposable implements async run(accessor: ServicesAccessor) { const quickInputService = accessor.get(IQuickInputService); const menuService = accessor.get(IMenuService); - const menu = menuService.createMenu(ProfilesMenu, accessor.get(IContextKeyService)); - const actions = menu.getActions().find(([group]) => group === '0_profiles')?.[1] ?? []; - try { - const result = await quickInputService.pick(actions.map(action => ({ - action, - label: action.checked ? `$(check) ${action.label}` : action.label, - })), { - placeHolder: localize('selectProfile', "Select Profile") - }); - await result?.action.run(); - } finally { - menu.dispose(); - } + const menu = menuService.getMenuActions(ProfilesMenu, accessor.get(IContextKeyService)); + const actions = menu.find(([group]) => group === '0_profiles')?.[1] ?? []; + const result = await quickInputService.pick(actions.map(action => ({ + action, + label: action.checked ? `$(check) ${action.label}` : action.label, + })), { + placeHolder: localize('selectProfile', "Select Profile") + }); + await result?.action.run(); + } }); } diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts index a9b85a44e65ba..c19f31930f815 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts @@ -120,10 +120,9 @@ registerAction2(class ManageProfilesAction extends Action2 { const contextKeyService = accessor.get(IContextKeyService); const commandService = accessor.get(ICommandService); - const menu = menuService.createMenu(ProfilesMenu, contextKeyService); + const menu = menuService.getMenuActions(ProfilesMenu, contextKeyService); const actions: IAction[] = []; - createAndFillInActionBarActions(menu, undefined, actions); - menu.dispose(); + createAndFillInActionBarActions(menu, actions); if (actions.length) { const picks: QuickPickItem[] = actions.map(action => { From 6f18713cbef1cd74f4d3aa9dba3b2404922632e6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2024 12:48:53 +0200 Subject: [PATCH 692/755] Web Extensions no longer work in dev mode (fix #220171) (#221030) The web worker is now using `importScript` directive in a data URL which is no longer the same `script-src` as the iframe when running built where we use `webEndpointUrlTemplate`. This breaks `vscode-test-web` that runs from `localhost` so we allow `http://localhost` --- .../extensions/worker/webWorkerExtensionHostIframe.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html index aded7faefeba7..52045f22ae40d 100644 --- a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html +++ b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html @@ -4,7 +4,7 @@ From eb025312da6410db6a4d7fa8aaaab315d3ddc5c4 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 8 Jul 2024 11:36:01 +0200 Subject: [PATCH 693/755] Fixes #221005 --- src/vs/editor/contrib/codelens/browser/codeLensCache.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/codelens/browser/codeLensCache.ts b/src/vs/editor/contrib/codelens/browser/codeLensCache.ts index 47fc3260b1f80..f7666b8c24692 100644 --- a/src/vs/editor/contrib/codelens/browser/codeLensCache.ts +++ b/src/vs/editor/contrib/codelens/browser/codeLensCache.ts @@ -61,10 +61,9 @@ export class CodeLensCache implements ICodeLensCache { this._deserialize(raw); // store lens data on shutdown - Event.once(storageService.onWillSaveState)(e => { - if (e.reason === WillSaveStateReason.SHUTDOWN) { - storageService.store(key, this._serialize(), StorageScope.WORKSPACE, StorageTarget.MACHINE); - } + const onWillSaveStateBecauseOfShutdown = Event.filter(storageService.onWillSaveState, e => e.reason === WillSaveStateReason.SHUTDOWN); + Event.once(onWillSaveStateBecauseOfShutdown)(e => { + storageService.store(key, this._serialize(), StorageScope.WORKSPACE, StorageTarget.MACHINE); }); } From f46e9223f6850ba07f0081e177b0e5fe903426fe Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 8 Jul 2024 12:33:31 +0200 Subject: [PATCH 694/755] Fixes #216824 --- src/vs/editor/browser/stableEditorScroll.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/editor/browser/stableEditorScroll.ts b/src/vs/editor/browser/stableEditorScroll.ts index 986e18ac6c03d..4d7539435cd35 100644 --- a/src/vs/editor/browser/stableEditorScroll.ts +++ b/src/vs/editor/browser/stableEditorScroll.ts @@ -20,6 +20,16 @@ export class StableEditorScrollState { const visibleRanges = editor.getVisibleRanges(); if (visibleRanges.length > 0) { visiblePosition = visibleRanges[0].getStartPosition(); + + const cursorPos = editor.getPosition(); + if (cursorPos) { + const isVisible = visibleRanges.some(range => range.containsPosition(cursorPos)); + if (isVisible) { + // Keep cursor pos fixed if it is visible + visiblePosition = cursorPos; + } + } + const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop; } From 865269335ead330ddc070ff9d7ba6f7f6ff393c6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2024 12:56:52 +0200 Subject: [PATCH 695/755] chore/ESM - use defaut-import for electron modules that make it into unit-test (#221035) --- .../base/parts/ipc/electron-main/ipcMain.ts | 20 +++--- .../electron-main/dialogMainService.ts | 72 +++++++++---------- .../electron-main/lifecycleMainService.ts | 36 +++++----- .../theme/electron-main/themeMainService.ts | 32 ++++----- .../platform/window/electron-main/window.ts | 10 +-- .../windows/electron-main/windowImpl.ts | 54 +++++++------- .../platform/windows/electron-main/windows.ts | 18 ++--- .../electron-main/windowsStateHandler.ts | 16 ++--- .../workspacesManagementMainService.ts | 4 +- 9 files changed, 131 insertions(+), 131 deletions(-) diff --git a/src/vs/base/parts/ipc/electron-main/ipcMain.ts b/src/vs/base/parts/ipc/electron-main/ipcMain.ts index c72b6e8e64423..a0bf9a1603fb6 100644 --- a/src/vs/base/parts/ipc/electron-main/ipcMain.ts +++ b/src/vs/base/parts/ipc/electron-main/ipcMain.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcMain as unsafeIpcMain, IpcMainEvent, IpcMainInvokeEvent } from 'electron'; +import electron from 'electron'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; import { VSCODE_AUTHORITY } from 'vs/base/common/network'; -type ipcMainListener = (event: IpcMainEvent, ...args: any[]) => void; +type ipcMainListener = (event: electron.IpcMainEvent, ...args: any[]) => void; class ValidatedIpcMain implements Event.NodeEventEmitter { @@ -25,7 +25,7 @@ class ValidatedIpcMain implements Event.NodeEventEmitter { // Remember the wrapped listener so that later we can // properly implement `removeListener`. - const wrappedListener = (event: IpcMainEvent, ...args: any[]) => { + const wrappedListener = (event: electron.IpcMainEvent, ...args: any[]) => { if (this.validateEvent(channel, event)) { listener(event, ...args); } @@ -33,7 +33,7 @@ class ValidatedIpcMain implements Event.NodeEventEmitter { this.mapListenerToWrapper.set(listener, wrappedListener); - unsafeIpcMain.on(channel, wrappedListener); + electron.ipcMain.on(channel, wrappedListener); return this; } @@ -43,7 +43,7 @@ class ValidatedIpcMain implements Event.NodeEventEmitter { * only the next time a message is sent to `channel`, after which it is removed. */ once(channel: string, listener: ipcMainListener): this { - unsafeIpcMain.once(channel, (event: IpcMainEvent, ...args: any[]) => { + electron.ipcMain.once(channel, (event: electron.IpcMainEvent, ...args: any[]) => { if (this.validateEvent(channel, event)) { listener(event, ...args); } @@ -68,8 +68,8 @@ class ValidatedIpcMain implements Event.NodeEventEmitter { * are serialized and only the `message` property from the original error is * provided to the renderer process. Please refer to #24427 for details. */ - handle(channel: string, listener: (event: IpcMainInvokeEvent, ...args: any[]) => Promise): this { - unsafeIpcMain.handle(channel, (event: IpcMainInvokeEvent, ...args: any[]) => { + handle(channel: string, listener: (event: electron.IpcMainInvokeEvent, ...args: any[]) => Promise): this { + electron.ipcMain.handle(channel, (event: electron.IpcMainInvokeEvent, ...args: any[]) => { if (this.validateEvent(channel, event)) { return listener(event, ...args); } @@ -84,7 +84,7 @@ class ValidatedIpcMain implements Event.NodeEventEmitter { * Removes any handler for `channel`, if present. */ removeHandler(channel: string): this { - unsafeIpcMain.removeHandler(channel); + electron.ipcMain.removeHandler(channel); return this; } @@ -96,14 +96,14 @@ class ValidatedIpcMain implements Event.NodeEventEmitter { removeListener(channel: string, listener: ipcMainListener): this { const wrappedListener = this.mapListenerToWrapper.get(listener); if (wrappedListener) { - unsafeIpcMain.removeListener(channel, wrappedListener); + electron.ipcMain.removeListener(channel, wrappedListener); this.mapListenerToWrapper.delete(listener); } return this; } - private validateEvent(channel: string, event: IpcMainEvent | IpcMainInvokeEvent): boolean { + private validateEvent(channel: string, event: electron.IpcMainEvent | electron.IpcMainInvokeEvent): boolean { if (!channel || !channel.startsWith('vscode:')) { onUnexpectedError(`Refused to handle ipcMain event for channel '${channel}' because the channel is unknown.`); return false; // unexpected channel diff --git a/src/vs/platform/dialogs/electron-main/dialogMainService.ts b/src/vs/platform/dialogs/electron-main/dialogMainService.ts index bc1230a48ea61..2fffe78c5fb66 100644 --- a/src/vs/platform/dialogs/electron-main/dialogMainService.ts +++ b/src/vs/platform/dialogs/electron-main/dialogMainService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrowserWindow, dialog, FileFilter, MessageBoxOptions, MessageBoxReturnValue, OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from 'electron'; +import electron from 'electron'; import { Queue } from 'vs/base/common/async'; import { hash } from 'vs/base/common/hash'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; @@ -24,14 +24,14 @@ export interface IDialogMainService { readonly _serviceBrand: undefined; - pickFileFolder(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise; - pickFolder(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise; - pickFile(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise; - pickWorkspace(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise; + pickFileFolder(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise; + pickFolder(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise; + pickFile(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise; + pickWorkspace(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise; - showMessageBox(options: MessageBoxOptions, window?: BrowserWindow): Promise; - showSaveDialog(options: SaveDialogOptions, window?: BrowserWindow): Promise; - showOpenDialog(options: OpenDialogOptions, window?: BrowserWindow): Promise; + showMessageBox(options: electron.MessageBoxOptions, window?: electron.BrowserWindow): Promise; + showSaveDialog(options: electron.SaveDialogOptions, window?: electron.BrowserWindow): Promise; + showOpenDialog(options: electron.OpenDialogOptions, window?: electron.BrowserWindow): Promise; } interface IInternalNativeOpenDialogOptions extends INativeOpenDialogOptions { @@ -40,7 +40,7 @@ interface IInternalNativeOpenDialogOptions extends INativeOpenDialogOptions { readonly title: string; readonly buttonLabel?: string; - readonly filters?: FileFilter[]; + readonly filters?: electron.FileFilter[]; } export class DialogMainService implements IDialogMainService { @@ -48,8 +48,8 @@ export class DialogMainService implements IDialogMainService { declare readonly _serviceBrand: undefined; private readonly windowFileDialogLocks = new Map>(); - private readonly windowDialogQueues = new Map>(); - private readonly noWindowDialogueQueue = new Queue(); + private readonly windowDialogQueues = new Map>(); + private readonly noWindowDialogueQueue = new Queue(); constructor( @ILogService private readonly logService: ILogService, @@ -57,19 +57,19 @@ export class DialogMainService implements IDialogMainService { ) { } - pickFileFolder(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise { + pickFileFolder(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise { return this.doPick({ ...options, pickFolders: true, pickFiles: true, title: localize('open', "Open") }, window); } - pickFolder(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise { + pickFolder(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise { return this.doPick({ ...options, pickFolders: true, title: localize('openFolder', "Open Folder") }, window); } - pickFile(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise { + pickFile(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise { return this.doPick({ ...options, pickFiles: true, title: localize('openFile', "Open File") }, window); } - pickWorkspace(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise { + pickWorkspace(options: INativeOpenDialogOptions, window?: electron.BrowserWindow): Promise { const title = localize('openWorkspaceTitle', "Open Workspace from File"); const buttonLabel = mnemonicButtonLabel(localize({ key: 'openWorkspace', comment: ['&& denotes a mnemonic'] }, "&&Open")); const filters = WORKSPACE_FILTER; @@ -77,10 +77,10 @@ export class DialogMainService implements IDialogMainService { return this.doPick({ ...options, pickFiles: true, title, filters, buttonLabel }, window); } - private async doPick(options: IInternalNativeOpenDialogOptions, window?: BrowserWindow): Promise { + private async doPick(options: IInternalNativeOpenDialogOptions, window?: electron.BrowserWindow): Promise { // Ensure dialog options - const dialogOptions: OpenDialogOptions = { + const dialogOptions: electron.OpenDialogOptions = { title: options.title, buttonLabel: options.buttonLabel, filters: options.filters, @@ -105,7 +105,7 @@ export class DialogMainService implements IDialogMainService { } // Show Dialog - const result = await this.showOpenDialog(dialogOptions, (window || BrowserWindow.getFocusedWindow()) ?? undefined); + const result = await this.showOpenDialog(dialogOptions, (window || electron.BrowserWindow.getFocusedWindow()) ?? undefined); if (result && result.filePaths && result.filePaths.length > 0) { return result.filePaths; } @@ -113,14 +113,14 @@ export class DialogMainService implements IDialogMainService { return undefined; } - private getWindowDialogQueue(window?: BrowserWindow): Queue { + private getWindowDialogQueue(window?: electron.BrowserWindow): Queue { // Queue message box requests per window so that one can show // after the other. if (window) { let windowDialogQueue = this.windowDialogQueues.get(window.id); if (!windowDialogQueue) { - windowDialogQueue = new Queue(); + windowDialogQueue = new Queue(); this.windowDialogQueues.set(window.id, windowDialogQueue); } @@ -130,15 +130,15 @@ export class DialogMainService implements IDialogMainService { } } - showMessageBox(rawOptions: MessageBoxOptions, window?: BrowserWindow): Promise { - return this.getWindowDialogQueue(window).queue(async () => { + showMessageBox(rawOptions: electron.MessageBoxOptions, window?: electron.BrowserWindow): Promise { + return this.getWindowDialogQueue(window).queue(async () => { const { options, buttonIndeces } = massageMessageBoxOptions(rawOptions, this.productService); - let result: MessageBoxReturnValue | undefined = undefined; + let result: electron.MessageBoxReturnValue | undefined = undefined; if (window) { - result = await dialog.showMessageBox(window, options); + result = await electron.dialog.showMessageBox(window, options); } else { - result = await dialog.showMessageBox(options); + result = await electron.dialog.showMessageBox(options); } return { @@ -148,7 +148,7 @@ export class DialogMainService implements IDialogMainService { }); } - async showSaveDialog(options: SaveDialogOptions, window?: BrowserWindow): Promise { + async showSaveDialog(options: electron.SaveDialogOptions, window?: electron.BrowserWindow): Promise { // Prevent duplicates of the same dialog queueing at the same time const fileDialogLock = this.acquireFileDialogLock(options, window); @@ -159,12 +159,12 @@ export class DialogMainService implements IDialogMainService { } try { - return await this.getWindowDialogQueue(window).queue(async () => { - let result: SaveDialogReturnValue; + return await this.getWindowDialogQueue(window).queue(async () => { + let result: electron.SaveDialogReturnValue; if (window) { - result = await dialog.showSaveDialog(window, options); + result = await electron.dialog.showSaveDialog(window, options); } else { - result = await dialog.showSaveDialog(options); + result = await electron.dialog.showSaveDialog(options); } result.filePath = this.normalizePath(result.filePath); @@ -190,7 +190,7 @@ export class DialogMainService implements IDialogMainService { return paths.map(path => this.normalizePath(path)); } - async showOpenDialog(options: OpenDialogOptions, window?: BrowserWindow): Promise { + async showOpenDialog(options: electron.OpenDialogOptions, window?: electron.BrowserWindow): Promise { // Ensure the path exists (if provided) if (options.defaultPath) { @@ -209,12 +209,12 @@ export class DialogMainService implements IDialogMainService { } try { - return await this.getWindowDialogQueue(window).queue(async () => { - let result: OpenDialogReturnValue; + return await this.getWindowDialogQueue(window).queue(async () => { + let result: electron.OpenDialogReturnValue; if (window) { - result = await dialog.showOpenDialog(window, options); + result = await electron.dialog.showOpenDialog(window, options); } else { - result = await dialog.showOpenDialog(options); + result = await electron.dialog.showOpenDialog(options); } result.filePaths = this.normalizePaths(result.filePaths); @@ -226,7 +226,7 @@ export class DialogMainService implements IDialogMainService { } } - private acquireFileDialogLock(options: SaveDialogOptions | OpenDialogOptions, window?: BrowserWindow): IDisposable | undefined { + private acquireFileDialogLock(options: electron.SaveDialogOptions | electron.OpenDialogOptions, window?: electron.BrowserWindow): IDisposable | undefined { // If no window is provided, allow as many dialogs as // needed since we consider them not modal per window diff --git a/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts b/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts index 7dfc46d0a3b96..4013b2b548be5 100644 --- a/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts +++ b/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, BrowserWindow, Event as ElectronEvent } from 'electron'; +import electron from 'electron'; import { validatedIpcMain } from 'vs/base/parts/ipc/electron-main/ipcMain'; import { Barrier, Promises, timeout } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; @@ -294,7 +294,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe this.fireOnWillShutdown(ShutdownReason.QUIT); } }; - app.addListener('before-quit', beforeQuitListener); + electron.app.addListener('before-quit', beforeQuitListener); // window-all-closed: an event that only fires when the last window // was closed. We override this event to be in charge if app.quit() @@ -305,14 +305,14 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe // Windows/Linux: we quit when all windows have closed // Mac: we only quit when quit was requested if (this._quitRequested || !isMacintosh) { - app.quit(); + electron.app.quit(); } }; - app.addListener('window-all-closed', windowAllClosedListener); + electron.app.addListener('window-all-closed', windowAllClosedListener); // will-quit: an event that is fired after all windows have been // closed, but before actually quitting. - app.once('will-quit', e => { + electron.app.once('will-quit', e => { this.trace('Lifecycle#app.on(will-quit) - begin'); // Prevent the quit until the shutdown promise was resolved @@ -332,12 +332,12 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe // will-quit listener is only installed "once". Also // remove any listener we have that is no longer needed - app.removeListener('before-quit', beforeQuitListener); - app.removeListener('window-all-closed', windowAllClosedListener); + electron.app.removeListener('before-quit', beforeQuitListener); + electron.app.removeListener('window-all-closed', windowAllClosedListener); this.trace('Lifecycle#app.on(will-quit) - calling app.quit()'); - app.quit(); + electron.app.quit(); }); }); } @@ -428,7 +428,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe // Window Before Closing: Main -> Renderer const win = assertIsDefined(window.win); - windowListeners.add(Event.fromNodeEventEmitter(win, 'close')(e => { + windowListeners.add(Event.fromNodeEventEmitter(win, 'close')(e => { // The window already acknowledged to be closed const windowId = window.id; @@ -458,7 +458,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe window.close(); }); })); - windowListeners.add(Event.fromNodeEventEmitter(win, 'closed')(() => { + windowListeners.add(Event.fromNodeEventEmitter(win, 'closed')(() => { this.trace(`Lifecycle#window.on('closed') - window ID ${window.id}`); // update window count @@ -480,7 +480,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe const win = assertIsDefined(auxWindow.win); const windowListeners = new DisposableStore(); - windowListeners.add(Event.fromNodeEventEmitter(win, 'close')(e => { + windowListeners.add(Event.fromNodeEventEmitter(win, 'close')(e => { this.trace(`Lifecycle#auxWindow.on('close') - window ID ${auxWindow.id}`); if (this._quitRequested) { @@ -499,7 +499,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe e.preventDefault(); } })); - windowListeners.add(Event.fromNodeEventEmitter(win, 'closed')(() => { + windowListeners.add(Event.fromNodeEventEmitter(win, 'closed')(() => { this.trace(`Lifecycle#auxWindow.on('closed') - window ID ${auxWindow.id}`); windowListeners.dispose(); @@ -652,7 +652,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe // Calling app.quit() will trigger the close handlers of each opened window // and only if no window vetoed the shutdown, we will get the will-quit event this.trace('Lifecycle#quit() - calling app.quit()'); - app.quit(); + electron.app.quit(); }); return this.pendingQuitPromise; @@ -690,16 +690,16 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe const quitListener = () => { if (!this.relaunchHandler?.handleRelaunch(options)) { this.trace('Lifecycle#relaunch() - calling app.relaunch()'); - app.relaunch({ args }); + electron.app.relaunch({ args }); } }; - app.once('quit', quitListener); + electron.app.once('quit', quitListener); // `app.relaunch()` does not quit automatically, so we quit first, // check for vetoes and then relaunch from the `app.on('quit')` event const veto = await this.quit(true /* will restart */); if (veto) { - app.removeListener('quit', quitListener); + electron.app.removeListener('quit', quitListener); } } @@ -727,7 +727,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe // to a participant within the window. this is not wanted when we // are asked to kill the application. (async () => { - for (const window of BrowserWindow.getAllWindows()) { + for (const window of electron.BrowserWindow.getAllWindows()) { if (window && !window.isDestroyed()) { let whenWindowClosed: Promise; if (window.webContents && !window.webContents.isDestroyed()) { @@ -744,6 +744,6 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe ]); // Now exit either after 1s or all windows destroyed - app.exit(code); + electron.app.exit(code); } } diff --git a/src/vs/platform/theme/electron-main/themeMainService.ts b/src/vs/platform/theme/electron-main/themeMainService.ts index caef715f2daec..e332feed26436 100644 --- a/src/vs/platform/theme/electron-main/themeMainService.ts +++ b/src/vs/platform/theme/electron-main/themeMainService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrowserWindow, nativeTheme } from 'electron'; +import electron from 'electron'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; @@ -64,30 +64,30 @@ export class ThemeMainService extends Disposable implements IThemeMainService { this.updateSystemColorTheme(); // Color Scheme changes - this._register(Event.fromNodeEventEmitter(nativeTheme, 'updated')(() => this._onDidChangeColorScheme.fire(this.getColorScheme()))); + this._register(Event.fromNodeEventEmitter(electron.nativeTheme, 'updated')(() => this._onDidChangeColorScheme.fire(this.getColorScheme()))); } private updateSystemColorTheme(): void { if (isLinux || this.configurationService.getValue(ThemeSettings.DETECT_COLOR_SCHEME)) { // only with `system` we can detect the system color scheme - nativeTheme.themeSource = 'system'; + electron.nativeTheme.themeSource = 'system'; } else { switch (this.configurationService.getValue<'default' | 'auto' | 'light' | 'dark'>(ThemeSettings.SYSTEM_COLOR_THEME)) { case 'dark': - nativeTheme.themeSource = 'dark'; + electron.nativeTheme.themeSource = 'dark'; break; case 'light': - nativeTheme.themeSource = 'light'; + electron.nativeTheme.themeSource = 'light'; break; case 'auto': switch (this.getBaseTheme()) { - case 'vs': nativeTheme.themeSource = 'light'; break; - case 'vs-dark': nativeTheme.themeSource = 'dark'; break; - default: nativeTheme.themeSource = 'system'; + case 'vs': electron.nativeTheme.themeSource = 'light'; break; + case 'vs-dark': electron.nativeTheme.themeSource = 'dark'; break; + default: electron.nativeTheme.themeSource = 'system'; } break; default: - nativeTheme.themeSource = 'system'; + electron.nativeTheme.themeSource = 'system'; break; } @@ -97,23 +97,23 @@ export class ThemeMainService extends Disposable implements IThemeMainService { getColorScheme(): IColorScheme { if (isWindows) { // high contrast is refelected by the shouldUseInvertedColorScheme property - if (nativeTheme.shouldUseHighContrastColors) { + if (electron.nativeTheme.shouldUseHighContrastColors) { // shouldUseInvertedColorScheme is dark, !shouldUseInvertedColorScheme is light - return { dark: nativeTheme.shouldUseInvertedColorScheme, highContrast: true }; + return { dark: electron.nativeTheme.shouldUseInvertedColorScheme, highContrast: true }; } } else if (isMacintosh) { // high contrast is set if one of shouldUseInvertedColorScheme or shouldUseHighContrastColors is set, reflecting the 'Invert colours' and `Increase contrast` settings in MacOS - if (nativeTheme.shouldUseInvertedColorScheme || nativeTheme.shouldUseHighContrastColors) { - return { dark: nativeTheme.shouldUseDarkColors, highContrast: true }; + if (electron.nativeTheme.shouldUseInvertedColorScheme || electron.nativeTheme.shouldUseHighContrastColors) { + return { dark: electron.nativeTheme.shouldUseDarkColors, highContrast: true }; } } else if (isLinux) { // ubuntu gnome seems to have 3 states, light dark and high contrast - if (nativeTheme.shouldUseHighContrastColors) { + if (electron.nativeTheme.shouldUseHighContrastColors) { return { dark: true, highContrast: true }; } } return { - dark: nativeTheme.shouldUseDarkColors, + dark: electron.nativeTheme.shouldUseDarkColors, highContrast: false }; } @@ -170,7 +170,7 @@ export class ThemeMainService extends Disposable implements IThemeMainService { } private updateBackgroundColor(windowId: number, splash: IPartsSplash): void { - for (const window of BrowserWindow.getAllWindows()) { + for (const window of electron.BrowserWindow.getAllWindows()) { if (window.id === windowId) { window.setBackgroundColor(splash.colorInfo.background); break; diff --git a/src/vs/platform/window/electron-main/window.ts b/src/vs/platform/window/electron-main/window.ts index b63a6117514de..15fcb1790fe0a 100644 --- a/src/vs/platform/window/electron-main/window.ts +++ b/src/vs/platform/window/electron-main/window.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrowserWindow, Rectangle, screen, WebContents } from 'electron'; +import electron from 'electron'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -23,7 +23,7 @@ export interface IBaseWindow extends IDisposable { readonly onDidClose: Event; readonly id: number; - readonly win: BrowserWindow | null; + readonly win: electron.BrowserWindow | null; readonly lastFocusTime: number; focus(options?: { force: boolean }): void; @@ -41,7 +41,7 @@ export interface IBaseWindow extends IDisposable { updateWindowControls(options: { height?: number; backgroundColor?: string; foregroundColor?: string }): void; - matches(webContents: WebContents): boolean; + matches(webContents: electron.WebContents): boolean; } export interface ICodeWindow extends IBaseWindow { @@ -76,7 +76,7 @@ export interface ICodeWindow extends IBaseWindow { close(): void; - getBounds(): Rectangle; + getBounds(): electron.Rectangle; send(channel: string, ...args: any[]): void; sendWhenReady(channel: string, token: CancellationToken, ...args: any[]): void; @@ -158,7 +158,7 @@ export const defaultAuxWindowState = function (): IWindowState { const width = 800; const height = 600; - const workArea = screen.getPrimaryDisplay().workArea; + const workArea = electron.screen.getPrimaryDisplay().workArea; const x = Math.max(workArea.x + (workArea.width / 2) - (width / 2), 0); const y = Math.max(workArea.y + (workArea.height / 2) - (height / 2), 0); diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index 45b8835107ec8..0f626a7ddfc90 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, BrowserWindow, Display, nativeImage, NativeImage, Rectangle, screen, SegmentedControlSegment, systemPreferences, TouchBar, TouchBarSegmentedControl, WebContents, Event as ElectronEvent } from 'electron'; +import electron from 'electron'; import { DeferredPromise, RunOnceScheduler, timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -51,7 +51,7 @@ export interface IWindowCreationOptions { readonly isExtensionTestHost?: boolean; } -interface ITouchBarSegment extends SegmentedControlSegment { +interface ITouchBarSegment extends electron.SegmentedControlSegment { readonly id: string; } @@ -111,9 +111,9 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { protected _lastFocusTime = Date.now(); // window is shown on creation so take current time get lastFocusTime(): number { return this._lastFocusTime; } - protected _win: BrowserWindow | null = null; + protected _win: electron.BrowserWindow | null = null; get win() { return this._win; } - protected setWin(win: BrowserWindow): void { + protected setWin(win: electron.BrowserWindow): void { this._win = win; // Window Events @@ -160,7 +160,7 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { // This sets up a listener for the window hook. This is a Windows-only API provided by electron. win.hookWindowMessage(WM_INITMENU, () => { const [x, y] = win.getPosition(); - const cursorPos = screen.getCursorScreenPoint(); + const cursorPos = electron.screen.getCursorScreenPoint(); const cx = cursorPos.x - x; const cy = cursorPos.y - y; @@ -218,7 +218,7 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { super(); } - protected applyState(state: IWindowState, hasMultipleDisplays = screen.getAllDisplays().length > 0): void { + protected applyState(state: IWindowState, hasMultipleDisplays = electron.screen.getAllDisplays().length > 0): void { // TODO@electron (Electron 4 regression): when running on multiple displays where the target display // to open the window has a larger resolution than the primary display, the window will not size @@ -232,7 +232,7 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { const windowSettings = this.configurationService.getValue('window'); const useNativeTabs = isMacintosh && windowSettings?.nativeTabs === true; - if ((isMacintosh || isWindows) && hasMultipleDisplays && (!useNativeTabs || BrowserWindow.getAllWindows().length === 1)) { + if ((isMacintosh || isWindows) && hasMultipleDisplays && (!useNativeTabs || electron.BrowserWindow.getAllWindows().length === 1)) { if ([state.width, state.height, state.x, state.y].every(value => typeof value === 'number')) { this._win?.setBounds({ width: state.width, @@ -299,7 +299,7 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { focus(options?: { force: boolean }): void { if (isMacintosh && options?.force) { - app.focus({ steal: true }); + electron.app.focus({ steal: true }); } const win = this.win; @@ -322,7 +322,7 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { // Respect system settings on mac with regards to title click on windows title if (isMacintosh) { - const action = systemPreferences.getUserDefault('AppleActionOnDoubleClick', 'string'); + const action = electron.systemPreferences.getUserDefault('AppleActionOnDoubleClick', 'string'); switch (action) { case 'Minimize': win.minimize(); @@ -494,7 +494,7 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { //#endregion - abstract matches(webContents: WebContents): boolean; + abstract matches(webContents: electron.WebContents): boolean; override dispose(): void { super.dispose(); @@ -524,7 +524,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { private _id: number; get id(): number { return this._id; } - protected override _win: BrowserWindow; + protected override _win: electron.BrowserWindow; get backupPath(): string | undefined { return this._config?.backupPath; } @@ -561,7 +561,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { private readonly whenReadyCallbacks: { (window: ICodeWindow): void }[] = []; - private readonly touchBarGroups: TouchBarSegmentedControl[] = []; + private readonly touchBarGroups: electron.TouchBarSegmentedControl[] = []; private currentHttpProxy: string | undefined = undefined; private currentNoProxy: string | undefined = undefined; @@ -612,7 +612,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { // Create the browser window mark('code/willCreateCodeBrowserWindow'); - this._win = new BrowserWindow(options); + this._win = new electron.BrowserWindow(options); mark('code/didCreateCodeBrowserWindow'); this._id = this._win.id; @@ -693,7 +693,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { // unloading a window that should not be confused // with the DOM way. // (https://github.com/microsoft/vscode/issues/122736) - this._register(Event.fromNodeEventEmitter(this._win.webContents, 'will-prevent-unload')(event => event.preventDefault())); + this._register(Event.fromNodeEventEmitter(this._win.webContents, 'will-prevent-unload')(event => event.preventDefault())); // Remember that we loaded this._register(Event.fromNodeEventEmitter(this._win.webContents, 'did-finish-load')(() => { @@ -984,7 +984,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { const proxyBypassRules = newNoProxy ? `${newNoProxy},` : ''; this.logService.trace(`Setting proxy to '${proxyRules}', bypassing '${proxyBypassRules}'`); this._win.webContents.session.setProxy({ proxyRules, proxyBypassRules, pacScript: '' }); - app.setProxy({ proxyRules, proxyBypassRules, pacScript: '' }); + electron.app.setProxy({ proxyRules, proxyBypassRules, pacScript: '' }); } } } @@ -1135,7 +1135,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { configuration['extensions-dir'] = cli['extensions-dir']; } - configuration.accessibilitySupport = app.isAccessibilitySupportEnabled(); + configuration.accessibilitySupport = electron.app.isAccessibilitySupportEnabled(); configuration.isInitialStartup = false; // since this is a reload configuration.policiesData = this.policyService.serialize(); // set policies data again configuration.continueOn = this.environmentMainService.continueOn; @@ -1189,9 +1189,9 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { // fullscreen gets special treatment if (this.isFullScreen) { - let display: Display | undefined; + let display: electron.Display | undefined; try { - display = screen.getDisplayMatching(this.getBounds()); + display = electron.screen.getDisplayMatching(this.getBounds()); } catch (error) { // Electron has weird conditions under which it throws errors // e.g. https://github.com/microsoft/vscode/issues/100334 when @@ -1236,7 +1236,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { // only consider non-minimized window states if (mode === WindowMode.Normal || mode === WindowMode.Maximized) { - let bounds: Rectangle; + let bounds: electron.Rectangle; if (mode === WindowMode.Normal) { bounds = this.getBounds(); } else { @@ -1265,7 +1265,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { // Window dimensions try { - const displays = screen.getAllDisplays(); + const displays = electron.screen.getAllDisplays(); hasMultipleDisplays = displays.length > 1; state = WindowStateValidator.validateWindowState(this.logService, state, displays); @@ -1279,7 +1279,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { return [state || defaultWindowState(), hasMultipleDisplays]; } - getBounds(): Rectangle { + getBounds(): electron.Rectangle { const [x, y] = this._win.getPosition(); const [width, height] = this._win.getSize(); @@ -1428,16 +1428,16 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { this.touchBarGroups.push(groupTouchBar); } - this._win.setTouchBar(new TouchBar({ items: this.touchBarGroups })); + this._win.setTouchBar(new electron.TouchBar({ items: this.touchBarGroups })); } - private createTouchBarGroup(items: ISerializableCommandAction[] = []): TouchBarSegmentedControl { + private createTouchBarGroup(items: ISerializableCommandAction[] = []): electron.TouchBarSegmentedControl { // Group Segments const segments = this.createTouchBarGroupSegments(items); // Group Control - const control = new TouchBar.TouchBarSegmentedControl({ + const control = new electron.TouchBar.TouchBarSegmentedControl({ segments, mode: 'buttons', segmentStyle: 'automatic', @@ -1451,9 +1451,9 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { private createTouchBarGroupSegments(items: ISerializableCommandAction[] = []): ITouchBarSegment[] { const segments: ITouchBarSegment[] = items.map(item => { - let icon: NativeImage | undefined; + let icon: electron.NativeImage | undefined; if (item.icon && !ThemeIcon.isThemeIcon(item.icon) && item.icon?.dark?.scheme === Schemas.file) { - icon = nativeImage.createFromPath(URI.revive(item.icon.dark).fsPath); + icon = electron.nativeImage.createFromPath(URI.revive(item.icon.dark).fsPath); if (icon.isEmpty()) { icon = undefined; } @@ -1476,7 +1476,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { return segments; } - matches(webContents: WebContents): boolean { + matches(webContents: electron.WebContents): boolean { return this._win?.webContents.id === webContents.id; } diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index abfc98bc2a31a..30ed4fe16b0ff 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrowserWindowConstructorOptions, Display, Rectangle, WebContents, WebPreferences, screen } from 'electron'; +import electron from 'electron'; import { Event } from 'vs/base/common/event'; import { IProcessEnvironment, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; @@ -53,7 +53,7 @@ export interface IWindowsMainService { getLastActiveWindow(): ICodeWindow | undefined; getWindowById(windowId: number): ICodeWindow | undefined; - getWindowByWebContents(webContents: WebContents): ICodeWindow | undefined; + getWindowByWebContents(webContents: electron.WebContents): ICodeWindow | undefined; } export interface IWindowsCountChangedEvent { @@ -115,7 +115,7 @@ export interface IOpenConfiguration extends IBaseOpenConfiguration { export interface IOpenEmptyConfiguration extends IBaseOpenConfiguration { } -export function defaultBrowserWindowOptions(accessor: ServicesAccessor, windowState: IWindowState, webPreferences?: WebPreferences): BrowserWindowConstructorOptions & { experimentalDarkMode: boolean } { +export function defaultBrowserWindowOptions(accessor: ServicesAccessor, windowState: IWindowState, webPreferences?: electron.WebPreferences): electron.BrowserWindowConstructorOptions & { experimentalDarkMode: boolean } { const themeMainService = accessor.get(IThemeMainService); const productService = accessor.get(IProductService); const configurationService = accessor.get(IConfigurationService); @@ -123,7 +123,7 @@ export function defaultBrowserWindowOptions(accessor: ServicesAccessor, windowSt const windowSettings = configurationService.getValue('window'); - const options: BrowserWindowConstructorOptions & { experimentalDarkMode: boolean } = { + const options: electron.BrowserWindowConstructorOptions & { experimentalDarkMode: boolean } = { backgroundColor: themeMainService.getBackgroundColor(), minWidth: WindowMinimumSize.WIDTH, minHeight: WindowMinimumSize.HEIGHT, @@ -215,7 +215,7 @@ export function getLastFocused(windows: ICodeWindow[] | IAuxiliaryWindow[]): ICo export namespace WindowStateValidator { - export function validateWindowState(logService: ILogService, state: IWindowState, displays = screen.getAllDisplays()): IWindowState | undefined { + export function validateWindowState(logService: ILogService, state: IWindowState, displays = electron.screen.getAllDisplays()): IWindowState | undefined { logService.trace(`window#validateWindowState: validating window state on ${displays.length} display(s)`, state); if ( @@ -313,10 +313,10 @@ export namespace WindowStateValidator { } // Multi Monitor (non-fullscreen): ensure window is within display bounds - let display: Display | undefined; - let displayWorkingArea: Rectangle | undefined; + let display: electron.Display | undefined; + let displayWorkingArea: electron.Rectangle | undefined; try { - display = screen.getDisplayMatching({ x: state.x, y: state.y, width: state.width, height: state.height }); + display = electron.screen.getDisplayMatching({ x: state.x, y: state.y, width: state.width, height: state.height }); displayWorkingArea = getWorkingArea(display); logService.trace('window#validateWindowState: multi-monitor working area', displayWorkingArea); @@ -343,7 +343,7 @@ export namespace WindowStateValidator { return undefined; } - function getWorkingArea(display: Display): Rectangle | undefined { + function getWorkingArea(display: electron.Display): electron.Rectangle | undefined { // Prefer the working area of the display to account for taskbars on the // desktop being positioned somewhere (https://github.com/microsoft/vscode/issues/50830). diff --git a/src/vs/platform/windows/electron-main/windowsStateHandler.ts b/src/vs/platform/windows/electron-main/windowsStateHandler.ts index dcbec3407c403..6a6591cd44d22 100644 --- a/src/vs/platform/windows/electron-main/windowsStateHandler.ts +++ b/src/vs/platform/windows/electron-main/windowsStateHandler.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, Display, screen } from 'electron'; +import electron from 'electron'; import { Disposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; @@ -78,7 +78,7 @@ export class WindowsStateHandler extends Disposable { // When a window looses focus, save all windows state. This allows to // prevent loss of window-state data when OS is restarted without properly // shutting down the application (https://github.com/microsoft/vscode/issues/87171) - app.on('browser-window-blur', () => { + electron.app.on('browser-window-blur', () => { if (!this.shuttingDown) { this.saveWindowsState(); } @@ -339,8 +339,8 @@ export class WindowsStateHandler extends Disposable { // // We want the new window to open on the same display that the last active one is in - let displayToUse: Display | undefined; - const displays = screen.getAllDisplays(); + let displayToUse: electron.Display | undefined; + const displays = electron.screen.getAllDisplays(); // Single Display if (displays.length === 1) { @@ -352,18 +352,18 @@ export class WindowsStateHandler extends Disposable { // on mac there is 1 menu per window so we need to use the monitor where the cursor currently is if (isMacintosh) { - const cursorPoint = screen.getCursorScreenPoint(); - displayToUse = screen.getDisplayNearestPoint(cursorPoint); + const cursorPoint = electron.screen.getCursorScreenPoint(); + displayToUse = electron.screen.getDisplayNearestPoint(cursorPoint); } // if we have a last active window, use that display for the new window if (!displayToUse && lastActive) { - displayToUse = screen.getDisplayMatching(lastActive.getBounds()); + displayToUse = electron.screen.getDisplayMatching(lastActive.getBounds()); } // fallback to primary display or first display if (!displayToUse) { - displayToUse = screen.getPrimaryDisplay() || displays[0]; + displayToUse = electron.screen.getPrimaryDisplay() || displays[0]; } } diff --git a/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts index dc232fbda1e63..bfb4fcd51459a 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as fs from 'fs'; -import { BrowserWindow } from 'electron'; +import electron from 'electron'; import { Emitter, Event } from 'vs/base/common/event'; import { parse } from 'vs/base/common/json'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -281,7 +281,7 @@ export class WorkspacesManagementMainService extends Disposable implements IWork buttons: [localize({ key: 'ok', comment: ['&& denotes a mnemonic'] }, "&&OK")], message: localize('workspaceOpenedMessage', "Unable to save workspace '{0}'", basename(workspacePath)), detail: localize('workspaceOpenedDetail', "The workspace is already opened in another window. Please close that window first and then try again.") - }, BrowserWindow.getFocusedWindow() ?? undefined); + }, electron.BrowserWindow.getFocusedWindow() ?? undefined); return false; } From a35bb46e9b0126cc686db046adc945be9f929f52 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 18 Jun 2024 20:05:48 +0200 Subject: [PATCH 696/755] Adopts debug.description. Implemented for: * Position: (11:12) * Range: [11:12 -> 13:11) * Selection: |[11:12 -> 13:11) * TextDocument: TextDocument(file:///test.txt) * NotebookDocument: NotebookDocument(file:///test.txt) * TextEditor: TextEditor(file:///test.txt, [11:12 -> 13:11)) * NotebookEditor: NotebookEditor(file:///test.txt) * URI: URI(file:///test.txt) Fixes #191390 Signed-off-by: Henning Dieterichs --- src/vs/base/common/uri.ts | 4 +++ .../api/common/extHostDocumentData.ts | 3 ++ .../api/common/extHostNotebookDocument.ts | 3 ++ .../api/common/extHostNotebookEditor.ts | 3 ++ .../workbench/api/common/extHostTextEditor.ts | 5 ++- src/vs/workbench/api/common/extHostTypes.ts | 31 +++++++++++++++++++ 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index 4d7e51431cb20..f12b04da9d7ad 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -413,6 +413,10 @@ export class URI implements UriComponents { return result; } } + + [Symbol.for('debug.description')]() { + return `URI(${this.toString()})`; + } } export interface UriComponents { diff --git a/src/vs/workbench/api/common/extHostDocumentData.ts b/src/vs/workbench/api/common/extHostDocumentData.ts index ee321b2575a87..b3edbad94a168 100644 --- a/src/vs/workbench/api/common/extHostDocumentData.ts +++ b/src/vs/workbench/api/common/extHostDocumentData.ts @@ -76,6 +76,9 @@ export class ExtHostDocumentData extends MirrorTextModel { validateRange(ran) { return that._validateRange(ran); }, validatePosition(pos) { return that._validatePosition(pos); }, getWordRangeAtPosition(pos, regexp?) { return that._getWordRangeAtPosition(pos, regexp); }, + [Symbol.for('debug.description')]() { + return `TextDocument(${that._uri.toString()})`; + } }; } return Object.freeze(this._document); diff --git a/src/vs/workbench/api/common/extHostNotebookDocument.ts b/src/vs/workbench/api/common/extHostNotebookDocument.ts index 8f74a0a4b6937..382fd39c30a4e 100644 --- a/src/vs/workbench/api/common/extHostNotebookDocument.ts +++ b/src/vs/workbench/api/common/extHostNotebookDocument.ts @@ -211,6 +211,9 @@ export class ExtHostNotebookDocument { }, save() { return that._save(); + }, + [Symbol.for('debug.description')]() { + return `NotebookDocument(${this.uri.toString()})`; } }; this._notebook = Object.freeze(apiObject); diff --git a/src/vs/workbench/api/common/extHostNotebookEditor.ts b/src/vs/workbench/api/common/extHostNotebookEditor.ts index 8472fc1006dbb..4aec54c265163 100644 --- a/src/vs/workbench/api/common/extHostNotebookEditor.ts +++ b/src/vs/workbench/api/common/extHostNotebookEditor.ts @@ -71,6 +71,9 @@ export class ExtHostNotebookEditor { get viewColumn() { return that._viewColumn; }, + [Symbol.for('debug.description')]() { + return `NotebookEditor(${this.notebook.uri.toString()})`; + } }; ExtHostNotebookEditor.apiEditorsToExtHost.set(this._editor, this); diff --git a/src/vs/workbench/api/common/extHostTextEditor.ts b/src/vs/workbench/api/common/extHostTextEditor.ts index 44ed8f3804fa5..9da1df3c0d75e 100644 --- a/src/vs/workbench/api/common/extHostTextEditor.ts +++ b/src/vs/workbench/api/common/extHostTextEditor.ts @@ -11,7 +11,7 @@ import { IRange } from 'vs/editor/common/core/range'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, MainThreadTextEditorsShape } from 'vs/workbench/api/common/extHost.protocol'; import * as TypeConverters from 'vs/workbench/api/common/extHostTypeConverters'; -import { EndOfLine, Position, Range, Selection, SnippetString, TextEditorLineNumbersStyle, TextEditorRevealType } from 'vs/workbench/api/common/extHostTypes'; +import { EndOfLine, getDebugDescriptionOfSelection, Position, Range, Selection, SnippetString, TextEditorLineNumbersStyle, TextEditorRevealType } from 'vs/workbench/api/common/extHostTypes'; import type * as vscode from 'vscode'; import { ILogService } from 'vs/platform/log/common/log'; import { Lazy } from 'vs/base/common/lazy'; @@ -566,6 +566,9 @@ export class ExtHostTextEditor { }, hide() { _proxy.$tryHideEditor(id); + }, + [Symbol.for('debug.description')]() { + return `TextEditor(${this.document.uri.toString()}, ${this.selections.map(s => getDebugDescriptionOfSelection(s)).join(', ')})`; } }); } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 92b968e001ee3..18c2eefe79db6 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -271,6 +271,10 @@ export class Position { toJSON(): any { return { line: this.line, character: this.character }; } + + [Symbol.for('debug.description')]() { + return `(${this.line}:${this.character})`; + } } @es5ClassCompat @@ -417,6 +421,10 @@ export class Range { toJSON(): any { return [this.start, this.end]; } + + [Symbol.for('debug.description')]() { + return getDebugDescriptionOfRange(this); + } } @es5ClassCompat @@ -483,6 +491,29 @@ export class Selection extends Range { anchor: this.anchor }; } + + + [Symbol.for('debug.description')]() { + return getDebugDescriptionOfSelection(this); + } +} + +export function getDebugDescriptionOfRange(range: vscode.Range): string { + return range.isEmpty + ? `[${range.start.line}:${range.start.character})` + : `[${range.start.line}:${range.start.character} -> ${range.end.line}:${range.end.character})`; +} + +export function getDebugDescriptionOfSelection(selection: vscode.Selection): string { + let rangeStr = getDebugDescriptionOfRange(selection); + if (!selection.isEmpty) { + if (selection.active.isEqual(selection.start)) { + rangeStr = `|${rangeStr}`; + } else { + rangeStr = `${rangeStr}|`; + } + } + return rangeStr; } const validateConnectionToken = (connectionToken: string) => { From 2f29f3931cb1bbd79bd4e1a308423363420e1627 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 5 Jul 2024 11:37:31 +0200 Subject: [PATCH 697/755] Updates snapshot. --- .../__snapshots__/Response_inline_reference.0.snap | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Response_inline_reference.0.snap b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Response_inline_reference.0.snap index 5847d813dfe49..b26d84334a081 100644 --- a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Response_inline_reference.0.snap +++ b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Response_inline_reference.0.snap @@ -9,15 +9,7 @@ kind: "markdownContent" }, { - inlineReference: { - scheme: "https", - authority: "microsoft.com", - path: "/", - query: "", - fragment: "", - _formatted: null, - _fsPath: null - }, + inlineReference: URI(https://microsoft.com/), kind: "inlineReference" }, { From 4f99e9503b0b460c4c1b656c96c47aff8e3da6a5 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 5 Jul 2024 12:45:07 +0200 Subject: [PATCH 698/755] Removes selection from TextEditor debug description. --- src/vs/workbench/api/common/extHostTextEditor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/common/extHostTextEditor.ts b/src/vs/workbench/api/common/extHostTextEditor.ts index 9da1df3c0d75e..73334e5ac8920 100644 --- a/src/vs/workbench/api/common/extHostTextEditor.ts +++ b/src/vs/workbench/api/common/extHostTextEditor.ts @@ -11,7 +11,7 @@ import { IRange } from 'vs/editor/common/core/range'; import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, MainThreadTextEditorsShape } from 'vs/workbench/api/common/extHost.protocol'; import * as TypeConverters from 'vs/workbench/api/common/extHostTypeConverters'; -import { EndOfLine, getDebugDescriptionOfSelection, Position, Range, Selection, SnippetString, TextEditorLineNumbersStyle, TextEditorRevealType } from 'vs/workbench/api/common/extHostTypes'; +import { EndOfLine, Position, Range, Selection, SnippetString, TextEditorLineNumbersStyle, TextEditorRevealType } from 'vs/workbench/api/common/extHostTypes'; import type * as vscode from 'vscode'; import { ILogService } from 'vs/platform/log/common/log'; import { Lazy } from 'vs/base/common/lazy'; @@ -568,7 +568,7 @@ export class ExtHostTextEditor { _proxy.$tryHideEditor(id); }, [Symbol.for('debug.description')]() { - return `TextEditor(${this.document.uri.toString()}, ${this.selections.map(s => getDebugDescriptionOfSelection(s)).join(', ')})`; + return `TextEditor(${this.document.uri.toString()})`; } }); } From 3a63392646a996060ae7504526f19d17a2e0860c Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Fri, 5 Jul 2024 12:46:12 +0200 Subject: [PATCH 699/755] Updates more snapshots. --- .../__snapshots__/ChatService_can_deserialize.0.snap | 10 +--------- .../__snapshots__/ChatService_can_serialize.1.snap | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_deserialize.0.snap b/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_deserialize.0.snap index 383288306cb99..78fe7781692e7 100644 --- a/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_deserialize.0.snap +++ b/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_deserialize.0.snap @@ -77,15 +77,7 @@ usedContext: { documents: [ { - uri: { - scheme: "file", - authority: "", - path: "/test/path/to/file", - query: "", - fragment: "", - _formatted: null, - _fsPath: null - }, + uri: URI(file:///test/path/to/file), version: 3, ranges: [ { diff --git a/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_serialize.1.snap b/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_serialize.1.snap index cf9cc42dfc6a9..be8bb0fed9265 100644 --- a/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_serialize.1.snap +++ b/src/vs/workbench/contrib/chat/test/common/__snapshots__/ChatService_can_serialize.1.snap @@ -77,15 +77,7 @@ usedContext: { documents: [ { - uri: { - scheme: "file", - authority: "", - path: "/test/path/to/file", - query: "", - fragment: "", - _formatted: null, - _fsPath: null - }, + uri: URI(file:///test/path/to/file), version: 3, ranges: [ { From 630e53c18b4f082ba862ab8bc7eaace5005a7eab Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2024 13:21:02 +0200 Subject: [PATCH 700/755] add cjs-package.json marker to /test (#221076) --- test/package.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test/package.json diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000000000..a0df0c867783a --- /dev/null +++ b/test/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} From cf8fdae6911b2be31008162b6b08cf292e649563 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 13:21:05 +0200 Subject: [PATCH 701/755] SCM - update history graph hover (#221039) --- extensions/git/src/historyProvider.ts | 2 +- .../contrib/scm/browser/scmViewPane.ts | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts index 55115acb6d0e0..8bd8b70022d62 100644 --- a/extensions/git/src/historyProvider.ts +++ b/extensions/git/src/historyProvider.ts @@ -146,7 +146,7 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec } // Get the commits - const commits = await this.repository.log({ range: `${refsMergeBase}^..`, refNames }); + const commits = await this.repository.log({ range: `${refsMergeBase}^..`, refNames, shortStats: true }); await ensureEmojis(); diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 0273ba76ec530..495d576c58413 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -130,9 +130,9 @@ type TreeElement = type ShowChangesSetting = 'always' | 'never' | 'auto'; -registerColor('scm.historyItemAdditionsForeground', 'gitDecoration.addedResourceForeground', localize('scm.historyItemAdditionsForeground', "History item additions foreground color.")); +const historyItemAdditionsForeground = registerColor('scm.historyItemAdditionsForeground', 'gitDecoration.addedResourceForeground', localize('scm.historyItemAdditionsForeground', "History item additions foreground color.")); -registerColor('scm.historyItemDeletionsForeground', 'gitDecoration.deletedResourceForeground', localize('scm.historyItemDeletionsForeground', "History item deletions foreground color.")); +const historyItemDeletionsForeground = registerColor('scm.historyItemDeletionsForeground', 'gitDecoration.deletedResourceForeground', localize('scm.historyItemDeletionsForeground', "History item deletions foreground color.")); registerColor('scm.historyItemStatisticsBorder', transparent(foreground, 0.2), localize('scm.historyItemStatisticsBorder', "History item statistics border color.")); @@ -999,7 +999,8 @@ class HistoryItem2Renderer implements ICompressibleTreeRenderer${historyItem.statistics.files}`); + markdown.appendMarkdown(historyItem.statistics.insertions ? `, +${historyItem.statistics.insertions}` : ''); + markdown.appendMarkdown(historyItem.statistics.deletions ? `, -${historyItem.statistics.deletions}` : ''); + } return { markdown, markdownNotSupportedFallback: historyItem.message }; } From 2b9ebd6897fb57f2f3dc9dc04957288c50717190 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2024 15:04:25 +0200 Subject: [PATCH 702/755] Update less grammar (#221128) --- extensions/less/cgmanifest.json | 2 +- extensions/less/syntaxes/less.tmLanguage.json | 180 +++++++++++++++--- .../test-cssvariables_less.json | 30 ++- 3 files changed, 180 insertions(+), 32 deletions(-) diff --git a/extensions/less/cgmanifest.json b/extensions/less/cgmanifest.json index caf908bbcc05d..a8d1702aa82eb 100644 --- a/extensions/less/cgmanifest.json +++ b/extensions/less/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "language-less", "repositoryUrl": "https://github.com/radium-v/Better-Less", - "commitHash": "24047277622c245dbe9309f0004d0ccb8f02636f" + "commitHash": "b06a4555c711a6ef0d76cf2b4fc8b929a6ce551a" } }, "license": "MIT", diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json index 2acac68838544..cea782810fbe5 100644 --- a/extensions/less/syntaxes/less.tmLanguage.json +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/radium-v/Better-Less/commit/24047277622c245dbe9309f0004d0ccb8f02636f", + "version": "https://github.com/radium-v/Better-Less/commit/b06a4555c711a6ef0d76cf2b4fc8b929a6ce551a", "name": "Less", "scopeName": "source.css.less", "patterns": [ @@ -615,6 +615,9 @@ { "include": "#filter-function" }, + { + "include": "#fit-content-function" + }, { "include": "#format-function" }, @@ -738,6 +741,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#comma-delimiter" }, @@ -781,6 +787,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#comma-delimiter" }, @@ -813,6 +822,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "match": "\\b(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)\\b", "name": "support.constant.color.w3c-standard-color-name.less" @@ -902,6 +914,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "match": "(?:--(?:[[-\\w][^\\x{00}-\\x{7F}]]|(?:\\\\\\h{1,6}[\\s\\t\\n\\f]?|\\\\[^\\n\\f\\h]))+|-?(?:[[_a-zA-Z][^\\x{00}-\\x{7F}]]|(?:\\\\\\h{1,6}[\\s\\t\\n\\f]?|\\\\[^\\n\\f\\h]))(?:[[-\\w][^\\x{00}-\\x{7F}]]|(?:\\\\\\h{1,6}[\\s\\t\\n\\f]?|\\\\[^\\n\\f\\h]))*)", "name": "entity.other.counter-name.less" @@ -961,6 +976,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#literal-string" }, @@ -1053,6 +1071,9 @@ }, "end": "(?=\\))", "patterns": [ + { + "include": "#var-function" + }, { "include": "#comma-delimiter" }, @@ -1275,6 +1296,49 @@ } ] }, + "fit-content-function": { + "begin": "\\b(fit-content)(?=\\()", + "beginCaptures": { + "1": { + "name": "support.function.grid.less" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.group.end.less" + } + }, + "name": "meta.function-call.less", + "patterns": [ + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.group.begin.less" + } + }, + "end": "(?=\\))", + "patterns": [ + { + "include": "#less-variables" + }, + { + "include": "#var-function" + }, + { + "include": "#calc-function" + }, + { + "include": "#length-type" + }, + { + "include": "#percentage-type" + } + ] + } + ] + }, "format-function": { "patterns": [ { @@ -1348,6 +1412,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#angle-type" }, @@ -1402,6 +1469,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#color-values" }, @@ -1628,6 +1698,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#comma-delimiter" }, @@ -1704,6 +1777,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#color-values" } @@ -3360,6 +3436,9 @@ { "include": "#less-variables" }, + { + "include": "#var-function" + }, { "include": "#length-type" }, @@ -3421,7 +3500,22 @@ "property-value-constants": { "patterns": [ { - "match": "(?x)\\b(\n absolute|active|add\n |all(-(petite|small)-caps|-scroll)?\n |alpha(betic)?\n |alternate(-reverse)?\n |always|annotation|antialiased|at\n |auto(hiding-scrollbar)?\n |avoid(-column|-page|-region)?\n |background(-color|-image|-position|-size)?\n |backwards|balance|baseline|below|bevel|bicubic|bidi-override|blink\n |block(-line-height)?\n |blur\n |bold(er)?\n |border(-bottom|-left|-right|-top)?-(color|radius|width|style)\n |border-(bottom|top)-(left|right)-radius\n |border-image(-outset|-repeat|-slice|-source|-width)?\n |border(-bottom|-left|-right|-top|-collapse|-spacing|-box)?\n |both|bottom\n |box(-shadow)?\n |break-(all|word)\n |brightness\n |butt(on)?\n |capitalize\n |cent(er|ral)\n |char(acter-variant)?\n |cjk-ideographic|clip|clone|close-quote\n |closest-(corner|side)\n |col-resize|collapse\n |color(-stop|-burn|-dodge)?\n |column((-count|-gap|-reverse|-rule(-color|-width)?|-width)|s)?\n |common-ligatures|condensed|consider-shifts|contain\n |content(-box|s)?\n |contextual|contrast|cover\n |crisp(-e|E)dges\n |crop\n |cross(hair)?\n |da(rken|shed)\n |default|dense|diagonal-fractions|difference|disabled\n |discretionary-ligatures|disregard-shifts\n |distribute(-all-lines|-letter|-space)?\n |dotted|double|drop-shadow\n |(nwse|nesw|ns|ew|sw|se|nw|ne|w|s|e|n)-resize\n |ease(-in-out|-in|-out)?\n |element|ellipsis|embed|end|EndColorStr|evenodd\n |exclu(de(-ruby)?|sion)\n |expanded\n |(extra|semi|ultra)-(condensed|expanded)\n |farthest-(corner|side)?\n |fill(-box|-opacity)?\n |filter|fixed|flat\n |flex((-basis|-end|-grow|-shrink|-start)|box)?\n |flip|flood-color\n |font(-size(-adjust)?|-stretch|-weight)?\n |forwards\n |from(-image)?\n |full-width|geometricPrecision|glyphs|gradient|grayscale\n |grid(-height)?\n |groove|hand|hanging|hard-light|height|help|hidden|hide\n |historical-(forms|ligatures)\n |horizontal(-tb)?\n |hue\n |ideograph(-alpha|-numeric|-parenthesis|-space|ic)\n |inactive|include-ruby|infinite|inherit|initial\n |inline(-block|-box|-flex(box)?|-line-height|-table)?\n |inset|inside\n |inter(-ideograph|-word|sect)\n |invert|isolat(e|ion)|italic\n |jis(04|78|83|90)\n |justify(-all)?\n |keep-all\n |large[r]?\n |last|layout|left|letter-spacing\n |light(e[nr]|ing-color)\n |line(-edge|-height|-through)?\n |linear(-gradient|RGB)?\n |lining-nums|list-item|local|loose|lowercase|lr-tb|ltr\n |lumin(osity|ance)|manual\n |manipulation\n |margin(-bottom|-box|-left|-right|-top)?\n |marker(-offset|s)?\n |mathematical\n |max-(content|height|lines|size|width)\n |medium|middle\n |min-(content|height|width)\n |miter|mixed|move|multiply|newspaper\n |no-(change|clip|(close|open)-quote|(common|discretionary|historical)-ligatures|contextual|drop|repeat)\n |none|nonzero|normal|not-allowed|nowrap|oblique\n |offset(-after|-before|-end|-start)?\n |oldstyle-nums|opacity|open-quote\n |optimize(Legibility|Precision|Quality|Speed)\n |order|ordinal|ornaments\n |outline(-color|-offset|-width)?\n |outset|outside|over(line|-edge|lay)\n |padding(-bottom|-box|-left|-right|-top|-box)?\n |page|painted|paused\n |pan-(x|left|right|y|up|down)\n |perspective-origin\n |petite-caps|pixelated|pointer\n |pinch-zoom\n |pre(-line|-wrap)?\n |preserve-3d\n |progid:DXImageTransform.Microsoft.(Alpha|Blur|dropshadow|gradient|Shadow)\n |progress\n |proportional-(nums|width)\n |radial-gradient|recto|region|relative\n |repeat(-[xy])?\n |repeating-(linear|radial)-gradient\n |replaced|reset-size|reverse|ridge|right\n |round\n |row(-resize|-reverse)?\n |rtl|ruby|running|saturat(e|ion)|screen\n |scroll(-position|bar)?\n |separate|sepia\n |scale-down\n |shape-(image-threshold|margin|outside)\n |show\n |sideways(-lr|-rl)?\n |simplified\n |size\n |slashed-zero|slice\n |small(-caps|er)?\n |smooth|snap|solid|soft-light\n |space(-around|-between)?\n |span|sRGB\n |stack(ed-fractions)?\n |start(ColorStr)?\n |static\n |step-(end|start)\n |sticky\n |stop-(color|opacity)\n |stretch|strict\n |stroke(-box|-dash(array|offset)|-miterlimit|-opacity|-width)?\n |style(set)?\n |stylistic\n |sub(grid|pixel-antialiased|tract)?\n |super|swash\n |table(-caption|-cell|(-column|-footer|-header|-row)-group|-column|-row)?\n |tabular-nums|tb-rl\n |text((-bottom|-(decoration|emphasis)-color|-indent|-(over|under)-edge|-shadow|-size(-adjust)?|-top)|field)?\n |thi(ck|n)\n |titling-ca(ps|se)\n |to[p]?\n |touch|traditional\n |transform(-origin)?\n |under(-edge|line)?\n |unicase|unset|uppercase|upright\n |use-(glyph-orientation|script)\n |verso\n |vertical(-align|-ideographic|-lr|-rl|-text)?\n |view-box\n |viewport-fill(-opacity)?\n |visibility\n |visible(Fill|Painted|Stroke)?\n |wait|wavy|weight|whitespace|(device-)?width|word-spacing\n |wrap(-reverse)?\n |x{1,2}-(large|small)\n |z-index|zero\n |zoom(-in|-out)?\n |((?xi:arabic-indic|armenian|bengali|cambodian|circle|cjk-decimal|cjk-earthly-branch|cjk-heavenly-stem|decimal-leading-zero|decimal|devanagari|disclosure-closed|disclosure-open|disc|ethiopic-numeric|georgian|gujarati|gurmukhi|hebrew|hiragana-iroha|hiragana|japanese-formal|japanese-informal|kannada|katakana-iroha|katakana|khmer|korean-hangul-formal|korean-hanja-formal|korean-hanja-informal|lao|lower-alpha|lower-armenian|lower-greek|lower-latin|lower-roman|malayalam|mongolian|myanmar|oriya|persian|simp-chinese-formal|simp-chinese-informal|square|tamil|telugu|thai|tibetan|trad-chinese-formal|trad-chinese-informal|upper-alpha|upper-armenian|upper-latin|upper-roman)))\\b", + "comment": "align-content, align-items, align-self, justify-content, justify-items, justify-self", + "match": "(?x)\\b(?:\n flex-start|flex-end|start|end|space-between|space-around|space-evenly\n |stretch|baseline|safe|unsafe|legacy|anchor-center|first|last|self-start|self-end\n)\\b", + "name": "support.constant.property-value.less" + }, + { + "comment": "alignment-baseline", + "match": "(?x)\\b(?:\n text-before-edge|before-edge|middle|central|text-after-edge\n |after-edge|ideographic|alphabetic|hanging|mathematical|top|center|bottom\n)\\b", + "name": "support.constant.property-value.less" + }, + { + "comment": "all/global values", + "match": "\\b(?:initial|inherit|unset|revert-layer|revert)\\b", + "name": "support.constant.property-value.less" + }, + { + "match": "(?x)\\b(\n absolute|active|add\n|all(-(petite|small)-caps|-scroll)?\n|alpha(betic)?\n|alternate(-reverse)?\n|always|annotation|antialiased|at\n|auto(hiding-scrollbar)?\n|avoid(-column|-page|-region)?\n|background(-color|-image|-position|-size)?\n|backwards|balance|baseline|below|bevel|bicubic|bidi-override|blink\n|block(-(line-height|start|end))?\n|blur\n|bold(er)?\n|border(-bottom|-left|-right|-top)?-(color|radius|width|style)\n|border-(bottom|top)-(left|right)-radius\n|border-image(-outset|-repeat|-slice|-source|-width)?\n|border(-bottom|-left|-right|-top|-collapse|-spacing|-box)?\n|both|bottom\n|box(-shadow)?\n|break-(all|word|spaces)\n|brightness\n|butt(on)?\n|capitalize\n|cent(er|ral)\n|char(acter-variant)?\n|cjk-ideographic|clip|clone|close-quote\n|closest-(corner|side)\n|col-resize|collapse\n|color(-stop|-burn|-dodge)?\n|column((-count|-gap|-reverse|-rule(-color|-width)?|-width)|s)?\n|common-ligatures|condensed|consider-shifts|contain\n|content(-box|s)?\n|contextual|contrast|cover\n|crisp(-e|E)dges\n|crop\n|cross(hair)?\n|da(rken|shed)\n|default|dense|diagonal-fractions|difference|disabled\n|discard|discretionary-ligatures|disregard-shifts\n|distribute(-all-lines|-letter|-space)?\n|dotted|double|drop-shadow\n|(nwse|nesw|ns|ew|sw|se|nw|ne|w|s|e|n)-resize\n|ease(-in-out|-in|-out)?\n|element|ellipsis|embed|end|EndColorStr|evenodd\n|exclu(de(-ruby)?|sion)\n|expanded\n|(extra|semi|ultra)-(condensed|expanded)\n|farthest-(corner|side)?\n|fill(-box|-opacity)?\n|filter\n|fit-content\n|fixed\n|flat\n|flex((-basis|-end|-grow|-shrink|-start)|box)?\n|flip|flood-color\n|font(-size(-adjust)?|-stretch|-weight)?\n|forwards\n|from(-image)?\n|full-width|gap|geometricPrecision|glyphs|gradient|grayscale\n|grid((-column|-row)?-gap|-height)?\n|groove|hand|hanging|hard-light|height|help|hidden|hide\n|historical-(forms|ligatures)\n|horizontal(-tb)?\n|hue\n|ideograph(-alpha|-numeric|-parenthesis|-space|ic)\n|inactive|include-ruby|infinite|inherit|initial\n|inline(-(block|box|flex(box)?|line-height|table|start|end))?\n|inset|inside\n|inter(-ideograph|-word|sect)\n|invert|isolat(e|ion)|italic\n|jis(04|78|83|90)\n|justify(-all)?\n|keep-all\n|large[r]?\n|last|layout|left|letter-spacing\n|light(e[nr]|ing-color)\n|line(-edge|-height|-through)?\n|linear(-gradient|RGB)?\n|lining-nums|list-item|local|loose|lowercase|lr-tb|ltr\n|lumin(osity|ance)|manual\n|manipulation\n|margin(-bottom|-box|-left|-right|-top)?\n|marker(-offset|s)?\n|match-parent\n|mathematical\n|max-(content|height|lines|size|width)\n|medium|middle\n|min-(content|height|width)\n|miter|mixed|move|multiply|newspaper\n|no-(change|clip|(close|open)-quote|(common|discretionary|historical)-ligatures|contextual|drop|repeat)\n|none|nonzero|normal|not-allowed|nowrap|oblique\n|offset(-after|-before|-end|-start)?\n|oldstyle-nums|opacity|open-quote\n|optimize(Legibility|Precision|Quality|Speed)\n|order|ordinal|ornaments\n|outline(-color|-offset|-width)?\n|outset|outside|over(line|-edge|lay)\n|padding(-bottom|-box|-left|-right|-top|-box)?\n|page|paint(ed)?|paused\n|pan-(x|left|right|y|up|down)\n|perspective-origin\n|petite-caps|pixelated|pointer\n|pinch-zoom\n|pretty\n|pre(-line|-wrap)?\n|preserve(-3d|-breaks|-spaces)?\n|progid:DXImageTransform.Microsoft.(Alpha|Blur|dropshadow|gradient|Shadow)\n|progress\n|proportional-(nums|width)\n|radial-gradient|recto|region|relative\n|repeat(-[xy])?\n|repeating-(linear|radial)-gradient\n|replaced|reset-size|reverse|revert(-layer)?|ridge|right\n|round\n|row(-gap|-resize|-reverse)?\n|rtl|ruby|running|saturat(e|ion)|screen\n|scroll(-position|bar)?\n|separate|sepia\n|scale-down\n|shape-(image-threshold|margin|outside)\n|show\n|sideways(-lr|-rl)?\n|simplified\n|size\n|slashed-zero|slice\n|small(-caps|er)?\n|smooth|snap|solid|soft-light\n|space(-around|-between)?\n|span|sRGB\n|stable\n|stack(ed-fractions)?\n|start(ColorStr)?\n|static\n|step-(end|start)\n|sticky\n|stop-(color|opacity)\n|stretch|strict\n|stroke(-box|-dash(array|offset)|-miterlimit|-opacity|-width)?\n|style(set)?\n|stylistic\n|sub(grid|pixel-antialiased|tract)?\n|super|swash\n|table(-caption|-cell|(-column|-footer|-header|-row)-group|-column|-row)?\n|tabular-nums|tb-rl\n|text((-bottom|-(decoration|emphasis)-color|-indent|-(over|under)-edge|-shadow|-size(-adjust)?|-top)|field)?\n|thi(ck|n)\n|titling-ca(ps|se)\n|to[p]?\n|touch|traditional\n|transform(-origin)?\n|under(-edge|line)?\n|unicase|unset|uppercase|upright\n|use-(glyph-orientation|script)\n|verso\n|vertical(-align|-ideographic|-lr|-rl|-text)?\n|view-box\n|viewport-fill(-opacity)?\n|visibility\n|visible(Fill|Painted|Stroke)?\n|wait|wavy|weight|whitespace|(device-)?width|word-spacing\n|wrap(-reverse)?\n|x{1,2}-(large|small)\n|z-index|zero\n|zoom(-in|-out)?\n|((?xi:arabic-indic|armenian|bengali|cambodian|circle|cjk-decimal|cjk-earthly-branch|cjk-heavenly-stem|decimal-leading-zero|decimal|devanagari|disclosure-closed|disclosure-open|disc|ethiopic-numeric|georgian|gujarati|gurmukhi|hebrew|hiragana-iroha|hiragana|japanese-formal|japanese-informal|kannada|katakana-iroha|katakana|khmer|korean-hangul-formal|korean-hanja-formal|korean-hanja-informal|lao|lower-alpha|lower-armenian|lower-greek|lower-latin|lower-roman|malayalam|mongolian|myanmar|oriya|persian|simp-chinese-formal|simp-chinese-informal|square|tamil|telugu|thai|tibetan|trad-chinese-formal|trad-chinese-informal|upper-alpha|upper-armenian|upper-latin|upper-roman)))\\b", "name": "support.constant.property-value.less" }, { @@ -3444,9 +3538,6 @@ { "include": "#color-functions" }, - { - "include": "#less-math" - }, { "include": "#less-functions" }, @@ -3465,9 +3556,15 @@ { "include": "#property-value-constants" }, + { + "include": "#less-math" + }, { "include": "#literal-string" }, + { + "include": "#comma-delimiter" + }, { "captures": { "1": { @@ -3909,6 +4006,11 @@ "include": "#property-values" }, { + "captures": { + "1": { + "name": "punctuation.definition.arbitrary-repetition.less" + } + }, "match": "\\s*(?:(,))" } ] @@ -3918,9 +4020,6 @@ { "begin": "\\b(transition(-(property|duration|delay|timing-function))?)\\b", "beginCaptures": { - "0": { - "name": "meta.property-name.less" - }, "1": { "name": "support.type.property-name.less" } @@ -3933,35 +4032,41 @@ }, "patterns": [ { - "captures": { + "begin": "(((\\+_?)?):)(?=[\\s\\t]*)", + "beginCaptures": { "1": { "name": "punctuation.separator.key-value.less" - }, - "4": { - "name": "meta.property-value.less" } }, - "match": "(((\\+_?)?):)([\\s\\t]*)" - }, - { - "include": "#time-type" - }, - { - "include": "#property-values" - }, - { - "include": "#cubic-bezier-function" - }, - { - "include": "#steps-function" - }, - { "captures": { "1": { "name": "punctuation.definition.arbitrary-repetition.less" } }, - "match": "\\s*(?:(,))" + "contentName": "meta.property-value.less", + "end": "(?=\\s*(;)|(?=[})]))", + "patterns": [ + { + "include": "#time-type" + }, + { + "include": "#property-values" + }, + { + "include": "#cubic-bezier-function" + }, + { + "include": "#steps-function" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.arbitrary-repetition.less" + } + }, + "match": "\\s*(?:(,))" + } + ] } ] }, @@ -4084,7 +4189,11 @@ ] }, { - "match": "(?x)\\b( accent-height | align-content | align-items | align-self | alignment-baseline | all | animation-timing-function | animation-play-state | animation-name | animation-iteration-count | animation-fill-mode | animation-duration | animation-direction | animation-delay | animation | appearance | ascent | azimuth | backface-visibility | background-size | background-repeat-y | background-repeat-x | background-repeat | background-position-y | background-position-x | background-position | background-origin | background-image | background-color | background-clip | background-blend-mode | background-attachment | background | baseline-shift | begin | bias | blend-mode | border-((top|right|bottom|left)-)?(width|style|color) | border-(top|bottom)-(right|left)-radius | border-image-(width|source|slice|repeat|outset) | border-(top|right|bottom|left|collapse|image|radius|spacing) | border | bottom | box-(align|decoration-break|direction|flex|ordinal-group|orient|pack|shadow|sizing) | break-(after|before|inside) | caption-side | clear | clip-path | clip-rule | clip | color(-(interpolation(-filters)?|profile|rendering))? | columns | column-(break-before|count|fill|gap|(rule(-(color|style|width))?)|span|width) | contain | content | counter-(increment|reset) | cursor | (c|d|f)(x|y) | direction | display | divisor | dominant-baseline | dur | elevation | empty-cells | enable-background | end | fallback | fill(-(opacity|rule))? | filter | flex(-(align|basis|direction|flow|grow|item-align|line-pack|negative|order|pack|positive|preferred-size|shrink|wrap))? | float | flood-(color|opacity) | font-display | font-family | font-feature-settings | font-kerning | font-language-override | font-size(-adjust)? | font-smoothing | font-stretch | font-style | font-synthesis | font-variant(-(alternates|caps|east-asian|ligatures|numeric|position))? | font-weight | font | fr | glyph-orientation-(horizontal|vertical) | grid-(area|gap) | grid-auto-(columns|flow|rows) | grid-(column|row)(-(end|gap|start))? | grid-template(-(areas|columns|rows))? | height | hyphens | image-(orientation|rendering|resolution) | isolation | justify-content | kerning | left | letter-spacing | lighting-color | line-(box-contain|break|clamp|height) | list-style(-(image|position|type))? | margin(-(bottom|left|right|top))? | marker(-(end|mid|start))? | mask(-(clip||composite|image|origin|position|repeat|size|type))? | (max|min)-(height|width) | mix-blend-mode | nbsp-mode | negative | object-(fit|position) | opacity | operator | order | orphans | outline(-(color|offset|style|width))? | overflow(-(scrolling|wrap|x|y))? | pad(ding(-(bottom|left|right|top))?)? | page(-break-(after|before|inside))? | paint-order | pause(-(after|before))? | perspective(-origin(-(x|y))?)? | pitch(-range)? | pointer-events | position | prefix | quotes | range | resize | right | rotate | scale | scroll-behavior | shape-(image-threshold|margin|outside|rendering) | size | speak(-as)? | src | stop-(color|opacity) | stroke(-(dash(array|offset)|line(cap|join)|miterlimit|opacity|width))? | suffix | symbols | system | tab-size | table-layout | tap-highlight-color | text-align(-last)? | text-decoration(-(color|line|style))? | text-emphasis(-(color|position|style))? | text-(anchor|fill-color|height|indent|justify|orientation|overflow|rendering|shadow|transform|underline-position) | top | touch-action | transform(-origin(-(x|y))?) | transform(-style)? | transition(-(delay|duration|property|timing-function))? | translate | unicode-(bidi|range) | user-(drag|select) | vertical-align | visibility | white-space | widows | width | will-change | word-(break|spacing|wrap) | writing-mode | z-index | zoom )\\b", + "match": "(?x)\\b( accent-height | align-content | align-items | align-self | alignment-baseline | all | animation-timing-function | animation-play-state | animation-name | animation-iteration-count | animation-fill-mode | animation-duration | animation-direction | animation-delay | animation | appearance | ascent | azimuth | backface-visibility | background-size | background-repeat-y | background-repeat-x | background-repeat | background-position-y | background-position-x | background-position | background-origin | background-image | background-color | background-clip | background-blend-mode | background-attachment | background | baseline-shift | begin | bias | blend-mode | border-((top|right|bottom|left|((block|inline)(-(start|end))?))-)?(width|style|color) | border-((top|bottom)-(right|left)|((start|end)-?){1,2})-radius | border-image-(width|source|slice|repeat|outset) | border-(top|right|bottom|left|collapse|image|radius|spacing|((block|inline)(-(start|end))?)) | border | bottom | box-(align|decoration-break|direction|flex|ordinal-group|orient|pack|shadow|sizing) | break-(after|before|inside) | caption-side | clear | clip-path | clip-rule | clip | color(-(interpolation(-filters)?|profile|rendering))? | columns | column-(break-before|count|fill|gap|(rule(-(color|style|width))?)|span|width) | contain(-intrinsic-((((block|inline)-)?size)|height|width))? | content | counter-(increment|reset) | cursor | (c|d|f)(x|y) | direction | display | divisor | dominant-baseline | dur | elevation | empty-cells | enable-background | end | fallback | fill(-(opacity|rule))? | filter | flex(-(align|basis|direction|flow|grow|item-align|line-pack|negative|order|pack|positive|preferred-size|shrink|wrap))? | float | flood-(color|opacity) | font-display | font-family | font-feature-settings | font-kerning | font-language-override | font-size(-adjust)? | font-smoothing | font-stretch | font-style | font-synthesis | font-variant(-(alternates|caps|east-asian|ligatures|numeric|position))? | font-weight | font | fr | ((column|row)-)?gap | glyph-orientation-(horizontal|vertical) | grid-(area|gap) | grid-auto-(columns|flow|rows) | grid-(column|row)(-(end|gap|start))? | grid-template(-(areas|columns|rows))? | height | hyphens | image-(orientation|rendering|resolution) | inset(-(block|inline))?(-(start|end))? | isolation | justify-content | justify-items | justify-self | kerning | left | letter-spacing | lighting-color | line-(box-contain|break|clamp|height) | list-style(-(image|position|type))? | (margin|padding)(-(bottom|left|right|top)|(-(block|inline)?(-(end|start))?))? | marker(-(end|mid|start))? | mask(-(clip||composite|image|origin|position|repeat|size|type))? | (max|min)-(height|width) | mix-blend-mode | nbsp-mode | negative | object-(fit|position) | opacity | operator | order | orphans | outline(-(color|offset|style|width))? | overflow(-((inline|block)|scrolling|wrap|x|y))? | overscroll-behavior(-block|-(inline|x|y))? | pad(ding(-(bottom|left|right|top))?)? | page(-break-(after|before|inside))? | paint-order | pause(-(after|before))? | perspective(-origin(-(x|y))?)? | pitch(-range)? | place-content | place-self | pointer-events | position | prefix | quotes | range | resize | right | rotate | scale | scroll-behavior | shape-(image-threshold|margin|outside|rendering) | size | speak(-as)? | src | stop-(color|opacity) | stroke(-(dash(array|offset)|line(cap|join)|miterlimit|opacity|width))? | suffix | symbols | system | tab-size | table-layout | tap-highlight-color | text-align(-last)? | text-decoration(-(color|line|style))? | text-emphasis(-(color|position|style))? | text-(anchor|fill-color|height|indent|justify|orientation|overflow|rendering|size-adjust|shadow|transform|underline-position|wrap) | top | touch-action | transform(-origin(-(x|y))?) | transform(-style)? | transition(-(delay|duration|property|timing-function))? | translate | unicode-(bidi|range) | user-(drag|select) | vertical-align | visibility | white-space(-collapse)? | widows | width | will-change | word-(break|spacing|wrap) | writing-mode | z-index | zoom )\\b", + "name": "support.type.property-name.less" + }, + { + "match": "(?x)\\b(((contain-intrinsic|max|min)-)?(block|inline)?-size)\\b", "name": "support.type.property-name.less" }, { @@ -4093,7 +4202,15 @@ ] }, { - "begin": "\\b(((\\+_?)?):)([\\s\\t]*)", + "begin": "\\b((?:(?:\\+_?)?):)([\\s\\t]*)", + "beginCaptures": { + "1": { + "name": "punctuation.separator.key-value.less" + }, + "2": { + "name": "meta.property-value.less" + } + }, "captures": { "1": { "name": "punctuation.separator.key-value.less" @@ -5002,6 +5119,9 @@ }, { "include": "#less-variables" + }, + { + "include": "#property-values" } ] } diff --git a/extensions/vscode-colorize-tests/test/colorize-results/test-cssvariables_less.json b/extensions/vscode-colorize-tests/test/colorize-results/test-cssvariables_less.json index 856f013541b08..3381f6448d068 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/test-cssvariables_less.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/test-cssvariables_less.json @@ -686,7 +686,7 @@ } }, { - "c": " 5px", + "c": " ", "t": "source.css.less meta.property-list.less meta.property-value.less meta.function-call.less meta.function-call.less", "r": { "dark_plus": "default: #D4D4D4", @@ -699,6 +699,34 @@ "light_modern": "default: #3B3B3B" } }, + { + "c": "5", + "t": "source.css.less meta.property-list.less meta.property-value.less meta.function-call.less meta.function-call.less constant.numeric.less", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #098658", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #098658", + "hc_black": "constant.numeric: #B5CEA8", + "dark_modern": "constant.numeric: #B5CEA8", + "hc_light": "constant.numeric: #096D48", + "light_modern": "constant.numeric: #098658" + } + }, + { + "c": "px", + "t": "source.css.less meta.property-list.less meta.property-value.less meta.function-call.less meta.function-call.less constant.numeric.less keyword.other.unit.less", + "r": { + "dark_plus": "keyword.other.unit: #B5CEA8", + "light_plus": "keyword.other.unit: #098658", + "dark_vs": "keyword.other.unit: #B5CEA8", + "light_vs": "keyword.other.unit: #098658", + "hc_black": "keyword.other.unit: #B5CEA8", + "dark_modern": "keyword.other.unit: #B5CEA8", + "hc_light": "keyword.other.unit: #096D48", + "light_modern": "keyword.other.unit: #098658" + } + }, { "c": ")", "t": "source.css.less meta.property-list.less meta.property-value.less meta.function-call.less meta.function-call.less punctuation.definition.group.end.less", From 74654d15221d06d47f279929740ed195ff66774d Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Mon, 8 Jul 2024 15:33:11 +0200 Subject: [PATCH 703/755] Fix close pin editor bug (#221131) fix close pin editor bug --- src/vs/workbench/browser/parts/editor/editorCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index ce629242565e2..05f7378ffc726 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -745,12 +745,12 @@ function registerCloseEditorCommands() { primary: KeyMod.CtrlCmd | KeyCode.KeyW, win: { primary: KeyMod.CtrlCmd | KeyCode.F4, secondary: [KeyMod.CtrlCmd | KeyCode.KeyW] }, handler: (accessor, ...args: unknown[]) => { - return closeEditorHandler(accessor, false, args); + return closeEditorHandler(accessor, false, ...args); } }); CommandsRegistry.registerCommand(CLOSE_PINNED_EDITOR_COMMAND_ID, (accessor, ...args: unknown[]) => { - return closeEditorHandler(accessor, true /* force close pinned editors */, args); + return closeEditorHandler(accessor, true /* force close pinned editors */, ...args); }); KeybindingsRegistry.registerCommandAndKeybindingRule({ From 3891d3c0dadd681d3b1b033f2bc10f2da534b6e0 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Mon, 8 Jul 2024 15:44:31 +0200 Subject: [PATCH 704/755] Fix lock group args (#221134) lock group args fix --- src/vs/workbench/browser/parts/editor/editorCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index 05f7378ffc726..7f137ca5244c1 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -1237,7 +1237,7 @@ function registerOtherEditorCommands(): void { }); } async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { - setEditorGroupLock(accessor, true, args); + setEditorGroupLock(accessor, true, ...args); } }); @@ -1252,7 +1252,7 @@ function registerOtherEditorCommands(): void { }); } async run(accessor: ServicesAccessor, ...args: unknown[]): Promise { - setEditorGroupLock(accessor, false, args); + setEditorGroupLock(accessor, false, ...args); } }); From e7cff5299bc9c3a37185bade266f2a47c07cc8f5 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:27:23 +0200 Subject: [PATCH 705/755] SCM - history item hover improvements (#221138) --- .../contrib/scm/browser/scmViewPane.ts | 59 +++++++++++++++---- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 495d576c58413..b5430060c3200 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -37,7 +37,7 @@ import { URI } from 'vs/base/common/uri'; import { FileKind } from 'vs/platform/files/common/files'; import { compareFileNames, comparePaths } from 'vs/base/common/comparers'; import { FuzzyScore, createMatches, IMatch } from 'vs/base/common/filters'; -import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { localize } from 'vs/nls'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; @@ -102,15 +102,18 @@ import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/d import { clamp, rot } from 'vs/base/common/numbers'; import { ILogService } from 'vs/platform/log/common/log'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import type { IManagedHover, IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; -import { IHoverService } from 'vs/platform/hover/browser/hover'; +import type { IHoverOptions, IManagedHover, IManagedHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; +import { IHoverService, WorkbenchHoverDelegate } from 'vs/platform/hover/browser/hover'; import { OpenScmGroupAction } from 'vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver'; import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; import { ITextModel } from 'vs/editor/common/model'; import { autorun } from 'vs/base/common/observable'; -import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; +import { createInstantHoverDelegate, getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory'; import { renderSCMHistoryItemGraph, toISCMHistoryItemViewModelArray } from 'vs/workbench/contrib/scm/browser/scmHistory'; import { PlaceholderTextContribution } from 'vs/editor/contrib/placeholderText/browser/placeholderTextContribution'; +import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; +import { IHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegate'; +import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; // type SCMResourceTreeNode = IResourceNode; // type SCMHistoryItemChangeResourceTreeNode = IResourceNode; @@ -840,6 +843,31 @@ class HistoryItemActionRunner extends ActionRunner { } } +class HistoryItemHoverDelegate extends WorkbenchHoverDelegate { + constructor( + private readonly viewContainerLocation: ViewContainerLocation | null, + private readonly sideBarPosition: Position, + @IConfigurationService configurationService: IConfigurationService, + @IHoverService hoverService: IHoverService + + ) { + super('element', true, () => this.getHoverOptions(), configurationService, hoverService); + } + + private getHoverOptions(): Partial { + let hoverPosition: HoverPosition; + if (this.viewContainerLocation === ViewContainerLocation.Sidebar) { + hoverPosition = this.sideBarPosition === Position.LEFT ? HoverPosition.RIGHT : HoverPosition.LEFT; + } else if (this.viewContainerLocation === ViewContainerLocation.AuxiliaryBar) { + hoverPosition = this.sideBarPosition === Position.LEFT ? HoverPosition.LEFT : HoverPosition.RIGHT; + } else { + hoverPosition = HoverPosition.RIGHT; + } + + return { position: { hoverPosition, forcePosition: true } }; + } +} + interface HistoryItemTemplate { readonly iconContainer: HTMLElement; readonly label: IconLabel; @@ -986,6 +1014,7 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer, index: number, templateData: HistoryItem2Template, height: number | undefined): void { const historyItemViewModel = node.element.historyItemViewModel; const historyItem = historyItemViewModel.historyItem; + const historyItemHover = this.hoverService.setupManagedHover(this.hoverDelegate, templateData.element, this.getTooltip(historyItemViewModel)); + templateData.elementDisposables.add(historyItemHover); + templateData.graphContainer.textContent = ''; templateData.graphContainer.appendChild(renderSCMHistoryItemGraph(historyItemViewModel)); - const title = this.getTooltip(historyItemViewModel); const [matches, descriptionMatches] = this.processMatches(historyItemViewModel, node.filterData); - templateData.label.setLabel(historyItem.message, undefined, { title, matches, descriptionMatches }); + templateData.label.setLabel(historyItem.message, historyItem.author, { matches, descriptionMatches }); templateData.labelContainer.textContent = ''; if (historyItem.labels) { + const instantHoverDelegate = createInstantHoverDelegate(); + templateData.elementDisposables.add(instantHoverDelegate); + for (const label of historyItem.labels) { if (label.icon && ThemeIcon.isThemeIcon(label.icon)) { const icon = append(templateData.labelContainer, $('div.label')); icon.classList.add(...ThemeIcon.asClassNameArray(label.icon)); - templateData.elementDisposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), icon, label.title)); + const hover = this.hoverService.setupManagedHover(instantHoverDelegate, icon, label.title); + templateData.elementDisposables.add(hover); } } } @@ -2878,6 +2913,7 @@ export class SCMViewPane extends ViewPane { @ISCMViewService private readonly scmViewService: ISCMViewService, @IStorageService private readonly storageService: IStorageService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IKeybindingService keybindingService: IKeybindingService, @IThemeService themeService: IThemeService, @IContextMenuService contextMenuService: IContextMenuService, @@ -3056,6 +3092,9 @@ export class SCMViewPane extends ViewPane { historyItemActionRunner.onWillRun(() => this.tree.domFocus(), this, this.disposables); this.disposables.add(historyItemActionRunner); + const historyItemHoverDelegate = this.instantiationService.createInstance(HistoryItemHoverDelegate, this.viewDescriptorService.getViewLocationById(this.id), this.layoutService.getSideBarPosition()); + this.disposables.add(historyItemHoverDelegate); + const treeDataSource = this.instantiationService.createInstance(SCMTreeDataSource, () => this.viewMode); this.disposables.add(treeDataSource); @@ -3073,7 +3112,7 @@ export class SCMViewPane extends ViewPane { this.instantiationService.createInstance(ResourceRenderer, () => this.viewMode, this.listLabels, getActionViewItemProvider(this.instantiationService), resourceActionRunner), this.instantiationService.createInstance(HistoryItemGroupRenderer, historyItemGroupActionRunner), this.instantiationService.createInstance(HistoryItemRenderer, historyItemActionRunner, getActionViewItemProvider(this.instantiationService)), - this.instantiationService.createInstance(HistoryItem2Renderer), + this.instantiationService.createInstance(HistoryItem2Renderer, historyItemHoverDelegate), this.instantiationService.createInstance(HistoryItemChangeRenderer, () => this.viewMode, this.listLabels), this.instantiationService.createInstance(SeparatorRenderer) ], From a0d7124f0c41ded7ed94cd85775a3c3e6d7ced82 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2024 16:34:03 +0200 Subject: [PATCH 706/755] leaks - dispose storage listener (#221141) --- .../workbench/contrib/searchEditor/browser/searchEditorInput.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts index 2085c52e04106..68b40814a2084 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts @@ -128,7 +128,7 @@ export class SearchEditorInput extends EditorInput { } this.memento = new Memento(SearchEditorInput.ID, storageService); - storageService.onWillSaveState(() => this.memento.saveMemento()); + this._register(storageService.onWillSaveState(() => this.memento.saveMemento())); const input = this; const workingCopyAdapter = new class implements IWorkingCopy { From 125c83df26846aeef53989bc2c61e7ccfc974195 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 8 Jul 2024 16:39:26 +0200 Subject: [PATCH 707/755] Test basic auth for proxy (#220034) --- extensions/vscode-api-tests/package.json | 10 +- .../src/singlefolder-tests/proxy.test.ts | 78 ++++++++++- extensions/vscode-api-tests/yarn.lock | 126 ++++++++++++++++++ src/vs/platform/native/electron-main/auth.ts | 24 ++++ .../electron-main/nativeHostMainService.ts | 6 + 5 files changed, 241 insertions(+), 3 deletions(-) diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index 7e8b96839f446..61828a784fbc8 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -112,6 +112,13 @@ "farboo.get": { "type": "string", "default": "get-prop" + }, + "integration-test.http.proxy": { + "type": "string" + }, + "integration-test.http.proxyAuth": { + "type": "string", + "default": "get-prop" } } }, @@ -251,7 +258,8 @@ "@types/mocha": "^9.1.1", "@types/node": "20.x", "@types/node-forge": "^1.3.11", - "node-forge": "^1.3.1" + "node-forge": "^1.3.1", + "straightforward": "^4.2.2" }, "repository": { "type": "git", diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts index 60f100c7c1f11..ccda85b442a1d 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/proxy.test.ts @@ -5,12 +5,14 @@ import * as https from 'https'; import 'mocha'; -import { assertNoRpc } from '../utils'; +import { assertNoRpc, delay } from '../utils'; import { pki } from 'node-forge'; import { AddressInfo } from 'net'; import { resetCaches } from '@vscode/proxy-agent'; +import * as vscode from 'vscode'; +import { middleware, Straightforward } from 'straightforward'; -suite('vscode API - network proxy support', () => { +(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite)('vscode API - network proxy support', () => { teardown(async function () { assertNoRpc(); @@ -74,4 +76,76 @@ suite('vscode API - network proxy support', () => { server.close(); } }); + + test('basic auth', async () => { + const url = 'https://example.com'; // Need to use non-local URL because local URLs are excepted from proxying. + const user = 'testuser'; + const pass = 'testpassword'; + + const sf = new Straightforward(); + let authEnabled = false; + const auth = middleware.auth({ user, pass }); + sf.onConnect.use(async (context, next) => { + if (authEnabled) { + return auth(context, next); + } + next(); + }); + sf.onConnect.use(({ clientSocket }) => { + // Shortcircuit the request. + if (authEnabled) { + clientSocket.end('HTTP/1.1 204\r\n\r\n'); + } else { + clientSocket.end('HTTP/1.1 418\r\n\r\n'); + } + }); + const proxyListen = sf.listen(0); + + try { + await proxyListen; + const proxyPort = (sf.server.address() as AddressInfo).port; + + await vscode.workspace.getConfiguration().update('integration-test.http.proxy', `PROXY 127.0.0.1:${proxyPort}`, vscode.ConfigurationTarget.Global); + await delay(1000); // Wait for the configuration change to propagate. + await new Promise((resolve, reject) => { + https.get(url, res => { + if (res.statusCode === 418) { + resolve(); + } else { + reject(new Error(`Unexpected status code (expected 418): ${res.statusCode}`)); + } + }) + .on('error', reject); + }); + + authEnabled = true; + await new Promise((resolve, reject) => { + https.get(url, res => { + if (res.statusCode === 407) { + resolve(); + } else { + reject(new Error(`Unexpected status code (expected 407): ${res.statusCode}`)); + } + }) + .on('error', reject); + }); + + await vscode.workspace.getConfiguration().update('integration-test.http.proxyAuth', `${user}:${pass}`, vscode.ConfigurationTarget.Global); + await delay(1000); // Wait for the configuration change to propagate. + await new Promise((resolve, reject) => { + https.get(url, res => { + if (res.statusCode === 204) { + resolve(); + } else { + reject(new Error(`Unexpected status code (expected 204): ${res.statusCode}`)); + } + }) + .on('error', reject); + }); + } finally { + sf.close(); + await vscode.workspace.getConfiguration().update('integration-test.http.proxy', undefined, vscode.ConfigurationTarget.Global); + await vscode.workspace.getConfiguration().update('integration-test.http.proxyAuth', undefined, vscode.ConfigurationTarget.Global); + } + }); }); diff --git a/extensions/vscode-api-tests/yarn.lock b/extensions/vscode-api-tests/yarn.lock index 33a2f5119276c..9999a40aa144d 100644 --- a/extensions/vscode-api-tests/yarn.lock +++ b/extensions/vscode-api-tests/yarn.lock @@ -28,12 +28,138 @@ dependencies: undici-types "~5.26.4" +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +straightforward@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/straightforward/-/straightforward-4.2.2.tgz#a7d99b313dec5c04b0c637c7b8684dd44dc9167c" + integrity sha512-MxfuNnyTP4RPjadI3DkYIcNIp0DMXeDmAXY4/6QivU8lLIPGUqaS5VsEkaQ2QC+FICzc7QTb/lJPRIhGRKVuMA== + dependencies: + debug "^4.3.4" + yargs "^17.6.2" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" diff --git a/src/vs/platform/native/electron-main/auth.ts b/src/vs/platform/native/electron-main/auth.ts index da7e0ea26ccb5..15918242bba79 100644 --- a/src/vs/platform/native/electron-main/auth.ts +++ b/src/vs/platform/native/electron-main/auth.ts @@ -12,6 +12,7 @@ import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEncryptionMainService } from 'vs/platform/encryption/common/encryptionService'; +import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { AuthInfo, Credentials } from 'vs/platform/request/common/request'; @@ -54,6 +55,7 @@ export class ProxyAuthService extends Disposable implements IProxyAuthService { @IEncryptionMainService private readonly encryptionMainService: IEncryptionMainService, @IApplicationStorageMainService private readonly applicationStorageMainService: IApplicationStorageMainService, @IConfigurationService private readonly configurationService: IConfigurationService, + @IEnvironmentMainService private readonly environmentMainService: IEnvironmentMainService, ) { super(); @@ -135,6 +137,26 @@ export class ProxyAuthService extends Disposable implements IProxyAuthService { private async doResolveProxyCredentials(authInfo: AuthInfo, authInfoHash: string): Promise { this.logService.trace('auth#doResolveProxyCredentials - enter', authInfo); + // For testing. + if (this.environmentMainService.extensionTestsLocationURI) { + const credentials = this.configurationService.getValue('integration-test.http.proxyAuth'); + if (credentials) { + const j = credentials.indexOf(':'); + if (j !== -1) { + return { + username: credentials.substring(0, j), + password: credentials.substring(j + 1) + }; + } else { + return { + username: credentials, + password: '' + }; + } + } + return undefined; + } + // Reply with manually supplied credentials. Fail if they are wrong. const newHttpProxy = (this.configurationService.getValue('http.proxy') || '').trim() || (process.env['https_proxy'] || process.env['HTTPS_PROXY'] || process.env['http_proxy'] || process.env['HTTP_PROXY'] || '').trim() @@ -145,8 +167,10 @@ export class ProxyAuthService extends Disposable implements IProxyAuthService { const i = uri.authority.indexOf('@'); if (i !== -1) { if (authInfo.attempt > 1) { + this.logService.trace('auth#doResolveProxyCredentials (proxy) - exit - ignoring previously used config/envvar credentials'); return undefined; // We tried already, let the user handle it. } + this.logService.trace('auth#doResolveProxyCredentials (proxy) - exit - found config/envvar credentials to use'); const credentials = uri.authority.substring(0, i); const j = credentials.indexOf(':'); if (j !== -1) { diff --git a/src/vs/platform/native/electron-main/nativeHostMainService.ts b/src/vs/platform/native/electron-main/nativeHostMainService.ts index 3b49b725dd978..e3013c06f8ca5 100644 --- a/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -808,6 +808,12 @@ export class NativeHostMainService extends Disposable implements INativeHostMain //#region Connectivity async resolveProxy(windowId: number | undefined, url: string): Promise { + if (this.environmentMainService.extensionTestsLocationURI) { + const testProxy = this.configurationService.getValue('integration-test.http.proxy'); + if (testProxy) { + return testProxy; + } + } const window = this.codeWindowById(windowId); const session = window?.win?.webContents?.session; From b7c13a78e93c2762972be705c032fe8295a87ddb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Jul 2024 16:42:25 +0200 Subject: [PATCH 708/755] Today's Insiders update failed (Windows) (#220999) (#221132) --- build/lib/inlineMeta.js | 22 ++++++++++++---------- build/lib/inlineMeta.ts | 22 +++++++++++++--------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/build/lib/inlineMeta.js b/build/lib/inlineMeta.js index adcbfa9587e5c..f1dbfa83a7e1c 100644 --- a/build/lib/inlineMeta.js +++ b/build/lib/inlineMeta.js @@ -8,7 +8,13 @@ exports.inlineMeta = inlineMeta; const es = require("event-stream"); const path_1 = require("path"); const packageJsonMarkerId = 'BUILD_INSERT_PACKAGE_CONFIGURATION'; -const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION'; +// TODO@bpasero in order to inline `product.json`, more work is +// needed to ensure that we cover all cases where modifications +// are done to the product configuration during build. There are +// at least 2 more changes that kick in very late: +// - a `darwinUniversalAssetId` is added in`create-universal-app.ts` +// - a `target` is added in `gulpfile.vscode.win32.js` +// const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION'; function inlineMeta(result, ctx) { return result.pipe(es.through(function (file) { if (matchesFile(file, ctx)) { @@ -19,18 +25,14 @@ function inlineMeta(result, ctx) { content = content.replace(packageMarker, JSON.stringify(JSON.parse(ctx.packageJsonFn())).slice(1, -1) /* trim braces */); markerFound = true; } - const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) - if (content.includes(productMarker)) { - content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */); - markerFound = true; - } + // const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) + // if (content.includes(productMarker)) { + // content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */); + // markerFound = true; + // } if (markerFound) { file.contents = Buffer.from(content); } - else if (content.includes(packageJsonMarkerId) || content.includes(productJsonMarkerId)) { - this.emit('error', new Error(`Unable to inline metadata because expected markers where not found in ${file.basename}.`)); - return; - } } this.emit('data', file); })); diff --git a/build/lib/inlineMeta.ts b/build/lib/inlineMeta.ts index 8f4c97d6635c3..ef3987fc32ed1 100644 --- a/build/lib/inlineMeta.ts +++ b/build/lib/inlineMeta.ts @@ -14,7 +14,14 @@ export interface IInlineMetaContext { } const packageJsonMarkerId = 'BUILD_INSERT_PACKAGE_CONFIGURATION'; -const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION'; + +// TODO@bpasero in order to inline `product.json`, more work is +// needed to ensure that we cover all cases where modifications +// are done to the product configuration during build. There are +// at least 2 more changes that kick in very late: +// - a `darwinUniversalAssetId` is added in`create-universal-app.ts` +// - a `target` is added in `gulpfile.vscode.win32.js` +// const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION'; export function inlineMeta(result: NodeJS.ReadWriteStream, ctx: IInlineMetaContext): NodeJS.ReadWriteStream { return result.pipe(es.through(function (file: File) { @@ -28,17 +35,14 @@ export function inlineMeta(result: NodeJS.ReadWriteStream, ctx: IInlineMetaConte markerFound = true; } - const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) - if (content.includes(productMarker)) { - content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */); - markerFound = true; - } + // const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes) + // if (content.includes(productMarker)) { + // content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */); + // markerFound = true; + // } if (markerFound) { file.contents = Buffer.from(content); - } else if (content.includes(packageJsonMarkerId) || content.includes(productJsonMarkerId)) { - this.emit('error', new Error(`Unable to inline metadata because expected markers where not found in ${file.basename}.`)); - return; } } From 1caa1739a73242046a52208e50b4e67529ac7560 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Jul 2024 17:09:49 +0200 Subject: [PATCH 709/755] make sure contributes/tools are read early so that fast extensions don't run into errors (#219997) fyi @roblourens --- src/vs/workbench/contrib/chat/browser/chat.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 46c8fa3be700d..9356ca139e570 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -255,7 +255,7 @@ registerWorkbenchContribution2(ChatResolverContribution.ID, ChatResolverContribu workbenchContributionsRegistry.registerWorkbenchContribution(ChatSlashStaticSlashCommandsContribution, LifecyclePhase.Eventually); Registry.as(EditorExtensions.EditorFactory).registerEditorSerializer(ChatEditorInput.TypeID, ChatEditorInputSerializer); registerWorkbenchContribution2(ChatExtensionPointHandler.ID, ChatExtensionPointHandler, WorkbenchPhase.BlockStartup); -registerWorkbenchContribution2(LanguageModelToolsExtensionPointHandler.ID, LanguageModelToolsExtensionPointHandler, WorkbenchPhase.Eventually); +registerWorkbenchContribution2(LanguageModelToolsExtensionPointHandler.ID, LanguageModelToolsExtensionPointHandler, WorkbenchPhase.BlockRestore); registerChatActions(); registerChatCopyActions(); From 3eb4e36b6d62be9d2285cd6e22802ed6432fc47e Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Jul 2024 17:21:41 +0200 Subject: [PATCH 710/755] Add url handling for settings and adopt in release notes (#219702) * Add url handling for settings and adopt in release notes Fixes #212079 * Update regex to use product service, fix test * Incorporate feedback * Check value of setting before passing to settings editor * Fix test --- .../browser/markdownSettingRenderer.ts | 34 +++-------- .../browser/markdownSettingRenderer.test.ts | 14 ++++- .../update/browser/update.contribution.ts | 1 - .../preferences/browser/preferencesService.ts | 58 ++++++++++++++++++- .../preferences/common/preferences.ts | 3 + .../test/browser/preferencesService.test.ts | 2 + 6 files changed, 81 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/contrib/markdown/browser/markdownSettingRenderer.ts b/src/vs/workbench/contrib/markdown/browser/markdownSettingRenderer.ts index 095a297856490..fe1c3c04e266d 100644 --- a/src/vs/workbench/contrib/markdown/browser/markdownSettingRenderer.ts +++ b/src/vs/workbench/contrib/markdown/browser/markdownSettingRenderer.ts @@ -4,22 +4,20 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { IPreferencesService, ISetting, ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences'; +import { IPreferencesService, ISetting } from 'vs/workbench/services/preferences/common/preferences'; import { settingKeyToDisplayFormat } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; import { URI } from 'vs/base/common/uri'; -import { Schemas } from 'vs/base/common/network'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { DefaultSettings } from 'vs/workbench/services/preferences/common/preferencesModels'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { IAction } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; - -const codeSettingRegex = /^/; +import { Schemas } from 'vs/base/common/network'; export class SimpleSettingRenderer { - private _defaultSettings: DefaultSettings; + private readonly codeSettingRegex: RegExp; + private _updatedSettings = new Map(); // setting ID to user's original setting value private _encounteredSettings = new Map(); // setting ID to setting private _featuredSettings = new Map(); // setting ID to feature value @@ -29,9 +27,9 @@ export class SimpleSettingRenderer { @IContextMenuService private readonly _contextMenuService: IContextMenuService, @IPreferencesService private readonly _preferencesService: IPreferencesService, @ITelemetryService private readonly _telemetryService: ITelemetryService, - @IClipboardService private readonly _clipboardService: IClipboardService + @IClipboardService private readonly _clipboardService: IClipboardService, ) { - this._defaultSettings = new DefaultSettings([], ConfigurationTarget.USER); + this.codeSettingRegex = new RegExp(`^`); } get featuredSettingStates(): Map { @@ -44,12 +42,12 @@ export class SimpleSettingRenderer { getHtmlRenderer(): (html: string) => string { return (html): string => { - const match = codeSettingRegex.exec(html); + const match = this.codeSettingRegex.exec(html); if (match && match.length === 4) { const settingId = match[2]; const rendered = this.render(settingId, match[3]); if (rendered) { - html = html.replace(codeSettingRegex, rendered); + html = html.replace(this.codeSettingRegex, rendered); } } return html; @@ -60,25 +58,11 @@ export class SimpleSettingRenderer { return `${Schemas.codeSetting}://${settingId}${value ? `/${value}` : ''}`; } - private settingsGroups: ISettingsGroup[] | undefined = undefined; private getSetting(settingId: string): ISetting | undefined { - if (!this.settingsGroups) { - this.settingsGroups = this._defaultSettings.getSettingsGroups(); - } if (this._encounteredSettings.has(settingId)) { return this._encounteredSettings.get(settingId); } - for (const group of this.settingsGroups) { - for (const section of group.sections) { - for (const setting of section.settings) { - if (setting.key === settingId) { - this._encounteredSettings.set(settingId, setting); - return setting; - } - } - } - } - return undefined; + return this._preferencesService.getSetting(settingId); } parseValue(settingId: string, value: string): any { diff --git a/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts b/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts index c0ee61a516173..1889507c97429 100644 --- a/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts +++ b/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts @@ -58,7 +58,15 @@ suite('Markdown Setting Renderer Test', () => { suiteSetup(() => { configurationService = new MarkdownConfigurationService(); - preferencesService = {}; + preferencesService = { + getSetting: (setting) => { + let type = 'boolean'; + if (setting.includes('string')) { + type = 'string'; + } + return { type, key: setting }; + } + }; contextMenuService = {}; Registry.as(Extensions.Configuration).registerConfiguration(configuration); settingRenderer = new SimpleSettingRenderer(configurationService, contextMenuService, preferencesService, { publicLog2: () => { } } as any, { writeText: async () => { } } as any); @@ -70,10 +78,10 @@ suite('Markdown Setting Renderer Test', () => { test('render code setting button with value', () => { const htmlRenderer = settingRenderer.getHtmlRenderer(); - const htmlNoValue = ''; + const htmlNoValue = ''; const renderedHtmlNoValue = htmlRenderer(htmlNoValue); assert.strictEqual(renderedHtmlNoValue, - ` + ` example.booleanSetting `); diff --git a/src/vs/workbench/contrib/update/browser/update.contribution.ts b/src/vs/workbench/contrib/update/browser/update.contribution.ts index fa3edab7d3acc..9e34bee7036cd 100644 --- a/src/vs/workbench/contrib/update/browser/update.contribution.ts +++ b/src/vs/workbench/contrib/update/browser/update.contribution.ts @@ -81,7 +81,6 @@ export class ShowCurrentReleaseNotesFromCurrentFileAction extends Action2 { }, category: localize2('developerCategory', "Developer"), f1: true, - precondition: RELEASE_NOTES_URL }); } diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 1d8f6e0ebdc2e..d12424fba94eb 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -35,7 +35,7 @@ import { IJSONEditingService } from 'vs/workbench/services/configuration/common/ import { GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; import { KeybindingsEditorInput } from 'vs/workbench/services/preferences/browser/keybindingsEditorInput'; -import { DEFAULT_SETTINGS_EDITOR_SETTING, FOLDER_SETTINGS_PATH, IKeybindingsEditorOptions, IKeybindingsEditorPane, IOpenSettingsOptions, IPreferencesEditorModel, IPreferencesService, ISetting, ISettingsEditorOptions, USE_SPLIT_JSON_SETTING, validateSettingsEditorOptions } from 'vs/workbench/services/preferences/common/preferences'; +import { DEFAULT_SETTINGS_EDITOR_SETTING, FOLDER_SETTINGS_PATH, IKeybindingsEditorOptions, IKeybindingsEditorPane, IOpenSettingsOptions, IPreferencesEditorModel, IPreferencesService, ISetting, ISettingsEditorOptions, ISettingsGroup, SETTINGS_AUTHORITY, USE_SPLIT_JSON_SETTING, validateSettingsEditorOptions } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { defaultKeybindingsContents, DefaultKeybindingsEditorModel, DefaultRawSettingsEditorModel, DefaultSettings, DefaultSettingsEditorModel, Settings2EditorModel, SettingsEditorModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -45,6 +45,7 @@ import { isObject } from 'vs/base/common/types'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; +import { IURLService } from 'vs/platform/url/common/url'; const emptyEditableSettingsContent = '{\n}'; @@ -58,6 +59,9 @@ export class PreferencesService extends Disposable implements IPreferencesServic private _defaultWorkspaceSettingsContentModel: DefaultSettings | undefined; private _defaultFolderSettingsContentModel: DefaultSettings | undefined; + private _settingsGroups: ISettingsGroup[] | undefined = undefined; + private _defaultSettings: DefaultSettings | undefined = undefined; + constructor( @IEditorService private readonly editorService: IEditorService, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @@ -75,7 +79,8 @@ export class PreferencesService extends Disposable implements IPreferencesServic @ILanguageService private readonly languageService: ILanguageService, @ILabelService private readonly labelService: ILabelService, @IRemoteAgentService private readonly remoteAgentService: IRemoteAgentService, - @ITextEditorService private readonly textEditorService: ITextEditorService + @ITextEditorService private readonly textEditorService: ITextEditorService, + @IURLService urlService: IURLService ) { super(); // The default keybindings.json updates based on keyboard layouts, so here we make sure @@ -88,6 +93,8 @@ export class PreferencesService extends Disposable implements IPreferencesServic } modelService.updateModel(model, defaultKeybindingsContents(keybindingService)); })); + + this._register(urlService.registerHandler(this)); } readonly defaultKeybindingsResource = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' }); @@ -593,6 +600,53 @@ export class PreferencesService extends Disposable implements IPreferencesServic return position; } + private get defaultSettings(): DefaultSettings { + if (!this._defaultSettings) { + this._defaultSettings = new DefaultSettings([], ConfigurationTarget.USER); + } + return this._defaultSettings; + } + + getSetting(settingId: string): ISetting | undefined { + if (!this._settingsGroups) { + this._settingsGroups = this.defaultSettings.getSettingsGroups(); + } + + for (const group of this._settingsGroups) { + for (const section of group.sections) { + for (const setting of section.settings) { + if (setting.key === settingId) { + return setting; + } + } + } + } + return undefined; + } + + /** + * Should be of the format: + * code://settings/settingName + * Examples: + * code://settings/files.autoSave + * + */ + async handleURL(uri: URI): Promise { + if (uri.authority !== SETTINGS_AUTHORITY) { + return false; + } + + const openSettingsOptions: IOpenSettingsOptions = {}; + const settingInfo = uri.path.split('/').filter(part => !!part); + if ((settingInfo.length === 0) || !this.getSetting(settingInfo[0])) { + return false; + } + + openSettingsOptions.query = settingInfo[0]; + this.openSettings(openSettingsOptions); + return true; + } + public override dispose(): void { this._onDispose.fire(); super.dispose(); diff --git a/src/vs/workbench/services/preferences/common/preferences.ts b/src/vs/workbench/services/preferences/common/preferences.ts index 1f0ff92e25a5a..f45dc085c294c 100644 --- a/src/vs/workbench/services/preferences/common/preferences.ts +++ b/src/vs/workbench/services/preferences/common/preferences.ts @@ -257,6 +257,7 @@ export interface IPreferencesService { openDefaultKeybindingsFile(): Promise; openLanguageSpecificSettings(languageId: string, options?: IOpenSettingsOptions): Promise; getEditableSettingsURI(configurationTarget: ConfigurationTarget, resource?: URI): Promise; + getSetting(settingId: string): ISetting | undefined; createSplitJsonEditorInput(configurationTarget: ConfigurationTarget, resource: URI): EditorInput; } @@ -329,3 +330,5 @@ export interface IDefineKeybindingEditorContribution extends IEditorContribution export const FOLDER_SETTINGS_PATH = '.vscode/settings.json'; export const DEFAULT_SETTINGS_EDITOR_SETTING = 'workbench.settings.openDefaultSettings'; export const USE_SPLIT_JSON_SETTING = 'workbench.settings.useSplitJSON'; + +export const SETTINGS_AUTHORITY = 'settings'; diff --git a/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts b/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts index 7e5107a38274a..bbc9001d5d63f 100644 --- a/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts +++ b/src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts @@ -9,6 +9,7 @@ import { TestCommandService } from 'vs/editor/test/browser/editorTestServices'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IURLService } from 'vs/platform/url/common/url'; import { DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor'; import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; import { TestJSONEditingService } from 'vs/workbench/services/configuration/test/common/testServices'; @@ -32,6 +33,7 @@ suite('PreferencesService', () => { testInstantiationService.stub(IJSONEditingService, TestJSONEditingService); testInstantiationService.stub(IRemoteAgentService, TestRemoteAgentService); testInstantiationService.stub(ICommandService, TestCommandService); + testInstantiationService.stub(IURLService, { registerHandler: () => { } }); // PreferencesService creates a PreferencesEditorInput which depends on IPreferencesService, add the real one, not a stub const collection = new ServiceCollection(); From a7ab6c0e34d6c414ca91fe95176be8578440ca90 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:40:05 +0200 Subject: [PATCH 711/755] SCM - dispose the SCMInputWidgetToolbar (#221146) --- src/vs/workbench/contrib/scm/browser/scmViewPane.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index b5430060c3200..c5de9db080e66 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -2265,6 +2265,10 @@ class SCMInputWidgetToolbar extends WorkbenchToolBar { updateToolbar(); } + override dispose(): void { + this.repositoryDisposables.dispose(); + super.dispose(); + } } class SCMInputWidgetEditorOptions { From 417dddb83f3536479f88c40e1d78edf1136a5ae5 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 8 Jul 2024 17:47:27 +0200 Subject: [PATCH 712/755] add isProfile property to extension:extract telemetry (#221148) --- .../extensionManagement/node/extensionManagementService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index d877db4d3c936..60b1336765185 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -490,10 +490,12 @@ type UpdateMetadataErrorClassification = { comment: 'Update metadata error'; extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'extension identifier' }; code?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'error code' }; + isProfile?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Is writing into profile' }; }; type UpdateMetadataErrorEvent = { extensionId: string; code?: string; + isProfile?: boolean; }; export class ExtensionsScanner extends Disposable { @@ -672,7 +674,7 @@ export class ExtensionsScanner extends Disposable { await this.extensionsScannerService.updateMetadata(local.location, metadata); } } catch (error) { - this.telemetryService.publicLog2('extension:extract', { extensionId: local.identifier.id, code: `${toFileOperationResult(error)}` }); + this.telemetryService.publicLog2('extension:extract', { extensionId: local.identifier.id, code: `${toFileOperationResult(error)}`, isProfile: !!profileLocation }); throw toExtensionManagementError(error, ExtensionManagementErrorCode.UpdateMetadata); } return this.scanLocalExtension(local.location, local.type, profileLocation); From 1e6b49798da0f8457d272758b8bd74f575dc9112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blak?= Date: Mon, 8 Jul 2024 19:12:13 +0200 Subject: [PATCH 713/755] Inline edit - implement side by side rendering of suggestions (#219444) * Make widget derived out of edit value * initial side-by-side rendering of suggestions * Keep old UI in some scenarios * Handle scrolling * Use embedded text editor to display suggestions * Add diff decorations * Apply decorations on the original code in side-by-side rendering * try to solve flickering... and fail at it * Make background colouring always enabled for inner-line suggestions, and remove strike-through --- src/vs/editor/common/config/editorOptions.ts | 9 - .../inlineEdit/browser/ghostTextWidget.ts | 10 +- .../browser/inlineEdit.contribution.ts | 6 +- .../contrib/inlineEdit/browser/inlineEdit.css | 5 - .../browser/inlineEditController.ts | 76 ++-- .../browser/inlineEditHintsWidget.ts | 6 +- .../browser/inlineEditSideBySideWidget.css | 12 + .../browser/inlineEditSideBySideWidget.ts | 346 ++++++++++++++++++ src/vs/monaco.d.ts | 1 - 9 files changed, 413 insertions(+), 58 deletions(-) create mode 100644 src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.css create mode 100644 src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.ts diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 294e7030695b5..643944437650a 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -4171,8 +4171,6 @@ export interface IInlineEditOptions { * Does not clear active inline suggestions when the editor loses focus. */ keepOnBlur?: boolean; - - backgroundColoring?: boolean; } /** @@ -4187,7 +4185,6 @@ class InlineEditorEdit extends BaseEditorOption; readonly minReservedLineCount: IObservable; readonly range: IObservable; - readonly backgroundColoring: IObservable; } export class GhostTextWidget extends Disposable { @@ -92,7 +92,7 @@ export class GhostTextWidget extends Disposable { let hiddenTextStartColumn: number | undefined = undefined; let lastIdx = 0; - if (!isPureRemove) { + if (!isPureRemove && (isSingleLine || !range)) { for (const part of ghostText.parts) { let lines = part.lines; //If remove range is set, we want to push all new liens to virtual area @@ -140,7 +140,6 @@ export class GhostTextWidget extends Disposable { range, isSingleLine, isPureRemove, - backgroundColoring: this.model.backgroundColoring.read(reader) }; }); @@ -184,11 +183,10 @@ export class GhostTextWidget extends Disposable { ranges.push(range); } } - const className = uiState.backgroundColoring ? 'inline-edit-remove backgroundColoring' : 'inline-edit-remove'; for (const range of ranges) { decorations.push({ range, - options: { inlineClassName: className, description: 'inline-edit-remove', } + options: diffDeleteDecoration }); } } @@ -215,7 +213,7 @@ export class GhostTextWidget extends Disposable { derived(reader => { /** @description lines */ const uiState = this.uiState.read(reader); - return uiState && !uiState.isPureRemove ? { + return uiState && !uiState.isPureRemove && (uiState.isSingleLine || !uiState.range) ? { lineNumber: uiState.lineNumber, additionalLines: uiState.additionalLines, minReservedLineCount: uiState.additionalReservedLineCount, diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.contribution.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.contribution.ts index 7196773a7cfc2..0be0d1254c005 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.contribution.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.contribution.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { EditorContributionInstantiation, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; +// import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { AcceptInlineEdit, JumpBackInlineEdit, JumpToInlineEdit, RejectInlineEdit, TriggerInlineEdit } from 'vs/editor/contrib/inlineEdit/browser/commands'; -import { InlineEditHoverParticipant } from 'vs/editor/contrib/inlineEdit/browser/hoverParticipant'; +// import { InlineEditHoverParticipant } from 'vs/editor/contrib/inlineEdit/browser/hoverParticipant'; import { InlineEditController } from 'vs/editor/contrib/inlineEdit/browser/inlineEditController'; registerEditorAction(AcceptInlineEdit); @@ -17,4 +17,4 @@ registerEditorAction(TriggerInlineEdit); registerEditorContribution(InlineEditController.ID, InlineEditController, EditorContributionInstantiation.Eventually); -HoverParticipantRegistry.register(InlineEditHoverParticipant); +// HoverParticipantRegistry.register(InlineEditHoverParticipant); diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.css b/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.css index d6d156544e00e..aced5d6271e96 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.css +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEdit.css @@ -6,11 +6,6 @@ .monaco-editor .inline-edit-remove { background-color: var(--vscode-editorGhostText-background); font-style: italic; - text-decoration: line-through; -} - -.monaco-editor .inline-edit-remove.backgroundColoring { - background-color: var(--vscode-diffEditor-removedLineBackground); } .monaco-editor .inline-edit-hidden { diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts index 74053d4a617ef..4e231fd5162b4 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditController.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { ISettableObservable, autorun, constObservable, disposableObservableValue, observableFromEvent, observableSignalFromEvent, observableValue, transaction } from 'vs/base/common/observable'; +import { ISettableObservable, autorun, constObservable, observableFromEvent, observableSignalFromEvent, observableValue, transaction } from 'vs/base/common/observable'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; @@ -22,14 +22,10 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { createStyleSheet2 } from 'vs/base/browser/dom'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; - -export class InlineEditWidget implements IDisposable { - constructor(public readonly widget: GhostTextWidget, public readonly edit: IInlineEdit) { } - - dispose(): void { - this.widget.dispose(); - } -} +import { derivedDisposable } from 'vs/base/common/observableInternal/derived'; +import { InlineEditSideBySideWidget } from 'vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget'; +import { IDiffProviderFactoryService } from 'vs/editor/browser/widget/diffEditor/diffProviderFactoryService'; +import { IModelService } from 'vs/editor/common/services/model'; export class InlineEditController extends Disposable { static ID = 'editor.contrib.inlineEditController'; @@ -46,7 +42,30 @@ export class InlineEditController extends Disposable { return editor.getContribution(InlineEditController.ID); } - private _currentEdit: ISettableObservable = this._register(disposableObservableValue(this, undefined)); + private _currentEdit: ISettableObservable = observableValue(this, undefined); + private _currentWidget = derivedDisposable(this._currentEdit, (reader) => { + const edit = this._currentEdit.read(reader); + if (!edit) { + return undefined; + } + const line = edit.range.endLineNumber; + const column = edit.range.endColumn; + const textToDisplay = edit.text.endsWith('\n') && !(edit.range.startLineNumber === edit.range.endLineNumber && edit.range.startColumn === edit.range.endColumn) ? edit.text.slice(0, -1) : edit.text; + const ghostText = new GhostText(line, [new GhostTextPart(column, textToDisplay, false)]); + //only show ghost text for single line edits + //multi line edits are shown in the side by side widget + const isSingleLine = edit.range.startLineNumber === edit.range.endLineNumber && ghostText.parts.length === 1 && ghostText.parts[0].lines.length === 1; + if (!isSingleLine) { + return undefined; + } + const instance = this.instantiationService.createInstance(GhostTextWidget, this.editor, { + ghostText: constObservable(ghostText), + minReservedLineCount: constObservable(0), + targetTextModel: constObservable(this.editor.getModel() ?? undefined), + range: constObservable(edit.range) + }); + return instance; + }); private _currentRequestCts: CancellationTokenSource | undefined; private _jumpBackPosition: Position | undefined; @@ -54,7 +73,6 @@ export class InlineEditController extends Disposable { private readonly _enabled = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).enabled); private readonly _fontFamily = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).fontFamily); - private readonly _backgroundColoring = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineEdit).backgroundColoring); constructor( @@ -64,6 +82,8 @@ export class InlineEditController extends Disposable { @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, @ICommandService private readonly _commandService: ICommandService, @IConfigurationService private readonly _configurationService: IConfigurationService, + @IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService, + @IModelService private readonly _modelService: IModelService, ) { super(); @@ -154,7 +174,8 @@ export class InlineEditController extends Disposable { }`); })); - this._register(new InlineEditHintsWidget(this.editor, this._currentEdit, this.instantiationService)); + this._register(new InlineEditHintsWidget(this.editor, this._currentWidget, this.instantiationService)); + this._register(new InlineEditSideBySideWidget(this.editor, this._currentEdit, this.instantiationService, this._diffProviderFactoryService, this._modelService)); } private checkCursorPosition(position: Position) { @@ -162,7 +183,7 @@ export class InlineEditController extends Disposable { this._isCursorAtInlineEditContext.set(false); return; } - const gt = this._currentEdit.get()?.edit; + const gt = this._currentEdit.get(); if (!gt) { this._isCursorAtInlineEditContext.set(false); return; @@ -231,18 +252,7 @@ export class InlineEditController extends Disposable { if (!edit) { return; } - const line = edit.range.endLineNumber; - const column = edit.range.endColumn; - const textToDisplay = edit.text.endsWith('\n') && !(edit.range.startLineNumber === edit.range.endLineNumber && edit.range.startColumn === edit.range.endColumn) ? edit.text.slice(0, -1) : edit.text; - const ghostText = new GhostText(line, [new GhostTextPart(column, textToDisplay, false)]); - const instance = this.instantiationService.createInstance(GhostTextWidget, this.editor, { - ghostText: constObservable(ghostText), - minReservedLineCount: constObservable(0), - targetTextModel: constObservable(this.editor.getModel() ?? undefined), - range: constObservable(edit.range), - backgroundColoring: this._backgroundColoring - }); - this._currentEdit.set(new InlineEditWidget(instance, edit), undefined); + this._currentEdit.set(edit, undefined); } public async trigger() { @@ -260,7 +270,7 @@ export class InlineEditController extends Disposable { public async accept() { this._isAccepting.set(true, undefined); - const data = this._currentEdit.get()?.edit; + const data = this._currentEdit.get(); if (!data) { return; } @@ -287,7 +297,7 @@ export class InlineEditController extends Disposable { public jumpToCurrent(): void { this._jumpBackPosition = this.editor.getSelection()?.getStartPosition(); - const data = this._currentEdit.get()?.edit; + const data = this._currentEdit.get(); if (!data) { return; } @@ -298,7 +308,7 @@ export class InlineEditController extends Disposable { } public async clear(sendRejection: boolean = true) { - const edit = this._currentEdit.get()?.edit; + const edit = this._currentEdit.get(); if (edit && edit?.rejected && sendRejection) { await this._commandService .executeCommand(edit.rejected.id, ...(edit.rejected.arguments || [])) @@ -324,11 +334,15 @@ export class InlineEditController extends Disposable { public shouldShowHoverAt(range: Range) { const currentEdit = this._currentEdit.get(); + const currentWidget = this._currentWidget.get(); if (!currentEdit) { return false; } - const edit = currentEdit.edit; - const model = currentEdit.widget.model; + if (!currentWidget) { + return false; + } + const edit = currentEdit; + const model = currentWidget.model; const overReplaceRange = Range.containsPosition(edit.range, range.getStartPosition()) || Range.containsPosition(edit.range, range.getEndPosition()); if (overReplaceRange) { return true; @@ -341,7 +355,7 @@ export class InlineEditController extends Disposable { } public shouldShowHoverAtViewZone(viewZoneId: string): boolean { - return this._currentEdit.get()?.widget.ownsViewZone(viewZoneId) ?? false; + return this._currentWidget.get()?.ownsViewZone(viewZoneId) ?? false; } } diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts index 215c85fbc0eb7..cb2453ab6c675 100644 --- a/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditHintsWidget.ts @@ -15,7 +15,7 @@ import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentW import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { PositionAffinity } from 'vs/editor/common/model'; -import { InlineEditWidget } from 'vs/editor/contrib/inlineEdit/browser/inlineEditController'; +import { GhostTextWidget } from 'vs/editor/contrib/inlineEdit/browser/ghostTextWidget'; import { MenuEntryActionViewItem, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuWorkbenchToolBarOptions, WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; @@ -32,7 +32,7 @@ export class InlineEditHintsWidget extends Disposable { private sessionPosition: Position | undefined = undefined; private readonly position = derived(this, reader => { - const ghostText = this.model.read(reader)?.widget.model.ghostText.read(reader); + const ghostText = this.model.read(reader)?.model.ghostText.read(reader); if (!this.alwaysShowToolbar.read(reader) || !ghostText || ghostText.parts.length === 0) { this.sessionPosition = undefined; @@ -51,7 +51,7 @@ export class InlineEditHintsWidget extends Disposable { constructor( private readonly editor: ICodeEditor, - private readonly model: IObservable, + private readonly model: IObservable, @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.css b/src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.css new file mode 100644 index 0000000000000..bc7e553e4d856 --- /dev/null +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.css @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-editor .inlineEditSideBySide { + z-index: 39; + color: var(--vscode-editorHoverWidget-foreground); + background-color: var(--vscode-editorHoverWidget-background); + border: 1px solid var(--vscode-editorHoverWidget-border); + white-space: pre; +} diff --git a/src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.ts b/src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.ts new file mode 100644 index 0000000000000..bd10e0669b4cb --- /dev/null +++ b/src/vs/editor/contrib/inlineEdit/browser/inlineEditSideBySideWidget.ts @@ -0,0 +1,346 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { $ } from 'vs/base/browser/dom'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IObservable, ObservablePromise, autorun, autorunWithStore, derived, observableSignalFromEvent } from 'vs/base/common/observable'; +import { derivedDisposable } from 'vs/base/common/observableInternal/derived'; +import { URI } from 'vs/base/common/uri'; +import 'vs/css!./inlineEditSideBySideWidget'; +import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; +import { observableCodeEditor } from 'vs/editor/browser/observableCodeEditor'; +import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; +import { IDiffProviderFactoryService } from 'vs/editor/browser/widget/diffEditor/diffProviderFactoryService'; +import { diffAddDecoration, diffAddDecorationEmpty, diffDeleteDecoration, diffDeleteDecorationEmpty, diffLineDeleteDecorationBackgroundWithIndicator, diffWholeLineAddDecoration, diffWholeLineDeleteDecoration } from 'vs/editor/browser/widget/diffEditor/registrations.contribution'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { Position } from 'vs/editor/common/core/position'; +import { IRange, Range } from 'vs/editor/common/core/range'; +import { DetailedLineRangeMapping } from 'vs/editor/common/diff/rangeMapping'; +import { IInlineEdit } from 'vs/editor/common/languages'; +import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; +import { IModelDeltaDecoration } from 'vs/editor/common/model'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { IModelService } from 'vs/editor/common/services/model'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; + +function* range(start: number, end: number, step = 1) { + if (end === undefined) { [end, start] = [start, 0]; } + for (let n = start; n < end; n += step) { yield n; } +} + +function removeIndentation(lines: string[]): string[] { + const indentation = lines[0].match(/^\s*/)?.[0] ?? ''; + return lines.map(l => l.replace(new RegExp('^' + indentation), '')); +} + +type Pos = { + top: number; + left: Position; +}; + +export class InlineEditSideBySideWidget extends Disposable { + private static _modelId = 0; + private static _createUniqueUri(): URI { + return URI.from({ scheme: 'inline-edit-widget', path: new Date().toString() + String(InlineEditSideBySideWidget._modelId++) }); + } + + private readonly _position = derived(this, reader => { + const ghostText = this._model.read(reader); + + if (!ghostText || ghostText.text.length === 0) { + return null; + } + if (ghostText.range.startLineNumber === ghostText.range.endLineNumber) { + //for inner-line suggestions we still want to use minimal ghost text + return null; + } + const editorModel = this._editor.getModel(); + if (!editorModel) { + return null; + } + const lines = Array.from(range(ghostText.range.startLineNumber, ghostText.range.endLineNumber + 1)); + const lengths = lines.map(lineNumber => editorModel.getLineLastNonWhitespaceColumn(lineNumber)); + const maxColumn = Math.max(...lengths); + const lineOfMaxColumn = lines[lengths.indexOf(maxColumn)]; + + const position = new Position(lineOfMaxColumn, maxColumn); + const pos = { + top: ghostText.range.startLineNumber, + left: position + }; + + return pos; + }); + + private readonly _text = derived(this, reader => { + const ghostText = this._model.read(reader); + if (!ghostText) { + return ''; + } + return removeIndentation(ghostText.text.split('\n')).join('\n'); + }); + + + private readonly _originalModel = derivedDisposable(() => this._modelService.createModel('', null, InlineEditSideBySideWidget._createUniqueUri())).keepObserved(this._store); + private readonly _modifiedModel = derivedDisposable(() => this._modelService.createModel('', null, InlineEditSideBySideWidget._createUniqueUri())).keepObserved(this._store); + + private readonly _diff = derived(this, reader => { + return this._diffPromise.read(reader)?.promiseResult.read(reader)?.data; + }); + + private readonly _diffPromise = derived(this, reader => { + const ghostText = this._model.read(reader); + if (!ghostText) { + return; + } + const editorModel = this._editor.getModel(); + if (!editorModel) { + return; + } + const originalText = removeIndentation(editorModel.getValueInRange(ghostText.range).split('\n')).join('\n'); + const modifiedText = removeIndentation(ghostText.text.split('\n')).join('\n'); + this._originalModel.get().setValue(originalText); + this._modifiedModel.get().setValue(modifiedText); + const d = this._diffProviderFactoryService.createDiffProvider({ diffAlgorithm: 'advanced' }); + return ObservablePromise.fromFn(async () => { + const result = await d.computeDiff(this._originalModel.get(), this._modifiedModel.get(), { + computeMoves: false, + ignoreTrimWhitespace: false, + maxComputationTimeMs: 1000, + }, CancellationToken.None); + + if (result.identical) { + return undefined; + } + + return result.changes; + }); + }); + + constructor( + private readonly _editor: ICodeEditor, + private readonly _model: IObservable, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IDiffProviderFactoryService private readonly _diffProviderFactoryService: IDiffProviderFactoryService, + @IModelService private readonly _modelService: IModelService, + ) { + super(); + + this._register(autorunWithStore((reader, store) => { + /** @description setup content widget */ + const model = this._model.read(reader); + if (!model) { + return; + } + + const contentWidget = store.add(this._instantiationService.createInstance( + InlineEditSideBySideContentWidget, + this._editor, + this._position, + this._text, + this._diff + )); + _editor.addOverlayWidget(contentWidget); + store.add(toDisposable(() => _editor.removeOverlayWidget(contentWidget))); + })); + } +} + +class InlineEditSideBySideContentWidget extends Disposable implements IOverlayWidget { + private static _dropDownVisible = false; + public static get dropDownVisible() { return this._dropDownVisible; } + + private static id = 0; + + private readonly id = `InlineEditSideBySideContentWidget${InlineEditSideBySideContentWidget.id++}`; + public readonly allowEditorOverflow = true; + public readonly suppressMouseDown = false; + + private readonly _nodes = $('div.inlineEditSideBySide', undefined,); + + private readonly _scrollChanged = observableSignalFromEvent('editor.onDidScrollChange', this._editor.onDidScrollChange); + + private readonly _previewEditor = this._register(this._instantiationService.createInstance( + EmbeddedCodeEditorWidget, + this._nodes, + { + glyphMargin: false, + lineNumbers: 'off', + minimap: { enabled: false }, + guides: { + indentation: false, + bracketPairs: false, + bracketPairsHorizontal: false, + highlightActiveIndentation: false, + }, + folding: false, + selectOnLineNumbers: false, + selectionHighlight: false, + columnSelection: false, + overviewRulerBorder: false, + overviewRulerLanes: 0, + lineDecorationsWidth: 0, + lineNumbersMinChars: 0, + scrollbar: { vertical: 'hidden', horizontal: 'hidden' }, + }, + { contributions: [], }, + this._editor + )); + + private readonly _previewEditorObs = observableCodeEditor(this._previewEditor); + private readonly _editorObs = observableCodeEditor(this._editor); + + private readonly _previewTextModel = this._register(this._instantiationService.createInstance( + TextModel, + '', + this._editor.getModel()?.getLanguageId() ?? PLAINTEXT_LANGUAGE_ID, + TextModel.DEFAULT_CREATION_OPTIONS, + null + )); + + private readonly _setText = derived(reader => { + const edit = this._text.read(reader); + if (!edit) { return; } + this._previewTextModel.setValue(edit); + }).recomputeInitiallyAndOnChange(this._store); + + + private readonly _decorations = derived(this, (reader) => { + this._setText.read(reader); + const position = this._position.read(reader); + if (!position) { return { org: [], mod: [] }; } + const diff = this._diff.read(reader); + if (!diff) { return { org: [], mod: [] }; } + + const originalDecorations: IModelDeltaDecoration[] = []; + const modifiedDecorations: IModelDeltaDecoration[] = []; + + if (diff.length === 1 && diff[0].innerChanges![0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange())) { + return { org: [], mod: [] }; + } + + const moveRange = (range: IRange) => { + return new Range(range.startLineNumber + position.top - 1, range.startColumn, range.endLineNumber + position.top - 1, range.endColumn); + }; + + for (const m of diff) { + if (!m.original.isEmpty) { + originalDecorations.push({ range: moveRange(m.original.toInclusiveRange()!), options: diffLineDeleteDecorationBackgroundWithIndicator }); + } + if (!m.modified.isEmpty) { + // modifiedDecorations.push({ range: m.modified.toInclusiveRange()!, options: diffLineAddDecorationBackgroundWithIndicator }); + } + + if (m.modified.isEmpty || m.original.isEmpty) { + if (!m.original.isEmpty) { + originalDecorations.push({ range: moveRange(m.original.toInclusiveRange()!), options: diffWholeLineDeleteDecoration }); + } + if (!m.modified.isEmpty) { + modifiedDecorations.push({ range: m.modified.toInclusiveRange()!, options: diffWholeLineAddDecoration }); + } + } else { + for (const i of m.innerChanges || []) { + // Don't show empty markers outside the line range + if (m.original.contains(i.originalRange.startLineNumber)) { + originalDecorations.push({ range: moveRange(i.originalRange), options: i.originalRange.isEmpty() ? diffDeleteDecorationEmpty : diffDeleteDecoration }); + } + if (m.modified.contains(i.modifiedRange.startLineNumber)) { + modifiedDecorations.push({ range: i.modifiedRange, options: i.modifiedRange.isEmpty() ? diffAddDecorationEmpty : diffAddDecoration }); + } + } + } + } + + return { org: originalDecorations, mod: modifiedDecorations }; + }); + + private readonly _originalDecorations = derived(this, reader => { + return this._decorations.read(reader).org; + }); + + private readonly _modifiedDecorations = derived(this, reader => { + return this._decorations.read(reader).mod; + }); + + constructor( + private readonly _editor: ICodeEditor, + private readonly _position: IObservable, + private readonly _text: IObservable, + private readonly _diff: IObservable, + + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { + super(); + + this._previewEditor.setModel(this._previewTextModel); + + this._register(this._editorObs.setDecorations(this._originalDecorations)); + this._register(this._previewEditorObs.setDecorations(this._modifiedDecorations)); + + this._register(autorun(reader => { + const width = this._previewEditorObs.contentWidth.read(reader); + const lines = this._text.get().split('\n').length - 1; + const height = this._editor.getOption(EditorOption.lineHeight) * lines; + if (width <= 0) { + return; + } + console.log('width', width); + this._previewEditor.layout({ height: height, width: width }); + })); + + this._register(autorun(reader => { + /** @description update position */ + this._position.read(reader); + this._editor.layoutOverlayWidget(this); + })); + + this._register(autorun(reader => { + /** @description scroll change */ + this._scrollChanged.read(reader); + const position = this._position.read(reader); + if (!position) { + return; + } + const visibleRanges = this._editor.getVisibleRanges(); + const isVisble = visibleRanges.some(range => { + return position.top >= range.startLineNumber && position.top <= range.endLineNumber; + }); + if (!isVisble) { + this._nodes.style.display = 'none'; + } + else { + this._nodes.style.display = 'block'; + } + this._editor.layoutOverlayWidget(this); + })); + } + + getId(): string { return this.id; } + + getDomNode(): HTMLElement { + return this._nodes; + } + + getPosition(): IOverlayWidgetPosition | null { + const position = this._position.get(); + if (!position) { + return null; + } + const layoutInfo = this._editor.getLayoutInfo(); + const visibPos = this._editor.getScrolledVisiblePosition(new Position(position.top, 1)); + if (!visibPos) { + return null; + } + const top = visibPos.top; + const left = layoutInfo.contentLeft + this._editor.getOffsetForColumn(position.left.lineNumber, position.left.column) + 10; + return { + preference: { + left, + top, + } + }; + } +} diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index c7e413801ccfe..584faab47accf 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -4571,7 +4571,6 @@ declare namespace monaco.editor { * Does not clear active inline suggestions when the editor loses focus. */ keepOnBlur?: boolean; - backgroundColoring?: boolean; } export interface IBracketPairColorizationOptions { From e86f5306cc8c64e2eb6a3f1db54f3a2c585f2fad Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:45:05 +0200 Subject: [PATCH 714/755] SCM - use MutableDisposable in SCMInputWidgetToolbar (#221173) --- .../contrib/scm/browser/scmViewPane.ts | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index c5de9db080e66..67564cd4aabae 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -2179,7 +2179,7 @@ class SCMInputWidgetToolbar extends WorkbenchToolBar { private _onDidChange = new Emitter(); readonly onDidChange: Event = this._onDidChange.event; - private readonly repositoryDisposables = new DisposableStore(); + private readonly _disposables = this._register(new MutableDisposable()); constructor( container: HTMLElement, @@ -2207,7 +2207,7 @@ class SCMInputWidgetToolbar extends WorkbenchToolBar { } public setInput(input: ISCMInput): void { - this.repositoryDisposables.clear(); + this._disposables.value = new DisposableStore(); const contextKeyService = this.contextKeyService.createOverlay([ ['scmProvider', input.repository.provider.contextValue], @@ -2215,7 +2215,7 @@ class SCMInputWidgetToolbar extends WorkbenchToolBar { ['scmProviderHasRootUri', !!input.repository.provider.rootUri] ]); - const menu = this.repositoryDisposables.add(this.menuService.createMenu(MenuId.SCMInputBox, contextKeyService, { emitEventsForSubmenuChanges: true })); + const menu = this._disposables.value.add(this.menuService.createMenu(MenuId.SCMInputBox, contextKeyService, { emitEventsForSubmenuChanges: true })); const isEnabled = (): boolean => { return input.repository.provider.groups.some(g => g.resources.length > 0); @@ -2245,18 +2245,18 @@ class SCMInputWidgetToolbar extends WorkbenchToolBar { this._onDidChange.fire(); }; - this.repositoryDisposables.add(menu.onDidChange(() => updateToolbar())); - this.repositoryDisposables.add(input.repository.provider.onDidChangeResources(() => updateToolbar())); - this.repositoryDisposables.add(this.storageService.onDidChangeValue(StorageScope.PROFILE, SCMInputWidgetStorageKey.LastActionId, this.repositoryDisposables)(() => updateToolbar())); + this._disposables.value.add(menu.onDidChange(() => updateToolbar())); + this._disposables.value.add(input.repository.provider.onDidChangeResources(() => updateToolbar())); + this._disposables.value.add(this.storageService.onDidChangeValue(StorageScope.PROFILE, SCMInputWidgetStorageKey.LastActionId, this._disposables.value)(() => updateToolbar())); this.actionRunner = new SCMInputWidgetActionRunner(input, this.storageService); - this.repositoryDisposables.add(this.actionRunner.onWillRun(e => { + this._disposables.value.add(this.actionRunner.onWillRun(e => { if ((this.actionRunner as SCMInputWidgetActionRunner).runningActions.size === 0) { super.setActions([this._cancelAction], []); this._onDidChange.fire(); } })); - this.repositoryDisposables.add(this.actionRunner.onDidRun(e => { + this._disposables.value.add(this.actionRunner.onDidRun(e => { if ((this.actionRunner as SCMInputWidgetActionRunner).runningActions.size === 0) { updateToolbar(); } @@ -2264,11 +2264,6 @@ class SCMInputWidgetToolbar extends WorkbenchToolBar { updateToolbar(); } - - override dispose(): void { - this.repositoryDisposables.dispose(); - super.dispose(); - } } class SCMInputWidgetEditorOptions { From 9e4f826b181b0e04c66a80b9e83e5fd6356cda4f Mon Sep 17 00:00:00 2001 From: Parasaran <74203806+Parasaran-Python@users.noreply.github.com> Date: Mon, 8 Jul 2024 23:48:04 +0530 Subject: [PATCH 715/755] Fixes #218254 (#219312) onDidShowContextMenu fires for every webview even though only one webview has the context menu visible, hence removed the onDidShow listener, sending the set-context-menu-visible event to the html on did-context-menu event so that the context-menu-visible class gets applied only to the webview that actually has the context menu visible --- src/vs/workbench/contrib/webview/browser/webviewElement.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 5d6e403159f46..8870ddf4cc639 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -265,6 +265,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD y: elementBox.y + data.clientY }) }); + this._send('set-context-menu-visible', { visible: true }); })); this._register(this.on('load-resource', async (entry) => { @@ -294,7 +295,6 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this._register(Event.runAndSubscribe(webviewThemeDataProvider.onThemeDataChanged, () => this.style())); this._register(_accessibilityService.onDidChangeReducedMotion(() => this.style())); this._register(_accessibilityService.onDidChangeScreenReaderOptimized(() => this.style())); - this._register(contextMenuService.onDidShowContextMenu(() => this._send('set-context-menu-visible', { visible: true }))); this._register(contextMenuService.onDidHideContextMenu(() => this._send('set-context-menu-visible', { visible: false }))); this._confirmBeforeClose = configurationService.getValue('window.confirmBeforeClose'); From 1cd7cf5decbe06cb42efdb03c44d19e4f9b2ba58 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Jul 2024 11:33:21 -0700 Subject: [PATCH 716/755] Update MD grammar (#221204) --- extensions/markdown-basics/cgmanifest.json | 2 +- .../syntaxes/markdown.tmLanguage.json | 32 +++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/extensions/markdown-basics/cgmanifest.json b/extensions/markdown-basics/cgmanifest.json index 60c6b192bed6a..380b0c74ac6df 100644 --- a/extensions/markdown-basics/cgmanifest.json +++ b/extensions/markdown-basics/cgmanifest.json @@ -33,7 +33,7 @@ "git": { "name": "microsoft/vscode-markdown-tm-grammar", "repositoryUrl": "https://github.com/microsoft/vscode-markdown-tm-grammar", - "commitHash": "f75d5f55730e72ee7ff386841949048b2395e440" + "commitHash": "7418dd20d76c72e82fadee2909e03239e9973b35" } }, "license": "MIT", diff --git a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json index c84c468b80c8a..9761ca716abde 100644 --- a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json +++ b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/f75d5f55730e72ee7ff386841949048b2395e440", + "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/7418dd20d76c72e82fadee2909e03239e9973b35", "name": "Markdown", "scopeName": "text.html.markdown", "patterns": [ @@ -2480,14 +2480,34 @@ "name": "meta.separator.markdown" }, "frontMatter": { - "begin": "\\A-{3}\\s*$", - "contentName": "meta.embedded.block.frontmatter", + "begin": "\\A(?=(-{3,}))", + "end": "^ {,3}\\1-*[ \\t]*$|^[ \\t]*\\.{3}$", + "applyEndPatternLast": 1, + "endCaptures": { + "0": { + "name": "punctuation.definition.end.frontmatter" + } + }, "patterns": [ { - "include": "source.yaml" + "begin": "\\A(-{3,})(.*)$", + "while": "^(?! {,3}\\1-*[ \\t]*$|[ \\t]*\\.{3}$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.begin.frontmatter" + }, + "2": { + "name": "comment.frontmatter" + } + }, + "contentName": "meta.embedded.block.frontmatter", + "patterns": [ + { + "include": "source.yaml" + } + ] } - ], - "end": "(^|\\G)-{3}|\\.{3}\\s*$" + ] }, "table": { "name": "markup.table.markdown", From f3930566bd216a35403d020ed34460f36721a951 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 20:51:52 +0200 Subject: [PATCH 717/755] =?UTF-8?q?Git=20-=20=F0=9F=92=84=20fix=20log=20me?= =?UTF-8?q?ssage=20format=20(#221218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/git/src/model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index d4e00449e20a8..48e66d5e9ff64 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -325,7 +325,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi } */ this.telemetryReporter.sendTelemetryEvent('git.repositoryInitialScan', { autoRepositoryDetection: String(autoRepositoryDetection) }, { repositoryCount: this.openRepositories.length }); - this.logger.info(`[Model][doInitialScan] Initial repository scan completed - repositories(${this.repositories.length}), closed repositories (${this.closedRepositories.length}), parent repositories (${this.parentRepositories.length}), unsafe repositories (${this.unsafeRepositories.length})`); + this.logger.info(`[Model][doInitialScan] Initial repository scan completed - repositories (${this.repositories.length}), closed repositories (${this.closedRepositories.length}), parent repositories (${this.parentRepositories.length}), unsafe repositories (${this.unsafeRepositories.length})`); } /** From 63274b60e78b1ad48e9e945c59850c6e3c5d7be8 Mon Sep 17 00:00:00 2001 From: Teik Seong <53546313+mxts@users.noreply.github.com> Date: Tue, 9 Jul 2024 03:32:44 +0800 Subject: [PATCH 718/755] add option to dock terminal at top (#207721) * add option to dock terminal at top * fixed formatting * Update editorPart.ts requested changes * panel position fixes and cleanup --------- Co-authored-by: BeniBenj --- src/vs/workbench/browser/layout.ts | 75 +++++++++++-------- .../browser/parts/editor/editorPart.ts | 4 + .../browser/parts/panel/media/panelpart.css | 17 +++++ .../browser/parts/panel/panelActions.ts | 12 +-- .../browser/parts/panel/panelPart.ts | 15 +++- .../browser/parts/views/viewPaneContainer.ts | 7 +- .../browser/workbench.contribution.ts | 4 +- .../contrib/terminal/browser/terminalGroup.ts | 18 +++-- .../terminal/browser/terminalInstance.ts | 4 +- .../services/layout/browser/layoutService.ts | 11 ++- 10 files changed, 108 insertions(+), 59 deletions(-) diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index b8232cb849002..6ad52a2695eab 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -12,7 +12,7 @@ import { isWindows, isLinux, isMacintosh, isWeb, isIOS } from 'vs/base/common/pl import { EditorInputCapabilities, GroupIdentifier, isResourceEditorInput, IUntypedEditorInput, pathsToEditors } from 'vs/workbench/common/editor'; import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; -import { Position, Parts, PanelOpensMaximizedOptions, IWorkbenchLayoutService, positionFromString, positionToString, panelOpensMaximizedFromString, PanelAlignment, ActivityBarPosition, LayoutSettings, MULTI_WINDOW_PARTS, SINGLE_WINDOW_PARTS, ZenModeSettings, EditorTabsMode, EditorActionsLocation, shouldShowCustomTitleBar } from 'vs/workbench/services/layout/browser/layoutService'; +import { Position, Parts, PanelOpensMaximizedOptions, IWorkbenchLayoutService, positionFromString, positionToString, panelOpensMaximizedFromString, PanelAlignment, ActivityBarPosition, LayoutSettings, MULTI_WINDOW_PARTS, SINGLE_WINDOW_PARTS, ZenModeSettings, EditorTabsMode, EditorActionsLocation, shouldShowCustomTitleBar, isHorizontal } from 'vs/workbench/services/layout/browser/layoutService'; import { isTemporaryWorkspace, IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IConfigurationChangeEvent, IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -1266,18 +1266,17 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const containerDimension = this.getContainerDimension(container); if (container === this.mainContainer) { - const panelPosition = this.getPanelPosition(); - const isColumn = panelPosition === Position.RIGHT || panelPosition === Position.LEFT; + const isPanelHorizontal = isHorizontal(this.getPanelPosition()); const takenWidth = (this.isVisible(Parts.ACTIVITYBAR_PART) ? this.activityBarPartView.minimumWidth : 0) + (this.isVisible(Parts.SIDEBAR_PART) ? this.sideBarPartView.minimumWidth : 0) + - (this.isVisible(Parts.PANEL_PART) && isColumn ? this.panelPartView.minimumWidth : 0) + + (this.isVisible(Parts.PANEL_PART) && !isPanelHorizontal ? this.panelPartView.minimumWidth : 0) + (this.isVisible(Parts.AUXILIARYBAR_PART) ? this.auxiliaryBarPartView.minimumWidth : 0); const takenHeight = (this.isVisible(Parts.TITLEBAR_PART, targetWindow) ? this.titleBarPartView.minimumHeight : 0) + (this.isVisible(Parts.STATUSBAR_PART, targetWindow) ? this.statusBarPartView.minimumHeight : 0) + - (this.isVisible(Parts.PANEL_PART) && !isColumn ? this.panelPartView.minimumHeight : 0); + (this.isVisible(Parts.PANEL_PART) && isPanelHorizontal ? this.panelPartView.minimumHeight : 0); const availableWidth = containerDimension.width - takenWidth; const availableHeight = containerDimension.height - takenHeight; @@ -1546,7 +1545,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Panel Size const panelSize = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_HIDDEN) ? this.workbenchGrid.getViewCachedVisibleSize(this.panelPartView) - : (this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION) === Position.BOTTOM ? this.workbenchGrid.getViewSize(this.panelPartView).height : this.workbenchGrid.getViewSize(this.panelPartView).width); + : isHorizontal(this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION)) + ? this.workbenchGrid.getViewSize(this.panelPartView).height + : this.workbenchGrid.getViewSize(this.panelPartView).width; this.stateModel.setInitializationValue(LayoutStateKeys.PANEL_SIZE, panelSize as number); // Auxiliary Bar Size @@ -1635,8 +1636,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.workbenchGrid.resizeView(this.panelPartView, { - width: viewSize.width + (this.getPanelPosition() !== Position.BOTTOM ? sizeChangePxWidth : 0), - height: viewSize.height + (this.getPanelPosition() !== Position.BOTTOM ? 0 : sizeChangePxHeight) + width: viewSize.width + (isHorizontal(this.getPanelPosition()) ? 0 : sizeChangePxWidth), + height: viewSize.height + (isHorizontal(this.getPanelPosition()) ? sizeChangePxHeight : 0) }); break; @@ -1770,8 +1771,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private adjustPartPositions(sideBarPosition: Position, panelAlignment: PanelAlignment, panelPosition: Position): void { // Move activity bar and side bars - const sideBarSiblingToEditor = panelPosition !== Position.BOTTOM || !(panelAlignment === 'center' || (sideBarPosition === Position.LEFT && panelAlignment === 'right') || (sideBarPosition === Position.RIGHT && panelAlignment === 'left')); - const auxiliaryBarSiblingToEditor = panelPosition !== Position.BOTTOM || !(panelAlignment === 'center' || (sideBarPosition === Position.RIGHT && panelAlignment === 'right') || (sideBarPosition === Position.LEFT && panelAlignment === 'left')); + const isPanelVertical = !isHorizontal(panelPosition); + const sideBarSiblingToEditor = isPanelVertical || !(panelAlignment === 'center' || (sideBarPosition === Position.LEFT && panelAlignment === 'right') || (sideBarPosition === Position.RIGHT && panelAlignment === 'left')); + const auxiliaryBarSiblingToEditor = isPanelVertical || !(panelAlignment === 'center' || (sideBarPosition === Position.RIGHT && panelAlignment === 'right') || (sideBarPosition === Position.LEFT && panelAlignment === 'left')); const preMovePanelWidth = !this.isVisible(Parts.PANEL_PART) ? Sizing.Invisible(this.workbenchGrid.getViewCachedVisibleSize(this.panelPartView) ?? this.panelPartView.minimumWidth) : this.workbenchGrid.getViewSize(this.panelPartView).width; const preMovePanelHeight = !this.isVisible(Parts.PANEL_PART) ? Sizing.Invisible(this.workbenchGrid.getViewCachedVisibleSize(this.panelPartView) ?? this.panelPartView.minimumHeight) : this.workbenchGrid.getViewSize(this.panelPartView).height; const preMoveSideBarSize = !this.isVisible(Parts.SIDEBAR_PART) ? Sizing.Invisible(this.workbenchGrid.getViewCachedVisibleSize(this.sideBarPartView) ?? this.sideBarPartView.minimumWidth) : this.workbenchGrid.getViewSize(this.sideBarPartView).width; @@ -1797,7 +1799,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // We moved all the side parts based on the editor and ignored the panel // Now, we need to put the panel back in the right position when it is next to the editor - if (panelPosition !== Position.BOTTOM) { + if (isPanelVertical) { this.workbenchGrid.moveView(this.panelPartView, preMovePanelWidth, this.editorPartView, panelPosition === Position.LEFT ? Direction.Left : Direction.Right); this.workbenchGrid.resizeView(this.panelPartView, { height: preMovePanelHeight as number, @@ -1824,8 +1826,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi setPanelAlignment(alignment: PanelAlignment, skipLayout?: boolean): void { - // Panel alignment only applies to a panel in the bottom position - if (this.getPanelPosition() !== Position.BOTTOM) { + // Panel alignment only applies to a panel in the top/bottom position + if (!isHorizontal(this.getPanelPosition())) { this.setPanelPosition(Position.BOTTOM); } @@ -1921,7 +1923,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const isMaximized = this.isPanelMaximized(); if (!isMaximized) { if (this.isVisible(Parts.PANEL_PART)) { - if (panelPosition === Position.BOTTOM) { + if (isHorizontal(panelPosition)) { this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT, size.height); } else { this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH, size.width); @@ -1932,8 +1934,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } else { this.setEditorHidden(false); this.workbenchGrid.resizeView(this.panelPartView, { - width: panelPosition === Position.BOTTOM ? size.width : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH), - height: panelPosition === Position.BOTTOM ? this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT) : size.height + width: isHorizontal(panelPosition) ? size.width : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH), + height: isHorizontal(panelPosition) ? this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT) : size.height }); } @@ -1943,7 +1945,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private panelOpensMaximized(): boolean { // The workbench grid currently prevents us from supporting panel maximization with non-center panel alignment - if (this.getPanelAlignment() !== 'center' && this.getPanelPosition() === Position.BOTTOM) { + if (this.getPanelAlignment() !== 'center' && isHorizontal(this.getPanelPosition())) { return false; } @@ -2021,7 +2023,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi isPanelMaximized(): boolean { // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment - return (this.getPanelAlignment() === 'center' || this.getPanelPosition() !== Position.BOTTOM) && !this.isVisible(Parts.EDITOR_PART, mainWindow); + return (this.getPanelAlignment() === 'center' || !isHorizontal(this.getPanelPosition())) && !this.isVisible(Parts.EDITOR_PART, mainWindow); } getSideBarPosition(): Position { @@ -2097,14 +2099,14 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Save the current size of the panel for the new orthogonal direction // If moving down, save the width of the panel // Otherwise, save the height of the panel - if (position === Position.BOTTOM) { + if (isHorizontal(position)) { this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH, size.width); - } else if (positionFromString(oldPositionValue) === Position.BOTTOM) { + } else if (isHorizontal(positionFromString(oldPositionValue))) { this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT, size.height); } } - if (position === Position.BOTTOM && this.getPanelAlignment() !== 'center' && editorHidden) { + if (isHorizontal(position) && this.getPanelAlignment() !== 'center' && editorHidden) { this.toggleMaximizedPanel(); editorHidden = false; } @@ -2116,6 +2118,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if (position === Position.BOTTOM) { this.workbenchGrid.moveView(this.panelPartView, editorHidden ? size.height : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT), this.editorPartView, Direction.Down); + } else if (position === Position.TOP) { + this.workbenchGrid.moveView(this.panelPartView, editorHidden ? size.height : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT), this.editorPartView, Direction.Up); } else if (position === Position.RIGHT) { this.workbenchGrid.moveView(this.panelPartView, editorHidden ? size.width : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH), this.editorPartView, Direction.Right); } else { @@ -2133,7 +2137,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.setAuxiliaryBarHidden(true); } - if (position === Position.BOTTOM) { + if (isHorizontal(position)) { this.adjustPartPositions(this.getSideBarPosition(), this.getPanelAlignment(), position); } @@ -2242,17 +2246,20 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const auxiliaryBarSize = this.stateModel.getRuntimeValue(LayoutStateKeys.AUXILIARYBAR_HIDDEN) ? 0 : nodes.auxiliaryBar.size; const panelSize = this.stateModel.getInitializationValue(LayoutStateKeys.PANEL_SIZE) ? 0 : nodes.panel.size; + const panelPostion = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION); + const sideBarPosition = this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON); + const result = [] as ISerializedNode[]; - if (this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION) !== Position.BOTTOM) { + if (!isHorizontal(panelPostion)) { result.push(nodes.editor); nodes.editor.size = availableWidth - activityBarSize - sideBarSize - panelSize - auxiliaryBarSize; - if (this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION) === Position.RIGHT) { + if (panelPostion === Position.RIGHT) { result.push(nodes.panel); } else { result.splice(0, 0, nodes.panel); } - if (this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON) === Position.LEFT) { + if (sideBarPosition === Position.LEFT) { result.push(nodes.auxiliaryBar); result.splice(0, 0, nodes.sideBar); result.splice(0, 0, nodes.activityBar); @@ -2263,18 +2270,20 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } } else { const panelAlignment = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_ALIGNMENT); - const sideBarPosition = this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON); const sideBarNextToEditor = !(panelAlignment === 'center' || (sideBarPosition === Position.LEFT && panelAlignment === 'right') || (sideBarPosition === Position.RIGHT && panelAlignment === 'left')); const auxiliaryBarNextToEditor = !(panelAlignment === 'center' || (sideBarPosition === Position.RIGHT && panelAlignment === 'right') || (sideBarPosition === Position.LEFT && panelAlignment === 'left')); const editorSectionWidth = availableWidth - activityBarSize - (sideBarNextToEditor ? 0 : sideBarSize) - (auxiliaryBarNextToEditor ? 0 : auxiliaryBarSize); + + const editorNodes = this.arrangeEditorNodes({ + editor: nodes.editor, + sideBar: sideBarNextToEditor ? nodes.sideBar : undefined, + auxiliaryBar: auxiliaryBarNextToEditor ? nodes.auxiliaryBar : undefined + }, availableHeight - panelSize, editorSectionWidth); + result.push({ type: 'branch', - data: [this.arrangeEditorNodes({ - editor: nodes.editor, - sideBar: sideBarNextToEditor ? nodes.sideBar : undefined, - auxiliaryBar: auxiliaryBarNextToEditor ? nodes.auxiliaryBar : undefined - }, availableHeight - panelSize, editorSectionWidth), nodes.panel], + data: panelPostion === Position.BOTTOM ? [editorNodes, nodes.panel] : [nodes.panel, editorNodes], size: editorSectionWidth }); @@ -2417,7 +2426,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi panelVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the panel is visible' }; statusbarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the status bar is visible' }; sideBarPosition: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the primary side bar is on the left or right' }; - panelPosition: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the panel is on the bottom, left, or right' }; + panelPosition: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the panel is on the top, bottom, left, or right' }; }; const layoutDescriptor: StartupLayoutEvent = { @@ -2625,7 +2634,7 @@ class LayoutStateModel extends Disposable { LayoutStateKeys.GRID_SIZE.defaultValue = { height: workbenchDimensions.height, width: workbenchDimensions.width }; LayoutStateKeys.SIDEBAR_SIZE.defaultValue = Math.min(300, workbenchDimensions.width / 4); LayoutStateKeys.AUXILIARYBAR_SIZE.defaultValue = Math.min(300, workbenchDimensions.width / 4); - LayoutStateKeys.PANEL_SIZE.defaultValue = (this.stateCache.get(LayoutStateKeys.PANEL_POSITION.name) ?? LayoutStateKeys.PANEL_POSITION.defaultValue) === Position.BOTTOM ? workbenchDimensions.height / 3 : workbenchDimensions.width / 4; + LayoutStateKeys.PANEL_SIZE.defaultValue = (this.stateCache.get(LayoutStateKeys.PANEL_POSITION.name) ?? isHorizontal(LayoutStateKeys.PANEL_POSITION.defaultValue)) ? workbenchDimensions.height / 3 : workbenchDimensions.width / 4; LayoutStateKeys.SIDEBAR_HIDDEN.defaultValue = this.contextService.getWorkbenchState() === WorkbenchState.EMPTY; // Apply all defaults diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index d785a5137981e..fbdfd7daf7d50 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -1103,6 +1103,10 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupsView { openVerticalPosition = Position.BOTTOM; } + if (e.eventData.clientY < boundingRect.top + proximity) { + openVerticalPosition = Position.TOP; + } + if (horizontalOpenerTimeout && openHorizontalPosition !== lastOpenHorizontalPosition) { clearTimeout(horizontalOpenerTimeout); horizontalOpenerTimeout = undefined; diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index 40a5ee28faf62..e1c147d8e88a3 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -17,6 +17,15 @@ border-top-width: 0; /* no border when main editor area is hiden */ } +.monaco-workbench .part.panel.top { + border-bottom-width: 1px; + border-bottom-style: solid; +} + +.monaco-workbench.nomaineditorarea .part.panel.top { + border-bottom-width: 0; /* no border when main editor area is hiden */ +} + .monaco-workbench .part.panel.right { border-left-width: 1px; border-left-style: solid; @@ -81,3 +90,11 @@ display: inline-block; transform: rotate(90deg); } + +/* Rotate icons when panel is on left */ +.monaco-workbench .part.basepanel.top .title-actions .codicon-split-horizontal::before, +.monaco-workbench .part.basepanel.top .global-actions .codicon-panel-maximize::before, +.monaco-workbench .part.basepanel.top .global-actions .codicon-panel-restore::before { + display: inline-block; + transform: rotate(180deg); +} diff --git a/src/vs/workbench/browser/parts/panel/panelActions.ts b/src/vs/workbench/browser/parts/panel/panelActions.ts index 534db0283a72f..3e97968289db2 100644 --- a/src/vs/workbench/browser/parts/panel/panelActions.ts +++ b/src/vs/workbench/browser/parts/panel/panelActions.ts @@ -8,7 +8,7 @@ import { localize, localize2 } from 'vs/nls'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { MenuId, MenuRegistry, registerAction2, Action2, IAction2Options } from 'vs/platform/actions/common/actions'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; -import { ActivityBarPosition, IWorkbenchLayoutService, LayoutSettings, PanelAlignment, Parts, Position, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; +import { ActivityBarPosition, isHorizontal, IWorkbenchLayoutService, LayoutSettings, PanelAlignment, Parts, Position, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; import { AuxiliaryBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelPositionContext, PanelVisibleContext } from 'vs/workbench/common/contextkeys'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { Codicon } from 'vs/base/common/codicons'; @@ -99,6 +99,7 @@ const PositionPanelActionId = { LEFT: 'workbench.action.positionPanelLeft', RIGHT: 'workbench.action.positionPanelRight', BOTTOM: 'workbench.action.positionPanelBottom', + TOP: 'workbench.action.positionPanelTop' }; const AlignPanelActionId = { @@ -136,6 +137,7 @@ function createAlignmentPanelActionConfig(id: string, title: ICommandActionTitle const PositionPanelActionConfigs: PanelActionConfig[] = [ + createPositionPanelActionConfig(PositionPanelActionId.TOP, localize2('positionPanelTop', "Move Panel To Top"), localize('positionPanelTopShort', "Top"), Position.TOP), createPositionPanelActionConfig(PositionPanelActionId.LEFT, localize2('positionPanelLeft', "Move Panel Left"), localize('positionPanelLeftShort', "Left"), Position.LEFT), createPositionPanelActionConfig(PositionPanelActionId.RIGHT, localize2('positionPanelRight', "Move Panel Right"), localize('positionPanelRightShort', "Right"), Position.RIGHT), createPositionPanelActionConfig(PositionPanelActionId.BOTTOM, localize2('positionPanelBottom', "Move Panel To Bottom"), localize('positionPanelBottomShort', "Bottom"), Position.BOTTOM), @@ -158,7 +160,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { order: 4 }); -PositionPanelActionConfigs.forEach(positionPanelAction => { +PositionPanelActionConfigs.forEach((positionPanelAction, index) => { const { id, title, shortLabel, value, when } = positionPanelAction; registerAction2(class extends Action2 { @@ -182,7 +184,7 @@ PositionPanelActionConfigs.forEach(positionPanelAction => { title: shortLabel, toggled: when.negate() }, - order: 5 + order: 5 + index }); }); @@ -280,7 +282,7 @@ registerAction2(class extends Action2 { tooltip: localize('maximizePanel', "Maximize Panel Size"), category: Categories.View, f1: true, - icon: maximizeIcon, + icon: maximizeIcon, // This is being rotated in CSS depending on the panel position // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment precondition: ContextKeyExpr.or(PanelAlignmentContext.isEqualTo('center'), PanelPositionContext.notEqualsTo('bottom')), toggled: { condition: PanelMaximizedContext, icon: restoreIcon, tooltip: localize('minimizePanel', "Restore Panel Size") }, @@ -296,7 +298,7 @@ registerAction2(class extends Action2 { run(accessor: ServicesAccessor) { const layoutService = accessor.get(IWorkbenchLayoutService); const notificationService = accessor.get(INotificationService); - if (layoutService.getPanelAlignment() !== 'center' && layoutService.getPanelPosition() === Position.BOTTOM) { + if (layoutService.getPanelAlignment() !== 'center' && isHorizontal(layoutService.getPanelPosition())) { notificationService.warn(localize('panelMaxNotSupported', "Maximizing the panel is only supported when it is center aligned.")); return; } diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 845274fa94073..899d97b4cda24 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -112,6 +112,7 @@ export class PanelPart extends AbstractPaneCompositePart { const borderColor = this.getColor(PANEL_BORDER) || this.getColor(contrastBorder) || ''; container.style.borderLeftColor = borderColor; container.style.borderRightColor = borderColor; + container.style.borderBottomColor = borderColor; const title = this.getTitleArea(); if (title) { @@ -166,10 +167,16 @@ export class PanelPart extends AbstractPaneCompositePart { override layout(width: number, height: number, top: number, left: number): void { let dimensions: Dimension; - if (this.layoutService.getPanelPosition() === Position.RIGHT) { - dimensions = new Dimension(width - 1, height); // Take into account the 1px border when layouting - } else { - dimensions = new Dimension(width, height); + switch (this.layoutService.getPanelPosition()) { + case Position.RIGHT: + dimensions = new Dimension(width - 1, height); // Take into account the 1px border when layouting + break; + case Position.TOP: + dimensions = new Dimension(width, height - 1); // Take into account the 1px border when layouting + break; + default: + dimensions = new Dimension(width, height); + break; } // Layout contents diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index d782b08c3c26a..01df5c12a696c 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -39,7 +39,7 @@ import { IAddedViewDescriptorRef, ICustomViewDescriptor, IView, IViewContainerMo import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; import { FocusedViewContext } from 'vs/workbench/common/contextkeys'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IWorkbenchLayoutService, LayoutSettings, Position } from 'vs/workbench/services/layout/browser/layoutService'; +import { isHorizontal, IWorkbenchLayoutService, LayoutSettings } from 'vs/workbench/services/layout/browser/layoutService'; import { IBaseActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems'; export const ViewsSubMenu = new MenuId('Views'); @@ -625,8 +625,9 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { case ViewContainerLocation.Sidebar: case ViewContainerLocation.AuxiliaryBar: return Orientation.VERTICAL; - case ViewContainerLocation.Panel: - return this.layoutService.getPanelPosition() === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; + case ViewContainerLocation.Panel: { + return isHorizontal(this.layoutService.getPanelPosition()) ? Orientation.HORIZONTAL : Orientation.VERTICAL; + } } return Orientation.VERTICAL; diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index fb05198e50bc9..d83ac066c6e21 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -516,9 +516,9 @@ const registry = Registry.as(ConfigurationExtensions.Con }, 'workbench.panel.defaultLocation': { 'type': 'string', - 'enum': ['left', 'bottom', 'right'], + 'enum': ['left', 'bottom', 'top', 'right'], 'default': 'bottom', - 'description': localize('panelDefaultLocation', "Controls the default location of the panel (Terminal, Debug Console, Output, Problems) in a new workspace. It can either show at the bottom, right, or left of the editor area."), + 'description': localize('panelDefaultLocation', "Controls the default location of the panel (Terminal, Debug Console, Output, Problems) in a new workspace. It can either show at the bottom, top, right, or left of the editor area."), }, 'workbench.panel.opensMaximized': { 'type': 'string', diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts index 57848596b7363..8e9ddcb5b6cb5 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts @@ -7,7 +7,7 @@ import { TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal' import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable, DisposableStore, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { SplitView, Orientation, IView, Sizing } from 'vs/base/browser/ui/splitview/splitview'; -import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; +import { isHorizontal, IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITerminalInstance, Direction, ITerminalGroup, ITerminalInstanceService, ITerminalConfigurationService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views'; @@ -285,7 +285,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { if (this._container) { this.attachToElement(this._container); } - this._onPanelOrientationChanged.fire(this._terminalLocation === ViewContainerLocation.Panel && this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL); + this._onPanelOrientationChanged.fire(this._terminalLocation === ViewContainerLocation.Panel && isHorizontal(this._panelPosition) ? Orientation.HORIZONTAL : Orientation.VERTICAL); this._register(toDisposable(() => { if (this._container && this._groupElement) { this._groupElement.remove(); @@ -466,7 +466,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { if (!this._splitPaneContainer) { this._panelPosition = this._layoutService.getPanelPosition(); this._terminalLocation = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID)!; - const orientation = this._terminalLocation === ViewContainerLocation.Panel && this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; + const orientation = this._terminalLocation === ViewContainerLocation.Panel && isHorizontal(this._panelPosition) ? Orientation.HORIZONTAL : Orientation.VERTICAL; this._splitPaneContainer = this._instantiationService.createInstance(SplitPaneContainer, this._groupElement, orientation); this.terminalInstances.forEach(instance => this._splitPaneContainer!.split(instance, this._activeInstanceIndex + 1)); } @@ -527,7 +527,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { const newTerminalLocation = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID)!; const terminalPositionChanged = newPanelPosition !== this._panelPosition || newTerminalLocation !== this._terminalLocation; if (terminalPositionChanged) { - const newOrientation = newTerminalLocation === ViewContainerLocation.Panel && newPanelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; + const newOrientation = newTerminalLocation === ViewContainerLocation.Panel && isHorizontal(newPanelPosition) ? Orientation.HORIZONTAL : Orientation.VERTICAL; this._splitPaneContainer.setOrientation(newOrientation); this._panelPosition = newPanelPosition; this._terminalLocation = newTerminalLocation; @@ -563,7 +563,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { } private _getOrientation(): Orientation { - return this._getPosition() === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; + return isHorizontal(this._getPosition()) ? Orientation.HORIZONTAL : Orientation.VERTICAL; } resizePane(direction: Direction): void { @@ -588,10 +588,12 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { if (shouldResizePart) { + const position = this._getPosition(); const shouldShrink = - (this._getPosition() === Position.LEFT && direction === Direction.Left) || - (this._getPosition() === Position.RIGHT && direction === Direction.Right) || - (this._getPosition() === Position.BOTTOM && direction === Direction.Down); + (position === Position.LEFT && direction === Direction.Left) || + (position === Position.RIGHT && direction === Direction.Right) || + (position === Position.BOTTOM && direction === Direction.Down) || + (position === Position.TOP && direction === Direction.Up); if (shouldShrink) { resizeAmount *= -1; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index a48841d980289..6310485b23ba8 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -79,7 +79,7 @@ import { getWorkspaceForTerminal, preparePathForShell } from 'vs/workbench/contr import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; -import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; +import { isHorizontal, IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { importAMDNodeModule } from 'vs/amdX'; @@ -2413,7 +2413,7 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID private _getViewOrientation(): Orientation { const panelPosition = this._layoutService.getPanelPosition(); const terminalLocation = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID); - return terminalLocation === ViewContainerLocation.Panel && panelPosition === Position.BOTTOM + return terminalLocation === ViewContainerLocation.Panel && isHorizontal(panelPosition) ? Orientation.HORIZONTAL : Orientation.VERTICAL; } diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index 2955a53995c37..43e124fa05f5e 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -70,7 +70,12 @@ export const enum EditorActionsLocation { export const enum Position { LEFT, RIGHT, - BOTTOM + BOTTOM, + TOP +} + +export function isHorizontal(position: Position): boolean { + return position === Position.BOTTOM || position === Position.TOP; } export const enum PanelOpensMaximizedOptions { @@ -86,6 +91,7 @@ export function positionToString(position: Position): string { case Position.LEFT: return 'left'; case Position.RIGHT: return 'right'; case Position.BOTTOM: return 'bottom'; + case Position.TOP: return 'top'; default: return 'bottom'; } } @@ -93,7 +99,8 @@ export function positionToString(position: Position): string { const positionsByString: { [key: string]: Position } = { [positionToString(Position.LEFT)]: Position.LEFT, [positionToString(Position.RIGHT)]: Position.RIGHT, - [positionToString(Position.BOTTOM)]: Position.BOTTOM + [positionToString(Position.BOTTOM)]: Position.BOTTOM, + [positionToString(Position.TOP)]: Position.TOP }; export function positionFromString(str: string): Position { From 33abd96b99731bcfb9933ecd3d4410d2afe9d865 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Jul 2024 22:08:24 +0200 Subject: [PATCH 719/755] Git - add actions to incoming/outgoing header (#221221) --- extensions/git/package.json | 23 +++++++ .../common/extensionsApiProposals.ts | 3 + .../contrib/scm/browser/scmViewPane.ts | 63 ++++++++++++++----- .../actions/common/menusExtensionPoint.ts | 6 ++ ...ibSourceControlHistoryItemChangesMenu.d.ts | 7 +++ 5 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts diff --git a/extensions/git/package.json b/extensions/git/package.json index f2445eb3978e7..ccac6222db925 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -16,6 +16,7 @@ "contribMergeEditorMenus", "contribMultiDiffEditorMenus", "contribDiffEditorGutterToolBarMenus", + "contribSourceControlHistoryItemChangesMenu", "contribSourceControlHistoryItemGroupMenu", "contribSourceControlHistoryItemMenu", "contribSourceControlInputBoxMenu", @@ -1915,6 +1916,28 @@ "group": "1_modification@3" } ], + "scm/historyItemChanges/title": [ + { + "command": "git.fetchRef", + "group": "navigation@1", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote" + }, + { + "command": "git.pullRef", + "group": "navigation@2", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote" + }, + { + "command": "git.pushRef", + "when": "scmProvider == git && scmHistoryItemGroupHasRemote", + "group": "navigation@3" + }, + { + "command": "git.publish", + "when": "scmProvider == git && !scmHistoryItemGroupHasRemote", + "group": "navigation@3" + } + ], "scm/incomingChanges": [ { "command": "git.fetchRef", diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index a3f677336d139..dd767bf8a0705 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -118,6 +118,9 @@ const _allApiProposals = { contribShareMenu: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribShareMenu.d.ts', }, + contribSourceControlHistoryItemChangesMenu: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts', + }, contribSourceControlHistoryItemGroupMenu: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemGroupMenu.d.ts', }, diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 67564cd4aabae..77d39d94f9d5d 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -96,7 +96,7 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { stripIcons } from 'vs/base/common/iconLabels'; import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { editorSelectionBackground, foreground, inputBackground, inputForeground, listActiveSelectionForeground, registerColor, selectionBackground, transparent } from 'vs/platform/theme/common/colorRegistry'; -import { IMenuWorkbenchToolBarOptions, MenuWorkbenchToolBar, WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; +import { IMenuWorkbenchToolBarOptions, WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; import { clamp, rot } from 'vs/base/common/numbers'; @@ -1201,7 +1201,9 @@ class HistoryItemChangeRenderer implements ICompressibleTreeRenderer { @@ -1226,31 +1228,46 @@ class SeparatorRenderer implements ICompressibleTreeRenderer('scm.experimental.showHistoryGraph') !== true) { - const toolBar = new MenuWorkbenchToolBar(append(element, $('.actions')), MenuId.SCMChangesSeparator, { moreIcon: Codicon.gear }, this.menuService, this.contextKeyService, this.contextMenuService, this.keybindingService, this.commandService, this.telemetryService); - disposables.add(toolBar); - } + const options = { moreIcon: this.configurationService.getValue('scm.experimental.showHistoryGraph') === true ? Codicon.more : Codicon.gear } satisfies IMenuWorkbenchToolBarOptions; + const toolBar = new WorkbenchToolBar(append(element, $('.actions')), options, this.menuService, this.contextKeyService, this.contextMenuService, this.keybindingService, this.commandService, this.telemetryService); + templateDisposables.add(toolBar); - return { label, disposables }; + return { label, toolBar, elementDisposables: new DisposableStore(), templateDisposables }; } renderElement(element: ITreeNode, index: number, templateData: SeparatorTemplate, height: number | undefined): void { + const currentHistoryItemGroup = element.element.repository.provider.historyProvider?.currentHistoryItemGroup; + + // Label templateData.label.setLabel(element.element.label, undefined, { title: element.element.ariaLabel }); + + // Toolbar + const contextKeyService = this.contextKeyService.createOverlay([ + ['scmHistoryItemGroupHasRemote', !!currentHistoryItemGroup?.remote], + ]); + const menu = this.menuService.createMenu(MenuId.SCMChangesSeparator, contextKeyService); + templateData.elementDisposables.add(connectPrimaryMenu(menu, (primary, secondary) => { + templateData.toolBar.setActions(primary, secondary, [MenuId.SCMChangesSeparator]); + })); } renderCompressedElements(node: ITreeNode, void>, index: number, templateData: SeparatorTemplate, height: number | undefined): void { throw new Error('Should never happen since node is incompressible'); } - disposeTemplate(templateData: SeparatorTemplate): void { - templateData.disposables.dispose(); + disposeElement(node: ITreeNode, index: number, templateData: SeparatorTemplate, height: number | undefined): void { + templateData.elementDisposables.clear(); } + disposeTemplate(templateData: SeparatorTemplate): void { + templateData.elementDisposables.dispose(); + templateData.templateDisposables.dispose(); + } } class ListDelegate implements IListVirtualDelegate { @@ -1672,14 +1689,16 @@ MenuRegistry.appendMenuItem(MenuId.SCMChangesSeparator, { title: localize('incomingChanges', "Show Incoming Changes"), submenu: MenuId.SCMIncomingChangesSetting, group: '1_incoming&outgoing', - order: 1 + order: 1, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); MenuRegistry.appendMenuItem(Menus.ChangesSettings, { title: localize('incomingChanges', "Show Incoming Changes"), submenu: MenuId.SCMIncomingChangesSetting, group: '1_incoming&outgoing', - order: 1 + order: 1, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); registerAction2(class extends SCMChangesSettingAction { @@ -1723,14 +1742,16 @@ MenuRegistry.appendMenuItem(MenuId.SCMChangesSeparator, { title: localize('outgoingChanges', "Show Outgoing Changes"), submenu: MenuId.SCMOutgoingChangesSetting, group: '1_incoming&outgoing', - order: 2 + order: 2, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); MenuRegistry.appendMenuItem(Menus.ChangesSettings, { title: localize('outgoingChanges', "Show Outgoing Changes"), submenu: MenuId.SCMOutgoingChangesSetting, group: '1_incoming&outgoing', - order: 2 + order: 2, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) }); registerAction2(class extends SCMChangesSettingAction { @@ -1781,8 +1802,16 @@ registerAction2(class extends Action2 { f1: false, toggled: ContextKeyExpr.equals('config.scm.showChangesSummary', true), menu: [ - { id: MenuId.SCMChangesSeparator, order: 3 }, - { id: Menus.ChangesSettings, order: 3 }, + { + id: MenuId.SCMChangesSeparator, + order: 3, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) + }, + { + id: Menus.ChangesSettings, + order: 3, + when: ContextKeyExpr.equals('config.scm.experimental.showHistoryGraph', false) + }, ] }); } diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index 9e34f460806d8..17d4e15c4facf 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -169,6 +169,12 @@ const apiMenus: IAPIMenu[] = [ description: localize('menus.input', "The Source Control input box menu"), proposed: 'contribSourceControlInputBoxMenu' }, + { + key: 'scm/historyItemChanges/title', + id: MenuId.SCMChangesSeparator, + description: localize('menus.historyItemChanges', "The Source Control incoming/outgoing changes title menu"), + proposed: 'contribSourceControlHistoryItemChangesMenu' + }, { key: 'scm/incomingChanges', id: MenuId.SCMIncomingChanges, diff --git a/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts b/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts new file mode 100644 index 0000000000000..a9d758fa24b0b --- /dev/null +++ b/src/vscode-dts/vscode.proposed.contribSourceControlHistoryItemChangesMenu.d.ts @@ -0,0 +1,7 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// empty placeholder declaration for the `scm/historyItemChanges/title`-menu contribution point +// https://github.com/microsoft/vscode/issues/201997 From 6c907814bfc223e842aa0d82e69a467ce4f76223 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Mon, 8 Jul 2024 14:40:09 -0700 Subject: [PATCH 720/755] feat: support button titles in chat confirmation api (#221223) --- src/vs/workbench/api/common/extHostChatAgents2.ts | 4 ++-- .../workbench/api/common/extHostTypeConverters.ts | 3 ++- src/vs/workbench/api/common/extHostTypes.ts | 5 ++++- .../chatConfirmationContentPart.ts | 14 ++++++++++---- .../workbench/contrib/chat/common/chatService.ts | 1 + .../vscode.proposed.chatParticipantAdditions.d.ts | 5 +++-- 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index 8b2209b536326..e029c680e427c 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -212,11 +212,11 @@ class ChatAgentResponseStream { _report(dto); return this; }, - confirmation(title, message, data) { + confirmation(title, message, data, buttons) { throwIfDone(this.confirmation); checkProposedApiEnabled(that._extension, 'chatParticipantAdditions'); - const part = new extHostTypes.ChatResponseConfirmationPart(title, message, data); + const part = new extHostTypes.ChatResponseConfirmationPart(title, message, data, buttons); const dto = typeConvert.ChatResponseConfirmationPart.from(part); _report(dto); return this; diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 6fad560a437c9..527139f87f478 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2354,7 +2354,8 @@ export namespace ChatResponseConfirmationPart { kind: 'confirmation', title: part.title, message: part.message, - data: part.data + data: part.data, + buttons: part.buttons }; } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 18c2eefe79db6..581f4020c8c6f 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4377,10 +4377,13 @@ export class ChatResponseConfirmationPart { title: string; message: string; data: any; - constructor(title: string, message: string, data: any) { + buttons?: string[]; + + constructor(title: string, message: string, data: any, buttons?: string[]) { this.title = title; this.message = message; this.data = data; + this.buttons = buttons; } } diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts index 4159f07c91998..3748611876266 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatConfirmationContentPart.ts @@ -28,10 +28,16 @@ export class ChatConfirmationContentPart extends Disposable implements IChatCont super(); const element = context.element; - const confirmationWidget = this._register(this.instantiationService.createInstance(ChatConfirmationWidget, confirmation.title, confirmation.message, [ - { label: localize('accept', "Accept"), data: confirmation.data }, - { label: localize('dismiss', "Dismiss"), data: confirmation.data, isSecondary: true }, - ])); + const buttons = confirmation.buttons + ? confirmation.buttons.map(button => ({ + label: button, + data: confirmation.data + })) + : [ + { label: localize('accept', "Accept"), data: confirmation.data }, + { label: localize('dismiss', "Dismiss"), data: confirmation.data, isSecondary: true }, + ]; + const confirmationWidget = this._register(this.instantiationService.createInstance(ChatConfirmationWidget, confirmation.title, confirmation.message, buttons)); confirmationWidget.setShowButtons(!confirmation.isUsed); this._register(confirmationWidget.onDidClick(async e => { diff --git a/src/vs/workbench/contrib/chat/common/chatService.ts b/src/vs/workbench/contrib/chat/common/chatService.ts index f10564d782800..645ba778d362e 100644 --- a/src/vs/workbench/contrib/chat/common/chatService.ts +++ b/src/vs/workbench/contrib/chat/common/chatService.ts @@ -160,6 +160,7 @@ export interface IChatConfirmation { title: string; message: string; data: any; + buttons?: string[]; isUsed?: boolean; kind: 'confirmation'; } diff --git a/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts index cd2ec7ba91910..ab43814c4f487 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts @@ -59,7 +59,8 @@ declare module 'vscode' { title: string; message: string; data: any; - constructor(title: string, message: string, data: any); + buttons?: string[]; + constructor(title: string, message: string, data: any, buttons?: string[]); } export type ExtendedChatResponsePart = ChatResponsePart | ChatResponseTextEditPart | ChatResponseDetectedParticipantPart | ChatResponseConfirmationPart; @@ -102,7 +103,7 @@ declare module 'vscode' { * TODO@API should this be MarkdownString? * TODO@API should actually be a more generic function that takes an array of buttons */ - confirmation(title: string, message: string, data: any): void; + confirmation(title: string, message: string, data: any, buttons?: string[]): void; /** * Push a warning to this stream. Short-hand for From 1b24381b5c1bc52636191a8db7b5e5e8445194a8 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 8 Jul 2024 15:19:40 -0700 Subject: [PATCH 721/755] Adopt `getAccounts` API in GitHub Authentication (#221224) This allows the GitHub Auth provider to take in a account per this proposal: https://github.com/microsoft/vscode/blob/417dddb83f3536479f88c40e1d78edf1136a5ae5/src/vscode-dts/vscode.proposed.authGetSessions.d.ts#L35-L69 Additionally, this makes an additional small change that allows `clearSessionPreference` to work in single-account auth providers. --- extensions/github-authentication/package.json | 3 + extensions/github-authentication/src/flows.ts | 4 ++ .../github-authentication/src/github.ts | 67 ++++++++++++++++--- .../github-authentication/tsconfig.json | 3 +- .../api/browser/mainThreadAuthentication.ts | 24 +++---- 5 files changed, 80 insertions(+), 21 deletions(-) diff --git a/extensions/github-authentication/package.json b/extensions/github-authentication/package.json index 2d2bea562771b..ed024ee59b8f0 100644 --- a/extensions/github-authentication/package.json +++ b/extensions/github-authentication/package.json @@ -13,6 +13,9 @@ "Other" ], "api": "none", + "enabledApiProposals": [ + "authGetSessions" + ], "extensionKind": [ "ui", "workspace" diff --git a/extensions/github-authentication/src/flows.ts b/extensions/github-authentication/src/flows.ts index 7498a2b22025a..a2497b2b0b2e7 100644 --- a/extensions/github-authentication/src/flows.ts +++ b/extensions/github-authentication/src/flows.ts @@ -173,6 +173,8 @@ const allFlows: IFlow[] = [ ]); if (existingLogin) { searchParams.append('login', existingLogin); + } else { + searchParams.append('prompt', 'select_account'); } // The extra toString, parse is apparently needed for env.openExternal @@ -240,6 +242,8 @@ const allFlows: IFlow[] = [ ]); if (existingLogin) { searchParams.append('login', existingLogin); + } else { + searchParams.append('prompt', 'select_account'); } const loginUrl = baseUri.with({ diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts index 15fe2ef04f894..08fb16730e6b4 100644 --- a/extensions/github-authentication/src/github.ts +++ b/extensions/github-authentication/src/github.ts @@ -11,7 +11,7 @@ import { PromiseAdapter, arrayEquals, promiseFromEvent } from './common/utils'; import { ExperimentationTelemetry } from './common/experimentationService'; import { Log } from './common/logger'; import { crypto } from './node/crypto'; -import { TIMED_OUT_ERROR, USER_CANCELLATION_ERROR } from './common/errors'; +import { CANCELLATION_ERROR, TIMED_OUT_ERROR, USER_CANCELLATION_ERROR } from './common/errors'; interface SessionData { id: string; @@ -148,14 +148,17 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid return this._sessionChangeEmitter.event; } - async getSessions(scopes?: string[]): Promise { + async getSessions(scopes: string[] | undefined, options?: vscode.AuthenticationProviderSessionOptions): Promise { // For GitHub scope list, order doesn't matter so we immediately sort the scopes const sortedScopes = scopes?.sort() || []; this._logger.info(`Getting sessions for ${sortedScopes.length ? sortedScopes.join(',') : 'all scopes'}...`); const sessions = await this._sessionsPromise; - const finalSessions = sortedScopes.length - ? sessions.filter(session => arrayEquals([...session.scopes].sort(), sortedScopes)) + const accountFilteredSessions = options?.account + ? sessions.filter(session => session.account.label === options.account?.label) : sessions; + const finalSessions = sortedScopes.length + ? accountFilteredSessions.filter(session => arrayEquals([...session.scopes].sort(), sortedScopes)) + : accountFilteredSessions; this._logger.info(`Got ${finalSessions.length} sessions for ${sortedScopes?.join(',') ?? 'all scopes'}...`); return finalSessions; @@ -279,7 +282,7 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid this._logger.info(`Stored ${sessions.length} sessions!`); } - public async createSession(scopes: string[]): Promise { + public async createSession(scopes: string[], options?: vscode.AuthenticationProviderSessionOptions): Promise { try { // For GitHub scope list, order doesn't matter so we use a sorted scope to determine // if we've got a session already. @@ -298,11 +301,59 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid const sessions = await this._sessionsPromise; - const accounts = new Set(sessions.map(session => session.account.label)); - const existingLogin = accounts.size <= 1 ? sessions[0]?.account.label : await vscode.window.showQuickPick([...accounts], { placeHolder: 'Choose an account that you would like to log in to' }); + let forcedLogin = options?.account?.label; + let backupLogin: string | undefined; + if (!forcedLogin) { + const accounts = new Set(sessions.map(session => session.account.label)); + this._logger.info(`Found ${accounts.size} accounts.`); + // This helps us tell GitHub that we're already logged in to an account/accounts + // and should probably use it. The user _can_ sign in to a different account + // if they want to, in the browser, but this is a good default for the happy path. + if (accounts.size > 1) { + // If there are multiple accounts, we should prompt the user to choose one. + const newAccount = vscode.l10n.t('New account...'); + const accountChoiceResult = await vscode.window.showQuickPick( + [...accounts, newAccount], + { placeHolder: vscode.l10n.t('Choose an account that you would like to log in to') } + ); + forcedLogin = accountChoiceResult === newAccount ? undefined : accountChoiceResult; + } else { + // If there is only one account, we can use that to seed the login, but + // we don't want to force the user to use it. + backupLogin = sessions[0]?.account.label; + } + } + this._logger.info(`Logging in with '${forcedLogin ? forcedLogin : 'any'}' account...`); + const scopeString = sortedScopes.join(' '); - const token = await this._githubServer.login(scopeString, existingLogin); + const token = await this._githubServer.login(scopeString, forcedLogin ?? backupLogin); const session = await this.tokenToSession(token, scopes); + + // If an account was specified, we should ensure that the token we got back is for that account. + if (forcedLogin) { + if (session.account.label !== forcedLogin) { + const keepNewAccount = vscode.l10n.t('Keep {0}', session.account.label); + const tryAgain = vscode.l10n.t('Login with {0}', forcedLogin); + const result = await vscode.window.showWarningMessage( + vscode.l10n.t('Incorrect account detected'), + { modal: true, detail: vscode.l10n.t('The chosen account, {0}, does not match the requested account, {1}.', session.account.label, forcedLogin) }, + keepNewAccount, + tryAgain + ); + if (result === tryAgain) { + return await this.createSession(scopes, { + ...options, + // The id doesn't matter here, we just need to pass the label through + account: { id: forcedLogin, label: forcedLogin } + }); + } + // Cancelled result + if (!result) { + throw new Error(CANCELLATION_ERROR); + } + // Keep result continues on + } + } this.afterSessionLoad(session); const sessionIndex = sessions.findIndex(s => s.id === session.id || arrayEquals([...s.scopes].sort(), sortedScopes)); diff --git a/extensions/github-authentication/tsconfig.json b/extensions/github-authentication/tsconfig.json index 5e4713e9f3bc5..70eba984a2694 100644 --- a/extensions/github-authentication/tsconfig.json +++ b/extensions/github-authentication/tsconfig.json @@ -12,6 +12,7 @@ }, "include": [ "src/**/*", - "../../src/vscode-dts/vscode.d.ts" + "../../src/vscode-dts/vscode.d.ts", + "../../src/vscode-dts/vscode.proposed.authGetSessions.d.ts" ] } diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index 5780ec8797e74..d833eab2860c2 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -174,21 +174,21 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu throw new Error('Invalid combination of options. Please remove one of the following: createIfNone, silent'); } + if (options.clearSessionPreference) { + // Clearing the session preference is usually paired with createIfNone, so just remove the preference and + // defer to the rest of the logic in this function to choose the session. + this.authenticationExtensionsService.removeSessionPreference(providerId, extensionId, scopes); + } + // Check if the sessions we have are valid if (!options.forceNewSession && sessions.length) { if (provider.supportsMultipleAccounts) { - if (options.clearSessionPreference) { - // Clearing the session preference is usually paired with createIfNone, so just remove the preference and - // defer to the rest of the logic in this function to choose the session. - this.authenticationExtensionsService.removeSessionPreference(providerId, extensionId, scopes); - } else { - // If we have an existing session preference, use that. If not, we'll return any valid session at the end of this function. - const existingSessionPreference = this.authenticationExtensionsService.getSessionPreference(providerId, extensionId, scopes); - if (existingSessionPreference) { - const matchingSession = sessions.find(session => session.id === existingSessionPreference); - if (matchingSession && this.authenticationAccessService.isAccessAllowed(providerId, matchingSession.account.label, extensionId)) { - return matchingSession; - } + // If we have an existing session preference, use that. If not, we'll return any valid session at the end of this function. + const existingSessionPreference = this.authenticationExtensionsService.getSessionPreference(providerId, extensionId, scopes); + if (existingSessionPreference) { + const matchingSession = sessions.find(session => session.id === existingSessionPreference); + if (matchingSession && this.authenticationAccessService.isAccessAllowed(providerId, matchingSession.account.label, extensionId)) { + return matchingSession; } } } else if (this.authenticationAccessService.isAccessAllowed(providerId, sessions[0].account.label, extensionId)) { From b2af4e7d34cc7bb96b5c0589549e1ffa15ee0e3b Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 8 Jul 2024 15:27:24 -0700 Subject: [PATCH 722/755] testing: add stack trace proposal and split out test results view The test results view was 2k+ lines, time to split it up a bit. --- .../common/extensionsApiProposals.ts | 3 + .../workbench/api/common/extHost.api.impl.ts | 2 + .../api/common/extHostTypeConverters.ts | 5 + src/vs/workbench/api/common/extHostTypes.ts | 17 +- .../testResultsView/testResultsOutput.ts | 545 +++++++ .../testResultsView/testResultsSubject.ts | 94 ++ .../testResultsView/testResultsTree.ts | 853 ++++++++++ .../testing/browser/testingOutputPeek.ts | 1431 +---------------- .../contrib/testing/common/testTypes.ts | 33 + ...vscode.proposed.testMessageStackTrace.d.ts | 38 + 10 files changed, 1606 insertions(+), 1415 deletions(-) create mode 100644 src/vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput.ts create mode 100644 src/vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject.ts create mode 100644 src/vs/workbench/contrib/testing/browser/testResultsView/testResultsTree.ts create mode 100644 src/vscode-dts/vscode.proposed.testMessageStackTrace.d.ts diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index dd767bf8a0705..0429fdd1510f4 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -344,6 +344,9 @@ const _allApiProposals = { terminalShellIntegration: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalShellIntegration.d.ts', }, + testMessageStackTrace: { + proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testMessageStackTrace.d.ts', + }, testObserver: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testObserver.d.ts', }, diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index b6b4f5746bb65..7847141b2f167 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1686,6 +1686,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I TestResultState: extHostTypes.TestResultState, TestRunRequest: extHostTypes.TestRunRequest, TestMessage: extHostTypes.TestMessage, + TestMessage2: extHostTypes.TestMessage, + TestMessageStackFrame: extHostTypes.TestMessageStackFrame, TestTag: extHostTypes.TestTag, TestRunProfileKind: extHostTypes.TestRunProfileKind, TextSearchCompleteMessageType: TextSearchCompleteMessageType, diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 6fad560a437c9..f3689b5093205 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -1888,6 +1888,11 @@ export namespace TestMessage { actual: message.actualOutput, contextValue: message.contextValue, location: message.location && ({ range: Range.from(message.location.range), uri: message.location.uri }), + stackTrace: (message as vscode.TestMessage2).stackTrace?.map(s => ({ + label: s.label, + position: s.position && Position.from(s.position), + uri: s.file && URI.revive(s.file).toJSON(), + })), }; } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 18c2eefe79db6..b757ae7e0604c 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4069,9 +4069,11 @@ export class TestMessage implements vscode.TestMessage { public expectedOutput?: string; public actualOutput?: string; public location?: vscode.Location; - /** proposed: */ public contextValue?: string; + /** proposed: */ + public stackTrace?: TestMessageStackFrame[]; + public static diff(message: string | vscode.MarkdownString, expected: string, actual: string) { const msg = new TestMessage(message); msg.expectedOutput = expected; @@ -4087,6 +4089,19 @@ export class TestTag implements vscode.TestTag { constructor(public readonly id: string) { } } +export class TestMessageStackFrame { + /** + * @param label The name of the stack frame + * @param file The file URI of the stack frame + * @param position The position of the stack frame within the file + */ + constructor( + public label: string, + public file?: vscode.Uri, + public position?: Position, + ) { } +} + //#endregion //#region Test Coverage diff --git a/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput.ts b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput.ts new file mode 100644 index 0000000000000..673f895b85405 --- /dev/null +++ b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput.ts @@ -0,0 +1,545 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; +import { Delayer } from 'vs/base/common/async'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; +import { Iterable } from 'vs/base/common/iterator'; +import { Lazy } from 'vs/base/common/lazy'; +import { Disposable, IDisposable, IReference, MutableDisposable, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { ICodeEditor, IDiffEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; +import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; +import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/diffEditorWidget'; +import { EmbeddedDiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/embeddedDiffEditorWidget'; +import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; +import { IDiffEditorOptions, IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; +import { peekViewResultsBackground } from 'vs/editor/contrib/peekView/browser/peekView'; +import { localize } from 'vs/nls'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; +import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore'; +import { formatMessageForTerminal } from 'vs/platform/terminal/common/terminalStrings'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { EditorModel } from 'vs/workbench/common/editor/editorModel'; +import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { DetachedProcessInfo } from 'vs/workbench/contrib/terminal/browser/detachedTerminal'; +import { IDetachedTerminalInstance, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { getXtermScaledDimensions } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; +import { TERMINAL_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; +import { colorizeTestMessageInEditor } from 'vs/workbench/contrib/testing/browser/testMessageColorizer'; +import { InspectSubject, MessageSubject, TaskSubject, TestOutputSubject } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject'; +import { Testing } from 'vs/workbench/contrib/testing/common/constants'; +import { MutableObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; +import { ITaskRawOutput, ITestResult, ITestRunTaskResults, LiveTestResult, TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/testResult'; +import { ITestMessage, TestMessageType, getMarkId } from 'vs/workbench/contrib/testing/common/testTypes'; + + +class SimpleDiffEditorModel extends EditorModel { + public readonly original = this._original.object.textEditorModel; + public readonly modified = this._modified.object.textEditorModel; + + constructor( + private readonly _original: IReference, + private readonly _modified: IReference, + ) { + super(); + } + + public override dispose() { + super.dispose(); + this._original.dispose(); + this._modified.dispose(); + } +} + + +export interface IPeekOutputRenderer extends IDisposable { + /** Updates the displayed test. Should clear if it cannot display the test. */ + update(subject: InspectSubject): void; + /** Recalculate content layout. */ + layout(dimension: dom.IDimension): void; + /** Dispose the content provider. */ + dispose(): void; +} + +const commonEditorOptions: IEditorOptions = { + scrollBeyondLastLine: false, + links: true, + lineNumbers: 'off', + scrollbar: { + verticalScrollbarSize: 14, + horizontal: 'auto', + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false, + alwaysConsumeMouseWheel: false + }, + fixedOverflowWidgets: true, + readOnly: true, + minimap: { + enabled: false + }, + wordWrap: 'on', +}; + +const diffEditorOptions: IDiffEditorConstructionOptions = { + ...commonEditorOptions, + enableSplitViewResizing: true, + isInEmbeddedEditor: true, + renderOverviewRuler: false, + ignoreTrimWhitespace: false, + renderSideBySide: true, + useInlineViewWhenSpaceIsLimited: false, + originalAriaLabel: localize('testingOutputExpected', 'Expected result'), + modifiedAriaLabel: localize('testingOutputActual', 'Actual result'), + diffAlgorithm: 'advanced', +}; + + +export class DiffContentProvider extends Disposable implements IPeekOutputRenderer { + private readonly widget = this._register(new MutableDisposable()); + private readonly model = this._register(new MutableDisposable()); + private dimension?: dom.IDimension; + + constructor( + private readonly editor: ICodeEditor | undefined, + private readonly container: HTMLElement, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @ITextModelService private readonly modelService: ITextModelService, + ) { + super(); + } + + public async update(subject: InspectSubject) { + if (!(subject instanceof MessageSubject)) { + return this.clear(); + } + const message = subject.message; + if (!ITestMessage.isDiffable(message)) { + return this.clear(); + } + + const [original, modified] = await Promise.all([ + this.modelService.createModelReference(subject.expectedUri), + this.modelService.createModelReference(subject.actualUri), + ]); + + const model = this.model.value = new SimpleDiffEditorModel(original, modified); + if (!this.widget.value) { + this.widget.value = this.editor ? this.instantiationService.createInstance( + EmbeddedDiffEditorWidget, + this.container, + diffEditorOptions, + {}, + this.editor, + ) : this.instantiationService.createInstance( + DiffEditorWidget, + this.container, + diffEditorOptions, + {}, + ); + + if (this.dimension) { + this.widget.value.layout(this.dimension); + } + } + + this.widget.value.setModel(model); + this.widget.value.updateOptions(this.getOptions( + isMultiline(message.expected) || isMultiline(message.actual) + )); + } + + private clear() { + this.model.clear(); + this.widget.clear(); + } + + public layout(dimensions: dom.IDimension) { + this.dimension = dimensions; + this.widget.value?.layout(dimensions); + } + + protected getOptions(isMultiline: boolean): IDiffEditorOptions { + return isMultiline + ? { ...diffEditorOptions, lineNumbers: 'on' } + : { ...diffEditorOptions, lineNumbers: 'off' }; + } +} + +class ScrollableMarkdownMessage extends Disposable { + private readonly scrollable: DomScrollableElement; + private readonly element: HTMLElement; + + constructor(container: HTMLElement, markdown: MarkdownRenderer, message: IMarkdownString) { + super(); + + const rendered = this._register(markdown.render(message, {})); + rendered.element.style.height = '100%'; + rendered.element.style.userSelect = 'text'; + container.appendChild(rendered.element); + this.element = rendered.element; + + this.scrollable = this._register(new DomScrollableElement(rendered.element, { + className: 'preview-text', + })); + container.appendChild(this.scrollable.getDomNode()); + + this._register(toDisposable(() => { + this.scrollable.getDomNode().remove(); + })); + + this.scrollable.scanDomNode(); + } + + public layout(height: number, width: number) { + // Remove padding of `.monaco-editor .zone-widget.test-output-peek .preview-text` + this.scrollable.setScrollDimensions({ + width: width - 32, + height: height - 16, + scrollWidth: this.element.scrollWidth, + scrollHeight: this.element.scrollHeight + }); + } +} + +export class MarkdownTestMessagePeek extends Disposable implements IPeekOutputRenderer { + private readonly markdown = new Lazy( + () => this._register(this.instantiationService.createInstance(MarkdownRenderer, {})), + ); + + private readonly textPreview = this._register(new MutableDisposable()); + + constructor(private readonly container: HTMLElement, @IInstantiationService private readonly instantiationService: IInstantiationService) { + super(); + } + + public update(subject: InspectSubject): void { + if (!(subject instanceof MessageSubject)) { + return this.textPreview.clear(); + } + + const message = subject.message; + if (ITestMessage.isDiffable(message) || typeof message.message === 'string') { + return this.textPreview.clear(); + } + + this.textPreview.value = new ScrollableMarkdownMessage( + this.container, + this.markdown.value, + message.message as IMarkdownString, + ); + } + + public layout(dimension: dom.IDimension): void { + this.textPreview.value?.layout(dimension.height, dimension.width); + } +} + +export class PlainTextMessagePeek extends Disposable implements IPeekOutputRenderer { + private readonly widgetDecorations = this._register(new MutableDisposable()); + private readonly widget = this._register(new MutableDisposable()); + private readonly model = this._register(new MutableDisposable()); + private dimension?: dom.IDimension; + + constructor( + private readonly editor: ICodeEditor | undefined, + private readonly container: HTMLElement, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @ITextModelService private readonly modelService: ITextModelService, + ) { + super(); + } + + public async update(subject: InspectSubject) { + if (!(subject instanceof MessageSubject)) { + return this.clear(); + } + + const message = subject.message; + if (ITestMessage.isDiffable(message) || message.type === TestMessageType.Output || typeof message.message !== 'string') { + return this.clear(); + } + + const modelRef = this.model.value = await this.modelService.createModelReference(subject.messageUri); + if (!this.widget.value) { + this.widget.value = this.editor ? this.instantiationService.createInstance( + EmbeddedCodeEditorWidget, + this.container, + commonEditorOptions, + {}, + this.editor, + ) : this.instantiationService.createInstance( + CodeEditorWidget, + this.container, + commonEditorOptions, + { isSimpleWidget: true } + ); + + if (this.dimension) { + this.widget.value.layout(this.dimension); + } + } + + this.widget.value.setModel(modelRef.object.textEditorModel); + this.widget.value.updateOptions(commonEditorOptions); + this.widgetDecorations.value = colorizeTestMessageInEditor(message.message, this.widget.value); + } + + private clear() { + this.widgetDecorations.clear(); + this.widget.clear(); + this.model.clear(); + } + + public layout(dimensions: dom.IDimension) { + this.dimension = dimensions; + this.widget.value?.layout(dimensions); + } +} + +export class TerminalMessagePeek extends Disposable implements IPeekOutputRenderer { + private dimensions?: dom.IDimension; + private readonly terminalCwd = this._register(new MutableObservableValue('')); + private readonly xtermLayoutDelayer = this._register(new Delayer(50)); + + /** Active terminal instance. */ + private readonly terminal = this._register(new MutableDisposable()); + /** Listener for streaming result data */ + private readonly outputDataListener = this._register(new MutableDisposable()); + + constructor( + private readonly container: HTMLElement, + private readonly isInPeekView: boolean, + @ITerminalService private readonly terminalService: ITerminalService, + @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, + @IWorkspaceContextService private readonly workspaceContext: IWorkspaceContextService, + ) { + super(); + } + + private async makeTerminal() { + const prev = this.terminal.value; + if (prev) { + prev.xterm.clearBuffer(); + prev.xterm.clearSearchDecorations(); + // clearBuffer tries to retain the prompt line, but this doesn't exist for tests. + // So clear the screen (J) and move to home (H) to ensure previous data is cleaned up. + prev.xterm.write(`\x1b[2J\x1b[0;0H`); + return prev; + } + + const capabilities = new TerminalCapabilityStore(); + const cwd = this.terminalCwd; + capabilities.add(TerminalCapability.CwdDetection, { + type: TerminalCapability.CwdDetection, + get cwds() { return [cwd.value]; }, + onDidChangeCwd: cwd.onDidChange, + getCwd: () => cwd.value, + updateCwd: () => { }, + }); + + return this.terminal.value = await this.terminalService.createDetachedTerminal({ + rows: 10, + cols: 80, + readonly: true, + capabilities, + processInfo: new DetachedProcessInfo({ initialCwd: cwd.value }), + colorProvider: { + getBackgroundColor: theme => { + const terminalBackground = theme.getColor(TERMINAL_BACKGROUND_COLOR); + if (terminalBackground) { + return terminalBackground; + } + if (this.isInPeekView) { + return theme.getColor(peekViewResultsBackground); + } + const location = this.viewDescriptorService.getViewLocationById(Testing.ResultsViewId); + return location === ViewContainerLocation.Panel + ? theme.getColor(PANEL_BACKGROUND) + : theme.getColor(SIDE_BAR_BACKGROUND); + }, + } + }); + } + + public async update(subject: InspectSubject) { + this.outputDataListener.clear(); + if (subject instanceof TaskSubject) { + await this.updateForTaskSubject(subject); + } else if (subject instanceof TestOutputSubject || (subject instanceof MessageSubject && subject.message.type === TestMessageType.Output)) { + await this.updateForTestSubject(subject); + } else { + this.clear(); + } + } + + private async updateForTestSubject(subject: TestOutputSubject | MessageSubject) { + const that = this; + const testItem = subject instanceof TestOutputSubject ? subject.test.item : subject.test; + const terminal = await this.updateGenerically({ + subject, + noOutputMessage: localize('caseNoOutput', 'The test case did not report any output.'), + getTarget: result => result?.tasks[subject.taskIndex].output, + *doInitialWrite(output, results) { + that.updateCwd(testItem.uri); + const state = subject instanceof TestOutputSubject ? subject.test : results.getStateById(testItem.extId); + if (!state) { + return; + } + + for (const message of state.tasks[subject.taskIndex].messages) { + if (message.type === TestMessageType.Output) { + yield* output.getRangeIter(message.offset, message.length); + } + } + }, + doListenForMoreData: (output, result, write) => result.onChange(e => { + if (e.reason === TestResultItemChangeReason.NewMessage && e.item.item.extId === testItem.extId && e.message.type === TestMessageType.Output) { + for (const chunk of output.getRangeIter(e.message.offset, e.message.length)) { + write(chunk.buffer); + } + } + }), + }); + + if (subject instanceof MessageSubject && subject.message.type === TestMessageType.Output && subject.message.marker !== undefined) { + terminal?.xterm.selectMarkedRange(getMarkId(subject.message.marker, true), getMarkId(subject.message.marker, false), /* scrollIntoView= */ true); + } + } + + private updateForTaskSubject(subject: TaskSubject) { + return this.updateGenerically({ + subject, + noOutputMessage: localize('runNoOutput', 'The test run did not record any output.'), + getTarget: result => result?.tasks[subject.taskIndex], + doInitialWrite: (task, result) => { + // Update the cwd and use the first test to try to hint at the correct cwd, + // but often this will fall back to the first workspace folder. + this.updateCwd(Iterable.find(result.tests, t => !!t.item.uri)?.item.uri); + return task.output.buffers; + }, + doListenForMoreData: (task, _result, write) => task.output.onDidWriteData(e => write(e.buffer)), + }); + } + + private async updateGenerically(opts: { + subject: InspectSubject; + noOutputMessage: string; + getTarget: (result: ITestResult) => T | undefined; + doInitialWrite: (target: T, result: LiveTestResult) => Iterable; + doListenForMoreData: (target: T, result: LiveTestResult, write: (s: Uint8Array) => void) => IDisposable; + }) { + const result = opts.subject.result; + const target = opts.getTarget(result); + if (!target) { + return this.clear(); + } + + const terminal = await this.makeTerminal(); + let didWriteData = false; + + const pendingWrites = new MutableObservableValue(0); + if (result instanceof LiveTestResult) { + for (const chunk of opts.doInitialWrite(target, result)) { + didWriteData ||= chunk.byteLength > 0; + pendingWrites.value++; + terminal.xterm.write(chunk.buffer, () => pendingWrites.value--); + } + } else { + didWriteData = true; + this.writeNotice(terminal, localize('runNoOutputForPast', 'Test output is only available for new test runs.')); + } + + this.attachTerminalToDom(terminal); + this.outputDataListener.clear(); + + if (result instanceof LiveTestResult && !result.completedAt) { + const l1 = result.onComplete(() => { + if (!didWriteData) { + this.writeNotice(terminal, opts.noOutputMessage); + } + }); + const l2 = opts.doListenForMoreData(target, result, data => { + terminal.xterm.write(data); + didWriteData ||= data.byteLength > 0; + }); + + this.outputDataListener.value = combinedDisposable(l1, l2); + } + + if (!this.outputDataListener.value && !didWriteData) { + this.writeNotice(terminal, opts.noOutputMessage); + } + + // Ensure pending writes finish, otherwise the selection in `updateForTestSubject` + // can happen before the markers are processed. + if (pendingWrites.value > 0) { + await new Promise(resolve => { + const l = pendingWrites.onDidChange(() => { + if (pendingWrites.value === 0) { + l.dispose(); + resolve(); + } + }); + }); + } + + return terminal; + } + + private updateCwd(testUri?: URI) { + const wf = (testUri && this.workspaceContext.getWorkspaceFolder(testUri)) + || this.workspaceContext.getWorkspace().folders[0]; + if (wf) { + this.terminalCwd.value = wf.uri.fsPath; + } + } + + private writeNotice(terminal: IDetachedTerminalInstance, str: string) { + terminal.xterm.write(formatMessageForTerminal(str)); + } + + private attachTerminalToDom(terminal: IDetachedTerminalInstance) { + terminal.xterm.write('\x1b[?25l'); // hide cursor + dom.scheduleAtNextAnimationFrame(dom.getWindow(this.container), () => this.layoutTerminal(terminal)); + terminal.attachToElement(this.container, { enableGpu: false }); + } + + private clear() { + this.outputDataListener.clear(); + this.xtermLayoutDelayer.cancel(); + this.terminal.clear(); + } + + public layout(dimensions: dom.IDimension) { + this.dimensions = dimensions; + if (this.terminal.value) { + this.layoutTerminal(this.terminal.value, dimensions.width, dimensions.height); + } + } + + private layoutTerminal( + { xterm }: IDetachedTerminalInstance, + width = this.dimensions?.width ?? this.container.clientWidth, + height = this.dimensions?.height ?? this.container.clientHeight + ) { + width -= 10 + 20; // scrollbar width + margin + this.xtermLayoutDelayer.trigger(() => { + const scaled = getXtermScaledDimensions(dom.getWindow(this.container), xterm.getFont(), width, height); + if (scaled) { + xterm.resize(scaled.cols, scaled.rows); + } + }); + } +} + +const isMultiline = (str: string | undefined) => !!str && str.includes('\n'); diff --git a/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject.ts b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject.ts new file mode 100644 index 0000000000000..6296138f9853e --- /dev/null +++ b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject.ts @@ -0,0 +1,94 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +import { MarshalledId } from 'vs/base/common/marshallingIds'; +import { URI } from 'vs/base/common/uri'; +import { Range } from 'vs/editor/common/core/range'; +import { ITestResult } from 'vs/workbench/contrib/testing/common/testResult'; +import { IRichLocation, ITestItem, ITestMessage, ITestMessageMenuArgs, ITestRunTask, ITestTaskState, InternalTestItem, TestMessageType, TestResultItem } from 'vs/workbench/contrib/testing/common/testTypes'; +import { TestUriType, buildTestUri } from 'vs/workbench/contrib/testing/common/testingUri'; + +export const getMessageArgs = (test: TestResultItem, message: ITestMessage): ITestMessageMenuArgs => ({ + $mid: MarshalledId.TestMessageMenuArgs, + test: InternalTestItem.serialize(test), + message: ITestMessage.serialize(message), +}); + +export class MessageSubject { + public readonly test: ITestItem; + public readonly message: ITestMessage; + public readonly expectedUri: URI; + public readonly actualUri: URI; + public readonly messageUri: URI; + public readonly revealLocation: IRichLocation | undefined; + public readonly context: ITestMessageMenuArgs | undefined; + + public get isDiffable() { + return this.message.type === TestMessageType.Error && ITestMessage.isDiffable(this.message); + } + + public get contextValue() { + return this.message.type === TestMessageType.Error ? this.message.contextValue : undefined; + } + + constructor(public readonly result: ITestResult, test: TestResultItem, public readonly taskIndex: number, public readonly messageIndex: number) { + this.test = test.item; + const messages = test.tasks[taskIndex].messages; + this.messageIndex = messageIndex; + + const parts = { messageIndex, resultId: result.id, taskIndex, testExtId: test.item.extId }; + this.expectedUri = buildTestUri({ ...parts, type: TestUriType.ResultExpectedOutput }); + this.actualUri = buildTestUri({ ...parts, type: TestUriType.ResultActualOutput }); + this.messageUri = buildTestUri({ ...parts, type: TestUriType.ResultMessage }); + + const message = this.message = messages[this.messageIndex]; + this.context = getMessageArgs(test, message); + this.revealLocation = message.location ?? (test.item.uri && test.item.range ? { uri: test.item.uri, range: Range.lift(test.item.range) } : undefined); + } +} + +export class TaskSubject { + public readonly outputUri: URI; + public readonly revealLocation: undefined; + + constructor(public readonly result: ITestResult, public readonly taskIndex: number) { + this.outputUri = buildTestUri({ resultId: result.id, taskIndex, type: TestUriType.TaskOutput }); + } +} + +export class TestOutputSubject { + public readonly outputUri: URI; + public readonly revealLocation: undefined; + public readonly task: ITestRunTask; + + constructor(public readonly result: ITestResult, public readonly taskIndex: number, public readonly test: TestResultItem) { + this.outputUri = buildTestUri({ resultId: this.result.id, taskIndex: this.taskIndex, testExtId: this.test.item.extId, type: TestUriType.TestOutput }); + this.task = result.tasks[this.taskIndex]; + } +} + +export type InspectSubject = MessageSubject | TaskSubject | TestOutputSubject; + +export const equalsSubject = (a: InspectSubject, b: InspectSubject) => ( + (a instanceof MessageSubject && b instanceof MessageSubject && a.message === b.message) || + (a instanceof TaskSubject && b instanceof TaskSubject && a.result === b.result && a.taskIndex === b.taskIndex) || + (a instanceof TestOutputSubject && b instanceof TestOutputSubject && a.test === b.test && a.taskIndex === b.taskIndex) +); + + +export const mapFindTestMessage = (test: TestResultItem, fn: (task: ITestTaskState, message: ITestMessage, messageIndex: number, taskIndex: number) => T | undefined) => { + for (let taskIndex = 0; taskIndex < test.tasks.length; taskIndex++) { + const task = test.tasks[taskIndex]; + for (let messageIndex = 0; messageIndex < task.messages.length; messageIndex++) { + const r = fn(task, task.messages[messageIndex], messageIndex, taskIndex); + if (r !== undefined) { + return r; + } + } + } + + return undefined; +}; diff --git a/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsTree.ts b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsTree.ts new file mode 100644 index 0000000000000..f6aa368c619fc --- /dev/null +++ b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsTree.ts @@ -0,0 +1,853 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; +import { IIdentityProvider } from 'vs/base/browser/ui/list/list'; +import { ICompressedTreeElement, ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; +import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; +import { ITreeContextMenuEvent, ITreeNode } from 'vs/base/browser/ui/tree/tree'; +import { Action, IAction, Separator } from 'vs/base/common/actions'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import { Codicon } from 'vs/base/common/codicons'; +import { Emitter, Event } from 'vs/base/common/event'; +import { FuzzyScore } from 'vs/base/common/filters'; +import { Iterable } from 'vs/base/common/iterator'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { MarshalledId } from 'vs/base/common/marshallingIds'; +import { autorun } from 'vs/base/common/observable'; +import { count } from 'vs/base/common/strings'; +import { ThemeIcon } from 'vs/base/common/themables'; +import { isDefined } from 'vs/base/common/types'; +import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { MenuEntryActionViewItem, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService'; +import { IProgressService } from 'vs/platform/progress/common/progress'; +import { widgetClose } from 'vs/platform/theme/common/iconRegistry'; +import { getTestItemContextOverlay } from 'vs/workbench/contrib/testing/browser/explorerProjections/testItemContextOverlay'; +import * as icons from 'vs/workbench/contrib/testing/browser/icons'; +import { renderTestMessageAsText } from 'vs/workbench/contrib/testing/browser/testMessageColorizer'; +import { TestOutputSubject, InspectSubject, TaskSubject, MessageSubject, mapFindTestMessage, getMessageArgs } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject'; +import { Testing } from 'vs/workbench/contrib/testing/common/constants'; +import { ITestCoverageService } from 'vs/workbench/contrib/testing/common/testCoverageService'; +import { ITestExplorerFilterState } from 'vs/workbench/contrib/testing/common/testExplorerFilterState'; +import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; +import { ITestResult, ITestRunTaskResults, LiveTestResult, TestResultItemChangeReason, maxCountPriority } from 'vs/workbench/contrib/testing/common/testResult'; +import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; +import { IRichLocation, ITestItemContext, ITestMessage, ITestMessageMenuArgs, InternalTestItem, TestMessageType, TestResultItem, TestResultState, TestRunProfileBitset, testResultStateToContextValues } from 'vs/workbench/contrib/testing/common/testTypes'; +import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys'; +import { cmpPriority } from 'vs/workbench/contrib/testing/common/testingStates'; +import { TestUriType, buildTestUri } from 'vs/workbench/contrib/testing/common/testingUri'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; + + +interface ITreeElement { + type: string; + context: unknown; + id: string; + label: string; + onDidChange: Event; + labelWithIcons?: readonly (HTMLSpanElement | string)[]; + icon?: ThemeIcon; + description?: string; + ariaLabel?: string; +} + +interface ITreeElement { + type: string; + context: unknown; + id: string; + label: string; + onDidChange: Event; + labelWithIcons?: readonly (HTMLSpanElement | string)[]; + icon?: ThemeIcon; + description?: string; + ariaLabel?: string; +} + +class TestResultElement implements ITreeElement { + public readonly changeEmitter = new Emitter(); + public readonly onDidChange = this.changeEmitter.event; + public readonly type = 'result'; + public readonly context = this.value.id; + public readonly id = this.value.id; + public readonly label = this.value.name; + + public get icon() { + return icons.testingStatesToIcons.get( + this.value.completedAt === undefined + ? TestResultState.Running + : maxCountPriority(this.value.counts) + ); + } + + constructor(public readonly value: ITestResult) { } +} + +const openCoverageLabel = localize('openTestCoverage', 'View Test Coverage'); +const closeCoverageLabel = localize('closeTestCoverage', 'Close Test Coverage'); + +class CoverageElement implements ITreeElement { + public readonly type = 'coverage'; + public readonly context: undefined; + public readonly id = `coverage-${this.results.id}/${this.task.id}`; + public readonly onDidChange: Event; + + public get label() { + return this.isOpen ? closeCoverageLabel : openCoverageLabel; + } + + public get icon() { + return this.isOpen ? widgetClose : icons.testingCoverageReport; + } + + public get isOpen() { + return this.coverageService.selected.get()?.fromTaskId === this.task.id; + } + + constructor( + private readonly results: ITestResult, + public readonly task: ITestRunTaskResults, + private readonly coverageService: ITestCoverageService, + ) { + this.onDidChange = Event.fromObservableLight(coverageService.selected); + } + +} + +class TestCaseElement implements ITreeElement { + public readonly type = 'test'; + public readonly context: ITestItemContext = { + $mid: MarshalledId.TestItemContext, + tests: [InternalTestItem.serialize(this.test)], + }; + public readonly id = `${this.results.id}/${this.test.item.extId}`; + public readonly description?: string; + + public get onDidChange() { + if (!(this.results instanceof LiveTestResult)) { + return Event.None; + } + + return Event.filter(this.results.onChange, e => e.item.item.extId === this.test.item.extId); + } + + public get state() { + return this.test.tasks[this.taskIndex].state; + } + + public get label() { + return this.test.item.label; + } + + public get labelWithIcons() { + return renderLabelWithIcons(this.label); + } + + public get icon() { + return icons.testingStatesToIcons.get(this.state); + } + + public get outputSubject() { + return new TestOutputSubject(this.results, this.taskIndex, this.test); + } + + + constructor( + public readonly results: ITestResult, + public readonly test: TestResultItem, + public readonly taskIndex: number, + ) { } +} + +class TaskElement implements ITreeElement { + public readonly changeEmitter = new Emitter(); + public readonly onDidChange = this.changeEmitter.event; + public readonly type = 'task'; + public readonly context: string; + public readonly id: string; + public readonly label: string; + public readonly itemsCache = new CreationCache(); + + public get icon() { + return this.results.tasks[this.index].running ? icons.testingStatesToIcons.get(TestResultState.Running) : undefined; + } + + constructor(public readonly results: ITestResult, public readonly task: ITestRunTaskResults, public readonly index: number) { + this.id = `${results.id}/${index}`; + this.task = results.tasks[index]; + this.context = String(index); + this.label = this.task.name ?? localize('testUnnamedTask', 'Unnamed Task'); + } +} + +class TestMessageElement implements ITreeElement { + public readonly type = 'message'; + public readonly id: string; + public readonly label: string; + public readonly uri: URI; + public readonly location?: IRichLocation; + public readonly description?: string; + public readonly contextValue?: string; + public readonly message: ITestMessage; + + public get onDidChange() { + if (!(this.result instanceof LiveTestResult)) { + return Event.None; + } + + // rerender when the test case changes so it gets retired events + return Event.filter(this.result.onChange, e => e.item.item.extId === this.test.item.extId); + } + + public get context(): ITestMessageMenuArgs { + return getMessageArgs(this.test, this.message); + } + + public get outputSubject() { + return new TestOutputSubject(this.result, this.taskIndex, this.test); + } + + constructor( + public readonly result: ITestResult, + public readonly test: TestResultItem, + public readonly taskIndex: number, + public readonly messageIndex: number, + ) { + const m = this.message = test.tasks[taskIndex].messages[messageIndex]; + + this.location = m.location; + this.contextValue = m.type === TestMessageType.Error ? m.contextValue : undefined; + this.uri = buildTestUri({ + type: TestUriType.ResultMessage, + messageIndex, + resultId: result.id, + taskIndex, + testExtId: test.item.extId + }); + + this.id = this.uri.toString(); + + const asPlaintext = renderTestMessageAsText(m.message); + const lines = count(asPlaintext.trimEnd(), '\n'); + this.label = firstLine(asPlaintext); + if (lines > 0) { + this.description = lines > 1 + ? localize('messageMoreLinesN', '+ {0} more lines', lines) + : localize('messageMoreLines1', '+ 1 more line'); + } + } +} + +type TreeElement = TestResultElement | TestCaseElement | TestMessageElement | TaskElement | CoverageElement; + +export class OutputPeekTree extends Disposable { + private disposed = false; + private readonly tree: WorkbenchCompressibleObjectTree; + private readonly treeActions: TreeActionsProvider; + private readonly requestReveal = this._register(new Emitter()); + + public readonly onDidRequestReview = this.requestReveal.event; + + constructor( + container: HTMLElement, + onDidReveal: Event<{ subject: InspectSubject; preserveFocus: boolean }>, + options: { showRevealLocationOnMessages: boolean; locationForProgress: string }, + @IContextMenuService private readonly contextMenuService: IContextMenuService, + @ITestResultService results: ITestResultService, + @IInstantiationService instantiationService: IInstantiationService, + @ITestExplorerFilterState explorerFilter: ITestExplorerFilterState, + @ITestCoverageService coverageService: ITestCoverageService, + @IProgressService progressService: IProgressService, + ) { + super(); + + this.treeActions = instantiationService.createInstance(TreeActionsProvider, options.showRevealLocationOnMessages, this.requestReveal,); + const diffIdentityProvider: IIdentityProvider = { + getId(e: TreeElement) { + return e.id; + } + }; + + this.tree = this._register(instantiationService.createInstance( + WorkbenchCompressibleObjectTree, + 'Test Output Peek', + container, + { + getHeight: () => 22, + getTemplateId: () => TestRunElementRenderer.ID, + }, + [instantiationService.createInstance(TestRunElementRenderer, this.treeActions)], + { + compressionEnabled: true, + hideTwistiesOfChildlessElements: true, + identityProvider: diffIdentityProvider, + sorter: { + compare(a, b) { + if (a instanceof TestCaseElement && b instanceof TestCaseElement) { + return cmpPriority(a.state, b.state); + } + + return 0; + }, + }, + accessibilityProvider: { + getAriaLabel(element: ITreeElement) { + return element.ariaLabel || element.label; + }, + getWidgetAriaLabel() { + return localize('testingPeekLabel', 'Test Result Messages'); + } + } + }, + )) as WorkbenchCompressibleObjectTree; + + const cc = new CreationCache(); + const getTaskChildren = (taskElem: TaskElement): Iterable> => { + const { results, index, itemsCache, task } = taskElem; + const tests = Iterable.filter(results.tests, test => test.tasks[index].state >= TestResultState.Running || test.tasks[index].messages.length > 0); + let result: Iterable> = Iterable.map(tests, test => ({ + element: itemsCache.getOrCreate(test, () => new TestCaseElement(results, test, index)), + incompressible: true, + children: getTestChildren(results, test, index), + })); + + if (task.coverage.get()) { + result = Iterable.concat( + Iterable.single>({ + element: new CoverageElement(results, task, coverageService), + collapsible: true, + incompressible: true, + }), + result, + ); + } + + return result; + }; + + const getTestChildren = (result: ITestResult, test: TestResultItem, taskIndex: number): Iterable> => { + return test.tasks[taskIndex].messages + .map((m, messageIndex) => + m.type === TestMessageType.Error + ? { element: cc.getOrCreate(m, () => new TestMessageElement(result, test, taskIndex, messageIndex)), incompressible: false } + : undefined + ) + .filter(isDefined); + }; + + const getResultChildren = (result: ITestResult): Iterable> => { + return result.tasks.map((task, taskIndex) => { + const taskElem = cc.getOrCreate(task, () => new TaskElement(result, task, taskIndex)); + return ({ + element: taskElem, + incompressible: false, + collapsible: true, + children: getTaskChildren(taskElem), + }); + }); + }; + + const getRootChildren = () => results.results.map(result => { + const element = cc.getOrCreate(result, () => new TestResultElement(result)); + return { + element, + incompressible: true, + collapsible: true, + collapsed: this.tree.hasElement(element) ? this.tree.isCollapsed(element) : true, + children: getResultChildren(result) + }; + }); + + // Queued result updates to prevent spamming CPU when lots of tests are + // completing and messaging quickly (#142514) + const taskChildrenToUpdate = new Set(); + const taskChildrenUpdate = this._register(new RunOnceScheduler(() => { + for (const taskNode of taskChildrenToUpdate) { + if (this.tree.hasElement(taskNode)) { + this.tree.setChildren(taskNode, getTaskChildren(taskNode), { diffIdentityProvider }); + } + } + taskChildrenToUpdate.clear(); + }, 300)); + + const queueTaskChildrenUpdate = (taskNode: TaskElement) => { + taskChildrenToUpdate.add(taskNode); + if (!taskChildrenUpdate.isScheduled()) { + taskChildrenUpdate.schedule(); + } + }; + + const attachToResults = (result: LiveTestResult) => { + const resultNode = cc.get(result)! as TestResultElement; + const disposable = new DisposableStore(); + disposable.add(result.onNewTask(i => { + if (result.tasks.length === 1) { + this.requestReveal.fire(new TaskSubject(result, 0)); // reveal the first task in new runs + } + + if (this.tree.hasElement(resultNode)) { + this.tree.setChildren(resultNode, getResultChildren(result), { diffIdentityProvider }); + } + + // note: tasks are bounded and their lifetime is equivalent to that of + // the test result, so this doesn't leak indefinitely. + const task = result.tasks[i]; + disposable.add(autorun(reader => { + task.coverage.read(reader); // add it to the autorun + queueTaskChildrenUpdate(cc.get(task) as TaskElement); + })); + })); + disposable.add(result.onEndTask(index => { + (cc.get(result.tasks[index]) as TaskElement | undefined)?.changeEmitter.fire(); + })); + + disposable.add(result.onChange(e => { + // try updating the item in each of its tasks + for (const [index, task] of result.tasks.entries()) { + const taskNode = cc.get(task) as TaskElement; + if (!this.tree.hasElement(taskNode)) { + continue; + } + + const itemNode = taskNode.itemsCache.get(e.item); + if (itemNode && this.tree.hasElement(itemNode)) { + if (e.reason === TestResultItemChangeReason.NewMessage && e.message.type === TestMessageType.Error) { + this.tree.setChildren(itemNode, getTestChildren(result, e.item, index), { diffIdentityProvider }); + } + return; + } + + queueTaskChildrenUpdate(taskNode); + } + })); + + disposable.add(result.onComplete(() => { + resultNode.changeEmitter.fire(); + disposable.dispose(); + })); + + return resultNode; + }; + + this._register(results.onResultsChanged(e => { + // little hack here: a result change can cause the peek to be disposed, + // but this listener will still be queued. Doing stuff with the tree + // will cause errors. + if (this.disposed) { + return; + } + + if ('completed' in e) { + (cc.get(e.completed) as TestResultElement | undefined)?.changeEmitter.fire(); + return; + } + + this.tree.setChildren(null, getRootChildren(), { diffIdentityProvider }); + + // done after setChildren intentionally so that the ResultElement exists in the cache. + if ('started' in e) { + for (const child of this.tree.getNode(null).children) { + this.tree.collapse(child.element, false); + } + + this.tree.expand(attachToResults(e.started), true); + } + })); + + const revealItem = (element: TreeElement, preserveFocus: boolean) => { + this.tree.setFocus([element]); + this.tree.setSelection([element]); + if (!preserveFocus) { + this.tree.domFocus(); + } + }; + + this._register(onDidReveal(async ({ subject, preserveFocus = false }) => { + if (subject instanceof TaskSubject) { + const resultItem = this.tree.getNode(null).children.find(c => { + if (c.element instanceof TaskElement) { + return c.element.results.id === subject.result.id && c.element.index === subject.taskIndex; + } + if (c.element instanceof TestResultElement) { + return c.element.id === subject.result.id; + } + return false; + }); + + if (resultItem) { + revealItem(resultItem.element!, preserveFocus); + } + return; + } + + const revealElement = subject instanceof TestOutputSubject + ? cc.get(subject.task)?.itemsCache.get(subject.test) + : cc.get(subject.message); + if (!revealElement || !this.tree.hasElement(revealElement)) { + return; + } + + const parents: TreeElement[] = []; + for (let parent = this.tree.getParentElement(revealElement); parent; parent = this.tree.getParentElement(parent)) { + parents.unshift(parent); + } + + for (const parent of parents) { + this.tree.expand(parent); + } + + if (this.tree.getRelativeTop(revealElement) === null) { + this.tree.reveal(revealElement, 0.5); + } + + revealItem(revealElement, preserveFocus); + })); + + this._register(this.tree.onDidOpen(async e => { + if (e.element instanceof TestMessageElement) { + this.requestReveal.fire(new MessageSubject(e.element.result, e.element.test, e.element.taskIndex, e.element.messageIndex)); + } else if (e.element instanceof TestCaseElement) { + const t = e.element; + const message = mapFindTestMessage(e.element.test, (_t, _m, mesasgeIndex, taskIndex) => + new MessageSubject(t.results, t.test, taskIndex, mesasgeIndex)); + this.requestReveal.fire(message || new TestOutputSubject(t.results, 0, t.test)); + } else if (e.element instanceof CoverageElement) { + const task = e.element.task; + if (e.element.isOpen) { + return coverageService.closeCoverage(); + } + progressService.withProgress( + { location: options.locationForProgress }, + () => coverageService.openCoverage(task, true) + ); + } + })); + + this._register(this.tree.onDidChangeSelection(evt => { + for (const element of evt.elements) { + if (element && 'test' in element) { + explorerFilter.reveal.value = element.test.item.extId; + break; + } + } + })); + + + this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); + + this.tree.setChildren(null, getRootChildren()); + for (const result of results.results) { + if (!result.completedAt && result instanceof LiveTestResult) { + attachToResults(result); + } + } + } + + public layout(height: number, width: number) { + this.tree.layout(height, width); + } + + private onContextMenu(evt: ITreeContextMenuEvent) { + if (!evt.element) { + return; + } + + const actions = this.treeActions.provideActionBar(evt.element); + this.contextMenuService.showContextMenu({ + getAnchor: () => evt.anchor, + getActions: () => actions.secondary.length + ? [...actions.primary, new Separator(), ...actions.secondary] + : actions.primary, + getActionsContext: () => evt.element?.context + }); + } + + public override dispose() { + super.dispose(); + this.disposed = true; + } +} + +interface TemplateData { + label: HTMLElement; + icon: HTMLElement; + actionBar: ActionBar; + elementDisposable: DisposableStore; + templateDisposable: DisposableStore; +} + +class TestRunElementRenderer implements ICompressibleTreeRenderer { + public static readonly ID = 'testRunElementRenderer'; + public readonly templateId = TestRunElementRenderer.ID; + + constructor( + private readonly treeActions: TreeActionsProvider, + @IInstantiationService private readonly instantiationService: IInstantiationService, + ) { } + + /** @inheritdoc */ + public renderCompressedElements(node: ITreeNode, FuzzyScore>, _index: number, templateData: TemplateData): void { + const chain = node.element.elements; + const lastElement = chain[chain.length - 1]; + if ((lastElement instanceof TaskElement || lastElement instanceof TestMessageElement) && chain.length >= 2) { + this.doRender(chain[chain.length - 2], templateData, lastElement); + } else { + this.doRender(lastElement, templateData); + } + } + + /** @inheritdoc */ + public renderTemplate(container: HTMLElement): TemplateData { + const templateDisposable = new DisposableStore(); + const wrapper = dom.append(container, dom.$('.test-peek-item')); + const icon = dom.append(wrapper, dom.$('.state')); + const label = dom.append(wrapper, dom.$('.name')); + + const actionBar = new ActionBar(wrapper, { + actionViewItemProvider: (action, options) => + action instanceof MenuItemAction + ? this.instantiationService.createInstance(MenuEntryActionViewItem, action, { hoverDelegate: options.hoverDelegate }) + : undefined + }); + + const elementDisposable = new DisposableStore(); + templateDisposable.add(elementDisposable); + templateDisposable.add(actionBar); + + return { + icon, + label, + actionBar, + elementDisposable, + templateDisposable, + }; + } + + /** @inheritdoc */ + public renderElement(element: ITreeNode, _index: number, templateData: TemplateData): void { + this.doRender(element.element, templateData); + } + + /** @inheritdoc */ + public disposeTemplate(templateData: TemplateData): void { + templateData.templateDisposable.dispose(); + } + + /** Called to render a new element */ + private doRender(element: ITreeElement, templateData: TemplateData, subjectElement?: ITreeElement) { + templateData.elementDisposable.clear(); + templateData.elementDisposable.add( + element.onDidChange(() => this.doRender(element, templateData, subjectElement)), + ); + this.doRenderInner(element, templateData, subjectElement); + } + + /** Called, and may be re-called, to render or re-render an element */ + private doRenderInner(element: ITreeElement, templateData: TemplateData, subjectElement: ITreeElement | undefined) { + let { label, labelWithIcons, description } = element; + if (subjectElement instanceof TestMessageElement) { + description = subjectElement.label; + } + + const descriptionElement = description ? dom.$('span.test-label-description', {}, description) : ''; + if (labelWithIcons) { + dom.reset(templateData.label, ...labelWithIcons, descriptionElement); + } else { + dom.reset(templateData.label, label, descriptionElement); + } + + const icon = element.icon; + templateData.icon.className = `computed-state ${icon ? ThemeIcon.asClassName(icon) : ''}`; + + const actions = this.treeActions.provideActionBar(element); + templateData.actionBar.clear(); + templateData.actionBar.context = element.context; + templateData.actionBar.push(actions.primary, { icon: true, label: false }); + } +} + +class TreeActionsProvider { + constructor( + private readonly showRevealLocationOnMessages: boolean, + private readonly requestReveal: Emitter, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IMenuService private readonly menuService: IMenuService, + @ICommandService private readonly commandService: ICommandService, + @ITestProfileService private readonly testProfileService: ITestProfileService, + @IEditorService private readonly editorService: IEditorService, + ) { } + + public provideActionBar(element: ITreeElement) { + const test = element instanceof TestCaseElement ? element.test : undefined; + const capabilities = test ? this.testProfileService.capabilitiesForTest(test) : 0; + + const contextKeys: [string, unknown][] = [ + ['peek', Testing.OutputPeekContributionId], + [TestingContextKeys.peekItemType.key, element.type], + ]; + + let id = MenuId.TestPeekElement; + const primary: IAction[] = []; + const secondary: IAction[] = []; + + if (element instanceof TaskElement) { + primary.push(new Action( + 'testing.outputPeek.showResultOutput', + localize('testing.showResultOutput', "Show Result Output"), + ThemeIcon.asClassName(Codicon.terminal), + undefined, + () => this.requestReveal.fire(new TaskSubject(element.results, element.index)), + )); + } + + if (element instanceof TestResultElement) { + // only show if there are no collapsed test nodes that have more specific choices + if (element.value.tasks.length === 1) { + primary.push(new Action( + 'testing.outputPeek.showResultOutput', + localize('testing.showResultOutput', "Show Result Output"), + ThemeIcon.asClassName(Codicon.terminal), + undefined, + () => this.requestReveal.fire(new TaskSubject(element.value, 0)), + )); + } + + primary.push(new Action( + 'testing.outputPeek.reRunLastRun', + localize('testing.reRunLastRun', "Rerun Test Run"), + ThemeIcon.asClassName(icons.testingRunIcon), + undefined, + () => this.commandService.executeCommand('testing.reRunLastRun', element.value.id), + )); + + if (capabilities & TestRunProfileBitset.Debug) { + primary.push(new Action( + 'testing.outputPeek.debugLastRun', + localize('testing.debugLastRun', "Debug Test Run"), + ThemeIcon.asClassName(icons.testingDebugIcon), + undefined, + () => this.commandService.executeCommand('testing.debugLastRun', element.value.id), + )); + } + } + + if (element instanceof TestCaseElement || element instanceof TestMessageElement) { + contextKeys.push( + [TestingContextKeys.testResultOutdated.key, element.test.retired], + [TestingContextKeys.testResultState.key, testResultStateToContextValues[element.test.ownComputedState]], + ...getTestItemContextOverlay(element.test, capabilities), + ); + + const extId = element.test.item.extId; + if (element.test.tasks[element.taskIndex].messages.some(m => m.type === TestMessageType.Output)) { + primary.push(new Action( + 'testing.outputPeek.showResultOutput', + localize('testing.showResultOutput', "Show Result Output"), + ThemeIcon.asClassName(Codicon.terminal), + undefined, + () => this.requestReveal.fire(element.outputSubject), + )); + } + + secondary.push(new Action( + 'testing.outputPeek.revealInExplorer', + localize('testing.revealInExplorer', "Reveal in Test Explorer"), + ThemeIcon.asClassName(Codicon.listTree), + undefined, + () => this.commandService.executeCommand('_revealTestInExplorer', extId), + )); + + if (capabilities & TestRunProfileBitset.Run) { + primary.push(new Action( + 'testing.outputPeek.runTest', + localize('run test', 'Run Test'), + ThemeIcon.asClassName(icons.testingRunIcon), + undefined, + () => this.commandService.executeCommand('vscode.runTestsById', TestRunProfileBitset.Run, extId), + )); + } + + if (capabilities & TestRunProfileBitset.Debug) { + primary.push(new Action( + 'testing.outputPeek.debugTest', + localize('debug test', 'Debug Test'), + ThemeIcon.asClassName(icons.testingDebugIcon), + undefined, + () => this.commandService.executeCommand('vscode.runTestsById', TestRunProfileBitset.Debug, extId), + )); + } + + } + + if (element instanceof TestMessageElement) { + primary.push(new Action( + 'testing.outputPeek.goToFile', + localize('testing.goToFile', "Go to Source"), + ThemeIcon.asClassName(Codicon.goToFile), + undefined, + () => this.commandService.executeCommand('vscode.revealTest', element.test.item.extId), + )); + } + + if (element instanceof TestMessageElement) { + id = MenuId.TestMessageContext; + contextKeys.push([TestingContextKeys.testMessageContext.key, element.contextValue]); + if (this.showRevealLocationOnMessages && element.location) { + primary.push(new Action( + 'testing.outputPeek.goToError', + localize('testing.goToError', "Go to Source"), + ThemeIcon.asClassName(Codicon.goToFile), + undefined, + () => this.editorService.openEditor({ + resource: element.location!.uri, + options: { + selection: element.location!.range, + preserveFocus: true, + } + }), + )); + } + } + + + const contextOverlay = this.contextKeyService.createOverlay(contextKeys); + const result = { primary, secondary }; + const menu = this.menuService.getMenuActions(id, contextOverlay, { arg: element.context }); + createAndFillInActionBarActions(menu, result, 'inline'); + return result; + } +} + +class CreationCache { + private readonly v = new WeakMap(); + + public get(key: object): T2 | undefined { + return this.v.get(key) as T2 | undefined; + } + + public getOrCreate(ref: object, factory: () => T2): T2 { + const existing = this.v.get(ref); + if (existing) { + return existing as T2; + } + + const fresh = factory(); + this.v.set(ref, fresh); + return fresh; + } +} + +const firstLine = (str: string) => { + const index = str.indexOf('\n'); + return index === -1 ? str : str.slice(0, index); +}; diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index ec21581a9a656..0012ae4a1c561 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -5,56 +5,39 @@ import * as dom from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; -import { IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { Orientation, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; -import { ICompressedTreeElement, ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; -import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; -import { ITreeContextMenuEvent, ITreeNode } from 'vs/base/browser/ui/tree/tree'; -import { Action, IAction, Separator } from 'vs/base/common/actions'; -import { Delayer, Limiter, RunOnceScheduler } from 'vs/base/common/async'; -import { VSBuffer } from 'vs/base/common/buffer'; +import { IAction } from 'vs/base/common/actions'; +import { Limiter } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; -import { FuzzyScore } from 'vs/base/common/filters'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; import { stripIcons } from 'vs/base/common/iconLabels'; import { Iterable } from 'vs/base/common/iterator'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { Lazy } from 'vs/base/common/lazy'; -import { Disposable, DisposableStore, IDisposable, IReference, MutableDisposable, combinedDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { MarshalledId } from 'vs/base/common/marshallingIds'; -import { autorun } from 'vs/base/common/observable'; +import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { count } from 'vs/base/common/strings'; -import { ThemeIcon } from 'vs/base/common/themables'; -import { isDefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./testingOutputPeek'; -import { ICodeEditor, IDiffEditorConstructionOptions, isCodeEditor } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction2 } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/codeEditorWidget'; import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget'; -import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/diffEditorWidget'; import { EmbeddedDiffEditorWidget } from 'vs/editor/browser/widget/diffEditor/embeddedDiffEditorWidget'; -import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer'; -import { IDiffEditorOptions, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditor, IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IPeekViewService, PeekViewWidget, peekViewResultsBackground, peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/peekView/browser/peekView'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { IPeekViewService, PeekViewWidget, peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/peekView/browser/peekView'; import { localize, localize2 } from 'vs/nls'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { FloatingClickMenu } from 'vs/platform/actions/browser/floatingMenu'; -import { MenuEntryActionViewItem, createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { Action2, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; +import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { Action2, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -65,116 +48,35 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IProgressService } from 'vs/platform/progress/common/progress'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; -import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore'; -import { formatMessageForTerminal } from 'vs/platform/terminal/common/terminalStrings'; import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { widgetClose } from 'vs/platform/theme/common/iconRegistry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; -import { EditorModel } from 'vs/workbench/common/editor/editorModel'; -import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; -import { DetachedProcessInfo } from 'vs/workbench/contrib/terminal/browser/detachedTerminal'; -import { IDetachedTerminalInstance, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { getXtermScaledDimensions } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; -import { TERMINAL_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; -import { getTestItemContextOverlay } from 'vs/workbench/contrib/testing/browser/explorerProjections/testItemContextOverlay'; -import * as icons from 'vs/workbench/contrib/testing/browser/icons'; -import { colorizeTestMessageInEditor, renderTestMessageAsText } from 'vs/workbench/contrib/testing/browser/testMessageColorizer'; +import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { renderTestMessageAsText } from 'vs/workbench/contrib/testing/browser/testMessageColorizer'; +import { DiffContentProvider, IPeekOutputRenderer, MarkdownTestMessagePeek, PlainTextMessagePeek, TerminalMessagePeek } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput'; +import { InspectSubject, MessageSubject, TaskSubject, TestOutputSubject, equalsSubject, mapFindTestMessage } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject'; +import { OutputPeekTree } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsTree'; import { testingMessagePeekBorder, testingPeekBorder, testingPeekHeaderBackground, testingPeekMessageHeaderBackground } from 'vs/workbench/contrib/testing/browser/theme'; import { AutoOpenPeekViewWhen, TestingConfigKeys, getTestingConfiguration } from 'vs/workbench/contrib/testing/common/configuration'; import { Testing } from 'vs/workbench/contrib/testing/common/constants'; import { IObservableValue, MutableObservableValue, staticObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; import { StoredValue } from 'vs/workbench/contrib/testing/common/storedValue'; -import { ITestCoverageService } from 'vs/workbench/contrib/testing/common/testCoverageService'; -import { ITestExplorerFilterState } from 'vs/workbench/contrib/testing/common/testExplorerFilterState'; -import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; -import { ITaskRawOutput, ITestResult, ITestRunTaskResults, LiveTestResult, TestResultItemChange, TestResultItemChangeReason, maxCountPriority, resultItemParents } from 'vs/workbench/contrib/testing/common/testResult'; +import { ITestResult, LiveTestResult, TestResultItemChange, TestResultItemChangeReason, resultItemParents } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService, ResultChangeEvent } from 'vs/workbench/contrib/testing/common/testResultService'; import { ITestFollowup, ITestService } from 'vs/workbench/contrib/testing/common/testService'; -import { IRichLocation, ITestErrorMessage, ITestItem, ITestItemContext, ITestMessage, ITestMessageMenuArgs, ITestRunTask, ITestTaskState, InternalTestItem, TestMessageType, TestResultItem, TestResultState, TestRunProfileBitset, getMarkId, testResultStateToContextValues } from 'vs/workbench/contrib/testing/common/testTypes'; +import { IRichLocation, ITestMessage, TestMessageType, TestResultItem } from 'vs/workbench/contrib/testing/common/testTypes'; import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys'; import { IShowResultOptions, ITestingPeekOpener } from 'vs/workbench/contrib/testing/common/testingPeekOpener'; -import { cmpPriority, isFailedState } from 'vs/workbench/contrib/testing/common/testingStates'; +import { isFailedState } from 'vs/workbench/contrib/testing/common/testingStates'; import { ParsedTestUri, TestUriType, buildTestUri, parseTestUri } from 'vs/workbench/contrib/testing/common/testingUri'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IViewsService } from 'vs/workbench/services/views/common/viewsService'; -const getMessageArgs = (test: TestResultItem, message: ITestMessage): ITestMessageMenuArgs => ({ - $mid: MarshalledId.TestMessageMenuArgs, - test: InternalTestItem.serialize(test), - message: ITestMessage.serialize(message), -}); - -class MessageSubject { - public readonly test: ITestItem; - public readonly message: ITestMessage; - public readonly expectedUri: URI; - public readonly actualUri: URI; - public readonly messageUri: URI; - public readonly revealLocation: IRichLocation | undefined; - public readonly context: ITestMessageMenuArgs | undefined; - - public get isDiffable() { - return this.message.type === TestMessageType.Error && isDiffable(this.message); - } - - public get contextValue() { - return this.message.type === TestMessageType.Error ? this.message.contextValue : undefined; - } - - constructor(public readonly result: ITestResult, test: TestResultItem, public readonly taskIndex: number, public readonly messageIndex: number) { - this.test = test.item; - const messages = test.tasks[taskIndex].messages; - this.messageIndex = messageIndex; - - const parts = { messageIndex, resultId: result.id, taskIndex, testExtId: test.item.extId }; - this.expectedUri = buildTestUri({ ...parts, type: TestUriType.ResultExpectedOutput }); - this.actualUri = buildTestUri({ ...parts, type: TestUriType.ResultActualOutput }); - this.messageUri = buildTestUri({ ...parts, type: TestUriType.ResultMessage }); - - const message = this.message = messages[this.messageIndex]; - this.context = getMessageArgs(test, message); - this.revealLocation = message.location ?? (test.item.uri && test.item.range ? { uri: test.item.uri, range: Range.lift(test.item.range) } : undefined); - } -} - -class TaskSubject { - public readonly outputUri: URI; - public readonly revealLocation: undefined; - - constructor(public readonly result: ITestResult, public readonly taskIndex: number) { - this.outputUri = buildTestUri({ resultId: result.id, taskIndex, type: TestUriType.TaskOutput }); - } -} - -class TestOutputSubject { - public readonly outputUri: URI; - public readonly revealLocation: undefined; - public readonly task: ITestRunTask; - - constructor(public readonly result: ITestResult, public readonly taskIndex: number, public readonly test: TestResultItem) { - this.outputUri = buildTestUri({ resultId: this.result.id, taskIndex: this.taskIndex, testExtId: this.test.item.extId, type: TestUriType.TestOutput }); - this.task = result.tasks[this.taskIndex]; - } -} - -type InspectSubject = MessageSubject | TaskSubject | TestOutputSubject; - -const equalsSubject = (a: InspectSubject, b: InspectSubject) => ( - (a instanceof MessageSubject && b instanceof MessageSubject && a.message === b.message) || - (a instanceof TaskSubject && b instanceof TaskSubject && a.result === b.result && a.taskIndex === b.taskIndex) || - (a instanceof TestOutputSubject && b instanceof TestOutputSubject && a.test === b.test && a.taskIndex === b.taskIndex) -); /** Iterates through every message in every result */ function* allMessages(results: readonly ITestResult[]) { @@ -501,19 +403,6 @@ export class TestingPeekOpener extends Disposable implements ITestingPeekOpener } } -const mapFindTestMessage = (test: TestResultItem, fn: (task: ITestTaskState, message: ITestMessage, messageIndex: number, taskIndex: number) => T | undefined) => { - for (let taskIndex = 0; taskIndex < test.tasks.length; taskIndex++) { - const task = test.tasks[taskIndex]; - for (let messageIndex = 0; messageIndex < task.messages.length; messageIndex++) { - const r = fn(task, task.messages[messageIndex], messageIndex, taskIndex); - if (r !== undefined) { - return r; - } - } - } - - return undefined; -}; /** * Adds output/message peek functionality to code editors. @@ -1245,491 +1134,8 @@ export class TestResultsView extends ViewPane { } } -interface IPeekOutputRenderer extends IDisposable { - /** Updates the displayed test. Should clear if it cannot display the test. */ - update(subject: InspectSubject): void; - /** Recalculate content layout. */ - layout(dimension: dom.IDimension): void; - /** Dispose the content provider. */ - dispose(): void; -} - -const commonEditorOptions: IEditorOptions = { - scrollBeyondLastLine: false, - links: true, - lineNumbers: 'off', - scrollbar: { - verticalScrollbarSize: 14, - horizontal: 'auto', - useShadows: true, - verticalHasArrows: false, - horizontalHasArrows: false, - alwaysConsumeMouseWheel: false - }, - fixedOverflowWidgets: true, - readOnly: true, - minimap: { - enabled: false - }, - wordWrap: 'on', -}; - -const diffEditorOptions: IDiffEditorConstructionOptions = { - ...commonEditorOptions, - enableSplitViewResizing: true, - isInEmbeddedEditor: true, - renderOverviewRuler: false, - ignoreTrimWhitespace: false, - renderSideBySide: true, - useInlineViewWhenSpaceIsLimited: false, - originalAriaLabel: localize('testingOutputExpected', 'Expected result'), - modifiedAriaLabel: localize('testingOutputActual', 'Actual result'), - diffAlgorithm: 'advanced', -}; - -const isDiffable = (message: ITestMessage): message is ITestErrorMessage & { actual: string; expected: string } => - message.type === TestMessageType.Error && message.actual !== undefined && message.expected !== undefined; - -class DiffContentProvider extends Disposable implements IPeekOutputRenderer { - private readonly widget = this._register(new MutableDisposable()); - private readonly model = this._register(new MutableDisposable()); - private dimension?: dom.IDimension; - - constructor( - private readonly editor: ICodeEditor | undefined, - private readonly container: HTMLElement, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @ITextModelService private readonly modelService: ITextModelService, - ) { - super(); - } - - public async update(subject: InspectSubject) { - if (!(subject instanceof MessageSubject)) { - return this.clear(); - } - const message = subject.message; - if (!isDiffable(message)) { - return this.clear(); - } - - const [original, modified] = await Promise.all([ - this.modelService.createModelReference(subject.expectedUri), - this.modelService.createModelReference(subject.actualUri), - ]); - - const model = this.model.value = new SimpleDiffEditorModel(original, modified); - if (!this.widget.value) { - this.widget.value = this.editor ? this.instantiationService.createInstance( - EmbeddedDiffEditorWidget, - this.container, - diffEditorOptions, - {}, - this.editor, - ) : this.instantiationService.createInstance( - DiffEditorWidget, - this.container, - diffEditorOptions, - {}, - ); - - if (this.dimension) { - this.widget.value.layout(this.dimension); - } - } - - this.widget.value.setModel(model); - this.widget.value.updateOptions(this.getOptions( - isMultiline(message.expected) || isMultiline(message.actual) - )); - } - - private clear() { - this.model.clear(); - this.widget.clear(); - } - - public layout(dimensions: dom.IDimension) { - this.dimension = dimensions; - this.widget.value?.layout(dimensions); - } - - protected getOptions(isMultiline: boolean): IDiffEditorOptions { - return isMultiline - ? { ...diffEditorOptions, lineNumbers: 'on' } - : { ...diffEditorOptions, lineNumbers: 'off' }; - } -} - -class ScrollableMarkdownMessage extends Disposable { - private readonly scrollable: DomScrollableElement; - private readonly element: HTMLElement; - - constructor(container: HTMLElement, markdown: MarkdownRenderer, message: IMarkdownString) { - super(); - - const rendered = this._register(markdown.render(message, {})); - rendered.element.style.height = '100%'; - rendered.element.style.userSelect = 'text'; - container.appendChild(rendered.element); - this.element = rendered.element; - - this.scrollable = this._register(new DomScrollableElement(rendered.element, { - className: 'preview-text', - })); - container.appendChild(this.scrollable.getDomNode()); - - this._register(toDisposable(() => { - this.scrollable.getDomNode().remove(); - })); - - this.scrollable.scanDomNode(); - } - - public layout(height: number, width: number) { - // Remove padding of `.monaco-editor .zone-widget.test-output-peek .preview-text` - this.scrollable.setScrollDimensions({ - width: width - 32, - height: height - 16, - scrollWidth: this.element.scrollWidth, - scrollHeight: this.element.scrollHeight - }); - } -} - -class MarkdownTestMessagePeek extends Disposable implements IPeekOutputRenderer { - private readonly markdown = new Lazy( - () => this._register(this.instantiationService.createInstance(MarkdownRenderer, {})), - ); - - private readonly textPreview = this._register(new MutableDisposable()); - - constructor(private readonly container: HTMLElement, @IInstantiationService private readonly instantiationService: IInstantiationService) { - super(); - } - - public update(subject: InspectSubject): void { - if (!(subject instanceof MessageSubject)) { - return this.textPreview.clear(); - } - - const message = subject.message; - if (isDiffable(message) || typeof message.message === 'string') { - return this.textPreview.clear(); - } - - this.textPreview.value = new ScrollableMarkdownMessage( - this.container, - this.markdown.value, - message.message as IMarkdownString, - ); - } - - public layout(dimension: dom.IDimension): void { - this.textPreview.value?.layout(dimension.height, dimension.width); - } -} - -class PlainTextMessagePeek extends Disposable implements IPeekOutputRenderer { - private readonly widgetDecorations = this._register(new MutableDisposable()); - private readonly widget = this._register(new MutableDisposable()); - private readonly model = this._register(new MutableDisposable()); - private dimension?: dom.IDimension; - - constructor( - private readonly editor: ICodeEditor | undefined, - private readonly container: HTMLElement, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @ITextModelService private readonly modelService: ITextModelService, - ) { - super(); - } - - public async update(subject: InspectSubject) { - if (!(subject instanceof MessageSubject)) { - return this.clear(); - } - - const message = subject.message; - if (isDiffable(message) || message.type === TestMessageType.Output || typeof message.message !== 'string') { - return this.clear(); - } - - const modelRef = this.model.value = await this.modelService.createModelReference(subject.messageUri); - if (!this.widget.value) { - this.widget.value = this.editor ? this.instantiationService.createInstance( - EmbeddedCodeEditorWidget, - this.container, - commonEditorOptions, - {}, - this.editor, - ) : this.instantiationService.createInstance( - CodeEditorWidget, - this.container, - commonEditorOptions, - { isSimpleWidget: true } - ); - - if (this.dimension) { - this.widget.value.layout(this.dimension); - } - } - - this.widget.value.setModel(modelRef.object.textEditorModel); - this.widget.value.updateOptions(commonEditorOptions); - this.widgetDecorations.value = colorizeTestMessageInEditor(message.message, this.widget.value); - } - - private clear() { - this.widgetDecorations.clear(); - this.widget.clear(); - this.model.clear(); - } - - public layout(dimensions: dom.IDimension) { - this.dimension = dimensions; - this.widget.value?.layout(dimensions); - } -} - -class TerminalMessagePeek extends Disposable implements IPeekOutputRenderer { - private dimensions?: dom.IDimension; - private readonly terminalCwd = this._register(new MutableObservableValue('')); - private readonly xtermLayoutDelayer = this._register(new Delayer(50)); - - /** Active terminal instance. */ - private readonly terminal = this._register(new MutableDisposable()); - /** Listener for streaming result data */ - private readonly outputDataListener = this._register(new MutableDisposable()); - - constructor( - private readonly container: HTMLElement, - private readonly isInPeekView: boolean, - @ITerminalService private readonly terminalService: ITerminalService, - @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, - @IWorkspaceContextService private readonly workspaceContext: IWorkspaceContextService, - ) { - super(); - } - - private async makeTerminal() { - const prev = this.terminal.value; - if (prev) { - prev.xterm.clearBuffer(); - prev.xterm.clearSearchDecorations(); - // clearBuffer tries to retain the prompt line, but this doesn't exist for tests. - // So clear the screen (J) and move to home (H) to ensure previous data is cleaned up. - prev.xterm.write(`\x1b[2J\x1b[0;0H`); - return prev; - } - - const capabilities = new TerminalCapabilityStore(); - const cwd = this.terminalCwd; - capabilities.add(TerminalCapability.CwdDetection, { - type: TerminalCapability.CwdDetection, - get cwds() { return [cwd.value]; }, - onDidChangeCwd: cwd.onDidChange, - getCwd: () => cwd.value, - updateCwd: () => { }, - }); - - return this.terminal.value = await this.terminalService.createDetachedTerminal({ - rows: 10, - cols: 80, - readonly: true, - capabilities, - processInfo: new DetachedProcessInfo({ initialCwd: cwd.value }), - colorProvider: { - getBackgroundColor: theme => { - const terminalBackground = theme.getColor(TERMINAL_BACKGROUND_COLOR); - if (terminalBackground) { - return terminalBackground; - } - if (this.isInPeekView) { - return theme.getColor(peekViewResultsBackground); - } - const location = this.viewDescriptorService.getViewLocationById(Testing.ResultsViewId); - return location === ViewContainerLocation.Panel - ? theme.getColor(PANEL_BACKGROUND) - : theme.getColor(SIDE_BAR_BACKGROUND); - }, - } - }); - } - - public async update(subject: InspectSubject) { - this.outputDataListener.clear(); - if (subject instanceof TaskSubject) { - await this.updateForTaskSubject(subject); - } else if (subject instanceof TestOutputSubject || (subject instanceof MessageSubject && subject.message.type === TestMessageType.Output)) { - await this.updateForTestSubject(subject); - } else { - this.clear(); - } - } - - private async updateForTestSubject(subject: TestOutputSubject | MessageSubject) { - const that = this; - const testItem = subject instanceof TestOutputSubject ? subject.test.item : subject.test; - const terminal = await this.updateGenerically({ - subject, - noOutputMessage: localize('caseNoOutput', 'The test case did not report any output.'), - getTarget: result => result?.tasks[subject.taskIndex].output, - *doInitialWrite(output, results) { - that.updateCwd(testItem.uri); - const state = subject instanceof TestOutputSubject ? subject.test : results.getStateById(testItem.extId); - if (!state) { - return; - } - - for (const message of state.tasks[subject.taskIndex].messages) { - if (message.type === TestMessageType.Output) { - yield* output.getRangeIter(message.offset, message.length); - } - } - }, - doListenForMoreData: (output, result, write) => result.onChange(e => { - if (e.reason === TestResultItemChangeReason.NewMessage && e.item.item.extId === testItem.extId && e.message.type === TestMessageType.Output) { - for (const chunk of output.getRangeIter(e.message.offset, e.message.length)) { - write(chunk.buffer); - } - } - }), - }); - - if (subject instanceof MessageSubject && subject.message.type === TestMessageType.Output && subject.message.marker !== undefined) { - terminal?.xterm.selectMarkedRange(getMarkId(subject.message.marker, true), getMarkId(subject.message.marker, false), /* scrollIntoView= */ true); - } - } - - private updateForTaskSubject(subject: TaskSubject) { - return this.updateGenerically({ - subject, - noOutputMessage: localize('runNoOutput', 'The test run did not record any output.'), - getTarget: result => result?.tasks[subject.taskIndex], - doInitialWrite: (task, result) => { - // Update the cwd and use the first test to try to hint at the correct cwd, - // but often this will fall back to the first workspace folder. - this.updateCwd(Iterable.find(result.tests, t => !!t.item.uri)?.item.uri); - return task.output.buffers; - }, - doListenForMoreData: (task, _result, write) => task.output.onDidWriteData(e => write(e.buffer)), - }); - } - - private async updateGenerically(opts: { - subject: InspectSubject; - noOutputMessage: string; - getTarget: (result: ITestResult) => T | undefined; - doInitialWrite: (target: T, result: LiveTestResult) => Iterable; - doListenForMoreData: (target: T, result: LiveTestResult, write: (s: Uint8Array) => void) => IDisposable; - }) { - const result = opts.subject.result; - const target = opts.getTarget(result); - if (!target) { - return this.clear(); - } - - const terminal = await this.makeTerminal(); - let didWriteData = false; - - const pendingWrites = new MutableObservableValue(0); - if (result instanceof LiveTestResult) { - for (const chunk of opts.doInitialWrite(target, result)) { - didWriteData ||= chunk.byteLength > 0; - pendingWrites.value++; - terminal.xterm.write(chunk.buffer, () => pendingWrites.value--); - } - } else { - didWriteData = true; - this.writeNotice(terminal, localize('runNoOutputForPast', 'Test output is only available for new test runs.')); - } - - this.attachTerminalToDom(terminal); - this.outputDataListener.clear(); - - if (result instanceof LiveTestResult && !result.completedAt) { - const l1 = result.onComplete(() => { - if (!didWriteData) { - this.writeNotice(terminal, opts.noOutputMessage); - } - }); - const l2 = opts.doListenForMoreData(target, result, data => { - terminal.xterm.write(data); - didWriteData ||= data.byteLength > 0; - }); - - this.outputDataListener.value = combinedDisposable(l1, l2); - } - - if (!this.outputDataListener.value && !didWriteData) { - this.writeNotice(terminal, opts.noOutputMessage); - } - - // Ensure pending writes finish, otherwise the selection in `updateForTestSubject` - // can happen before the markers are processed. - if (pendingWrites.value > 0) { - await new Promise(resolve => { - const l = pendingWrites.onDidChange(() => { - if (pendingWrites.value === 0) { - l.dispose(); - resolve(); - } - }); - }); - } - - return terminal; - } - - private updateCwd(testUri?: URI) { - const wf = (testUri && this.workspaceContext.getWorkspaceFolder(testUri)) - || this.workspaceContext.getWorkspace().folders[0]; - if (wf) { - this.terminalCwd.value = wf.uri.fsPath; - } - } - - private writeNotice(terminal: IDetachedTerminalInstance, str: string) { - terminal.xterm.write(formatMessageForTerminal(str)); - } - - private attachTerminalToDom(terminal: IDetachedTerminalInstance) { - terminal.xterm.write('\x1b[?25l'); // hide cursor - dom.scheduleAtNextAnimationFrame(dom.getWindow(this.container), () => this.layoutTerminal(terminal)); - terminal.attachToElement(this.container, { enableGpu: false }); - } - - private clear() { - this.outputDataListener.clear(); - this.xtermLayoutDelayer.cancel(); - this.terminal.clear(); - } - - public layout(dimensions: dom.IDimension) { - this.dimensions = dimensions; - if (this.terminal.value) { - this.layoutTerminal(this.terminal.value, dimensions.width, dimensions.height); - } - } - - private layoutTerminal( - { xterm }: IDetachedTerminalInstance, - width = this.dimensions?.width ?? this.container.clientWidth, - height = this.dimensions?.height ?? this.container.clientHeight - ) { - width -= 10 + 20; // scrollbar width + margin - this.xtermLayoutDelayer.trigger(() => { - const scaled = getXtermScaledDimensions(dom.getWindow(this.container), xterm.getFont(), width, height); - if (scaled) { - xterm.resize(scaled.cols, scaled.rows); - } - }); - } -} - const hintMessagePeekHeight = (msg: ITestMessage) => { - const msgHeight = isDiffable(msg) + const msgHeight = ITestMessage.isDiffable(msg) ? Math.max(hintPeekStrHeight(msg.actual), hintPeekStrHeight(msg.expected)) : hintPeekStrHeight(typeof msg.message === 'string' ? msg.message : msg.message.value); @@ -1742,28 +1148,9 @@ const firstLine = (str: string) => { return index === -1 ? str : str.slice(0, index); }; -const isMultiline = (str: string | undefined) => !!str && str.includes('\n'); const hintPeekStrHeight = (str: string) => Math.min(count(str, '\n'), 24); -class SimpleDiffEditorModel extends EditorModel { - public readonly original = this._original.object.textEditorModel; - public readonly modified = this._modified.object.textEditorModel; - - constructor( - private readonly _original: IReference, - private readonly _modified: IReference, - ) { - super(); - } - - public override dispose() { - super.dispose(); - this._original.dispose(); - this._modified.dispose(); - } -} - function getOuterEditorFromDiffEditor(codeEditorService: ICodeEditorService): ICodeEditor | null { const diffEditors = codeEditorService.listDiffEditors(); @@ -1797,771 +1184,6 @@ export class CloseTestPeek extends EditorAction2 { } } -interface ITreeElement { - type: string; - context: unknown; - id: string; - label: string; - onDidChange: Event; - labelWithIcons?: readonly (HTMLSpanElement | string)[]; - icon?: ThemeIcon; - description?: string; - ariaLabel?: string; -} - -class TestResultElement implements ITreeElement { - public readonly changeEmitter = new Emitter(); - public readonly onDidChange = this.changeEmitter.event; - public readonly type = 'result'; - public readonly context = this.value.id; - public readonly id = this.value.id; - public readonly label = this.value.name; - - public get icon() { - return icons.testingStatesToIcons.get( - this.value.completedAt === undefined - ? TestResultState.Running - : maxCountPriority(this.value.counts) - ); - } - - constructor(public readonly value: ITestResult) { } -} - -const openCoverageLabel = localize('openTestCoverage', 'View Test Coverage'); -const closeCoverageLabel = localize('closeTestCoverage', 'Close Test Coverage'); - -class CoverageElement implements ITreeElement { - public readonly type = 'coverage'; - public readonly context: undefined; - public readonly id = `coverage-${this.results.id}/${this.task.id}`; - public readonly onDidChange: Event; - - public get label() { - return this.isOpen ? closeCoverageLabel : openCoverageLabel; - } - - public get icon() { - return this.isOpen ? widgetClose : icons.testingCoverageReport; - } - - public get isOpen() { - return this.coverageService.selected.get()?.fromTaskId === this.task.id; - } - - constructor( - private readonly results: ITestResult, - public readonly task: ITestRunTaskResults, - private readonly coverageService: ITestCoverageService, - ) { - this.onDidChange = Event.fromObservableLight(coverageService.selected); - } - -} - -class TestCaseElement implements ITreeElement { - public readonly type = 'test'; - public readonly context: ITestItemContext = { - $mid: MarshalledId.TestItemContext, - tests: [InternalTestItem.serialize(this.test)], - }; - public readonly id = `${this.results.id}/${this.test.item.extId}`; - public readonly description?: string; - - public get onDidChange() { - if (!(this.results instanceof LiveTestResult)) { - return Event.None; - } - - return Event.filter(this.results.onChange, e => e.item.item.extId === this.test.item.extId); - } - - public get state() { - return this.test.tasks[this.taskIndex].state; - } - - public get label() { - return this.test.item.label; - } - - public get labelWithIcons() { - return renderLabelWithIcons(this.label); - } - - public get icon() { - return icons.testingStatesToIcons.get(this.state); - } - - public get outputSubject() { - return new TestOutputSubject(this.results, this.taskIndex, this.test); - } - - - constructor( - public readonly results: ITestResult, - public readonly test: TestResultItem, - public readonly taskIndex: number, - ) { } -} - -class TaskElement implements ITreeElement { - public readonly changeEmitter = new Emitter(); - public readonly onDidChange = this.changeEmitter.event; - public readonly type = 'task'; - public readonly context: string; - public readonly id: string; - public readonly label: string; - public readonly itemsCache = new CreationCache(); - - public get icon() { - return this.results.tasks[this.index].running ? icons.testingStatesToIcons.get(TestResultState.Running) : undefined; - } - - constructor(public readonly results: ITestResult, public readonly task: ITestRunTaskResults, public readonly index: number) { - this.id = `${results.id}/${index}`; - this.task = results.tasks[index]; - this.context = String(index); - this.label = this.task.name ?? localize('testUnnamedTask', 'Unnamed Task'); - } -} - -class TestMessageElement implements ITreeElement { - public readonly type = 'message'; - public readonly id: string; - public readonly label: string; - public readonly uri: URI; - public readonly location?: IRichLocation; - public readonly description?: string; - public readonly contextValue?: string; - public readonly message: ITestMessage; - - public get onDidChange() { - if (!(this.result instanceof LiveTestResult)) { - return Event.None; - } - - // rerender when the test case changes so it gets retired events - return Event.filter(this.result.onChange, e => e.item.item.extId === this.test.item.extId); - } - - public get context(): ITestMessageMenuArgs { - return getMessageArgs(this.test, this.message); - } - - public get outputSubject() { - return new TestOutputSubject(this.result, this.taskIndex, this.test); - } - - constructor( - public readonly result: ITestResult, - public readonly test: TestResultItem, - public readonly taskIndex: number, - public readonly messageIndex: number, - ) { - const m = this.message = test.tasks[taskIndex].messages[messageIndex]; - - this.location = m.location; - this.contextValue = m.type === TestMessageType.Error ? m.contextValue : undefined; - this.uri = buildTestUri({ - type: TestUriType.ResultMessage, - messageIndex, - resultId: result.id, - taskIndex, - testExtId: test.item.extId - }); - - this.id = this.uri.toString(); - - const asPlaintext = renderTestMessageAsText(m.message); - const lines = count(asPlaintext.trimEnd(), '\n'); - this.label = firstLine(asPlaintext); - if (lines > 0) { - this.description = lines > 1 - ? localize('messageMoreLinesN', '+ {0} more lines', lines) - : localize('messageMoreLines1', '+ 1 more line'); - } - } -} - -type TreeElement = TestResultElement | TestCaseElement | TestMessageElement | TaskElement | CoverageElement; - -class OutputPeekTree extends Disposable { - private disposed = false; - private readonly tree: WorkbenchCompressibleObjectTree; - private readonly treeActions: TreeActionsProvider; - private readonly requestReveal = this._register(new Emitter()); - - public readonly onDidRequestReview = this.requestReveal.event; - - constructor( - container: HTMLElement, - onDidReveal: Event<{ subject: InspectSubject; preserveFocus: boolean }>, - options: { showRevealLocationOnMessages: boolean; locationForProgress: string }, - @IContextMenuService private readonly contextMenuService: IContextMenuService, - @ITestResultService results: ITestResultService, - @IInstantiationService instantiationService: IInstantiationService, - @ITestExplorerFilterState explorerFilter: ITestExplorerFilterState, - @ITestCoverageService coverageService: ITestCoverageService, - @IProgressService progressService: IProgressService, - ) { - super(); - - this.treeActions = instantiationService.createInstance(TreeActionsProvider, options.showRevealLocationOnMessages, this.requestReveal,); - const diffIdentityProvider: IIdentityProvider = { - getId(e: TreeElement) { - return e.id; - } - }; - - this.tree = this._register(instantiationService.createInstance( - WorkbenchCompressibleObjectTree, - 'Test Output Peek', - container, - { - getHeight: () => 22, - getTemplateId: () => TestRunElementRenderer.ID, - }, - [instantiationService.createInstance(TestRunElementRenderer, this.treeActions)], - { - compressionEnabled: true, - hideTwistiesOfChildlessElements: true, - identityProvider: diffIdentityProvider, - sorter: { - compare(a, b) { - if (a instanceof TestCaseElement && b instanceof TestCaseElement) { - return cmpPriority(a.state, b.state); - } - - return 0; - }, - }, - accessibilityProvider: { - getAriaLabel(element: ITreeElement) { - return element.ariaLabel || element.label; - }, - getWidgetAriaLabel() { - return localize('testingPeekLabel', 'Test Result Messages'); - } - } - }, - )) as WorkbenchCompressibleObjectTree; - - const cc = new CreationCache(); - const getTaskChildren = (taskElem: TaskElement): Iterable> => { - const { results, index, itemsCache, task } = taskElem; - const tests = Iterable.filter(results.tests, test => test.tasks[index].state >= TestResultState.Running || test.tasks[index].messages.length > 0); - let result: Iterable> = Iterable.map(tests, test => ({ - element: itemsCache.getOrCreate(test, () => new TestCaseElement(results, test, index)), - incompressible: true, - children: getTestChildren(results, test, index), - })); - - if (task.coverage.get()) { - result = Iterable.concat( - Iterable.single>({ - element: new CoverageElement(results, task, coverageService), - collapsible: true, - incompressible: true, - }), - result, - ); - } - - return result; - }; - - const getTestChildren = (result: ITestResult, test: TestResultItem, taskIndex: number): Iterable> => { - return test.tasks[taskIndex].messages - .map((m, messageIndex) => - m.type === TestMessageType.Error - ? { element: cc.getOrCreate(m, () => new TestMessageElement(result, test, taskIndex, messageIndex)), incompressible: false } - : undefined - ) - .filter(isDefined); - }; - - const getResultChildren = (result: ITestResult): Iterable> => { - return result.tasks.map((task, taskIndex) => { - const taskElem = cc.getOrCreate(task, () => new TaskElement(result, task, taskIndex)); - return ({ - element: taskElem, - incompressible: false, - collapsible: true, - children: getTaskChildren(taskElem), - }); - }); - }; - - const getRootChildren = () => results.results.map(result => { - const element = cc.getOrCreate(result, () => new TestResultElement(result)); - return { - element, - incompressible: true, - collapsible: true, - collapsed: this.tree.hasElement(element) ? this.tree.isCollapsed(element) : true, - children: getResultChildren(result) - }; - }); - - // Queued result updates to prevent spamming CPU when lots of tests are - // completing and messaging quickly (#142514) - const taskChildrenToUpdate = new Set(); - const taskChildrenUpdate = this._register(new RunOnceScheduler(() => { - for (const taskNode of taskChildrenToUpdate) { - if (this.tree.hasElement(taskNode)) { - this.tree.setChildren(taskNode, getTaskChildren(taskNode), { diffIdentityProvider }); - } - } - taskChildrenToUpdate.clear(); - }, 300)); - - const queueTaskChildrenUpdate = (taskNode: TaskElement) => { - taskChildrenToUpdate.add(taskNode); - if (!taskChildrenUpdate.isScheduled()) { - taskChildrenUpdate.schedule(); - } - }; - - const attachToResults = (result: LiveTestResult) => { - const resultNode = cc.get(result)! as TestResultElement; - const disposable = new DisposableStore(); - disposable.add(result.onNewTask(i => { - if (result.tasks.length === 1) { - this.requestReveal.fire(new TaskSubject(result, 0)); // reveal the first task in new runs - } - - if (this.tree.hasElement(resultNode)) { - this.tree.setChildren(resultNode, getResultChildren(result), { diffIdentityProvider }); - } - - // note: tasks are bounded and their lifetime is equivalent to that of - // the test result, so this doesn't leak indefinitely. - const task = result.tasks[i]; - disposable.add(autorun(reader => { - task.coverage.read(reader); // add it to the autorun - queueTaskChildrenUpdate(cc.get(task) as TaskElement); - })); - })); - disposable.add(result.onEndTask(index => { - (cc.get(result.tasks[index]) as TaskElement | undefined)?.changeEmitter.fire(); - })); - - disposable.add(result.onChange(e => { - // try updating the item in each of its tasks - for (const [index, task] of result.tasks.entries()) { - const taskNode = cc.get(task) as TaskElement; - if (!this.tree.hasElement(taskNode)) { - continue; - } - - const itemNode = taskNode.itemsCache.get(e.item); - if (itemNode && this.tree.hasElement(itemNode)) { - if (e.reason === TestResultItemChangeReason.NewMessage && e.message.type === TestMessageType.Error) { - this.tree.setChildren(itemNode, getTestChildren(result, e.item, index), { diffIdentityProvider }); - } - return; - } - - queueTaskChildrenUpdate(taskNode); - } - })); - - disposable.add(result.onComplete(() => { - resultNode.changeEmitter.fire(); - disposable.dispose(); - })); - - return resultNode; - }; - - this._register(results.onResultsChanged(e => { - // little hack here: a result change can cause the peek to be disposed, - // but this listener will still be queued. Doing stuff with the tree - // will cause errors. - if (this.disposed) { - return; - } - - if ('completed' in e) { - (cc.get(e.completed) as TestResultElement | undefined)?.changeEmitter.fire(); - return; - } - - this.tree.setChildren(null, getRootChildren(), { diffIdentityProvider }); - - // done after setChildren intentionally so that the ResultElement exists in the cache. - if ('started' in e) { - for (const child of this.tree.getNode(null).children) { - this.tree.collapse(child.element, false); - } - - this.tree.expand(attachToResults(e.started), true); - } - })); - - const revealItem = (element: TreeElement, preserveFocus: boolean) => { - this.tree.setFocus([element]); - this.tree.setSelection([element]); - if (!preserveFocus) { - this.tree.domFocus(); - } - }; - - this._register(onDidReveal(async ({ subject, preserveFocus = false }) => { - if (subject instanceof TaskSubject) { - const resultItem = this.tree.getNode(null).children.find(c => { - if (c.element instanceof TaskElement) { - return c.element.results.id === subject.result.id && c.element.index === subject.taskIndex; - } - if (c.element instanceof TestResultElement) { - return c.element.id === subject.result.id; - } - return false; - }); - - if (resultItem) { - revealItem(resultItem.element!, preserveFocus); - } - return; - } - - const revealElement = subject instanceof TestOutputSubject - ? cc.get(subject.task)?.itemsCache.get(subject.test) - : cc.get(subject.message); - if (!revealElement || !this.tree.hasElement(revealElement)) { - return; - } - - const parents: TreeElement[] = []; - for (let parent = this.tree.getParentElement(revealElement); parent; parent = this.tree.getParentElement(parent)) { - parents.unshift(parent); - } - - for (const parent of parents) { - this.tree.expand(parent); - } - - if (this.tree.getRelativeTop(revealElement) === null) { - this.tree.reveal(revealElement, 0.5); - } - - revealItem(revealElement, preserveFocus); - })); - - this._register(this.tree.onDidOpen(async e => { - if (e.element instanceof TestMessageElement) { - this.requestReveal.fire(new MessageSubject(e.element.result, e.element.test, e.element.taskIndex, e.element.messageIndex)); - } else if (e.element instanceof TestCaseElement) { - const t = e.element; - const message = mapFindTestMessage(e.element.test, (_t, _m, mesasgeIndex, taskIndex) => - new MessageSubject(t.results, t.test, taskIndex, mesasgeIndex)); - this.requestReveal.fire(message || new TestOutputSubject(t.results, 0, t.test)); - } else if (e.element instanceof CoverageElement) { - const task = e.element.task; - if (e.element.isOpen) { - return coverageService.closeCoverage(); - } - progressService.withProgress( - { location: options.locationForProgress }, - () => coverageService.openCoverage(task, true) - ); - } - })); - - this._register(this.tree.onDidChangeSelection(evt => { - for (const element of evt.elements) { - if (element && 'test' in element) { - explorerFilter.reveal.value = element.test.item.extId; - break; - } - } - })); - - - this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); - - this.tree.setChildren(null, getRootChildren()); - for (const result of results.results) { - if (!result.completedAt && result instanceof LiveTestResult) { - attachToResults(result); - } - } - } - - public layout(height: number, width: number) { - this.tree.layout(height, width); - } - - private onContextMenu(evt: ITreeContextMenuEvent) { - if (!evt.element) { - return; - } - - const actions = this.treeActions.provideActionBar(evt.element); - this.contextMenuService.showContextMenu({ - getAnchor: () => evt.anchor, - getActions: () => actions.secondary.length - ? [...actions.primary, new Separator(), ...actions.secondary] - : actions.primary, - getActionsContext: () => evt.element?.context - }); - } - - public override dispose() { - super.dispose(); - this.disposed = true; - } -} - -interface TemplateData { - label: HTMLElement; - icon: HTMLElement; - actionBar: ActionBar; - elementDisposable: DisposableStore; - templateDisposable: DisposableStore; -} - -class TestRunElementRenderer implements ICompressibleTreeRenderer { - public static readonly ID = 'testRunElementRenderer'; - public readonly templateId = TestRunElementRenderer.ID; - - constructor( - private readonly treeActions: TreeActionsProvider, - @IInstantiationService private readonly instantiationService: IInstantiationService, - ) { } - - /** @inheritdoc */ - public renderCompressedElements(node: ITreeNode, FuzzyScore>, _index: number, templateData: TemplateData): void { - const chain = node.element.elements; - const lastElement = chain[chain.length - 1]; - if ((lastElement instanceof TaskElement || lastElement instanceof TestMessageElement) && chain.length >= 2) { - this.doRender(chain[chain.length - 2], templateData, lastElement); - } else { - this.doRender(lastElement, templateData); - } - } - - /** @inheritdoc */ - public renderTemplate(container: HTMLElement): TemplateData { - const templateDisposable = new DisposableStore(); - const wrapper = dom.append(container, dom.$('.test-peek-item')); - const icon = dom.append(wrapper, dom.$('.state')); - const label = dom.append(wrapper, dom.$('.name')); - - const actionBar = new ActionBar(wrapper, { - actionViewItemProvider: (action, options) => - action instanceof MenuItemAction - ? this.instantiationService.createInstance(MenuEntryActionViewItem, action, { hoverDelegate: options.hoverDelegate }) - : undefined - }); - - const elementDisposable = new DisposableStore(); - templateDisposable.add(elementDisposable); - templateDisposable.add(actionBar); - - return { - icon, - label, - actionBar, - elementDisposable, - templateDisposable, - }; - } - - /** @inheritdoc */ - public renderElement(element: ITreeNode, _index: number, templateData: TemplateData): void { - this.doRender(element.element, templateData); - } - - /** @inheritdoc */ - public disposeTemplate(templateData: TemplateData): void { - templateData.templateDisposable.dispose(); - } - - /** Called to render a new element */ - private doRender(element: ITreeElement, templateData: TemplateData, subjectElement?: ITreeElement) { - templateData.elementDisposable.clear(); - templateData.elementDisposable.add( - element.onDidChange(() => this.doRender(element, templateData, subjectElement)), - ); - this.doRenderInner(element, templateData, subjectElement); - } - - /** Called, and may be re-called, to render or re-render an element */ - private doRenderInner(element: ITreeElement, templateData: TemplateData, subjectElement: ITreeElement | undefined) { - let { label, labelWithIcons, description } = element; - if (subjectElement instanceof TestMessageElement) { - description = subjectElement.label; - } - - const descriptionElement = description ? dom.$('span.test-label-description', {}, description) : ''; - if (labelWithIcons) { - dom.reset(templateData.label, ...labelWithIcons, descriptionElement); - } else { - dom.reset(templateData.label, label, descriptionElement); - } - - const icon = element.icon; - templateData.icon.className = `computed-state ${icon ? ThemeIcon.asClassName(icon) : ''}`; - - const actions = this.treeActions.provideActionBar(element); - templateData.actionBar.clear(); - templateData.actionBar.context = element.context; - templateData.actionBar.push(actions.primary, { icon: true, label: false }); - } -} - -class TreeActionsProvider { - constructor( - private readonly showRevealLocationOnMessages: boolean, - private readonly requestReveal: Emitter, - @IContextKeyService private readonly contextKeyService: IContextKeyService, - @IMenuService private readonly menuService: IMenuService, - @ICommandService private readonly commandService: ICommandService, - @ITestProfileService private readonly testProfileService: ITestProfileService, - @IEditorService private readonly editorService: IEditorService, - ) { } - - public provideActionBar(element: ITreeElement) { - const test = element instanceof TestCaseElement ? element.test : undefined; - const capabilities = test ? this.testProfileService.capabilitiesForTest(test) : 0; - - const contextKeys: [string, unknown][] = [ - ['peek', Testing.OutputPeekContributionId], - [TestingContextKeys.peekItemType.key, element.type], - ]; - - let id = MenuId.TestPeekElement; - const primary: IAction[] = []; - const secondary: IAction[] = []; - - if (element instanceof TaskElement) { - primary.push(new Action( - 'testing.outputPeek.showResultOutput', - localize('testing.showResultOutput', "Show Result Output"), - ThemeIcon.asClassName(Codicon.terminal), - undefined, - () => this.requestReveal.fire(new TaskSubject(element.results, element.index)), - )); - } - - if (element instanceof TestResultElement) { - // only show if there are no collapsed test nodes that have more specific choices - if (element.value.tasks.length === 1) { - primary.push(new Action( - 'testing.outputPeek.showResultOutput', - localize('testing.showResultOutput', "Show Result Output"), - ThemeIcon.asClassName(Codicon.terminal), - undefined, - () => this.requestReveal.fire(new TaskSubject(element.value, 0)), - )); - } - - primary.push(new Action( - 'testing.outputPeek.reRunLastRun', - localize('testing.reRunLastRun', "Rerun Test Run"), - ThemeIcon.asClassName(icons.testingRunIcon), - undefined, - () => this.commandService.executeCommand('testing.reRunLastRun', element.value.id), - )); - - if (capabilities & TestRunProfileBitset.Debug) { - primary.push(new Action( - 'testing.outputPeek.debugLastRun', - localize('testing.debugLastRun', "Debug Test Run"), - ThemeIcon.asClassName(icons.testingDebugIcon), - undefined, - () => this.commandService.executeCommand('testing.debugLastRun', element.value.id), - )); - } - } - - if (element instanceof TestCaseElement || element instanceof TestMessageElement) { - contextKeys.push( - [TestingContextKeys.testResultOutdated.key, element.test.retired], - [TestingContextKeys.testResultState.key, testResultStateToContextValues[element.test.ownComputedState]], - ...getTestItemContextOverlay(element.test, capabilities), - ); - - const extId = element.test.item.extId; - if (element.test.tasks[element.taskIndex].messages.some(m => m.type === TestMessageType.Output)) { - primary.push(new Action( - 'testing.outputPeek.showResultOutput', - localize('testing.showResultOutput', "Show Result Output"), - ThemeIcon.asClassName(Codicon.terminal), - undefined, - () => this.requestReveal.fire(element.outputSubject), - )); - } - - secondary.push(new Action( - 'testing.outputPeek.revealInExplorer', - localize('testing.revealInExplorer', "Reveal in Test Explorer"), - ThemeIcon.asClassName(Codicon.listTree), - undefined, - () => this.commandService.executeCommand('_revealTestInExplorer', extId), - )); - - if (capabilities & TestRunProfileBitset.Run) { - primary.push(new Action( - 'testing.outputPeek.runTest', - localize('run test', 'Run Test'), - ThemeIcon.asClassName(icons.testingRunIcon), - undefined, - () => this.commandService.executeCommand('vscode.runTestsById', TestRunProfileBitset.Run, extId), - )); - } - - if (capabilities & TestRunProfileBitset.Debug) { - primary.push(new Action( - 'testing.outputPeek.debugTest', - localize('debug test', 'Debug Test'), - ThemeIcon.asClassName(icons.testingDebugIcon), - undefined, - () => this.commandService.executeCommand('vscode.runTestsById', TestRunProfileBitset.Debug, extId), - )); - } - - } - - if (element instanceof TestMessageElement) { - primary.push(new Action( - 'testing.outputPeek.goToFile', - localize('testing.goToFile', "Go to Source"), - ThemeIcon.asClassName(Codicon.goToFile), - undefined, - () => this.commandService.executeCommand('vscode.revealTest', element.test.item.extId), - )); - } - - if (element instanceof TestMessageElement) { - id = MenuId.TestMessageContext; - contextKeys.push([TestingContextKeys.testMessageContext.key, element.contextValue]); - if (this.showRevealLocationOnMessages && element.location) { - primary.push(new Action( - 'testing.outputPeek.goToError', - localize('testing.goToError', "Go to Source"), - ThemeIcon.asClassName(Codicon.goToFile), - undefined, - () => this.editorService.openEditor({ - resource: element.location!.uri, - options: { - selection: element.location!.range, - preserveFocus: true, - } - }), - )); - } - } - - - const contextOverlay = this.contextKeyService.createOverlay(contextKeys); - const result = { primary, secondary }; - const menu = this.menuService.getMenuActions(id, contextOverlay, { arg: element.context }); - createAndFillInActionBarActions(menu, result, 'inline'); - return result; - } -} const navWhen = ContextKeyExpr.and( EditorContextKeys.focus, @@ -2717,22 +1339,3 @@ export class ToggleTestingPeekHistory extends Action2 { opener.historyVisible.value = !opener.historyVisible.value; } } - -class CreationCache { - private readonly v = new WeakMap(); - - public get(key: object): T2 | undefined { - return this.v.get(key) as T2 | undefined; - } - - public getOrCreate(ref: object, factory: () => T2): T2 { - const existing = this.v.get(ref); - if (existing) { - return existing as T2; - } - - const fresh = factory(); - this.v.set(ref, fresh); - return fresh; - } -} diff --git a/src/vs/workbench/contrib/testing/common/testTypes.ts b/src/vs/workbench/contrib/testing/common/testTypes.ts index 5a90948fc68b5..f551217600e2e 100644 --- a/src/vs/workbench/contrib/testing/common/testTypes.ts +++ b/src/vs/workbench/contrib/testing/common/testTypes.ts @@ -169,6 +169,32 @@ export const enum TestMessageType { Output } +export interface ITestMessageStackTrace { + label: string; + uri: URI | undefined; + position: Position | undefined; +} + +export namespace ITestMessageStackTrace { + export interface Serialized { + label: string; + uri: UriComponents | undefined; + position: IPosition | undefined; + } + + export const serialize = (stack: Readonly): Serialized => ({ + label: stack.label, + uri: stack.uri?.toJSON(), + position: stack.position?.toJSON(), + }); + + export const deserialize = (uriIdentity: ITestUriCanonicalizer, stack: Serialized): ITestMessageStackTrace => ({ + label: stack.label, + uri: stack.uri ? uriIdentity.asCanonicalUri(URI.revive(stack.uri)) : undefined, + position: stack.position ? Position.lift(stack.position) : undefined, + }); +} + export interface ITestErrorMessage { message: string | IMarkdownString; type: TestMessageType.Error; @@ -176,6 +202,7 @@ export interface ITestErrorMessage { actual: string | undefined; contextValue: string | undefined; location: IRichLocation | undefined; + stackTrace: undefined | ITestMessageStackTrace[]; } export namespace ITestErrorMessage { @@ -186,6 +213,7 @@ export namespace ITestErrorMessage { actual: string | undefined; contextValue: string | undefined; location: IRichLocation.Serialize | undefined; + stackTrace: undefined | ITestMessageStackTrace.Serialized[]; } export const serialize = (message: Readonly): Serialized => ({ @@ -195,6 +223,7 @@ export namespace ITestErrorMessage { actual: message.actual, contextValue: message.contextValue, location: message.location && IRichLocation.serialize(message.location), + stackTrace: message.stackTrace?.map(ITestMessageStackTrace.serialize), }); export const deserialize = (uriIdentity: ITestUriCanonicalizer, message: Serialized): ITestErrorMessage => ({ @@ -204,6 +233,7 @@ export namespace ITestErrorMessage { actual: message.actual, contextValue: message.contextValue, location: message.location && IRichLocation.deserialize(uriIdentity, message.location), + stackTrace: message.stackTrace && message.stackTrace.map(s => ITestMessageStackTrace.deserialize(uriIdentity, s)), }); } @@ -258,6 +288,9 @@ export namespace ITestMessage { export const deserialize = (uriIdentity: ITestUriCanonicalizer, message: Serialized): ITestMessage => message.type === TestMessageType.Error ? ITestErrorMessage.deserialize(uriIdentity, message) : ITestOutputMessage.deserialize(uriIdentity, message); + + export const isDiffable = (message: ITestMessage): message is ITestErrorMessage & { actual: string; expected: string } => + message.type === TestMessageType.Error && message.actual !== undefined && message.expected !== undefined; } export interface ITestTaskState { diff --git a/src/vscode-dts/vscode.proposed.testMessageStackTrace.d.ts b/src/vscode-dts/vscode.proposed.testMessageStackTrace.d.ts new file mode 100644 index 0000000000000..b3f09b92835ae --- /dev/null +++ b/src/vscode-dts/vscode.proposed.testMessageStackTrace.d.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + export class TestMessage2 extends TestMessage { + /** + * The stack trace associated with the message or failure. + */ + stackTrace?: TestMessageStackFrame[]; + } + + export class TestMessageStackFrame { + /** + * The location of this stack frame. This should be provided as a URI if the + * location of the call frame can be accessed by the editor. + */ + file?: Uri; + + /** + * Position of the stack frame within the file. + */ + position?: Position; + + /** + * The name of the stack frame, typically a method or function name. + */ + label: string; + + /** + * @param label The name of the stack frame + * @param file The file URI of the stack frame + * @param position The position of the stack frame within the file + */ + constructor(label: string, file?: Uri, position?: Position); + } +} From fecf501d5569125c1b08821838c584fc4c0d0ad4 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 8 Jul 2024 15:52:05 -0700 Subject: [PATCH 723/755] fix tests, more split --- .../api/test/browser/extHostTesting.test.ts | 4 +- .../testResultsView/testResultsViewContent.ts | 305 ++++++++++++++++++ .../testing/browser/testingOutputPeek.ts | 293 +---------------- 3 files changed, 314 insertions(+), 288 deletions(-) create mode 100644 src/vs/workbench/contrib/testing/browser/testResultsView/testResultsViewContent.ts diff --git a/src/vs/workbench/api/test/browser/extHostTesting.test.ts b/src/vs/workbench/api/test/browser/extHostTesting.test.ts index c4515796d05dd..4a49c8031a217 100644 --- a/src/vs/workbench/api/test/browser/extHostTesting.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTesting.test.ts @@ -829,7 +829,8 @@ suite('ExtHost Testing', () => { expected: undefined, contextValue: undefined, actual: undefined, - location: convert.location.from(message1.location) + location: convert.location.from(message1.location), + stackTrace: undefined, }] ]); @@ -846,6 +847,7 @@ suite('ExtHost Testing', () => { expected: undefined, actual: undefined, location: convert.location.from({ uri: test2.uri!, range: test2.range }), + stackTrace: undefined, }] ]); diff --git a/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsViewContent.ts b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsViewContent.ts new file mode 100644 index 0000000000000..2bdc631d95e13 --- /dev/null +++ b/src/vs/workbench/contrib/testing/browser/testResultsView/testResultsViewContent.ts @@ -0,0 +1,305 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from 'vs/base/browser/dom'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; +import { Orientation, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; +import { Limiter } from 'vs/base/common/async'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { Emitter, Event } from 'vs/base/common/event'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import 'vs/css!./testingOutputPeek'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { localize } from 'vs/nls'; +import { FloatingClickMenu } from 'vs/platform/actions/browser/floatingMenu'; +import { MenuId } from 'vs/platform/actions/common/actions'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { DiffContentProvider, IPeekOutputRenderer, MarkdownTestMessagePeek, PlainTextMessagePeek, TerminalMessagePeek } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput'; +import { InspectSubject, MessageSubject, equalsSubject } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject'; +import { OutputPeekTree } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsTree'; +import { TestingOutputPeekController } from 'vs/workbench/contrib/testing/browser/testingOutputPeek'; +import { IObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; +import { LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; +import { ITestFollowup, ITestService } from 'vs/workbench/contrib/testing/common/testService'; +import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys'; + + +export class TestResultsViewContent extends Disposable { + private static lastSplitWidth?: number; + + private readonly didReveal = this._register(new Emitter<{ subject: InspectSubject; preserveFocus: boolean }>()); + private readonly currentSubjectStore = this._register(new DisposableStore()); + private followupWidget!: FollowupActionWidget; + private messageContextKeyService!: IContextKeyService; + private contextKeyTestMessage!: IContextKey; + private contextKeyResultOutdated!: IContextKey; + + private dimension?: dom.Dimension; + private splitView!: SplitView; + private messageContainer!: HTMLElement; + private contentProviders!: IPeekOutputRenderer[]; + private contentProvidersUpdateLimiter = this._register(new Limiter(1)); + + public current?: InspectSubject; + + /** Fired when a tree item is selected. Populated only on .fillBody() */ + public onDidRequestReveal!: Event; + + constructor( + private readonly editor: ICodeEditor | undefined, + private readonly options: { + historyVisible: IObservableValue; + showRevealLocationOnMessages: boolean; + locationForProgress: string; + }, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @ITextModelService protected readonly modelService: ITextModelService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + ) { + super(); + } + + public fillBody(containerElement: HTMLElement): void { + const initialSpitWidth = TestResultsViewContent.lastSplitWidth; + this.splitView = new SplitView(containerElement, { orientation: Orientation.HORIZONTAL }); + + const { historyVisible, showRevealLocationOnMessages } = this.options; + const isInPeekView = this.editor !== undefined; + const messageContainer = this.messageContainer = dom.append(containerElement, dom.$('.test-output-peek-message-container')); + this.followupWidget = this._register(this.instantiationService.createInstance(FollowupActionWidget, messageContainer, this.editor)); + this.contentProviders = [ + this._register(this.instantiationService.createInstance(DiffContentProvider, this.editor, messageContainer)), + this._register(this.instantiationService.createInstance(MarkdownTestMessagePeek, messageContainer)), + this._register(this.instantiationService.createInstance(TerminalMessagePeek, messageContainer, isInPeekView)), + this._register(this.instantiationService.createInstance(PlainTextMessagePeek, this.editor, messageContainer)), + ]; + + this.messageContextKeyService = this._register(this.contextKeyService.createScoped(containerElement)); + this.contextKeyTestMessage = TestingContextKeys.testMessageContext.bindTo(this.messageContextKeyService); + this.contextKeyResultOutdated = TestingContextKeys.testResultOutdated.bindTo(this.messageContextKeyService); + + const treeContainer = dom.append(containerElement, dom.$('.test-output-peek-tree')); + const tree = this._register(this.instantiationService.createInstance( + OutputPeekTree, + treeContainer, + this.didReveal.event, + { showRevealLocationOnMessages, locationForProgress: this.options.locationForProgress }, + )); + + this.onDidRequestReveal = tree.onDidRequestReview; + + this.splitView.addView({ + onDidChange: Event.None, + element: messageContainer, + minimumSize: 200, + maximumSize: Number.MAX_VALUE, + layout: width => { + TestResultsViewContent.lastSplitWidth = width; + if (this.dimension) { + for (const provider of this.contentProviders) { + provider.layout({ height: this.dimension.height, width }); + } + } + }, + }, Sizing.Distribute); + + this.splitView.addView({ + onDidChange: Event.None, + element: treeContainer, + minimumSize: 100, + maximumSize: Number.MAX_VALUE, + layout: width => { + if (this.dimension) { + tree.layout(this.dimension.height, width); + } + }, + }, Sizing.Distribute); + + const historyViewIndex = 1; + this.splitView.setViewVisible(historyViewIndex, historyVisible.value); + this._register(historyVisible.onDidChange(visible => { + this.splitView.setViewVisible(historyViewIndex, visible); + })); + + if (initialSpitWidth) { + queueMicrotask(() => this.splitView.resizeView(0, initialSpitWidth)); + } + } + + /** + * Shows a message in-place without showing or changing the peek location. + * This is mostly used if peeking a message without a location. + */ + public reveal(opts: { subject: InspectSubject; preserveFocus: boolean }) { + this.didReveal.fire(opts); + + if (this.current && equalsSubject(this.current, opts.subject)) { + return Promise.resolve(); + } + + this.current = opts.subject; + return this.contentProvidersUpdateLimiter.queue(async () => { + await Promise.all(this.contentProviders.map(p => p.update(opts.subject))); + this.followupWidget.show(opts.subject); + this.currentSubjectStore.clear(); + this.populateFloatingClick(opts.subject); + }); + } + + private populateFloatingClick(subject: InspectSubject) { + if (!(subject instanceof MessageSubject)) { + return; + } + + this.currentSubjectStore.add(toDisposable(() => { + this.contextKeyResultOutdated.reset(); + this.contextKeyTestMessage.reset(); + })); + + this.contextKeyTestMessage.set(subject.contextValue || ''); + if (subject.result instanceof LiveTestResult) { + this.contextKeyResultOutdated.set(subject.result.getStateById(subject.test.extId)?.retired ?? false); + this.currentSubjectStore.add(subject.result.onChange(ev => { + if (ev.item.item.extId === subject.test.extId) { + this.contextKeyResultOutdated.set(ev.item.retired ?? false); + } + })); + } else { + this.contextKeyResultOutdated.set(true); + } + + const instaService = this.currentSubjectStore.add(this.instantiationService + .createChild(new ServiceCollection([IContextKeyService, this.messageContextKeyService]))); + + this.currentSubjectStore.add(instaService.createInstance(FloatingClickMenu, { + container: this.messageContainer, + menuId: MenuId.TestMessageContent, + getActionArg: () => (subject as MessageSubject).context, + })); + } + + public onLayoutBody(height: number, width: number) { + this.dimension = new dom.Dimension(width, height); + this.splitView.layout(width); + } + + public onWidth(width: number) { + this.splitView.layout(width); + } +} + +const FOLLOWUP_ANIMATION_MIN_TIME = 500; + +class FollowupActionWidget extends Disposable { + private readonly el = dom.h('div.testing-followup-action', []); + private readonly visibleStore = this._register(new DisposableStore()); + + constructor( + private readonly container: HTMLElement, + private readonly editor: ICodeEditor | undefined, + @ITestService private readonly testService: ITestService, + @IQuickInputService private readonly quickInput: IQuickInputService, + ) { + super(); + } + + public show(subject: InspectSubject) { + this.visibleStore.clear(); + if (subject instanceof MessageSubject) { + this.showMessage(subject); + } + } + + private async showMessage(subject: MessageSubject) { + const cts = this.visibleStore.add(new CancellationTokenSource()); + const start = Date.now(); + + // Wait for completion otherwise results will not be available to the ext host: + if (subject.result instanceof LiveTestResult && !subject.result.completedAt) { + await new Promise(r => Event.once((subject.result as LiveTestResult).onComplete)(r)); + } + + const followups = await this.testService.provideTestFollowups({ + extId: subject.test.extId, + messageIndex: subject.messageIndex, + resultId: subject.result.id, + taskIndex: subject.taskIndex, + }, cts.token); + + + if (!followups.followups.length || cts.token.isCancellationRequested) { + followups.dispose(); + return; + } + + this.visibleStore.add(followups); + + dom.clearNode(this.el.root); + this.el.root.classList.toggle('animated', Date.now() - start > FOLLOWUP_ANIMATION_MIN_TIME); + + this.el.root.appendChild(this.makeFollowupLink(followups.followups[0])); + if (followups.followups.length > 1) { + this.el.root.appendChild(this.makeMoreLink(followups.followups)); + } + + this.container.appendChild(this.el.root); + this.visibleStore.add(toDisposable(() => { + this.el.root.remove(); + })); + } + + private makeFollowupLink(first: ITestFollowup) { + const link = this.makeLink(() => this.actionFollowup(link, first)); + dom.reset(link, ...renderLabelWithIcons(first.message)); + return link; + } + + private makeMoreLink(followups: ITestFollowup[]) { + const link = this.makeLink(() => + this.quickInput.pick(followups.map((f, i) => ({ + label: f.message, + index: i + }))).then(picked => { + if (picked?.length) { + followups[picked[0].index].execute(); + } + }) + ); + + link.innerText = localize('testFollowup.more', '+{0} More...', followups.length - 1); + return link; + } + + private makeLink(onClick: () => void) { + const link = document.createElement('a'); + link.tabIndex = 0; + this.visibleStore.add(dom.addDisposableListener(link, 'click', onClick)); + this.visibleStore.add(dom.addDisposableListener(link, 'keydown', e => { + const event = new StandardKeyboardEvent(e); + if (event.equals(KeyCode.Space) || event.equals(KeyCode.Enter)) { + onClick(); + } + })); + + return link; + } + + private actionFollowup(link: HTMLAnchorElement, fu: ITestFollowup) { + if (link.ariaDisabled !== 'true') { + link.ariaDisabled = 'true'; + fu.execute(); + + if (this.editor) { + TestingOutputPeekController.get(this.editor)?.removePeek(); + } + } + } +} diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index 0012ae4a1c561..ca336ec5632b4 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -4,13 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { alert } from 'vs/base/browser/ui/aria/aria'; -import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; -import { Orientation, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; import { IAction } from 'vs/base/common/actions'; -import { Limiter } from 'vs/base/common/async'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; @@ -18,7 +13,7 @@ import { stripIcons } from 'vs/base/common/iconLabels'; import { Iterable } from 'vs/base/common/iterator'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { Lazy } from 'vs/base/common/lazy'; -import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { count } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./testingOutputPeek'; @@ -35,7 +30,6 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IPeekViewService, PeekViewWidget, peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/peekView/browser/peekView'; import { localize, localize2 } from 'vs/nls'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; -import { FloatingClickMenu } from 'vs/platform/actions/browser/floatingMenu'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { Action2, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -50,7 +44,6 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; @@ -58,17 +51,16 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { IViewDescriptorService } from 'vs/workbench/common/views'; import { renderTestMessageAsText } from 'vs/workbench/contrib/testing/browser/testMessageColorizer'; -import { DiffContentProvider, IPeekOutputRenderer, MarkdownTestMessagePeek, PlainTextMessagePeek, TerminalMessagePeek } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsOutput'; -import { InspectSubject, MessageSubject, TaskSubject, TestOutputSubject, equalsSubject, mapFindTestMessage } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject'; -import { OutputPeekTree } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsTree'; +import { InspectSubject, MessageSubject, TaskSubject, TestOutputSubject, mapFindTestMessage } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsSubject'; +import { TestResultsViewContent } from 'vs/workbench/contrib/testing/browser/testResultsView/testResultsViewContent'; import { testingMessagePeekBorder, testingPeekBorder, testingPeekHeaderBackground, testingPeekMessageHeaderBackground } from 'vs/workbench/contrib/testing/browser/theme'; import { AutoOpenPeekViewWhen, TestingConfigKeys, getTestingConfiguration } from 'vs/workbench/contrib/testing/common/configuration'; import { Testing } from 'vs/workbench/contrib/testing/common/constants'; -import { IObservableValue, MutableObservableValue, staticObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; +import { MutableObservableValue, staticObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; import { StoredValue } from 'vs/workbench/contrib/testing/common/storedValue'; -import { ITestResult, LiveTestResult, TestResultItemChange, TestResultItemChangeReason, resultItemParents } from 'vs/workbench/contrib/testing/common/testResult'; +import { ITestResult, TestResultItemChange, TestResultItemChangeReason, resultItemParents } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService, ResultChangeEvent } from 'vs/workbench/contrib/testing/common/testResultService'; -import { ITestFollowup, ITestService } from 'vs/workbench/contrib/testing/common/testService'; +import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; import { IRichLocation, ITestMessage, TestMessageType, TestResultItem } from 'vs/workbench/contrib/testing/common/testTypes'; import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys'; import { IShowResultOptions, ITestingPeekOpener } from 'vs/workbench/contrib/testing/common/testingPeekOpener'; @@ -403,7 +395,6 @@ export class TestingPeekOpener extends Disposable implements ITestingPeekOpener } } - /** * Adds output/message peek functionality to code editors. */ @@ -661,278 +652,6 @@ export class TestingOutputPeekController extends Disposable implements IEditorCo } } -const FOLLOWUP_ANIMATION_MIN_TIME = 500; - -class FollowupActionWidget extends Disposable { - private readonly el = dom.h('div.testing-followup-action', []); - private readonly visibleStore = this._register(new DisposableStore()); - - constructor( - private readonly container: HTMLElement, - private readonly editor: ICodeEditor | undefined, - @ITestService private readonly testService: ITestService, - @IQuickInputService private readonly quickInput: IQuickInputService, - ) { - super(); - } - - public show(subject: InspectSubject) { - this.visibleStore.clear(); - if (subject instanceof MessageSubject) { - this.showMessage(subject); - } - } - - private async showMessage(subject: MessageSubject) { - const cts = this.visibleStore.add(new CancellationTokenSource()); - const start = Date.now(); - - // Wait for completion otherwise results will not be available to the ext host: - if (subject.result instanceof LiveTestResult && !subject.result.completedAt) { - await new Promise(r => Event.once((subject.result as LiveTestResult).onComplete)(r)); - } - - const followups = await this.testService.provideTestFollowups({ - extId: subject.test.extId, - messageIndex: subject.messageIndex, - resultId: subject.result.id, - taskIndex: subject.taskIndex, - }, cts.token); - - - if (!followups.followups.length || cts.token.isCancellationRequested) { - followups.dispose(); - return; - } - - this.visibleStore.add(followups); - - dom.clearNode(this.el.root); - this.el.root.classList.toggle('animated', Date.now() - start > FOLLOWUP_ANIMATION_MIN_TIME); - - this.el.root.appendChild(this.makeFollowupLink(followups.followups[0])); - if (followups.followups.length > 1) { - this.el.root.appendChild(this.makeMoreLink(followups.followups)); - } - - this.container.appendChild(this.el.root); - this.visibleStore.add(toDisposable(() => { - this.el.root.remove(); - })); - } - - private makeFollowupLink(first: ITestFollowup) { - const link = this.makeLink(() => this.actionFollowup(link, first)); - dom.reset(link, ...renderLabelWithIcons(first.message)); - return link; - } - - private makeMoreLink(followups: ITestFollowup[]) { - const link = this.makeLink(() => - this.quickInput.pick(followups.map((f, i) => ({ - label: f.message, - index: i - }))).then(picked => { - if (picked?.length) { - followups[picked[0].index].execute(); - } - }) - ); - - link.innerText = localize('testFollowup.more', '+{0} More...', followups.length - 1); - return link; - } - - private makeLink(onClick: () => void) { - const link = document.createElement('a'); - link.tabIndex = 0; - this.visibleStore.add(dom.addDisposableListener(link, 'click', onClick)); - this.visibleStore.add(dom.addDisposableListener(link, 'keydown', e => { - const event = new StandardKeyboardEvent(e); - if (event.equals(KeyCode.Space) || event.equals(KeyCode.Enter)) { - onClick(); - } - })); - - return link; - } - - private actionFollowup(link: HTMLAnchorElement, fu: ITestFollowup) { - if (link.ariaDisabled !== 'true') { - link.ariaDisabled = 'true'; - fu.execute(); - - if (this.editor) { - TestingOutputPeekController.get(this.editor)?.removePeek(); - } - } - } -} - -class TestResultsViewContent extends Disposable { - private static lastSplitWidth?: number; - - private readonly didReveal = this._register(new Emitter<{ subject: InspectSubject; preserveFocus: boolean }>()); - private readonly currentSubjectStore = this._register(new DisposableStore()); - private followupWidget!: FollowupActionWidget; - private messageContextKeyService!: IContextKeyService; - private contextKeyTestMessage!: IContextKey; - private contextKeyResultOutdated!: IContextKey; - - private dimension?: dom.Dimension; - private splitView!: SplitView; - private messageContainer!: HTMLElement; - private contentProviders!: IPeekOutputRenderer[]; - private contentProvidersUpdateLimiter = this._register(new Limiter(1)); - - public current?: InspectSubject; - - /** Fired when a tree item is selected. Populated only on .fillBody() */ - public onDidRequestReveal!: Event; - - constructor( - private readonly editor: ICodeEditor | undefined, - private readonly options: { - historyVisible: IObservableValue; - showRevealLocationOnMessages: boolean; - locationForProgress: string; - }, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @ITextModelService protected readonly modelService: ITextModelService, - @IContextKeyService private readonly contextKeyService: IContextKeyService, - ) { - super(); - } - - public fillBody(containerElement: HTMLElement): void { - const initialSpitWidth = TestResultsViewContent.lastSplitWidth; - this.splitView = new SplitView(containerElement, { orientation: Orientation.HORIZONTAL }); - - const { historyVisible, showRevealLocationOnMessages } = this.options; - const isInPeekView = this.editor !== undefined; - const messageContainer = this.messageContainer = dom.append(containerElement, dom.$('.test-output-peek-message-container')); - this.followupWidget = this._register(this.instantiationService.createInstance(FollowupActionWidget, messageContainer, this.editor)); - this.contentProviders = [ - this._register(this.instantiationService.createInstance(DiffContentProvider, this.editor, messageContainer)), - this._register(this.instantiationService.createInstance(MarkdownTestMessagePeek, messageContainer)), - this._register(this.instantiationService.createInstance(TerminalMessagePeek, messageContainer, isInPeekView)), - this._register(this.instantiationService.createInstance(PlainTextMessagePeek, this.editor, messageContainer)), - ]; - - this.messageContextKeyService = this._register(this.contextKeyService.createScoped(containerElement)); - this.contextKeyTestMessage = TestingContextKeys.testMessageContext.bindTo(this.messageContextKeyService); - this.contextKeyResultOutdated = TestingContextKeys.testResultOutdated.bindTo(this.messageContextKeyService); - - const treeContainer = dom.append(containerElement, dom.$('.test-output-peek-tree')); - const tree = this._register(this.instantiationService.createInstance( - OutputPeekTree, - treeContainer, - this.didReveal.event, - { showRevealLocationOnMessages, locationForProgress: this.options.locationForProgress }, - )); - - this.onDidRequestReveal = tree.onDidRequestReview; - - this.splitView.addView({ - onDidChange: Event.None, - element: messageContainer, - minimumSize: 200, - maximumSize: Number.MAX_VALUE, - layout: width => { - TestResultsViewContent.lastSplitWidth = width; - if (this.dimension) { - for (const provider of this.contentProviders) { - provider.layout({ height: this.dimension.height, width }); - } - } - }, - }, Sizing.Distribute); - - this.splitView.addView({ - onDidChange: Event.None, - element: treeContainer, - minimumSize: 100, - maximumSize: Number.MAX_VALUE, - layout: width => { - if (this.dimension) { - tree.layout(this.dimension.height, width); - } - }, - }, Sizing.Distribute); - - const historyViewIndex = 1; - this.splitView.setViewVisible(historyViewIndex, historyVisible.value); - this._register(historyVisible.onDidChange(visible => { - this.splitView.setViewVisible(historyViewIndex, visible); - })); - - if (initialSpitWidth) { - queueMicrotask(() => this.splitView.resizeView(0, initialSpitWidth)); - } - } - - /** - * Shows a message in-place without showing or changing the peek location. - * This is mostly used if peeking a message without a location. - */ - public reveal(opts: { subject: InspectSubject; preserveFocus: boolean }) { - this.didReveal.fire(opts); - - if (this.current && equalsSubject(this.current, opts.subject)) { - return Promise.resolve(); - } - - this.current = opts.subject; - return this.contentProvidersUpdateLimiter.queue(async () => { - await Promise.all(this.contentProviders.map(p => p.update(opts.subject))); - this.followupWidget.show(opts.subject); - this.currentSubjectStore.clear(); - this.populateFloatingClick(opts.subject); - }); - } - - private populateFloatingClick(subject: InspectSubject) { - if (!(subject instanceof MessageSubject)) { - return; - } - - this.currentSubjectStore.add(toDisposable(() => { - this.contextKeyResultOutdated.reset(); - this.contextKeyTestMessage.reset(); - })); - - this.contextKeyTestMessage.set(subject.contextValue || ''); - if (subject.result instanceof LiveTestResult) { - this.contextKeyResultOutdated.set(subject.result.getStateById(subject.test.extId)?.retired ?? false); - this.currentSubjectStore.add(subject.result.onChange(ev => { - if (ev.item.item.extId === subject.test.extId) { - this.contextKeyResultOutdated.set(ev.item.retired ?? false); - } - })); - } else { - this.contextKeyResultOutdated.set(true); - } - - - const instaService = this.currentSubjectStore.add(this.instantiationService - .createChild(new ServiceCollection([IContextKeyService, this.messageContextKeyService]))); - - this.currentSubjectStore.add(instaService.createInstance(FloatingClickMenu, { - container: this.messageContainer, - menuId: MenuId.TestMessageContent, - getActionArg: () => (subject as MessageSubject).context, - })); - } - - public onLayoutBody(height: number, width: number) { - this.dimension = new dom.Dimension(width, height); - this.splitView.layout(width); - } - - public onWidth(width: number) { - this.splitView.layout(width); - } -} class TestResultsPeek extends PeekViewWidget { private static lastHeightInLines?: number; From ad476c34165861460f13b0eee011a6c07393a345 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 8 Jul 2024 16:07:00 -0700 Subject: [PATCH 724/755] Bump that distro (#221226) :drumroll: --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81a0e0d416dc4..b99927cdeef43 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.92.0", - "distro": "58e7d90e05684b6937db21dd372f7a088bdc9dc1", + "distro": "6e11724ed97152dcd4510f2520755c983a6f439c", "author": { "name": "Microsoft Corporation" }, From b23e791eb5afbd95f05aa24da7693ce89344a079 Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 8 Jul 2024 17:40:28 -0700 Subject: [PATCH 725/755] Use AzureLogin task for latest-release-monitor (#221194) --- .github/workflows/latest-release-monitor.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml index f7392dc24a8c5..7db2cedf9df06 100644 --- a/.github/workflows/latest-release-monitor.yml +++ b/.github/workflows/latest-release-monitor.yml @@ -1,4 +1,9 @@ name: Latest Release Monitor + +permissions: + id-token: write + contents: read + on: schedule: - cron: 0/5 * * * * @@ -8,7 +13,13 @@ on: jobs: main: runs-on: ubuntu-latest + environment: main steps: + - uses: azure/login@v2 + with: + client-id: ${{ vars.AZURE_CLIENT_ID }} + tenant-id: ${{ vars.AZURE_TENANT_ID }} + allow-no-subscriptions: true - name: Checkout Actions uses: actions/checkout@v4 with: @@ -22,6 +33,4 @@ jobs: - name: Run Latest Release Monitor uses: ./actions/latest-release-monitor with: - storageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} From 2fe05272052cf1f0ab2133f7f4874e9a748e8e74 Mon Sep 17 00:00:00 2001 From: Robo Date: Tue, 9 Jul 2024 14:33:22 +0900 Subject: [PATCH 726/755] chore: update to electron 30 (#215406) * chore: update electron@30.0.9 * chore: update rpm deps * chore: bump electron@30.1.2 * fix: update kerberos for Node.js 20.x Refs https://github.com/mongodb-js/kerberos/commit/c1f7acafb211d1b449086433578495d4ae0b869f * fix: use shell when spawning .bat or .cmd files Refs https://github.com/nodejs/node/commit/6627222409 * fix: update @vscode/test-electron@2.4.0 Refs https://github.com/microsoft/vscode-test/commit/3f7a3cc5c537957d55fa9e6aeab9d860f7a60078 * fixup! use shell when spawning .bat or .cmd files * chore: bump nodejs@20.14.0 internal build * ci: skip nodejsMirror for 20.14.0 due to missing builds * fixup! use shell when spawning .bat or .cmd files * chore: update debian deps * fixup! skip nodejsMirror for 20.14.0 due to missing builds * fix: universal build - Updates vscode-universal-bundler to support x64ArchFiles option - Kerberos starts building universal binaries which should now be skipped from lipo step via x64ArchFiles - Skips bundling *.mk files * chore: bump distro --- .nvmrc | 2 +- .yarnrc | 4 +- .../alpine/cli-build-alpine.yml | 2 +- .../darwin/cli-build-darwin.yml | 2 +- .../darwin/product-build-darwin-cli-sign.yml | 2 +- .../darwin/product-build-darwin-sign.yml | 2 +- .../darwin/product-build-darwin-universal.yml | 2 +- .../darwin/product-build-darwin.yml | 2 +- build/azure-pipelines/linux/setup-env.sh | 8 +- build/checksums/electron.txt | 150 ++++++------- build/checksums/nodejs.txt | 14 +- build/darwin/create-universal-app.js | 31 +-- build/darwin/create-universal-app.ts | 32 +-- build/gulpfile.reh.js | 41 ++-- build/gulpfile.vscode.js | 2 + build/lib/asar.js | 13 +- build/lib/asar.ts | 14 +- build/linux/debian/dep-lists.js | 3 + build/linux/debian/dep-lists.ts | 3 + build/linux/dependencies-generator.js | 2 +- build/linux/dependencies-generator.ts | 2 +- build/linux/rpm/dep-lists.js | 5 + build/linux/rpm/dep-lists.ts | 5 + build/package.json | 2 +- build/yarn.lock | 169 ++++++++------- cgmanifest.json | 14 +- .../vscode-test-resolver/src/extension.ts | 8 +- package.json | 8 +- remote/.yarnrc | 4 +- remote/package.json | 2 +- remote/yarn.lock | 28 +-- src/main.js | 4 +- test/automation/src/playwrightBrowser.ts | 3 +- test/integration/browser/src/index.ts | 4 +- yarn.lock | 198 ++++++++++++------ 35 files changed, 465 insertions(+), 322 deletions(-) diff --git a/.nvmrc b/.nvmrc index bc78e9f2695ea..48b14e6b2b56f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.12.1 +20.14.0 diff --git a/.yarnrc b/.yarnrc index b153fa4724f45..a94956590fa08 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,5 +1,5 @@ disturl "https://electronjs.org/headers" -target "29.4.0" -ms_build_id "9728852" +target "30.1.2" +ms_build_id "9759760" runtime "electron" build_from_source "true" diff --git a/build/azure-pipelines/alpine/cli-build-alpine.yml b/build/azure-pipelines/alpine/cli-build-alpine.yml index a6442dfe29032..2c3b653ce7eb9 100644 --- a/build/azure-pipelines/alpine/cli-build-alpine.yml +++ b/build/azure-pipelines/alpine/cli-build-alpine.yml @@ -16,7 +16,7 @@ steps: inputs: versionSource: fromFile versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + #nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}: # Install yarn as the ARM64 build agent is using vanilla Ubuntu diff --git a/build/azure-pipelines/darwin/cli-build-darwin.yml b/build/azure-pipelines/darwin/cli-build-darwin.yml index 1d8dffc464d38..ad901c8de1d0d 100644 --- a/build/azure-pipelines/darwin/cli-build-darwin.yml +++ b/build/azure-pipelines/darwin/cli-build-darwin.yml @@ -16,7 +16,7 @@ steps: inputs: versionSource: fromFile versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + #nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}: - template: ../cli/cli-apply-patches.yml@self diff --git a/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml b/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml index 80e90a52bac8f..e6cff11dc7d35 100644 --- a/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml +++ b/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml @@ -9,7 +9,7 @@ steps: inputs: versionSource: fromFile versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + #nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - script: node build/setup-npm-registry.js $NPM_REGISTRY build condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none')) diff --git a/build/azure-pipelines/darwin/product-build-darwin-sign.yml b/build/azure-pipelines/darwin/product-build-darwin-sign.yml index fb8cf8341c360..e8f1bdf511ce2 100644 --- a/build/azure-pipelines/darwin/product-build-darwin-sign.yml +++ b/build/azure-pipelines/darwin/product-build-darwin-sign.yml @@ -3,7 +3,7 @@ steps: inputs: versionSource: fromFile versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + #nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - task: UseDotNet@2 inputs: diff --git a/build/azure-pipelines/darwin/product-build-darwin-universal.yml b/build/azure-pipelines/darwin/product-build-darwin-universal.yml index f8b201f40d46f..45367dde187f0 100644 --- a/build/azure-pipelines/darwin/product-build-darwin-universal.yml +++ b/build/azure-pipelines/darwin/product-build-darwin-universal.yml @@ -3,7 +3,7 @@ steps: inputs: versionSource: fromFile versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + #nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - template: ../distro/download-distro.yml@self diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 11f69d735ac23..a49d5e4abd65d 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -20,7 +20,7 @@ steps: inputs: versionSource: fromFile versionFilePath: .nvmrc - nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download + #nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download - ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}: - template: ../distro/download-distro.yml@self diff --git a/build/azure-pipelines/linux/setup-env.sh b/build/azure-pipelines/linux/setup-env.sh index 9bfbf9ab41a48..6f3f0100867f0 100755 --- a/build/azure-pipelines/linux/setup-env.sh +++ b/build/azure-pipelines/linux/setup-env.sh @@ -13,7 +13,7 @@ SYSROOT_ARCH="$SYSROOT_ARCH" node -e '(async () => { const { getVSCodeSysroot } if [ "$npm_config_arch" == "x64" ]; then if [ "$(echo "$@" | grep -c -- "--only-remote")" -eq 0 ]; then # Download clang based on chromium revision used by vscode - curl -s https://raw.githubusercontent.com/chromium/chromium/122.0.6261.156/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux + curl -s https://raw.githubusercontent.com/chromium/chromium/124.0.6367.243/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux # Download libcxx headers and objects from upstream electron releases DEBUG=libcxx-fetcher \ @@ -25,9 +25,9 @@ if [ "$npm_config_arch" == "x64" ]; then # Set compiler toolchain # Flags for the client build are based on - # https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:build/config/arm.gni - # https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:build/config/compiler/BUILD.gn - # https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:build/config/c++/BUILD.gn + # https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:build/config/arm.gni + # https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:build/config/compiler/BUILD.gn + # https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:build/config/c++/BUILD.gn export CC="$PWD/.build/CR_Clang/bin/clang --gcc-toolchain=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu" export CXX="$PWD/.build/CR_Clang/bin/clang++ --gcc-toolchain=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu" export CXXFLAGS="-nostdinc++ -D__NO_INLINE__ -I$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit -D_LIBCPP_ABI_NAMESPACE=Cr -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE --sysroot=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot" diff --git a/build/checksums/electron.txt b/build/checksums/electron.txt index a80aa1531f168..52950abd800f5 100644 --- a/build/checksums/electron.txt +++ b/build/checksums/electron.txt @@ -1,75 +1,75 @@ -3d3d8bb185d7b63b0db910661fdd69d6381afb8c97742bbd2526a9c932e1f8ca *chromedriver-v29.4.0-darwin-arm64.zip -c3d075943d87604ffa50382cc8d5798485349544ca391cab88c892f889d3b14c *chromedriver-v29.4.0-darwin-x64.zip -6d62d2dba55e4419fa003d45f93dad1324ec29a4d3eb84fd9fd5fd7a64339389 *chromedriver-v29.4.0-linux-arm64.zip -81bb3d362331c7296f700b1b0e8f07c4c7739b1151f698cd56af927bedda59e7 *chromedriver-v29.4.0-linux-armv7l.zip -ab593cc39aefac8c5abd259e31f6add4b2b70c52231724a6c08ac1872b4a0edf *chromedriver-v29.4.0-linux-x64.zip -705d42ccc05b2c48b0673b9dcf63eb78772bb79dba078a523d384ed2481bc9c0 *chromedriver-v29.4.0-mas-arm64.zip -956a7caa28eeeb0c02eb7638a53215ffd89b4f12880f0893ff10f497ca1a8117 *chromedriver-v29.4.0-mas-x64.zip -1f070176aa33e0139d61a3d758fd2f015f09bb275577293fe93564749b6310ba *chromedriver-v29.4.0-win32-arm64.zip -38a71526d243bcb73c28cb648bd4816d70b5e643df52f9f86a83416014589744 *chromedriver-v29.4.0-win32-ia32.zip -f90750d3589cb3c9f6f0ebc70d5e025cf81c382e8c23fa47a54570696a478ef0 *chromedriver-v29.4.0-win32-x64.zip -05dffc90dd1341cc7a6b50127985e4e217fef7f50a173c7d0ff34039dd2d81b6 *electron-api.json -7f63f7cf675ba6dec3a5e4173d729bd53c75f81e612f809641d9d0c4d9791649 *electron-v29.4.0-darwin-arm64-dsym-snapshot.zip -aa29530fcafa4db364978d4f414a6ec2005ea695f7fee70ffbe5e114e9e453f0 *electron-v29.4.0-darwin-arm64-dsym.zip -8d12fb6d9bcdf5bbfc93dbcd1cac348735dc6f98aa450ee03ec7837a01a8a938 *electron-v29.4.0-darwin-arm64-symbols.zip -c16d05f1231bb3c77da05ab236b454b3a2b6a642403be51e7c9b16cd2c421a19 *electron-v29.4.0-darwin-arm64.zip -2dfc1017831ab2f6e9ddb575d3b9cff5a0d56f16a335a3c0df508e964e2db963 *electron-v29.4.0-darwin-x64-dsym-snapshot.zip -025de6aa39d98762928e1b700f46177e74be20101b27457659b938e2c69db326 *electron-v29.4.0-darwin-x64-dsym.zip -ec4eb0a618207233985ceaab297be34b3d4f0813d88801d5637295b238dd661a *electron-v29.4.0-darwin-x64-symbols.zip -8ed7924f77a5c43c137a57097c5c47c2e8e9a78197e18af11a767c98035c123e *electron-v29.4.0-darwin-x64.zip -bde1772fa8ac4850e108012a9edd3bd93472bad8f68ddd55fca355dad81dde4f *electron-v29.4.0-linux-arm64-debug.zip -dfe7852a7423196efb2205c788d942db3ffc9de6ce52577e173bcf7ca6973d48 *electron-v29.4.0-linux-arm64-symbols.zip -c3764d6c3799950e3418e8e5a5a5b2c41abe421dd8bcdebf054c7c85798d9860 *electron-v29.4.0-linux-arm64.zip -bde1772fa8ac4850e108012a9edd3bd93472bad8f68ddd55fca355dad81dde4f *electron-v29.4.0-linux-armv7l-debug.zip -360668ba669cb2c01c2f960cdee76c29670e6ce907ccc0718e971a04af594ce9 *electron-v29.4.0-linux-armv7l-symbols.zip -c5e92943ad78b4e41a32ae53c679e148ea2ae09f95f914b1834dbdbae578ba91 *electron-v29.4.0-linux-armv7l.zip -375be885426bcbd272bd068bfcef41a83296c2f8e61e633233d2a9e9a69242fc *electron-v29.4.0-linux-x64-debug.zip -847e0f75624616c2918b33de2eefeec63419bd250685610d3f52fa115527d2b9 *electron-v29.4.0-linux-x64-symbols.zip -91e5eb374c2c85a07c2d4e99a89eb18515ff0169a49c3fa75289800e1225729e *electron-v29.4.0-linux-x64.zip -098f973537c3d9679a69409d0b84bcc1a6113bb2002ee60068e2c22f335a3855 *electron-v29.4.0-mas-arm64-dsym-snapshot.zip -2724aa32eb441eea21680d95fc1efdd75ac473fa19623c7acf3d546419e96154 *electron-v29.4.0-mas-arm64-dsym.zip -98dd81914752a57da4cbaad1f0aa94b16335f9b8f997be9aa049be90b96b2886 *electron-v29.4.0-mas-arm64-symbols.zip -fd2663f65c1f995304e3eb65870b7146adfefef07cf82bf44de75855fd4f36e8 *electron-v29.4.0-mas-arm64.zip -237983b2169e69bb73aa0987e871e3e486755904b71ebe36c3e902377f92754a *electron-v29.4.0-mas-x64-dsym-snapshot.zip -a5d59599827d32ef322b99eee8416e39235f4c7a0ada78342a885665e0b732dd *electron-v29.4.0-mas-x64-dsym.zip -5182e7697ac0591e0b95c33f70316af24093c9100f442be2cee0039660e959ac *electron-v29.4.0-mas-x64-symbols.zip -e0ee7057aff0240a70b9ed75ff44d55aeae9af67fbc8915f741711a8bb6fe744 *electron-v29.4.0-mas-x64.zip -2802872dfc6de0f0e2e8cef9d2f4f384e3d82b20ad36fc981c4e725dd2f2abcd *electron-v29.4.0-win32-arm64-pdb.zip -d49c954dc25ae9e4c75e61af80b9718014c52f016f43a29071913f0e7100c7bd *electron-v29.4.0-win32-arm64-symbols.zip -c9f31ae6408aa6936b5d683eda601773789185890375cd097e61e924d4fed77a *electron-v29.4.0-win32-arm64-toolchain-profile.zip -483d692efbe4fb1231ff63afb8a236b2e22b486fbe5ac6abbc8b208abf94a4d3 *electron-v29.4.0-win32-arm64.zip -98458f49ba67a08e473d475a68a2818d9df076a5246fbc9b45403e8796f9d35b *electron-v29.4.0-win32-ia32-pdb.zip -69d505d4ae59d9dddf83c4e530e45dd7c5bc64d6da90cf4f851e523be9e51014 *electron-v29.4.0-win32-ia32-symbols.zip -c9f31ae6408aa6936b5d683eda601773789185890375cd097e61e924d4fed77a *electron-v29.4.0-win32-ia32-toolchain-profile.zip -d5a21a17a64e9638f49f057356af23b51f56bd6a7fea3c2e0a28ff3186a7bc41 *electron-v29.4.0-win32-ia32.zip -521ee7b3398c4dc395b43dac86cd099e86a6123de2b43636ee805b7da014ed3f *electron-v29.4.0-win32-x64-pdb.zip -e33848ebd6c6e4ce431aa367bef887050947a136e883677cfc524ca5cabc1e98 *electron-v29.4.0-win32-x64-symbols.zip -c9f31ae6408aa6936b5d683eda601773789185890375cd097e61e924d4fed77a *electron-v29.4.0-win32-x64-toolchain-profile.zip -e4ef85aa3608221f8a3e011c1b1c2d2d36093ad19bda12d16b3816929fb6c99b *electron-v29.4.0-win32-x64.zip -707ee08593289ee83514b4fc55123611309f995788f38a5ec03e285741aac1c8 *electron.d.ts -281b5f4a49de55fdb86b1662530f07f2ced1252c878eb7a941c88ede545339e0 *ffmpeg-v29.4.0-darwin-arm64.zip -0b735912df9b2ff3d03eb23942e03bc0116d82f1291d0a45cbde14177c2f3066 *ffmpeg-v29.4.0-darwin-x64.zip -4e2ba537d7c131abbd34168bce2c28cc9ef6262b217d5f4085afccfdf9635da6 *ffmpeg-v29.4.0-linux-arm64.zip -4aa56ad5d849f4e61af22678a179346b68aec9100282e1b8a43df25d95721677 *ffmpeg-v29.4.0-linux-armv7l.zip -0558e6e1f78229d303e16d4d8c290794baa9adc619fdd2ddccadb3ea241a1df4 *ffmpeg-v29.4.0-linux-x64.zip -224f15d8f96c75348cd7f1b85c4eab63468fae1e50ff4b1381e08011cf76e4f7 *ffmpeg-v29.4.0-mas-arm64.zip -175ec79f0dc4c5966d9a0ca6ec1674106340ecc64503585c12c2f854249af06f *ffmpeg-v29.4.0-mas-x64.zip -5fa13744b87fef1bfd24a37513677f446143e085504541f8ce97466803bd1893 *ffmpeg-v29.4.0-win32-arm64.zip -d7ba316bb7e13025c9db29e0acafebb540b7716c9f111e469733615d8521186a *ffmpeg-v29.4.0-win32-ia32.zip -35c70a28bcfd4f0b1f8c985d3d1348936bd60767d231ce28ba38f3daeeef64bb *ffmpeg-v29.4.0-win32-x64.zip -8c7228ea0ecab25a1f7fcd1ba9680684d19f9671a497113d71a851a53867b048 *hunspell_dictionaries.zip -7552547c8d585b9bc43518d239d7ce3ad7c5cad0346b07cdcfc1eab638b2b794 *libcxx-objects-v29.4.0-linux-arm64.zip -76054a779d4845ad752b625213ce8990f08dcc5b89aa20660dd4f2e817ba30a8 *libcxx-objects-v29.4.0-linux-armv7l.zip -761c317a9c874bd3d1118d0ecad33c4be23727f538cfbb42a08dd87c68da6039 *libcxx-objects-v29.4.0-linux-x64.zip -f98f9972cc30200b8e05815f5a9cd5cec04bdeee0e48ae2143cdaeff5db9d71d *libcxx_headers.zip -f0b0dd2be579baaf97901322ef489d03fae69a0b8524ea77b24fb3c896f73dd9 *libcxxabi_headers.zip -5da864ea23d70538298a40e0d037a5a461a6b74984e72fd4f0cd20904bccaed1 *mksnapshot-v29.4.0-darwin-arm64.zip -bde97bd7c69209ed6bf4cf1cdf7de622e3a9f50fe6b4dc4b5618eee868f47c62 *mksnapshot-v29.4.0-darwin-x64.zip -a3df9b9e6ef14efe5827d0256d8ecaebe6d8be130cfc3faac0dea76eb53b9b11 *mksnapshot-v29.4.0-linux-arm64-x64.zip -648b9dbca21194d663ddb706e6086a166e691263c764c80f836ae02c27e3657a *mksnapshot-v29.4.0-linux-armv7l-x64.zip -e7a4201cda3956380facc2b5b9d0b1020cc5e654fba44129fc7429a982411cc1 *mksnapshot-v29.4.0-linux-x64.zip -ffb44c45733675e0378f45fce25dafa95697d0c86179f8e46742ada16bc11aa1 *mksnapshot-v29.4.0-mas-arm64.zip -0242da3ca193206e56b88eb108502244bae35dcc587210bd0a32d9fa4cb71041 *mksnapshot-v29.4.0-mas-x64.zip -1445806dca6effbc60072bbde7997cefb62bdb7a9e295a090d26f27c3882685f *mksnapshot-v29.4.0-win32-arm64-x64.zip -09599adc3afb0a13ae87fc4b8ab97c729fe3689faa6a4f5f7a4a3cf0d9cc49d3 *mksnapshot-v29.4.0-win32-ia32.zip -84f80683d95665d29284386509bb104e840ff0b797bfbbd19da86b84d370aa49 *mksnapshot-v29.4.0-win32-x64.zip +cdf0522dacc5fdf75a9a4ca9a20f049793ef8bae2b04e37f02e8923fcecd4c76 *chromedriver-v30.1.2-darwin-arm64.zip +f739afd34c48aae18da1d9dffb2332f0c2b2e27ff2056ac619e0a8c9414618f0 *chromedriver-v30.1.2-darwin-x64.zip +c2a220a316c268984bb8135975f28adecc392cf5cd2244af8cc21d60018a6a10 *chromedriver-v30.1.2-linux-arm64.zip +fad358f076caff4eecc3d8b63cea2e109cc0ff8b4632bb4edd21a7c7721bc428 *chromedriver-v30.1.2-linux-armv7l.zip +addc230541e9ee44b311fba9e900c5cb7d8b4d64b79a6d5dae68a71ced1c4611 *chromedriver-v30.1.2-linux-x64.zip +e2d0876fac8af41e0dd9c1b14c5315b426c55217e54e2b4ca5e28faae1b19557 *chromedriver-v30.1.2-mas-arm64.zip +c705d0b74a4658c197a87ed1e9e2509e55186769376b40493ec68b7cbb36c312 *chromedriver-v30.1.2-mas-x64.zip +8bbf9ccb789b236dec3e871d2499c14926a4c2dd3c865f8c7316ba3aa5b3f58f *chromedriver-v30.1.2-win32-arm64.zip +75af4b07bbd3a8fd7e18d63eb936e11054d01b52d438e4f7b7c5e6b82a41dec3 *chromedriver-v30.1.2-win32-ia32.zip +2d306df2c66314be12df78b6139ebf2d616463efdf4017473330d87a61954c3a *chromedriver-v30.1.2-win32-x64.zip +1990fe83ca25b990773ce099b90fb804fc026c1398279731229ba37d02c23000 *electron-api.json +64360b0db764c1bf16a8ab810a25c03f68873691d2897b360281bc50a645b6bb *electron-v30.1.2-darwin-arm64-dsym-snapshot.zip +3192307419ee2bafc3c99c62d79dbd2e6cba5815ae245be994f0b1e1d7fedb46 *electron-v30.1.2-darwin-arm64-dsym.zip +823eadc46a498af7433dae2ace1c8f0b2b0c8cbf98204fed0fdce8110ddafbc1 *electron-v30.1.2-darwin-arm64-symbols.zip +3c651624b1605411e595a6e9f6e874effb947c80eda4b8d0bb7d2972ff6ff242 *electron-v30.1.2-darwin-arm64.zip +fa5cbbc3e7760907229fa0753c3faa2b43e09bcb987b6c3f693e0030aa65e62b *electron-v30.1.2-darwin-x64-dsym-snapshot.zip +d97087f4c7e41fd67b2f0f7aa623ccf1effdbb94133b883dbae1e4c42a576b03 *electron-v30.1.2-darwin-x64-dsym.zip +a129109ed6ca23f66d625ebff9e57be117bc0a32c4f4348e78c1ad7dd41c4189 *electron-v30.1.2-darwin-x64-symbols.zip +8645e10af9b047c765a6cc880f9fa53f266e618569eaf65c0ea9fa1058be20f7 *electron-v30.1.2-darwin-x64.zip +afa016399f57bbbb658238dd715ef2a66790602ff46514e9cd99f2e078789c7d *electron-v30.1.2-linux-arm64-debug.zip +aec05a3e46a83d7c3e502b04245d3d6d2db8d5789a4dcc991f7cf6e7e3cd7036 *electron-v30.1.2-linux-arm64-symbols.zip +953c51413abfd62efdba070f99c961202ce5ef5e77c5cee5eaaf097ac2f5bc9b *electron-v30.1.2-linux-arm64.zip +afa016399f57bbbb658238dd715ef2a66790602ff46514e9cd99f2e078789c7d *electron-v30.1.2-linux-armv7l-debug.zip +04a6851e218c9a6f70870a341beea1b194a94d2d78f3a283065a34654cce7e30 *electron-v30.1.2-linux-armv7l-symbols.zip +677d6b4e6721ffb27b0037628c235cd0a9f10104beabb2b6c67d4b0328a9d001 *electron-v30.1.2-linux-armv7l.zip +1b6d8926e2c7cacbb33e56259ebe908c52e2a6dbbe37f0def043121f228a3a37 *electron-v30.1.2-linux-x64-debug.zip +dc4b526b02ec028d20836ee4617335d0569170846959761c3e8dc615d668f596 *electron-v30.1.2-linux-x64-symbols.zip +724aeca4b2f428f544e9b7e5e52e2074458c2e198f588530819cd0318af8599d *electron-v30.1.2-linux-x64.zip +15b10a6cf6a1ea029792282088647abbf58b415fdb4dd004c2c67c4a8f216ef3 *electron-v30.1.2-mas-arm64-dsym-snapshot.zip +00dbfc36c8ff6ecfbb8b01b51fee41f876bf3456017a8cc694a0c56608061f5e *electron-v30.1.2-mas-arm64-dsym.zip +e402b68cad20ee60cce376dacf0e2e72f1fcd0b6359dda7789626dca4b101e8b *electron-v30.1.2-mas-arm64-symbols.zip +8e59fc7c6df96a029310d6f7769e0c76592dc746d31764b35460de129231d12b *electron-v30.1.2-mas-arm64.zip +e8bfe6b58d2767dd52a7668df380be9c786abed0b25d642bee70c278758d2e77 *electron-v30.1.2-mas-x64-dsym-snapshot.zip +418f32558f9a107ebc942666a6ca680874db8ed438ae3f0064255abe0f9ce77e *electron-v30.1.2-mas-x64-dsym.zip +6d05da37cb39c664a764c879216e762efdb66f97734e42bbaa8f115b11fd3c87 *electron-v30.1.2-mas-x64-symbols.zip +af7b85a28593227add7e595e01d570e19512b40a29599ec007ef7cd4b5a11435 *electron-v30.1.2-mas-x64.zip +580c9b9fee6bacfdc4d3a1118953ba0096bcc19d28b1d804d72d40c5caac8d81 *electron-v30.1.2-win32-arm64-pdb.zip +dbb0ce79933c3688b7fa2bf04ce083d6e8da0a8c07b5104f53805e2e92679cd4 *electron-v30.1.2-win32-arm64-symbols.zip +7351fa5cb892853a7d4b67d8858d0f9cc6506c554a2e42c9ad7e8d5e29ae2743 *electron-v30.1.2-win32-arm64-toolchain-profile.zip +1b9035b541999e0cedcfe3893bb3c1497435494279d599c4e9300fe204f4d560 *electron-v30.1.2-win32-arm64.zip +3cb6869a69d118488dc48ed573b3fc9445bea33cf0a04338ca1b8000b4eaf516 *electron-v30.1.2-win32-ia32-pdb.zip +3f353849ef21506d5ca7a2c26df84d7c744ef1795acd33307f501764dfbe9bc1 *electron-v30.1.2-win32-ia32-symbols.zip +7351fa5cb892853a7d4b67d8858d0f9cc6506c554a2e42c9ad7e8d5e29ae2743 *electron-v30.1.2-win32-ia32-toolchain-profile.zip +431aff46eca9ddb726af3c8d6f4bbb72158e5c872c1b8bee221b3df0a8e94947 *electron-v30.1.2-win32-ia32.zip +85428715d302d4c97e47ca0b6409497191846baccbc36debf895cde724f9445f *electron-v30.1.2-win32-x64-pdb.zip +a5156829bc0caab5c70e6cd352941b6fb7b1e396d7869298c1ceaa69d742e3dc *electron-v30.1.2-win32-x64-symbols.zip +7351fa5cb892853a7d4b67d8858d0f9cc6506c554a2e42c9ad7e8d5e29ae2743 *electron-v30.1.2-win32-x64-toolchain-profile.zip +d400ed1aca2b7b1093aee8b5a8544b112e9f81a570cf77f6bdfe019ceb003f7f *electron-v30.1.2-win32-x64.zip +3187cdd642b968e17a768a3fdaff44bedb69954be3d88e7ad55aac9787b70485 *electron.d.ts +4c8bd4215102f563cf0464ae4edd4022921c53e0ebd4bb6b6f7f7434d50081aa *ffmpeg-v30.1.2-darwin-arm64.zip +2b8c57755ccb64a64540433d3cfbfecd29d07e28bf23c5f08a2edd0e2333a645 *ffmpeg-v30.1.2-darwin-x64.zip +c6f69859dc2ca04daa7c218936e5bc044fc19582423db954c5e8664ce7f331df *ffmpeg-v30.1.2-linux-arm64.zip +12f760ce312e4ee98ddd9496600ca9a1468e28f0ed6d41c6b9284dec841f550f *ffmpeg-v30.1.2-linux-armv7l.zip +c7207cc057849033d550d6897a53f7abee455f31b8f571c3c57a01f2871ff5af *ffmpeg-v30.1.2-linux-x64.zip +447b19465677636261ce47cc256f221c660e66cd136b33c3c742b8d23481b924 *ffmpeg-v30.1.2-mas-arm64.zip +e44fcdb5d0e62d328c0bb5ebeed54f388b09591a33e4dc1698c421e4c9d881dc *ffmpeg-v30.1.2-mas-x64.zip +b470cc217c4f06b3fe4edf6695b4762e7c926d07c1f41c3cab0ddb1d71ce8ce4 *ffmpeg-v30.1.2-win32-arm64.zip +92f1743c16210a77d07e9553cf96ccfb4e6985cc50ee831b5b075589aa0ebb05 *ffmpeg-v30.1.2-win32-ia32.zip +b2fa79b739023651f0551ca06ac5da7b47acaaf8b09ccdedf7081fc3ea824a80 *ffmpeg-v30.1.2-win32-x64.zip +b2b562a45ae4a2d40bf039ed1c707a7875b9e893fc8c6a0044d536b0f9968629 *hunspell_dictionaries.zip +08da936356d1321eec550c30a9208750773d86e3be0b7fe4baf36c72a8609c20 *libcxx-objects-v30.1.2-linux-arm64.zip +8aa302ac17f6ac44f756cb9219f18d01d267d43f9af2dfd8d4626e9d01e584fa *libcxx-objects-v30.1.2-linux-armv7l.zip +1ab04d6cec407930a2051761e6114cb2cd6418e2103d32e835246d06c696b427 *libcxx-objects-v30.1.2-linux-x64.zip +4db17e017bdb818cca5d8e08a78fe54fb907c3cf05defd1b8f086b413075357a *libcxx_headers.zip +209f20bd3ee59fa7c85b0789d8e45168583407c9fb5bd2eba446c1e0796c4a7b *libcxxabi_headers.zip +4dcc59b7c66b9ccc881dbdfeba9de707f693fd839a8e764d34bb66dec7e3e63c *mksnapshot-v30.1.2-darwin-arm64.zip +582886552cbc227eb71f5047d00ac62baeb1912a52a8f5132953b94f54d41dd4 *mksnapshot-v30.1.2-darwin-x64.zip +639fde4957353d48be54b9075c0894b7529210f0bb3a2f9cad81ba2deb415080 *mksnapshot-v30.1.2-linux-arm64-x64.zip +1fec2ae49a9f03117a5e5b637866e5aa270da2fa3a007d0314c8a39ed392230f *mksnapshot-v30.1.2-linux-armv7l-x64.zip +494f86a178a2b14101c6deccf7c2ae88c690c7ce8445b63854a2e0525d69aaa0 *mksnapshot-v30.1.2-linux-x64.zip +bfbb90138b4df3f57fd9fe9cc05b6b8f9b3bf099b66d65215cc9434e2272b0d1 *mksnapshot-v30.1.2-mas-arm64.zip +d1a6a825628a141fdd73cf208180cc20af32b8e06aeb7f4d36566358cef40a90 *mksnapshot-v30.1.2-mas-x64.zip +fd523788a380990d589f9461f29a8878b63090146aa124f2debf3197af69929b *mksnapshot-v30.1.2-win32-arm64-x64.zip +69068d132cd511e33be9aff6dda5df74079c2003657cd89107d4eaaac7e4d997 *mksnapshot-v30.1.2-win32-ia32.zip +69bfab7461f83a256c0869e2781cca4f5a53f8b6a60d78617b79b8bfc0b554b6 *mksnapshot-v30.1.2-win32-x64.zip diff --git a/build/checksums/nodejs.txt b/build/checksums/nodejs.txt index bcc9340406d39..877d8afe243a2 100644 --- a/build/checksums/nodejs.txt +++ b/build/checksums/nodejs.txt @@ -1,7 +1,7 @@ -e0065c61f340e85106a99c4b54746c5cee09d59b08c5712f67f99e92aa44995d node-v20.11.1-darwin-arm64.tar.gz -c52e7fb0709dbe63a4cbe08ac8af3479188692937a7bd8e776e0eedfa33bb848 node-v20.11.1-darwin-x64.tar.gz -e34ab2fc2726b4abd896bcbff0250e9b2da737cbd9d24267518a802ed0606f3b node-v20.11.1-linux-arm64.tar.gz -e42791f76ece283c7a4b97fbf716da72c5128c54a9779f10f03ae74a4bcfb8f6 node-v20.11.1-linux-armv7l.tar.gz -bf3a779bef19452da90fb88358ec2c57e0d2f882839b20dc6afc297b6aafc0d7 node-v20.11.1-linux-x64.tar.gz -a5a9d30a8f7d56e00ccb27c1a7d24c8d0bc96a2689ebba8eb7527698793496f1 win-arm64/node.exe -bc585910690318aaebe3c57669cb83ca9d1e5791efd63195e238f54686e6c2ec win-x64/node.exe +d2148d79e9ff04d2982d00faeae942ceba488ca327a91065e528235167b9e9d6 node-v20.14.0-darwin-arm64.tar.gz +1dcc18a199cb5f46d43ed1c3c61b87a247d1a1a11dd6b32a36a9c46ac1088f86 node-v20.14.0-darwin-x64.tar.gz +d63e83fca4f81801396620c46a42892a2ef26e21a4508f68de373e61a12bd9c5 node-v20.14.0-linux-arm64.tar.gz +af45ea0d09e55a4f05c0190636532bdf9f70b2eaf0a1c4d7594207cf21284df0 node-v20.14.0-linux-armv7l.tar.gz +5b9bf40cfc7c21de14a1b4c367650e3c96eb101156bf9368ffc2f947414b6581 node-v20.14.0-linux-x64.tar.gz +a6ec02119098cf92592539e06289953c4365be20ab15d4ad264669f931000b0c win-arm64/node.exe +8f45741ec6ba07be8d199c0cebc838a58c0430c9228dbe50f8ac5d4859e58bae win-x64/node.exe diff --git a/build/darwin/create-universal-app.js b/build/darwin/create-universal-app.js index 85d2727386198..a3daf1878b0b1 100644 --- a/build/darwin/create-universal-app.js +++ b/build/darwin/create-universal-app.js @@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const fs = require("fs"); +const minimatch = require("minimatch"); const vscode_universal_bundler_1 = require("vscode-universal-bundler"); const cross_spawn_promise_1 = require("@malept/cross-spawn-promise"); const root = path.dirname(path.dirname(__dirname)); @@ -18,25 +19,29 @@ async function main(buildDir) { const appName = product.nameLong + '.app'; const x64AppPath = path.join(buildDir, 'VSCode-darwin-x64', appName); const arm64AppPath = path.join(buildDir, 'VSCode-darwin-arm64', appName); - const x64AsarPath = path.join(x64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar'); - const arm64AsarPath = path.join(arm64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar'); + const asarRelativePath = path.join('Contents', 'Resources', 'app', 'node_modules.asar'); const outAppPath = path.join(buildDir, `VSCode-darwin-${arch}`, appName); const productJsonPath = path.resolve(outAppPath, 'Contents', 'Resources', 'app', 'product.json'); + const filesToSkip = [ + '**/CodeResources', + '**/Credits.rtf', + ]; await (0, vscode_universal_bundler_1.makeUniversalApp)({ x64AppPath, arm64AppPath, - x64AsarPath, - arm64AsarPath, - filesToSkip: [ - 'Credits.rtf', - 'CodeResources', - 'fsevents.node', - 'Info.plist', // TODO@deepak1556: regressed with 11.4.2 internal builds - 'MainMenu.nib', // Generated sequence is not deterministic with Xcode 13 - '.npmrc' - ], + asarPath: asarRelativePath, outAppPath, - force: true + force: true, + mergeASARs: true, + x64ArchFiles: '*/kerberos.node', + filesToSkipComparison: (file) => { + for (const expected of filesToSkip) { + if (minimatch(file, expected)) { + return true; + } + } + return false; + } }); const productJson = JSON.parse(fs.readFileSync(productJsonPath, 'utf8')); Object.assign(productJson, { diff --git a/build/darwin/create-universal-app.ts b/build/darwin/create-universal-app.ts index 04eb3a11e20a6..94b8a23b9e5b7 100644 --- a/build/darwin/create-universal-app.ts +++ b/build/darwin/create-universal-app.ts @@ -5,6 +5,7 @@ import * as path from 'path'; import * as fs from 'fs'; +import * as minimatch from 'minimatch'; import { makeUniversalApp } from 'vscode-universal-bundler'; import { spawn } from '@malept/cross-spawn-promise'; @@ -21,26 +22,31 @@ async function main(buildDir?: string) { const appName = product.nameLong + '.app'; const x64AppPath = path.join(buildDir, 'VSCode-darwin-x64', appName); const arm64AppPath = path.join(buildDir, 'VSCode-darwin-arm64', appName); - const x64AsarPath = path.join(x64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar'); - const arm64AsarPath = path.join(arm64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar'); + const asarRelativePath = path.join('Contents', 'Resources', 'app', 'node_modules.asar'); const outAppPath = path.join(buildDir, `VSCode-darwin-${arch}`, appName); const productJsonPath = path.resolve(outAppPath, 'Contents', 'Resources', 'app', 'product.json'); + const filesToSkip = [ + '**/CodeResources', + '**/Credits.rtf', + ]; + await makeUniversalApp({ x64AppPath, arm64AppPath, - x64AsarPath, - arm64AsarPath, - filesToSkip: [ - 'Credits.rtf', - 'CodeResources', - 'fsevents.node', - 'Info.plist', // TODO@deepak1556: regressed with 11.4.2 internal builds - 'MainMenu.nib', // Generated sequence is not deterministic with Xcode 13 - '.npmrc' - ], + asarPath: asarRelativePath, outAppPath, - force: true + force: true, + mergeASARs: true, + x64ArchFiles: '*/kerberos.node', + filesToSkipComparison: (file: string) => { + for (const expected of filesToSkip) { + if (minimatch(file, expected)) { + return true; + } + } + return false; + } }); const productJson = JSON.parse(fs.readFileSync(productJsonPath, 'utf8')); diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index d7a814b9a1b5a..7d58861147333 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -127,21 +127,7 @@ function getNodeVersion() { return { nodeVersion, internalNodeVersion }; } -function getNodeChecksum(nodeVersion, platform, arch, glibcPrefix) { - let expectedName; - switch (platform) { - case 'win32': - expectedName = product.nodejsRepository !== 'https://nodejs.org' ? - `win-${arch}-node.exe` : `win-${arch}/node.exe`; - break; - - case 'darwin': - case 'alpine': - case 'linux': - expectedName = `node-v${nodeVersion}${glibcPrefix}-${platform}-${arch}.tar.gz`; - break; - } - +function getNodeChecksum(expectedName) { const nodeJsChecksums = fs.readFileSync(path.join(REPO_ROOT, 'build', 'checksums', 'nodejs.txt'), 'utf8'); for (const line of nodeJsChecksums.split('\n')) { const [checksum, name] = line.split(/\s+/); @@ -196,7 +182,24 @@ function nodejs(platform, arch) { log(`Downloading node.js ${nodeVersion} ${platform} ${arch} from ${product.nodejsRepository}...`); const glibcPrefix = process.env['VSCODE_NODE_GLIBC'] ?? ''; - const checksumSha256 = getNodeChecksum(nodeVersion, platform, arch, glibcPrefix); + let expectedName; + switch (platform) { + case 'win32': + expectedName = product.nodejsRepository !== 'https://nodejs.org' ? + `win-${arch}-node.exe` : `win-${arch}/node.exe`; + break; + + case 'darwin': + expectedName = `node-v${nodeVersion}-${platform}-${arch}.tar.gz`; + break; + case 'linux': + expectedName = `node-v${nodeVersion}${glibcPrefix}-${platform}-${arch}.tar.gz`; + break; + case 'alpine': + expectedName = `node-v${nodeVersion}-linux-${arch}-musl.tar.gz`; + break; + } + const checksumSha256 = getNodeChecksum(expectedName); if (checksumSha256) { log(`Using SHA256 checksum for checking integrity: ${checksumSha256}`); @@ -207,13 +210,13 @@ function nodejs(platform, arch) { switch (platform) { case 'win32': return (product.nodejsRepository !== 'https://nodejs.org' ? - fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: `win-${arch}-node.exe`, checksumSha256 }) : + fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName, checksumSha256 }) : fetchUrls(`/dist/v${nodeVersion}/win-${arch}/node.exe`, { base: 'https://nodejs.org', checksumSha256 })) .pipe(rename('node.exe')); case 'darwin': case 'linux': return (product.nodejsRepository !== 'https://nodejs.org' ? - fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: `node-v${nodeVersion}${glibcPrefix}-${platform}-${arch}.tar.gz`, checksumSha256 }) : + fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName, checksumSha256 }) : fetchUrls(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org', checksumSha256 }) ).pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar()))) .pipe(filter('**/node')) @@ -221,7 +224,7 @@ function nodejs(platform, arch) { .pipe(rename('node')); case 'alpine': return product.nodejsRepository !== 'https://nodejs.org' ? - fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: `node-v${nodeVersion}-${platform}-${arch}.tar.gz`, checksumSha256 }) + fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName, checksumSha256 }) .pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar()))) .pipe(filter('**/node')) .pipe(util.setExecutableBit('**')) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index b3b35466af01e..4af406751f96e 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -292,6 +292,8 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op '**/node-pty/lib/shared/conout.js', '**/*.wasm', '**/@vscode/vsce-sign/bin/*', + ], [ + '**/*.mk', ], 'node_modules.asar')); let all = es.merge( diff --git a/build/lib/asar.js b/build/lib/asar.js index 31845f2f2dd3f..07b39bf79ff3e 100644 --- a/build/lib/asar.js +++ b/build/lib/asar.js @@ -11,7 +11,7 @@ const pickle = require('chromium-pickle-js'); const Filesystem = require('asar/lib/filesystem'); const VinylFile = require("vinyl"); const minimatch = require("minimatch"); -function createAsar(folderPath, unpackGlobs, destFilename) { +function createAsar(folderPath, unpackGlobs, skipGlobs, destFilename) { const shouldUnpackFile = (file) => { for (let i = 0; i < unpackGlobs.length; i++) { if (minimatch(file.relative, unpackGlobs[i])) { @@ -20,6 +20,14 @@ function createAsar(folderPath, unpackGlobs, destFilename) { } return false; }; + const shouldSkipFile = (file) => { + for (const skipGlob of skipGlobs) { + if (minimatch(file.relative, skipGlob)) { + return true; + } + } + return false; + }; const filesystem = new Filesystem(folderPath); const out = []; // Keep track of pending inserts @@ -64,6 +72,9 @@ function createAsar(folderPath, unpackGlobs, destFilename) { if (!file.stat.isFile()) { throw new Error(`unknown item in stream!`); } + if (shouldSkipFile(file)) { + return; + } const shouldUnpack = shouldUnpackFile(file); insertFile(file.relative, { size: file.contents.length, mode: file.stat.mode }, shouldUnpack); if (shouldUnpack) { diff --git a/build/lib/asar.ts b/build/lib/asar.ts index 44a6416bdfbec..7dc1dd3b2e664 100644 --- a/build/lib/asar.ts +++ b/build/lib/asar.ts @@ -17,7 +17,7 @@ declare class AsarFilesystem { insertFile(path: string, shouldUnpack: boolean, file: { stat: { size: number; mode: number } }, options: {}): Promise; } -export function createAsar(folderPath: string, unpackGlobs: string[], destFilename: string): NodeJS.ReadWriteStream { +export function createAsar(folderPath: string, unpackGlobs: string[], skipGlobs: string[], destFilename: string): NodeJS.ReadWriteStream { const shouldUnpackFile = (file: VinylFile): boolean => { for (let i = 0; i < unpackGlobs.length; i++) { @@ -28,6 +28,15 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena return false; }; + const shouldSkipFile = (file: VinylFile): boolean => { + for (const skipGlob of skipGlobs) { + if (minimatch(file.relative, skipGlob)) { + return true; + } + } + return false; + }; + const filesystem = new Filesystem(folderPath); const out: Buffer[] = []; @@ -78,6 +87,9 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena if (!file.stat.isFile()) { throw new Error(`unknown item in stream!`); } + if (shouldSkipFile(file)) { + return; + } const shouldUnpack = shouldUnpackFile(file); insertFile(file.relative, { size: file.contents.length, mode: file.stat.mode }, shouldUnpack); diff --git a/build/linux/debian/dep-lists.js b/build/linux/debian/dep-lists.js index d843c090063b0..3a642a7272543 100644 --- a/build/linux/debian/dep-lists.js +++ b/build/linux/debian/dep-lists.js @@ -31,6 +31,7 @@ exports.referenceGeneratedDepsByArch = { 'libc6 (>= 2.16)', 'libc6 (>= 2.17)', 'libc6 (>= 2.2.5)', + 'libc6 (>= 2.25)', 'libc6 (>= 2.28)', 'libcairo2 (>= 1.6.0)', 'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3', @@ -67,6 +68,7 @@ exports.referenceGeneratedDepsByArch = { 'libatspi2.0-0 (>= 2.9.90)', 'libc6 (>= 2.16)', 'libc6 (>= 2.17)', + 'libc6 (>= 2.25)', 'libc6 (>= 2.28)', 'libc6 (>= 2.4)', 'libc6 (>= 2.9)', @@ -108,6 +110,7 @@ exports.referenceGeneratedDepsByArch = { 'libatk1.0-0 (>= 2.2.0)', 'libatspi2.0-0 (>= 2.9.90)', 'libc6 (>= 2.17)', + 'libc6 (>= 2.25)', 'libc6 (>= 2.28)', 'libcairo2 (>= 1.6.0)', 'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3', diff --git a/build/linux/debian/dep-lists.ts b/build/linux/debian/dep-lists.ts index 4028370cd02b4..86d1de1221690 100644 --- a/build/linux/debian/dep-lists.ts +++ b/build/linux/debian/dep-lists.ts @@ -31,6 +31,7 @@ export const referenceGeneratedDepsByArch = { 'libc6 (>= 2.16)', 'libc6 (>= 2.17)', 'libc6 (>= 2.2.5)', + 'libc6 (>= 2.25)', 'libc6 (>= 2.28)', 'libcairo2 (>= 1.6.0)', 'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3', @@ -67,6 +68,7 @@ export const referenceGeneratedDepsByArch = { 'libatspi2.0-0 (>= 2.9.90)', 'libc6 (>= 2.16)', 'libc6 (>= 2.17)', + 'libc6 (>= 2.25)', 'libc6 (>= 2.28)', 'libc6 (>= 2.4)', 'libc6 (>= 2.9)', @@ -108,6 +110,7 @@ export const referenceGeneratedDepsByArch = { 'libatk1.0-0 (>= 2.2.0)', 'libatspi2.0-0 (>= 2.9.90)', 'libc6 (>= 2.17)', + 'libc6 (>= 2.25)', 'libc6 (>= 2.28)', 'libcairo2 (>= 1.6.0)', 'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3', diff --git a/build/linux/dependencies-generator.js b/build/linux/dependencies-generator.js index bff0c9a25df28..19adbeb052998 100644 --- a/build/linux/dependencies-generator.js +++ b/build/linux/dependencies-generator.js @@ -23,7 +23,7 @@ const product = require("../../product.json"); // The reference dependencies, which one has to update when the new dependencies // are valid, are in dep-lists.ts const FAIL_BUILD_FOR_NEW_DEPENDENCIES = true; -// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:chrome/installer/linux/BUILD.gn;l=64-80 +// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:chrome/installer/linux/BUILD.gn;l=64-80 // and the Linux Archive build // Shared library dependencies that we already bundle. const bundledDeps = [ diff --git a/build/linux/dependencies-generator.ts b/build/linux/dependencies-generator.ts index 226310e12581f..5fe4ac5da6430 100644 --- a/build/linux/dependencies-generator.ts +++ b/build/linux/dependencies-generator.ts @@ -25,7 +25,7 @@ import product = require('../../product.json'); // are valid, are in dep-lists.ts const FAIL_BUILD_FOR_NEW_DEPENDENCIES: boolean = true; -// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:chrome/installer/linux/BUILD.gn;l=64-80 +// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:chrome/installer/linux/BUILD.gn;l=64-80 // and the Linux Archive build // Shared library dependencies that we already bundle. const bundledDeps = [ diff --git a/build/linux/rpm/dep-lists.js b/build/linux/rpm/dep-lists.js index 8be477290bbf8..97984514511f3 100644 --- a/build/linux/rpm/dep-lists.js +++ b/build/linux/rpm/dep-lists.js @@ -45,12 +45,14 @@ exports.referenceGeneratedDepsByArch = { 'libc.so.6(GLIBC_2.17)(64bit)', 'libc.so.6(GLIBC_2.18)(64bit)', 'libc.so.6(GLIBC_2.2.5)(64bit)', + 'libc.so.6(GLIBC_2.25)(64bit)', 'libc.so.6(GLIBC_2.28)(64bit)', 'libc.so.6(GLIBC_2.3)(64bit)', 'libc.so.6(GLIBC_2.3.2)(64bit)', 'libc.so.6(GLIBC_2.3.3)(64bit)', 'libc.so.6(GLIBC_2.3.4)(64bit)', 'libc.so.6(GLIBC_2.4)(64bit)', + 'libc.so.6(GLIBC_2.5)(64bit)', 'libc.so.6(GLIBC_2.6)(64bit)', 'libc.so.6(GLIBC_2.7)(64bit)', 'libc.so.6(GLIBC_2.8)(64bit)', @@ -140,8 +142,10 @@ exports.referenceGeneratedDepsByArch = { 'libc.so.6(GLIBC_2.16)', 'libc.so.6(GLIBC_2.17)', 'libc.so.6(GLIBC_2.18)', + 'libc.so.6(GLIBC_2.25)', 'libc.so.6(GLIBC_2.28)', 'libc.so.6(GLIBC_2.4)', + 'libc.so.6(GLIBC_2.5)', 'libc.so.6(GLIBC_2.6)', 'libc.so.6(GLIBC_2.7)', 'libc.so.6(GLIBC_2.8)', @@ -241,6 +245,7 @@ exports.referenceGeneratedDepsByArch = { 'libc.so.6()(64bit)', 'libc.so.6(GLIBC_2.17)(64bit)', 'libc.so.6(GLIBC_2.18)(64bit)', + 'libc.so.6(GLIBC_2.25)(64bit)', 'libc.so.6(GLIBC_2.28)(64bit)', 'libcairo.so.2()(64bit)', 'libcurl.so.4()(64bit)', diff --git a/build/linux/rpm/dep-lists.ts b/build/linux/rpm/dep-lists.ts index 24b18d504c862..b79812784bf64 100644 --- a/build/linux/rpm/dep-lists.ts +++ b/build/linux/rpm/dep-lists.ts @@ -44,12 +44,14 @@ export const referenceGeneratedDepsByArch = { 'libc.so.6(GLIBC_2.17)(64bit)', 'libc.so.6(GLIBC_2.18)(64bit)', 'libc.so.6(GLIBC_2.2.5)(64bit)', + 'libc.so.6(GLIBC_2.25)(64bit)', 'libc.so.6(GLIBC_2.28)(64bit)', 'libc.so.6(GLIBC_2.3)(64bit)', 'libc.so.6(GLIBC_2.3.2)(64bit)', 'libc.so.6(GLIBC_2.3.3)(64bit)', 'libc.so.6(GLIBC_2.3.4)(64bit)', 'libc.so.6(GLIBC_2.4)(64bit)', + 'libc.so.6(GLIBC_2.5)(64bit)', 'libc.so.6(GLIBC_2.6)(64bit)', 'libc.so.6(GLIBC_2.7)(64bit)', 'libc.so.6(GLIBC_2.8)(64bit)', @@ -139,8 +141,10 @@ export const referenceGeneratedDepsByArch = { 'libc.so.6(GLIBC_2.16)', 'libc.so.6(GLIBC_2.17)', 'libc.so.6(GLIBC_2.18)', + 'libc.so.6(GLIBC_2.25)', 'libc.so.6(GLIBC_2.28)', 'libc.so.6(GLIBC_2.4)', + 'libc.so.6(GLIBC_2.5)', 'libc.so.6(GLIBC_2.6)', 'libc.so.6(GLIBC_2.7)', 'libc.so.6(GLIBC_2.8)', @@ -240,6 +244,7 @@ export const referenceGeneratedDepsByArch = { 'libc.so.6()(64bit)', 'libc.so.6(GLIBC_2.17)(64bit)', 'libc.so.6(GLIBC_2.18)(64bit)', + 'libc.so.6(GLIBC_2.25)(64bit)', 'libc.so.6(GLIBC_2.28)(64bit)', 'libcairo.so.2()(64bit)', 'libcurl.so.4()(64bit)', diff --git a/build/package.json b/build/package.json index 0bbeed3f1367d..9bff15d469174 100644 --- a/build/package.json +++ b/build/package.json @@ -51,7 +51,7 @@ "ternary-stream": "^3.0.0", "through2": "^4.0.2", "tmp": "^0.2.1", - "vscode-universal-bundler": "^0.0.2", + "vscode-universal-bundler": "^0.1.0", "workerpool": "^6.4.0", "yauzl": "^2.10.0" }, diff --git a/build/yarn.lock b/build/yarn.lock index d99ceffaadf07..74200931c51b4 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -199,6 +199,15 @@ events "^3.0.0" tslib "^2.2.0" +"@electron/asar@^3.2.7": + version "3.2.10" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.10.tgz#615cf346b734b23cafa4e0603551010bd0e50aa8" + integrity sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + "@electron/get@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" @@ -329,10 +338,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz#2efddf82828aac85e64cef62482af61c29561bee" integrity sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg== -"@malept/cross-spawn-promise@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" - integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== dependencies: cross-spawn "^7.0.1" @@ -686,6 +695,11 @@ optionalDependencies: keytar "^7.7.0" +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -755,18 +769,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -asar@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" - integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== - dependencies: - chromium-pickle-js "^0.2.0" - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - optionalDependencies: - "@types/glob" "^7.1.1" - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -787,11 +789,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - azure-devops-node-api@^11.0.1: version "11.2.0" resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz#bf04edbef60313117a0507415eed4790a420ad6b" @@ -847,6 +844,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -877,11 +881,6 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= -buffer-equal@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" - integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= - buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -995,11 +994,6 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chromium-pickle-js@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" - integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= - clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -1048,11 +1042,6 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -1065,13 +1054,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - commander@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" @@ -1185,15 +1167,13 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -dir-compare@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" - integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== +dir-compare@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-4.2.0.tgz#d1d4999c14fbf55281071fdae4293b3b9ce86f19" + integrity sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ== dependencies: - buffer-equal "1.0.0" - colors "1.0.3" - commander "2.9.0" - minimatch "3.0.4" + minimatch "^3.0.5" + p-limit "^3.1.0 " dom-serializer@^2.0.0: version "2.0.0" @@ -1413,6 +1393,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -1422,16 +1411,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1550,11 +1529,6 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= - gulp-merge-json@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/gulp-merge-json/-/gulp-merge-json-2.1.1.tgz#cfb1d066467577545b8c1c289a278e6ef4b4e0de" @@ -1926,19 +1900,26 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@^3.0.3, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.3, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.3: version "1.2.6" @@ -2062,6 +2043,13 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +"p-limit@^3.1.0 ": + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + parse-node-version@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -2127,6 +2115,15 @@ plist@^3.0.1: base64-js "^1.5.1" xmlbuilder "^9.0.7" +plist@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + plugin-error@1.0.1, plugin-error@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" @@ -2678,16 +2675,18 @@ vscode-gulp-watch@^5.0.3: vinyl "^2.2.0" vinyl-file "^3.0.0" -vscode-universal-bundler@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/vscode-universal-bundler/-/vscode-universal-bundler-0.0.2.tgz#2c988dac681d3ffe6baec6defac0995cb833c55a" - integrity sha512-FPJcvKnQGBqFzy6M6Nm2yvAczNLUeXsfYM6GwCex/pUOkvIM2icIHmiSvtMJINlLW1iG+oEwE3/LVbABmcjEmQ== +vscode-universal-bundler@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/vscode-universal-bundler/-/vscode-universal-bundler-0.1.0.tgz#1a03d1d16c6ea5065318fafbc2a554b7c2f3bd32" + integrity sha512-wtT9IZ/fqIZSirY6cxElu8a6WpNaOjgQjjazt85lMCWBuF/tWVw5nRYX67pTVsUyi6kzQaIvfyyIvxVbBpetBA== dependencies: - "@malept/cross-spawn-promise" "^1.1.0" - asar "^3.0.3" + "@electron/asar" "^3.2.7" + "@malept/cross-spawn-promise" "^2.0.0" debug "^4.3.1" - dir-compare "^2.4.0" - fs-extra "^9.0.1" + dir-compare "^4.2.0" + fs-extra "^11.1.1" + minimatch "^9.0.3" + plist "^3.1.0" webidl-conversions@^3.0.0: version "3.0.1" @@ -2727,6 +2726,11 @@ xml2js@^0.4.19, xml2js@^0.4.23: sax ">=0.6.0" xmlbuilder "~11.0.0" +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" @@ -2756,3 +2760,8 @@ yazl@^2.2.2: integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== dependencies: buffer-crc32 "~0.2.3" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/cgmanifest.json b/cgmanifest.json index 61747342eef4b..aa06f8323b09e 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "chromium", "repositoryUrl": "https://chromium.googlesource.com/chromium/src", - "commitHash": "f1a45d7ded05d64ca8136cc142ddc0c271b1dd43" + "commitHash": "7fa4f6e14e0707c0e604cf7c1da33566e78169ce" } }, "licenseDetail": [ @@ -40,7 +40,7 @@ "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ], "isOnlyProductionDependency": true, - "version": "122.0.6261.156" + "version": "124.0.6367.243" }, { "component": { @@ -48,7 +48,7 @@ "git": { "name": "ffmpeg", "repositoryUrl": "https://chromium.googlesource.com/chromium/third_party/ffmpeg", - "commitHash": "17525de887d54b970ffdd421a0879c1db1952307" + "commitHash": "52d8ef3799b2f16b66351dd0972bb0bcee1648ac" } }, "isOnlyProductionDependency": true, @@ -516,11 +516,11 @@ "git": { "name": "nodejs", "repositoryUrl": "https://github.com/nodejs/node", - "commitHash": "9b1bf44ea9e7785e38c93b7d22d32dbca262df6c" + "commitHash": "fe0f08a5dd68fd72b1652adaa51ab07a4b09f847" } }, "isOnlyProductionDependency": true, - "version": "20.11.1" + "version": "20.14.0" }, { "component": { @@ -528,12 +528,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "f9ed0eaee4b172733872c2f84e5061882dd08e5c" + "commitHash": "91de7d0f13208891c5604e00ccd18e4f6826653b" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "29.4.0" + "version": "30.1.2" }, { "component": { diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index 8e12e622e05ac..2fab3ec306a27 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -164,8 +164,8 @@ export function activate(context: vscode.ExtensionContext) { const serverCommandPath = path.join(vscodePath, 'scripts', serverCommand); outputChannel.appendLine(`Launching server: "${serverCommandPath}" ${commandArgs.join(' ')}`); - - extHostProcess = cp.spawn(serverCommandPath, commandArgs, { env, cwd: vscodePath }); + const shell = (process.platform === 'win32'); + extHostProcess = cp.spawn(serverCommandPath, commandArgs, { env, cwd: vscodePath, shell }); } else { const extensionToInstall = process.env['TESTRESOLVER_INSTALL_BUILTIN_EXTENSION']; if (extensionToInstall) { @@ -182,8 +182,8 @@ export function activate(context: vscode.ExtensionContext) { outputChannel.appendLine(`Using server build at ${serverLocation}`); outputChannel.appendLine(`Server arguments ${commandArgs.join(' ')}`); - - extHostProcess = cp.spawn(path.join(serverLocation, 'bin', serverCommand), commandArgs, { env, cwd: serverLocation }); + const shell = (process.platform === 'win32'); + extHostProcess = cp.spawn(path.join(serverLocation, 'bin', serverCommand), commandArgs, { env, cwd: serverLocation, shell }); } extHostProcess.stdout!.on('data', (data: Buffer) => processOutput(data.toString())); extHostProcess.stderr!.on('data', (data: Buffer) => processOutput(data.toString())); diff --git a/package.json b/package.json index b99927cdeef43..cc00db38c76a7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.92.0", - "distro": "6e11724ed97152dcd4510f2520755c983a6f439c", + "distro": "abf8b974fc98ae45b7729d258b0459182c617887", "author": { "name": "Microsoft Corporation" }, @@ -93,7 +93,7 @@ "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", "jschardet": "3.1.3", - "kerberos": "^2.0.1", + "kerberos": "2.1.1-alpha.0", "minimist": "^1.2.6", "native-is-elevated": "0.7.0", "native-keymap": "^3.3.5", @@ -136,7 +136,7 @@ "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", "@vscode/test-cli": "^0.0.6", - "@vscode/test-electron": "^2.3.8", + "@vscode/test-electron": "^2.4.0", "@vscode/test-web": "^0.0.56", "@vscode/v8-heap-parser": "^0.1.0", "@vscode/vscode-perf": "^0.0.14", @@ -149,7 +149,7 @@ "cssnano": "^6.0.3", "debounce": "^1.0.0", "deemon": "^1.8.0", - "electron": "29.4.0", + "electron": "30.1.2", "eslint": "8.36.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-jsdoc": "^46.5.0", diff --git a/remote/.yarnrc b/remote/.yarnrc index 4c99388e88979..8d07643c18e5b 100644 --- a/remote/.yarnrc +++ b/remote/.yarnrc @@ -1,5 +1,5 @@ disturl "https://nodejs.org/dist" -target "20.11.1" -ms_build_id "275039" +target "20.14.0" +ms_build_id "282653" runtime "node" build_from_source "true" diff --git a/remote/package.json b/remote/package.json index bb615b88ea411..c455896477449 100644 --- a/remote/package.json +++ b/remote/package.json @@ -26,7 +26,7 @@ "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", "jschardet": "3.1.3", - "kerberos": "^2.0.1", + "kerberos": "2.1.1-alpha.0", "minimist": "^1.2.6", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta11", diff --git a/remote/yarn.lock b/remote/yarn.lock index 0f65b688c179c..7ca95a9262932 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -388,14 +388,14 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kerberos@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kerberos/-/kerberos-2.0.1.tgz#663b0b46883b4da84495f60f2e9e399a43a33ef5" - integrity sha512-O/jIgbdGK566eUhFwIcgalbqirYU/r76MW7/UFw06Fd9x5bSwgyZWL/Vm26aAmezQww/G9KYkmmJBkEkPk5HLw== +kerberos@2.1.1-alpha.0: + version "2.1.1-alpha.0" + resolved "https://registry.yarnpkg.com/kerberos/-/kerberos-2.1.1-alpha.0.tgz#c6d377b43c8206340fd184167754f2c81dad5ab1" + integrity sha512-II8N/ky/Vpd8y7LTxwCuAYoQ8XeV3HYxuK7IDmyoFacIhDljx4sdt/+sOwqgXEweQyCHlbZSKSaK82upqNM4Hw== dependencies: bindings "^1.5.0" - node-addon-api "^4.3.0" - prebuild-install "7.1.1" + node-addon-api "^6.1.0" + prebuild-install "^7.1.2" lru-cache@^6.0.0: version "6.0.0" @@ -469,10 +469,10 @@ node-addon-api@^3.2.1: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-addon-api@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== node-gyp-build@4.8.1, node-gyp-build@^4.3.0: version "4.8.1" @@ -503,10 +503,10 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -prebuild-install@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== +prebuild-install@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" diff --git a/src/main.js b/src/main.js index be7cd98afaf8c..7f909f7d633b1 100644 --- a/src/main.js +++ b/src/main.js @@ -298,10 +298,8 @@ function configureCommandlineSwitchesSync(cliArgs) { app.commandLine.appendSwitch('disable-features', featuresToDisable); // Blink features to configure. - // `FontMatchingCTMigration` - Siwtch font matching on macOS to CoreText (Refs https://github.com/microsoft/vscode/issues/214390). - // TODO(deepak1556): Enable this feature again after updating to Electron 30. const blinkFeaturesToDisable = - `FontMatchingCTMigration,${app.commandLine.getSwitchValue('disable-blink-features')}`; + `${app.commandLine.getSwitchValue('disable-blink-features')}`; app.commandLine.appendSwitch('disable-blink-features', blinkFeaturesToDisable); // Support JS Flags diff --git a/test/automation/src/playwrightBrowser.ts b/test/automation/src/playwrightBrowser.ts index 7223c49a13b2c..0a98250767b15 100644 --- a/test/automation/src/playwrightBrowser.ts +++ b/test/automation/src/playwrightBrowser.ts @@ -72,10 +72,11 @@ async function launchServer(options: LaunchOptions) { logger.log(`Storing log files into '${serverLogsPath}'`); logger.log(`Command line: '${serverLocation}' ${args.join(' ')}`); + const shell: boolean = (process.platform === 'win32'); const serverProcess = spawn( serverLocation, args, - { env } + { env, shell } ); logger.log(`Started server for browser smoke tests (pid: ${serverProcess.pid})`); diff --git a/test/integration/browser/src/index.ts b/test/integration/browser/src/index.ts index 990b7cd19fda1..2613f10da6285 100644 --- a/test/integration/browser/src/index.ts +++ b/test/integration/browser/src/index.ts @@ -192,11 +192,11 @@ async function launchServer(browserType: BrowserType): Promise<{ endpoint: url.U serverArgs.push('--logsPath', serverLogsPath); const stdio: cp.StdioOptions = args.debug ? 'pipe' : ['ignore', 'pipe', 'ignore']; - + const shell: boolean = (process.platform === 'win32'); const serverProcess = cp.spawn( serverLocation, serverArgs, - { env, stdio } + { env, stdio, shell } ); if (args.debug) { diff --git a/yarn.lock b/yarn.lock index 17a69acb6fb6d..f31bd180a3b9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1029,11 +1029,6 @@ dependencies: defer-to-connect "^2.0.0" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tootallnate/once@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-3.0.0.tgz#d52238c9052d746c9689523e650160e70786bc9a" @@ -1639,15 +1634,16 @@ supports-color "^9.4.0" yargs "^17.7.2" -"@vscode/test-electron@^2.3.8": - version "2.3.8" - resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.3.8.tgz#06a7c50b38cfac0ede833905e088d55c61cd12d3" - integrity sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg== +"@vscode/test-electron@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.4.0.tgz#6fcdbac10948960c15f8970cf5d5e624dd51a524" + integrity sha512-yojuDFEjohx6Jb+x949JRNtSn6Wk2FAh4MldLE3ck9cfvCqzwxF32QsNy1T9Oe4oT+ZfFcg0uPUCajJzOmPlTA== dependencies: - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.4" jszip "^3.10.1" - semver "^7.5.2" + ora "^7.0.1" + semver "^7.6.2" "@vscode/test-web@^0.0.56": version "0.0.56" @@ -2086,13 +2082,6 @@ acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -agent-base@6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" - integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== - dependencies: - debug "4" - agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" @@ -2605,6 +2594,15 @@ bl@^4.0.2, bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -2736,6 +2734,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -2906,6 +2912,11 @@ chalk@^4.x: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.0.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3002,6 +3013,18 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.9.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -3894,15 +3917,20 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz#99db370cae8cd090d5b01f8748e9ad369924d0f8" integrity sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A== -electron@29.4.0: - version "29.4.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-29.4.0.tgz#5dcd5a977414337a2518619e9166c0e86a5a3bae" - integrity sha512-4DTO8U66oiI8rShrDSu2zDPW6GWRiCebyb1MHSfQkLWCNI/PnLyGKeqYPUoVgc0FWaNN2sCBn8NKJHb++hE2LQ== +electron@30.1.2: + version "30.1.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-30.1.2.tgz#9c8b9b0d0e3f07783d8c5dbd9519b3ffd11f1551" + integrity sha512-A5CFGwbA+HSXnzwjc8fP2GIezBcAb0uN/VbNGLOW8DHOYn07rvJ/1bAJECHUUzt5zbfohveG3hpMQiYpbktuDw== dependencies: "@electron/get" "^2.0.0" "@types/node" "^20.9.0" extract-zip "^2.0.1" +emoji-regex@^10.2.1: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -5588,15 +5616,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" @@ -5621,14 +5640,6 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - https-proxy-agent@^7.0.0: version "7.0.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" @@ -5680,7 +5691,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6010,6 +6021,11 @@ is-gzip@^1.0.0: resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -6114,6 +6130,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -6423,14 +6444,14 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== -kerberos@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kerberos/-/kerberos-2.0.1.tgz#663b0b46883b4da84495f60f2e9e399a43a33ef5" - integrity sha512-O/jIgbdGK566eUhFwIcgalbqirYU/r76MW7/UFw06Fd9x5bSwgyZWL/Vm26aAmezQww/G9KYkmmJBkEkPk5HLw== +kerberos@2.1.1-alpha.0: + version "2.1.1-alpha.0" + resolved "https://registry.yarnpkg.com/kerberos/-/kerberos-2.1.1-alpha.0.tgz#c6d377b43c8206340fd184167754f2c81dad5ab1" + integrity sha512-II8N/ky/Vpd8y7LTxwCuAYoQ8XeV3HYxuK7IDmyoFacIhDljx4sdt/+sOwqgXEweQyCHlbZSKSaK82upqNM4Hw== dependencies: bindings "^1.5.0" - node-addon-api "^4.3.0" - prebuild-install "7.1.1" + node-addon-api "^6.1.0" + prebuild-install "^7.1.2" keygrip@~1.1.0: version "1.1.0" @@ -6749,6 +6770,14 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -7056,7 +7085,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -7388,16 +7417,16 @@ node-addon-api@^4.2.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== -node-addon-api@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== - node-addon-api@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.0.0.tgz#cfb3574e6df708ff71a30db6c4762d9e06e11c27" integrity sha512-GyHvgPvUXBvAkXa0YvYnhilSB1A+FRYMpIVggKzPZqdaZfevZOuzfWzyvgzOwRLHBeo/MMswmJFsrNF4Nw1pmA== +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + node-fetch@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" @@ -7640,6 +7669,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" @@ -7685,6 +7721,21 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ora@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" + integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== + dependencies: + chalk "^5.3.0" + cli-cursor "^4.0.0" + cli-spinners "^2.9.0" + is-interactive "^2.0.0" + is-unicode-supported "^1.3.0" + log-symbols "^5.1.0" + stdin-discarder "^0.1.0" + string-width "^6.1.0" + strip-ansi "^7.1.0" + ordered-read-streams@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" @@ -8410,10 +8461,10 @@ postcss@^8.4.33: picocolors "^1.0.0" source-map-js "^1.2.0" -prebuild-install@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== +prebuild-install@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" @@ -8879,6 +8930,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -9030,7 +9089,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.4: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9044,6 +9103,11 @@ semver@^7.5.3: dependencies: lru-cache "^6.0.0" +semver@^7.6.2: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -9422,6 +9486,13 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + stream-combiner@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" @@ -9546,6 +9617,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-6.1.0.tgz#96488d6ed23f9ad5d82d13522af9e4c4c3fd7518" + integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^10.2.1" + strip-ansi "^7.0.1" + string.prototype.padend@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz#824c84265dbac46cade2b957b38b6a5d8d1683c5" @@ -9625,7 +9705,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== From 16654e61265ca89e53612bb7a61f89f4e99aeb3c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 Jul 2024 08:08:56 +0200 Subject: [PATCH 727/755] esm - reduce diff to branch (#221154) --- scripts/code-server.js | 1 - src/bootstrap-amd.js | 152 +++++++++++---- src/bootstrap-fork.js | 15 +- src/bootstrap-meta.js | 16 +- src/bootstrap-node.js | 74 ++++--- src/bootstrap-window.js | 184 +++++++++++++----- src/bootstrap.js | 24 ++- src/cli.js | 29 ++- src/main.js | 42 ++-- src/server-cli.js | 20 +- src/server-main.js | 46 +++-- src/tsec.exemptions.json | 3 + src/typings/vscode-globals-product.d.ts | 11 ++ src/vs/base/common/jsonc.js | 12 +- src/vs/base/common/performance.js | 9 + src/vs/base/common/semver/semver.d.ts | 7 +- src/vs/base/common/semver/semver.js | 45 +++++ src/vs/base/node/nls.js | 14 ++ src/vs/base/node/unc.js | 12 ++ .../base/parts/sandbox/common/sandboxTypes.ts | 5 + src/vs/base/parts/storage/node/storage.ts | 8 +- .../processExplorer/processExplorer.js | 3 +- .../electron-sandbox/workbench/workbench.js | 3 +- .../platform/environment/node/userDataPath.js | 16 +- .../node/nativeModules.integrationTest.ts | 5 + src/vs/platform/request/node/proxy.ts | 20 +- src/vs/platform/terminal/node/ptyService.ts | 9 +- src/vs/server/node/server.cli.ts | 39 ++-- .../api/node/extHostExtensionService.ts | 6 +- src/vs/workbench/api/node/proxyResolver.ts | 11 ++ .../issue/electron-sandbox/issueReporter.js | 3 +- 31 files changed, 648 insertions(+), 196 deletions(-) diff --git a/scripts/code-server.js b/scripts/code-server.js index c043bf2671b64..56945e76ca7c5 100644 --- a/scripts/code-server.js +++ b/scripts/code-server.js @@ -69,4 +69,3 @@ function startServer(programArgs) { } main(); - diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 27d15eb76d579..f8a0c00be9513 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -7,10 +7,28 @@ 'use strict'; /** - * @typedef {import('./vs/nls').INLSConfiguration} INLSConfiguration + * @import { INLSConfiguration } from './vs/nls' * @import { IProductConfiguration } from './vs/base/common/product' */ +// ESM-comment-begin +const isESM = false; +// ESM-comment-end +// ESM-uncomment-begin +// import * as path from 'path'; +// import * as fs from 'fs'; +// import { fileURLToPath } from 'url'; +// import { createRequire } from 'node:module'; +// import { product, pkg } from './bootstrap-meta.js'; +// import * as bootstrap from './bootstrap.js'; +// import * as performance from './vs/base/common/performance.js'; +// +// const require = createRequire(import.meta.url); +// const isESM = true; +// const module = { exports: {} }; +// const __dirname = path.dirname(fileURLToPath(import.meta.url)); +// ESM-uncomment-end + // Store the node.js require function in a variable // before loading our AMD loader to avoid issues // when this file is bundled with other files. @@ -21,7 +39,12 @@ globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target // VSCODE_GLOBALS: package/product.json /** @type Partial */ +// ESM-comment-begin globalThis._VSCODE_PRODUCT_JSON = require('./bootstrap-meta').product; +// ESM-comment-end +// ESM-uncomment-begin +// globalThis._VSCODE_PRODUCT_JSON = { ...product }; +// ESM-uncomment-end if (process.env['VSCODE_DEV']) { // Patch product overrides when running out of sources try { @@ -30,29 +53,21 @@ if (process.env['VSCODE_DEV']) { globalThis._VSCODE_PRODUCT_JSON = Object.assign(globalThis._VSCODE_PRODUCT_JSON, overrides); } catch (error) { /* ignore */ } } +// ESM-comment-begin globalThis._VSCODE_PACKAGE_JSON = require('./bootstrap-meta').pkg; +// ESM-comment-end +// ESM-uncomment-begin +// globalThis._VSCODE_PACKAGE_JSON = { ...pkg }; +// ESM-uncomment-end + +// VSCODE_GLOBALS: file root of all resources +globalThis._VSCODE_FILE_ROOT = __dirname; -// @ts-ignore -const loader = require('./vs/loader'); +// ESM-comment-begin const bootstrap = require('./bootstrap'); -const performance = require('./vs/base/common/performance'); +const performance = require(`./vs/base/common/performance`); const fs = require('fs'); - -// Bootstrap: Loader -loader.config({ - baseUrl: bootstrap.fileUriFromPath(__dirname, { isWindows: process.platform === 'win32' }), - catchError: true, - nodeRequire, - amdModulesPattern: /^vs\//, - recordStats: true -}); - -// Running in Electron -if (process.env['ELECTRON_RUN_AS_NODE'] || process.versions['electron']) { - loader.define('fs', ['original-fs'], function (/** @type {import('fs')} */originalFS) { - return originalFS; // replace the patched electron fs with the original node fs for all AMD code - }); -} +// ESM-comment-end //#region NLS helpers @@ -138,31 +153,82 @@ async function doSetupNLS() { //#endregion -/** - * @param {string=} entrypoint - * @param {(value: any) => void=} onLoad - * @param {(err: Error) => void=} onError - */ -exports.load = function (entrypoint, onLoad, onError) { - if (!entrypoint) { - return; - } +//#region Loader Config - // code cache config - if (process.env['VSCODE_CODE_CACHE_PATH']) { - loader.config({ - nodeCachedData: { - path: process.env['VSCODE_CODE_CACHE_PATH'], - seed: entrypoint - } +if (isESM) { + + /** + * @param {string=} entrypoint + * @param {(value: any) => void} [onLoad] + * @param {(err: Error) => void} [onError] + */ + module.exports.load = function (entrypoint, onLoad, onError) { + if (!entrypoint) { + return; + } + + entrypoint = `./${entrypoint}.js`; + + onLoad = onLoad || function () { }; + onError = onError || function (err) { console.error(err); }; + + setupNLS().then(() => { + performance.mark(`code/fork/willLoadCode`); + import(entrypoint).then(onLoad, onError); + }); + }; +} else { + + // @ts-ignore + const loader = require('./vs/loader'); + + loader.config({ + baseUrl: bootstrap.fileUriFromPath(__dirname, { isWindows: process.platform === 'win32' }), + catchError: true, + nodeRequire, + amdModulesPattern: /^vs\//, + recordStats: true + }); + + // Running in Electron + if (process.env['ELECTRON_RUN_AS_NODE'] || process.versions['electron']) { + loader.define('fs', ['original-fs'], function (/** @type {import('fs')} */originalFS) { + return originalFS; // replace the patched electron fs with the original node fs for all AMD code }); } - onLoad = onLoad || function () { }; - onError = onError || function (err) { console.error(err); }; + /** + * @param {string=} entrypoint + * @param {(value: any) => void} [onLoad] + * @param {(err: Error) => void} [onError] + */ + module.exports.load = function (entrypoint, onLoad, onError) { + if (!entrypoint) { + return; + } - setupNLS().then(() => { - performance.mark('code/fork/willLoadCode'); - loader([entrypoint], onLoad, onError); - }); -}; + // code cache config + if (process.env['VSCODE_CODE_CACHE_PATH']) { + loader.config({ + nodeCachedData: { + path: process.env['VSCODE_CODE_CACHE_PATH'], + seed: entrypoint + } + }); + } + + onLoad = onLoad || function () { }; + onError = onError || function (err) { console.error(err); }; + + setupNLS().then(() => { + performance.mark('code/fork/willLoadCode'); + loader([entrypoint], onLoad, onError); + }); + }; +} + +//#endregion + +// ESM-uncomment-begin +// export const load = module.exports.load; +// ESM-uncomment-end diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index 9de1e6f0d1590..a95cbf53589d5 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -6,11 +6,20 @@ //@ts-check 'use strict'; +// ESM-comment-begin const performance = require('./vs/base/common/performance'); -performance.mark('code/fork/start'); - const bootstrap = require('./bootstrap'); const bootstrapNode = require('./bootstrap-node'); +const bootstrapAmd = require('./bootstrap-amd'); +// ESM-comment-end +// ESM-uncomment-begin +// import * as performance from './vs/base/common/performance.js'; +// import * as bootstrap from './bootstrap.js'; +// import * as bootstrapNode from './bootstrap-node.js'; +// import * as bootstrapAmd from './bootstrap-amd.js'; +// ESM-uncomment-end + +performance.mark('code/fork/start'); // Crash reporter configureCrashReporter(); @@ -41,7 +50,7 @@ if (process.env['VSCODE_PARENT_PID']) { } // Load AMD entry point -require('./bootstrap-amd').load(process.env['VSCODE_AMD_ENTRYPOINT']); +bootstrapAmd.load(process.env['VSCODE_AMD_ENTRYPOINT']); //#region Helpers diff --git a/src/bootstrap-meta.js b/src/bootstrap-meta.js index 7924b77eec8ca..46041d5d91add 100644 --- a/src/bootstrap-meta.js +++ b/src/bootstrap-meta.js @@ -10,6 +10,13 @@ * @import { IProductConfiguration } from './vs/base/common/product' */ +// ESM-uncomment-begin +// import { createRequire } from 'node:module'; +// +// const require = createRequire(import.meta.url); +// const module = { exports: {} }; +// ESM-uncomment-end + /** @type Partial & { BUILD_INSERT_PRODUCT_CONFIGURATION?: string } */ let product = { BUILD_INSERT_PRODUCT_CONFIGURATION: 'BUILD_INSERT_PRODUCT_CONFIGURATION' }; // DO NOT MODIFY, PATCHED DURING BUILD if (product['BUILD_INSERT_PRODUCT_CONFIGURATION']) { @@ -24,5 +31,10 @@ if (pkg['BUILD_INSERT_PACKAGE_CONFIGURATION']) { pkg = require('../package.json'); // Running out of sources } -exports.product = product; -exports.pkg = pkg; +module.exports.product = product; +module.exports.pkg = pkg; + +// ESM-uncomment-begin +// export const product = module.exports.product; +// export const pkg = module.exports.pkg; +// ESM-uncomment-end diff --git a/src/bootstrap-node.js b/src/bootstrap-node.js index 914b829038013..4a829557f0d45 100644 --- a/src/bootstrap-node.js +++ b/src/bootstrap-node.js @@ -6,12 +6,28 @@ //@ts-check 'use strict'; +// ESM-comment-begin +const path = require('path'); +const fs = require('fs'); + +const isESM = false; +// ESM-comment-end +// ESM-uncomment-begin +// import * as path from 'path'; +// import * as fs from 'fs'; +// import { fileURLToPath } from 'url'; +// import { createRequire } from 'node:module'; +// +// const require = createRequire(import.meta.url); +// const isESM = true; +// const module = { exports: {} }; +// const __dirname = path.dirname(fileURLToPath(import.meta.url)); +// ESM-uncomment-end + // Setup current working directory in all our node & electron processes // - Windows: call `process.chdir()` to always set application folder as cwd // - all OS: store the `process.cwd()` inside `VSCODE_CWD` for consistent lookups function setupCurrentWorkingDirectory() { - const path = require('path'); - try { // Store the `process.cwd()` inside `VSCODE_CWD` @@ -38,36 +54,41 @@ setupCurrentWorkingDirectory(); * * @param {string} injectPath */ -exports.injectNodeModuleLookupPath = function (injectPath) { +module.exports.injectNodeModuleLookupPath = function (injectPath) { if (!injectPath) { throw new Error('Missing injectPath'); } - const Module = require('module'); - const path = require('path'); - - const nodeModulesPath = path.join(__dirname, '../node_modules'); + const Module = require('node:module'); + if (isESM) { + // register a loader hook + // ESM-uncomment-begin + // Module.register('./server-loader.mjs', { parentURL: import.meta.url, data: injectPath }); + // ESM-uncomment-end + } else { + const nodeModulesPath = path.join(__dirname, '../node_modules'); - // @ts-ignore - const originalResolveLookupPaths = Module._resolveLookupPaths; + // @ts-ignore + const originalResolveLookupPaths = Module._resolveLookupPaths; - // @ts-ignore - Module._resolveLookupPaths = function (moduleName, parent) { - const paths = originalResolveLookupPaths(moduleName, parent); - if (Array.isArray(paths)) { - for (let i = 0, len = paths.length; i < len; i++) { - if (paths[i] === nodeModulesPath) { - paths.splice(i, 0, injectPath); - break; + // @ts-ignore + Module._resolveLookupPaths = function (moduleName, parent) { + const paths = originalResolveLookupPaths(moduleName, parent); + if (Array.isArray(paths)) { + for (let i = 0, len = paths.length; i < len; i++) { + if (paths[i] === nodeModulesPath) { + paths.splice(i, 0, injectPath); + break; + } } } - } - return paths; - }; + return paths; + }; + } }; -exports.removeGlobalNodeModuleLookupPaths = function () { +module.exports.removeGlobalNodeModuleLookupPaths = function () { const Module = require('module'); // @ts-ignore const globalPaths = Module.globalPaths; @@ -95,10 +116,7 @@ exports.removeGlobalNodeModuleLookupPaths = function () { * @param {Partial} product * @returns {{ portableDataPath: string; isPortable: boolean; }} */ -exports.configurePortable = function (product) { - const fs = require('fs'); - const path = require('path'); - +module.exports.configurePortable = function (product) { const appRoot = path.dirname(__dirname); /** @@ -158,3 +176,9 @@ exports.configurePortable = function (product) { isPortable }; }; + +// ESM-uncomment-begin +// export const injectNodeModuleLookupPath = module.exports.injectNodeModuleLookupPath; +// export const removeGlobalNodeModuleLookupPaths = module.exports.removeGlobalNodeModuleLookupPaths; +// export const configurePortable = module.exports.configurePortable; +// ESM-uncomment-end diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index cd859a847f918..59ddc3fdfbf38 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -10,12 +10,20 @@ /** * @import { ISandboxConfiguration } from './vs/base/parts/sandbox/common/sandboxTypes' + * @typedef {any} LoaderConfig */ -/* eslint-disable no-restricted-globals */ +/* eslint-disable no-restricted-globals, */ + +// ESM-comment-begin +const isESM = false; +// ESM-comment-end +// ESM-uncomment-begin +// const isESM = true; +// ESM-uncomment-end // Simple module style to support node.js and browser environments -(function (globalThis, factory) { +(function (factory) { // Node.js if (typeof exports === 'object') { @@ -27,7 +35,7 @@ // @ts-ignore globalThis.MonacoBootstrapWindow = factory(); } -}(this, function () { +}(function () { const bootstrapLib = bootstrap(); const preloadGlobals = sandboxGlobals(); const safeProcess = preloadGlobals.process; @@ -96,59 +104,137 @@ window['MonacoEnvironment'] = {}; - /** @type {any} */ - const loaderConfig = { - baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out`, - preferScriptTags: true - }; + if (isESM) { + + // Signal before require() + if (typeof options?.beforeRequire === 'function') { + options.beforeRequire(configuration); + } - // use a trusted types policy when loading via script tags - loaderConfig.trustedTypesPolicy = window.trustedTypes?.createPolicy('amdLoader', { - createScriptURL(value) { - if (value.startsWith(window.location.origin)) { - return value; + const fileRoot = `${configuration.appRoot}/out`; + globalThis._VSCODE_FILE_ROOT = fileRoot; + + // DEV --------------------------------------------------------------------------------------- + // DEV: This is for development and enables loading CSS via import-statements via import-maps. + // DEV: For each CSS modules that we have we defined an entry in the import map that maps to + // DEV: a blob URL that loads the CSS via a dynamic @import-rule. + // DEV --------------------------------------------------------------------------------------- + if (configuration.cssModules) { + performance.mark('code/willAddCssLoader'); + + const style = document.createElement('style'); + style.type = 'text/css'; + style.media = 'screen'; + style.id = 'vscode-css-loading'; + document.head.appendChild(style); + + globalThis._VSCODE_CSS_LOAD = function (url) { + style.textContent += `@import url(${url});\n`; + }; + + const baseUrl = new URL(`vscode-file://vscode-app${fileRoot}/`); + /** + * @type { { imports: Record }} + */ + const importMap = { imports: {} }; + for (const cssModule of configuration.cssModules) { + const cssUrl = new URL(cssModule, baseUrl).href; + const jsSrc = `globalThis._VSCODE_CSS_LOAD('${cssUrl}');\n`; + const blob = new Blob([jsSrc], { type: 'application/javascript' }); + importMap.imports[cssUrl] = URL.createObjectURL(blob); } - throw new Error(`Invalid script url: ${value}`); + + const ttp = window.trustedTypes?.createPolicy('vscode-bootstrapImportMap', { createScript(value) { return value; }, }); + const importMapSrc = JSON.stringify(importMap, undefined, 2); + const importMapScript = document.createElement('script'); + importMapScript.type = 'importmap'; + importMapScript.setAttribute('nonce', '0c6a828f1297'); + // @ts-ignore + importMapScript.textContent = ttp?.createScript(importMapSrc) ?? importMapSrc; + document.head.appendChild(importMapScript); + + performance.mark('code/didAddCssLoader'); } - }); - - // Teach the loader the location of the node modules we use in renderers - // This will enable to load these modules via